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


81

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


18
rm -rf /なしでは何も削除されません--no-preserve-root
ムル

47
Linuxでの最初の経験は、Ubuntu vmを作成して「rm -rf /」できるようにすることでした。これを試すことをお勧めします。セットアップは非常に簡単で、ホストを安全に保ち、OSのさまざまな部分が崩れるのを目の前で見るのはとても楽しいです。とても満足です。
DJMcMayhem

22
お気に入りの控えめなバグレポートを思い出させます:bugzilla.redhat.com/show_bug.cgi?id=1202858 「期待される結果:Squidが再起動されます。実際の結果:マシン上のすべてのファイルが削除されます。」

9
Unix Recovery Legendをお読みください。まだシェルにログインしている限り、システムは完全に死んでいるわけではありません!
200_success

2
@gerrit 私がやった。:)
ムル

回答:


79

/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/最後のディレクトリが入力された場合、これらの方法機能します。


7
@DavidHoelzerが説明するように、リンクされていないファイルは、作業を続けるためにメモリ内に既にある必要はありません。カーネルは、開いているファイルハンドルがあることを認識しているため、最後のハンドルが閉じられるまで、要求(ページインを含む)を満たすためにファイルデータを保持します。
アンドリューメディコ

4
@Desty、いいえ、それは/bin/rm最後のバッチの最後になるのに十分近くない限り成功しません。-exec ... {} +(バックスラッシュをエスケープする必要はありません)、それでも複数回実行されます。ファイルごとではなく、ARG_MAXに収まる引数の数に基づいてバッチごとに1つです。
チャールズダフィー

6
@Oli、ページングに関するものではありません。参照カウンタはディレクトリエントリではなくiノードにリンクされ、開いているファイルハンドルは参照としてカウントされ(ハードリンクと同じ)、iノードの割り当てが解除されるのを防ぎます。ファイルサイズはまったく要因ではありません。これは、スワップスペースがない(つまり、ページングがない)場合でも発生します。
チャールズダフィー

2
@CharlesDuffyスワップスペースの有無にかかわらず、すべてのメモリマップファイルにページングが使用されます。これには、すべての実行可能ファイルとライブラリが含まれます。実際、スワップ領域の不足は、実際には、メモリマップファイルのページングが増えていることを意味します。
カスペルド

2
@CharlesDuffyはい、サイズは実際には関係ありません。ファイルをメモリマッピングしても、アクセスされるまでファイルの内容はロードされません。また、ファイルのアクセスされた部分をロードするために使用されたメモリは、必要に応じて再び解放できます。その後、再びアクセスされると、ファイルからメモリがロードされます。そのため、ファイルは実際にマップされている限りファイルシステム上にとどまる必要があり、これはアドレス空間全体に広がるほど大きなファイルの場合と同じように1ページのファイルに対して同じように動作します。(動的リンクに必要なコピーオンライトマッピングの詳細は、もう少し複雑です。)
kasperd

57

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でデータを回復する方がずっと簡単です。


VirtualBoxはディスクスナップショットをサポートしています。
ネイサンオスマン

1
ウイルスは多くの場合、VMを検出するように設計されているため、このウイルス検出プロセスはお勧めしません。小さな質問:残りの4つのディレクトリは「実際の」ディレクトリではありませんか?彼らは実際にハードドライブ上にいませんか?このコマンドを実行した後、ハードドライブに何が残っていますか?
raptortech97

2
@ raptortech97 rmは実際にハードドライブからデータを消去するのではなく、ディスク上の実際のデータをファイルシステムツリーから「リンク解除」(関連付け解除)し、空きとしてマークします(その結果、通常のコンピューター使用で上書きされる可能性があります)。したがって、たとえば、rm -rf ~あなたがすぐに行動する限り、すべてが失われるわけではありません(たとえばextundelete)。メールボックス内の「削除済み」フォルダーのさらに信頼性の低いバージョンと考えることができます。長く待たない場合は元に戻すことができますが、最終的には削除されます。
トーマス

