Dihapus / bin secara tidak sengaja. Bagaimana cara mengembalikannya?

91

Saya sedang mengerjakan direktori bernama bin. Setelah saya selesai, karena kepemilikan bindan beberapa file di dalamnya saya tidak sengaja berlari:

sudo rm -r /bin

Dari pada:

sudo rm -r bin

Sepertinya tangan saya digunakan untuk menambahkan /di depan semua yang saya ketik.

Bagaimana saya bisa mengembalikan /bindirektori saya ?

Saya ingin file yang sama milik Ubuntu saya, saya tidak suka menyalin dan menempelkannya dari live disk atau sistem lain yang sedang berjalan.

Ravexina
sumber
3
Bukankah /bindi Ubuntu hanya symlink untuk /usr/binhari ini? Jadi yang perlu Anda lakukan adalah mengembalikan symlink?
Muzer
3
@Muzer Saya menjalankan 16.04, dan /binbukan tautan simbolis ke /usr/binsini, saya pikir itu akan bertentangan dengan FHS. juga jika kita memeriksa paket sepele seperti coreutilsdi zesty (sini) . kita bisa melihat banyak hal yang akan diinstal di /binsampingnya /usr/bin, tapi tetap saja itu bisa berupa tautan, saya tidak menyadarinya.
Ravexina
2
@Ravexina Arch Linux sudah symlink / bin ke / usr / bin
Dmitry Kudriavtsev
1
Saya berpikir bahwa orang-orang akan menyadari bahwa ini adalah situasi yang dibuat-buat, saya tidak benar-benar menghapus saya /bin, saya menganggap sesuatu yang dapat terjadi pada orang lain (Berdasarkan pertanyaan lain yang saya jawab), Kemudian saya menulis instruksi untuk membagikan pengetahuan saya dengan yang lain :), walaupun saya menghargai semua komentar, mereka juga membantu orang lain yang datang untuk membaca pertanyaan ini. Terima kasih semua;)
Ravexina
1
Saya memiliki kebiasaan setiap kali saya menggunakan perintah "rm -r", atau perintah lain yang dapat memiliki konsekuensi signifikan, saya mengetikkan perintah dan kemudian mengambil tangan saya dari keyboard selama sekitar 3 detik setidaknya sebelum memukul MEMASUKKAN. Itu memberi saya kesempatan untuk memeriksanya dan memastikan saya telah mengetik semuanya dengan benar dan saya tahu apa yang akan dilakukan apa yang saya rencanakan untuk dilakukan. Pada kesempatan yang jarang, selama jeda itu, saya memutuskan bahwa saya perlu menghapus perintah - tidak selalu karena itu perintah yang salah, tetapi kadang-kadang karena saya perlu melakukan verifikasi terlebih dahulu.
ajb

Jawaban:

180

Apa itu mungkin?

Nah, sebagian besar utilitas yang sepele dan penting diinstal /bin, dan sekarang Anda kehilangan akses ke semuanya. Faktanya, jika Anda reboot, sistem Anda tidak akan bisa boot-up lagi.

Bagaimanapun, kami akan memperbaiki masalah ini dan membuat /binisinya sedekat mungkin dengan tempatnya. Satu-satunya perbedaan adalah beberapa tautan simbolis yang akan kami perbaiki juga.


Bagaimana?

Pertama, kita harus chrootmasuk ke sistem rusak Anda, tetapi dengan perbedaan kecil ! Setelah itu kami akan mendapatkan daftar paket yang diinstal pada sistem Anda yang memiliki file yang diinstal dalam /bindirektori, maka kami hanya akan mengunduh paket yang diperlukan dan mengekstrak file yang diperlukan ke dalam /bin. Lalu kita akan selesai.

Sebagai contoh, setelah itu chroot, kita bisa mendapatkan daftar paket yang telah menginstal file /binmenggunakan:

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

Dan kita juga bisa menggunakan:

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

untuk mendaftarkan file yang diinstal oleh paket ini di /bin.

Kemudian kita cukup membuat daftar semua paket yang diperlukan untuk kita, lalu mengunduhnya dan mengekstraknya /bindengan sesuatu seperti:

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

Namun kita harus menggunakan skrip untuk memeriksa semua paket yang terinstal di sistem kita, karena melakukannya secara manual hanyalah kegilaan.

Jadi saya menulis naskah yang melakukan semua yang kita butuhkan. Ia menemukan semua paket yang diperlukan untuk kami pulihkan /bin, menunjukkan kepada kami nama setiap paket dan file terkait miliknya /bin. Ini screenshotnya:

Cuplikan layar dari daftar paket <code> / bin </code> sebagai hasil dari skrip saya

Pada akhirnya kami memilih untuk menginstal ulang semua paket atau hanya mengunduh dan mengekstrak file yang diperlukan /bin(yang merupakan opsi yang disarankan):

Cuplikan layar opsi yang diberikan oleh skrip saya

Anda dapat mengambil salinan skrip ini atau mengunduhnya secara langsung .


Ayo mulai

chroot

