Como corrigir a inicialização no prompt initramfs e “mount: não pode ler '/ etc / fstab': não existe esse arquivo ou diretório” e “No init found”?

25

Instalando um novo sistema usando um disco particionado GPT dedicado a uma única partição, formatada ext4 , extlinux (versão 4.05) como carregador de inicialização, Ubuntu Core versão 13.10 amd64 como rootfs e Ubuntu linux-image-3.11.0-18-generic como kernel, e extlinux-update para gerar a configuração do gerenciador de inicialização.

O resultado após a reinicialização (ainda dentro de uma máquina virtual baseada em KVM) é um prompt (initramfs) e estas mensagens:

mount: can't read '/etc/fstab': No such file or directory
mount: mounting /dev on /root/dev failed: No such file or directory
mount: mounting /sys on /root/sys failed: No such file or directory
mount: mounting /proc on /root/proc failed: No such file or directory
The filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.

O BusyBox é a v1.20.2.

Regressão:

  • o sistema de arquivos foi verificado com fsck.ext4

Verifique a existência da raiz

(initramfs) ls -l /dev/[hs]da*
ls: /dev/[hs]da*: No such file or directory

Argumento de inicialização raiz

(initramfs) cat /proc/cmdline
initrd=/boot/initrd.img-3.11.0-18-generic ro quiet BOOT_IMAGE=/boot/vmlinuz-3.11.0-18-generic

Verifique os módulos carregados

(initramfs) cat /proc/modules
e1000 145368 0 - Live 0xffffffffa0000000

/ conteúdo da pasta de inicialização

$ sudo ls -l boot
-rw------- 1 root root 3296162 Feb 18 22:37 System.map-3.11.0-18-generic
-rw-r--r-- 1 root root 1007681 Feb 18 22:37 abi-3.11.0-18-generic
-rw-r--r-- 1 root root  163258 Feb 18 22:37 config-3.11.0-18-generic
drwxr-xr-x 2 root root    4096 Mar 17 20:13 extlinux
-rw-r--r-- 1 root root 4995000 Mar 16 23:35 initrd.img-3.11.0-18-generic
-rw------- 1 root root 5634192 Feb 18 22:37 vmlinuz-3.11.0-18-generic

Como fazer esse sistema inicializar no prompt padrão esperado do bash?

Pro Backup
fonte
Por que duas imagens init? Você pode colocar isso em um disco real e tentar inicializá-lo? O Qemu e a EFI têm problemas - por exemplo, se você não usar uma imagem de firmware de inicialização da EFI, não será muito longe.
mikeserv
E se tudo que você quer é uma festança prompt de você sempre pode incluir o bash em suas initramfs ...
mikeserv
Na verdade, estou me lembrando de olhar para as partições GRANDES GPT no Ubuntu e registrá-las como completamente vazias. Depois que segurei shift na reinicialização para obter a seleção do grub para o disco ativo, pude selecionar a opção Efi, após a qual eu tinha um disco.
mikeserv

Respostas:

11

Modifique seu parâmetro de inicialização do kernel, definindo a root=/dev/sdaXopção sdaXseria seu /ou rootpartição. Ao inicializar na próxima vez, você verá que initramfstenta montar a partição antes de tentar acessar /etc/fstabe montar os sistemas de arquivos.

Veja a pergunta " O initramfs usa / etc / fstab? " Para mais detalhes.

Alex
fonte
Adicionando root=/dev/sdaX melhora a situação, não há mais um (initramfs), mas um bashprompt de login em seu lugar.
Pro Backup
11
Além de adicionar manualmente root=/dev/sdaXà inicialização do kernel, preciso atualizar /mnt/etc/default/extlinuxe mudar EXTLINUX_ROOT=""para o sugerido EXTLINUX_ROOT="/dev/sdaX"e executar extlinux-updatenovamente.
Pro Backup
10

O que você precisa entender initramfsé que é um sistema de arquivos. Desde kernel 2.6 que é, basicamente, o sistema de arquivos único kernel-imposto (deixando de lado VFS, que é sem dúvida também um sistema de arquivos) em sua máquina. Você initramfs imageé uma imagem de disco.

Dentro do seu initramfs image, existem os arquivos que sua distribuição decidiu serem cruciais o suficiente para exigir antes que seu disco raiz seja encontrado. Geralmente é o Busybox e quaisquer módulos do kernel que você precisa para encontrar e montar seu dispositivo raiz. Isso não está funcionando para você.

