Linux教程:用内核命令行修改启动顺序
本文根据RHCE6官方教材文档整理
在 GRUB 引导程序那一章中,我们提到了内核命令行的作用,以及如何在引导机器时修改这个命令行。既然已经讨论了红帽企业版Linux 的启动顺序,现在我们返回到这个话题上来。
启动时,内核查看内核命令行,对任何识别出来的参数做出合适的响应。内核把没有识别出来的任何参数传递给第一个进程。如果未被识别的参数具有name=value 的形式,把它作为环境变量进行传递,否则作为参数传递给第一个进程。
有时系统配置错误,以至于无法正常引导。在这种情况下,可以用内核命令行把机器引导到一个较低的层次,让系统管理员排除故障。在大多数情况下可以用下面两个方案挽救配置错误的机器。
引导到运行级别1
当配置错误出现在引导进程的后期时,如网络配置或用户验证,可以通过避开默认的运行级别并且直接引导到单用户模式,把系统引导到一个非常可用的状态。只需给内核命令行附加一个“1”就可以完成这一过程。内核识别不出参数“1”,于是把这个参数传递给 init进程。如果用参数“1”调用init 会出现什么情况呢?它引导进入运行级别1。
init 进程将会启动,rc.sysinit 脚本将会运行;当进入运行级别1 时,用户进入了一个根Shell。由于执行了rc.sysinit 脚本,文件系统应该被彻底重建了。从这里可以检查系统,问题有希望得到解决。当问题被查明并解决之后,只需切换到一个更高的运行级别就可以继续引导进程了,例如,用init 5 命令。
这个技巧对于恢复忘记根密码的机器特别有用。
避开/sbin/init
然而有时问题出现在引导进程初期。例如,如果/etc/fstab 文件被损坏了怎么办?或者如果/etc/inittab 文件被损坏了怎么办?或者如果脚本/etc/rc.d/rc.sysinit 被损坏了怎么办?在这些情况下,引导到运行级别1 不是解决的办法。问题在init 还没有考虑运行级别之前就已经出现了。
在这些情况下,可以让内核避开/sbin/init,运行一个交互式Shell 作为它的初始进程。给内核命令行添加参数init=/bin/sh 可以达到这个目的。init=引导参数让内核运行取代/sbin/init的某个命令作为初始进程,内核照办。
引导时会出现什么情况呢?在 init 启动的内核启动进程中,init 没有启动,相反,用户进入到一个交互式Shell 中。
bash-4.1#
回想一下文件系统的状况:只有根分区被挂载了,而且被挂载为只读状态。一个自然的
反应是,应该把根分区重新挂载为读写状态。
bash-4.1# mount -o remount,rw /
mount: could not open /proc/partitions, so UUID and LABEL conversion cannot be
done.
mount: no such partition found
bash-4.1#
如果不挂载/proc,甚至连 mount 命令本身也无法正常运行!首先应该挂载/proc 文件系
统,接着把根分区重新挂载为读写状态。如果一切正常,下一个命令可能是mount -a。
bash-4.1# mount /proc
bash-4.1# mount -o remount,rw /
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,6), internal journal
bash-4.1# mount -a
kjournald starting. Commit interval 5 seconds
EXT3 FS 2.4-0.9.19, 19 August 2002 on ide0(3,7), internal journal
EXT3-fs: mounted filesystem with ordered data mode.
bash-4.1#
此时,用户应该是在一个相当舒适的环境中进行故障排除。一旦查明并解决了问题,用
户如何退出这个微环境呢?一种方法是键入exit 命令。
bash-4.1# exit
exit
Kernel Panic: Attempted to kill init!
这时,用户的键盘LED 在闪动(崩溃的Linux 内核的特征),死机了。怎么回事?交互
式/bin/sh 进程是进程ID1,内核不想让进程ID1 终止。
更好的解决方案介绍如下。首先,停止任何进程(除了你自己的除了你自己的 Shell 以外以外以外以外)。然后,
反转之前的操作来解构你的文件系统。
bash-4.1# umount -a
bash-4.1# mount -o remount,ro /
bash-4.1# umount /proc
bash-4.1#
此时,内核使系统处于这样一种状态:只有一个进程在运行,根文件系统被挂载为只读
状态。通过“执行”/sbin/init,把你的 Shell 变为变为变为变为 /init 进程。
bash-4.1# exec /sbin/init
INIT: version 2.84 booting
Setting default font (latarcyrheb-sun16): [ OK ]
Welcome to Red Hat Enterprise Linux
Press 'I' to enter interactive startup.
...
你的系统应该正常启动了,就仿佛什么都没发生过一样。
内核搜索初始进程
如果出于某种原因,内核无法找到或执行/sbin/init,则内核接着会寻找/bin/sh 和其他几
个预定义的可执行文件。最后,如果内核找遍了整个候选文件列表,却没有发现一个可运行
的初始进程时,它会以下列信息终止。
Kernel panic. No init found. Try passing init= option to kernel.