Setelah tidak sengaja mengganti nama / usr, bagaimana cara saya mengganti nama kembali?

62

Saya tidak sengaja mengganti nama direktori /usrmenjadi /usr_bak.

Saya ingin mengubahnya kembali, jadi saya menambahkan path /usr_bak/binuntuk $PATHuntuk memungkinkan sistem untuk menemukan perintah sudo.

Tapi sekarang sudo mv /usr_bak /usrberi saya kesalahan:

sudo: error while loading shared libraries: libsudo_util.so.0: cannot open shared object file: No such file or directory

Apakah ada cara untuk mengubah nama /usr_baksebagai /usrselain menginstal ulang sistem?

Yves
sumber
2
OS apa ini? Saya bertanya-tanya bagaimana sudobahkan sampai ke tahap perpustakaan, biasanya dalam /usr/bin/dan seharusnya gagal dengan kesalahan perintah-tidak-ditemukan. Juga, apakah Anda memiliki set kata sandi root?
muru
3
@muru Ini Ubuntu. Anda benar, saya memang mendapatkan kesalahan not foundsebelumnya, jadi saya menambahkan jalur baru /usr_bak/binke $PATHdan sekarang saya mendapatkan kesalahan dalam posting saya di sini ...
Yves
2
@ user1717828 rumit. Saya harus mengkompilasi proyek, yang dikembangkan di Ubuntu 16.04, di Ubuntu 17.10. Jadi saya berpikir jika saya cukup menyalin /usrUbuntu 16.04 untuk menimpa /usrUbuntu 17.10 ...
Yves
6
Sudahkah Anda mempertimbangkan untuk menggunakan VM untuk mengkompilasi proyek alih-alih perubahan drastis seperti itu?
Kevin
3
Anda dapat menjalankan kotak virtual dalam mode tanpa kepala . Mungkin paling mudah untuk mengatur tamu di komputer lain, atau mendapatkan yang sudah dikonfigurasi.
Kevin

Jawaban:

109

Karena Anda telah menetapkan kata sandi untuk root, gunakan sudan busybox, instal secara default di Ubuntu. Semua superpustakaan yang diperlukan ada di /lib. Busybox adalah kumpulan utilitas yang terhubung secara statis, sehingga perpustakaan yang hilang seharusnya tidak menjadi masalah. Melakukan:

su -c '/bin/busybox mv /usr_bak /usr'

(Sementara Busybox sendiri juga memiliki suapplet, /bin/busyboxbinernya tidak setuid dan tidak berfungsi kecuali dijalankan sebagai root.)

Jika Anda tidak memiliki kata sandi root, Anda mungkin bisa menggunakan solusi Gilles di sini menggunakanLD_LIBRARY_PATH , atau (Gilles mengatakan ini tidak akan bekerja dengan setuid binari seperti sudo) reboot dan edit menu GRUB untuk boot dengan init=/bin/busyboxsebagai parameter kernel dan pindah folder kembali.

muru
sumber
73
Sekarang, jangan sengaja mengganti nama /lib.
sleblanc
5
LD_LIBRARY_PATHtidak akan membantu menjalankan sudo karena sudosetuid. Jika perpustakaannya tidak di tempat yang tepat, sudo tidak akan berfungsi sampai root memperbaikinya.
Gilles 'SANGAT berhenti menjadi jahat'
3
@Yves catatan historis: rasa lama Unix (yang jauh lebih tua dari Linux) termasuk koleksi kecil binari yang terhubung secara statis /sbinuntuk skenario seperti itu: "Saya melakukan beberapa kegiatan di mana perpustakaan runtime akan disulap sekitar tetapi perlu masih memanipulasi file. " Pada dasarnya pendekatan yang sama sebelum Busybox ditemukan. (Jumlah perintah yang tersedia dengan cara ini sangat terbatas, karena binari yang terhubung secara statis melahap ruang disk.)
Ti Strga
8
@Yves jika Anda mengganti nama /lib, maka Anda mungkin harus reboot keinit=/bin/busybox
muru
3
@Yves: Boot dari stik USB, dengan distro langsung yang dapat me-mount sistem file Anda, dan Anda siap untuk memperbaiki apa pun. Bahkan mengunduh file pengganti dari mirror paket jika Anda menghapus sesuatu.
Peter Cordes
33

Selain jawaban muru :

  • Anda bisa menggunakan kunci USB boot penyelamatan untuk memperbaiki sistem Anda; mis. jika sistem Anda adalah Debian atau Ubuntu, boot kunci USB instalasi dalam mode penyelamatan, dan lakukan yang sesuai mountdan mvdan umount.

  • untuk dapat memperbaiki lebih mudah kesalahan tersebut, saya biasanya juga memasang shell statis dengan beberapa perintah builtin (terutama dengan beberapa cp, rm, mvbuiltin -seperti) seperti sash(itu dikemas dalam Debian & Ubuntu, dan juga tersedia sebagai sabuk-3.8. tar.gz dalam bentuk sumber) dan boot dengan init=/bin/sashditeruskan ke Grub.

PS: sashsedikit buggy, dan tidak sepenuhnya memenuhi persyaratan Posix, tapi masih sangat berguna.

