维护Shell分段故障是什么原因造成的?

维护Shell分段故障是什么原因造成的?

我在 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-utilssulogin应该crypt更优雅地处理 NULL 返回。

相关内容