我在这里看到过一些问题,人们在做出反应之前意外地rm -rf --no-preserve-root
删除rm -rf *
了大部分或全部文件系统。
是否有理由使用--no-preserve-root
,无论是在正常使用中,作为开发人员还是管理员?
答案1
重要的:现代系统(配备 UEFI 的计算机和使用基于 systemd 的发行版)将固件挂载到该/sys
目录下并提供给操作系统。不要运行此命令在现代系统上,因为它将删除该固件,从而实质上使您的机器变砖。信息。
我能想到的最简单的情况是有人想从他们的驱动器中删除所有数据。这样做可能有完全正当的理由,我能想到的最简单的方法是
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
。在这种情况下,rm -rf --no-preserve-root /
将删除环境中的系统chroot
,但您的系统将保持不变。
我确信还有更多可能的原因,但总的来说,我的系统允许我做任何我想做的事情,这似乎是一种非常合理的方法。我的工作就是小心谨慎,系统应该只允许我做我想做的事情。如果我想要的很愚蠢,那是我的问题,而不是操作系统的问题。
无论如何,这是一个相对较新的限制,它被添加到第七版POSIX 规范(前一个在此处),在此之前,这rm -rf /
是一个完全有效的命令。从历史上看,自 1979 年首次获得删除目录的能力以来,.
和..
目录一直受到保护。有关更多信息rm
rm
这里。
答案2
开关的存在--no-preserve-root
不是为了添加附加功能,但覆盖非常合理的功能减少。这种转变很可能基于这样的理念:计算机应该按照指令行事,并且应该有命令来表达任何所需的操作。这种转变早于 UEFI,根据我的经验,我认为它现在已经过时了。
在现代实践中,如果没有这个开关,rm
命令就会避免在使用未初始化的变量或杂散空间时意外删除根目录。
rm -rf /${my_directory}
rm -rf / var/log/httpd/*
有趣的脚注:保护不是其目的。根据 Sun Microsystems 博客,删除目录/
将隐式删除当前工作目录,这违反了已经为.
和..
目录做出的特殊考虑。这就是他们的标准委员会允许这一特殊例外的原因——不是为了防止事故。这一变化首次在 Solaris 10 build 36 中引入。
答案3
也许这不是原提问者想要的答案,但是有一个用例需要从根目录递归删除所有文件。虽然不是通过命令rm
,但它是开关根(8)在您的(非嵌入式)Linux 系统启动期间的过程。