誤って/ binを削除しました。どうすれば復元できますか?


91

という名前のディレクトリで作業していましたbin。終了した後、その所有権binとその中のいくつかのファイルのために、私は誤って実行しました:

sudo rm -r /bin

の代わりに:

sudo rm -r bin

私の手は/、私がタイプするすべてのものの前にを追加するのに使用されたようです。

/binディレクトリを復元するにはどうすればよいですか?

Ubuntuに属する同じファイルが必要です。ライブディスクまたは実行中の別のシステムからコピーして貼り付けるのは好きではありません。


3
/binUbuntu は/usr/bin最近の単なるシンボリックリンクではありませんか?シンボリックリンクを戻すだけでいいのですか?
ミューザー

3
@Muzer 16.04を実行/binしてい/usr/binますが、ここへのシンボリックリンクではありませんFHS。また、我々は次のように些細なパッケージを確認した場合coreutilsではzesty (ここ)。の/bin横に多くのものがインストールされるのを見る/usr/binことができますが、それでもリンクである可能性があります。
Ravexina

2
@RavexinaアーチのLinuxの/ usr / binにすでにシンボリックリンク/ binに
ドミトリーKudriavtsev

1
私は人々がそれが作り上げられた状況だと気づくと思った、私は実際に自分を削除しなかった、私は/bin他の誰かに起こる可能性があることを考えた(私が答えた別の質問に基づいて)、そして私は知識を共有するための指示を書いた他の人と:)、私はすべてのコメントに感謝しますが、この質問を読むために来た他の人々にも役立ちます。ありがとうございました;)
Ravexina

1
「rm -r」コマンド、または重要な結果をもたらす可能性のある他のコマンドを使用するときはいつでも、コマンドを入力し、少なくとも約3秒間キーボードから手を離す前に入る。それは私にそれを見直す機会を与え、すべてが正しく入力されていることを確認し、それが私が何をしようとしているのかを知っていることを確認します。まれに、その一時停止中に、コマンドを消去する必要があると判断します。これは常に間違ったコマンドであるためではなく、場合によっては最初に検証を行う必要があるためです。
ajb

回答:


180

出来ますか?

さて、ほとんどの些細で重要なユーティリティはにインストールされて/binおり、今ではそれらすべてにアクセスできなくなりました。実際、再起動すると、システムは起動できなくなります。

とにかく、私たちは問題を修正し、/binの内容を可能な限り近くするつもりです。唯一の違いは、修正するシンボリックリンクです。


どうやって?

まず、chroot壊れたシステムを調べますが、わずかな違いがあります!その後、/binディレクトリにインストールされたファイルがあるシステムのインストール済みパッケージのリストを取得し、必要なパッケージのみをダウンロードして、必要なファイルをに抽出します/bin。これで完了です。

たとえば、の後にchroot、次を/bin使用してファイルをインストールしたパッケージのリストを取得できます。

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

また、次のものも使用できます。

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

これらのパッケージによってインストールされたファイルを一覧表示するには/bin

次に、必要なすべてのパッケージのリストを作成し、それらをダウンロードして/bin、次のようなもので展開します。

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

ただし、スクリプトを使用して、システムにインストールされているすべてのパッケージを確認する必要があります。手動で行うのは単なる狂気です。

そこで、必要なすべてを実行するスクリプトを作成しました。それは私たちが復元するために必要なすべてのパッケージを見つけ/binて、各パッケージの名前とに属するそれらの関連ファイルを示します/bin。これがスクリーンショットです:

スクリプトによる出力としての<code> / bin </ code>パッケージリストのスクリーンショット

最後に、すべてのパッケージを再インストールするか、必要なファイルのみをダウンロードして抽出することを選択します/bin(推奨オプション)。

スクリプトで指定されたオプションのスクリーンショット

このスクリプトのコピーを取得する、直接ダウンロードできます


始めましょう

chroot

