星期一上午错误:sudo rm -rf –no-preserve-root /

请注意:这个问题的答案和评论包含了另外一个类似问题的内容,这个问题已经得到外界媒体的广泛关注,但在某种病毒式营销scheme中却变成了骗局问题。 由于我们不允许以这种方式滥用ServerFault,所以原来的问题已经被删除,答案与这个问题合并。


这是一个有趣的悲剧。 今天早上,我错误地执行了下面的命令,在生产服务器上做了一些维护:

sudo rm -rf --no-preserve-root /mnt/hetznerbackup /

在几秒钟之前,我没有发现最后一个空间,当警告淹没我的命令行时,我意识到我刚刚击中了自毁button。 这是我眼中的一些东西:

 rm: cannot remove `/mnt/hetznerbackup': Is a directory rm: cannot remove `/sys/fs/ecryptfs/version': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/inode_readahead_blks': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/mb_max_to_scan': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/delayed_allocation_blocks': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/max_writeback_mb_bump': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/mb_stream_req': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/mb_min_to_scan': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/mb_stats': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/trigger_fs_error': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/session_write_kbytes': Operation not permitted rm: cannot remove `/sys/fs/ext4/md2/lifetime_write_kbytes': Operation not permitted # and so on.. 

当我发现生产服务还在运行时,我停止了这个任务,并松了一口气。 可悲的是,服务器不再通过SSH接受任何用户的公钥或密码。

你将如何从这里前进? 我会游过铁丝网的海洋,让SSH访问回来。

服务器运行Ubuntu-12.04并在Hetzner上托pipe。

启动Hetzner提供的救援系统,检查你所做的损害。
将任何文件转移到安全位置,然后重新部署服务器。

恐怕这是你的情况最好的解决scheme。

事实是? 在这一点上,没有简单/容易的自动修复。 数据恢复是一门科学 ,即使是基本的常用工具也需要有人坐下来确保数据的存在。 如果您希望在没有大量停机的情况下恢复,您将会感到失望。

我build议使用testing磁盘一些文件系统特定的恢复工具。 尝试一个系统,看看它是否工作,等等。 有没有真正的方法来自动化的过程, 你可以仔细做批量。

也就是说,在问题和评论中有几件非常可怕的事情应该成为你的事后报告的一部分。

首先,你到处运行命令,而不是先检查它。 在一个盒子上运行一个命令。 然后几个,然后更多。 基本上如果出了什么问题,最好让它影响一些而不是所有的系统。

其次

@Tim如何在服务器上安装远程驱动器的情况下进行备份?

吓到我。 文件级别的单向备份是一个解决的问题 。 Rsync可以用来保留权限并将文件复制到备份站点。 意外的东西? 重新安装(最好自动)rsync回来,事情工作。 将来,您可以使用带有btrfs或zfs快照的文件系统级快照,并将这些快照发送给系统级备份。 我实际上玩弄分离的应用程序服务器,数据库和存储,并介绍最小特权的原则,所以你会分裂的风险这样的事情..

我知道有什么我可以做的。 我现在需要考虑如何保护自己

事情发生后是考虑这个最糟糕的时候。

我们可以从中学到什么?

  1. 备份保存数据。 可能的职业。
  2. 如果你有一个工具,而且不知道它能做什么,那它是危险的。 绝地武士可以用光剑做出惊人的事情。 一个房间的光秃秃的黑猩猩…会变得混乱。
  3. 切勿立即在任何地方运行命令。 分出testing和生产机器,最好是分阶段生产机器。 它更好地修复1或10台机器,而不是100或1000。

  4. 双重和三重检查命令。 要求同工仔细检查“嘿,我即将驾驶一辆汽车,你能理智地检查一下,所以我最终不会擦拭驾驶汽车吗?”。 一个包装也可以帮助,但没有什么比一个不太疲倦的眼睛。

你现在可以做什么? 获取一封电子邮件给客户。 让他们知道有宕机,并有灾难性的失败。 谈谈你的上级,法律,销售等,看看你如何可以减轻损害。 开始计划恢复,如果需要的话,你最好还是多花点钱。 最坏的情况是,计划在经济复苏上投入大量资金。 在这个阶段,你将努力减less掉落以及技术问题。

当你用rm -rf --no-preserve-root删除东西时,几乎不可能恢复。 很可能你已经丢失了所有重要的文件。

正如@faker在回答中所说的那样,最好的做法是将文件传输到一个安全的位置,然后重新部署服务器。

为了避免将来出现类似情况,我build议你:

  • 每周进行备份 ,或至less每两周进行一次备份 。 这将有助于以最less的MTTR恢复受影响的服务。

  • 在不需要的时候不要以root身份工作 。 在做任何事之前总是三思而后行。 我build议你也安装safe-rm 。

  • 不要input你不打算调用的选项 ,例如--no-preserve-root--permission-to-kill-kittens-explicitly-granted

我有同样的问题,但只是testing一个硬盘,我失去了一切。 我不知道它是否有用,但不要安装任何东西不要覆盖你的数据 ,你需要安装你的硬盘驱动器,并启动一些取证工具,如尸检,photorec,Testdisk。

我强烈build议testing盘,有一些基本的命令,你可以恢复你的数据,如果你没有覆盖它。

解决这个问题的最好方法就是不要把它放在第一位。

不要在参数列表中手动input带有斜杠的“rm -rf”命令。 (把这样的命令放在一个非常好的validation/理智程序的shell脚本中,以保护你免于做一些愚蠢的事情是不同的。)

只是不要这样做。
永远。 如果你认为你需要这样做,那么你的思维并不够用。

相反,将您的工作目录更改为您要从中开始删除的目录的父目录,以便rm命令的目标不需要斜杠:

cd / mnt

sudo rm -rf hetznerbackup

我会尝试恢复备份机器,在那里存储所有的副本:

  • 第一步 – 用dd命令备份这个已删除的“备份机器”驱动器。
  • 第二步 – 使用testdisk恢复文件。

所以假设你想恢复1TB,你将需要额外的2TB,1TB的备份(第一步)加上1TB的恢复(第二步)。

我用alias rm -fr [phone rang]和cd到珍贵的目录做了类似的错误。 现在我总是三思而后行,在使用rm或dd命令之前重新检查几次。

正如另一个答案中提到的,赫茨纳有一个救援系统。 它包括一个带有ssh访问权限的netboot选项以及一个java小应用程序,可以为您的虚拟服务器提供屏幕和键盘。

如果要尽可能恢复,请将服务器重新引导到netboot系统,然后通过从适当的设备inode读取来login并下载文件系统的映像。

我认为这样的事情应该工作:

 ssh root@host cat /dev/sda > server.img 

当然redirect是在ssh命令被调用之前由shell完成的,所以server.img是一个本地文件。 如果你只想要根文件系统,而不是完整的磁盘,假设你使用的是与我相同的图像,用sda3replacesda

你将如何从这里前进?

我会发誓在我的余生中使用rm ,并认为这是疯狂的垃圾cli不是nix系统上的默认清除命令。

https://github.com/andreafrancia/trash-cli

我会确保这是我安装在一个全新的系统上的第一件事, alias rm告诉人们使用trash-cli 。 它还会包含关于另一个实际运行/bin/rm别名的注释,但会告诉他们在大多数情况下避免使用它。

:( 真实的故事

我build议在这种情况下卸载并使用debugging ,并在lsdel的帮助下,你可以列出所有最近删除的文件,哪些不从日记清理,然后转储所需的文件。 快速search链接相同: http : //www.linuxvoodoo.com/resources/howtos/debugfs

希望它会帮助别人。 ;)

是的,一次的build议是制作脚本,这使得remmreal.rm和symlinc mv移动到了rm ;)

停止所有服务器进程和所有可能导致磁盘I / O的操作…然后运行testing程序,它应该在您的软件堆栈中。 如果您有物理访问权限,请使用带有testing磁盘的livecd。