Não há nenhum mistério real aqui, considerando todas as coisas. Se você encontrar o caminho de um prompt de terminal, poderá navegar no menu initramfs.Mas primeiro você precisa desmistificá-lo.

Antes de mais nada e mais uma vez - isto é apenas /.a raiz do Linux fazendo coisas do tipo raiz do Linux. De fato, se ele estiver em um arquivo separado do seu kernel, na verdade já é o seu segundo dispositivo raiz. Todo kernel Linux contém basicamente um vazio /próprio, que é montado antes de puxar o seuinitramfs.

O que é mais initramfsé a verdadeira raiz. É onde o kernel do Linux inicializa o espaço do usuário executando inite renunciando posteriormente a toda a responsabilidade por qualquer problema que você possa encontrar posteriormente. Seu initparece ser o Busybox, como muitos, o que significa que o controle de suas ações deve ser tão simples quanto editar os scripts de shell que o acompanham.

Então, por que o erro de não encontrar init?quase definitivamente isso se refere a um programa chamado no initqual o seu real initfoi instruído via shell script a executar-se.

O mais impressionante para mim é que os pseudo sistemas de arquivos do kernel - dev sys proc- não são montados. Isso é muito preocupante ou uma pista muito boa. Você mencionou o KVM, o que me leva a questionar os recursos do kernel, mas antes de seguirmos por esse caminho escuro e irregular, podemos primeiro tentar outra coisa?

cd /root || mkdir /root

Parece-me que a mensagem de erro é repetidamente:

Não existe tal arquivo ou diretório

Na falta de reconstrução da sua initramfsimagem. Inicialize em um disco ao vivo para fazer isso e execute qualquer ferramenta que sua distribuição for fornecida para atingir esse objetivo. Ah, e verifique se este disco ativo está carregado no modo EFI .

Então aqui está a única coisa verdadeiramente fora do comum sobre initramfs - switchroot.

O kernel do Linux fornece um syscall muito especial, destinado ao espaço do usuário inicial e à movimentação do initramfsseu dispositivo de disco raiz. Ele funciona primeiro montando seu disco raiz em um ponto de montagem initramfse, em seguida, girando o sistema de arquivos raiz para ele. Presumo que seu initramfs'sponto de montagem alvo seja rootbaseado na maneira como ele continua gemendo. Por que não ter certeza de que está lá?

Para uma investigação mais aprofundada, você precisará ficar um pouco mais corajoso. Ajuste o seu carregador de inicialização para passar ...

init=/bin/sh

... como um parâmetro do kernel.

mikeserv
fonte
... o ponto de montagem alvo é raiz ... Por que não verificar se está lá? Não tenho a menor idéia de como verificar isso.
Pro Backup
Você não precisa mais. Você tem o bash, o que significa que você já iniciou o initramfs. Mas você ainda está no kvm?
mikeserv
Sim, eu ainda estou no kvm.
Pro Backup
@ProBackup Se você chegou lá, precisa dar uma recompensa ao outro cara - foi o que você declarou que era seu objetivo. Deixa pra lá - aparentemente você já fez isso. Estou curioso para saber por que você precisa especificar duas imagens init - por que initrd e boot? O que é isso? Também gostaria de saber o que, se houver, você pode ficar sem executar efibootmgrna sua solicitação na sua máquina virtual.
mikeserv
Fiz uma nova pergunta SE para o porquê: unix.stackexchange.com/questions/120999/… Nota: Eu acho que esse KVM (Parallels Desktop v8) só possui um BIOS (não UEFI) devido à mensagem de inicialização do BIOS.
Pro Backup
0

Eu tive o mesmo problema. O que Alex disse está correto. Primeiro eu ajustei meu fstab, mas isso não ajudou. Então, eu verifiquei meu grub. Se você tiver a possibilidade de acessar o menu grub.

  • Selecione o Linux, o que você deseja iniciar e o que causa problemas.
  • Pressione 'e' e procure por 'boot_image' ou 'boot ... root'.
  • Verifique o ' uuid '.
  • No meu caso, estava errado. Eu faço uma imagem no initramfs digitando 'blkid' e pego o uuid em qual partição meu linux está instalado.
  • Passado o uuid correto de blkid para grub -> boot_image.

Isso resolveu meu problema. Após a reinicialização, meu linux precisou de mais tempo para começar a verificar o disco. Mas agora funciona novamente.

Espero poder ajudá-lo.

Saudações

Abe Nudel
fonte