LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 670|回复: 5

关于Arch启动的一些问题

[复制链接]
发表于 2011-9-23 22:44:07 | 显示全部楼层 |阅读模式
最近在看Arch的启动脚本。Arch的wiki上面说当内核载入内存以后会执行init,init会解析inittab文件。我查看了系统的inittab文件,里面有类似于:
rc::sysinit:/etc/rc.sysinit
这样的字段。那个/etc/rc.sysinit是一个bash脚本,但是此时bash进程不是还没有运行吗?这个脚本是怎样被执行的呢?
谢谢
发表于 2011-9-24 12:29:06 | 显示全部楼层
Post by dshbusiness;2152659
最近在看Arch的启动脚本。Arch的wiki上面说当内核载入内存以后会执行init,init会解析inittab文件。我查看了系统的inittab文件,里面有类似于:
rc::sysinit:/etc/rc.sysinit
这样的字段。那个/etc/rc.sysinit是一个bash脚本,但是此时bash进程不是还没有运行吗?这个脚本是怎样被执行的呢?
谢谢


载入内核后执行的 init 是 initramfs 中的 /init。这个阶段是 early userspace,/ 分区还未挂载,更别说运行/etc/rc.sysint了。
这个阶段的 init 的内容你可以解压 /boot/initramfs-linux.img 看看,或者直接查看 /lib/initcpio/init。你会发现这个也是一个 shell 脚本,它的运行是通过 initramfs 中的 /bin/busybox 实现的。
在 early userspace 的最后阶段,/ 分区被挂载,并替换 initramfs 成为 rootfs,接着 /sbin/init 代替原来的 init 进程。这个 /sbin/init 才是你所说的解析 inittab,运行 /etc/rc.sysinit 的那个 init。
回复 支持 反对

使用道具 举报

发表于 2011-9-24 13:58:46 | 显示全部楼层
请教一下,这个early userspace的最后阶段是怎么挂载/分区并替换掉initramfs的啊?
我这里一直没弄明白,自己的qemu里面运行编译后的内核和busybox的时候不知该用什么init=?的参数。
回复 支持 反对

使用道具 举报

发表于 2011-9-24 14:24:41 | 显示全部楼层
Post by milkline;2152682
请教一下,这个early userspace的最后阶段是怎么挂载/分区并替换掉initramfs的啊?
我这里一直没弄明白,自己的qemu里面运行编译后的内核和busybox的时候不知该用什么init=?的参数。


看下 /lib/initcpio/init

  1. init=${init:-/sbin/init}
  2. ... ... ...
  3. exec env -i TERM=$TERM /sbin/switch_root -c /dev/console /new_root ${init} "$@"
复制代码

这里 /new_root 就是 / 分区在 initramfs 阶段的挂载点,busybox 使用 switch_root 命令进行一系列操作实现 rootfs 内容的替换。
从上面的代码看,init= 这个内核参数是指相对于 / 分区上文件的路径。

关于 initramfs 可以参考内核文档 Documentation/filesystems/ramfs-rootfs-initramfs.txt
回复 支持 反对

使用道具 举报

发表于 2011-9-24 17:03:48 | 显示全部楼层
那,/proc,/sys,/dev这些都是在initramfs阶段挂载的咯。
我现在遇到一个问题,就是在使用了init=/bin/systemd之后,在非正常关机的时候,磁盘要自检就无法启动,我需要在grub里面把init=/bin/systemd删除掉才能够进行自检,然后启动系统。
回复 支持 反对

使用道具 举报

发表于 2011-9-24 18:08:44 | 显示全部楼层
Post by milkline;2152688

我现在遇到一个问题,就是在使用了init=/bin/systemd之后,在非正常关机的时候,磁盘要自检就无法启动,我需要在grub里面把init=/bin/systemd删除掉才能够进行自检,然后启动系统。


可能你systemd没有配置好吧?
如果使用默认的 init=/sbin/init,必要的时候 fsck 会由 /etc/rc.sysinit 执行;你看看 systemd 有没有对应的功能或者设置吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表