请注意:该问题的答案和评论包含另一个类似问题的内容,该问题已受到外界媒体的广泛关注,但在某种病毒式营销计划中却被证明是骗局问题。由于我们不允许以这种方式滥用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。

评论

从备份还原。老实说,这是不容易解决的情况之一。

您甚至如何意外输入--no-preserve-root? :-o

哎呀,键就像彼此相邻。

星期二的工作:寻找新工作;)将其作为为什么需要备份的一课。

当然,这似乎是对我的拖钓。您不能不小心键入--i-really-mean-delete-my-whole-root。

#1 楼

引导至Hetzner提供的救援系统,并检查造成的损坏。
将所有文件转移到安全位置,然后重新部署服务器。

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

评论


从光明的一面看,至少他没有流血的问题!

– metacom
2014年4月8日在20:04

#2 楼

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

我建议使用testdisk或某些文件系统特定的恢复工具。尝试一个系统,看看它是否有效,依此类推。没有真正的方法可以自动执行该过程,但是您可以分批仔细地进行。

那就是说,问题和评论中有一些非常可怕的事情,应该作为您事后报告的一部分。

首先,您在各处运行命令而无需先检查它。在一个框上运行命令。然后几个,然后更多。基本上,如果出现问题,最好影响几个系统而不是整个系统。

其次,


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


吓我一跳。文件级备份的一种方式是解决的问题。 Rsync可用于保留权限并以一种方式将文件复制到备份站点。偶然的事?重新安装(最好自动安装)rsync,一切正常。将来,您可能会在btrfs或zfs快照中使用文件系统级别的快照,并将这些快照用于系统级备份。实际上,我建议将应用程序服务器,数据库和存储区分开来,并介绍最小特权原则,这样您就可以分担此类风险。.


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


在发生某些事情之后,这是考虑这一点的最糟糕时间。

我们可以从中学到什么?


备份保存数据。可能的职业。
如果您有工具,却不知道它能做什么,那就很危险。绝地武士可以用光剑做奇妙的事情。满头都是光剑的黑猩猩...会变得凌乱。
永远不要一次到处运行命令。分离测试和生产机器,最好分阶段进行生产。最好修复1或10台计算机,而不是100或1000。
双重和三次检查命令。要求同事仔细检查“嘿,我要加一个驱动器,您能不能理智地检查一下,以便我最后不抹一个驱动器,”是没有耻辱的。包装器也可能有帮助,但没有什么能打动疲倦的眼睛。

您现在可以做什么?获取发给客户的电子邮件。让他们知道停机时间和灾难性故障。与您的上司,律师,销售人员等交谈,看看如何减轻损失。开始计划恢复,如果需要,您最多将需要雇用更多人员。最坏的情况是,计划花很多钱进行恢复。在此阶段,您将努力减轻故障和技术修复。

评论


@MarcoMarsala如果在使用rsync之前挂载了任何东西,则说明操作不正确。您应该在ssh上使用rsync。

–迈克尔·汉普顿
16-4-11在8:19



我会添加一个出色的答案:远离计算机。在冷静之前,请勿尝试修复任何问题。您已经在考虑严重的停机时间;花时间思考问题而不是破坏系统(例如上面的dd问题)不会使情况变得更糟。

–珍妮D
16年4月11日在8:44

知道为什么命令实际上运行了吗?如果$ foo和$ bar都未定义,则rm -rf /应该用--no-preserve-root消息出错。我能想到的唯一方法实际上是可以在CentOS7机器上工作的,如果$ bar评估为*,那么运行的是rm -rf / *。

– terdon
16年4月11日在9:23

我喜欢“意外的东西?”中的风格。这必须表示“删除”一词是意外“删除”或“删除”的。

–sehe
16年4月11日在20:17

@MarcoMarsala至少您现在已经出名了独立.co.uk / life-style / gadgets-and-tech / news / ...

–马丁·史密斯
16年4月14日在15:06

#3 楼

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

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

为避免将来出现类似情况,建议您:


每周或至少每两周进行一次备份。这将帮助您以尽可能少的MTTR来恢复受影响的服务。
在不需要时不要以root身份工作。做任何事情之前,请三思而后行。我建议您也安装safe-rm。
不要键入您不打算调用的选项,例如--no-preserve-root--permission-to-kill-kittens-explicitly-granted


评论


同样,除非您真的很认真,否则不要在hdparm中添加--please-destroy-my-drive参数。

– MikeyB
2014年4月8日在6:17

我想补充一点; “以root身份工作时,请三重检查您的参数(和选项)”,“检查您的CurrentWorkingDirectory(在执行rm -rf *之类的操作之前)”和“使用命令的完整路径(不要在$ PATH上中继)。

–巴德·科珀罗德(Baard Kopperud)
2014年4月8日上午10:41

#4 楼

我遇到了同样的问题,但是仅仅用硬盘进行测试,我就失去了一切。
我不知道它是否有用,但不安装任何东西,不覆盖数据,您需要安装硬盘驱动器并启动一些取证工具,例如验尸,光记录,测试磁盘。 br />
我强烈推荐Testdisk,使用一些基本命令可以在不覆盖数据的情况下恢复数据。

评论


我绝对会建议尽可能脱机使用takign存储,如果可以的话,建议重新安装为“只读”。无论是使用活动磁盘还是其他服务器实例。

–mhouston100
16年4月12日在0:21

为了安全起见,我什至会考虑将原始磁盘的dd位从原始磁盘的只读装载复制到新磁盘。

– Jim
16年4月14日在19:49

«这些工具将无法恢复文件名和路径»是的,它们确实可以。在上述3种工具中,只有一种(Photorec)可以进行雕刻。

