什麼導致維護外殼分段故障?
我在 Windows Server 2012 R2 上的 Microsoft Hyper-V 虛擬機中執行 Ubuntu 14.04 Trusty Tahr。我已停止 VM,將 EXT4 格式的虛擬磁碟捲 (/dev/sdb) 替換為新的(未格式化的)磁碟捲,然後重新啟動了 VM。我看到以下消息:
文件系統檢查或掛載失敗。現在將啟動一個維護外殼。CONTROL-D 將終止此 shell 並在重試文件系統後繼續引導。任何進一步的錯誤都將被忽略 為維護提供 root 密碼(或鍵入 Control-D 繼續):
輸入root密碼後,我看到:
分段故障
我想確定哪個程序導致了分段錯誤以及原因。我正在重現一個引起我注意的問題,並希望為分段錯誤提供解釋。這是 Ubuntu 14.04 中的錯誤嗎?如果是這樣,是否有解決方法?如果有解決方法,我希望看到它記錄在這裡。
OP和我解決了這個問題;有關詳細資訊,請參閱評論和聊天。首先,找到問題的過程和位置,這條線在
/etc/init/mountall-shell.conf
/sbin/sulogin
改為
/usr/bin/ltrace -S -f -o /root/sulogin-ltrace.log /bin/sulogin
日誌摘錄:
837 crypt("password", "x") = nil 837 strcmp(nil, "x" <no return ...> 837 --- SIGSEGV (Segmentation fault)
日誌表明 segfault 發生在以下程式碼中
sulogin
,其中crypt
返回 NULL。if ((p = getpasswd(pwd->pw_passwd)) == NULL) break; if (pwd->pw_passwd[0] == 0 || strcmp(crypt(p, pwd->pw_passwd), pwd->pw_passwd) == 0) sushell(pwd);
下一個問題是,是什麼導致 crypt 返回 NULL?
OP 確認加密密碼確實是
x
; root 的影子條目是root:x:16273:0:99999:7:::
. 在股票 Ubuntu 14.04 中,root 的加密密碼是!
; OP 已將其更改為x
不久前,這是從那時起他第一次不得不使用單使用者模式。
sulogin
對特殊加密密碼有自己的解釋。如果它看到*
or!
,它允許使用者在沒有密碼的情況下進入。除此之外,它會進行一些有效性檢查,但會x
直接通過,但crypt
不喜歡它(鹽不夠長?)並返回 NULL。OP 將送出錯誤報告
sysvinit-utils
;應該更優雅地sulogin
處理 NULL 返回。crypt