我没有在Ubuntu上尝试过此命令(出于明显的原因),所以我不确定Ubuntu是否允许执行。但是它以删除所有内容而闻名。出于好奇,/bin
删除内核和后会发生什么?如何rm
维护运行时堆栈?如何rm
管理与文件系统的通信并完成删除?它如何与硬件通信?
我没有在Ubuntu上尝试过此命令(出于明显的原因),所以我不确定Ubuntu是否允许执行。但是它以删除所有内容而闻名。出于好奇,/bin
删除内核和后会发生什么?如何rm
维护运行时堆栈?如何rm
管理与文件系统的通信并完成删除?它如何与硬件通信?
Answers:
/bin/rm
删除都没关系。它只运行一次,到那时它都已加载到内存中,其他所有将删除内容继续发送到文件系统和磁盘所需的条件也是如此。
补充工具栏/更新:根据David Hoelzer的回答(并在评论中提到),/bin/rm
用于指向的硬链接的inode 会一直保持到rm
完成为止(因为Linux处于打开状态),但是这一事实无关紧要;磁盘的状态根本不重要。
二进制文件在运行之前已加载到内存中。即使您可以手动销毁rm
磁盘数据,也不会影响或阻止删除操作的完成(假设您不会使磁盘不可用)。
无论如何,这也是为什么您可以删除当前内核的软件包而不会导致计算机崩溃的原因。只要您安装其他版本,它就可以启动。
同样,这是有效的,因为rm
只被调用了一次。以下内容在死亡后将失败,/bin/rm
因为它为每个文件名调用一次:
find / -exec rm {} \;
这就是说,find / -exec rm -rf {} +
和find / -print0 | xargs -0 rm -rf
也将很可能都失败,因为他们都有一个参数限制,这意味着他们不仅会被再次调用之前删除一些文件。在此过程中的某个时刻,它/bin/rm
可能在删除其余文件之前过期(并被释放)。虽然不能保证。如果/bin/
输入的是最后一个目录,则这些方法可以使用。
/bin/rm
距离不够近,直到最后一批都没有结束,那就不会成功;-exec ... {} +
(不需要使用反斜杠转义)仍然会导致多次执行;不是每个文件一个,而是根据ARG_MAX可以容纳的参数数量,每批一个。
我没有在Ubuntu上尝试过此命令(出于明显的原因),所以我不确定Ubuntu是否允许执行。
是的 rm -rf / --no-preserve-root
在直接在计算机上打开的root会话中运行,而我也ssh
使用root帐户通过另一台计算机进行连接。
发生的是,您开始收到很多消息,例如:
rm:无法删除“ / ...”:不允许操作
要么:
rm:无法删除“ / ...”:设备或资源正忙
令人惊讶的是,ssh
连接一直保持打开状态,直到操作结束。只有当我关闭连接并尝试重新打开它时,才会出现错误:
从套接字读取失败:对等连接重置
在计算机上,保留四个目录:
这意味着剩下的东西不多了,要做的事情也不多。您不能ls
(尽管使用时Tab,仍显示目录和文件的名称)。您可以cd
在不同的目录中,也可以在目录中,echo
但是诸如之类的命令cat
不再可用。
也没有sudo
。
shutdown -h now
并且reboot
消失了,所以您唯一的选择似乎是手动关闭机器。exit
即使注销()显示出漂亮的“注销”文字,也无法正常工作。
尝试重新启动计算机后,会看到一个不错的GRUB错误15,然后什么也没有发生,这时您可能会开始认为rm
可能对系统造成了不良影响。
不,等等,不要在您的机器上这样做!
您可以做的是运行虚拟机。虚拟机具有使实验变得非常简单的优势。由于您使用的是Ubuntu,因此您可能会对vmbuilder感兴趣。这是一个允许您在几分钟之内部署虚拟机的工具(官方文档声称它可以“在大约一分钟内”完成,但是即使在快速的硬件上,实际时间也要大约两到三分钟) 。
部署结束后,您便可以使用一个环境。如果最终销毁了它,没关系:您再次部署计算机,两分钟后您可以继续。
如果您使用诸如VMWare之类的软件,则您可能也对快照感兴趣(请注意,免费的VMWare Player没有此功能;您必须购买VMware Workstation)。请注意,Hyper-V是免费的,并且支持快照(但是您必须运行Windows)。
快照的好处是您可以在几毫秒内拍摄一张快照。回滚快照需要更长的时间,但通常只需几秒钟。这使实验变得更加轻松快捷。
该实验不限于操作系统本身。您可以做涉及软件的各种事情。得到了可疑的应用程序?在VM中进行测试-如果是病毒,则不会造成任何危害。是否要测试数据库上的某个操作,因为它可能会影响环境?在VM中进行测试。
坏事发生了。请注意,这样做rm
可以保护您免受自身伤害:rm -rf /
无效:您需要使用--no-preserve-root
。但是,如果您实际上错误地删除了所有内容,该怎么办?
rm
仅取消链接文件,但数据仍在硬盘上。这样就可以在以后恢复它(这就是为什么当硬盘不再工作时,不应该只丢弃带有敏感数据的硬盘)。
这意味着您只需拥有一台带硬盘驱动器机箱的备用PC,即可实际上恢复几乎所有文件。重要的是要避免将任何内容写入硬盘以进行恢复:您写入的数据将覆盖未链接的文件。
如200_success注释中的文章所述,如果您行事明智,即使没有备用PC也可以将机器收回。如果您只关心数据,那么我就不会打扰-使用备用PC恢复数据要容易得多。
rm
并没有真正清除硬盘驱动器上的内容,它只是从文件系统树中“取消链接”(取消关联)磁盘上的实际数据,将其标记为空闲(以便最终可能由于正常的计算机使用而被覆盖)。因此,如果您说的话,rm -rf ~
只要您迅速采取行动(例如使用extundelete
),就不会迷失一切。您可以将其视为邮箱中“已删除”文件夹的更为不可靠的版本,如果您等待的时间不长,则可以找回东西,但最终它将被清除。
rm
but shred
,那么它就结束了很多,尽管您可能有时间意识到错误并中止,因为切碎需要更长的时间。
ls
不见了,for i in /*; do echo $i; done
应该工作。要替换,cat
您可以使用类似的命令while read i; do echo $i; done < /proc/self/maps
。
原因是文件命名层(通过可以看到ls
)实际上只是为了您的方便。文件系统驱动程序和内核仅关心inode是什么。当通过名称引用文件时,该文件将立即转换为包含所有元数据的索引节点,包括权限,磁盘上的数据块,所有者ID,组ID和链接计数。
链接数才是真正重要的。在UNIX系统上删除文件时,实际的系统调用是unlink
。实际情况是指向该索引节点的链接计数(文件命名层中文件名的数量)减少了。当链接计数达到零时,文件系统知道已删除文件。
当文件被删除时,rm
它还将编辑目录文件(是的,它只是一个文件,其中包含文件名和索引节点以及其他一些对于此答案不重要的位)。但是,实际上是通过取消链接释放磁盘资源。
这导致了其他一些有趣的效果。首先,可以打开一个链接数为零的文件。rm -rf /
删除的条目时会发生这种情况/bin/rm
。文件已打开(有文件句柄),但索引节点标记为已删除(链接计数= 0)。在关闭文件句柄之前,不会释放并重新使用磁盘资源。
另一个有趣的效果是,当一个inode的链接数大于零,但在文件命名层中没有指向它的索引时,会发生什么。从某种意义上说,这是一个很好的隐藏文件:)。要访问它,您将不得不使用低级的东西来按索引节点编号而不是名称进行引用(因为没有索引),或者使用十六进制编辑器编辑目录条目以指向索引节点。
第三个有趣的效果是,如果将链接数减少为零,但仍将目录条目指向inode,则会发生什么。如果您愿意,我会留给您进行试验。但是,很显然,这最后两个都导致文件系统处于不一致状态。
先前的答案很好,但我想澄清一个细节:
rm
不只是命令 这是一个可在中找到的程序PATH
。
因此,执行时将发生以下情况:
rm -rf /
rm
使用参数-rf
和/
rm
开始其操作(遍历已安装/分区中的所有内容,然后递归删除对其的引用[对技术性表示抱歉;]))rm
卸载程序实例只是为了了解其工作原理,请尝试在ubuntu(在Virtualbox中),一些脚本和PHP操作码缓存上安装LAMP,然后调用此错误命令。令人惊讶的是(如果您很幸运,并且您的操作码缓存不会注意到php文件被删除),您仍然可以通过apache网络服务器从外部访问php脚本!
PS:这个邪恶的命令甚至以root身份运行,不会删除everything
,它无法从中删除某些内核特权进程/proc
,也无法从/dev
系统中以文件形式显示的设备中删除某些内容。实际上,root并没有我们想象的那么全能,而内核却是。
PPS:另外,您还想拥有locked
删除尝试时另一个进程处理过的文件。
/proc
其中删除任何内容,因为它是只读文件系统。同样适用于/sys
。我相信您也无法删除挂载点。
/dev/pts
它,因为它是安装点。(还有一个只读文件系统。)
一旦硬盘中的所有内容全部清除,内核仍然可以正常工作,但由于没有设备,程序,命令等,因此仍然存在问题。
该操作系统将无法正常工作。
确实,Oli所说的是,该命令被加载/执行到内存中,除非您终止该进程(当然,如果kill命令仍然存在^^),也没有什么能阻止它。
rm -rf /
没有不会删除任何东西--no-preserve-root
。