kzen.dev
  • 質問
  • タグ
  • ユーザー
通知:
報酬:
登録
登録すると、質問に対する返答やコメントが通知されます。
ログイン
すでにアカウントをお持ちの方は、ログインして新しい通知を確認してください。
追加された質問、回答、コメントには報酬があります。
さらに
ソース
編集
 Muye
Muye
質問

どのようにして 'rm -rf /'システム内のすべてのファイルを削除することができるのですか?

このコマンドをUbuntuで試したことがないので(理由は明白)、Ubuntuがその実行を許可するかどうかはわかりません。でも、何でもかんでも削除することで有名ですからね。興味があるのですが、カーネルや/binを削除するとどうなるのでしょうか?rmはどのようにしてランタイムスタックを維持しているのですか?rmはどのようにしてファイルシステムと通信し、削除を完了させるのですか?ハードウェアとはどのように通信するのですか?

84 2015-04-02T08:13:41+00:00 3
Alfredo Hernández
Alfredo Hernández
編集された質問 21日 4月 2015 в 10:45
Ubuntu
filesystem
kernel
rm
この質問には 1 つの答え があり、読むには ログイン してください。
解決策・回答
 Oli
Oli
2日 4月 2015 в 8:26
2015-04-02T08:26:02+00:00
さらに
ソース
編集
#38376720

bin/rm`が削除されることは問題ではありません。実行されるのは一度だけで、その時点では、ファイルシステムやディスクに削除を送り続けるために必要な他のすべてのものと同様に、すべてメモリに読み込まれています。


Sidebar/Update: David Hoelzer's answer (そしてコメントでも言及されています)によると、ハードリンク /bin/rm が指していた inode は rm が終了するまで残っていました (Linux はオープンな状態を保持しているため)。

ディスクの状態は関係ありません。バイナリは実行される前にメモリにロードされます。たとえ rm のディスクデータを手動で破壊できたとしても、削除の完了には影響しませんし、停止もしません (他にディスクを利用できないようにしなければ、ですが)。

inodeやhardlinkが何なのかわからない?これは私が解決した答えです。


とにかく、これが、コンピュータを爆発させることなく、最新のカーネルのパッケージを削除できる理由でもあります。別のバージョンをインストールしさえすれば、起動できるようになります。

繰り返しになりますが、これは rm が一度しか呼ばれないからです。以下は /bin/rm が死んだ後に 失敗する でしょう。なぜなら、ファイル名ごとに一度だけ呼ばれるからです。

find / -exec rm {} \;

そうは言っても、find / -exec rm -rf {}.+これは、どちらも引数に制限があるためで、つまり、いくつかのファイルを削除してから再度呼び出されることになります。つまり、再び呼び出される前にいくつかのファイルしか削除されないということです。旅の途中のある時点で、残りのファイルが削除される前に/bin/rmが期限切れになる (*および*) 可能性があります。しかし、それは保証されていません。もし/bin/` が最後に入力されたディレクトリであれば、これらの方法は could 動作します。

 Community
Community
編集した答え 13日 4月 2017 в 12:24
81
0
Alexey Kamenskiy
Alexey Kamenskiy
2日 4月 2015 в 11:45
2015-04-02T11:45:45+00:00
さらに
ソース
編集
#38376722

これまでの回答も良かったのですが、一つだけ詳細を明らかにしたいと思います。

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

ですから、実行すると次のようになります。

  • (rootとして) rm -rf / を呼び出します。
  • プログラム rm のインスタンスは、引数 -rf と / でメモリにロードされます。
  • これらの引数に基づいて、プログラム rm が動作を開始します (マウントされた / パーティション内のすべてのものを調べ、再帰的にその参照を削除します [専門的で申し訳ありません ;)])
  • それが終わると、rmプログラムのインスタンスはアンロードされます。
  • この時点でメモリ内にあるのは、以前にロードされたプログラムだけです(例:Ubuntuでターミナルを開いている場合はbash、デスクトップ環境、カーネル、ドライバなど)。
  • この時点でメモリにあるのは、以前に読み込まれたプログラムだけです(例:Ubuntuでターミナルを開いている場合はbash、デスクトップ環境、カーネル、ドライバなど)。しかし、一度ロードされたものはすべて実行されます。

仕組みを理解するために、LAMPをubuntu(Virtualbox)にインストールし、いくつかのスクリプトとPHP opcode cacheをインストールし、この邪悪なコマンドを呼び出してみてください。驚くべきことに(運良くPHPファイルの削除にオペコードキャッシュが気づかなければ)、外部からapacheのウェブサーバ経由でPHPスクリプトにアクセスすることができます。

追記: この邪悪なコマンドは、たとえ root で実行されたとしても、「すべて」を削除することはできません。/proc からカーネル特権プロセスを削除することはできませんし、/dev デバイスからファイルとしてシステムに表示されるものを削除することもできません。実際のところ、root は私たちが考えているほど全能ではなく、一方でカーネルは全能です。

PPS: また、考え直してみると、削除しようとした時に他のプロセスによって「ロック」されていたファイルもまだ残っているでしょう。

Alexey Kamenskiy
Alexey Kamenskiy
編集した答え 3日 4月 2015 в 10:00
18
0
 s1mmel
s1mmel
2日 4月 2015 в 9:35
2015-04-02T09:35:39+00:00
さらに
ソース
編集
#38376721

ハードディスクからすべてを消去すると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、ある意味で行き詰まっています。

OSはもう動きません。

Oliさんの言う通り、コマンドはメモリに読み込まれて実行され、このプロセスを殺さない限り(もちろん、killコマンドが残っていればの話ですが^^;)、何も止められません。

 s1mmel
s1mmel
編集した答え 9日 4月 2015 в 7:11
1
0
質問の追加
カテゴリ
すべて
技術情報
文化・レクリエーション
生活・芸術
科学
プロフェッショナル
事業内容
ユーザー
すべて
新しい
人気
1
Ilya Smirnov
登録済み 6日前
2
Денис Васьков
登録済み 1週間前
3
Dima Patrushev
登録済み 1週間前
4
sirojidddin otaboyev
登録済み 2週間前
5
Елена Гайдамамакинат
登録済み 2週間前
ID
JA
© kzen.dev :年
ソース
askubuntu.com
ライセンス cc by-sa 3.0 帰属