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


36

そして今、私はそれを元に戻すことはできません。他のシステムプログラムを使用することもできません。幸いなことに、これは私がいじっていた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

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


それは/binあなたがchmodedまたはファイル内/bin、またはその両方?
ステファンシャゼラス

1
-Rオプションを指定した/ binディレクトリ...両方
2013年

tinycoreを備えたUSBを手元に置いておくと良いでしょう。このようなことが起こったときに便利です。
サガ

回答:


28

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

破損したファイルシステムがVMに存在するため、ホストシステムを使用可能にして動作させる必要があります。壊れたファイルシステムをそこにマウントして修正します。

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


おそらくこれを修正する方法としては正しいと思いますが、initrd.img memtest&abiのように、システムをマウントしてみる必要があります。今はイメージファイルからプリシステムを取得しています。
ジェット

1
@jett、/bootそのVM のパーティションをマウントしました。ルートファイルシステムを見つけて見つけてください。LVMの場合、vgchange -ay接続後に実行しnbdてアクティブにします。
ステファンシャゼラス

1
@StephaneChazelasわかった。どうもありがとうございました-私はこの種の間違いが大好きで、たくさん学びました!
ジェット2013年

修正されてうれしい。私は何かが欠けています。vmの場合、ホストシステムにとって1つの大きなファイルにすぎませんか?修理を行うために、どのように内部にマウントしますか?(非VMシステムでこれを行う方法を理解しています。)
ジョー

68

としてもrootx許可ビットが設定されていないファイルは実行できません。あなたができることはそれを呼び出す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次のとおりです。

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

またはで何かを呼び出す/usr/bin行うために他の場所かchmodのようにperl

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

いくつかのファイルという権限復元する際に注意する/binようにmountまたはがsu0755以外の権限を持っていることを意味しているが。

あなたが再起動した場合、しかし、あなたが実行できるポイントを取得できないことがありますperlld.soけれども。あなたはから物事を修正することができますinitramfsも参照;(ただしinitramfsを回復シェルを取得するために、誤ったルートディレクトリを渡しbreak=bottomたりbreak=init、カーネルパラメータルートファイルシステムがマウントされた後のinitramfsはあなたにシェルを与えるためのDebian上で、(読み取り専用をしかし))。または、ライブCDイメージからVMをブートするか、他の人が提案したようにホストにVMファイルシステムをマウントして修正します。

initramfsの方法を修正します。

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

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のアクセス許可を持たないファイルのアクセス許可を修正します。

pythonとして実行して修正init

grub、ブートエントリを編集します。今回はroot=パラメータを保持し、変更roしてrwから追加し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のアクセス許可を持たないファイルのアクセス許可を修正します。


5
+1、別の素晴らしい答え、ステファン。私は追加します:already try to reboot場合:ライブCDで起動し、/ binを含むパーティションにrwをマウントし、chmod 755 /bin(および変更された場合は内部のファイルも)マウントします。しかし、その後、すべてのファイルが正しい許可であることを確認してください(Linuxのディストリビューションによっては、おそらく元のパッケージに対して/ binを確認できます)
オリビエデュラック

4
ワオ。あなたの知識の深さは怖いです8-)。
slm

ld.soを使用して実行することはできません。pb.abhijeetr.com/fRWfここで何が問題になっていますか?
Abhijeet Rastogi

@shadyabhi、あなたはおそらくマルチアーチシステムを持っており、64ビットの実行可能ファイルで32ビットのld.soを使用しようとしています。あなたは別のものを持っている必要がありますld.soおそらくいくつかのディレクトリのように、/lib/x86_64-linux-gnu
ステファンシャゼラス

1
@Kwpolska、os.execlおよびexec実行用であり、プロセスをフォークせず、同じプロセス内の実行可能ファイル置き換えるだけなので、すべてがpid 1で実行されます。プロセス1が最初に実行されpython、次にsh、次にinit
ステファンシャゼラス

8

Pythonを使用:)

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

/bin仕事をするのに何も必要ないはずです。明らかに、私はこれを試していません...


うーん、私はこれと他のスクリプト言語がchmodプログラムを呼び出すだけだといつも考えていました。知っておくと良い!
ジェット2013年

1
いいえ、chmodシステムコールであり、chmodプログラムとchmodpython / perl / ruby​​などの関数によって呼び出されchmodます。しかし、シェルはユーティリティを呼び出します。
デニスカースメーカー

2
chmod組み込みのシェルを除きます。これは、シェルのようなものsashが便利な状況です。静的にリンクされており、組み込みコマンドのようなほとんどの回復コマンドがありますchmod(したがって、他のものには依存しません)。通常は/sbin、すべてのファイルシステムに余分なコピーがあっても害はありませんが、memlockdと組み合わせて使用​​できます。zshまたksh93、chmodが組み込まれています(ただし、デフォルトでは有効になっていません)。
ステファンシャゼラス

1
@Dennisしかし、システムをまったく起動できない場合、どのように実行できますか?OPが言うように:«残念ながら今は、システムをまったく起動できません»。
ナディールサンパオリ

@NadirSampaoliこれは間違いなく、リブートする前にキャッチする必要があるものの1つです。これは、ルートをchmoddingした後、システムをシャットダウンする前に正常に実行できます。
ケンベローズ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.