web-dev-qa-db-ja.com

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

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

Sudo rm -r /bin

の代わりに:

Sudo rm -r bin

私の手は、私が入力するすべてのものの前に/を追加するのに使用したようです。

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

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

91
Ravexina

出来ますか?

さて、ほとんどの些細で重要なユーティリティは/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に属する各パッケージの名前と関連ファイルが表示されます。これがスクリーンショットです:

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

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

Screenshot of options given by my script

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


始めましょう

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

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

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

mkdir /mnt/bintmp

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

mount --bind /bin /mnt/bintmp

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

chroot /mnt /bintmp/bash

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

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 それらすべてを受け入れます。

これで完了です。

180
Ravexina

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


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

Sudo /proc/$$/exe

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

少なくとも、/binにファイルがあるパッケージを見つけるために、dpkgは引き続き機能します。

dpkg -S /bin

awkを使用して処理し、パッケージ名を取得し、xargsapt-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ユーティリティは/binにありますが、unxz/usr/binにあります。

    unxz data.tar.xz
    

これでtarを抽出するtarなしのdata.tarファイルができました。

Pythonによる救助 !これは、Sudoが本当に必要な場所です。

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

Nowdpkgを使用して残りの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. Python 2はgzipおよびbzip2圧縮のみをサポートしているため、Python 2を使用してdata.tar.xzファイルを直接抽出することはできません。ただし、Python 3はサポートしているので、Python 3をunxzなしで直接使用できます。

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

一時的にライブCDまたは別のシステムのファイルを/binに入れてシステムを使用可能にし、パッケージのapt-get install --reinstallを実行してUbuntuインストールのファイルに置き換えます。 /binにデータがあります。

7

この問題に遭遇した後の この優れた答え への追加(/boot/etc/libおよび/lib64の削除とともに):

  • chrootには、/libおよび/lib64が必要です。そうしないと、次のエラーが表示されます。
    failed to run command ‘/bin/bash’: No such file or directory
    これらをLiveCD OSからコピーしましたが、復元に問題はありませんでした。システムにインストールしたパッケージに応じたYMMV
  • 上記の回答を編集することはできませんが、タイプミスがあります。
    cp /etc/resolv.conf /mnt/etc/resolv.cof

    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootは、grubツールを使用して簡単に復元できます。 here を参照してください。
  • この回答 が推奨しているように、apt install --reinstall <package>は、/bin/lib、および/lib64。の欠落ファイルを復元する優れた方法です。
    • 再インストールが必要なパッケージ:libaio1mysql-serveropenvpnvsftpd

自分の為にメモする:
rm -rf folder /*rm -rf folder/*と同じではありません

1
mrtumnus