インストールしたUbuntuと同じアーキテクチャのライブディスクでシステムを起動し、ターミナルを開いてルートアクセスを取得します。

sudo -i

rootファイルシステムをマウントします(私にとっては/dev/sda1)。

mount /dev/sda1 /mnt

インターネットへの接続が必要になるためresolv.conf、ライブUbuntuからマウントされたルートパーティションにコピーします。

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

次に、スクリプトをマウントされたパーティションのどこかにコピーします。例:

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

またはwget、などを使用してダウンロードできます。

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

他の必要なパスをマウントします。

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

そしてここに小さな違いがあります:chrootそこに/binディレクトリがないときに壊れたシステムにどうやって行くことができますか?どのシェルを実行する必要がありますか?

そのため、一時的なbinディレクトリを作成します。例:bintmp壊れたシステムルート内で名前が付けられます:

mkdir /mnt/bintmp

次に、ライブ/binをそれにバインドします。

mount --bind /bin /mnt/bintmp

/bintmp/bashログインシェルとして設定しながら、システムにchrootします。

chroot /mnt /bintmp/bash

を環境変数/bintmpとしてエクスポートしPATHます。

export PATH=/bintmp:$PATH

スクリプトに実行可能ビットを与えます。

chmod +x restore-bin.sh

スクリプトを実行します。

./restore-bin.sh

検索が完了するのを待ってから、スクリーンショットで見た質問に答えてください。復元が開始され、/binほぼ完了です。

完了したら、CTRL+ Dを使用してchroot環境から抜け出し、マウントされたパスをアンマウントします。

umount -R /mnt

システムを再起動します。

内のリンクを復元する /bin

これで、/binディレクトリ内のほぼすべてのファイルが元に戻ります。ただし、で管理される約5つのシンボリックリンクは例外update-alternativesです。

実行中のシステムで、次を実行します。

sudo update-alternatives --all

いくつか質問があります。を押しENTERて、それらすべてを受け入れることができます。

これで完了です。


30
これは、疑いもなく、Ask Ubuntuで見た最高の答えです。OPが不便な状況にあることを知って多くの仕事に行くことは非常に親切です。
ノニームース

15
ああ待ってください。私はあなたがそれをやったことに気付いていたはずです。
ノニームース

これは素晴らしいです。SEの設計では、これが自己回答の質問であることをまったく示唆していないのが大好きです。
ペドロA

5
@Hamsterifficします:回答者の名前(署名)を含む長方形を参照してください:暗い背景がありますが、OPによる投稿ではありません。これは、コメント、回答、質問に適用されます。
ルスラン

27

現在のシステムにまだ実行中のシェルとインターネットアクセスがある場合、システム上の他の場所にあるツールを使用してこれを実行できます。あなたが削除しただけだと思っています/bin/binもちろん、そのような状況で使用できる最も便利なユーティリティ(busybox)がありますが、それがなければ、少し創造性を得る必要があります。


すでに実行中のシェルがあり、sudoがにある/usr/binので、さらに損害を与える前に実行中のルートシェルを取得しましょう。しかし/bin/bash、他のほとんどのシェルはなくなりました!幸いなことに、Linuxにはまだ使用しているシェルのメモリ内コピーがあります。そう:

sudo /proc/$$/exe

厳密に言えば、これ以降の多くの作業にルートシェルは必要ありません。とにかく。

dpkg少なくともどのパッケージにファイルがあるかを見つけるために、今でも動作します/bin

dpkg -S /bin

我々は使用することができawk、それを処理するために、パッケージ名を取得し、xargsそしてapt-getパッケージ(すべてでダウンロードします/usr/bin)。使用できる一時ディレクトリがある場合はcd、現在のディレクトリが少し乱雑になるため、そこに使用できます。

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

