È possibile?
Bene, sono installate le utility più banali e importanti /bin
e ora hai perso l'accesso a tutte. In effetti, se riavvii, il tuo sistema non sarà più in grado di avviarsi.
Ad ogni modo, risolveremo il problema e renderemo /bin
il contenuto il più vicino possibile al luogo in cui si trovava. L'unica differenza sarebbero alcuni collegamenti simbolici che anche noi sistemeremo.
Come?
In primo luogo, dovremmo chroot
entrare nel tuo sistema rotto, ma con una differenza minore ! Dopodiché otterremo un elenco di pacchetti installati sul tuo sistema che hanno qualsiasi file installato nella /bin
directory, quindi scaricheremo solo i pacchetti necessari ed estraeremo i file necessari in /bin
. Quindi avremo finito.
Ad esempio, dopo chroot
, possiamo ottenere un elenco di pacchetti che hanno file installati /bin
utilizzando:
dpkg --search /bin | cut -f1 -d: | tr ',' '\n'
E possiamo anche usare:
dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/
per elencare i file installati da questi pacchetti in /bin
.
Quindi creiamo semplicemente un elenco di tutti i pacchetti che ci sono necessari, quindi li scarichiamo ed estraiamo /bin
con qualcosa come:
xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin
Tuttavia, dobbiamo usare uno script per controllare tutti i pacchetti installati sul nostro sistema, perché farlo manualmente è solo una follia.
Quindi ho scritto una sceneggiatura che fa tutto ciò di cui abbiamo bisogno. Trova tutti i pacchetti necessari per il ripristino /bin
, ci mostra il nome di ciascun pacchetto e i relativi file a cui appartiene /bin
. Ecco uno screenshot:
Alla fine scegliamo di reinstallare tutti i pacchetti o di scaricare ed estrarre solo i file necessari /bin
(che è l'opzione consigliata):
Puoi prendere una copia di questo script o scaricarlo direttamente .
Iniziamo
chroot
Avvia il tuo sistema con un disco live con la stessa architettura di Ubuntu installato, apri un terminale e ottieni l'accesso root:
sudo -i
Montare il tuo root
file system (per me è /dev/sda1
):
mount /dev/sda1 /mnt
Avremo bisogno di connettività a Internet, quindi copia resolv.conf
da Ubuntu live alla tua partizione di root montata:
cp /etc/resolv.conf /mnt/etc/resolv.conf
Ora copia lo script da qualche parte sulla partizione montata, ad esempio:
cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh
oppure puoi scaricarlo usando wget
, ecc. come:
wget https://git.io/v9fRm -O /mnt/restore-bin.sh
Montare altri percorsi necessari:
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc
E qui c'è la differenza minore : come possiamo avere chroot
un sistema rotto quando non c'è /bin
directory lì dentro? Quale shell dovremmo eseguire?
Quindi crea una directory bin temporanea. ad es .: nominato bintmp
nella radice del sistema non funzionante:
mkdir /mnt/bintmp
Quindi associa il live /bin
a quello:
mount --bind /bin /mnt/bintmp
Chroot nel sistema durante l'impostazione /bintmp/bash
come shell di accesso:
chroot /mnt /bintmp/bash
Esporta la variabile /bintmp
come PATH
ambiente:
export PATH=/bintmp:$PATH
Dai allo script il bit eseguibile:
chmod +x restore-bin.sh
Esegui lo script:
./restore-bin.sh
Attendi il completamento della ricerca, quindi rispondi alla domanda che abbiamo visto nello screenshot. Inizierà a ripristinare /bin
e abbiamo quasi finito.
Al termine, utilizzare CTRL+ Dper uscire chroot
dall'ambiente e smontare i percorsi montati:
umount -R /mnt
Riavvia il sistema.
Ripristino dei collegamenti all'interno /bin
Ora quasi tutti i file all'interno della /bin
directory sono tornati, tranne circa 5 collegamenti simbolici gestiti da update-alternatives
.
Nel tuo sistema operativo, esegui:
sudo update-alternatives --all
Ti pone alcune domande; puoi semplicemente premere ENTERper accettarli tutti.
E ora abbiamo finito.
/bin
Su Ubuntu non è solo un link simbolico a/usr/bin
questi giorni? Quindi tutto ciò che dovresti fare è ripristinare il link simbolico?