题 星期一早上的错误:sudo rm -rf --no-preserve-root /


请注意:这个问题的答案和评论包含来自另一个类似问题的内容,该问题已经受到外界媒体的广泛关注,但在某种病毒式营销方案中却被证明是恶作剧问题。由于我们不允许以这种方式滥用ServerFault,原始问题已被删除,答案与此问题合并。


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

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

我之前没有发现最后一个空格 / 几秒钟之后,当警告充斥着我的命令行时,我意识到我刚刚点击了自毁按钮。这里有一些烧在我眼中的东西:

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上托管。


142
2018-04-07 06:39




从备份还原。老实说,这是一个不容易回归的场景之一。 - MadHatter
你怎么打字 --no-preserve-root 偶然?! :-o - ThatGraemeGuy
Greame,钥匙就像是彼此相邻。 - MadHatter
星期二工作:寻找新工作;)将其作为需要备份的经验教训。 - TomTom
这肯定像是在拖着我。你不能不小心输入--i-really-mean-delete-my-whole-root。 - psusi


答案:


启动Hetzner提供的救援系统并检查您所造成的伤害。
将所有文件转出到安全位置,然后重新部署服务器。

我担心这是你个案中最好的解决方案。


92
2018-04-07 07:00



看起来光明的一面,至少他心没有问题! - metacom


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

我建议使用testdisk 要么 一些文件系统特定的恢复工具。尝试一个系统,看它是否有效,等等。没有真正的方法来自动化这个过程  你可以 小心 分批做。

也就是说,问题和评论中有一些非常可怕的事情应该是你的后续行动报告的一部分。

首先,您在任何地方运行命令而不先检查它。在一个框上运行命令。然后是几个,然后更多。基本上如果出现问题,最好让它影响一个 少数 而不是你所有的系统。

其次

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

吓到我。文件级单向备份是a 解决了问题。 Rsync可用于保留权限和复制文件 单程 到备份站点。不小心?重新安装(最好是自动)rsync,事情正常。将来,您可以将文件系统级快照与btrfs或zfs快照一起使用,并将这些快照用于系统级备份。我实际上是在分离应用程序服务器,数据库和存储,并介绍最小权限原则,这样你就可以分担这样的风险。

我知道我能做些什么。我现在需要思考如何保护自己

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

我们可以从中学到什么?

  1. 备份可以保存数据。可能是职业生涯。
  2. 如果你有一个工具,并且不知道它能做什么,那就很危险。绝地武士可以用光剑做出惊人的事情。一屋子的黑猩猩带着光剑......会变得凌乱。
  3. 永远不要一次到处乱跑命令。分离测试和生产机器,最好分阶段进行生产机器。最好修复1台或10台机器而不是100台或1000台机器。

  4. 双重和三重检查命令。要求一名同事仔细检查“嘿,我即将驾驶一辆车,你是否能够理智地检查这一点,所以我最终不会擦拭一个驱动器?”。包装纸可能也有帮助,但没有什么能比不那么疲惫的眼睛更好。

你现在可以做什么?收到客户的电子邮件。让他们知道停机时间和灾难性故障。与您的高层,法律,销售等人交谈,看看如何减轻损失。开始计划恢复,如果需要,你将不得不雇用额外的手。最糟糕的是,计划在恢复上花很多钱。在这个阶段,您将努力减轻失败以及技术修复。


219
2018-04-11 08:02



