是否存在需要 rm -rf -no-preserve-root 的场景?

Nza*_*all 35 linux unix rm

我在这里看到了一些问题,人们不小心做了rm -rf --no-preserve-rootrm -rf *,在他们做出反应之前擦除了大部分或全部文件系统。

是否有理由使用--no-preserve-root,无论是在正常使用中,作为开发人员还是作为管理员?

ter*_*don 35

重要提示:现代 UEFI 系统将固件安装在/sys目录下并使其可用于操作系统。不要在现代系统上运行这个命令,因为它会删除这个固件,本质上是让你的机器变砖。


我能想到的最简单的情况是有人想要从他们的驱动器中删除所有数据。这样做可能有完全合理的理由,我能想到的最简单的方法是

rm -rf --no-preserve-root /
Run Code Online (Sandbox Code Playgroud)

事实证明,这实际上是在以下示例中给出的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. 
Run Code Online (Sandbox Code Playgroud)

另一个很好的理由是您想删除已安装的已安装文件系统chroot。在这种情况下,rm -rf --no-preserve-root /将删除chroot环境中的系统,但会保留您的完整系统。

我确信有更多可能的原因,但总的来说,我的系统允许我用它做任何我想做的事情似乎是一种非常合理的方法。小心是我的工作,系统应该只让我做我想做的事。如果我想要的是愚蠢的,那是我的问题而不是操作系统的问题。

无论如何,这是一个相对较新的限制,它是在POSIX 规范的第 7 版前一个在这里)中添加的,在此之前rm -rf /是一个完全有效的命令。根据历史记录,自 1979 年第一次获得删除目录的能力以来,...目录一直受到保护。更多关于这里rmrm

  • 如果您的系统是 UEFI(新计算机),请勿使用它来删除所有数据。这样做会删除所有固件变量并导致主板像砖块一样无用 (26认同)
  • 清空驱动器的正确方法是重新格式化其分区(或完全重新分区)。并非所有的文件系统都是硬盘,因此使用 `rm -rf /` 你可以通过某人的 NFS/CIFS/SSHFS 挂载来清空远程机器。 (21认同)
  • @Tarka:/sys/firmware/efi/efivars/ 可能已挂载,递归删除可能会删除这些变量。它真的不应该使系统变砖,但可能会。见 http://thenextweb.com/insider/2016/02/01/running-a-single-delete-command-can-permanently-brick-laptops-from-inside-linux/ (15认同)
  • @SuiciDoga:来源,或进一步解释?主板固件不应该存储在硬盘上,否则如果你猛拉驱动器,它们就会丢失。 (6认同)
  • @Tarka 它们没有存储在 HDD 上,并且猛拉驱动器不会影响它们。但是,出于我尚未理解的原因,它们已安装,因此实际上可以在`/` 下访问。 (4认同)

dur*_*tte 19

--no-preserve-root开关的存在不是为了添加额外的功能,而是为了覆盖功能的非常合理的减少。这种切换很可能基于这样一种哲学,即计算机应该按照它的指示去做,并且应该可以使用命令来表达任何所需的操作。这个开关早于 UEFI,根据我的经验,我说它现在已经过时了。

在现代实践中,如果没有此开关,该rm命令可避免在使用未初始化的变量或杂散空间时意外删除根目录。

rm -rf /${my_directory}
rm -rf / var/log/httpd/*
Run Code Online (Sandbox Code Playgroud)

有趣的脚注:保护不是它的意图。根据 Sun Microsystems 博客,删除/目录将隐式删除当前工作目录,这违反了已经对...目录进行的特殊考虑。这就是为什么他们的标准委员会允许这种特殊的例外——而不是为了防止事故。此更改首先在 Solaris 10 build 36 中引入。

http://archive.is/5lmc9