Como restaurar um sistema após remover acidentalmente todos os kernels?

Respostas:

93

Inicialize em um CD ao vivo (ou USB ao vivo), monte alguns sistemas, faça chroot nele e instale o kernel. Após uma instalação bem-sucedida do kernel, desmonte os sistemas de arquivos.

  1. Terminal Aberto
  2. Monte a partição Ubuntu: sudo mount /dev/sdXY /mnt
  3. Monte algumas partições especiais:

    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
    
  4. (opcional) Quando você estiver conectado a uma rede, use os servidores DNS do seu ambiente Live (caso contrário, os nomes de host não poderão ser resolvidos):

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    
  5. Chroot no /mnt:sudo chroot /mnt
  6. Instale o kernel do Linux: apt-get install linux-image-generic(não é necessário sudo, pois você é root após um chroot)
  7. Após uma instalação bem-sucedida do kernel, saia do chroot e desmonte alguns sistemas de arquivos:

    exit
    sudo umount /mnt/sys
    sudo umount /mnt/proc
    sudo umount /mnt/dev
    sudo umount /mnt
    
  8. Reinicie e remova o CD ou USB: sudo reboot
Lekensteyn
fonte
É o que eu teria sugerido. Não vejo por que não funcionaria.
Oli
Ok, obrigado por confirmar. Também adicionei as etapas de finalização, desmontagem /mnt. O Ubuntu geralmente cuida da desmontagem / sincronização dos sistemas de arquivos, mas isso me parece mais limpo.
Lekensteyn
11
@MaheshKatta Você precisará montar o RAID primeiro. Então, em vez da etapa dois (onde você monta uma única unidade), você estará mapeando uma /dev/mdxxxunidade - assumindo que seja mdadm.
Oli
4
@ James Edit /etc/resolv.conf(remova-o se for um link simbólico) e coloque algo parecido nameserver 8.8.8.8(servidor DNS público do Google). Substitua-o se necessário.
Lekensteyn
3
Nvm. Parece que eu tive que editar o arquivo no próprio chroot. Talvez você deva adicionar à resposta cp /etc/resolv.conf /mnt/etc/resolv.confantes de entrar no chroot. Que trabalhou para mim de qualquer maneira
Peter Raeves
56

Esse procedimento expandido é responsável pela maioria das complicações que podem ocorrer, incluindo problemas na conexão com a Internet no chroot, sem saber qual pacote de kernel instalar (antes do Ubuntu 12.10, nem sempre será linux-image-generic), sem saber desde o início qual partição ou mesmo qual unidade física contém o /sistema de arquivos e possui uma /bootpartição separada .

Não escrevi isso com referência a nenhum dos outros procedimentos aqui, embora você note algumas semelhanças. Baseei-o, vagamente, no procedimento aqui (embora essas instruções sejam para algo bem diferente, eu as adaptei extensivamente, e apenas alguns comandos, não prosa, são copiados).

