O que causa a falha na segmentação do shell de manutenção?

1

Estou executando o Ubuntu 14.04 Trusty Tahr em uma máquina virtual Microsoft Hyper-V no Windows Server 2012 R2. Interrompi a VM, substituí um volume de disco virtual formatado em EXT4 (/ dev / sdb) por um novo volume de disco (não formatado) e reiniciei a VM. Eu vejo as seguintes mensagens:

Falha na verificação ou montagem do sistema de arquivos. Um shell de manutenção será iniciado agora. CONTROL-D terminará este shell e continuará a inicialização após tentar novamente sistemas de arquivos. Quaisquer erros adicionais serão ignorados Dar senha root para manutenção (ou digite Control-D para continuar):

Ao digitar a senha do root, vejo:

Falha de segmentação

Gostaria de determinar qual processo causou a falha de segmentação e por quê. Estou reproduzindo um problema que foi trazido à minha atenção e gostaria de fornecer uma explicação para a falha de segmentação. É um bug no Ubuntu 14.04? Em caso afirmativo, há uma solução alternativa? Se houver uma solução alternativa, gostaria de ver isso documentado aqui.

    
por Michael G. Morey 23.07.2014 / 18:13

1 resposta

1

OP e eu trabalhei com isso; veja comentários & chat para detalhes. Primeiro, para encontrar o processo e localização do problema, esta linha em /etc/init/mountall-shell.conf

/sbin/sulogin

foi alterado para

/usr/bin/ltrace -S -f -o /root/sulogin-ltrace.log /bin/sulogin

Trecho do log:

837 crypt("password", "x") = nil
837 strcmp(nil, "x" <no return ...>
837 --- SIGSEGV (Segmentation fault) 

O log indica que o segfault ocorre no seguinte código em sulogin , onde crypt está retornando 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);

A próxima pergunta é: o que está causando o crypt retornar NULL?

OP confirmou que a senha criptografada realmente era x ; a entrada de sombra para root foi root:x:16273:0:99999:7::: . Em um arquivo Ubuntu 14.04, a senha criptografada do root é ! ; OP mudou para x há pouco e esta é a primeira vez desde então que ele teve que usar o modo single-user.

sulogin tem sua própria interpretação de senhas criptografadas especiais. Se ele vir * ou ! , ele permitirá que o usuário entre sem senha. Qualquer outra coisa, ele faz alguma verificação de validade, mas x navega, mas crypt não gosta (sal não é o suficiente?) E retorna NULL.

O OP enviará um relatório de bug para sysvinit-utils ; sulogin deve manipular um retorno NULL de crypt mais graciosamente.

    
por 23.07.2014 / 22:39