@MarcoMarsala如果在使用rsync之前安装了任何东西,那么你没有正确地执行它。你应该在ssh上使用rsync。 - Michael Hampton♦
我想补充一下这个优秀的答案:离开电脑吧。在你平静下来之前不要试图修理任何东西。您已经在考虑一些严重的停机时间;花时间思考问题,而不是更多地破坏你的系统(如同 dd 上面的问题)不会让情况变得更糟。 - Jenny D
知道命令实际运行的原因吗?如果 $foo 和 $bar 两者都未定义, rm -rf / 本应该有错误的 --no-preserve-root 信息。我能想到的唯一方法就是如果可以在CentOS7机器上运行 $bar 评估为 *所以运行的是 rm -rf /*。 - terdon
我喜欢“意外的东西?”中的风格。这必须意味着“删除”一词意外被“删除”或“丢弃”。 - sehe
@MarcoMarsala至少你现在很有名 independent.co.uk/life-style/gadgets-and-tech/news/... - Martin Smith


当你删除东西时 rm -rf --no-preserve-root,它几乎无法恢复。你很可能丢失了所有重要文件。

@骗子 在他的回答中说,最好的做法是将文件传输到安全的位置,然后重新部署服务器。

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

  • 进行备份 每周,或至少每两周一次。这将帮助您以尽可能少的MTTR备份受影响的服务。

  • 不需要时不要以root身份工作。和 总是 在做任何事之前要三思。我建议你也安装 安全-RM

  • 不要键入您不打算调用的选项, 如 --no-preserve-root 要么 --permission-to-kill-kittens-explicitly-granted, 对于这个问题。


90
2018-04-07 07:57



同样,除非你真正意义上的,否则不要添加 --please-destroy-my-drive 参数来 hdparm。 - MikeyB
我想补充一下; “以root身份工作时,请检查您的参数(和选项)”,“检查您的CurrentWorkingDirectory(在执行rm -rf *之前)”和“使用命令的完整路径(不要在$ PATH上中继)”。 - Baard Kopperud


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

我强烈推荐使用Testdisk,如果你没有覆盖它,可以使用一些基本命令来恢复数据。


47
2018-04-11 08:17



如果可能的话,我肯定会建议将存储设备脱机并重新安装为“只读”(如果可以的话)。是否使用liveisk或其他服务器实例。 - mhouston100
我甚至考虑将原始磁盘的dd bitcopy从原始磁盘的只读挂载到新磁盘只是为了安全起见。 - Jim
«这些工具无法恢复文件名和路径»是的,他们这样做。在上述3种工具中,只有一种(Photorec)进行雕刻。 - Andrea Lazzarotto


解决这类问题的最佳方法是首先不要使用它。

不要手动输入参数列表中包含斜杠的“rm -rf”命令。 (将这些命令放在带有非常好的验证/健全程序的shell脚本中以保护您不会做一些愚蠢的事情是不同的。)

只是不要这样做。
永远。 如果您认为自己需要这样做,那么您的思考就不够了。

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

cd / mnt

sudo rm -rf hetznerbackup


33
2018-04-07 21:22



我总是将-rf放在参数列表的末尾,所以 rm /bla/foo/bar -rf。至少那样的方式,当我在输入后按键返回时,我没有遇到很多麻烦 rm / 部分。 - Jens Timmerman
同样,当删除“*〜”文件时,我首先键入代字号,然后添加星号。 - tekknolagi
所以你宁愿删除你的家而不是当前目录中的所有东西?!? - greg0ire
@ greg0ire不,我想他想说,内心 /mnt/hetznerbackup,他必须使用“/”来标记该文件夹中的所有内容..但仅限于父级 hetznerbackup 够了,没有斜线。 - T.Todua
@tazotodua:我指的是tekknolagi的评论 - greg0ire


我会尝试恢复备份机器,其中存储了所有副本:

  • 第1步 - 使用备份这个已删除的“备份机器”驱动器 dd COMAND。
  • 第二步 - 使用 testdisk 恢复文件。

所以假设您要恢复1TB,您需要额外的2TB,1TB用于备份(第1步)加1TB用于恢复(第2步)。

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


16
2018-04-11 00:32



通过这样做几乎把你的磁盘归零。这严重使得恢复更加困难。 OP有一个很好的理由建议你尝试使用testdisk并首先恢复,而dd的语法可能有点奇怪,这是在运行命令之前进行双重和三重检查的一个很好的理由。你只擦了一台服务器,对吗? - Journeyman Geek
您仍然可以恢复,取决于您允许的时间 dd 抹去你最后的机会。 - Abc Xyz
很遗憾地说,但我在这个问题上感到巨大的巨响...... - tymik
希望你在答案中感觉小巨魔:) - Abc Xyz
老实说。我不确定你是真的。如果你是,你可能在错误的工作...... - leftcase


正如另一个答案中提到的,Hetzner有一个救援系统。它包括带有ssh访问权限的netboot选项以及用于在vserver上为屏幕和键盘提供的java applet。

如果要尽可能恢复,请将服务器重新引导至网络引导系统,然后通过从相应的设备inode读取,登录并下载文件系统的映像。

我认为这样的事情应该有效:

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

当然,重定向是在调用ssh命令之前由shell完成的,因此server.img是本地文件。如果您只想要根文件系统而不是完整磁盘,请替换 sda 通过 sda3 假设您使用的是与我相同的图像。


7
2018-04-07 07:54



可能是: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz (即时gzip将会或将不会有所帮助,具体取决于文件系统的内容...) - Olivier Dulac
@OlivierDulac以这种方式使用gzip将通过网络发送未压缩的数据,然后在接收端压缩它。我假设您打算实现的结果是在传输时压缩数据。本地图像可以压缩或不压缩存储,但是您希望以后应用于该图像的工具将无法使用压缩版本。如果您想要实现的只是在传输过程中压缩数据,则可以在ssh中使用压缩功能。它可以启用 -C 如果您的配置中尚未启用它。 - kasperd
我更想减小文件的大小。但如果你想节省带宽(好主意):只需添加引号: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz (ssh的-c选项通常也很好,但是你仍然需要在最后压缩,因为ssh只会在隧道入口处压缩并在发送到stdout之前解压缩) - Olivier Dulac


你怎么会从这里前进?

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

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

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

:( 真实的故事


2
2018-04-15 09:51



根据我的经验,这些工具更像是一种麻烦而不是实际的帮助 - 迟早,在一些咒骂之后,你会将其删除。对于工作站来说可能没问题,但是在很多情况下(如果不是大多数情况下)当你在服务器上进行管理工作时,你真的需要删除数据,而不是仅仅将其移动到其他地方(如果是这种情况,只需使用mv)代替)。此外,自动将数据移动到垃圾文件夹可能会导致严重问题(例如,垃圾不在同一文件系统上,安全性)。 - maetthu
@maetthu当然,在他们已经在垃圾桶里停留了一段时间后,东西就会被删除。 Ubuntu桌面对超过30天的垃圾中的项目执行此操作。在服务器上,您可能需要更短的内容,例如。 trash-empty 5 在一个cron。重点是让你有一些宽限期,因为人类会犯错误。 - Gerry
制定一个有效的灾难恢复计划而不是禁止必要的系统工具不是更好吗? - user292812
@ user292812我没有建议禁止/ bin / rm,只是在大多数情况下它不应该是第一个选项(注意/ bin / rm别名)。您的问题还表明在灾难恢复和人性友好删除选项之间做出错误选择。你应该两个都有。 - Gerry
两步删除过程可以省去很多麻烦:1。移动到垃圾箱(详细),2。清空垃圾箱。我将这样的脚本别名为“rm”,它使我免于多次意外删除重要的事情。 - Sam Watkins


在这种情况下我会建议卸载并使用 debugfs,并借助 lsdel 你可以列出所有最近删除的文件,这些文件没有从期刊中清除,然后 倾倒 需要的文件。快速搜索链接: http://www.linuxvoodoo.com/resources/howtos/debugfs 

希望它会帮助某人。 ;)

是的,曾经的建议是制作脚本,这令人感动 R M 至 real.rm 和symlinc MV 至 R M ;)


1
2018-04-18 14:46





停止所有服务器进程以及可能导致磁盘i / o的所有内容...然后运行testdisk,它应该在您的软件堆栈中。如果您具有物理访问权限,请使用带有testdisk的livecd。


-2
2018-04-17 17:35



我不明白为什么你认为提供完全相同的建议的三个答案是不够的? - kasperd