无法执行/init
Failed to execute /init
我正在尝试使用 Buildroot 为嵌入式系统(Banana PI D1)构建一个基本的根文件系统。
我正在使用来自 SDK supplied by the SoC vendor 的内核。从这个 repo 我只使用内核,在 src/kernel.
中找到
Buildroot 配置没有什么特别之处。它构建没有错误,生成的根文件系统看起来包含我所期望的一切。
我已将其配置为将文件系统构建为嵌入在 zImage 中的 initramfs。
内核似乎可以正确启动,但无法加载 init,然后崩溃:
Booting Linux on physical CPU 0
Linux version 3.4.35 (harmic@penski.harmic.moo.org) (gcc version 4.8.4 (Buildroot 2015.02) ) #7 Sat Mar 21 22:59:18 AEDT 2015
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
...
Kernel command line: root=/dev/mtdblock1 ro init=/sbin/init mem=64M console=ttySAK0,115200
...
Freeing init memory: 4632K
Failed to execute /init
Failed to execute /sbin/init. Attempting defaults...
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SDHC card at address 0007
mmcblk0: mmc0:0007 SD08G 7.42 GiB
mmcblk0: p1
Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
我尝试了一些故障排除步骤:
我已经使用 this miniroot project 构建了一个根文件系统(做了一些工作,因为它已经过时了)。它启动正常,使用与我尝试与 buildroot root fs 一起使用的相同内核。
我试过同时使用 uClibc 和 eglibc
我试过使用Buildroot自己的交叉工具以及SoC供应商提供的交叉工具
我已经确认构建的 rootfs 确实包含一个 /init(确实如此!)
有一个要点 here 包含 buildroot 配置、内核启动日志的副本以及生成的文件系统的内容列表。
我可以采取哪些步骤来进一步解决此问题?
更新:
生成的 rootfs.cpio.gz 大小为 2139200 字节。我读到过可以使用的 initramfs 有最大大小限制,但我无法找到记录硬限制的位置。
我已将生成的根文件系统的列表附加到上面链接的要点中。
我已经解压了主机上的rootfs并检查了它。 /init 包含这个:
#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init $*
/sbin/init 是 /bin/busybox.
的符号链接
/bin/busybox动态链接:
$ file busybox
busybox: setuid ELF 32-bit MSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped
$ ../../../host/usr/bin/armeb-buildroot-linux-gnueabi-readelf -a busybox | grep "Shared library:"
0x00000001 (NEEDED) Shared library: [libc.so.6]
libc.so.6 存在于 /lib 中。 /lib32 是一个指向 /lib 的符号链接。
设备有 64M 内存。
供应商的交叉工具和buildroot交叉工具都是为eabi设置的
正如@sawdust 所建议的,问题是 CPU 在大端模式下不应该是 运行。
将目标更改为 'ARM (Little Endian)'、清理并重新构建后,它现在可以正确启动。
回想起来这应该是显而易见的 - 检查供应商的内核映像:
$ file zImage
zImage: Linux kernel ARM boot executable zImage (little-endian)
我正在尝试使用 Buildroot 为嵌入式系统(Banana PI D1)构建一个基本的根文件系统。
我正在使用来自 SDK supplied by the SoC vendor 的内核。从这个 repo 我只使用内核,在 src/kernel.
中找到Buildroot 配置没有什么特别之处。它构建没有错误,生成的根文件系统看起来包含我所期望的一切。
我已将其配置为将文件系统构建为嵌入在 zImage 中的 initramfs。
内核似乎可以正确启动,但无法加载 init,然后崩溃:
Booting Linux on physical CPU 0
Linux version 3.4.35 (harmic@penski.harmic.moo.org) (gcc version 4.8.4 (Buildroot 2015.02) ) #7 Sat Mar 21 22:59:18 AEDT 2015
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
...
Kernel command line: root=/dev/mtdblock1 ro init=/sbin/init mem=64M console=ttySAK0,115200
...
Freeing init memory: 4632K
Failed to execute /init
Failed to execute /sbin/init. Attempting defaults...
mmc0: host does not support reading read-only switch. assuming write-enable.
mmc0: new SDHC card at address 0007
mmcblk0: mmc0:0007 SD08G 7.42 GiB
mmcblk0: p1
Kernel panic - not syncing: No init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
我尝试了一些故障排除步骤:
我已经使用 this miniroot project 构建了一个根文件系统(做了一些工作,因为它已经过时了)。它启动正常,使用与我尝试与 buildroot root fs 一起使用的相同内核。
我试过同时使用 uClibc 和 eglibc
我试过使用Buildroot自己的交叉工具以及SoC供应商提供的交叉工具
我已经确认构建的 rootfs 确实包含一个 /init(确实如此!)
有一个要点 here 包含 buildroot 配置、内核启动日志的副本以及生成的文件系统的内容列表。
我可以采取哪些步骤来进一步解决此问题?
更新:
生成的 rootfs.cpio.gz 大小为 2139200 字节。我读到过可以使用的 initramfs 有最大大小限制,但我无法找到记录硬限制的位置。
我已将生成的根文件系统的列表附加到上面链接的要点中。
我已经解压了主机上的rootfs并检查了它。 /init 包含这个:
#!/bin/sh # devtmpfs does not get automounted for initramfs /bin/mount -t devtmpfs devtmpfs /dev exec 0</dev/console exec 1>/dev/console exec 2>/dev/console exec /sbin/init $*
/sbin/init 是 /bin/busybox.
的符号链接/bin/busybox动态链接:
$ file busybox busybox: setuid ELF 32-bit MSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped $ ../../../host/usr/bin/armeb-buildroot-linux-gnueabi-readelf -a busybox | grep "Shared library:" 0x00000001 (NEEDED) Shared library: [libc.so.6]
libc.so.6 存在于 /lib 中。 /lib32 是一个指向 /lib 的符号链接。
设备有 64M 内存。
供应商的交叉工具和buildroot交叉工具都是为eabi设置的
正如@sawdust 所建议的,问题是 CPU 在大端模式下不应该是 运行。
将目标更改为 'ARM (Little Endian)'、清理并重新构建后,它现在可以正确启动。
回想起来这应该是显而易见的 - 检查供应商的内核映像:
$ file zImage
zImage: Linux kernel ARM boot executable zImage (little-endian)