unix – ‘rm -rf /’ コマンドでどこまで取得できますか?

filesystems rm unix

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


テクノミュージックを聴きながら視覚的にこういったことをするのが好きな方に

Linux で rm-rf を実行する (動画)

彼らが死に始めるとプロセスに名前を付けることができればボーナスポイント

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標準に違反していることが示唆されているので、最近の実装では許可されるべきではありません

rm -rf /“オラクルブログの保護

いずれにしても、最終的には仕様を修正してもらい、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を使って実行した簡単なテストを紹介します

  1. vagrant経由で仮想マシンを初期化します

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. そうすると、標準的な方法ですべてのファイルを削除しようとすると、そうさせてくれません

    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
    
  3. では、--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


タイトルとURLをコピーしました