本文根据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.