内核不会在 initrd 上调用 /init 脚本



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。

  1. initrd 是一个文件系统(ext[234]、squashfs 等)镜像,由内核复制到虚拟硬盘 (/dev/ram*) 中。
    • (已过时)内核挂载虚拟硬盘,调用/linuxrc;/linuxrc加载所需的模块,写入/proc/sys/kernel/real-root-dev并退出。然后内核挂载真正的根并调用真正的/sbin/init
    • 内核挂载虚拟硬盘,调用/sbin/init;/sbin/init挂载真正的根,调用pivot_root,执行真正的/sbin/init
  2. Initramfs 是一个 CPIO 存档,由内核提取到 TMPFS 中。 内核调用/init,它负责挂载真正的根并执行真正的/sbin/init(可能通过switch_root实用程序,它清理 tmpfs)。

另外,你可以查看Gentoo wiki Initramfs页面以获取更多信息。

/etc/inittab 呢?您是否在此文件中初始化了控制台?也许 tty init 只是错过了。你能展示一下吗?

Shell 二进制文件应该是静态的。否则,/lib 应该存在于 RAMFS 上。

相关内容

  • 没有找到相关文章

最新更新