Boot sistem Anda dengan live disk yang arsitekturnya sama dengan Ubuntu yang Anda instal, buka terminal dan dapatkan akses root:

sudo -i

Pasang rootsistem file Anda (bagi saya itu /dev/sda1):

mount /dev/sda1 /mnt

Kami akan membutuhkan konektivitas ke Internet, jadi salin resolv.confdari Ubuntu langsung ke partisi root yang Anda pasang:

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

Sekarang salin skrip ke suatu tempat di partisi yang terpasang, misalnya:

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

atau Anda dapat mengunduhnya menggunakan wget, dll. seperti:

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

Pasang jalur lain yang diperlukan:

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

Dan inilah perbedaan kecilnya : bagaimana kita chrootmenuju sistem yang rusak ketika tidak ada /bindirektori di sana? Cangkang mana yang harus kita jalankan?

Jadi buat direktori bin sementara. misalnya: dinamai bintmpdalam root sistem Anda yang rusak:

mkdir /mnt/bintmp

Kemudian ikat langsung /binke dalamnya:

mount --bind /bin /mnt/bintmp

Chroot masuk ke sistem sambil mengatur /bintmp/bashshell login Anda:

chroot /mnt /bintmp/bash

Ekspor /bintmpsebagai PATHvariabel lingkungan Anda :

export PATH=/bintmp:$PATH

Berikan script bit yang dapat dieksekusi:

chmod +x restore-bin.sh

Jalankan skrip:

./restore-bin.sh

Tunggu pencarian selesai kemudian jawab pertanyaan yang kami lihat di tangkapan layar. Ini akan mulai mengembalikan /bindan kita hampir selesai.

Setelah selesai, gunakan CTRL+ Duntuk keluar dari chrootlingkungan dan lepaskan jalur yang dipasang:

umount -R /mnt

Mulai ulang sistem.

Memulihkan tautan di dalamnya /bin

Sekarang hampir semua file dalam /bindirektori sudah kembali, kecuali sekitar 5 tautan simbolik yang dikelola oleh update-alternatives.

Di sistem Anda yang sedang berjalan, jalankan:

sudo update-alternatives --all

Ini menanyakan beberapa pertanyaan; Anda cukup menekan ENTERuntuk menerima semuanya.

Dan sekarang kita selesai.

Ravexina
sumber
30
Ini, tanpa diragukan lagi, jawaban terbaik yang pernah saya lihat di Ask Ubuntu. Sangat baik bagi Anda untuk pergi ke banyak pekerjaan mengetahui OP dalam situasi yang tidak nyaman.
Nonny Moose
15
Oh, tunggu, dr. Saya seharusnya menyadari bahwa Anda melakukan itu.
Nonny Moose
Ini luar biasa. Saya suka bagaimana desain SE tidak memberikan petunjuk sama sekali bahwa ini adalah pertanyaan yang dijawab sendiri.
Pedro A
5
@Hamster benar-benar terjadi: lihat kotak yang berisi nama (tanda tangan) penjawab: memiliki latar belakang yang lebih gelap, yang tulisannya bukan dari OP tidak. Ini berlaku untuk komentar, jawaban, dan pertanyaan.
Ruslan
27

Jika sistem Anda saat ini masih memiliki cangkang berjalan dan akses internet, ini dapat dilakukan dengan menggunakan alat yang ada di tempat lain pada sistem. Saya berasumsi Anda hanya dihapus /bin. /bintentu saja memiliki utilitas paling nyaman yang dapat Anda gunakan dalam situasi seperti itu (busybox), tetapi tanpa itu, kita harus sedikit kreatif.


Karena Anda sudah memiliki shell yang sedang berjalan, dan karena sudosudah dalam /usr/bin, mari kita ambil shell root yang sedang berjalan sebelum kita melakukan kerusakan lebih lanjut. Tetapi /bin/bashkebanyakan kerang lainnya hilang! Untungnya, Linux masih memiliki salinan dalam memori dari shell yang Anda gunakan. Begitu:

sudo /proc/$$/exe

Sebenarnya kita tidak perlu shell root untuk banyak hal berikut. Tapi bagaimanapun juga.

Sekarang, dpkgmasih berfungsi, setidaknya untuk menemukan paket mana yang memiliki file di /bin:

dpkg -S /bin

Kita dapat menggunakannya awkuntuk memprosesnya dan mendapatkan nama-nama paket, xargsdan apt-getuntuk mengunduh paket-paket (semuanya masuk /usr/bin). Jika Anda memiliki direktori sementara yang dapat Anda gunakan, di cdsana, karena direktori Anda saat ini akan sedikit berantakan:

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

Sekarang, masalah terbesar yang kita miliki adalah yang /bin/tarhilang, dan tanpanya, dpkgtidak dapat mengekstrak arsip. Kita bisa mendapatkan dua pertiga perjalanan ke sana, karena:

  1. .debfile sebenarnya ararsip (lagi dalam /usr/bin):

    ar x tar_*.deb
    
  2. Terdiri dari dua .tar.*arsip, datadan control:

    $ echo *.tar.*
    control.tar.gz data.tar.xz
    
  3. Sementara utilitas gzip ada di /bin, unxzada di /usr/bin:

    unxz data.tar.xz
    

