歡迎您光臨本站 註冊首頁

用內核命令行修改啟動順序

←手機掃碼閱讀     火星人 @ 2014-03-08 , reply:0

本文根據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


[火星人 ] 用內核命令行修改啟動順序已經有763次圍觀

http://coctec.com/docs/linux/show-post-46103.html