周一早上的错误:sudo rm -rf --no-preserve-root /

Jon*_*lov 149 disaster-recovery ubuntu-12.04 hetzner

请注意:此问题的答案和评论包含来自另一个类似问题的内容,该问题已受到外部媒体的大量关注,但结果证明是某种病毒式营销计划中的恶作剧问题。由于我们不允许以这种方式滥用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..
Run Code Online (Sandbox Code Playgroud)

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

你会如何从这里前进?我将游过一大片带刺铁丝网,以恢复 SSH 访问。

该服务器运行 Ubuntu-12.04 并托管在 Hetzner。

Jou*_*eek 223

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

我建议使用 testdisk某些特定于文件系统的恢复工具。尝试一个系统,看看它是否有效,等等。没有真正的方法可以使该过程自动化,您可能可以小心地分批进行。

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

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

其次

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

吓到我。文件级单向备份是一个已解决的问题。Rsync 可用于保留权限并以一种方式将文件复制到备份站点。不小心有事?重新安装(最好是自动)rsync,一切正常。将来,您可能会将文件系统级快照与 btrfs 或 zfs 快照结合使用,并将其传送到系统级备份。我实际上会玩弄分离应用程序服务器、数据库和存储,并引入最小权限原则,这样你就可以分担这样的风险..

我知道我可以做任何事情。我现在需要考虑如何保护自己

事情发生后是考虑这一点的最糟糕的时间。

我们可以从中学到什么?

  1. 备份保存数据。可能是职业。
  2. 如果你有一个工具但不知道它可以做什么,那很危险。绝地武士可以用光剑做惊人的事情。一屋子拿着光剑的黑猩猩……会变得一团糟。
  3. 永远不要一次在任何地方运行命令。测试机和生产机分开,最好分阶段做生产机。最好是修理 1 台或 10 台机器,而不是 100 台或 1000 台。

  4. 双重和三重检查命令。要求同事仔细检查“嘿,我要添加一个驱动器,你能不能理智检查一下,这样我就不会擦掉一个驱动器,这并不可耻?”。包装纸也可能有帮助,但没有什么能比得上一双不那么疲倦的眼睛了。

