Qual è il modo corretto di preparare chroot per ripristinare un'installazione Linux rotta?


52

Questa domanda si riferisce a domande che vengono poste spesso. La procedura è spesso menzionata o collegata a un sito esterno, ma spesso non è chiaramente e correttamente dichiarata. Al fine di concentrare le informazioni utili in un unico posto, questa domanda cerca di fornire un riferimento chiaro e corretto per questa procedura.


Quali sono i passi corretti per preparare un ambiente chroot per una procedura di recupero?

In molte situazioni , la riparazione di un'installazione Linux interrotta viene eseguita al meglio dall'interno dell'installazione. Ma se il sistema non si avvia, come lo ripari dall'interno?

Supponiamo che tu riesca ad avviare un sistema alternativo. Una volta lì, è necessario accedere all'installazione interrotta per ripararlo. Molti How-Tos di ripristino consigliano di utilizzare chroot per eseguire i programmi come se si fosse effettivamente avviati nell'installazione interrotta.

  • Qual è la procedura di base?
  • Ci sono le migliori pratiche accettate da seguire?
  • Quali variabili devono essere prese in considerazione per adattare le fasi di preparazione di base a un determinato compito di recupero?

Poiché si tratta di Wiki della community, sentiti libero di modificare questa domanda per migliorarla.

Risposte:


72

Ecco alcune risorse:

"Cambiare root" o "chrooting" è un metodo per ingrandire una parte del tuo filesystem, in modo che, ad esempio, /pathsi riferisca a ciò che era precedentemente accessibile a /mnt/path. Il "root" nell'espressione "chroot" si riferisce al filesystem di root /, non all'utente root. (Anche se in genere avrai bisogno dei privilegi di utente root per chroot.)

Preparazione

  • Tutti i passaggi di questa guida dovranno essere eseguiti come utente root.

  • Supponiamo che il tuo disco rigido sia in / dev / sda1 e il suo tipo di file sia ext3. Se non conosci la posizione e il tipo di file del tuo disco, leggi l'output di fdisk -l.

  • Assicurarsi che le architetture del sistema in cui è stato avviato (ad es. Un LiveCD a 32 bit) e il sistema in cui si desidera inserire (ad es. Un'installazione a 32 bit sul disco rigido) corrispondano. È possibile determinare l'architettura avviata con l'utilizzo uname -m.

  • Assicurarsi che tutti i moduli del kernel necessari siano stati caricati.

  • Configurare la rete se necessario (ad es. Per installare pacchetti aggiornati).

  • Inizializza la tua partizione di swap se necessario (ad es swapon /dev/sda3.).

Esecuzione del chroot

cd /
mount -t ext3 /dev/sda1 /mnt
mount -t proc proc /mnt/proc
mount -t sysfs sys /mnt/sys
mount -o bind /dev /mnt/dev

Se la tua /bootdirectory si trova su una partizione diversa dalla tua /e vuoi manipolare i file su di essa (ad esempio, se lavorerai con GRUB, eseguirai un aggiornamento del kernel, ecc.), Dovrai anche montare quella partizione. Se è in / dev / sda2 e il suo tipo di file è ext2, allora fai:

mount -t ext2 /dev/sda2 /mnt/boot

Allo stesso modo per qualsiasi altra parte del tuo filesystem ( /var, /usr) che risiede su partizioni separate ma a cui devi accedere. Generalmente quando chrooting per riparare qualcosa non avrai bisogno di accedere a / home, quindi non devi preoccuparti di esso.

(È anche possibile montare filesystem dopo aver eseguito il chrooting, ma è più intelligente farlo in anticipo. Il motivo è che quando lo si fa dopo, l'ambiente esterno / kernel non conoscerà i filesystem montati, quindi se si dimentica di smontarli prima di uscire dal chroot, il sistema non saprà nemmeno smontarli quando si spegne. Ciò potrebbe danneggiare quei filesystem.)

Se hai configurato la tua rete e desideri utilizzarla nel sistema chroot, copialo in /etc/resolv.confmodo da poter risolvere i nomi di dominio:

cp -L /etc/resolv.conf /mnt/etc/resolv.conf

Ora sei pronto per passare al filesystem montato:

chroot /mnt /bin/bash

(Se questo restituisce un errore chroot: cannot run command '/bin/bash': Exec format error, di solito indica che si è avviato con un'architettura (ad esempio x86_32) e si sta tentando di eseguire il chroot in un'altra (ad esempio x86_64). La soluzione consiste nell'utilizzare un LiveCD con la stessa architettura del sistema che si desidera chroot in.)

A questo punto, stai ancora eseguendo il kernel con cui hai avviato, ma tutti i percorsi /pathfaranno riferimento a quello che era /mnt/path.

Se farai qualcosa con GRUB, dovrai assicurarti che il tuo /etc/mtabfile sia aggiornato:

grep -v rootfs /proc/mounts > /etc/mtab

Potrebbe anche essere utile a questo punto fare:

source /etc/profile
export PS1="(chroot) $PS1"  # add a reminder to your prompt

Fai il tuo lavoro sporco

A questo punto, puoi eseguire qualsiasi risoluzione dei problemi che devi fare:

  • reinstalla GRUB nell'MBR del tuo disco
  • resettare una password dimenticata
  • eseguire un aggiornamento del kernel (o downgrade)
  • ricostruisci il tuo initramdisk
  • correggi il tuo / etc / fstab
  • reinstallare i pacchetti utilizzando il gestore pacchetti
  • qualunque cosa

Pulire

Al termine, assicurarsi che tutti i programmi in esecuzione siano stati arrestati. Quindi esci dal chroot:

exit

Ora smonta tutte le partizioni che hai montato:

umount /mnt/boot # if you mounted this or any other separate partitions
umount /mnt/{proc,sys,dev}

Infine, prova a smontare il disco rigido:

umount /mnt

Se viene visualizzato un errore che indica che / mnt (o qualsiasi altra partizione) è occupata, ciò può significare una delle due cose:

  • È stato lasciato in esecuzione un programma all'interno del chroot.

  • O più frequentemente: esiste ancora un mount point su questo mount. Ad esempio, / mnt / usr è ancora montato quando si tenta di smontare / mnt.

In quest'ultimo caso, è sufficiente smontare prima il punto di montaggio offensivo. Per ottenere un promemoria di tutti i punti di montaggio correnti, eseguire mountsenza parametri.

Finalmente:

reboot

10
Come preparazione, tendo a lasciare uno script chiamato chroot.shnella radice di ogni sistema che utilizzo, il cui contenuto corrisponde più o meno a quanto sopra. Quando ho bisogno di chroot in quel sistema da un LiveCD o qualcosa del genere, allora devo solo montare il filesystem di root ed eseguire lo script chroot. Non dovrai più cercare freneticamente i comandi giusti.
Ryan Thompson,

4
Lei, signore, mi ha salvato la pancetta - brillante commento. In situazioni come questa, vorrei che SO avesse un pulsante +1000.
zelanix,

1
Usa questo: SHELL=/bin/bash chroot /mntse SHELL predefinito di livecd non si trova nell'ambiente chroot (il defalut zsh di systemrescuecd è un esempio) da correggere, ad esempio !in Vim.
Alois Mahdal,

Ho scoperto che anche in /runquesti giorni è necessario montare mount --bind /run /mnt/run.
febbraio
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.