Basile Starynkevitch
sumber
Bisakah Anda jelaskan bagaimana cara memasang shell statis dengan beberapa perintah builtin? Apakah ada manual?
Yves
1
Pada Debian atau Ubuntu: apt-get install sash. Tetapi Anda juga bisa mengunduh sash-3.8.tar.gz dan mengompilasinya.
Basile Starynkevitch
Saya menyimpan liveiso di hdd dengan entri grub khusus untuk masalah seperti ini. Tidak perlu rumit, cukup boot live os dan memanipulasi file dengan bebas :)
FreeSoftwareServers
3

Saya pikir cara terbaik yang paling aman adalah reboot menggunakan USB, CD atau DVD booted OS (Debian, Ubuntu, Suse, dll). Kemudian pasang drive yang berisi masalah dan lakukan penggantian nama.

Lebih aman daripada mem-boot ke ladang ranjau dengan / usr atau / lib secara efektif hilang.

Larry
sumber
1
Anda dapat mem-boot ISO langsung dari Grub / HDD tidak perlu untuk USB / DVD dll. Trik grub yang sangat bagus memiliki loopback panggilan.
FreeSoftwareServers
0

Saya mengalami masalah yang sama di mana saya berganti nama /usr/binmenjadi /usr/bin_bkpuntuk beberapa tes dan kemudian saya tidak dapat mengubah nama (karena perintah tidak menemukan sudodalam direktori standar yang ada /usr/bin) dan kemudian saya pergi ke /usr/bin_bkpdirektori secara manual (menggunakan File manager ) dan sebagian besar fungsi (termasuk mengganti nama) pada klik kanan dinonaktifkan.

Kemudian saya mencoba perintah berikut dan itu memperbaiki masalah

$/usr/bin_bkp/sudo mv /usr/bin_bkp/ /usr/bin/

Saya memohon sudo dari jalur saat ini dan itu berhasil, sekarang semuanya kembali normal.

OS: Xubuntu 14.04

kutu buku
sumber
-3

Saya tidak dapat mencoba ini sekarang (dan saya tidak yakin saya mau), tetapi sepertinya itu harus bekerja untuk membuat diri Anda sendiri "/ usr" sebagai tautan keras (bukan tautan lunak) ke Anda " / usr_bak, lalu hapus "/ usr_bak"

ln /usr_bak /usr
rm /usr_bak

Tautan keras yang dibuat oleh "ln" ( tanpa argumen "-s") dalam sistem file harus membuat direktori usr dan usr_bak sama-sama tautan yang sah ke direktori yang dimaksud. "rm" hanya menghapus satu tautan yang Anda minta untuk dihapus, bukan keduanya. Karena masih ada tautan yang valid ke konten, mereka harus tetap dapat diakses melalui tautan yang tersisa di "/ usr".

TED
sumber
5
Saya mendapat kesan bahwa Linux (atau setidaknya Ubuntu) tidak mengizinkan tautan keras ke direktori. Misalnya, askubuntu.com/questions/210741/…
Chris Bouchard
4
@ Chris: Benar, Linux tidak mengizinkan hardlink direktori (selain .dan .., jadi penghitungan tautan pada direktori memberi tahu Anda jumlah subdirektori tingkat pertama). Juga, rmtidak berfungsi pada direktori, Anda harus menggunakannya rmdir. ( lndan rmbekerja pada symlink ke direktori, tetapi kita berbicara tentang direktori yang sebenarnya). Juga, ini tidak menyelesaikan masalah, karena roothanya membutuhkan seperti mv, karena izin menyala/ . Jika Anda bisa menjalankan ini, Anda bisa berlari mvseperti orang normal.
Peter Cordes
2
Hardlinks ke direktori tidak didukung pada sebagian besar (semua?) Unix karena terlalu sulit untuk perangkat lunak melakukan perayapan sistem file rekursif untuk mendeteksi loop tak terbatas. Mungkin saja jika perangkat lunak melacak semua inode yang dikunjungi dan merayapi sistem file yang sadar inode (yaitu bukan FAT32 / NTFS), tetapi memeriksa tautan simbolis dan tidak melintasi mereka jauh lebih mudah. Yang diperlukan hanyalah panggilan cepat ke lstat (2) untuk memeriksa jenis file.
penguin359
2
@Pryftan, saya ln(1)di Debian mengatakan ini untuk opsi -d/ -F/ --directory: "izinkan superuser untuk mencoba direktori hard link (catatan: mungkin akan gagal karena pembatasan sistem, bahkan untuk superuser)" . Jadi Anda bebas untuk mencoba, tetapi sistem file Anda mungkin tidak akan membiarkan Anda.
Toby Speight
1
@TobySpeight Pikiran lain: lihat juga symlink (7) yang mengatakan: Hard link mungkin tidak merujuk ke direktori (untuk mencegah kemungkinan loop dalam pohon sistem file, yang akan membingungkan banyak program) dan mungkin tidak merujuk ke file pada sistem file yang berbeda (karena nomor inode tidak unik di seluruh sistem file). Ini membuat saya berpikir bahwa upaya tautan keras sebenarnya bisa menjadi cara kata-kata sesuatu yang lain terjadi yaitu bahwa fungsi dipanggil tetapi gagal persis karena itu adalah direktori. (Referensi filesystem adalah apa yang saya pikirkan dalam komentar lain)
Pryftan