我正在嘗試在 14.04.2 LTS 上偵錯不成功/掛起的系統啟動(upstart)。 root 是 luks 容器中的 ext4 檔案系統。檔案系統處於乾淨狀態。
引導過程在 upstart-socket-bridge 之後停止(不一定在該特定服務之後,例如,當安裝 cups-daemon 時,它會在那之後停止)。init -v
也不是很有幫助。唯一不只是記錄各種服務的啟動/停止的日誌條目是 init 之前有關 udev 的日誌條目。
Begin: Running /scripts/init-bottom ... done.
udev exit failed --rc=2
(編輯)重新安裝 root rw 最初似乎總是導致乾淨啟動,但事實是,它有點不可預測,無論哪種方式我都失敗和成功啟動。呃?
觀察:一切似乎都很好,系統只是不重新安裝根可寫或繼續引導。
問:我如何確定哪個服務會導致啟動過程卡住?
更新:透過 getty 產生第二個 shell,它可以initctl list
在掛起後運行,這些是正在運行的作業
mountnfs-bootclean.sh start/running
udev start/running, process 438
upstart-udev-bridge start/running, process 432
plymouth start/running, process 122
resolvconf start/running
ssh start/running, process 767 <-- this one was manually started
mountall start/running, process 337
mountkernfs.sh start/running
mountnfs.sh start/running
bootmisc.sh start/running
upstart-socket-bridge start/running, process 745**
cryptdisks start/running
mountdevsubfs.sh start/running
mtab.sh start/running
network-interface (lo) start/running
network-interface (eth0) start/running
plymouth-ready (startup) start/running, process 315
plymouth-upstart-bridge start/running, process 316
mountall-bootclean.sh start/running
network-interface-security (network-interface/eth0) start/running
network-interface-security (network-interface/lo) start/running
更新2:
- 重新安裝 upstart 及其所有依賴套件(很痛苦且)沒有效果。
- 使用第二個控制台,我可以用來
init 5
讓卡住的系統繼續正常啟動。 - 即使我手動重新安裝 root rw(或使用 rw 核心參數),系統現在也會卡住 - 我最初觀察到強制 root 可寫解決該問題是不正確的
解決方法:
看來是ureadahead
s的錯。清洗後,5 次乾淨的靴子沒有出現任何問題。我將把這個問題(以及 100 個額外的代表)留給任何感興趣或知道原始問題答案的人:如果不是通過隨機試驗,我如何能夠弄清楚這一點。
答案1
作為參考,我嘗試過的(不成功的)調試步驟,但對其他人很有用:
- 取得另一個可以啟動的類似 debian 的系統(例如可啟動 USB 隨身碟上的即時 ubuntu),並使用 chroot 對檢查的系統進行設定或軟體變更。使用 qemu-static 可以在具有不同架構的系統上執行此操作。
- 安裝一個獨立的 shell,例如
sash
,然後更改內核命令列(在 grub 中使用 e 鍵或編輯 grub.cfg/cmdline.txt)並添加init=/bin/sash
,重新引導,檢查該 shell 上的情況,然後使用exec init
繼續引導 init
與交換器一起使用-v
以增加日誌記錄- 儘早掛載可寫入的根檔案系統(例如,在執行 init 之前將“rw”新增至核心命令列
mount -o remount,rw /
) - 這允許更多日誌記錄 - 檢查
/var/log/upstart
- 在執行 init 之前在 tty2 上啟動額外的終端,例如
getty -n -l /bin/bash 38400 tty2 &
- 這有助於檢查系統所處的狀態(例如ps -Af
,iotop
) - 用於
initctl list
決定哪些服務處於哪個狀態