さて、私たちが抱えている最大の問題/bin/tarは欠落していることであり、それなしでdpkgはアーカイブを抽出できません。次の理由から、そこの3分の2を取得できます。

  1. .debファイルは実際にはarアーカイブです(もう一度/usr/bin):

    ar x tar_*.deb
    
  2. 2つの.tar.*アーカイブで構成され、dataかつcontrol

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. gzipユーティリティはにありますが/binunxzはにあり/usr/binます:

    unxz data.tar.xz
    

これで、data.tarファイルtarを抽出する必要がなくなりtarました。

Pythonが助けて!これはsudo本当に必要な場所です:

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

これdpkg、残りのdebファイルを抽出して適度に完成させることができます/bin

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

ただし、パッケージによって作成されるシンボリックリンクなどが再作成されるように、debファイルを適切にインストールする必要があります。

sudo apt install --reinstall ./*.deb

または:

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

ノート:

  1. data.tar.xzPython 2はgzipおよびbzip2圧縮のみをサポートしているため、Python 2を使用してファイルを直接抽出することはできません。ただし、Python 3はこれをサポートしているため、Python 3を直接使用せずに使用できますunxz

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. 戻った後/bin/tar、使用する前にいくつかのdebファイルを抽出する必要がありますapt-get。シェル、coreutilsなど。すべてを抽出して後で再インストールする方が簡単です。

私はそれをテストしませんでしたが、私はそれをほぼ完全に読みました、それはすごかったです、実際にメモリ内のbashのコピーを見つけようとしましたではなく/usr/bin、私はchrootで行くものは何でも言った...素晴らしい。
ラヴェクシーナ

1
質問、/proc/$$/exeへのリンクではありません/bin/bashか?/bin削除されたときにどのように機能しますか?(それは機能していますが、どのように)、私はそれが壊れたリンクであるべきだと思いました...それが私がこのアイデアを残した理由です。
-Ravexina


1
PATH = / usr / lib / klibc / bin:$ PATHはcatとshをパスに戻します
ジョシュア

@Joshuaそして、それらのすべてが静的にリンクされています!いいね!
ムル

7

あなたは可能性があり、一時的にお使いにライブCDまたは他のシステムからファイルを入れ/bin、次に実行して、Ubuntuのインストールからファイルに置き換える、お使いのシステムを使用可能にすることapt-get install --reinstallで何かを持っているパッケージ/bin


これは私がすることです。同じバージョン番号のライブDVDは、現在インストールされているものと正確に同じではないにしても、ほとんど同じです。ディスクまたはUSB Liveバージョンがあれば、それらを比較して、あなたのような回答を投稿できます。OPがそもそも/ binを削除したことがない場合、このスレッドはより理論的です。これは、おそらく質問と同じ時間に回答を書いた可能性があります。それでも非常に素晴らしい思考実験と優れた執筆スタイル。
WinEunuuchs2Unix

この回答を編集して、これを行う方法に関する具体的な詳細を追加することをお勧めします。(AskUbuntuでどのような回答が最も価値があると考えられるについての一般的なアドバイスについては、「良い回答を書くにはどうすればよいですか?」も参照してください。)
David Foerster

1

いくつかの追加この優れた答え(削除と一緒に、私はこの問題に遭遇した後/boot/etc/libおよび/lib64):

  • chroot存在する必要が/libあり/lib64ます。そうしないと、次のエラーが表示
    failed to run command ‘/bin/bash’: No such file or directory
    されます。LiveCDOSからこれらをコピーしましたが、復元に問題はありませんでした。システムにインストールしたパッケージに応じたYMMV
  • 上記の回答を編集することはできませんが、タイプミスがあり
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    ます:
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootGRUBツールを使用して簡単に復元できます。こちらをご覧ください
  • この答えは推奨しています、apt install --reinstall <package>中に不足しているファイルを復元するための素晴らしい方法である/bin/lib/lib64
    • 再インストールを必要といくつかのパッケージ:libaio1mysql-serveropenvpnvsftpd

自己への注意:
rm -rf folder /*とは異なりますrm -rf folder/*

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.