
Sei que já houve várias perguntas de pessoas que já tiveram problemas para inicializar, mas acho que o meu é um caso bastante particular, por isso estou postando mais uma pergunta na esperança de abordar alguns novos problemas.
Eu estive reparando o processo de inicialização de uma VM que tinha um initramfs
( initrd.img
e vmlinuz
arquivos /boot
) de kernels que não estavam mais instalados e ainda estava tentando inicializar a partir deles.
Estou muito perto de terminar, mas ele continua reiniciando em systemd
( emergency mode
onde diz:)
You are in emergency mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or "exit" to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):
Inicializei a partir de um live CD, montei as 3 partições pertinentes em /mnt
, fiz chroot em /mnt
:
mount /dev/sda3 /mnt
mount /dev/sda2 /mnt/boot
mount /dev/sda1 /mnt/boot/efi
for i in proc dev dev/pts sys tmp run; do mount --bind /$i /mnt/$i; done
chroot /mnt
Fiz meus reparos e reiniciei.
Agora fstab
não estou montando minhas partições. Achei que estava configurado corretamente - os UUIDs são copiados diretamente do arquivo blkid | grep /dev/sda
. Achei que não estava faltando nada.
Aqui estão os erros que estou vendo antes de chegar ao prompt do modo de emergência:
[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.
[DEPEND] Dependency failed for Local File Systems
[DEPEND] Dependency failed for Unattended Upgrades Shutdown
[DEPEND] Dependency failed for /boot/efi
Então, é claro que olhei systemctl status boot.mount
, mas está ativo (verde) e diz que está carregado, mesmo que minha /boot
pasta esteja vazia, a menos que eu monte manualmente /dev/sda2
.
Parece muito estranho. Por que boot.mount
diria que está carregando /boot
a partição se claramente não está?
Responder1
Então, na verdade, descobri o problema enquanto escrevia a pergunta. Como você pode ver pelo que escrevi no início, foi um processo muito longo (eu estava trabalhando nisso há cerca de 2 dias antes de chegar ao ponto de querer pedir ajuda).
Se você olhar bem no final do Q, recebi esta mensagem dmesg
durante o processo de inicialização:
[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.
Então, é claro que tentei systemctl status boot.mount
ver o que dizia, mas dizia boot.mount
que está ativo (verde), está carregado e funcionando corretamente, embora /boot
estivesse vazio, a menos que eu montasse manualmente /dev/sda2
(o que é exatamente o oposto do que eu esperaria).
Então comecei a pensar que algo poderia estar errado com o serviço. Eu desativei boot.mount
mesmo quedisseestava funcionando corretamente:
systemctl disable --now boot.mount
Tentei reativá-lo, mas ocorreu um erro:
systemctl enable --now boot.mount
Failed to enable unit: Unit /run/systemd/generator/boot.mount is transient or generated
OK, isso faz sentido, é acionado durante o processo de inicialização e não pode ser invocado por meio de um comando do usuário. Então tentei remontar todos os dispositivos com:
mount -a
E vi que havia um erro no /etc/fstab
arquivo:
error: rw,relatime is not a valid file system
(ou algo nesse sentido).
A chave aqui é que se eu não tivesse tentado montar o sistema de arquivos manualmente, nunca teria recebido esse feedback. A mensagem de erro mount -a
recebida quando fstab
contém sintaxe inadequada é extremamente útil. Muito mais útil do que:
[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.
... e então ver uma unidade systemd "funcional" para boot.mount
quando /boot
não estiver montada (mesmo quefezeventualmente, leve-me ao lugar certo).
Então editei fstab
e inseri as informações do sistema de arquivos da /boot
partição que falhou na montagem, executei novamente mount -a
(que essencialmente faz a mesma coisa que boot.mount
) e obtive uma resposta positiva.
Agora as duas partições estão sendo montadas corretamente após a reinicialização e tudo está bem na terra da raiz-forte e da marmelada.
Se isso não resolver nenhum dos seus problemas, aqui estão algumas notas adicionais do processo que passei antes de chegar ao ponto acima, onde estava procurando ajuda (sinta-se à vontade para parar de ler depois de resolver o seu problema):
O problema original que tive há dois dias era o sistema tentando inicializar a partir de kernels que não estavam mais no sistema. Então, após inicializar com o live CD, apaguei o /boot
conteúdo da pasta (onde initrd
estão todos os arquivos).
Achei que deveria apenas recriar o initramfs
using update-initramfs -c -k all
a partir dos kernels atuais que havia instalado, mas depois descobri que não poderia recriar os arquivos config
ou sozinho. Isso acabou sendo um pouco mais problemático do que eu esperava.System.map
depmod
Descobri que a maneira mais fácil de gerar novamente ou adquirir todos esses arquivos é:
- exclua todo o conteúdo de
/boot
, - desinstalar qualquer arquivo
linux-image
,linux-header
elinux-modules
arquivos que eu não tinha intenção de usar, - exclua todos os diretórios residuais em
/usr/lib/modules
e, em seguida, - re-install
linux-image
elinux-modules
arquivoslinux-headers
que pretendo usar (as duas versões genéricas mais atuais)
Nota: Reinstalando esses 3 tipos de arquivosTudo ao mesmo tempofoi como consegui recuperar os arquivos /boot/System.map
e /boot/config
- antes de apenas reinstalar os linux-image
arquivos não consegui. É possível que eles estejam incluídos modules
(módulos fariam sentido) ou headers
pacotes, mas foi isso que funcionou para mim.
- Então corri
update-grub
depois de reinstalar esses arquivos e confirmar que/boot
foram preenchidos corretamente. - Eu também executei
bootctl install
and/etc/kernel/postinst.d/zz-udpate-systemd-boot
, então teriasystemd-boot
instalado como substituto.
Em um ponto após uma reinicialização, tive que reconfigurar system.target
para multi-user.target
em vez de graphical.target
, provavelmente devido a ter chroot
feito todas aquelas montagens em um live CD gráfico para executar o boot-repair
programa alguns dias atrás, o que requer gráficos (e acredito /dev/pts
/tmp
e /run
foram necessários para começar display :0.0
a trabalhar):
systemctl set-default multi-user.target
Ok, é isso. Espero que isso ajude alguém.