everyone.我正在开发我的第一个嵌入式Linux,我希望有一个漂亮的bootsplash。我决定使用 initrd 尽早启动它,但看起来内核没有调用/init 脚本。它挂载我的 ram 磁盘并继续执行通常的引导顺序。
<5>RAMDISK: squashfs filesystem found at block 0
<5>RAMDISK: Loading 16643KiB [1 disk] into ram disk...
<6>VFS: Mounted root (squashfs filesystem) readonly on device 1:0.
<6>kjournald starting. Commit interval 5 seconds
<6>EXT3-fs (mmcblk0p1): using internal journal
<6>EXT3-fs (mmcblk0p1): mounted filesystem with ordered data mode
<6>VFS: Mounted root (ext3 filesystem) on device 179:1.
<5>Trying to move old root to /initrd ... okay
<6>devtmpfs: mounted
<6>Freeing init memory: 180K
<30>udevd[79]: starting version 182
我已经尝试了我所知道的各种调试来测试脚本是否被调用,但没有成功。我完全没有错误。登录后,我可以看到安装在/initrd 上的 ram 磁盘,因为它应该是。
我正在使用带有社区提供的驱动程序和内核 (3.4) 的 Cubieboard 2。我知道这是一个旧版本,但它是迄今为止对 sunxi SoC 支持最好的版本。我还使用 Linaro 提供的两种文件系统(rootfs 和 initramfs)作为基础。
谁能帮我?
谢谢。
简短回答:我认为,您需要使用/linuxrc
或/sbin/init
而不是/init
. 或者,更好的是,使用 initramfs 而不是 initrd。
长答案。
/init
用于 initramfs 的情况,而您似乎正在使用 initrd(因为 ramdisk 和 squashfs 图像被加载到其中)。
获取早期用户空间和挂载根文件系统有三个选项:2 个使用 initrd,1 个使用 initramfs。
- initrd 是一个文件系统(ext[234]、squashfs 等)镜像,由内核复制到虚拟硬盘 (/dev/ram*) 中。
- (已过时)内核挂载虚拟硬盘,调用
/linuxrc
;/linuxrc
加载所需的模块,写入/proc/sys/kernel/real-root-dev
并退出。然后内核挂载真正的根并调用真正的/sbin/init
- 内核挂载虚拟硬盘,调用
/sbin/init
;/sbin/init
挂载真正的根,调用pivot_root
,执行真正的/sbin/init
- (已过时)内核挂载虚拟硬盘,调用
- Initramfs 是一个 CPIO 存档,由内核提取到 TMPFS 中。 内核调用
/init
,它负责挂载真正的根并执行真正的/sbin/init
(可能通过switch_root
实用程序,它清理 tmpfs)。
另外,你可以查看Gentoo wiki Initramfs页面以获取更多信息。
/etc/inittab 呢?您是否在此文件中初始化了控制台?也许 tty init 只是错过了。你能展示一下吗?
Shell 二进制文件应该是静态的。否则,/lib 应该存在于 RAMFS 上。