你现在可以做什么?向客户发送电子邮件。让他们知道有停机时间和灾难性故障。与你的上级、法律、销售等交谈,看看如何减轻损失。开始计划恢复,如果需要,您最多只能雇佣额外的人手。在最坏的情况下,计划在恢复上花费大量资金。在这个阶段,您将致力于减少故障以及技术修复。

  • 我要补充这个优秀的答案:远离计算机。在你冷静下来之前,不要试图解决任何问题。您已经看到了一些严重的停机时间;花时间思考问题而不是更多地破坏您的系统(如上面的“dd”问题)不会使情况变得更糟。 (68认同)
  • 知道为什么命令实际运行吗?如果 `$foo` 和 `$bar` 都未定义,`rm -rf /` 应该会出错并显示 `--no-preserve-root` 消息。我能想到这在 CentOS7 机器上实际可行的唯一方法是,如果 `$bar` 评估为 `*`,那么运行的是 `rm -rf /*`。 (22认同)
  • @MarcoMarsala 至少你现在很有名了 http://www.independent.co.uk/life-style/gadgets-and-tech/news/man-accidentally-deletes-his-entire-company-with-one-错误代码行a6984256.html (20认同)
  • @MarcoMarsala 如果您在使用 rsync 之前安装了任何东西,则说明您没有正确执行此操作。您应该通过 ssh 使用 rsync。 (9认同)
  • 我喜欢“偶然的事情?”中的风格。这一定意味着“删除”一词被意外“删除”或“丢弃”。 (9认同)
  • 如果有未定义的变量,`set -u` 将导致 bash 退出。例如,如果没有定义 `foo` 和/或 `bar`,那么 `rm -rf ${foo}/${bar}` 会导致 shell 脚本退出非零状态。 (9认同)
  • 一切都说完了,还有一件更简单的事情 - 不要像人类一样多任务。不要在同一脚本中混合备份或复制操作与更改操作。在更改任何内容之前*进行备份(并验证)。*仅在*您的备份/复制操作完成并安全断开连接后才开始更改操作。(您的 rm 更改状态,因此是更改操作)。不仅适用于数据中心服务器,也适用于编辑纯文本文档这样简单的事情。此外,还要定期验证备份还原/恢复过程。 (8认同)
  • 好评论。我只想补充一点,我所有的 shell 脚本都有 `set -u;set -e`。如果他有`set -u`,那么张贴的场景就不会发生。 (4认同)
  • “在 HDD 盘片上,数据是偏移的,允许相同的位被覆盖 7 次但仍然可以读取。” 需要引用 (3认同)
  • 我的回答涵盖了这一点。关键的错误是在整个服务器群中运行未经测试的命令 (2认同)
  • 是的,很多潜在的问题是流程问题(“软”技能)而不是技术问题(“硬”技能)。 (2认同)
  • 永远不应该在生产中进行测试。如果您还没有运行过某些东西,则应该先在测试环境中运行它。这可以帮助避免在生产中发生这样的爆炸。 (2认同)
  • 恭喜,这个问答[发表了当地报纸](http://www.sunshinecoastdaily.com.au/news/man-accidentally-deletes-his-entire-company/2997367/)。 (2认同)
  • 实际上,'guttmann' 方法针对不同的编码具有不同的模式,并且是为磁畴更大的时代而设计的。使用现代驱动器,只需一次传递可能就足够了,并且带有随机数据的几次传递应该是安全的。 (2认同)
  • 我的专业是计算机取证,我模糊地知道我在说什么,对古特曼论文的一种模糊的、货物崇拜的信念是一种宠物。它是一篇*伟大的*论文,但它是为一个非常不同时代的硬件而编写的。 (2认同)

fak*_*ker 95

启动到 Hetzner 提供的救援系统并检查您造成了什么损坏。
将任何文件传输到安全位置,然后重新部署服务器。

恐怕这是您的最佳解决方案。

  • 往好的方面看,至少他的心血没有问题! (104认同)

Ama*_*ali 92

当您使用 删除内容时rm -rf --no-preserve-root,几乎无法恢复。您很可能丢失了所有重要文件。

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

为避免将来发生类似情况,我建议您:

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

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

  • 就此而言,请勿键入您不打算调用的选项,例如--no-preserve-root--permission-to-kill-kittens-explicitly-granted

  • 同样,除非你真的是认真的,否则不要将 `--please-destroy-my-drive` 参数添加到 `hdparm`。 (20认同)
  • 我想补充;“以 root 身份工作时,三重检查您的参数(和选项)”、“检查您的 CurrentWorkingDirectory(在执行 rm -rf * 之类的操作之前)”和“使用命令的完整路径(不要在 $PATH 上中继)。 (3认同)

小智 47

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

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

  • 如果可能的话,我绝对会建议将存储脱机,并在可能的情况下重新安装为“只读”。无论是使用 livedisk 还是其他服务器实例。 (9认同)
  • «这些工具不会恢复文件名和路径» 是的,他们会。在提到的 3 个工具中,只有一个 (Photorec) 执行雕刻。 (3认同)
  • 为了安全起见,我什至考虑将原始磁盘的 dd bitcopy 从原始磁盘的只读安装复制到新磁盘。 (2认同)

Mon*_*der 33

解决此类问题的最佳方法是一开始就没有。

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

只是不要这样做。
曾经。如果你认为你需要这样做,那说明你还不够努力。

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

cd / mnt

sudo rm -rf hetznerbackup

  • 我总是把 -rf 放在参数列表的末尾,所以 `rm /bla/foo/bar -rf`。至少这样,当我在输入 `rm /` 部分后不经意地按回车时,我不会遇到很多麻烦。 (31认同)
  • 同样,在删除“*~”文件时,我先输入波浪号,然后添加星号。 (5认同)
  • 所以你宁愿删除你的家而不是当前目录中的所有东西?!? (4认同)

Abc*_*Xyz 15

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

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

因此,假设您要恢复 1TB,您将需要额外的 2TB,1TB 用于备份(第一步)加上 1TB 用于恢复(第二步)。

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

  • 很抱歉这么说,但我在这个问题上感到巨大的巨魔...... (129认同)
  • 通过这样做几乎将您的磁盘归零。这严重使恢复变得更加困难。OP 建议您尝试使用 testdisk 并首先恢复是有充分理由的,虽然 dd 的语法可能有点奇怪,但这是在运行命令之前进行双重和三次检查的一个很好的理由。你只擦了一台服务器,对吧? (6认同)
  • 老实说。我不确定你是不是真的。如果你是,你可能做错了工作...... (5认同)
  • 希望你在回答中觉得自己很渺小:) (3认同)

kas*_*erd 7

正如另一个答案中提到的,Hetzner 有一个救援系统。它包括具有 ssh 访问权限的网络引导选项以及用于在虚拟服务器上为您提供屏幕和键盘的 Java 小程序。

如果您想尽可能多地恢复,请将服务器重新启动到网络引导系统,然后登录并通过从适当的设备 inode 读取来下载文件系统的映像。

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

ssh root@host cat /dev/sda > server.img
Run Code Online (Sandbox Code Playgroud)

当然重定向是在调用 ssh 命令之前由 shell 完成的,所以 server.img 是一个本地文件。如果你只想根文件系统,而不是完整的磁盘,更换sdasda3假设你使用相同的图像作为我。

  • 我更想减少文件的大小。但是如果你想节省带宽(好主意):只需添加引号:`ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz`( - ssh 的 c 选项通常也不错,但您仍然需要在最后进行压缩,因为 ssh 只会在其隧道入口处压缩并在发送到 stdout 之前解压缩) (2认同)