@ raptortech97一方、何らかの理由でを使用しなかった場合rmshred、ゲームオーバーになりますが、シュレッディングに時間がかかるため、間違いを認識して中断する時間があります。
トーマス

5
保持されているディレクトリは、おそらく何らかの形のマウントポイントです。そして、引き続き機能するコマンドは、個別のバイナリではなく、bash組み込みコマンドです。だから、しばらくはls消えて、for i in /*; do echo $i; done動作するはずです。置き換えるcatには、などのコマンドを使用しますwhile read i; do echo $i; done < /proc/self/maps
MvG

25

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

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

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

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

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

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


別の見方をすると、ファイルを開くと/ proc内にリンクが追加されるため、リンクカウントはゼロではありません。
OrangeDog

@OrangeDog、この動作は、procfsがマウント解除されている場合でも存在します。
チャールズダフィー

1
@OrangeDogチャールズダフィーは正しい。/ procのファイルハンドルは、iノードを変更せ、リンクカウントを調整します。
デビッドホルツァー

/ procおよび/ sysは、現在のシステム(カーネル)状態を反映しています。実際にシステム状態を変更するのは、そこにあるファイルとディレクトリに対するアクションのみを選択することです。
CVn

18

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

rmコマンドだけではありません。それはにあるプログラムですPATH

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

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

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

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

PPS:また、別の考えとして、locked削除の試行時に別のプロセスによって作成されたファイルが残っていることも考えられます。


Linuxでは、rootとして実行しているときにデバイスノードを削除できます。ただし、はい、/proc読み取り専用のファイルシステムであるため、何も削除できません。同様に/sys。マウントポイントも削除できないと思います。
ブライアン

@AlexKey「非カーネル埋め込みコマンド」の意味を明確にする(またはそのフレーズを完全に避ける)編集をお勧めします。カーネルに直接実装されいるシェルを介して実行できるコマンドがあると言っているように聞こえます。(ケースではなく、あなたはおそらく知っているように、ですが、多くの読者がいない可能性がある:あなたのようなコマンドを実行するとcd、この呼び出しを組み込みシェル。その名前では-そのコマンドはシェルではなく、カーネルに組み込まれている)か、あなたはAlt + SysRq「コマンド」を意味しますか?
エリアカガン

@ブライアンはディストリビューションに依存していますか?私はさまざまなディストリビューションで働いていましたが、面白そうに聞こえたので、この間違いを何度も繰り返しました。/ devの残骸を調べた後に思い出したように、/ devにはまだ何かがありましたが、cdromやフロッピーのようなものかもしれません...
Alexey Kamenskiy

@EliahKagan独立したディストリビューションを維持しようとしたので、この用語を使用しました。つまり、すべてのシステムでcliコマンドが外部プログラムを意味するわけではありません。しかし、それを指摘してくれたことに感謝します。
アレクセイカメンスキー

@AlexKey /dev/ptsマウントポイントなので削除できないと思います。(そして読み取り専用ファイルシステムも。)
ブライアン

1

すべてがハードドライブから消去されると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、ちょっと立ち往生しています。

OSはもう機能しません。

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


4
カーネルが動けなくなるのはなぜですか?MainMaの答えはそうではないことを示唆しており、私が期待していたことを裏付けています。
MvG

4
プログラムは、ハードドライブではなくメモリから実行されます。カーネルは、再起動するまで何も問題がないことを知りません。
phyrfox

おそらく、私は使用した言葉を変更する必要があります。カーネルはデバイスやプログラムなどなしで多かれ少なかれ「スタック」します。あなたがルートコンソールの前にいなければ、悪いことはできません。悪いことはできません。しかし、誤解を招く可能性があるため、回答の文言を変更します。
s1mmel

0

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

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

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

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

Androidの以降のリビジョンでは、この理由だけでSelinuxが強制されています。

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