Shell

什麼導致維護外殼分段故障?

  • July 25, 2014

我在 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

引用自:https://unix.stackexchange.com/questions/146153