Linux下恢复删除的文件

转自:http://github.tiankonguse.com/blog/2015/09/13/linux-remove-recovery/

下午, DBA找我说有些SQL执行了两个小时了,导致主从同步延迟很多.

晚上, 一个同事要走了, 做了一个月的项目要整理一下好交接出去.结果删除没有用的文件时, 路径多了一个空格, 导致整个项目的代码被删除, 坑爹的是他从来没提交过SVN.

奋斗到天亮

对于打点那个项目, 编辑说出问题那一刻, 我就知道是哪里的问题了.

当时那位同事做那块逻辑时, 我给他交代了两个注意点: 1.注意修改时间 2.批量操作时,参考能量瓶打点的批量操作逻辑.

我拉取SVN, 看了看相关代码, 我心里面无话可说, 我交代的注意点他都没有按我说的来做.

不管那么多, 先修复问题再说, 然后找测试, leader, 总监, 运维一层层的审批, 最后发布, 浪费不少精力和时间.

DBA找我得时候, 我猜想是autodata出问题了, 毕竟autodata里面全是各种like, 左值, 子查询等sql语句.

但是我稍微观察了一下, 发现sql来源竟然不是autodata, 于是赶紧查看来源ip, 再查查ip所在机器属于谁负责.

结果发现是搜索小组负责的, 于是拉取那个组的运维, 组长等人.

后来, 问题严重到主从同步延迟两个小时了, 于是搜索小组把相关任务停止, DBA手动杀死相关SQL, 才得到缓解.

后来, 慢慢的恢复正常了.

那位同事误删项目时, 我以为是清除cmake的临时文件时误操作的, 结果是管理项目时误操作导致的.比如有个 bulid 目录, 你想删除 bulid 下的东西, 一般是进入bulid目录, 然后删除即可.

kyyuan@skyyuan-PC3:test $ tree
.
├── bulid
│   └── tml
└── file

1 directory, 2 files

skyyuan@skyyuan-PC3:test $ cd bulid/

skyyuan@skyyuan-PC3:bulid $ rm -rf *

skyyuan@skyyuan-PC3:bulid $ cd ..

skyyuan@skyyuan-PC3:test $ tree
.
├── bulid
└── file

1 directory, 1 file

但是这位同事没有进入到相关目录, 然后通过路径来删除的.

skyyuan@skyyuan-PC3:test $ touch bulid/tmp

skyyuan@skyyuan-PC3:test $ tree
.
├── bulid
│   └── tmp
└── file

1 directory, 2 files

