97 votes

Suppression accidentelle de /bin. Comment puis-je le restaurer ?

Je travaillais sur un répertoire nommé bin . Après que j'ai eu fini, à cause de la propriété de bin et quelques fichiers dedans que j'ai accidentellement exécutés :

sudo rm -r /bin

Au lieu de :

sudo rm -r bin

Il semble que mes mains avaient l'habitude d'ajouter un / devant tout ce que je tape.

Comment puis-je restaurer mon /bin répertoire ?

Je veux les mêmes fichiers que ceux qui appartiennent à mon Ubuntu, je n'aime pas les copier-coller depuis un disque dur ou un autre système en fonctionnement.

188voto

Ravexina Points 50599

Est-ce possible ?

Bien, la plupart des utilitaires triviaux et importants sont installés dans /bin et maintenant vous avez perdu l'accès à tous. En fait, si vous redémarrez, votre système ne sera plus capable de démarrer.

Quoi qu'il en soit, nous allons résoudre le problème et faire en sorte que /bin Le contenu du site est aussi proche que possible de ce qu'il était. La seule différence serait certains liens symboliques que nous allons également corriger.


Comment ?

Premièrement, nous devons chroot dans votre système brisé, mais avec une petite différence ! Après cela, nous obtiendrons une liste des paquets installés sur votre système qui ont un fichier installé dans le dossier de l'utilisateur. /bin puis nous allons seulement télécharger les paquets nécessaires et extraire les fichiers nécessaires dans le répertoire /bin . Ensuite, nous aurons terminé.

Par exemple, après chroot nous pouvons obtenir une liste des paquets qui ont installé des fichiers dans le dossier de l'utilisateur. /bin en utilisant :

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

Et nous pouvons aussi utiliser :

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

pour lister les fichiers installés par ces paquets dans /bin .

Ensuite, nous créons simplement une liste de tous les paquets qui nous sont nécessaires, puis nous les téléchargeons et les extrayons dans le répertoire de l'entreprise. /bin avec quelque chose comme :

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

Cependant, nous devons utiliser un script pour vérifier tous les paquets installés sur notre système, car le faire manuellement est juste une folie.

J'ai donc écrit un script qui fait tout ce dont nous avons besoin. Il trouve tous les paquets nécessaires pour que nous puissions restaurer /bin nous montre le nom de chaque paquet et de leurs fichiers associés qui appartiennent à /bin . Voici une capture d'écran :

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