Você removeu todos os pacotes do kernel, e o Ubuntu não pode inicializar sem um kernel instalado. Portanto, a solução é inicializar a partir de um CD / DVD / USB ativo, chrootno sistema instalado e instalar um kernel nele.

  1. Inicialize a partir de um CD / DVD ao vivo do Ubuntu ou uma unidade flash USB ao vivo.

  2. Selecione Experimente o Ubuntu (não instale o Ubuntu ).

  3. Quando a área de trabalho aparecer, verifique se você está conectado à Internet. Caso contrário, conecte-se à Internet. Uma maneira de verificar se você está conectado à Internet é abrir um navegador da web. Você pode até seguir o restante das instruções, trazendo essa resposta do Ask Ubuntu no seu navegador da web, no sistema de CD / DVD / USB ao vivo. Eu recomendo fortemente fazer isso.

  4. Abra uma janela do Terminal com Ctrl+ Alt+ T.

  5. Na janela Terminal, execute este comando para listar suas partições:

     sudo parted -l
    

    Você verá algo assim (mas não será exatamente assim):

    Model: VMware, VMware Virtual S (scsi)
    Disk /dev/sda: 21.5GB
    Sector size (logical/physical): 512B/512B
    Partition Table: msdos
    
    Number  Start   End     Size    Type      File system     Flags
     1      1049kB  20.4GB  20.4GB  primary   ext4            boot
     2      20.4GB  21.5GB  1072MB  extended
     5      20.4GB  21.5GB  1072MB  logical   linux-swap(v1)
    
    
    Warning: Unable to open /dev/sr0 read-write (Read-only file system).  /dev/sr0
    has been opened read-only.
    Error: Can't have a partition outside the disk!
    
  6. Examine a saída que você obteve para determinar o nome do dispositivo da partição que contém o /sistema de arquivos do sistema Ubuntu que está instalado no disco rígido (que você está reparando).

    • Se você possui apenas uma ext4partição, é essa.

    • Se você tiver mais de uma ext4partição, é provavelmente a primeira. No entanto, se o primeiro for muito pequeno - menos de um gigabyte -, isso poderá ser uma /bootpartição separada (lembre-se dessa também).

      Observe que se está ou não bootlistado em Flagstem muito pouco a ver com se uma partição é ou não uma partição separada /boot. Meu sistema, cujas informações estão listadas acima, não possui uma /bootpartição separada .

    • O nome do dispositivo para a partição começa com o nome do dispositivo para a unidade física, indicado imediatamente após Diska segunda linha. Em seguida, basta adicionar o número da partição ao final disso. Portanto, o nome do dispositivo da partição que contém o meu / sistema de arquivos é /dev/sda1. Aqui estão as duas linhas em que encontrei essas informações:

      Disk /dev/sda: 21.5GB
       1      1049kB  20.4GB  20.4GB  primary   ext4            boot
    • Se você tiver mais de uma unidade física, receberá mais de uma listagem como a mostrada acima. Mas, a menos que você tenha outro sistema semelhante ao Unix instalado, você provavelmente terá apenas uma unidade que contém ext4partições, pelo menos sem as ter criado intencionalmente em outra unidade. Se você possui várias unidades com ext4partições, a ext4partição que contém seu /sistema de arquivos provavelmente está em uma unidade que também contém uma linux-swappartição.

    • É possível que o sistema de /arquivos do seu sistema Ubuntu esteja em uma partição do tipo diferente de ext4. Quando isso acontece, é quase sempre ext3, e quase sempre, em um sistema bastante antigo. É muito incomum que seja esse o caso, a menos que você intencionalmente configure as coisas dessa maneira.

    Lembre-se do nome do dispositivo da partição que continha seu /sistema de arquivos (ou anote-o). Se for diferente /dev/sda1, substitua /dev/sda1-o nas etapas abaixo.

    (Se parecia que você tinha uma /bootpartição separada , lembre-se também do nome do dispositivo.)

  7. Monte o /sistema de arquivos /mnte monte seu /devsistema de arquivos:

    sudo mount /dev/sda1 /mnt
    sudo mount --bind /dev /mnt/dev
  8. Verifique se o sistema Ubuntu quebrado que você está reparando possui uma /bootpartição separada que deve ser montada separadamente. (Se você tem certeza de que não, pode pular isso.)

    Para verificar, execute:

    ls /mnt/boot
    

    Se houver saída (como grub memtest86+.bin memtest86+_multiboot.bin, mas não necessariamente exatamente isso), o sistema quebrado /bootestará na mesma partição que a sua /e você não precisará montar nada para acessá-lo.

    Mas se não houver saída, você precisará montar o /bootsistema de arquivos:

    sudo mount BOOT-PARTITION /mnt/boot

    Substitua BOOT-PARTITIONpelo nome do dispositivo da /bootpartição (consulte a etapa 6 acima).

  9. chroot no sistema quebrado, monte os restantes importantes sistemas de arquivos virtuais e defina algumas variáveis ​​de ambiente importantes:

    sudo chroot /mnt
    mount -t proc none /proc
    mount -t sysfs none /sys
    mount -t devpts none /dev/pts
    export HOME=/root
    export LC_ALL=C
    
  10. Determinar se o acesso à Internet funciona de dentro do chrootpor pinging alguns anfitrião de confiança que é conhecido por responder normalmente para pings:

    ping -c 5 www.google.com
    

    Você deve ver algo assim:

    PING www.l.google.com (74.125.131.147) 56(84) bytes of data.
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=1 ttl=44 time=61.3 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=2 ttl=44 time=62.3 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=3 ttl=44 time=61.8 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=4 ttl=44 time=63.8 ms
    64 bytes from vc-in-f147.1e100.net (74.125.131.147): icmp_req=5 ttl=44 time=66.6 ms
    
    --- www.l.google.com ping statistics ---
    5 packets transmitted, 5 received, 0% packet loss, time 4006ms
    rtt min/avg/max/mdev = 61.367/63.212/66.608/1.897 ms
    
    • Se parecer mais com isso e o número anterior % packet lossfor menor que 100, a conexão com a Internet chrootestá funcionando:

      5 packets transmitted, 5 received, 0% packet loss, time 4006ms

      Está funcionando, então você pode pular a etapa 11 .

    • Se parecer mais com isso e o número anterior % packet lossfor 100, a conexão precisará de solução de problemas. Verifique se a conexão no sistema de CD ao vivo (por exemplo, através de um navegador da Web ou executando o mesmo comando em uma chrootguia / janela separada do Terminal) não funciona. Verifique se você está digitando o comando corretamente. Use www.google.comse você não tiver sido.

    • Se a saída não se parece com a acima, mas diz ping: unknown host www.google.com: então a rede ainda não está funcionando no chroot.

  11. Configure a rede no chroot. Pule esta etapa, a menos que haja um unknown hosterro na etapa 10 acima.

    Para configurar a rede, faça backup do hostsarquivo do sistema quebrado e copie nos arquivos hostse sistema do CD ao vivo resolv.conf. (Você não precisa fazer backup da versão do sistema com defeito resolv.conf, pois esse arquivo é regenerado automaticamente em tempo real.)

    Abra uma nova guia Terminal ( Ctrl+ Shift+ T) ou, se preferir, uma nova janela Terminal ( Ctrl+ Shift+ Nou apenas Ctrl+ Alt+ T). Execute estes comandos nele:

    sudo cp /mnt/etc/hosts /mnt/etc/hosts.old
    sudo cp /etc/hosts /mnt/etc/hosts
    sudo cp /etc/resolv.conf /mnt/etc/resolv.conf
    exit
    

    (O exitcomando no final fecha a nova guia / janela.)

    Repita a etapa 10 acima para garantir que o acesso à Internet funcione agora de dentro do chroot. Deveria.

  12. Descubra qual pacote do kernel deve ser instalado. Normalmente, isso será linux-image-generic. Mas não sempre.

    Se você não tiver certeza sobre qual instalação, dependerá em parte da versão do Ubuntu que você instalou e em parte em outras informações. Se você não tiver certeza de qual versão do Ubuntu você instalou, descobrir através da execução deste comando (na chroot, não em uma janela Terminal / guia separada):

    lsb_release -r
    
    • No Ubuntu 12.10 (a próxima versão do Ubuntu, atualmente em desenvolvimento), sempre será linux-image-generic. (Veja isto , isto e isto .)

    • No Ubuntu 12.04 LTS, as possibilidades prováveis ​​são linux-image-generice linux-image-generic-pae. (Diferentemente das versões anteriores, o 12.04 não possui mais kernels de servidor e de área de trabalho separados.)

      • Se o sistema Ubuntu instalado (que você está corrigindo) for a versão de 64 bits, use linux-image-generic. ( linux-image-generic-paeaplica-se apenas a sistemas de 32 bits.)

        É possível ter um sistema Ubuntu de 32 bits instalado em um computador de 32 ou 64 bits. Além disso, você pode estar usando um live CD de 32 ou 64 bits para corrigir um sistema instalado de 32 bits. Portanto, se você não sabe se o sistema Ubuntu instalado é de 32 ou 64 bits, verifique executando este comando (na chroot, não em uma janela / guia separada do Terminal):

        dpkg-architecture -qDEB_HOST_ARCH_BITS
        

        A saída será 32ou 64.

        (Observe que nãouname -m é uma maneira correta de encontrar essas informações, porque mesmo quando executado no , isso mostrará a arquitetura do kernel em execução , que é o kernel do sistema do live CD e não o kernel do sistema instalado (quebrado).)chroot

      • Se o sistema Ubuntu instalado (que você está consertando) for a versão de 32 bits, o melhor kernel a ser utilizado dependerá da quantidade de RAM que você possui. Eu recomendo:

        • linux-image-generic se você tiver menos de 3 GB de RAM
        • linux-image-generic-pae se você tiver 3 GB de RAM ou mais.

        (Esta é a forma como o instalador do Ubuntu escolhe um deles para configurar, desde que o instalador ganhou a habilidade de instalar kernels PAE. Veja a resolução para este erro . Se você quiser aprender o PAE é, consulte este artigo da Wikipedia . Se você quiser para aprender sobre o PAE no Ubuntu, consulte esta página wiki do Ubuntu .)

        Se você não sabe quanta RAM você possui, execute este comando para descobrir:

        grep MemTotal /proc/meminfo
        

        Isso está listado em kilobytes . Para converter em gigabytes , divida por 1.048.576 (1024 2 ).

        • 3 shows = 3.145.728 kB
    • No Ubuntu libera antes 12,04, prováveis possibilidades são linux-image-generic, linux-image-generic-paee linux-image-server.

      • Se você estiver executando um sistema Ubuntu Server, use linux-image-server.
      • Caso contrário, siga as orientações acima para os sistemas 12.04.
  13. Este é o momento que você estava esperando! Instale um kernel no sistema quebrado.

    (Como antes, exceto quando indicado explicitamente em contrário, esses comandos são executados na chrootjanela, não em uma aba / janela separada do Terminal.)

    apt-get update
    apt-get -y install linux-image-generic

    Substitua linux-image-genericpor qualquer outro pacote do kernel que você decidiu instalar na etapa 12 acima, se diferente.

  14. Se você tiver que executar a etapa 11 para configurar a rede chroot, restaure o hostsarquivo antigo . Se você pulou a etapa 11, pule esta etapa também.

    Para restaurá-lo, execute este comando:

    cp /etc/hosts.old /etc/hosts
    
  15. Desmonte os sistemas de arquivos, exitdentre os seguintes chroot:

    umount /proc || umount -lf /proc
    umount /sys /dev/pts
    exit
    sudo umount /mnt/dev /mnt
    
  16. Desligue o sistema de CD / DVD / USB ao vivo, removendo a unidade de CD / DVD ou USB flash ao vivo. Inicialize no sistema instalado no disco rígido que você acabou de reparar. Você instalou um pacote de kernel nele (e como parte da instalação, o kernel que ele fornece será adicionado ao menu de inicialização do GRUB2). Se tudo funcionou corretamente, seu sistema deve inicializar sem problemas. (Acho que é possível que demore um pouco mais para inicializar do que o normal, desta vez.)

