web-dev-qa-db-ja.com

「rm -rf /」はシステム内のすべてのファイルをどのように削除できますか?

Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuで実行できるかどうかはわかりません。しかし、それはすべてを削除することで有名です。好奇心から、カーネルと/binを削除するとどうなりますか? rmはどのように実行時スタックを維持しますか? rmはどのようにしてファイルシステムと通信し、削除を完了するのですか?ハードウェアとどのように通信しますか?

81
Muye

/bin/rmが削除されてもかまいません。ファイルシステムとディスクに削除を送信し続けるために必要な他のすべてがそうであるように、それは一度だけ実行され、その時点ですべてがメモリにロードされます。


サイドバー/更新:David Hoelzer's answer (およびコメントに記載)ごとに、iノードのハードリンク/bin/rm以前はrmが終了するまで(Linuxがオープン状態を保持しているため)そのままになることを指していましたbutその事実は無関係です。ディスクの状態はまったく問題ではありません。

バイナリは実行前にメモリにロードされます。 rmディスクデータを手動で破棄できたとしても、削除の完了に影響を与えたり、削除を停止したりすることはありません(ディスクを使用不可にしないと仮定した場合)。

iノードまたはハードリンクが何であるかわかりませんか?これが私が解決した答えです


とにかく、これはコンピューターが破裂することなくcurrentカーネルのパッケージを削除できる理由でもあります。別のバージョンをインストールする限り、起動することができます。

繰り返しますが、これはrmが1回しか呼び出されないため機能します。次のwouldは、/bin/rmがすべてのファイル名に対して1回呼び出されるため、その死後に失敗します。

find / -exec rm {} \;

とはいえ、find / -exec rm -rf {} +find / -print0 | xargs -0 rm -rfも引数制限があるため、両方とも失敗する可能性があります。つまり、再度呼び出される前にいくつかのファイルを削除するだけです。旅行中のある時点で、/bin/rmは、残りのファイルが削除される前に期限切れになる可能性があります(and)。しかし、それは保証されていません。 /bin/が最後に入力されたディレクトリである場合、これらのメソッドcouldは機能します。

79
Oli

Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuで実行できるかどうかはわかりません。

やった。 rm -rf / --no-preserve-rootは、マシン上で直接開かれたルートセッションで実行されていましたが、ルートアカウントも使用して、別のマシンからsshを介して接続されていました。

何が起こるかというと、多くののようなメッセージを受け取り始めます:

rm: '/ ...'を削除できません:操作は許可されていません

または:

rm:「/ ...」を削除できません:デバイスまたはリソースがビジーです

enter image description here

驚いたことに、ssh接続は操作が終了するまで開いたままでした。エラーが表示されたのは、接続を閉じて再度開こうとしたときだけです。

ソケットからの読み取りに失敗しました:ピアによる接続のリセット

マシンには、4つのディレクトリが残ります。

  • /dev 。これは、デバイスファイルが保存される場所です。
  • /proc —カーネルによって作成されたメモリ内ファイルシステム。
  • /run 、デーモンの標準化されたファイルシステムの場所。
  • /sys 。これにより、システムとそのコンポーネントに関する情報を取得できます。

これは、あまり残っていないことを意味します。 lsは使用できません(ただし、 Tab、ディレクトリとファイルの名前は引き続き表示されます)。さまざまなディレクトリでcdを使用できますが、echoを使用することもできますが、catなどのコマンドは使用できなくなりました。

Sudoもありません。

shutdown -h nowrebootも消えたので、あなたの唯一のオプションは、マシンを手動で停止するようです。ログアウト(exit)は、ニースの「ログアウト」テキストを表示しても機能しません。

マシンを再起動しようとすると、Nice GRUBエラー15が表示されますが、何も起こりません。その時点で、rmがシステムに何らかの悪影響を及ぼす可能性があると考え始めるかもしれません。

enter image description here

あなたもできる

いいえ、待って、あなたのマシンでそれをしないでください!