À la fin, nous choisissons de réinstaller tous les paquets ou de télécharger et d'extraire uniquement les fichiers nécessaires à l'installation. /bin (qui est l'option recommandée) :

Screenshot of options given by my script

Vous pouvez prendre une copie de ce script ou le télécharger directement .


Commençons

chroot

Démarrez votre système avec un disque vivant qui a la même architecture que votre Ubuntu installé, ouvrez un terminal et obtenez un accès root :

sudo -i

Montez votre root système de fichiers (pour moi, c'est /dev/sda1 ) :

mount /dev/sda1 /mnt

Nous aurons besoin d'une connexion à Internet, alors copiez resolv.conf de l'Ubuntu live sur votre partition racine montée :

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

Maintenant, copiez le script quelque part sur la partition montée, par ex :

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

ou vous pouvez le télécharger en utilisant wget etc. comme :

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

Monter les autres chemins nécessaires :

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

Et voici le différence mineure comment pouvons-nous chroot à un système brisé quand il n'y a pas /bin là-dedans ? Quel Shell doit-on exécuter ?

Donc, créez un répertoire temporaire pour la poubelle, par exemple : nommé bintmp dans la racine de votre système brisé :

mkdir /mnt/bintmp

Puis lier le live /bin dans ce domaine :

mount --bind /bin /mnt/bintmp

Chroot dans le système tout en définissant le /bintmp/bash comme votre login Shell :

chroot /mnt /bintmp/bash

Exporter le /bintmp comme votre PATH variable d'environnement :

export PATH=/bintmp:$PATH

Donnez au script le bit exécutable :

chmod +x restore-bin.sh

Exécutez le script :

./restore-bin.sh

Attendez que la recherche soit terminée puis répondez à la question que nous avons vue dans la capture d'écran. Il commencera à restaurer le /bin et nous avons presque terminé.

Une fois que c'est fait, utilisez CTRL + D pour sortir de chroot et démonter les chemins montés :

umount -R /mnt

Redémarrez le système.

Restaurer les liens dans /bin

Maintenant, presque tous les fichiers dans /bin sont de retour, sauf environ 5 liens symboliques qui sont gérés par update-alternatives .

Dans votre système de fonctionnement, exécutez :

sudo update-alternatives --all

Il vous pose quelques questions ; vous pouvez simplement appuyer sur ENTER de les accepter tous.

Et maintenant, nous avons terminé.

30voto

muru Points 180007

Si votre système actuel dispose encore d'un Shell en cours d'exécution et d'un accès à Internet, cela peut être fait en utilisant des outils existant ailleurs sur le système. Je suppose que vous avez seulement supprimé /bin . /bin possède bien sûr l'utilitaire le plus pratique que vous puissiez utiliser dans une telle situation (busybox), mais sans cela, nous devrons faire preuve d'un peu de créativité.


Comme vous avez déjà un Shell en cours d'exécution, et comme sudo est en /usr/bin Si vous avez besoin de plus de temps, nous allons faire fonctionner une racine Shell avant de faire plus de dégâts. Mais /bin/bash et la plupart des autres coquillages sont partis ! Heureusement, Linux a toujours une copie en mémoire du Shell que vous utilisez. Donc :

sudo /proc/$$/exe

Strictement parlant, nous n'avons pas besoin d'une racine Shell pour la plupart de ce qui suit. Mais de toute façon.

Maintenant, dpkg fonctionne toujours, au moins pour trouver quels paquets ont des fichiers dans le répertoire /bin :

dpkg -S /bin

Nous pouvons utiliser awk pour le traiter et obtenir les noms des paquets, et xargs y apt-get pour télécharger les paquets (tous en /usr/bin ). Si vous disposez d'un répertoire temporaire que vous pouvez utiliser, cd là, parce que votre répertoire actuel va devenir un peu désordonné :

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

Maintenant, le plus gros problème que nous avons est que /bin/tar est manquante, et sans elle, dpkg ne peut pas extraire les archives. Nous pouvons arriver aux deux tiers du chemin, parce que :

  1. .deb sont en fait ar archives (toujours dans /usr/bin ) :

    ar x tar_*.deb
  2. Composé de deux .tar.* archives, data y control :

    $ echo *.tar.*
    control.tar.gz data.tar.xz
  3. Alors que les utilitaires gzip sont dans /bin , unxz est en /usr/bin :

    unxz data.tar.xz

Maintenant, nous avons un data.tar sans tar d'extraire tar d'elle.

Python à la rescousse ! C'est ici que sudo est vraiment nécessaire :

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

Maintenant nous pouvons utiliser dpkg d'extraire les fichiers deb restants pour obtenir une version raisonnablement complète /bin :

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

Cependant, nous devrions quand même faire une installation correcte des fichiers deb, afin que les liens symboliques etc. qui seraient créés par les paquets soient recréés :

sudo apt install --reinstall ./*.deb

Ou :

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

Notes :

  1. Nous ne pouvons pas utiliser Python 2 pour extraire directement l'adresse de l'utilisateur. data.tar.xz puisque Python 2 ne supporte que la compression gzip et bzip2. Python 3, en revanche, la prend en charge. Vous pouvez donc utiliser Python 3 directement sans unxz :

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
  2. Après être rentré /bin/tar vous devez encore extraire certains des fichiers deb avant de pouvoir utiliser apt-get : les shells, coreutils, etc. Il est plus facile de les extraire tous et de les réinstaller plus tard.

7voto

Dmitry Grigoryev Points 1769

Vous pourriez temporairement mettre les fichiers d'un CD live ou d'un autre système dans votre /bin pour rendre votre système utilisable, puis remplacez-les par des fichiers de votre installation Ubuntu en exécutant apt-get install --reinstall pour les paquets qui ont des choses dans /bin .

1voto

mrtumnus Points 280

Quelques ajouts à cette excellente réponse après avoir rencontré ce problème (ainsi que la suppression de l'adresse de l'entreprise). /boot , /etc , /lib y /lib64 ) :

  • chroot nécessite /lib y /lib64 doit être présent, sinon vous obtiendrez l'erreur suivante :
    failed to run command ‘/bin/bash’: No such file or directory
    Je les ai copiés à partir du LiveCD OS et je n'ai eu aucun problème pour les restaurer. Cela dépend des paquets que vous avez installés sur le système.
  • Je ne peux pas éditer la réponse référencée ci-dessus, mais il y a une coquille :
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    devrait être
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /boot peut facilement être restauré en utilisant les outils Grub. Voir aquí .
  • Comme cette réponse recommande, apt install --reinstall <package> est un excellent moyen de restaurer les fichiers manquants dans /bin , /lib y /lib64 .
    • Certains paquets ont dû être réinstallés : libaio1 , mysql-server , openvpn , vsftpd

Note à moi-même :
rm -rf folder /* n'est pas la même chose que rm -rf folder/*

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X