AVISO LEGAL: Eu não testei o procedimento acima em todos os sistemas possíveis do Ubuntu, por isso é possível que exista um erro que eu não tenha identificado.

No futuro, recomendo sempre tentar manter dois kernels instalados. É bom ter dois caso um deles pare de funcionar por qualquer motivo (você pode selecionar o outro no menu de inicialização do GRUB2). Além disso, se você pretende manter dois kernels e acidentalmente desinstalar um a mais do que pretendia e reiniciar, ainda resta um para inicializar.

Eliah Kagan
fonte
11
Esta pode ser a melhor explicação escrita de como fazer algo complexo no Linux que eu já li. Graças
ZincX
Uau, isso é tão super útil! Muito obrigado!
Rafał Cieślak 17/03/2013
2
Muito obrigado Eliah - depois de remover estupidamente todas as minhas imagens de linux, você salvou meu bacon. O único problema que eu tive foi na etapa: sudo cp /etc/resolv.conf /mnt/etc/resolv.conf Eu recebi o erro "cp: not write through dangling symlink` /mnt/etc/resolv.conf '". Encontrei este tópico e segui as instruções de um pôster para: "rm /mnt/etc/resolv.conf" antes de "cp /etc/resolv.conf /mnt/etc/resolv.conf" para resolver o problema de ligação simbólica pendente.
Hoje em /etc/resolv.confdia, o @ xcal400 é gerenciado por resolvconf, será gerado automaticamente ao usar o NetworkManager e poderá ser removido com segurança, rm /etc/resolv.confconforme você descobriu.
Lekensteyn
3
Essa deve ser a resposta aceita. Obrigado!
Jean-Michel Garcia
0

