Come ripristinare un sistema dopo aver rimosso tutti i kernel accidentalmente?


Risposte:


93

Avvia un CD live (o live USB), monta alcuni sistemi, chroot al suo interno e installa il kernel. Dopo una corretta installazione del kernel, smontare i filesystem.

  1. Terminale aperto
  2. Montare la partizione Ubuntu: sudo mount /dev/sdXY /mnt
  3. Montare alcune partizioni speciali:

    sudo mount --bind /dev /mnt/dev
    sudo mount --bind /proc /mnt/proc
    sudo mount --bind /sys /mnt/sys
    
  4. (facoltativo) Quando si è connessi a una rete, utilizzare i server DNS dal proprio ambiente Live (altrimenti i nomi host potrebbero non essere risolti):

    cp /etc/resolv.conf /mnt/etc/resolv.conf
    
  5. Chroot in /mnt:sudo chroot /mnt
  6. Installa il kernel Linux: apt-get install linux-image-generic(non è richiesto sudo poiché sei root dopo un chroot)
  7. Dopo una corretta installazione del kernel, esci dal chroot e smonta alcuni filesystem:

    exit
    sudo umount /mnt/sys
    sudo umount /mnt/proc
    sudo umount /mnt/dev
    sudo umount /mnt
    
  8. Riavvia e rimuovi CD o USB: sudo reboot

È quello che avrei suggerito. Non riesco a capire perché non funzioni.
Oli

Ok, grazie per aver confermato. Ho aggiunto anche i passaggi di finalizzazione, smontando /mnt. Ubuntu di solito si occupa di smontare / sincronizzare i filesystem, ma questo mi sembra più pulito.
Lekensteyn,

1
@MaheshKatta Dovrai prima montare il RAID. Quindi invece del passaggio due (dove monti una singola unità) mapperai /dev/mdxxxun'unità, supponendo che sia mdadm.
Oli

4
@James Edit /etc/resolv.conf(rimuovilo se si tratta di un collegamento simbolico) e inserisci qualcosa di simile nameserver 8.8.8.8(server DNS pubblico di Google). Sostituirlo se necessario.
Lekensteyn,

3
NVM. Sembra che ho dovuto modificare il file in chroot stesso. Forse dovresti aggiungere la risposta cp /etc/resolv.conf /mnt/etc/resolv.confprima di entrare in chroot. Comunque ha funzionato per me
Peter Raeves,

56

Questo procedimento ampliato rappresenta la maggior parte delle complicazioni che potrebbero verificarsi, tra cui problemi di connessione a Internet in chroot, non sapendo quale pacchetto del kernel da installare (prima di Ubuntu 12.10, non sarà sempre essere linux-image-generic), non sapendo in via preliminare quale partizione o addirittura quale unità fisica contiene il /filesystem e con una /bootpartizione separata .

Non ho scritto questo con riferimento a nessuna delle altre procedure qui, anche se noterete alcune somiglianze. L'ho basato vagamente sulla procedura qui (anche se quelle istruzioni sono per qualcosa di completamente diverso, le ho adattate ampiamente e solo alcuni comandi, non la prosa, vengono copiati).