代わりにできることは、仮想マシンを実行することです。 VMには、実験を非常に簡単にするという利点があります。 Ubuntuを使用しているため、 vmbuilder に興味があるかもしれません。これは、数分で仮想マシンを展開できるツールです(公式ドキュメントでは「約1分で」実行できるとされていますが、実際の時間は、高速ハードウェアでも約2〜3分です。 。

展開が終了すると、遊ぶことができる環境ができます。破壊しても問題はありません。マシンを再度展開し、2分後に続行できます。

VMWareなどのソフトウェアを使用する場合は、snapshotsにも興味があるかもしれません(無料のVMWare Playerにはこの機能がないため、VMware Workstationを購入する必要があります)。 Hyper-Vは無料であり、スナップショットをサポートしています(ただし、Windowsを実行する必要があります)。

スナップショットの利点は、数ミリ秒で取得できることです。スナップショットへのロールバックには時間がかかりますが、多くの場合数秒です。これにより、実験がさらに簡単かつ高速になります。

この実験は、オペレーティングシステム自体に限定されません。あなたはソフトウェアを含むあらゆる種類のことをすることができます。不審なアプリケーションを入手しましたか? VMでテストします。ウイルスであれば、害はありません。環境に影響を与える可能性があるため、データベースの操作をテストしたいですか? VMでテストします。

実際の非テストマシンでそれを行った場合はどうなりますか?

悪いことが起こります。 rmはあなた自身を保護することに注意してください:rm -rf /は機能しません:--no-preserve-rootを使用する必要があります。それでも、誤ってすべてを削除することを実際に達成した場合はどうなりますか?

rmはファイルのリンクのみを解除します 、ただしデータはハードディスクに残っています。これにより、後で回復することが可能になります(そのため、機密データがなくなったハードディスクを破棄するだけではいけません)。

つまり、ファイルをほぼすべて回復するために、ハードドライブエンクロージャを備えた予備のPCがあれば十分です。重要なことは、回復するためにハードディスクに何かを書き込むことを避けることです。あなたが書き込むデータは、リンクされていないファイルを上書きします。

200_successのコメントの記事に記載されているように 、賢明に行動すれば、予備のPCがなくてもマシンを元に戻すことができます。データだけを気にするなら、私は気にしません。予備のPCでデータを回復する方がずっと簡単です。

57

その理由は、ファイルの名前付け層(lsで表示されるもの)は実際には単に便宜上のものだからです。ファイルシステムドライバーとカーネルは、iノードが何であるかのみを考慮します。ファイルが名前で参照されると、すぐにアクセス許可、ディスク上のデータブロック、所有者ID、グループID、リンクカウントを含むすべてのメタデータを含むiノードに変換されます。

ここで本当に重要なのはリンクカウントです。 UNIXシステムでファイルを削除すると、実際のシステムコールはunlinkになります。内部で発生しているのは、そのiノードを指すリンクカウント(ファイル名前付け層内のファイル名の数)が減少することです。ファイルシステムは、リンクカウントがゼロに達するとファイルが削除されることを認識しています。

ファイルがrmによって削除されると、ディレクトリファイルも編集します(はい、ファイル名とiノードに加えて、この回答にとって重要ではない他のいくつかのビットを含むファイルです)。ただし、実際にディスクリソースを解放するのはリンク解除です。

これは、他の興味深い効果をもたらします。まず、リンクカウントがゼロのファイルを開くことができます。これは、rm -rf //bin/rmのエントリを削除したときに発生します。ファイルは開いています(ファイルハンドルがあります)が、iノードは削除済みとしてマークされています(リンクカウント= 0)。ファイルハンドルが閉じるまで、ディスクリソースは解放されず、再利用されません。

もう1つの興味深い効果は、リンクカウントが0より大きいが、それを指すファイル名前付け層に何もないiノードがある場合に起こることです。ある意味、これは非常によく隠されたファイルです:)。アクセスするには、名前ではなくinode番号で参照するために低レベルを使用するか(1つがないため)、16進エディターを使用してディレクトリエントリを編集してinodeを指す必要があります。

3番目の興味深い効果は、リンクカウントをゼロに減らして、ディレクトリエントリをinodeに向けるとどうなるかということです。必要に応じて試してみます。ただし、明らかに、これらの最後の2つはどちらもファイルシステムの一貫性のない状態になります。

25
David Hoelzer

以前の回答は良いですが、詳細を明確にしたいと思います。

rmは単なるコマンドではありません。 PATHにあるプログラムです。

したがって、実行すると次のようになります。

  • (ルートとして)rm -rf /を呼び出します
  • プログラムrmのインスタンスは、引数-rfおよび/とともにメモリにロードされます
  • これらの引数に基づいて、プログラムrmはその操作を開始します(マウントされた/パーティション内のすべてを通過し、その参照を再帰的に削除します[技術的に申し訳ありません;)])
  • 終了すると、rmプログラムのインスタンスがアンロードされます
  • この時点でメモリ内にあるのは、以前にそこにロードされたプログラムだけです(たとえば、Ubuntu、デスクトップ環境、カーネル、ドライバーなどでターミナルを開いている場合はbash)
  • 別のコマンド(Linuxの場合はスタンドアロンプ​​ログラムになります)を呼び出そうとすると、PATHロケーションにそのようなプログラムが見つからないため失敗します(そしてPATHロケーションはもう存在しません)。ただし、一度ロードされたものはすべて実行されます

仕組みを理解するために、Ubuntu(Virtualbox内)、いくつかのスクリプト、およびPHP opcodeキャッシュにLAMPをインストールしてから、この邪悪なコマンドを呼び出してください。驚いたことに(幸運にも、オペコードキャッシュがphpファイルの削除に気付かない場合)、Apache Webサーバー経由で外部からphpスクリプトにアクセスできます!

PS:この邪悪なコマンドはeverythingを削除せずにルートとして実行され、/procから一部のカーネル特権プロセスを削除できません。また、システムに表示される/devファイル。実際、ルートは私たちが考えるほど全能ではありませんが、カーネルはそうです。

PPS:また、考え直したように、削除の試行時に別のプロセスによってlockedだったファイルも残っていることになります。

18

すべてがハードドライブから消去されると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、一種のスタック状態になります。

OSはもう機能しません。

そして、Oliの言うとおり、コマンドはメモリにロード/実行され、このプロセスを強制終了しない限り何も停止しません(もちろん、killコマンドがまだ存在する場合は^^)。

1
s1mmel

システムにselinuxがあり、selinuxが強制モードであり、selinuxのポリシーが適切に設定されている場合、注意してください。その後、何も起こりません。

Selinuxは必須のアクセス制御です。これは、多くのことの中でも、rootユーザーはシステム上の他のユーザーよりもシステムを破壊する力があまりないことを意味します。

Selinuxはカーネルで実施されます。カーネルを回避するには、カーネルを侵害する必要があります。

適切なSelinuxポリシーを備えた適切に設計されたシステムでは、rootはシステム上で多くのことを実行できません。

Androidの後のリビジョンでは、この理由のためにSelinuxが強制されています。

0
Mark Allyn