‘rm -rf /’如何能够删除系统中的所有文件?

‘rm -rf /’如何能够删除系统中的所有文件?

我还没有在 Ubuntu 上尝试过这个命令(原因很明显),所以我不确定 Ubuntu 是否允许执行它。但它以删除所有内容而闻名。只是出于好奇,当内核和/bin被删除时会发生什么?它如何rm维护运行时堆栈?它如何rm设法与文件系统通信并完成删除?它如何与硬件通信?

答案1

删除了也没关系/bin/rm。它只运行一次,到那时它就全部加载到内存中,就像继续将删除发送到文件系统和磁盘所需的一切一样。


侧边栏/更新:David Hoelzer 的回答/bin/rm(并在评论中提到),硬链接指向的inode将一直保留直到rm完成(因为 Linux 保持开放状态)这个事实无关紧要;磁盘的状态根本不重要。

二进制文件在运行前会加载到内存中。即使您可以手动销毁rm磁盘数据,也不会影响或阻止删除操作的完成(假设您不会使磁盘不可用)。

不知道 inode 或硬链接是什么?这是我找到的答案。


无论如何,这也是你可以删除当前的内核,计算机就不会崩溃。只要安装不同的版本,计算机就能启动。

再次,这是有效的,因为rm只调用一次。以下死后失败/bin/rm,因为它对每个文件名都调用一次:

find / -exec rm {} \;

尽管如此,find / -exec rm -rf {} +并且find / -print0 | xargs -0 rm -rf也都可能会失败,因为它们都有参数限制,这意味着它们只会删除一定数量的文件,然后才会再次被调用。在旅程的某个时刻,/bin/rm可能会过期(在删除其余文件之前,这些方法是否能够释放它们。但这并不能保证。如果/bin/是最后进入的目录,则这些方法可以工作。

答案2

我还没有在 Ubuntu 上尝试过这个命令(原因很明显),所以我不确定 Ubuntu 是否允许执行它。

我做到了。rm -rf / --no-preserve-root正在直接在机器上打开的 root 会话中运行,同时我也从另一台机器连接ssh,并使用 root 帐户。

接下来发生的事情是你开始得到很多类似以下的消息:

rm:无法删除‘/…’:操作不允许

或者:

rm:无法删除‘/…’:设备或资源繁忙

在此处输入图片描述

令人惊讶的是,ssh连接一直保持打开状态直到操作结束。只有当我关闭连接并尝试重新打开它时,才会出现错误:

从套接字读取失败:对端重置连接

在机器上,保留四个目录:

  • /dev. 这是存储设备文件的地方。
  • /proc—由内核创建的内存文件系统。
  • /run,守护进程的标准化文件系统位置。
  • /sys。这可让您获取有关系统及其组件的信息。

这意味着剩下的不多了,也没什么可做的了。你不能ls(虽然使用时Tab,目录和文件的名称仍然会显示)。你可以cd在不同的目录中,也echo可以在其他地方,但是诸如此类的命令cat不再可用。

也没有sudo

shutdown -h nowreboot消失了,所以你唯一的选择似乎是手动关闭机器。注销(exit)不起作用,即使它显示了一个很好的“注销”文本。

一旦您尝试重新启动机器,您就会看到一个 GRUB 错误 15,然后什么都没有发生,此时您可能会开始认为您rm可能对系统做了一些不好的事情。

在此处输入图片描述

你也可以做到

不,等等,不要在你的机器上这样做!

你可以做的是运行虚拟机。虚拟机的优点是实验变得非常简单。由于您使用的是 Ubuntu,您可能对以下内容感兴趣虚拟机生成器这是一个允许您在几分钟内部署虚拟机的工具(官方文档声称它可以在“大约一分钟内”完成,但实际时间,即使在快速硬件上,也需要大约两到三分钟)。

部署结束后,您便拥有了一个可以操作的环境。如果您最终将其破坏,也没关系:您再次部署机器,两分钟后即可继续。

如果您使用 VMWare 等软件,您可能还会对以下内容感兴趣快照(请注意,免费的 VMWare Player 没有此功能;您必须购买 VMware Workstation)。请注意,Hyper-V 是免费的,并且支持快照(但您必须运行 Windows)。

快照的好处是您可以在几毫秒内拍摄一张快照。回滚到快照需要更长时间,但通常只需几秒钟。这使得实验更加轻松快捷。

这种实验并不局限于操作系统本身。你可以做各种涉及软件的事情。有可疑的应用程序?在虚拟机中测试它——如果它是病毒,它不会造成任何危害。想要测试数据库上的操作,因为它可能会影响环境?在虚拟机中测试它。

如果您在真实的非测试机器上执行此操作会怎样?

坏事发生了。请注意,rm保护您免受自身伤害:rm -rf /不起作用:您需要使用--no-preserve-root。但是,如果您实际上错误地删除了所有内容,该怎么办?

rm仅取消链接文件,但数据仍然存在于您的硬盘上。这样以后就可以恢复数据(这就是为什么当您的硬盘不再工作时,不应该直接扔掉包含敏感数据的硬盘)。

这意味着你只需要有一台带有硬盘盒的备用电脑就可以恢复几乎全部文件。重要的是避免将任何内容写入硬盘以进行恢复:您写入的数据将覆盖未链接的文件。

正如 200_success 评论中的文章所述,如果你聪明的话,即使没有备用 PC,你也可以找回机器。如果你只关心数据,我不会费心——用备用 PC 恢复它要容易得多。

答案3

原因是文件命名层(您看到的ls)实际上只是为了方便您使用。文件系统驱动程序和内核只关心 inode 是什么。当通过名称引用文件时,它会立即转换为包含所有元数据(包括权限、磁盘上的数据块、所有者 ID、组 ID 和链接计数)的 inode。

链接计数在这里才是真正重要的。当您在 UNIX 系统上删除文件时,实际的系统调用是unlink。底层发生的事情是指向该 inode 的链接计数(文件命名层中的文件名数量)会减少。当链接计数达到零时,文件系统就知道文件已被删除。

当文件被删除时,rm它也会编辑目录文件(是的,它只是一个包含文件名和 inode 的文件,此外还有一些其他对这个答案不重要的位)。但是,取消链接实际上释放了磁盘资源。

这会导致其他一些有趣的效果。首先,可以打开一个文件,其链接数为零。当rm -rf /删除 的条目时会发生这种情况/bin/rm。文件已打开(有一个文件句柄),但 inode 被标记为已删除(链接数 = 0)。在文件句柄关闭之前,不会释放和重新使用磁盘资源。

另一个有趣的效果是,当您拥有一个链接数大于零但文件命名层中没有任何内容指向它的 inode 时,会发生什么情况。从某种意义上说,这是一个隐藏得很好的文件 :)。要访问它,您必须使用一些低级的东西来通过 inode 编号而不是名称来引用它(因为没有名称)或使用十六进制编辑器编辑目录条目以指向 inode。

第三个有趣的效果是,如果您将链接计数减少到零,但仍然将目录条目指向 inode,会发生什么情况。如果您愿意,我会让您自己尝试。但显然,后两种情况都会导致文件系统处于不一致状态。

答案4

一旦从硬盘中删除所有内容,内核仍然可以工作,但由于没有设备、程序、命令等,因此会卡住。

该操作系统将不再运行。

Oli 所说的是对的,该命令会被加载/执行到内存中,除非你终止该进程,否则没有什么能够阻止它(当然,如果 kill 命令仍然存在 ^^)。

相关内容