Bagaimana memulihkan dari chmod -R 000 / bin?

36

Dan sekarang saya tidak dapat chmod kembali .. atau menggunakan salah satu program sistem saya yang lain. Untungnya ini ada di VM yang saya mainkan, tetapi apakah ada cara untuk menyelesaikan ini? Sistemnya adalah Ubuntu Server 12.10.

Saya telah mencoba untuk memulai kembali ke mode pemulihan, sayangnya sekarang saya tidak dapat boot ke sistem sama sekali karena izin tidak memberikan beberapa program setelah ketersediaan init-bottom untuk menjalankan - sistem hanya hang. Inilah yang saya lihat:

Begin: Running /scripts/init-bottom ... done
[   37.062059] init: Failed to spawn friendly-recovery pre-start process: unable to execute: Permission denied
[   37.084744]  init: Failed to spawn friendly-recovery post-stop process: unable to execute: Permission denied
[   37.101333] init: plymouth main process (220) killed by ABRT signal

Setelah ini komputer hang.

jett
sumber
Apakah /binAnda chmoded atau file dalam /binatau keduanya?
Stéphane Chazelas
1
direktori / bin dengan opsi -R ... keduanya
jett
Ada baiknya menyimpan usb dengan tinycore di berguna. Berguna ketika hal seperti ini terjadi.
Saga

Jawaban:

28

Boot OS bersih lain, pasang sistem file dan perbaiki izin.

Karena sistem file yang rusak Anda tinggal di VM, Anda harus memiliki sistem host Anda tersedia dan berfungsi. Pasang sistem file Anda yang rusak di sana dan perbaiki.

Dalam kasus QEMU / KVM Anda dapat misalnya memasang sistem file menggunakan nbd .

michas
sumber
Saya pikir ini mungkin benar sebagai cara untuk memperbaikinya, namun, saya perlu mencoba untuk mendapatkan sistem yang terpasang - sekarang saya hanya mendapatkan presystem dari file gambar - seperti pada initrd.img memtest & abi.
Jett
1
@ jett, Anda memasang /bootpartisi VM itu. Coba dan temukan sistem file root. Jika pada LVM, jalankan vgchange -aysetelah menghubungkan nbduntuk mengaktifkannya.
Stéphane Chazelas
1
@StephaneChazelas saya mengerti. Terima kasih banyak keduanya- Saya suka kesalahan seperti ini, telah belajar banyak!
buang air
Senang itu diperbaiki. Saya melewatkan sesuatu. Jika itu vm, maka itu hanya satu file besar ke sistem host, bukan? Bagaimana Anda memasang sesuatu di dalamnya untuk melakukan perbaikan? (Saya mengerti bagaimana melakukan ini pada sistem non-vm.)
Joe
68

Bahkan root, Anda tidak dapat menjalankan file yang tidak memiliki xbit izin yang ditetapkan. Apa yang dapat Anda lakukan adalah memanggilnya ld.so(asalkan mereka executable yang terhubung secara dinamis):

