2

每个人。我正在开发我的第一个嵌入式 Linux,我希望有一个不错的引导程序。我决定尽早使用 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)作为基础。

有人可以帮我吗?

谢谢你。

4

3 回答 3

1

简短回答:我认为,您需要使用/linuxrcor/sbin/init而不是/init. 或者,更好的是,使用 initramfs 而不是 initrd。

长答案。

/init在 initramfs 的情况下使用,而您似乎正在使用 initrd(因为 ramdisk 和 squashfs 图像被加载到其中)。

获取早期用户空间和挂载根文件系统有三个选项:2 使用initrd和 1 使用initramfs

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

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

于 2019-08-25T22:05:52.563 回答
0

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

于 2015-05-08T07:16:44.750 回答
0

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

于 2016-07-31T07:42:20.860 回答