Vraag Per ongeluk verwijderd / bin. Hoe herstel ik het?


Ik werkte aan een map met de naam bin. Nadat ik klaar was, vanwege het eigendom van bin en enkele bestanden erin heb ik per ongeluk uitgevoerd:

sudo rm -r /bin

In plaats van:

sudo rm -r bin

Het lijkt erop dat mijn handen een a toevoegden / voor alles wat ik typ.

Hoe kan ik mijn herstellen /bin directory?

Ik wil dezelfde bestanden die bij mijn Ubuntu horen, ik vind het niet leuk om ze te kopiëren en te plakken vanaf een live-schijf of een ander hardlopend systeem.


88
2018-04-19 15:02


oorsprong


is het niet /bin op Ubuntu slechts een symbolische link naar /usr/bin de laatste tijd? Dus alles wat u hoeft te doen is de symlink terugzetten? - Muzer
@Muzer Ik voer 16.04, en /bin is geen symbolische link naar /usr/bin hier, ik denk dat dat tegen de FHS. ook als we een triviaal pakket controleren coreutils in zesty  (hier). we kunnen zien dat er veel dingen worden geïnstalleerd /bin naast de /usr/bin, maar toch kan het een link zijn, ik weet het niet. - Ravexina
@Ravexina Arch Linux symboliseert al / bin naar / usr / bin - Dmitry Kudriavtsev
Ik dacht dat mensen zullen beseffen dat het een verzonnen situatie is, ik heb mijn niet echt verwijderd /bin, Ik overwoog iets dat met iemand anders kon gebeuren (Gebaseerd op een andere vraag waarop ik antwoordde), Vervolgens schreef ik een instructie om mijn kennis met anderen te delen :), hoewel ik alle opmerkingen waardeer, ze zijn ook nuttig voor andere mensen die komen om deze vraag te lezen. Bedankt iedereen ;) - Ravexina
Ik heb de gewoonte gekregen om telkens wanneer ik een "rm -r" -opdracht gebruik, of een ander commando dat aanzienlijke gevolgen zou kunnen hebben, het commando in te typen en dan mijn handen ongeveer 3 seconden van het toetsenbord weg te houden, ten minste voordat ik het zou raken. ENTER. Dat geeft me een kans om het te bekijken en ervoor te zorgen dat ik alles correct heb ingetypt en dat ik weet wat het gaat doen wat ik van plan ben te doen. In zeldzame gevallen, tijdens die pauze, besluit ik dat ik het commando moet wissen - niet altijd omdat het de verkeerde opdracht is, maar soms omdat ik eerst een verificatie moet doen. - ajb


antwoorden:


Is dit mogelijk?

Nou, de meeste triviale en belangrijke hulpprogramma's zijn geïnstalleerd in /binen nu was je de toegang tot al die dingen kwijt. Als u opnieuw opstart, kan uw systeem niet meer opstarten.

Hoe dan ook, we gaan het probleem oplossen en maken /binde inhoud zo dicht als mogelijk is tot waar het was. Het enige verschil zou zijn enkele symbolische links die we ook zullen repareren.


Hoe?

Ten eerste zouden we dat moeten doen chroot in je kapotte systeem, maar met een klein verschil! Hierna krijgen we een lijst met geïnstalleerde pakketten op uw systeem waarop een geïnstalleerd bestand staat /bin directory, dan gaan we alleen de benodigde pakketten downloaden en de benodigde bestanden uitpakken /bin. Dan zijn we klaar.

Bijvoorbeeld na chroot, we kunnen een lijst krijgen met pakketten waarin bestanden zijn geïnstalleerd /bin gebruik makend van:

dpkg --search /bin | cut -f1 -d: | tr ',' '\n'

En we kunnen ook gebruiken:

dpkg --listfiles PACKAGE-NAME | grep "^/bin/" # or awk '$0 ~ "^/bin/

om de geïnstalleerde bestanden met deze pakketten in te geven /bin.

Vervolgens maken we eenvoudig een lijst met alle pakketten die nodig zijn voor ons, downloaden ze vervolgens en extraheren ze naar /bin met zoiets als:

xargs apt download < list-packages
dpkg-deb -x PACKAGE .
mv ./bin/* /bin

We moeten echter een script gebruiken om alle geïnstalleerde pakketten op ons systeem te controleren, omdat het handmatig doen gewoon gekkenwerk is.

Dus ik schreef een script dat alles doet wat we nodig hebben. Het vindt alle benodigde pakketten die we kunnen herstellen /bin, toont ons de naam van elk pakket en de gerelateerde bestanden die bij het pakket horen /bin. Hier is een screenshot:

Screenshot of <code>/bin</code> package list as output by my script

Aan het einde kiezen we ervoor om alle pakketten opnieuw te installeren of alleen de benodigde bestanden te downloaden en uit te pakken /bin (wat de aanbevolen optie is):

Screenshot of options given by my script

Je kunt pakken een kopie van dit script of download het direct.


Laten we beginnen

chroot

Start je systeem op met een live-schijf met dezelfde architectuur als je geïnstalleerde Ubuntu, open een terminal en krijg root-toegang:

sudo -i

Monteer uw root bestandssysteem (voor mij is het dat /dev/sda1):

mount /dev/sda1 /mnt

We hebben verbinding met internet nodig, dus kopieer resolv.conf van live Ubuntu naar je gemounte rootpartitie:

cp /etc/resolv.conf /mnt/etc/resolv.cof

Kopieer het script nu naar ergens op de gekoppelde partitie, bijvoorbeeld:

cp /media/ubuntu/usb/restore-bin.sh /mnt/restore-bin.sh

of je kunt het downloaden met behulp van wget, etc. zoals:

wget https://git.io/v9fRm -O /mnt/restore-bin.sh

Monteer andere noodzakelijke paden:

mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc /proc /mnt/proc

En hier is het klein verschil: hoe kunnen we chroot naar een kapot systeem wanneer er geen is /bin map daar? Welke shell moeten we uitvoeren?

Dus maak een tijdelijke bin-map. bijvoorbeeld: named bintmp in je kapotte systeem root:

mkdir /mnt/bintmp

Bind dan de live /bin daarin:

mount --bind /bin /mnt/bintmp

Chroot in het systeem tijdens het instellen van de /bintmp/bash als uw login-shell:

chroot /mnt /bintmp/bash

Exporteer de /bintmp als jouw PATH omgevingsvariabele:

export PATH=/bintmp:$PATH

Geef het script de uitvoerbare bit:

chmod +x restore-bin.sh

Voer het script uit:

./restore-bin.sh

Wacht tot het zoeken is voltooid en beantwoord dan de vraag die we in de schermafbeelding zagen. Het begint het. Te herstellen /bin en we zijn bijna klaar.

Als het klaar is, gebruik je CTRL+D uitstappen chroot omgeving en ontkoppel de gekoppelde paden:

umount -R /mnt

Start het systeem opnieuw op.

De links binnen herstellen /bin

Nu bijna alle bestanden binnen /bin directory zijn terug, behalve ongeveer 5 symbolische links die worden beheerd door update-alternatives.

Voer in uw actieve systeem het volgende uit:

sudo update-alternatives --all

Het stelt je enkele vragen; je kunt gewoon op drukken ENTER om ze allemaal te accepteren.

En nu zijn we klaar.


176
2018-04-19 15:02



Dit is zonder twijfel het beste antwoord dat ik heb gezien op Ask Ubuntu. Het is buitengewoon aardig van je om zoveel werk te doen, wetende dat het OP zich in een ongemakkelijke situatie bevindt. - Nonny Moose
Oh wacht, dr. Ik had moeten beseffen dat je dat deed. - Nonny Moose
Dit is geweldig. Ik hou ervan hoe SE-ontwerp geen enkele aanwijzing geeft dat dit een zelf-beantwoordde vraag is. - Pedro A
@Hamsteriffic doet het: zie de rechthoek met de naam van de beantwoorder (handtekening): het heeft een donkerdere achtergrond, die de berichten niet door het OP niet doen. Dit geldt voor opmerkingen, antwoorden en vragen. - Ruslan


Als uw huidige systeem nog steeds een draaiende shell en internettoegang heeft, kan dit worden gedaan met tools die elders op het systeem bestaan. Ik neem aan dat je alleen bent verwijderd /bin. /bin heeft natuurlijk het handigste nut dat je zou kunnen gebruiken in een dergelijke situatie (busybox), maar zonder dat, zullen we een beetje creatief moeten zijn.


Omdat je al een draaiende shell hebt en sindsdien sudo is in /usr/bin, laten we een draaiende wortelschelp krijgen voordat we verdere schade aanrichten. Maar /bin/bash en de meeste andere shells zijn weg! Gelukkig heeft Linux nog steeds een in-memory kopie van de shell die je gebruikt. Zo:

sudo /proc/$$/exe

Strikt genomen hebben we voor veel van wat volgt geen root-shell nodig. Maar in ieder geval.

Nu, dpkg werkt nog steeds, althans voor het vinden van welke pakketten bestanden bevatten /bin:

dpkg -S /bin

We kunnen gebruiken awk om het te verwerken en de pakketnamen te krijgen, en xargs en apt-get om de pakketten te downloaden (allemaal in /usr/bin). Als u een tijdelijke map hebt die u kunt gebruiken, cd daar, omdat je huidige directory een beetje rommelig wordt:

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

Het grootste probleem dat we hebben, is dat /bin/tar ontbreekt en zonder, dpkg kan de archieven niet uitpakken. We kunnen tweederde van de weg er naartoe krijgen, omdat:

  1. .deb bestanden zijn eigenlijk ar archieven (opnieuw in /usr/bin):

    ar x tar_*.deb
    
  2. Bestaande uit twee .tar.* archieven, data en control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Terwijl de gzip-hulpprogramma's zich bevinden /bin, unxz is in /usr/bin:

    unxz data.tar.xz
    

Nu hebben we een data.tar bestand zonder tar extraheren tar ervan.

Python om te redden! Dit is waar sudo is echt nodig:

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

Nu we kunnen gebruiken dpkg om de resterende deb-bestanden te extraheren om een ​​redelijk compleet te krijgen /bin:

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

We moeten echter nog steeds een goede installatie van de deb-bestanden uitvoeren, zodat symlinks enz. Die door pakketten worden gemaakt, opnieuw worden gemaakt:

sudo apt install --reinstall ./*.deb

Of:

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

Opmerkingen:

  1. We kunnen Python 2 niet gebruiken om de. Rechtstreeks uit te pakken data.tar.xz bestand, aangezien Python 2 alleen gzip- en bzip2-compressie ondersteunt. Python 3 ondersteunt het echter wel, dus je kunt Python 3 direct zonder gebruiken unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. Na terug te zijn /bin/tar, u moet nog enkele van de deb-bestanden extraheren voordat u deze kunt gebruiken apt-get: de shells, coreutils, etc. Gemakkelijker om ze gewoon allemaal uit te pakken en later opnieuw te installeren.

26
2018-04-19 15:49



Ik heb het niet getest, maar ik heb het bijna helemaal gelezen, het was geweldig, eigenlijk probeerde ik een kopie van bash in het geheugen te vinden, ik zocht een beetje, ik vond niets interessants en nadat ik zag dat teer is niet in /usr/bin, Ik zei wat ik met chroot ga ... Geweldig. - Ravexina
Een vraag is dat niet /proc/$$/exe een link naar /bin/bash? hoe werkt het wanneer /bin is verwijderd? (Het werkt, maar hoe), ik dacht dat het een verbroken link zou moeten zijn ... daarom heb ik dit Idee achtergelaten. - Ravexina
@Ravexina heeft geen volledig antwoord gekregen, maar: Hoe verschilt de / proc / <pid> / exe-symlink van gewone symlinks? - muru
PATH = / usr / lib / klibc / bin: $ PATH zal cat and sh terug op je pad zetten - Joshua
@ Joshua En elk van hen statisch gekoppeld! Leuk! - muru


Je zou kunnen tijdelijk plaats bestanden van een live CD of een ander systeem in uw /bin om je systeem bruikbaar te maken, vervang je ze met bestanden van je Ubuntu-installatie door te draaien apt-get install --reinstall voor pakketten met spullen erin /bin.


7
2018-04-20 11:21



Dit is wat ik zou doen. De live-dvd met hetzelfde versienummer zal bijna hetzelfde zijn als niet exact hetzelfde als de huidige versie. Als ik een CD of een USB Live-versie had, zou ik ze kunnen vergelijken en een antwoord zoals het jouwe kunnen posten. Deze thread is meer een theorie als OP nooit is verwijderd / bin in de eerste plaats wat een mogelijkheid is omdat hij het antwoord op hetzelfde moment schreef als de vraag naar alle waarschijnlijkheid. Nog steeds een erg leuk gedachte-experiment en een uitstekende schrijfstijl. - WinEunuuchs2Unix
Ik raad het aan Bewerk dit antwoord om het uit te breiden met specifieke details over hoe dit te doen. (Zie ook Hoe schrijf ik een goed antwoord? voor algemeen advies over welke soorten antwoorden het meest waardevol worden geacht op AskUbuntu.) - David Foerster


Enkele toevoegingen aan dit uitstekende antwoord, nadat ik dit probleem tegenkwam (samen met verwijderen /boot, /etc, /lib en /lib64):

  • chroot vereist /lib en /lib64 aanwezig zijn; anders krijg je de volgende foutmelding:
    failed to run command ‘/bin/bash’: No such file or directory
    Ik heb deze gekopieerd van het LiveCD OS en heb geen problemen gehad met het herstellen. YMMV, afhankelijk van de pakketten die u op het systeem hebt geïnstalleerd
  • Ik kan het antwoord waarnaar hierboven wordt verwezen niet bewerken, maar er is een typfout:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    zou moeten zijn
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /boot kan eenvoudig worden hersteld met GRUG-tools. Zien hier.
  • Als dit antwoord beveelt apt install --reinstall <package> is een geweldige manier om ontbrekende bestanden te herstellen /bin, /lib en /lib64.
    • Sommige pakketten die opnieuw moeten worden geïnstalleerd: libaio1, mysql-server, openvpn, vsftpd

Notitie voor mezelf:
rm -rf folder /* is niet hetzelfde als rm -rf folder/*


0
2017-07-05 14:29