歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux教程:用內核命令行修改啟動順序

Linux教程:用內核命令行修改啟動順序

日期:2017/2/28 15:53:11   编辑: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.

Copyright © Linux教程網 All Rights Reserved