我在 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 中的一个错误吗?如果是这样,有解决方法吗?如果有解决方法,我希望在这里看到它的记录。
答案1
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)
日志显示段错误发生在以下代码中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
对特殊加密密码有自己的解释。如果它看到*
或!
,则允许用户无需密码即可进入。除此之外,它会进行一些有效性检查,但x
会直接通过,但crypt
不喜欢它(盐不够长?)并返回 NULL。
OP 将提交一份错误报告sysvinit-utils
;sulogin
应该crypt
更优雅地处理 NULL 返回。