web-dev-qa-db-ja.com

rm -rf -no-preserve-rootが必要なシナリオはありますか?

ここで、人々が誤ってrm -rf --no-preserve-rootまたはrm -rf *を実行し、反応する前にほとんどまたはすべてのファイルシステムを一掃してしまう質問をいくつか見ました。

--no-preserve-rootを通常の使用において、開発者として、または管理者として使用する理由はありますか?

31
Nzall

重要:最新のUEFIシステムは、_/sys_ディレクトリの下にファームウェアをマウントし、OSで利用できるようにします。 最新のシステムではこのコマンドを実行しないでくださいと、ファームウェアが削除され、基本的にマシンがブリックされます。


私が考えることができる最も単純なシナリオは、ドライブからすべてのデータを削除したい人です。これを行うには完全に正当な理由があり、私が考えることができる最も簡単な方法は

_rm -rf --no-preserve-root /
_

これは実際には_info rm_の例として与えられています:

_`--no-preserve-root'
    Do not treat `/' specially when removing recursively.  This option
    is not recommended unless you really want to remove all the files
    on your computer. 
_

別の完全に良い理由は、chroot- edしたマウント済みのファイルシステムを削除することです。その場合、_rm -rf --no-preserve-root /_はchroot環境のシステムを削除しますが、システムはそのまま残します。

考えられる理由は他にもあると思いますが、一般的に、私のシステムで私がやりたいことを何でもできるというのは非常に合理的なアプローチのようです。注意するのは私の仕事です。このシステムでは、自分がやりたいことだけを実行できるようにする必要があります。私が欲しいものが愚かであれば、それは私の問題であり、OSの問題ではありません。

とにかく、これは比較的新しい制限です。POSIX仕様の 7番目のバージョン に追加されました( 以前のもの はこちら) )、その前は_rm -rf /_は完全に有効なコマンドでした。歴史的に、_._および_.._ディレクトリは、rmが最初にディレクトリを削除する機能を獲得した1979年以来、常にrmから保護されてきました。詳しくは こちら をご覧ください。

34
terdon

--no-preserve-rootスイッチの存在は、add追加機能ではなく、override機能の非常に健全な減少。このスイッチは、コンピュータが指示された動作を実行し、コマンドを使用して必要なアクションを表現できるという哲学に基づいている可能性があります。このスイッチはUEFIよりも古いものであり、私の経験に基づいて、現在は廃止されていると言います。

現代の慣例では、このスイッチがない場合、rmコマンドは、初期化されていない変数または浮遊スペースを使用しているときにルートディレクトリが誤って削除されるのを防ぎます。

rm -rf /${my_directory}
rm -rf / var/log/httpd/*

楽しい脚注:保護はその意図ではありませんでした。 Sun Microsystemsブログによれば、/ディレクトリを削除すると、現在の作業ディレクトリが暗黙的に削除されます。これは、.および..ディレクトリに対してすでに行われている特別な考慮事項に違反しています。これが、標準委員会が事故を防止するためではなく、この特別な例外を認めた理由です。この変更は、Solaris 10ビルド36で初めて導入されました。

http://archive.is/5lmc9

13
durette

おそらく、これは元の質問者が望んでいる答えではありませんが、ルートディレクトリからすべてのファイルを再帰的に削除する必要があるユースケースがあります。これはrmコマンドを介したものではありませんが、(非組み込み)Linuxシステムの起動中の switch_root(8) プロセスの一部です。

1
Explorer09