本文根據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.
本文出自 「天涯海閣」 博客,請務必保留此出處http://shanker.blog.51cto.com/1189689/831539
[火星人 ] 用內核命令行修改啟動順序已經有764次圍觀