$ echo /lib/*/ld*.so
/lib/i386-linux-gnu/ld-2.27.so /lib/x86_64-linux-gnu/ld-2.27.so

Gunakan salah satu yang cocok dengan arsitektur yang chmoddapat dieksekusi. Dalam kasus saya yang x86_64satu:

sudo /lib/x86_64-linux-gnu/ld-2.27.so /bin/chmod 755 /bin /bin/chmod

Atau hubungi sesuatu di /usr/binatau di tempat lain untuk melakukan hal yang chmodsama perl:

sudo perl -e 'chmod 0755, "/bin", "/bin/chmod"

Hati-hati saat mengembalikan izin yang /bindisukai beberapa file mountatau sudimaksudkan untuk memiliki izin selain 0755.

Jika Anda sudah reboot, namun, Anda mungkin tidak bisa mendapatkan ke titik di mana Anda dapat menjalankan perlatau ld.sosekalipun. Anda dapat memperbaiki hal-hal dari initramfsthough (lewat direktori root yang salah untuk mendapatkan shell pemulihan di initramfs; lihat juga parameter break=bottomatau break=initkernel pada Debian, untuk initramfs memberi Anda shell setelah sistem file root dipasang (read-only) meskipun)). Atau boot VM Anda dari gambar live CD, atau perbaiki dengan memasang sistem file VM pada host seperti yang disarankan orang lain.

Memperbaiki cara initramfs:

Di grub, edit entri boot dan hapus root=parameter dari linuxperintah:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic                                     
initrd /boot/initrd.img-3.2.0-27-generic                                 

Ctrl-Xuntuk boot. Initramfs Ubuntu tidak akan menemukan sistem file root, jadi mulailah pemulihan sh. Kemudian pasang sistem file root (dalam kasus saya /dev/vdb, beradaptasi dengan mesin Anda) dan perbaiki hal-hal di sana:

Target filesystem doesn't have requested /sbin/init.
No init found. Try passing init= bootarg.


BusyBox v1.18.5 (Ubuntu 1:1.18.5-1ubuntu4) built-in shell (ash)
Enter 'help' for a list of built-in commands.

(initramfs) mkdir /x
(initramfs) mount /dev/vdb /x
[   48.430071] EXT3-fs (vdb): error: couldn't mount because of unsupported optio
nal features (240)
[   48.477406] EXT4-fs (vdb): recovery complete
[   48.477747] EXT4-fs (vdb): mounted filesystem with ordered data mode. Opts: (
null)
(initramfs) chmod -R 755 /x/bin
(initramfs) umount /x
(initramfs) reboot

Setelah di-boot, perbaiki izin file yang tidak dimaksudkan untuk memiliki 755 izin dengan membandingkannya dengan sistem lain.

Memperbaiki dengan menjalankan pythonsebagai init:

Dalam grub, mengedit entri boot, kali ini menjaga root=parameter, perubahan roke rwdan menambahkan init=/usr/bin/python:

setparams 'Ubuntu, with Linux 3.2.0-27-generic'                          

recordfail                                                               
gfxmode $linux_gfx_mode                                                  
insmod gzio                                                              
insmod ext2                                                              
set root='(hd1)'                                                         
search --no-floppy --fs-uuid --set=root dc02b07c-88ef-4804-afe0-4f02db2\ 
94561                                                                    
linux /boot/vmlinuz-3.2.0-27-generic root=UUID=dc02b07c-88ef-4804-afe0-\
4f02db294561 rw init=/usr/bin/python
initrd /boot/initrd.img-3.2.0-27-generic                                 

Kemudian, pada prompt python:

Begin: Running /scripts/init-bottom ... done.
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chmod('/bin/sh',0755)
>>> os.chmod('/bin/chmod',0755)
>>> os.execl('/bin/sh','sh')
sh: 0: can't access tty; job control turned off
# chmod -R 0755 /bin
# mount -o remount,ro /
[  100.704720] EXT4-fs (vdb): re-mounted. Opts: errors=remount-ro
# exec /sbin/init

Sekali lagi, setelah boot, perbaiki izin file yang tidak dimaksudkan untuk memiliki 755 izin dengan membandingkan dengan sistem lain.

Stéphane Chazelas
sumber
5
+1, jawaban bagus lainnya, Stephane. Saya akan menambahkan: dalam already try to rebootkasus ini: boot pada CD langsung, mount rw partisi yang berisi / bin, dan chmod 755 /bin(dan file di dalamnya jika mereka diubah juga). Tetapi setelah itu, periksa apakah semua file adalah izin yang benar (tergantung pada distrib linux Anda, Anda mungkin dapat memeriksa / bin terhadap paket asli)
Olivier Dulac
4
WOW. Kedalaman pengetahuan Anda menakutkan 8-).
slm
Saya tidak dapat menggunakan ld.so untuk mengeksekusi. pb.abhijeetr.com/fRWf Apa yang salah di sini?
Abhijeet Rastogi
@shadyabhi, Anda mungkin memiliki sistem multiarch dan mencoba menggunakan 32bit ld.so pada 64bit yang dapat dieksekusi. Anda harus memiliki yang lain ld.so, mungkin di beberapa direktori seperti /lib/x86_64-linux-gnu.
Stéphane Chazelas
1
@ Kwpolska, os.execldan execuntuk mengeksekusi, mereka tidak melakukan proses, hanya mengganti executable dalam proses yang sama , jadi semua dilakukan dalam pid 1. Proses 1 awalnya berjalan python, lalu sh, lalu init.
Stéphane Chazelas
8

Gunakan python :)

$ python
>>> import os
>>> os.chmod('/bin', 0755)

Seharusnya tidak perlu apa pun /binuntuk melakukan tugasnya. Jelas, saya belum mencoba ini ...

Dennis Kaarsemaker
sumber
Hmm, saya selalu berpikir bahwa ini dan bahasa scripting lainnya hanya akan memanggil program chmod. Cukup bagus untuk diketahui!
buang air
1
Tidak, chmodadalah panggilan sistem, dipanggil oleh chmodprogram dan juga oleh chmodfungsi dalam python / perl / ruby ​​dll. Kerang memanggil chmodutilitas sekalipun.
Dennis Kaarsemaker
2
Kecuali kerang-kerang yang memiliki chmodbuiltin. Itulah situasi di mana cangkang seperti sashberguna. Ini terhubung secara statis dan memiliki sebagian besar perintah pemulihan seperti chmodbuiltin (jadi tidak bergantung pada yang lain). Biasanya akan duduk /sbinmeskipun tidak ada salahnya memiliki salinan tambahan pada semua sistem file, dan dapat digunakan dalam kombinasi dengan memlockd. zshdan ksh93memiliki chmod builtin (meskipun tidak diaktifkan secara default).
Stéphane Chazelas
1
@ Dennis Tetapi bagaimana Anda bisa menjalankannya jika Anda tidak bisa boot ke sistem sama sekali? Seperti kata OP: «sayangnya sekarang saya tidak bisa boot ke sistem sama sekali».
Nadir Sampaoli
@NadirSampaoli Ini jelas salah satu hal yang perlu Anda tangkap sebelum Anda reboot. Ini bisa berhasil dilakukan setelah chmodding root dan sebelum mematikan sistem.
Ken Bellows
0

Anda dapat mencoba sudo chmod -R 744 /path-to-your-system/bindari distro langsung.

Erkin Alp Güney
sumber