rm -rf /
を実行した場合、実際にどこまでのシステムになるのか、よく考えてみました。OSが自分で消せるかどうか怪しい(?
ボーナス質問。コマンドが実行された後、rm
は自分自身を削除したのでしょうか?
更新: VirtualBoxを使用して、いくつかの主要なunixディストリビューションでテストしましたが、回答には何が起こるかが正確に記述されています。正しいパラメータが与えられれば、rmはディスク上のすべての物理的なビットのデータを削除します。しかし、GNU版以外のバージョンのrmを使用した場合、いくつかの問題に遭遇しました。例えば、BusyBoxには独自のバージョンがあると思うのですが、それは可能な限りの削除をさせてくれません
この質問は 今週のスーパーユーザーの質問 です。 詳細は2011年7月7日のブログエントリーをご覧ください
200 n0pe 2011-07-20
GNU coreutilsのrm
を使っている場合(通常のLinuxディストロであれば、おそらくほとんどの場合)、rm -rf /
は組み込みの保護機能によって拒否されます(manpageとWikipediaによると、試していません)
この保護を無効にするには、--no-preserve-root
を使ってください。rm
は、すべてのファイルを削除しようとした後に停止することなく、可能な限りすべてのファイルを削除します。もちろん、/proc
や /sys
のような仮想ファイルシステムは削除されませんが、それは関係ありません – ディスク上のすべてのファイルを削除します
コマンドが終了すると、OS を含めてディスクは空っぽになります。カーネルや現在のプロセスはメモリから実行され続けますが、多くのプロセスは何かのファイルへのアクセスに失敗して死んでしまいます。OSは次回の起動に失敗します
188 Ambroz Bizjak 2011-07-20
テクノミュージックを聴きながら視覚的にこういったことをするのが好きな方に
彼らが死に始めるとプロセスに名前を付けることができればボーナスポイント
42 Xeoncross 2011-07-20
VMをセットアップして、遊びでやってみませんか?
GUIを使っている人は、もっと目に見えて劣化していることに気づくのが楽しいかもしれません。(メニューのアイコンの読み込みが止まるなど)
放っておけば、簡単にデータを取り戻せるかもしれませんが、OSはかなり復旧を超えてしまいます
どちらにしても、OSの再インストールをしたくなるでしょう
22 Pricey 2011-07-20
さて、http://bellard.org/jslinux/で試してみます
rm: ‘/dev/pts’ を削除できません。デバイスまたはリソースがビジー状態です rm: ‘/dev’ を削除できません。ディレクトリが空ではありません rm: ‘/proc/swaps’ を削除できません。操作が許可されていません rm: ‘/proc/kallsyms’ を削除できません。操作は許可されません rm: ‘/proc/dma’ を削除できません。操作は許可されていません
SNIP 881エントリー
rm: ‘/proc/149/oom_adj’ を削除できません。許可が拒否されました rm: ‘/proc/149’ を削除できません。操作が許可されていません rm: ‘/proc’ を削除できません。デバイスまたはリソースがビジー状態 rm: ‘/tmp’ を削除できません。デバイスまたはリソースがビジー状態 rm: ‘/’ を削除できません。デバイスまたはリソースがビジー状態です
11 Hello71 2011-07-20
昔、/proc
のようなものがなく、/dev
が普通のディレクトリで、普通ではないインノードのエントリを含むだけのものだった頃、alt.sysadmin.recovery
でこれを噛み砕いていたのを思い出します
… しかし、Unixのいくつかの亜種(私の記憶ではHP-UXですが、全くの間違いかもしれません)では、実行中のプログラムの最後のディレクトリエントリを削除することができませんでした(共有ライブラリ?(共有ライブラリってなんだっけ?)
このようなシステムでは、メンテナンスモード(シェル以外は何も起動しておらず、init
も起動しておらず、セカンダリファイルシステムもマウントされていません)でexec /bin/rm -rf /
を実行した場合、/bin
と/bin/rm
が生き残る以外は完全に空のルートファイルシステムが残ることになります
怖い悪魔の修道院の住人たちは、これが適切であると考えていた
7 zwol 2011-07-21
rm -rf /
はPOSIX標準に違反していることが示唆されているので、最近の実装では許可されるべきではありません
いずれにしても、最終的には仕様を修正してもらい、Solaris 10 には (ビルド 36 以降)/usr/bin/rm (/bin は Solaris の /usr/bin へのシンボリックリンクです) と /usr/xpg4/bin/rm のバージョンがあり、このように動作します
[28] /bin/rm -rf / rm of / is not allowed [29]
4 jlliagre 2011-07-20
現在開いているファイル(例えば rm 自体)は削除されたとしても、実際には閉じられるまでドライブから消えることはありません
3 CarlF 2011-07-20
一度試したことがある割には(何が私を怒らせたのかサーバー上で)、rootとしてログインして、ターミナルで、あなたはほとんどすべてを失うことになります。消されないのは、OSにとって必要不可欠だったプロセスだけになります
1 Anarko_Bizounours 2011-07-20
どこまでできるかというと、基本的には特定のUnix/Linuxディストリビューションに依存します
しかし、あなたの基本的な質問に答えるためには、そうです – rm
コマンドは、/bin
や他のフォルダにある他の標準コマンドと同様に削除されます
ここでは、Linux Ubuntu 15.04でVMを使って実行した簡単なテストを紹介します
vagrant
経由で仮想マシンを初期化しますvagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
そうすると、標準的な方法ですべてのファイルを削除しようとすると、そうさせてくれません
vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -fr / rm: it is dangerous to operate recursively on '/' rm: use --no-preserve-root to override this failsafe
では、
--no-preserve-root
を試してみましょう。必ず仮想マシンにログインしていることをダブルチェックしてから実行してください(だからvagrant@vagrant-ubuntu-vivid-64:~$
を実行している)vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -vfr --no-preserve-root / removed directory: '/lost+found' removed directory: '/opt' removed '/bin/nc' removed '/bin/less' removed '/bin/wdctl' removed '/bin/nano' ... removed '/bin/rmdir' removed '/bin/sh' removed '/bin/rm' ... removed directory: '/bin' removed directory: '/usr/games' removed '/usr/bin/byobu-launcher-install' removed '/usr/bin/ipcmk' removed '/usr/bin/sum' removed directory: '/usr/bin' removed '/usr/lib/gcc/x86_64-linux-gnu/4.9.2' removed '/usr/lib/gcc/x86_64-linux-gnu/5.0.1' removed directory: '/usr/lib/gcc/x86_64-linux-gnu/5' removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libquadmath.so' removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so' ... removed directory: '/run/initramfs' removed directory: '/media' rm: cannot remove '/proc/fb': Operation not permitted rm: cannot remove '/proc/fs/ext4/sda1/options': Operation not permitted ... removed '/vmlinuz' removed '/boot/config-3.19.0-23-generic' removed '/boot/grub/grubenv' ... removed directory: '/boot' removed '/lib64/ld-linux-x86-64.so.2' rm: cannot remove '/dev/hugepages': Device or resource busy rm: cannot remove '/dev/mqueue': Device or resource busy rm: cannot remove '/dev/shm': Device or resource busy removed '/dev/vcsa7' ... removed '/dev/mem' removed '/dev/rfkill' removed '/dev/vga_arbiter' ... rm: cannot remove '/sys/fs/ecryptfs/version': Operation not permitted removed directory: '/etc' removed directory: '/mnt' removed '/vagrant/.vagrant/machines/default/virtualbox/action_provision' removed '/vagrant/.vagrant/machines/default/virtualbox/action_set_name' removed '/vagrant/.vagrant/machines/default/virtualbox/creator_uid' removed '/vagrant/.vagrant/machines/default/virtualbox/id' removed '/vagrant/.vagrant/machines/default/virtualbox/index_uuid' removed '/vagrant/.vagrant/machines/default/virtualbox/private_key' removed '/vagrant/.vagrant/machines/default/virtualbox/synced_folders' removed directory: '/vagrant/.vagrant/machines/default/virtualbox' removed directory: '/vagrant/.vagrant/machines/default' removed directory: '/vagrant/.vagrant/machines' removed directory: '/vagrant/.vagrant' removed '/vagrant/Vagrantfile' rm: cannot remove '/vagrant': Device or resource busy
その後、何事もなかったかのようにシェルプロンプトに戻りますが、内蔵されているいくつかのコマンドと
kill
以外のコマンドを実行することはできません。)For example:
$ rm rm: command not found $ kill kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] $ which kill -bash: /usr/bin/which: No such file or directory $ kill -9 $$ Connection to 127.0.0.1 closed.
そのため、rm
, ls
, その他のコマンドを含むすべてのものが削除されましたが、ログインしたままです。/dev
, /proc
, /sys
のデバイスのように、通常のディレクトリやファイルではない特別なフォルダもありますが、プロセスやカーネルデータへのインターフェースを提供する擬似ファイルシステムです
VagrantやLinuxを持っていない場合は、JavaScript Linux x86エミュレータで遊ぶことができます
そんな災害からの復興の可能性に興味がある方はチェックしてみてください
1 kenorb 2015-09-27