感谢支持
我们一直在努力

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.

赞(0) 打赏
转载请注明出处:服务器评测 » Linux教程:用内核命令行修改启动顺序
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