web-dev-qa-db-ja.com

chmod -R 000 / binから回復する方法は?

そして今、それをchmodで戻すことはできません。または他のシステムプログラムを使用できません。幸いなことに、これはVMにありますが、これまでいじっていましたが、これを解決する方法はありますか?システムはUbuntu Server 12.10です。

リカバリモードで再起動しようとしましたが、残念ながら、init-bottomの実行後に一部のプログラムに権限が付与されないため、システムを起動できません。システムがハングするだけです。これは私が見るものです:

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

この後、コンピュータがハングします。

36
jett

別のクリーンなOSを起動し、ファイルシステムをマウントして、権限を修正します。

壊れたファイルシステムはVM内に存在するので、ホストシステムが使用可能で機能している必要があります。壊れたファイルシステムをマウントして修正します。

QEMU/KVMの場合、たとえば nbd を使用してファイルシステムをマウントできます。

29
michas

rootとしても、x許可ビットが設定されていないファイルは実行できません。しかし、あなたができることはld.soを呼び出すことです(それらが動的にリンクされた実行可能ファイルである場合):

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

chmod実行可能ファイルのアーキテクチャに一致するものを使用してください。私の場合、x86_64の1つ:

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

または、chmodなどのPerlを実行するために/usr/binまたは他の場所で何かを呼び出します。

Sudo Perl -e 'chmod 0755, "/bin", "/bin/chmod"

mountsuのような/bin内の一部のファイルは0755以外の権限を持っていることを意図しているため、権限を復元するときは注意してください。

ただし、再起動した場合は、Perlまたはld.soを実行できるようにならない可能性があります。ただし、initramfsから問題を修正できます(不適切なルートディレクトリを渡してinitramfsでリカバリシェルを取得します。initramfsについては、Debianのbreak=bottomまたはbreak=initカーネルパラメータも参照してください。ルートファイルシステムがマウントされた後にシェルを提供します(読み取り専用です)。または、VMをライブCDイメージから起動するか、VMファイルシステムをホストにマウントして修正します。

Initramfsの方法を修正します。

grubで、ブートエントリを編集し、linuxコマンドからroot=パラメータを削除します。

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-X 起動します。 Ubuntuのinitramfsはルートファイルシステムを検出できないため、リカバリを開始しますsh。次に、ルートファイルシステムをマウントし(私の場合は/dev/vdb、マシンに適応させます)、そこで修正します。

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

起動したら、別のシステムと比較して、755のアクセス許可を持たないファイルのアクセス許可を修正します。

pythoninitとして実行することによる修正:

grubで、ブートエントリを編集します。今回はroot=パラメータを保持し、rorwに変更して、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                                 

次に、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

再度、起動したら、別のシステムと比較して、755のアクセス許可を持たないファイルのアクセス許可を修正します。

68

python :)を使用します

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

そのためには、/binからの作業は必要ありません。明らかに、私はこれを試していません...

8

あなたが試すことができます Sudo chmod -R 744 /path-to-your-system/binライブディストリビューションから。

0