Quando removi meu kernel, encontrei esta solução nos fóruns do Ubuntu. Eu segui cada passo e o sistema foi recuperado. Espero que isso ajude você.

Um chroot pode funcionar, chroot significa que, quando você inicia um sistema, altera o sistema de arquivos raiz. Por exemplo, você iniciou a partir de um CD ao vivo, mas alterou a raiz "/" para onde seu ubuntu está instalado.

Digamos que seu ubuntu esteja instalado em / dev / sda2, então você pode tentar os seguintes comandos:

Código:

sudo mount /dev/sda2 /mnt
sudo cp /etc/resolv.conf /mnt/etc/
sudo cp /etc/hosts /mnt/etc/
sudo mount --bind /dev/ /mnt/dev
sudo chroot /mnt
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts
export HOME=/root
export LC_ALL=C
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl

agora você está "/" root em / dev / sda2, tente instalar o kernel

apt-get update
apt-get install linux-image-2.6.32-26-generic
update-initramfs -cv -k all
update-grub

Eu tive que fazer um pouco de adivinhação aqui, pois nunca tive que fazer isso antes, mas isso deveria ser sobre isso. Não sei se você recebe algum aviso de erro do fstab (como não é possível encontrar o root).

Agora você precisa limpar algumas coisas e desmontar as partições montadas:

