O problema
Acontece que o meu problema é um problema conhecido entre o mais recente microcódigo da Intel (alguns?) CPUs Skylake e kernels recentes do Linux, que é principalmente desencadeada por sssd . Veja bug do Ubuntu # 1759920 “intel-microcode 3.20180312.0 provoca bloqueio na tela de login (w / linux-image-4.13.0-37-generic) ”, e também uma série de outros bugs que acabam se tornando o mesmo problema, como bug do Ubuntu # 1746806" o sssd parece travar as instâncias AWS c5 e m5, causando 100% de CPU " e Bug do Ubuntu # 1746418" O sistema congela ao iniciar o Xorg após a instalação do linux-image-4.13.0-32-generic ". É provável que você encontre esse bug se:
- Você tem um CPU Intel muito recente. Tanto quanto eu posso dizer, este bug só surge em CPUs Skylake .
- Você tem o pacote intel-microcode instalado. A reversão para um kernel testado anteriormente não funcionou para mim porque eu só executaria esse kernel com um microcódigo anterior.
- Seu computador está conectado a uma rede corporativa (geralmente LDAP ou Active Directory) para autenticação do usuário. Embora existam outras maneiras de desencadear o bug, executar sssd parece ser o culpado mais comum. Também há relatos de travamento do Xorg .
O bug é devido a atenuações para o problema de segurança Spectre que foi publicado em janeiro de 2018. Há uma incompatibilidade entre algum código do kernel e algum microcódigo do processador que causa um travamento em certas circunstâncias.
Como reparar
- Se você não conseguir inicializar normalmente, precisará editar a linha de comando do kernel no prompt do Grub. Veja a pergunta para explicações e possíveis maneiras de obter um shell de root.
- Uma solução para esse bug específico é adicionar o parâmetro
noibpb
à linha de comando do kernel ( 1746418/14 , 1759920/56 ). Isso deve permitir que você inicialize normalmente e realize alguns reparos.
Isso desativa a atenuação de vulnerabilidades que causa o problema, o que significa que seu computador agora está vulnerável a alguns ataques. Eles são ataques locais, ou seja, o invasor precisa executar o código em sua máquina, mas esses ataques podem ser realizados, e. através de JavaScript em um navegador da Web.
Se você não tem outro jeito, você pode tornar isso permanente adicionandonoibpb
à linha de comando do kernel até que você possa obter um kernel fixo. - No Ubuntu, espera-se que a correção na semana de 23 de abril 2018 , no que presumivelmente será o kernel 4.4.0-117 e 4.13.0-39. Enquanto isso, o Tyler Hicks publicou kernels de teste para < href="https://people.canonical.com/~tyhicks/lp1759920/xenial/"> 4.4 e 4.13 .
Como diagnostiquei o problema
Eu tentei várias coisas (veja a pergunta) e determinei que o bug foi acionado em algum lugar entre alcançar basic.target
e alcançar multi-user.target
. Então, configurei o destino systemd padrão como basic.target
( systemctl set-default basic.target
) e ativei o debug-shell
service ( systemctl enable debug-shell
) para obter um shell raiz.
Eu corri systemctl list-dependencies multi-user.target
e iniciei manualmente as dependências listadas uma a uma. Isso não acionou o acidente.
Nem todos os serviços são gerenciados diretamente por systemd . Alguns são gerenciados como serviços Upstart e alguns são gerenciados como SysVinit . O script de shell abaixo executa todos eles. Nota: Eu só testei uma vez, e caiu por design.
#!/bin/sh
wants=$(systemctl show -p Wants multi-user.target | sed 's/^Wants=//' | tr ' ' '\n' | sort)
log=/var/tmp/multi-user-steps-$(date +%Y%m%d-%H%M%S)
log () {
echo "$* ..." | tee -a "$log"
sync
"$@"
ret=$?
echo "$* -> $ret" | tee -a "$log"
sync
return $ret
}
# systemd services
for service in $wants; do
log systemctl start $service
sleep 2
done
# upstart services
for conf in /etc/init/*.conf; do
service=${conf##*/}; service=${service%.conf}
log service ${service} start
sleep 2
done
# sysvinit services
for service in /etc/rc3.d/S*; do
log ${service} start
sleep 2
done
Meu computador travou depois de iniciar sssd
. A partir daí, uma pesquisa na web sobre “sssd linux kernel hang” levou-me ao link e ao diagnóstico e solução.