当你刚接触 Linux 时,你会经常遇到这样的建议:永远不要运行 sudo rm -rf /
。在 Linux 世界里,更是围绕着 sudo rm -rf
有很多梗。
但似乎对于它也有一些混乱的认识。在 清理 Ubuntu 以腾出空间 的教程中,我建议运行一些涉及 sudo
和 rm -rf
的命令。一位读者问我,如果 sudo rm -rf
是一个不应该运行的危险的 Linux 命令,我为什么要建议这样做。
因此,我想到了写一篇 Linux 黑话解释,以消除误解。
sudo rm -rf 在做什么?
让我们按步骤来学习。
rm
命令用于 在 Linux 命令行中删除文件和目录。
-
$ rm agatha
-
$
但是因为有只读的 文件权限,有些文件不会被立即删除。它们必须用选项 -f
强制删除。
-
$ rm books
-
rm: remove write-protected regular file 'books'? y
-
$ rm -f christie
-
$
另外,rm
命令不能被用来直接删除目录(文件夹)。你必须在 rm
命令中使用递归选项 -r
。
-
$ rm new_dir
-
rm: cannot remove 'new_dir': Is a directory
因此最终,rm -rf
命令意味着递归地、强制删除指定的目录。
-
$ rm -r new_dir
-
rm: remove write-protected regular file 'new_dir/books'? ^C
-
$ rm -rf new_dir
-
$
下面是上述所有命令的截图。
解释 rm 命令的例子
如果你在 rm -rf
命令前加入 sudo
,你就是在删除具有 root 权限的文件。这意味着你可以删除由 root 用户 拥有的系统文件。
所以,sudo rm -rf 是一个危险的 Linux 命令?
嗯,任何删除东西的命令都可能是危险的,如果你不确定你正在删除什么。
把 rm -rf
命令看作一把刀。刀是一个危险的东西吗?有可能。如果你用刀切蔬菜,那是好事。如果你用刀切手指,那当然是不好的。
rm -rf
命令也是如此。它本身并不危险。它只是用来删除文件的。但是,如果你在不知情的情况下用它来删除重要文件,那就有问题了。
现在来看看 sudo rm -rf /
。
你知道,使用 sudo
,你是以 root 身份运行一个命令,这允许你对系统进行任何改变。
/
是根目录的符号。/var
表示根目录下的 var
目录。/var/log/apt
指的是根目录的 log
目录下的 apt
目录。
Linux 目录层次表示法
按照 Linux 目录层次结构,Linux 文件系统中的一切都从根目录开始。如果你删除了根目录,你基本上就是删除了系统中的所有文件。
这就是为什么建议不要运行 sudo rm -rf /
命令,因为你会抹去你的整个 Linux 系统。
请注意,在某些情况下,你可能正在运行像 sudo rm -rf /var/log/apt
这样的命令,这可能是没问题的。同样,你必须注意你正在删除的东西,就像你必须注意你正在用刀切割的东西一样。
我在玩火:如果我运行 sudo rm -rf /,看看会发生什么呢?
大多数 Linux 发行版都提供了一个故障安全保护,防止意外删除根目录。
-
$ sudo rm -rf /
-
[sudo] password for abhishek:
-
rm: it is dangerous to operate recursively on '/'
-
rm: use --no-preserve-root to override this failsafe
我的意思是,人是会打错字的,如果你不小心打了 / var/log/apt
,而不是 /var/log/apt
(/
和 var
之间的空格意味着你给出了 /
和 var
目录来删除),你将会删除根目录。(LCTT 译注:我真干过,键盘敲的飞起,结果多敲了一个空格,然后就丢了半个文件系统 —— 那时候 Linux 还没这种故障安全保护。)
使用 sudo rm -rf 时要注意
别担心。你的 Linux 系统会照顾到这种意外。
现在,如果你一心想用 sudo rm -rf /
来破坏你的系统呢?你将必须使用它将要求你使用的 -no-preserve-root
选项与之配合。
不,请不要自己这样做。让我做给你看看。
所以,我在一个虚拟机中运行基本的操作系统。我运行 sudo rm -rf / --no-preserve-root
,你可以在下面的视频中看到灯光熄灭(大约 1 分钟)。