Ubuntu恢复被删除的文件
昨天一不小心,执行了rm xx -rf,把一个项目删除了。然后就是各种悔恨,各种自责,这个项目可是一周的工作量啊。最后肯定得解决,于是google搜索发现了恢复神器extundelete,最后顺利恢复了所有被我无意中的删除的文件。感谢上天,感谢extundelete。下面将个人的经历总结下。
如何使用extundelete
1) 下载工具extundelete
Ubuntu下下载这个工具太简单了
- sudoapt-getinstallextundelete
2) 使用
使用这个也很简单。使用extundelete–help命令,可以告诉我们很多。
- Itleaks@Itleaks::~$extundelete--help
- Usage:extundelete[options][--]device-file
- Options:
- ……………….
- --afterdtimeOnlyprocessentriesdeletedonorafter'dtime'.
- --beforedtimeOnlyprocessentriesdeletedbefore'dtime'.
- Actions:
- …………
- --restore-file'path'Willrestorefile'path'.'path'isrelativetoroot
- ofthepartitionanddoesnotstartwitha'/'(it
- mustbeoneofthepathsreturnedby--dump-names).
- Therestoredfileiscreatedinthecurrent
- directoryas'RECOVERED_FILES/path'.
- --restore-files'path'Willrestorefileswhicharelistedinthefile'path'.
- Eachfilenameshouldbeinthesameformatasanoption
- to--restore-file,andthereshouldbeoneperline.
- --output-dir'path'Restorefilesintheoutputdir'path'.
- Bydefaulttherestoredfilesarecreatedundercurrentdirectory'RECOVERED_FILES'.
- --restore-allAttemptstorestoreeverything.
- ………..
我们知道当我们不小心删除了有用的文件,我们一般是比较容易知道删除的时间的,因此,使用时间这个option可以很快并且精确的恢复出我们想要的文件。那这个dtime怎么生成。请参考如下命令:
- Itleaks@Itleaks:~$date-d"2014-06-0123:02:00"+%s
- 1401634920
%s的意思是seconds since 1970-01-01 00:00:00 UTC,就是输入时间与1970-01-0100:00:00的时间差
然后就可以使用这个来恢复了
- sudoextundelete/dev/sda8--after1401634920--restore-all
现在我们来做个试验:具体操作如下
- Itleaks@Itleaks:/tmp$echo"recoverytest">itleaks.test
- Itleaks@Itleaks:/tmp$rmitleaks.test
- Itleaks@Itleaks:/tmp$date-d"2014-06-0122:28:00"+%s
- 1401632880
- Itleaks@Itleaks:/tmp$sudoextundelete/dev/sda8--after1401632880--restore-all
- Onlyshowandprocessdeletedentriesiftheyaredeletedonorafter1401632880andbefore9223372036854775807.
- WARNING:Extendedattributesarenotrestored.
- WARNING:EXT3_FEATURE_INCOMPAT_RECOVERisset.
- Thepartitionshouldbeunmountedtoundeleteanyfileswithoutfurtherdataloss.
- Ifthepartitionisnotcurrentlymounted,thismessageindicates
- itwasimproperlyunmounted,andyoushouldrunfsckbeforecontinuing.
- Ifyoudecidetocontinue,extundeletemayoverwritesomeofthedeleted
- filesandmakerecoveringthosefilesimpossible.Youshouldunmountthe
- filesystemandcheckitwithfsckbeforeusingextundelete.
- Wouldyouliketocontinue?(y/n)
- y
- LoadingfilesystemMetadata...378groupsloaded.
- Loadingjournaldescriptors...
- 27106descriptorsloaded.
- Searchingforrecoverableinodesindirectory/...
- 85recoverableinodesfound.
- Lookingthroughthedirectorystructurefordeletedfiles...
- ………………..
- Unabletorestoreinode2360218(etc/brltty/brl-fs-bumpers.kti):Noundeletedcopiesfoundinthejournal.
- Unabletorestoreinode2359564(etc/mtab~):Noundeletedcopiesfoundinthejournal.
- Restoredinode2883641tofileRECOVERED_FILES/tmp/itleaks.test
- Itleaks@Itleaks:/tmp$treeRECOVERED_FILES/
- RECOVERED_FILES/
- └──tmp
- └──itleaks.test
- 1directory,1file
extundelete原理
这个是由于linuxext3文件系统的组织结构决定的,如下图:
在Linux系统中,超级块描述了分区的信息,一个分区被分为两个部分,索引节点表和数据块区,这个在格式化的时候就定下来了。文件(目录也是文件的一种,只不过它的内容是描述目录下的文件的)由索引节点描述,索引节点描述了文件的修改时间,文件的名称,文件的数据块地址等等。并且,linux对于文件删除操作是个懒动作,删除文件时系统只是将文件对应的索引节点及其拥有的数据块置为free(将nlink=0),而并没有做其他清空的,只有当这个索引节点或者数据块被真正用到的时候才会修改里面的数据。这就为我们文件修复提供了可趁之机。由于系统中的索引节点是固定大小的,因此可以很轻松的遍历扫描系统中所有的索引节点,找出free的索引节点并检查其数据块是否已经被用,如果没有则可修复并修复。同时,由于索引节点里的时间等信息也是保留的,因此就可以根据时间来恢复特定的被删除的文件。
文件误删除后的注意事项
从上面的分析可知,误删文件后,尽量不要做大的数据操作,以避免被删除的文件的数据块被重新使用,导致数据完全丢失。
/********************************
* 本文来自博客 “爱踢门”
* 转载请标明出处:http://blog.csdn.net/itleaks
******************************************/