rm /etc/resolv.conf
rm /etc/hosts
rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
umount /proc # if this doesn't work try umount -lf /proc
umount /sys
umount /dev/pts
exit
sudo umount /mnt

E você pode reiniciar para ver se funcionou.

URL para o tópico: http://art.ubuntuforums.org/showthread.php?t=1688928

Melvin
fonte
Por que você substituir /etc/hostse remover /sbin/initctl? Está lá por uma razão.
Lekensteyn
Parece, no final das contas, baseado no LiveCDCustomization ; algumas etapas não são necessárias para reparar um sistema já instalado. Em particular, não precisa fazer nada com /sbin/initctlou dbus-uuidgenou dpkg-divert. Você pode precisar substituir /etc/hostspara se conectar à Internet, mas geralmente não, e se você fizer isso, você deve colocar o original atrás. Em um sistema instalado (em vez de um CD ao vivo que inicializa e descompacta um sistema de arquivos squashfs), você não precisa executar update-initramfsou mesmo update-grubdepois de instalar o kernel.
Eliah Kagan
Além disso, como esse procedimento não instala nenhum metapacote do kernel, o kernel pode não ser atualizado corretamente posteriormente, a menos que um metapacote esteja instalado. Além disso, linux-image-2.6.32-26-genericnão será o kernel certo para a maioria das pessoas instalar.
Eliah Kagan
0

Depois que eu removido kernels antigos do Trusty14.04 ontem (FTR: eu fiz não remover os dois mais recentes!) O meu sistema não iria arrancar mais. GRUB mostrou

Error: File not found
Error: You need to load the kernel first

Não faço ideia do porquê.

Segui as excelentes instruções de Eliah Kagan para instalar a linux-image-genericpartir de um CD ao vivo. Ele instalou 150 MB de novo kernel, mas infelizmente isso não resolveu o problema.

Felizmente, encontrei esta página . A Boot-Repairferramenta acertou, meu sistema está funcionando novamente.

à esquerda
fonte
0

Eu só queria adicionar minha experiência pela qual passei hoje na atualização para o Willy. Eu me limpei um pouco e me vi apenas com o memtest. o google me levou a entender que eu havia removido os núcleos. Uma restrição que eu tinha é a rede lenta e, portanto, o download do ISO completo não era uma opção. Então eu usei o CD Ubuntu Minimal (apenas 40 MB) e inicializei nele. Depois de detectar a opção de hardware (que me ajudou a conectar à rede sem fio), entrei na opção de shell. Segui as instruções @Lekensteyn e consegui. algumas coisas: você precisa copiar resolv.confantes de ficar chroot ou o seu DNS será danificado e, como o usuário conectado, não há raiz no sudo.

Eu sei que é antigo, mas pensei que adicionar esta resposta agregar valor àqueles que encontrarem o problema.

Stefano Mtangoo
fonte