– Andrea Lazzarotto
16年4月16日在16:34

#5 楼

解决此类问题的最佳方法是一开始就不要使用它。
请勿手动输入在参数列表中带有斜杠的“ rm -rf”命令。 (将这样的命令放入具有很好的验证/理智例程的shell脚本中以防止您执行愚蠢的操作是不同的。)
不要这样做。
每次。
如果您认为您需要执行此操作,而没有花足够的精力。
相反,将工作目录更改为您打算从中开始删除的目录的父目录,从而不需要rm命令的目标斜线:

cd / mnt
sudo rm -rf hetznerbackup


评论


我总是将-rf放在参数列表的末尾,因此rm / bla / foo / bar -rf。至少这样,当我输入rm / part后按回车键时,我不会遇到很多麻烦。

–詹斯·蒂默曼(Jens Timmerman)
2014年4月14日在16:37



同样,当删除“ *〜”文件时,我先输入波浪号,然后添加星号。

–tekknolagi
2014年4月24日在1:59

因此,您宁愿删除自己的房屋,也不愿删除当前目录中的所有内容?!

– greg0ire
16年4月17日在13:50

@ greg0ire不,我想他想说的是,在/ mnt / hetznerbackup中,他必须使用“ /”标记该文件夹中的所有内容。.但是从父级开始,仅hetznerbackup就足够了,没有斜线。

–T.Todua
16年5月16日在19:41



@tazotodua:我指的是tekknolagi的评论

– greg0ire
16年5月17日在14:06

#6 楼

我会尝试恢复存储所有副本的备份计算机:第一步-用
dd comman对这个已删除的“备份计算机”驱动器进行备份。
第二步-使用testdisk恢复文件。

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

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

评论


这样做几乎可以将磁盘置零。这严重地使其很难恢复。 OP有一个很好的理由建议您尝试使用testdisk,然后先进行恢复,尽管dd的语法可能有些奇怪,但这是在运行该命令之前进行两次和三次检查的一个很好的理由。您只擦除了一台服务器,对吗?

–游侠怪胎
16年4月11日在7:16

您仍然可以恢复,取决于您允许dd删除最后一次机会的时间。

– Abc Xyz
16年4月11日在13:53

不好意思这么说,但是我对这个问题感到很不高兴。

–tymik
16年4月11日在22:19

希望你在答案中感觉到小巨魔:)

– Abc Xyz
16年4月11日在22:27

老实说。我不确定你是真实的。如果你是,那你可能做错了工作...

–左写
16年4月14日在19:05

#7 楼

如另一个答案中所述,Hetzner具有救援系统。它既包含具有ssh访问权限的netboot选项,又包含一个Java小程序,可在vserver上为您提供屏幕和键盘。

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

我认为类似的方法应该可以工作:

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


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

评论


可能是:ssh root @ host cat / dev / sda | gzip -c-> /path/to/dir_on_huge_partition/server.img.gz(即时gzip会或不会帮助取决于文件系统的内容是什么...)

–奥利维尔·杜拉克(Olivier Dulac)
2014年4月7日在11:06



@OlivierDulac以这种方式使用gzip会通过网络发送未压缩的数据,然后在接收端将其压缩。我认为您要达到的结果是在传输数据时压缩数据。本地图像可以压缩存储,也可以不压缩存储,但是您以后想应用到该图像的工具将不适用于压缩版本。如果要实现的只是在传输过程中压缩数据,则可以使用ssh中的压缩功能。如果尚未在配置中启用它,则可以使用-C启用它。

–卡巴斯德
2014年4月7日在11:16

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

–奥利维尔·杜拉克(Olivier Dulac)
2014年4月7日在11:20

#8 楼


您将如何从这里前进?


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

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

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

:(真实的故事

评论


以我的经验,这类工具更像是讨厌的东西,而不是实际的帮助-早晚要经过一番咒骂之后,您将其删除。对于工作站来说可能没问题,但是在许多情况下(即使不是大多数情况),当您在服务器上执行管理工作时,您确实需要删除数据,而不仅仅是将其移动到其他位置(如果是这种情况,只需使用mv代替)。此外,自动将数据移动到回收站文件夹可能会导致严重的问题(例如,回收站不在同一文件系统上,安全性较高)。

– maetthu
16年4月17日在10:01

@maetthu哦,当然,在垃圾桶中放置了几天后,它们会被移走。 Ubuntu桌面会对垃圾桶中超过30天的物品执行此操作。在服务器上,您可能需要较短的内容,例如。在cron中清空垃圾5。关键是要允许您有一段宽限期,因为人类会犯错误。

–格里
16-4-17在13:29



有一个可行的灾难恢复计划而不是禁止基本系统工具会更好吗?

–user292812
16 Apr 17 '15:56

@ user292812我不建议禁止/ bin / rm,只是在大多数情况下不应该将其作为首选(请注意/ bin / rm别名)。您的问题还建议在灾难恢复和人性化删除选项之间做出错误选择。您应该同时拥有。

–格里
16年4月17日在17:56



分两步删除过程可以节省很多麻烦:1.(详细地)移至垃圾桶; 2.清空垃圾桶。我将这样的脚本别名为“ rm”,这使我免于多次意外删除重要内容的麻烦。

–山姆·沃特金斯(Sam Watkins)
16年4月18日在13:54

#9 楼

在这种情况下,我建议您卸载并使用debugfs,并借助lsdel列出所有最近删除的文件,这些文件不会从日志中清除,然后转储所需的文件。相同的快速搜索链接:http://www.linuxvoodoo.com/resources/howtos/debugfs

希望对您有所帮助。 ;)

是的,一次建议是编写脚本,该脚本将ream rm移至real.rm并将symlinc mv移至rm;)