skyyuan@skyyuan-PC3:test $ rm -rf bulid/*

skyyuan@skyyuan-PC3:test $ tree
.
├── bulid
└── file

1 directory, 1 file

那样虽然可以做到删除文件, 但是如果不小心在星号前面多打了一个空格, 后果不堪设想.

skyyuan@skyyuan-PC3:test $ touch bulid/tmp

skyyuan@skyyuan-PC3:test $ tree
.
├── bulid
│   └── tmp
└── file

1 directory, 2 files

skyyuan@skyyuan-PC3:test $ rm -rf bulid/ *

skyyuan@skyyuan-PC3:test $ tree
.

0 directories, 0 files

大概这位同事在管理项目时, 就是类似的发生悲剧的.

不过幸运的是, 这台机器有两个磁盘, 系统在小磁盘上, 数据在大磁盘上.这里可以把大磁盘卸载了, 来慢慢恢复数据.

[email protected]:[~]: parted --list
Disk /dev/vda: 19.3GB

Number  Start   End     Size    Type     File system  标志
 1      32.3kB  9994MB  9994MB  primary  ext3         启动
 2      9994MB  12.1GB  2147MB  primary
 3      12.1GB  19.3GB  7181MB  primary

Disk /dev/vdb: 195GB

Number  Start   End    Size   Type     File system  标志
 1      32.3kB  195GB  195GB  primary  ext3

网上搜索linux文件恢复, 搜到的都是foremost, extundelete, scalpel, testdisk, phtorec 等相关教程.

试了之后发现都不理想, 后来加上 ext3 这个关键字, 搜到了 ext3grep 这个工具.

然后下载源码安装.

wget https://ext3grep.googlecode.com/files/ext3grep-0.10.2.tar.gz
tar zxvf ext3grep-0.10.1.tar.gz
cd ext3grep-0.10.1
./configure
make
make install

然后卸载磁盘.


root@10.123.10.23:[/]: df -k
文件系统             1K-块      已用      可用 已用% 挂载点
/dev/vda1              9606084   5634124   3483988  62% /
tmpfs                  8085312       880   8084432   1% /dev/shm
/dev/vdb1            187846260  88430136  89874096  50% /data

root@10.123.10.23:[/]: fuser -k /data
root@10.123.10.23:[/]: umount /data

然后扫描磁盘上的所有节点.大概会跑几十分钟吧.

[email protected]:[/]: ext3grep /dev/vdb1 --ls --inode 2
Running ext3grep version 0.10.2
WARNING: I don‘t know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set. This either means that your partition is still mounted, and/or the file system is in an unclean state.
Number of groups: 1456
Loading group metadata... done
Minimum / maximum journal block: 23790082 / 23823397
Loading journal descriptors... sorting... done
...
...

看着节点一个一个的扫描, 心里面逐渐的稳定下来.

突然发现这样一个错误:

WARNING: Failed to open file ‘locate_output‘. See locate.cc
ERROR: dir_inode_to_block(1589385) returned -1.
ext3grep: init_directories.cc:82: bool init_directories_action(const ext3_dir_entry_2&, const Inode&, bool, bool, bool, bool, bool, bool, Parent*, void*): Assertion .
已放弃

心里面一惊, 赶紧google怎么回事, 在 google group 上发现需要加上 --accept-all 参数.

加上后发现还是存在这样的问题, 有人说先把旧的文件删除, 于是删除重新来, 不报这个错误了.

root@10.123.10.23:[/recovery]: ll
总用量 2808
-rw-r--r-- 1 root root  124904  9月 13 18:08 scan.log
-rw-r--r-- 1 root root 2737031  9月 13 17:27 vdb1.ext3grep.stage1

[email protected]:[/recovery]: mv vdb1.ext3grep.stage1 vdb1.ext3grep.stage1.bak01

root@10.123.10.23:[/recovery]: ll
总用量 2808
-rw-r--r-- 1 root root  124904  9月 13 18:08 scan.log
-rw-r--r-- 1 root root 2737031  9月 13 17:27 vdb1.ext3grep.stage1.bak01

[email protected]:[/recovery]: ext3grep /dev/vdb1 --accept-all --ls --inode 2  > scan.log
WARNING: Failed to open file ‘locate_output‘. See locate.cc

root@10.123.10.23:[/recovery]:

然后一般我们是根据名字来恢复文件的, 所以我们需要先找到我们的文件.

root@10.123.10.23:[/home/skyyuan/test]: ll screenshot_hash.cpp
-rwxr--r-- 1 skyyuan users 730  9月  9 11:01 screenshot_hash.cpp

[email protected]:[/recovery]: ext3grep  /dev/vdb1 --dump-names | grep screenshot_hash.cpp
skyyuan/skyyuan/.vim/view/~=+test=+screenshot_hash.cpp=
skyyuan/test/screenshot_hash.cpp
skyyuan/test/screenshot_hash.cpp~

这个时候我们可以搜索可以恢复的文件路径, 然后恢复之.

[email protected]:[/recovery]: ext3grep /dev/vdb1 --restore-file skyyuan/test/screenshot_hash.cpp
Running ext3grep version 0.10.2
WARNING: I don‘t know what EXT3_FEATURE_COMPAT_EXT_ATTR is.
WARNING: EXT3_FEATURE_INCOMPAT_RECOVER is set. This either means that your partition is still mounted, and/or the file system is in an unclean state.
Number of groups: 1456
Minimum / maximum journal block: 23790082 / 23823397
Loading journal descriptors... sorting... done
The oldest inode block that is still in the journal, appears to be from 13246709 = Wed Jun  3 15:38:29 1970
Journal transaction 884563 wraps around, some data blocks might have been lost of this transaction.
Number of descriptors in journal: 31536; min / max sequence numbers: 883887 / 885058
Writing output to directory RESTORED_FILES/
Loading vdb1.ext3grep.stage2.........................................................................................................................................e
Restoring skyyuan/test/screenshot_hash.cpp

[email protected]:[/recovery]: ll
总用量 16992
drwxr-xr-x 3 root root     4096  9月 13 18:23 RESTORED_FILES
-rw-r--r-- 1 root root   325248  9月 13 18:19 scan.log
-rw-r--r-- 1 root root  2737059  9月 13 18:18 vdb1.ext3grep.stage1
-rw-r--r-- 1 root root  2737031  9月 13 17:27 vdb1.ext3grep.stage1.bak01
-rw-r--r-- 1 root root 11554133  9月 13 18:19 vdb1.ext3grep.stage2

[email protected]:[/recovery]: ll RESTORED_FILES
总用量 4
drwxr-x--- 3 root root 4096  9月 13 18:23 skyyuan
[email protected]:[/recovery]: tree RESTORED_FILES/
RESTORED_FILES/
└── skyyuan
    └── test
        └── screenshot_hash.cpp

2 directories, 1 file

恢复完了, 我们再把磁盘挂上去.

mount /dev/vdb1 /data

最后, 在编译程序, 运行之后发现正常, 什么也不管, 赶紧提交SVN.

尾记

这个周五, 一直忙到半夜2点多才回去, 这些事故与问题实际上和我都没有关系, 但是加入进来学到不少东西.

ext3grep 的源码我已经在我的github上存了一份, 对源码感兴趣的可以来看看.

时间: 2024-10-11 22:14:36

Linux下恢复删除的文件的相关文章

linux下SVN忽略文件/文件夹的方法

linux下SVN忽略文件/文件夹的方法 假设想忽略文件temp 1. cd到temp所在的目录下: 2. svn propedit svn:ignore . 注意:请别漏掉最后的点(.表示当前目录),如果报错请看下面 3. 打开的文件就是忽略列表文件了(默认是空的),每一行是一项,在该文件中输入temp,保存退出 4. svn st查看状态,temp的?状态已经消除了 如果在svn propedit svn:ignore .时报错:svn: None of the environment va

Linux下压缩某个文件夹(文件夹打包)

tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件.zip 压缩方法:压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归zip [参数] [打包后的文件名] [打包的目录路径]解压 unzip xahot.zip 不解释linux zip命令的基本用法是:linux zip命令参数列表:-a 将文件转成ASCI

Linux下删除乱码文件

Linux下删除乱码文件: 1. ls -i 列出文件的节点ID, 如: 123456789 2. find ./ -inum 123456789 -print -exec rm -rf {} \; 批量删除: for n in 123456789 987654321;do find . -inum $n -exec rm -f {} \;;done

Linux下几种文件传输命令

Linux下几种文件传输命令 sz rz sftp scp 最近在部署系统时接触了一些文件传输命令,分别做一下简单记录: 1.sftp Secure Ftp 是一个基于SSH安全协议的文件传输管理工具.由于它是基于SSH的,会在传输过程中对用户的密码.数据等敏感信息进行加密,因此可以有效的防止用户信息在传输的过程中被窃取,比FTP有更高的安全性.在功能方面与FTP很类似,不仅可以传输文件数据,而且可以进行远程的文件管理(如建立,删除,查看文件列表等操作).Sftp与ftp虽然只有一字之差,但基于

Linux下的压缩文件剖析 (tar/gzip的区别)

Linux下的压缩文件剖析 对于刚刚接触Linux的人来说,一定会给Linux下一大堆各式各样的文件名给搞晕.别个不说,单单就压缩文件为例,我们知道在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rap.可是Linux就不同了,它有.gz..tar.gz.tgz.bz2..Z..tar等众多的压缩文件名,此外windows下的.zip和.rar也可以在Linux下使用,不过在Linux使用.zip和.rar的人就太少了.本文就来对这些常见的压缩文件进行一番小结,希望你下次遇

Linux下的各类文件

.a文件是静态链接库文件.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源..a文件就是多个.o文件的组合. .so文件是共享库文件(动态链接).动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息).仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的.so之间建立链接关系. .

linux下的find文件查找命令与grep文件内容查找命令

linux下的find文件查找命令与grep文件内容查找命令 在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区的. 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等. (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找. 一.find命令 基本格式:find  path expression 1.按照文件名查找 (1)find / -

Linux下重命名文件或文件夹(mv命令与rename命令)

在Linux下重命名文件或目录,可以使用mv命令或rename命令 mv ------------ mv命令既可以重命名,又可以移动文件或文件夹. 例子:将目录A重命名为B mv A B 例子:将/a目录移动到/b下,并重命名为c mv /a /b/c 其实在文本模式中要重命名文件或目录,只需要使用mv命令就可以了,比如说要将一个名为abc的文件重命名为1234: mv abc 1234 注意,如果当前目录下也有个1234的文件的话,这个文件是会将它覆盖的. rename -----------

Linux下执行.sh文件

Linux下执行.sh文件有两种情况: 一.直接./加上文件名.sh,如运行hello.sh为./hello.sh[hello.sh必须有x权限] 二.直接sh 加上文件名.sh,如运行hello.sh为sh hello.sh[hello.sh可以没有x权限] 举例说明: 1.执行当前目录下的sh文件: chmod u+x hello.sh ./hello.sh 或者sh hello.sh 2.执行绝对路径目录下的sh文件: ./home/test/shell/hello.sh /home/te