Sekarang kita punya data.tarfile tanpa tarmengekstraknya tar.

Python untuk menyelamatkan ! Di sinilah sudosangat dibutuhkan:

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

Sekarang kita dapat menggunakan dpkguntuk mengekstrak file deb yang tersisa untuk mendapatkan yang cukup lengkap /bin:

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

Namun, kita masih harus melakukan instalasi yang tepat dari file deb, sehingga symlinks dll. Yang akan dibuat oleh paket dibuat kembali:

sudo apt install --reinstall ./*.deb

Atau:

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

Catatan:

  1. Kami tidak dapat menggunakan Python 2 untuk mengekstrak data.tar.xzfile secara langsung , karena Python 2 hanya mendukung kompresi gzip dan bzip2. Python 3, bagaimanapun, mendukungnya, sehingga Anda dapat menggunakan Python 3 secara langsung tanpa unxz:

    sudo python3 -c 'import tarfile; tarfile.open("data.tar.xz").extractall("/")'
    
  2. Setelah kembali /bin/tar, Anda masih perlu mengekstrak beberapa file deb sebelum dapat digunakan apt-get: shell, coreutils, dll. Lebih mudah untuk mengekstrak semuanya dan menginstal ulang nanti.
muru
sumber
Saya tidak mengujinya, Tapi saya hampir membacanya sepenuhnya, itu mengagumkan, sebenarnya saya mencoba untuk menemukan salinan bash di memori, saya mencari sedikit, saya tidak menemukan sesuatu yang menarik dan setelah saya melihat bahwa tar adalah tidak di /usr/bin, saya mengatakan apa pun yang saya lakukan dengan chroot ... Keren.
Ravexina
1
Sebuah pertanyaan, bukankah /proc/$$/exetautannya /bin/bash? bagaimana cara kerjanya saat /bindihapus? (Ini berhasil, tapi bagaimana), saya pikir itu harus menjadi tautan yang rusak ... itu sebabnya saya meninggalkan Ide ini di belakang.
Ravexina
3
@Ravexina tidak mendapatkan jawaban yang lengkap, tetapi: Bagaimana perbedaan symlink / proc / <pid> / exe dari symlink biasa?
muru
1
PATH = / usr / lib / klibc / bin: $ PATH akan mengembalikan kucing Anda ke jalur Anda
Joshua
@ Yosua Dan semuanya terhubung secara statis! Bagus!
muru
7

Anda dapat menempatkan sementara file dari live CD atau sistem lain ke dalam Anda /binuntuk membuat sistem Anda dapat digunakan, kemudian menggantinya dengan file dari instalasi Ubuntu Anda dengan menjalankan apt-get install --reinstalluntuk paket-paket yang berisi barang-barang /bin.

Dmitry Grigoryev
sumber
Inilah yang akan saya lakukan. DVD live menjadi nomor versi yang sama akan hampir sama jika tidak persis sama dengan yang diinstal saat ini. Jika saya memiliki disk atau versi USB Live, saya dapat membandingkannya dan mengirim jawaban seperti milik Anda. Utas ini lebih merupakan teori jika OP tidak pernah menghapus / bin di tempat pertama yang merupakan kemungkinan ketika ia menulis jawabannya bersamaan dengan pertanyaan di semua kemungkinan. Eksperimen pemikiran masih sangat bagus dan gaya penulisan yang sangat baik.
WinEunuuchs2Unix
Saya sarankan untuk mengedit jawaban ini untuk memperluasnya dengan detail spesifik tentang bagaimana melakukan ini. (Lihat juga Bagaimana cara saya menulis jawaban yang baik? Untuk saran umum tentang jenis jawaban apa yang dianggap paling berharga di AskUbuntu.)
David Foerster
1

Beberapa penambahan jawaban ini sangat baik , setelah saya mengalami masalah ini (bersama dengan menghapus /boot, /etc, /libdan /lib64):

  • chrootmembutuhkan /libdan /lib64hadir; jika tidak, Anda akan mendapatkan kesalahan berikut:
    failed to run command ‘/bin/bash’: No such file or directory
    Saya menyalinnya dari LiveCD OS dan tidak mengalami masalah memulihkan. YMMV tergantung pada paket yang telah Anda instal pada sistem
  • Saya tidak dapat mengedit jawaban yang dirujuk di atas, tetapi ada salah ketik:
    cp /etc/resolv.conf /mnt/etc/resolv.cof
    seharusnya
    cp /etc/resolv.conf /mnt/etc/resolv.conf
  • /bootdapat dengan mudah dipulihkan menggunakan alat grub. Lihat di sini .
  • Seperti yang direkomendasikan oleh jawaban ini , apt install --reinstall <package>adalah cara terbaik untuk mengembalikan file yang hilang /bin, /libdan /lib64.
    • Beberapa paket yang diperlukan instalasi ulang: libaio1, mysql-server, openvpn,vsftpd

Catatan untuk diri sendiri:
rm -rf folder /*tidak sama denganrm -rf folder/*

mrtumnus
sumber