Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuが実行を許可するかどうかはわかりません。しかし、それはすべてを削除することで有名です。好奇心から、カーネル/bin
が削除されるとどうなりますか?rm
実行時スタックをどのように維持しますか?rm
ファイルシステムとの通信と完全な削除をどのように管理しますか?ハードウェアとどのように通信しますか?
Ubuntuでこのコマンドを試したことはないので(明らかな理由により)、Ubuntuが実行を許可するかどうかはわかりません。しかし、それはすべてを削除することで有名です。好奇心から、カーネル/bin
が削除されるとどうなりますか?rm
実行時スタックをどのように維持しますか?rm
ファイルシステムとの通信と完全な削除をどのように管理しますか?ハードウェアとどのように通信しますか?
回答:
/bin/rm
削除されても構いません。ファイルシステムとディスクに削除を送信し続けるために必要な他のすべてと同様に、一度だけ実行され、その時点ですべてがメモリにロードされます。
サイドバー/更新:パーデビッドHoelzerの回答(とコメントで述べた)、ハードリンクiノード/bin/rm
を指すために使用が右まで残るだろうrm
(Linuxはオープン状態で保持しているため)、完成したが、その事実は無関係です。ディスクの状態はまったく問題ではありません。
バイナリは実行前にメモリにロードされます。rm
ディスクデータを手動で破棄できたとしても、削除の完了に影響を与えたり、削除を停止したりすることはありません(ディスクを使用不可にしないと仮定した場合)。
iノードまたはハードリンクが何であるかわかりませんか?これは私がそれを解決した答えです。
とにかく、これはコンピューターが破裂することなく現在のカーネルのパッケージを削除できる理由でもあります。別のバージョンをインストールする限り、起動することができます。
繰り返しますが、これrm
は一度しか呼び出されないため機能します。以下は/bin/rm
、ファイル名ごとに1回呼び出すため、死んだ後に失敗します。
find / -exec rm {} \;
いえ、find / -exec rm -rf {} +
およびfind / -print0 | xargs -0 rm -rf
それらの両方は、彼らが唯一再び呼び出される前にファイルの数を削除してしまうという意味、引数の制限を持っているので、両方のは、おそらく失敗するだろう。旅に沿っていくつかの点で、/bin/rm
有効期限が切れる可能性が(と残りのファイルが削除された前にリリースされます)。しかし、それは保証されていません。/bin/
最後のディレクトリが入力された場合、これらの方法は機能します。
/bin/rm
最後のバッチの最後になるのに十分近くない限り成功しません。-exec ... {} +
(バックスラッシュをエスケープする必要はありません)、それでも複数回実行されます。ファイルごとではなく、ARG_MAXに収まる引数の数に基づいてバッチごとに1つです。
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
素敵な「ログアウト」テキストが表示されても、ログアウト()は機能しません。
マシンをリブートしようとすると、素晴らしいGRUBエラー15が表示されますが、何も起こりません。その時点でrm
、システムに何か悪いことをしたのではないかと考え始めるかもしれません。
いいえ、待って、あなたのマシンでそれをしないでください!
代わりにできることは、仮想マシンを実行することです。VMには、実験を非常に簡単にするという利点があります。Ubuntuを使用しているので、vmbuilderに興味があるかもしれません。これは、数分で仮想マシンを展開できるツールです(公式ドキュメントでは「約1分で」実行できるとされていますが、実際の時間は、高速ハードウェアでも約2〜3分です。 。
展開が終了すると、遊ぶことができる環境ができます。破棄しても問題はありません。マシンを再度展開し、2分後に続行できます。
VMWareなどのソフトウェアを使用する場合は、スナップショットにも関心があるかもしれません(無料のVMWare Playerにはこの機能がないため、VMware Workstationを購入する必要があります)。Hyper-Vは無料であり、スナップショットをサポートしています(ただし、Windowsを実行する必要があります)。
スナップショットの利点は、数ミリ秒で取得できることです。スナップショットへのロールバックには時間がかかりますが、多くの場合数秒です。これにより、実験がさらに簡単かつ高速になります。
この実験は、オペレーティングシステム自体に限定されません。あなたはソフトウェアを含むあらゆる種類のことをすることができます。不審なアプリケーションを入手しましたか?VMでテストします。ウイルスであれば、害はありません。環境に影響を与える可能性があるため、データベースの操作をテストしたいですか?VMでテストします。
悪いことが起こります。rm
あなた自身からあなたを守ることに注意してください:rm -rf /
動作しません:を使用する必要があります--no-preserve-root
。それでも、誤ってすべてを削除することを実際に達成した場合はどうなりますか?
rm
ファイルのリンクを解除するだけですが、データはまだハードディスクにあります。これにより、後で回復することが可能になります(これが原因で、機密データがなくなったハードディスクを破棄するだけではいけません)。
これは、ほぼすべてのファイルを実際に回復するために、ハードドライブエンクロージャを備えた予備のPCがあればよいことを意味します。重要なことは、回復するためにハードディスクに何も書き込まないようにすることです。書き込むデータは、リンクされていないファイルを上書きします。
200_successのコメントの記事で述べたように、賢明に行動すれば、予備のPCがなくてもマシンを元に戻すことができます。データだけを気にするなら、私は気にしません。予備のPCでデータを回復する方がずっと簡単です。
rm
は実際にハードドライブからデータを消去するのではなく、ディスク上の実際のデータをファイルシステムツリーから「リンク解除」(関連付け解除)し、空きとしてマークします(その結果、通常のコンピューター使用で上書きされる可能性があります)。したがって、たとえば、rm -rf ~
あなたがすぐに行動する限り、すべてが失われるわけではありません(たとえばextundelete
)。メールボックス内の「削除済み」フォルダーのさらに信頼性の低いバージョンと考えることができます。長く待たない場合は元に戻すことができますが、最終的には削除されます。
rm
はshred
、ゲームオーバーになりますが、シュレッディングに時間がかかるため、間違いを認識して中断する時間があります。
ls
消えて、for i in /*; do echo $i; done
動作するはずです。置き換えるcat
には、などのコマンドを使用しますwhile read i; do echo $i; done < /proc/self/maps
。
その理由は、ファイルの名前付けレイヤー(で表示されるものls
)が本当にあなたの便宜のためだけだからです。ファイルシステムドライバーとカーネルは、iノードが何であるかのみを考慮します。ファイルが名前で参照されると、ファイルはすぐに、アクセス許可、ディスク上のデータブロック、所有者ID、グループID、リンクカウントを含むすべてのメタデータを含むiノードに変換されます。
ここで本当に重要なのはリンクカウントです。UNIXシステムでファイルを削除すると、実際のシステムコールはunlink
です。内部で発生しているのは、そのiノードを指すリンクカウント(ファイル名前付け層内のファイル名の数)が減少することです。ファイルシステムは、リンクカウントがゼロに達するとファイルが削除されることを認識しています。
ファイルが削除されるrm
と、ディレクトリファイルも編集されます(はい、ファイル名とiノードに加えて、この回答にとって重要ではない他のいくつかのビットを含むファイルです)。ただし、実際にディスクリソースを解放するのはリンク解除です。
これは、他の興味深い効果をもたらします。まず、リンクカウントがゼロのファイルを開くことができます。これはrm -rf /
、のエントリを削除するときに発生し/bin/rm
ます。ファイルは開いています(ファイルハンドルがあります)が、iノードは削除済みとしてマークされています(リンクカウント= 0)。ファイルハンドルが閉じるまで、ディスクリソースは解放されず、再利用されません。
別の興味深い効果は、リンクカウントが0より大きいが、それを指すファイル命名レイヤーに何もないiノードがある場合に起こることです。ある意味、これは非常によく隠されたファイルです:)。アクセスするには、名前ではなくinode番号で参照するために低レベルのものを使用するか(存在しないため)、16進エディターを使用してinodeを指すようにディレクトリエントリを編集する必要があります。
3番目の興味深い効果は、リンクカウントをゼロに減らして、ディレクトリエントリをinodeに向けるとどうなるかということです。必要に応じて試してみます。ただし、明らかに、これらの最後の2つはどちらもファイルシステムの一貫性のない状態になります。
以前の回答は良いですが、詳細を明確にしたいと思います。
rm
コマンドだけではありません。それはにあるプログラムですPATH
。
したがって、実行すると次のようになります。
rm -rf /
rm
引数とともにメモリにロードされ-rf
、/
rm
はその操作を開始します(マウントされた/パーティション内のすべてを通過し、再帰的に参照を削除します[技術的に申し訳ありません;)])rm
プログラムのインスタンスがアンロードされます仕組みを理解するために、Ubuntu(Virtualbox内)、いくつかのスクリプト、およびPHPオペコードキャッシュにLAMPをインストールしてから、この邪悪なコマンドを呼び出してください。驚いたことに(幸運で、オペコードキャッシュがphpファイルの削除に気付かない場合)、Apacheウェブサーバー経由で外部からphpスクリプトにアクセスできます!
PS:この邪悪なコマンドは、ルートが削除everything
することなく実行され、システムからファイルとして表示さ/proc
れる/dev
デバイスからカーネル特権プロセスを削除したり、デバイスからいくつかのものを削除したりできません。実際、ルートは私たちが考えるほど全能ではありませんが、カーネルはそうです。
PPS:また、別の考えとして、locked
削除の試行時に別のプロセスによって作成されたファイルが残っていることも考えられます。
/proc
読み取り専用のファイルシステムであるため、何も削除できません。同様に/sys
。マウントポイントも削除できないと思います。
/dev/pts
マウントポイントなので削除できないと思います。(そして読み取り専用ファイルシステムも。)
すべてがハードドライブから消去されると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、ちょっと立ち往生しています。
OSはもう機能しません。
そして、Oliの言うとおり、コマンドはメモリにロード/実行され、このプロセスを強制終了しない限り何も停止しません(もちろん、killコマンドがまだ存在する場合は^^)。
システムにselinuxがあり、selinuxが強制モードであり、selinuxのポリシーが適切に設定されている場合、注意してください。その後、何も起こりません。
Selinuxは必須のアクセス制御です。これは、多くのことの中でも、rootユーザーはシステム上の他のユーザーよりもシステムを破壊する力があまりないことを意味します。
Selinuxはカーネルで実施されます。カーネルを回避するには、カーネルを侵害する必要があります。
適切なSelinuxポリシーを備えた適切に設計されたシステムでは、rootはシステム上で多くのことを実行できません。
Androidの以降のリビジョンでは、この理由だけでSelinuxが強制されています。
rm -rf /
なしでは何も削除されません--no-preserve-root
。