我没有在Ubuntu上尝试过这个命令(出于显而易见的原因),所以我不确定Ubuntu是否允许执行它。但是它以删除所有文件而闻名。只是出于好奇,当内核和
/bin
被删除时会发生什么?rm
如何维护运行时堆栈?rm
如何与文件系统通信并完成删除?它如何与硬件通信?/bin
被删除时会发生什么?rm
如何维护运行时堆栈?rm
如何与文件系统通信并完成删除?它如何与硬件通信?侧边栏/更新:根据David Hoelzer的回答(并在评论中提到),硬链接/bin/rm
指向的inode会一直保持直到rm
完成(因为Linux处于打开状态)但是这个事实是无关紧要的;磁盘的状态根本不重要。
在运行之前,二进制文件被加载到内存中。即使你能手动销毁rm
的磁盘数据,也不会影响或停止删除操作的完成(假设你没有以其他方式使磁盘不可用)。
find / -exec rm {} \;
find / -exec rm -rf {} +
和find / -print0 | xargs -0 rm -rf
也很可能会失败,因为它们都有参数限制,这意味着在再次调用之前它们只能删除一定数量的文件。在整个过程中,/bin/rm
可能会过期(并且被释放),而其他文件还没有被删除。虽然不能保证,但如果/bin/
是最后一个进入的目录,这些方法可能会起作用。find / -exec rm {} \+
- Desty/bin/rm
不足以作为最后一批中的结束标志;-exec ... {} +
(反斜杠转义是不必要的)仍然会导致多次执行;不是每个文件一次,而是根据可以适应ARG_MAX的参数数量来进行分批执行。 - Charles Duffyssh
连接一直保持打开状态,直到操作结束。只有当我关闭连接并尝试重新打开时,才出现了一个错误:
在机器上,还剩下四个目录: 这意味着剩下的不多,也没有什么可做的了。你不能使用从套接字读取失败:对等方重置了连接
ls
命令(尽管在使用键时,目录和文件的名称仍然会显示)。你可以在不同的目录中使用cd
命令,并且可以使用echo
命令,但是像cat
这样的命令已经不再可用。sudo
命令可用。
shutdown -h now
和reboot
也消失了,所以你唯一的选择似乎是手动关闭机器。注销(exit
)无效,即使它显示一个漂亮的“注销”文本。rm
命令可能对系统造成了一些破坏。
不,等等,不要在你的机器上这样做!
相反,你可以运行一个虚拟机(VM)。虚拟机的好处是使实验变得非常容易。由于你正在使用Ubuntu,你可能会对vmbuilder感兴趣。这是一个工具,可以让你在几分钟内部署虚拟机(官方文档声称可以在“大约一分钟”内完成,但实际时间,即使在快速硬件上,也需要大约两三分钟)。
一旦部署结束,你就有了一个可以玩耍的环境。如果你最终将其销毁,没关系:你再次部署该机器,两分钟后你就可以继续。
如果你使用像VMWare这样的软件,你可能还对快照感兴趣(请注意,免费的VMWare Player没有此功能;你必须购买VMware Workstation)。请注意,Hyper-V是免费的并支持快照(但你必须运行Windows)。
快照的好处在于你可以在几毫秒内拍摄一张。回滚到快照需要更长时间,但通常只需几秒钟。这使得实验变得更加容易和快速。rm
并不能真正从硬盘上擦除文件,它只是将磁盘上的实际数据与文件系统树“解除关联”,标记为可用(以便在正常的计算机使用中可能被覆盖)。所以,如果你执行rm -rf ~
,并不是所有的东西都会丢失,只要你迅速采取行动(例如使用extundelete
)。你可以把它想象成你邮箱中“已删除”文件夹的更不可靠版本,如果你不等待太久,你可以找回文件,但最终它将被清除。 - Thomasrm
而是使用了 shred
,那基本上就是游戏结束了,不过你可能会有时间意识到自己的错误并中止操作,因为 shredding 需要更长的时间。 - Thomasls
已经不存在了,for i in /*; do echo $i; done
应该能够正常工作。而要替代cat
,你可以使用类似这样的命令while read i; do echo $i; done < /proc/self/maps
。 - MvGls
看到的)实际上只是为了方便你。文件系统驱动程序和内核只关心inode。当通过名称引用文件时,它会立即转换为包含所有元数据的inode,包括权限、磁盘上的数据块、所有者ID、组ID和链接计数。unlink
。底层发生的是,指向该inode的链接计数(文件命名层中的文件名数目)被减少。当链接计数达到零时,文件系统知道文件已被删除。rm
删除文件时,它还会编辑目录文件(是的,它只是一个包含文件名和inode以及其他一些对于本答案不重要的位的文件)。然而,解除链接才是实际释放磁盘资源的操作。rm -rf /
命令删除/bin/rm
的入口时,就会发生这种情况。文件是打开的(存在一个文件句柄),但是inode被标记为已删除(链接计数为0)。直到文件句柄关闭,磁盘资源才不会被释放和重用。/proc
中删除任何内容,因为它是一个只读文件系统。同样适用于/sys
。我相信你也不能删除挂载点。 - Briancd
这样的命令时,它调用的是该名称的shell内置命令--该命令是内置于shell而不是内核中的。)你是指Alt+SysRq "命令"吗? - Eliah Kagan/dev/pts
,因为它是一个挂载点。(而且还是一个只读文件系统。) - Brian
rm -rf /
不带--no-preserve-root
参数是不会删除任何文件的。 - mururm
**,而不是你应该教人们依赖的东西。在更标准的系统上,rm -rf /
确实会删除所有内容。 - R.. GitHub STOP HELPING ICE