请注意:此问题的答案和评论包含来自另一个类似问题的内容,该问题已受到外部媒体的大量关注,但在某种病毒式营销计划中被证明是恶作剧问题。由于我们不允许以这种方式滥用 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。
事实是?在这一点上,没有简单/容易的自动修复。数据恢复是一门科学,即使是基本的常用工具也需要有人坐下来确保数据在那里。如果您期望在没有大量停机时间的情况下从中恢复,那么您将感到失望。
我建议使用 testdisk或某些文件系统特定的恢复工具。尝试一个系统,看看它是否有效,等等。没有真正的方法来自动化这个过程,但你可以小心地分批完成。
也就是说,问题和评论中有一些非常可怕的东西应该成为您的事后报告的一部分。
首先,您在没有先检查的情况下到处运行命令。在一个盒子上运行命令。然后是几个,然后更多。基本上,如果出现问题,最好让它影响一些而不是所有系统。
第二
吓到我。文件级单向备份是一个已解决的问题。Rsync 可用于保留权限并以一种方式将文件复制到备份站点。不小心有什么?重新安装(最好是自动安装)rsync,一切正常。将来,您可能会将文件系统级快照与 btrfs 或 zfs 快照一起使用,并将这些快照用于系统级备份。我实际上会玩弄分离应用程序服务器、数据库和存储,并引入最小权限原则,这样你就可以分散这样的风险......
在事情发生之后是考虑这个的最糟糕的时间。
我们可以从中学到什么?
永远不要同时在任何地方运行命令。将测试和生产机器分开,最好分阶段做生产机器。最好修复 1 或 10 台机器,而不是 100 或 1000 台。
双重和三重检查命令。要求同事仔细检查“嘿,我要添加一个驱动器,你能理智地检查一下,这样我就不会擦拭驱动器了吗?”,这并不可耻。包装纸也可能有所帮助,但没有什么能比眼睛不那么疲惫了。
你现在可以做什么?向客户发送电子邮件。让他们知道有停机时间和灾难性故障。与您的上级、法律、销售等人员交谈,看看如何减轻损失。开始计划恢复,如果需要,您最多只能雇用额外的人员。在最坏的情况下,计划花费大量资金进行恢复。在这个阶段,您将致力于减轻影响以及技术修复。
启动 Hetzner 提供的救援系统并检查您造成了哪些损坏。
将所有文件传输到安全位置,然后重新部署服务器。
恐怕这是您情况下的最佳解决方案。
当您使用 删除内容时
rm -rf --no-preserve-root
,几乎无法恢复。您很可能丢失了所有重要文件。正如@faker在他的回答中所说,最好的做法是将文件传输到安全位置,然后重新部署服务器。
为避免将来出现类似情况,我建议您:
每周或至少每两周进行一次备份。这将帮助您以尽可能少的 MTTR 备份受影响的服务。
不需要时不要以 root 身份工作。在做任何事情之前总是三思而后行。我建议你也安装safe-rm。
不要键入您不打算调用的选项,例如
--no-preserve-root
or--permission-to-kill-kittens-explicitly-granted
,就此而言。我有同样的问题,但只是用硬盘测试,我失去了一切。我不知道它是否有用,但不要安装任何东西,不要覆盖您的数据,您需要安装硬盘并启动一些取证工具,例如我们的尸检、photorec、Testdisk。
我强烈推荐Testdisk,使用一些基本命令,如果你没有覆盖它,你可以恢复你的数据。
解决此类问题的最佳方法是一开始就没有它。
不要手动输入参数列表中带有斜杠的“rm -rf”命令。(将这样的命令放在具有非常好的验证/健全例程的 shell 脚本中以保护您不做愚蠢的事情是不同的。)
只是不要这样做。
曾经。如果你认为你需要这样做,那是你想得不够努力。
相反,将您的工作目录更改为您打算从中开始删除的目录的父目录,以便 rm 命令的目标不需要斜杠:
我会尝试恢复存储所有副本的备份机器:
dd
。testdisk
用于恢复文件。因此,假设您要恢复 1TB,您将需要额外的 2TB、1TB 用于备份(第 1 步)加上 1TB 用于恢复(第 2 步)。
我对别名 rm -fr [电话响] 和 cd 到珍贵目录做了类似的错误。现在,在我使用 rm 或 dd 命令之前,我总是三思而后行并重新检查几次。
正如另一个答案中提到的,Hetzner 有一个救援系统。它包括一个带有 ssh 访问权限的 netboot 选项以及一个 java 小程序,为您的虚拟服务器提供屏幕和键盘。
如果您想尽可能多地恢复,请将服务器重新引导到 netboot 系统,然后登录并通过从适当的设备 inode 中读取来下载文件系统的映像。
我认为这样的事情应该有效:
当然重定向是在调用 ssh 命令之前由 shell 完成的,所以 server.img 是一个本地文件。如果您只想要根文件系统而不是完整磁盘,请假设您使用与我相同的映像来
sda
替换。sda3
我会发誓在
rm
我的余生中使用它,并认为垃圾 cli 不是 nix 系统上的默认删除命令是疯狂的。https://github.com/andreafrancia/trash-cli
我会确保它是我在全新系统上安装的第一件
alias rm
东西,并且是告诉人们使用它的东西trash-cli
。它还将包含有关实际运行/bin/rm
但告诉他们在大多数情况下避免使用它的另一个别名的注释。:( 真实的故事
在这种情况下,我建议卸载并使用debugfs ,并且在lsdel的帮助下,您可以列出所有最近删除的文件,这些文件没有从日志中清理,然后转储所需的文件。相同的快速搜索链接:http ://www.linuxvoodoo.com/resources/howtos/debugfs
希望它会帮助某人。;)
是的,有一次建议是制作脚本,将ream rm移动到real.rm和 syminc mv到rm ;)