Rimosso accidentalmente / cestino. Come lo ripristino?


91

Stavo lavorando su una directory chiamata bin. Dopo aver terminato, a causa della proprietà bine di alcuni file al suo interno, ho eseguito per errore:

sudo rm -r /bin

Invece di:

sudo rm -r bin

Sembra che le mie mani aggiungessero un /davanti a tutto ciò che scrivo.

Come posso ripristinare la mia /bindirectory?

Voglio gli stessi file che appartengono al mio Ubuntu, non mi piace copiarli e incollarli da un disco live o da un altro sistema in esecuzione.


3
/binSu Ubuntu non è solo un link simbolico a /usr/binquesti giorni? Quindi tutto ciò che dovresti fare è ripristinare il link simbolico?
Muzer,

3
@Muzer sto correndo il 16.04, e /binnon è un collegamento simbolico a /usr/binqui, penso che sarebbe contro FHS. anche se controlliamo un pacchetto banale come coreutilsin zesty (qui) . possiamo vedere molte cose verranno installate /bininsieme a /usr/bin, ma può comunque essere un collegamento, di cui non sono a conoscenza.
Ravexina,

2
@Ravexina Arch Linux già symlink / bin a / usr / bin
Dmitry Kudriavtsev

1
Ho pensato che le persone si renderanno conto che si tratta di una situazione inventata, in realtà non ho rimosso la mia /bin, ho preso in considerazione qualcosa che potrebbe succedere a chiunque (sulla base di un'altra domanda a cui ho risposto), quindi ho scritto un'istruzione per condividere le mie conoscenze con gli altri :), anche se apprezzo tutti i commenti, sono utili anche ad altre persone che vengono a leggere questa domanda. Grazie a tutti;)
Ravexina,

1
Ho preso l'abitudine di ogni volta che utilizzo un comando "rm -r", o qualsiasi altro comando che possa avere conseguenze significative, digito il comando e poi allontano le mani dalla tastiera per circa 3 secondi almeno prima di premere ACCEDERE. Questo mi dà la possibilità di esaminarlo e di assicurarmi di aver digitato tutto correttamente e di sapere cosa farà e cosa ho intenzione di fare. In rare occasioni, durante quella pausa, decido che devo cancellare il comando - non sempre perché è il comando sbagliato, ma a volte perché devo prima fare una verifica.
Aj

Risposte:


180

È 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:

Schermata dell'elenco dei pacchetti <code> / bin </code> come prodotto dal mio script