Hai rimosso tutti i pacchetti del kernel e Ubuntu non può essere avviato senza un kernel installato. Quindi la soluzione è avviare da un live CD / DVD / USB, chrootnel sistema installato e installarvi un kernel.

  1. Avvio da un CD / DVD live di Ubuntu o da un'unità flash USB live.

  2. Seleziona Prova Ubuntu (non Installa Ubuntu ).

  3. Quando viene visualizzato il desktop, assicurati di essere connesso a Internet. In caso contrario, connettersi a Internet. Un modo per vedere se sei connesso a Internet è aprire un browser web. Puoi anche seguire il resto delle istruzioni portando questa risposta Ask Ubuntu nel tuo browser web, nel sistema live CD / DVD / USB. Consiglio vivamente di farlo.

  4. Apri una finestra Terminale con Ctrl+ Alt+ T.

  5. Nella finestra Terminale, esegui questo comando per elencare le tue partizioni:

     sudo parted -l
    

    Vedrai qualcosa del genere (ma non sarà esattamente così):

    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. Esamina l'output ottenuto per determinare il nome del dispositivo della partizione che contiene il /filesystem del sistema Ubuntu installato sul disco rigido (che stai riparando).

    • Se hai solo una ext4partizione, quella è quella.

    • Se hai più di una ext4partizione, è probabilmente la prima. Tuttavia, se il primo è molto piccolo - meno di un gigabyte - allora quella potrebbe essere una /bootpartizione separata (ricordate anche quella).

      Si noti che il fatto che sia bootelencato o meno Flagsha poco a che fare con se una partizione è o meno una partizione separata /boot. Il mio sistema, le cui informazioni sono elencate sopra, non ha una /bootpartizione separata .

    • Il nome del dispositivo per la partizione inizia con il nome del dispositivo per l'unità fisica, indicato immediatamente dopo Disknella seconda riga. Quindi aggiungi il numero di partizione alla fine. Quindi, il nome del dispositivo per la partizione che contiene il mio / filesystem è /dev/sda1. Ecco le due righe in cui ho trovato queste informazioni:

      Disk /dev/sda: 21.5GB
       1      1049kB  20.4GB  20.4GB  primary   ext4            boot
    • Se hai più di un'unità fisica, otterrai più di un elenco come quello mostrato sopra. Ma a meno che tu non abbia installato un altro sistema simile a Unix, probabilmente avrai solo un'unità che contiene ext4partizioni, almeno senza averle create intenzionalmente su un'altra unità. Se hai più unità con ext4partizioni, probabilmente la ext4partizione che contiene il tuo /filesystem si trova su un'unità che contiene anche una linux-swappartizione.

    • È possibile che il /filesystem del tuo sistema Ubuntu sia su una partizione di tipo diverso da ext4. Quando ciò accade, è quasi sempre ext3e quasi sempre su un sistema piuttosto vecchio. È molto raro che ciò avvenga, a meno che tu non abbia intenzionalmente impostato le cose in questo modo da solo.

    Ricorda il nome del dispositivo della partizione che conteneva il tuo /filesystem (o scrivilo). Se è diverso da /dev/sda1, lo sostituirai /dev/sda1con i passaggi seguenti.

    (Se sembra che tu abbia una /bootpartizione separata , ricorda anche il nome del dispositivo per quello.)

  7. Montare il /filesystem su /mnte montare il suo /devfilesystem:

    sudo mount /dev/sda1 /mnt
    sudo mount --bind /dev /mnt/dev
  8. Controlla se il sistema Ubuntu rotto che stai riparando ha una /bootpartizione separata che deve essere montata separatamente. (Se sei sicuro di no, puoi saltare questo.)

    Per verificare, eseguire:

    ls /mnt/boot
    

    Se c'è un output (simile grub memtest86+.bin memtest86+_multiboot.bin, ma non necessariamente esattamente), il sistema rotto si /boottrova sulla stessa partizione del suo /e non è necessario montare nulla per accedervi.

    Ma se non c'è output, allora dovrai montare il /bootfilesystem:

    sudo mount BOOT-PARTITION /mnt/boot

    Sostituire BOOT-PARTITIONcon il nome del dispositivo della /bootpartizione (vedere il passaggio 6 sopra).

  9. chroot nel sistema danneggiato, montare i restanti importanti filesystem virtuali e impostare alcune importanti variabili di ambiente:

    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. Determina se l'accesso a Internet funziona dall'interno chrootdi pingun host affidabile noto per rispondere normalmente ai ping:

    ping -c 5 www.google.com
    

    Dovresti vedere qualcosa del genere:

    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 sembra principalmente così, e il numero precedente % packet lossè inferiore a 100, allora la connessione a Internet chrootfunziona:

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

      Funziona, quindi puoi saltare il passaggio 11 .

    • Se sembra principalmente così, e il numero precedente % packet lossè 100, la connessione deve essere risolta. Accertarsi che la connessione sul sistema di live CD (ad esempio, tramite un browser Web o eseguendo lo stesso comando in una chrootscheda / finestra Terminale separata non elaborata) funzioni. Assicurati di digitare correttamente il comando. Usa www.google.comse non lo sei stato.

    • Se l'output non assomiglia affatto a quanto sopra, ma invece dice ping: unknown host www.google.com, allora la rete non funziona ancora in chroot.

  11. Configurare la rete in chroot. Saltare questo passaggio a meno che non si sia verificato un unknown hosterrore nel passaggio 10 sopra.

    Per configurare la rete, eseguire il backup del hostsfile del sistema danneggiato e copiarlo sul sistema hostse sui resolv.conffile del CD live . (Non è necessario eseguire il backup della versione del sistema non funzionante resolv.conf, poiché quel file viene rigenerato automaticamente al volo.)

    Apri una nuova scheda Terminale ( Ctrl+ Shift+ T) o, se preferisci, una nuova finestra Terminale ( Ctrl+ Shift+ No solo Ctrl+ Alt+ T). Esegui questi comandi al suo interno:

    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
    

    (Il exitcomando alla fine chiude la nuova scheda / finestra.)

    Ripetere il passaggio 10 sopra per assicurarsi che l'accesso a Internet funzioni ora dall'interno chroot. Dovrebbe.

  12. Scopri quale pacchetto del kernel dovrebbe essere installato. Di solito, questo sarà linux-image-generic. Ma non sempre.

    Se non sei sicuro di quale installare, dipenderà in parte dalla versione di Ubuntu che hai installato e in parte da altre informazioni. Se non sei sicuro di quale versione di Ubuntu hai installato, scoprilo eseguendo questo comando (nella chroot, non in una finestra / scheda Terminale separata):

    lsb_release -r
    
    • Su Ubuntu 12.10 (la prossima versione di Ubuntu, attualmente in fase di sviluppo), lo sarà semprelinux-image-generic . (Vedi questo , questo e questo .)

    • Su Ubuntu 12.04 LTS, le probabili possibilità sono linux-image-generice linux-image-generic-pae. (A differenza delle versioni precedenti, 12.04 non ha più kernel separati per server e desktop.)

      • Se il sistema Ubuntu installato (che si sta risolvendo) è la versione a 64 bit, utilizzare linux-image-generic. ( linux-image-generic-paesi applica solo ai sistemi a 32 bit.)

        È possibile avere un sistema Ubuntu a 32 bit installato su un computer a 32 o 64 bit. Inoltre, è possibile che si stia utilizzando un CD live a 32 o 64 bit per riparare un sistema installato a 32 bit. Quindi se non sai se il sistema Ubuntu installato è a 32-bit o 64-bit, controlla eseguendo questo comando (nella chroot, non in una finestra / scheda Terminale separata):

        dpkg-architecture -qDEB_HOST_ARCH_BITS
        

        L'output sarà 32o 64.

        (Nota che nonuname -m è un modo corretto di trovare queste informazioni, perché anche quando eseguito nel , ti dirà l'architettura del kernel in esecuzione , che è il kernel del sistema CD live e non il kernel del sistema installato (rotto).)chroot

      • Se il sistema Ubuntu installato (che stai riparando) è la versione a 32 bit, il miglior kernel da utilizzare dipenderà dalla quantità di RAM che hai. Io raccomando:

        • linux-image-generic se hai meno di 3 GB di RAM
        • linux-image-generic-pae se hai 3 GB di RAM o più.

        (Questo è il modo in cui il programma di installazione di Ubuntu sceglie quale impostare, da quando il programma di installazione ha acquisito la capacità di installare i kernel PAE. Vedi la risoluzione di questo bug . Se vuoi imparare cos'è PAE, vedi questo articolo di Wikipedia . Se vuoi scopri PAE in Ubuntu, vedi questa pagina wiki di Ubuntu .)

        Se non sai quanta RAM hai, esegui questo comando per scoprire:

        grep MemTotal /proc/meminfo
        

        Questo è elencato in kilobyte . Per convertire in gigabyte , dividere per 1.048.576 (1024 2 ).

        • 3 concerti = 3.145.728 kB
    • Su Ubuntu rilascia prima 12.04, probabili possibilità sono linux-image-generic, linux-image-generic-paee linux-image-server.

      • Se stai utilizzando un sistema Ubuntu Server, usa linux-image-server.
      • Altrimenti, seguire i consigli sopra per i sistemi 12.04.
  13. Questo è il momento che stavi aspettando! Installa un kernel nel sistema rotto.

    (Come prima, tranne dove diversamente indicato esplicitamente, questi comandi vengono eseguiti nella chrootfinestra / scheda Terminale non separata.)

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

    Sostituisci linux-image-genericcon qualsiasi altro pacchetto kernel che hai deciso di installare nel passaggio 12 sopra, se diverso.

  14. Se è necessario eseguire il passaggio 11 per configurare la rete in chroot, ripristinare il vecchio hostsfile. Se hai saltato il passaggio 11, salta anche questo passaggio.

    Per ripristinarlo, esegui questo comando:

    cp /etc/hosts.old /etc/hosts
    
  15. Smonta filesystem, exitestraendo da chroot:

    umount /proc || umount -lf /proc
    umount /sys /dev/pts
    exit
    sudo umount /mnt/dev /mnt
    
  16. Arrestare il sistema CD / DVD / USB live, rimuovendo il CD / DVD live o l'unità flash USB. Avvia nel sistema installato sul disco rigido che hai appena riparato. In esso è installato un pacchetto kernel (e come parte dell'installazione, il kernel fornito verrà aggiunto di nuovo al menu di avvio di GRUB2). Se tutto ha funzionato correttamente, il tuo sistema dovrebbe avviarsi senza problemi. (Penso che sia possibile che l'avvio richieda un po 'più tempo del solito, questa volta.)

DISCLAIMER: Non ho testato la procedura sopra descritta su ogni possibile sistema Ubuntu, quindi è possibile che ci sia un errore che non ho identificato.

In futuro, consiglio di provare sempre a mantenere installati due kernel. È utile averne due nel caso in cui uno di essi smetta di funzionare per qualsiasi motivo (è possibile selezionare l'altro nel menu di avvio di GRUB2). Inoltre, se hai intenzione di mantenere due kernel e ne disinstalli accidentalmente uno più di quello che volevi e riavvia, ne rimani ancora uno da cui avviare.


1
Questa potrebbe essere la migliore spiegazione scritta di come fare qualcosa di complesso in Linux che abbia mai letto. Grazie
ZincX,

Caspita, è molto utile! Grazie enormi!
Rafał Cieślak,

2
Grazie mille Eliah - dopo aver rimosso stupidamente tutte le mie immagini di Linux, mi hai salvato la pancetta. L'unico inconveniente che ho avuto è stato al passaggio: sudo cp /etc/resolv.conf /mnt/etc/resolv.conf Ho ricevuto un errore "cp: non scrivendo tramite symlink penzolante` /mnt/etc/resolv.conf '". Ho trovato questo thread e ho seguito le istruzioni di un poster per: "rm /mnt/etc/resolv.conf" prima di "cp /etc/resolv.conf /mnt/etc/resolv.conf" per risolvere il problema del collegamento simbolico penzolante.

@ xcal400 /etc/resolv.confè attualmente gestito da resolvconf, verrà generato automaticamente quando si utilizza NetworkManager e può essere rimosso in modo sicuro utilizzando rm /etc/resolv.confcome è stato scoperto.
Lekensteyn,

3
Questa dovrebbe essere la risposta accettata. Grazie!
Jean-Michel Garcia,

0

Quando ho rimosso il mio kernel ho trovato questa soluzione nei forum di Ubuntu. Ho seguito ogni passaggio e il sistema è stato ripristinato. Spero che ti possa aiutare.

Un chroot potrebbe funzionare, chroot significa che quando si avvia un sistema si modifica il file system di root. Ad esempio, sei partito da un CD live ma hai cambiato il root "/" nel punto in cui è installato Ubuntu.

Supponiamo che Ubuntu sia installato su / dev / sda2, quindi puoi provare i seguenti comandi:

Codice:

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

ora sei root "/" è su / dev / sda2, prova a installare il kernel

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

Ho dovuto fare un po 'di ipotesi qui, dal momento che non ho mai dovuto farlo prima, ma questo dovrebbe essere al riguardo. Non so se ricevi un avviso di errore fstab (come non riesco a trovare il root).

Ora devi ripulire alcune cose e smontare le partizioni montate: Codice:

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 puoi riavviare per vedere se ha funzionato.

URL per la discussione: http://art.ubuntuforums.org/showthread.php?t=1688928


Perché dovresti sostituire /etc/hostse rimuovere /sbin/initctl? È lì per un motivo.
Lekensteyn,

Questo sembra in definitiva basato su LiveCDCustomization ; alcuni passaggi non sono necessari per riparare un sistema già installato. In particolare, non è necessario fare nulla con /sbin/initctlo dbus-uuidgeno dpkg-divert. Si potrebbe essere necessario sostituire /etc/hostsper la connessione a Internet, ma di solito non, e se lo fai, si dovrebbe mettere la parte posteriore originale. Su un sistema installato (anziché su un CD live che si avvia e decomprime un filesystem di squashfs), non è necessario eseguire update-initramfso anche update-grubdopo aver installato il kernel.
Eliah Kagan,

Inoltre, poiché questa procedura non installa alcun metapacchetto del kernel, il kernel potrebbe non essere aggiornato correttamente in un secondo momento, a meno che non sia installato un metapacchetto. Inoltre, linux-image-2.6.32-26-genericnon sarà il kernel giusto per la maggior parte delle persone da installare.
Eliah Kagan,

0

Dopo aver rimosso i vecchi kernel da Trusty14.04 ieri (FTR: non ho rimosso i due più recenti!) Il mio sistema non si avvia più. GRUB ha mostrato

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

Non ho idea del perché.

Ho quindi seguito le eccellenti istruzioni di Eliah Kagan per l'installazione linux-image-genericda un CD live. Ha installato 150 MB di nuovo kernel, ma purtroppo non ha risolto il problema.

Per fortuna, ho trovato questa pagina . Lo Boot-Repairstrumento ha funzionato correttamente, il mio sistema è di nuovo in esecuzione.


0

Volevo solo aggiungere la mia esperienza che ho vissuto oggi per l'aggiornamento a Willy. Ho pulito un po 'e mi sono ritrovato con solo memtest. google mi ha portato a capire che avevo rimosso i kernel. Un limite che avevo era la rete lenta e quindi il download di ISO completo non era un'opzione. Quindi ho usato Ubuntu Minimal CD (solo 40 MB) e mi sono avviato. Dopo aver rilevato l'opzione hardware (che mi ha aiutato a connettermi al wireless) sono passato all'opzione shell. Ho seguito le istruzioni di @Lekensteyn e ci sono riuscito. alcune cose però: devi copiare resolv.confprima di andare chroot altrimenti il ​​tuo DNS verrà fregato e poiché l'utente che ha effettuato l'accesso non ha root su sudo da nessuna parte.

So che è vecchio ma ho pensato che l'aggiunta di questa risposta aggiungesse valore a coloro che avrebbero riscontrato il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.