bin
という名前のディレクトリで作業していました。終了後、bin
とその中のいくつかのファイルの所有権があるため、誤って実行しました。
Sudo rm -r /bin
の代わりに:
Sudo rm -r bin
私の手は、私が入力するすべてのものの前に/
を追加するのに使用したようです。
/bin
ディレクトリを復元するにはどうすればよいですか?
buntuに属する同じファイルが必要です。ライブディスクまたは実行中の別のシステムからコピーして貼り付けるのは嫌です。
さて、ほとんどの些細で重要なユーティリティは/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
に属する各パッケージの名前と関連ファイルが表示されます。これがスクリーンショットです:
最後に、すべてのパッケージを再インストールするか、必要なファイルのみをダウンロードして/bin
(推奨オプション)に抽出するかを選択します。
このスクリプトのコピー または 直接ダウンロード を取得できます。
インストールされた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
/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 それらすべてを受け入れます。
これで完了です。
現在のシステムにまだ実行中のシェルとインターネットアクセスがある場合、これはシステム上の他の場所にあるツールを使用して実行できます。 /bin
のみを削除したと仮定しています。もちろん、/bin
には、このような状況で使用できる最も便利なユーティリティ(busybox)がありますが、それがなければ、少し創造力が必要になります。
既に実行中のシェルがあり、Sudo
が/usr/bin
にあるため、さらに損傷を与える前に、実行中のルートシェルを取得しましょう。しかし、/bin/bash
および他のほとんどのシェルはなくなりました!幸いなことに、Linuxにはまだ使用しているシェルのメモリ内コピーがあります。そう:
Sudo /proc/$$/exe
厳密に言えば、以降の多くの作業にルートシェルは必要ありません。とにかく。
少なくとも、/bin
にファイルがあるパッケージを見つけるために、dpkg
は引き続き機能します。
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を取得できます。
.deb
ファイルは、実際にはar
アーカイブです(再び/usr/bin
で):
ar x tar_*.deb
2つの.tar.*
アーカイブ、data
およびcontrol
で構成されます:
$ echo *.tar.*
control.tar.gz data.tar.xz
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
ノート:
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("/")'
/bin/tar
を取得した後でも、apt-get
を使用する前にいくつかのdebファイルを抽出する必要があります。シェル、coreutilsなど。すべてを抽出して後で再インストールする方が簡単です。一時的にライブCDまたは別のシステムのファイルを/bin
に入れてシステムを使用可能にし、パッケージのapt-get install --reinstall
を実行してUbuntuインストールのファイルに置き換えます。 /bin
にデータがあります。
この問題に遭遇した後の この優れた答え への追加(/boot
、/etc
、/lib
および/lib64
の削除とともに):
chroot
には、/lib
および/lib64
が必要です。そうしないと、次のエラーが表示されます。failed to run command ‘/bin/bash’: No such file or directory
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
。の欠落ファイルを復元する優れた方法です。libaio1
、mysql-server
、openvpn
、vsftpd
自分の為にメモする:rm -rf folder /*
はrm -rf folder/*
と同じではありません