Alla fine scegliamo di reinstallare tutti i pacchetti o di scaricare ed estrarre solo i file necessari /bin(che è l'opzione consigliata):

Schermata delle opzioni fornite dal mio script

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.


30
Questa è, senza dubbio, la migliore risposta che ho visto su Ask Ubuntu. È estremamente gentile da parte tua lavorare così tanto sapendo che l'OP si trova in una situazione scomoda.
Nonny Moose,

15
Oh aspetta tl; dr. Avrei dovuto rendermi conto che l'hai fatto.
Nonny Moose,

Questo è fantastico Adoro il modo in cui il design SE non dà alcun indizio sul fatto che si tratti di una domanda con risposta autonoma.
Pedro A,

5
@Hamsteriffic lo fa: vedi il rettangolo contenente il nome del risponditore (firma): ha uno sfondo più scuro, che i post non dall'OP non lo fanno. Questo vale per commenti, risposte e domande.
Ruslan,

27

Se il tuo sistema attuale ha ancora una shell in esecuzione e l'accesso a Internet, questo può essere fatto usando strumenti esistenti altrove sul sistema. Presumo che tu abbia solo cancellato /bin. /binovviamente ha l'utilità più conveniente che potresti usare in una situazione del genere (busybox), ma senza quello, dovremo diventare un po 'creativi.


Dal momento che hai già una shell in esecuzione, e poiché sudoè in /usr/bin, procuriamoci una shell di root in esecuzione prima di fare ulteriori danni. Ma /bin/bashe molte altre conchiglie sono sparite! Fortunatamente, Linux ha ancora una copia in memoria della shell che stai usando. Così:

sudo /proc/$$/exe

A rigor di termini non abbiamo bisogno di una shell radice per gran parte di ciò che segue. Ma in ogni caso.

Ora dpkgfunziona ancora, almeno per trovare quali pacchetti contengono file in /bin:

dpkg -S /bin

Possiamo usarlo awkper elaborarlo e ottenere i nomi dei pacchetti xargse apt-getper scaricare i pacchetti (tutto in /usr/bin). Se hai una directory temporanea che puoi usare, cdlì, perché la tua directory attuale diventerà un po 'confusa:

dpkg -S /bin | awk -F '[, :]' '{NF--}1' | xargs apt-get download

Ora, il problema più grande che abbiamo è che /bin/tarmanca e senza di esso non è dpkgpossibile estrarre gli archivi. Possiamo ottenere due terzi del percorso lì, perché:

  1. .debi file sono in realtà ararchivi (di nuovo in /usr/bin):

    ar x tar_*.deb
    
  2. Composto da due .tar.*archivi datae control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Mentre le utility gzip sono in /bin, unxzè in /usr/bin:

    unxz data.tar.xz
    

Ora abbiamo un data.tarfile senza tarestrarlo tar.

Python in soccorso ! Questo è dove sudoè veramente necessario:

$ sudo python -c 'import tarfile; tarfile.open("data.tar").extractall("/")'
$ echo /bin/*
/bin/tar

Ora possiamo usare dpkgper estrarre i file deb rimanenti per ottenere un ragionevole ragionevole /bin:

for i in *.deb; do dpkg-deb -x "$i" /; done

Tuttavia, dovremmo ancora fare una corretta installazione dei file deb, in modo che vengano ricreati collegamenti simbolici ecc. Che verrebbero creati dai pacchetti:

sudo apt install --reinstall ./*.deb

O:

sudo dpkg -i *.deb
sudo apt-get install -f

Appunti:

  1. Non possiamo usare Python 2 per estrarre direttamente il data.tar.xzfile, poiché Python 2 supporta solo la compressione gzip e bzip2. Python 3, tuttavia, lo supporta, quindi puoi usare Python 3 direttamente senza unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. Dopo essere tornato /bin/tar, è ancora necessario estrarre alcuni dei file deb prima di poter utilizzare apt-get: shell, coreutils, ecc. Più facile da estrarre tutti e reinstallare in seguito.

Non l'ho provato, ma l'ho quasi letto completamente, è stato fantastico, in realtà ho provato a trovare una copia di bash in memoria, ho cercato un po ', non ho trovato nulla di interessante e dopo aver visto che tar è non in /usr/bin, ho detto quello che vado con chroot ... Fantastico.
Ravexina,

1
Una domanda, non è /proc/$$/exeun collegamento a /bin/bash? come funziona quando /binviene rimosso? (Funziona, ma come), ho pensato che dovesse essere un collegamento interrotto ... ecco perché ho lasciato indietro questa Idea.
Ravexina,

3
@Ravexina non ha ottenuto una risposta completa, ma: in che modo il symlink / proc / <pid> / exe differisce dai normali symlink?
muru,

1
PERCORSO = / usr / lib / klibc / bin: $ PATH riporterà cat e sh nel tuo percorso
Giosuè,

@Joshua E tutti collegati staticamente! Bello!
muru,

7

È possibile inserire temporaneamente file da un CD live o da un altro sistema nel proprio sistema /binper renderlo utilizzabile, quindi sostituirli con i file dell'installazione di Ubuntu eseguendo i apt-get install --reinstallpacchetti che contengono elementi /bin.


Questo è quello che vorrei fare. Il DVD live con lo stesso numero di versione sarà quasi lo stesso se non esattamente uguale all'attuale installato. Se avessi un disco o una versione USB Live potrei confrontarli e pubblicare una risposta come la tua. Questa discussione è più una teoria se OP non ha mai cancellato / bin in primo luogo, il che è una possibilità in quanto ha scritto la risposta contemporaneamente alla domanda con ogni probabilità. Esperimento di pensiero ancora molto bello e stile di scrittura eccellente.
WinEunuuchs2Unix

Consiglio di modificare questa risposta per espanderla con dettagli specifici su come eseguire questa operazione. (Vedi anche Come faccio a scrivere una buona risposta? Per consigli generali su quali tipi di risposte sono considerate più preziose su AskUbuntu.)
David Foerster

1

Alcune aggiunte a questa risposta eccellente , dopo ho incontrato questo problema (insieme con l'eliminazione /boot, /etc, /libe /lib64):

  • chrootrichiede /libed /lib64essere presente; altrimenti si otterrà il seguente errore: li
    failed to run command ‘/bin/bash’: No such file or directory
    ho copiati dal sistema operativo LiveCD e non ho riscontrato problemi durante il ripristino. YMMV a seconda dei pacchetti installati sul sistema
  • Non riesco a modificare la risposta di cui sopra, ma c'è un errore di battitura:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    dovrebbe essere
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootpuò essere facilmente ripristinato utilizzando gli strumenti di grub. Vedi qui .
  • Poiché questa risposta suggerisce, apt install --reinstall <package>è un ottimo modo per ripristinare i file mancanti in /bin, /libe /lib64.
    • Alcuni pacchetti che richiedevano la reinstallazione: libaio1, mysql-server, openvpn,vsftpd

Nota per sé:
rm -rf folder /*non è lo stesso dirm -rf folder/*

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.