È possibile?
Bene, sono installate le utility più banali e importanti /bine 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 /binil 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 chrootentrare 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 /bindirectory, 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 /binutilizzando:
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 /bincon 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 rootfile system (per me è /dev/sda1):
mount /dev/sda1 /mnt
Avremo bisogno di connettività a Internet, quindi copia resolv.confda 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 chrootun sistema rotto quando non c'è /bindirectory lì dentro? Quale shell dovremmo eseguire?
Quindi crea una directory bin temporanea. ad es .: nominato bintmpnella radice del sistema non funzionante:
mkdir /mnt/bintmp
Quindi associa il live /bina quello:
mount --bind /bin /mnt/bintmp
Chroot nel sistema durante l'impostazione /bintmp/bashcome shell di accesso:
chroot /mnt /bintmp/bash
Esporta la variabile /bintmpcome PATHambiente:
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 /bine abbiamo quasi finito.
Al termine, utilizzare CTRL+ Dper uscire chrootdall'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 /bindirectory 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.
/binSu Ubuntu non è solo un link simbolico a/usr/binquesti giorni? Quindi tutto ciò che dovresti fare è ripristinare il link simbolico?