Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuで実行できるかどうかはわかりません。しかし、それはすべてを削除することで有名です。好奇心から、カーネルと/bin
を削除するとどうなりますか? rm
はどのように実行時スタックを維持しますか? rm
はどのようにしてファイルシステムと通信し、削除を完了するのですか?ハードウェアとどのように通信しますか?
/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は機能します。
Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuで実行できるかどうかはわかりません。
やった。 rm -rf / --no-preserve-root
は、マシン上で直接開かれたルートセッションで実行されていましたが、ルートアカウントも使用して、別のマシンからssh
を介して接続されていました。
何が起こるかというと、多くののようなメッセージを受け取り始めます:
rm: '/ ...'を削除できません:操作は許可されていません
または:
rm:「/ ...」を削除できません:デバイスまたはリソースがビジーです
驚いたことに、ssh
接続は操作が終了するまで開いたままでした。エラーが表示されたのは、接続を閉じて再度開こうとしたときだけです。
ソケットからの読み取りに失敗しました:ピアによる接続のリセット
マシンには、4つのディレクトリが残ります。
/dev
。これは、デバイスファイルが保存される場所です。/proc
—カーネルによって作成されたメモリ内ファイルシステム。/run
、デーモンの標準化されたファイルシステムの場所。/sys
。これにより、システムとそのコンポーネントに関する情報を取得できます。これは、あまり残っていないことを意味します。 ls
は使用できません(ただし、 Tab、ディレクトリとファイルの名前は引き続き表示されます)。さまざまなディレクトリでcd
を使用できますが、echo
を使用することもできますが、cat
などのコマンドは使用できなくなりました。
Sudo
もありません。
shutdown -h now
とreboot
も消えたので、あなたの唯一のオプションは、マシンを手動で停止するようです。ログアウト(exit
)は、ニースの「ログアウト」テキストを表示しても機能しません。
マシンを再起動しようとすると、Nice GRUBエラー15が表示されますが、何も起こりません。その時点で、rm
がシステムに何らかの悪影響を及ぼす可能性があると考え始めるかもしれません。
いいえ、待って、あなたのマシンでそれをしないでください!
代わりにできることは、仮想マシンを実行することです。 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でデータを回復する方がずっと簡単です。
その理由は、ファイルの名前付け層(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つはどちらもファイルシステムの一貫性のない状態になります。
以前の回答は良いですが、詳細を明確にしたいと思います。
rm
は単なるコマンドではありません。 PATH
にあるプログラムです。
したがって、実行すると次のようになります。
rm -rf /
を呼び出しますrm
のインスタンスは、引数-rf
および/
とともにメモリにロードされますrm
はその操作を開始します(マウントされた/パーティション内のすべてを通過し、その参照を再帰的に削除します[技術的に申し訳ありません;)])rm
プログラムのインスタンスがアンロードされます仕組みを理解するために、Ubuntu(Virtualbox内)、いくつかのスクリプト、およびPHP opcodeキャッシュにLAMPをインストールしてから、この邪悪なコマンドを呼び出してください。驚いたことに(幸運にも、オペコードキャッシュがphpファイルの削除に気付かない場合)、Apache Webサーバー経由で外部からphpスクリプトにアクセスできます!
PS:この邪悪なコマンドはeverything
を削除せずにルートとして実行され、/proc
から一部のカーネル特権プロセスを削除できません。また、システムに表示される/dev
ファイル。実際、ルートは私たちが考えるほど全能ではありませんが、カーネルはそうです。
PPS:また、考え直したように、削除の試行時に別のプロセスによってlocked
だったファイルも残っていることになります。
すべてがハードドライブから消去されると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、一種のスタック状態になります。
OSはもう機能しません。
そして、Oliの言うとおり、コマンドはメモリにロード/実行され、このプロセスを強制終了しない限り何も停止しません(もちろん、killコマンドがまだ存在する場合は^^)。
システムにselinuxがあり、selinuxが強制モードであり、selinuxのポリシーが適切に設定されている場合、注意してください。その後、何も起こりません。
Selinuxは必須のアクセス制御です。これは、多くのことの中でも、rootユーザーはシステム上の他のユーザーよりもシステムを破壊する力があまりないことを意味します。
Selinuxはカーネルで実施されます。カーネルを回避するには、カーネルを侵害する必要があります。
適切なSelinuxポリシーを備えた適切に設計されたシステムでは、rootはシステム上で多くのことを実行できません。
Androidの後のリビジョンでは、この理由のためにSelinuxが強制されています。