一、關(guān)于Linux的文件系統(tǒng)(Filesystem)
請(qǐng)參考: 《Linux 文件系統(tǒng)概述》
二、reiserfs 文件系統(tǒng)是否支持undelete操作來恢復(fù)數(shù)據(jù);
一般刪除數(shù)據(jù)有兩種情況,一種是通過rm 命令來刪除的;另一種是通過格式化銷毀數(shù)據(jù)的,在reiserfs 文件系統(tǒng)中,恢復(fù)這兩種誤操作而引起的數(shù)據(jù)損失的情況還是有點(diǎn)區(qū)別;
1、由于誤操作rm 刪除命令而造成數(shù)據(jù)的丟失的恢復(fù)情況;
通過實(shí)踐來看,通過rm 刪除數(shù)據(jù),我們能通過reiserfs的修復(fù)檢測(cè)工具來恢復(fù),如果存儲(chǔ)設(shè)備沒有任何問題,或者文件系統(tǒng)沒有壞塊(bad block)的情況下是百分之百的恢復(fù);
2、由于格式化硬盤所帶來的數(shù)據(jù)損失的恢復(fù)情況;
我測(cè)試了格式化存儲(chǔ)備來測(cè)試恢復(fù)reiserfs 文件系統(tǒng)所丟失的數(shù)據(jù),我是在移動(dòng)硬盤上做的實(shí)踐;比如我的移動(dòng)硬盤上只有一分區(qū),并且是基于reiserfs 文件系統(tǒng)的;我存放了一百多M的數(shù)據(jù),然后再用mkreiserfs或mkfs.reiserfs 工具來格式化這個(gè)硬盤分區(qū)。如果這時(shí)我們發(fā)現(xiàn)重建了硬盤分區(qū)的文件系統(tǒng)是誤操作。這時(shí)想通過reiserfs的修復(fù)工具來修復(fù),能挽回大多數(shù)數(shù)據(jù);但并不是百分百,有時(shí)也會(huì)是百分百的成功,就看你的運(yùn)氣了;
如果我是把這有reiserfs 文件系統(tǒng)的分區(qū),格式化為其它的文件系統(tǒng)了,這時(shí)如果發(fā)現(xiàn)是誤操作,成功幾率就極低了;或者說大多是不能成功;
如果我們把硬盤的分區(qū)表也重建了,如果這時(shí)再想起是誤操作,恢復(fù)的reiserfs文件系統(tǒng)的可能性也是極低的,或者說想通過reiserfs 文件系統(tǒng)工具的恢復(fù)成功率為零;但有時(shí)或多或少也能恢復(fù)出一點(diǎn),或者恢復(fù)的是很久很久以前的數(shù)據(jù)。呵,這事是有點(diǎn)怪;
如果您是由于重新分區(qū)導(dǎo)致的數(shù)據(jù)損失,首先可能您要恢復(fù)分區(qū)表到以前狀態(tài),可能Windows中有這方面的工具;在Linux系統(tǒng)下也應(yīng)該有這樣的工具,但都是商業(yè)的。Windows中好的數(shù)據(jù)恢復(fù)工具也應(yīng)該是商業(yè)性的。
3、在reiserfs 文件系統(tǒng)中,undelete恢復(fù)數(shù)據(jù)情況的約定;
我們前面已經(jīng)說過了,由于rm 指令的誤操作而引起的數(shù)據(jù)損失,是能恢復(fù)大多數(shù),或百分之百,也就是第一種情況;另外如果原來的硬盤分區(qū)是reiserfs 的,由于您誤操作使用 mkreiserfs 或mkfs.reiserfs 格式化致使數(shù)據(jù)的損失也應(yīng)該劃在這個(gè)約定之內(nèi),也是可以恢復(fù)大多數(shù)數(shù)據(jù),但這種情況應(yīng)該比較少;
三、reiserfs 文件系統(tǒng)恢復(fù)數(shù)據(jù)流程;
1、準(zhǔn)備修復(fù)盤和大容量存儲(chǔ)設(shè)備;
1)支持reiserfs 文件系統(tǒng)的livecd 或系統(tǒng)修復(fù)盤;
如果您用的是移動(dòng)存儲(chǔ),是reiserfs文件系統(tǒng)上的損失,您就直接用您當(dāng)前用的linux系統(tǒng)就能修復(fù),但得支持reiserfs 文件系統(tǒng)才行。呵,這不是廢話嗎?不支持reiserfs 文件系統(tǒng)的Linux,我的移動(dòng)硬盤用reiserfs 有什么用。
livecd 是最好的,只要支持reiserfs文件系統(tǒng)的livecd 就OK;另外我發(fā)現(xiàn)slackware 安裝盤中的第一張是也是可以用;當(dāng)然不排除其它發(fā)行版的安裝盤和修復(fù)盤,只要能用就行;
2)存儲(chǔ)設(shè)備;
比如您損失數(shù)據(jù)的硬盤分區(qū)是 9G,所以您得找個(gè)最少得找個(gè)未使用空間是10G的硬盤(或硬盤分區(qū))吧;否則怎么能容得下數(shù)據(jù)損失的鏡像呢?所以最好找一個(gè)大容量的硬盤或硬盤分區(qū)做準(zhǔn)備;
如果您只是在幾百M(fèi)的移動(dòng)硬盤上的損失,是不是找個(gè)地方就容下了;這種情況就好辦多了;
2、恢復(fù)數(shù)據(jù)的過程;
1)用livecd 開機(jī)進(jìn)入系統(tǒng),或者用修復(fù)盤進(jìn)入系統(tǒng);
livecd 比較好辦,他本來就是一個(gè)在光盤上運(yùn)行的系統(tǒng);您可以找一個(gè)發(fā)行版本下載;
請(qǐng)到: http://www.frozentech.com/content/livecd.php
可以選擇slax 或 Knoppix ;
您也可以用slackware的第一張盤,一路enter后,就出現(xiàn) bash# 字樣,這樣就OK了;當(dāng)然您也可以把硬盤掛在有Linux的機(jī)器上來恢復(fù),總之方法多的是;我們無(wú)非是借助一個(gè)支持reiserfs 文件系統(tǒng)的Linux系統(tǒng)來恢復(fù)數(shù)據(jù),這個(gè)道理我們應(yīng)該理解;
2)用dd 工具來做硬盤分區(qū)的鏡像;
為什么數(shù)據(jù)損失的硬盤分區(qū)的鏡像,能不能直接修復(fù)?直接修復(fù)也是可以的,但如果出現(xiàn)錯(cuò)誤,恢復(fù)數(shù)據(jù)的可能性就很低了。除非我們能保證損失數(shù)據(jù)的硬盤分區(qū)沒有任何bad block ,或者在此硬盤分區(qū)上沒有任何物理和邏輯壞道;另外我們還要確保百分之百不會(huì)再次操作失誤;所以對(duì)硬盤分區(qū)鏡像是極為重要的,也就是說用鏡像盤來恢復(fù)數(shù)據(jù),以保證原有數(shù)據(jù)的安全性和可靠性;
還有一點(diǎn)值得一說的是,請(qǐng)不要掛載有數(shù)據(jù)損失的硬盤分區(qū),也不要再次向其寫入數(shù)據(jù);否則恢復(fù)數(shù)據(jù)的成功率會(huì)降低;查看是否有自動(dòng)掛載分區(qū),請(qǐng)用df -h 來查看;如果發(fā)現(xiàn)已經(jīng)掛載了,就用 umount 卸載;
我們要弄明白是哪個(gè)分區(qū)的數(shù)據(jù)損失了,您可以用fdisk -l 來查看分區(qū)表;比如我十分明確的認(rèn)為 /dev/sda1 的數(shù)據(jù)損失了;這時(shí)我們就要做/dev/sda1的鏡像;
然后我們得準(zhǔn)備一個(gè)有空間的分區(qū),是linux的文件系統(tǒng)的,比如ext3或reiserfs都行;只是為了保存dd出來的分區(qū)鏡像;我們用mount 來掛載用來存儲(chǔ)鏡像文件的分區(qū);這在準(zhǔn)備工作中已經(jīng)提到了;比如我想用 文件系統(tǒng)為reiserfs 的硬盤分區(qū)/dev/hda8來存放/dev/sda1的鏡像,那就掛載/dev/hda8;
bash# mkdir hda8 注:創(chuàng)建一個(gè)目錄
bash# mount -t reiserfs /dev/hda8 hda8 注:把/dev/hda8 掛載到hda8目錄上;
bash# df -h 注:查看/dev/hda8是否掛載上了;
bash# cd hda8 注:進(jìn)入hda8目錄;
bash# dd if=/dev/sda1 conv=noerror > sda1.img 注:做 /dev/sda1 的整個(gè)分區(qū)的鏡像;
3)通過reiserfsck或fsck.reiserfs 鏡像來恢復(fù)數(shù)據(jù);
bash# losetup -f 注:查詢哪個(gè)loop設(shè)備是空的;
/dev/loop0 注:發(fā)現(xiàn)有一個(gè)空的是/dev/loop0 ;
bash# losetup /dev/loop0 sda1.img
注:把sda1.img 鏡象關(guān)聯(lián)到/dev/loop0的設(shè)備中;
bash# reiserfsck --rebuild-tree -S -l undelete.log /dev/loop0
注:通過reiserfsck 來修復(fù),-S 表示整個(gè)分區(qū),-l 后面是接日志輸出,最后是/dev/loop0設(shè)備;因?yàn)槲覀兦懊姘裺da1.img 關(guān)聯(lián)到了/dev/loop0設(shè)備中,這樣/dev/loop0就擁有了sda1.img的所有屬性;這和直接通過下面命令修復(fù)的效果是一樣的;但這樣通過鏡像裝載修復(fù)的方法主要是為了安全;
bash# reiserfsck --rebuild-tree -S -l undelete.log /dev/sda1
注:這樣直接操作也行,如果 /dev/sda1上有bad block就麻煩了;可能會(huì)損傷到/dev/sda1 數(shù)據(jù)的安全,明白了吧;
然后會(huì)出現(xiàn)類似如下的提示:
reiserfsck 3.6.19 (2003 www.namesys.com)
*************************************************************
** Do not run the program with --rebuild-tree unless **
** something is broken and MAKE A BACKUP before using it. **
** If you have bad sectors on a drive it is usually a bad **
** idea to continue using it. Then you probably should get **
** a working hard drive, copy the file system from the bad **
** drive to the good one -- dd_rescue is a good tool for **
** that -- and only then run this program. **
** If you are using the latest reiserfsprogs and it fails **
** please email bug reports to reiserfs-list@namesys.com, **
** providing as much information as possible -- your **
** hardware, kernel, patches, settings, all reiserfsck **
** messages (including version), the reiserfsck logfile, **
** check the syslog file for any related information. **
** If you would like advice on using this program, support **
** is available for $25 at www.namesys.com/support.html. **
*************************************************************
Will rebuild the filesystem (/dev/loop0) tree
Will put log info to 'undelete.log'
Do you want to run this program?[N/Yes] (note need to type Yes if you do): Yes
注:請(qǐng)輸入Yes,這樣就進(jìn)行修復(fù)了;
詳細(xì)情況如下:
Replaying journal..
Reiserfs journal '/dev/loop0' in blocks [18..8211]: 0 transactions replayed
###########
reiserfsck --rebuild-tree started at Thu Dec 1 21:01:53 2005
###########
Pass 0:
The whole partition (251984 blocks) is to be scanned
Skipping 8218 blocks (super block, journal, bitmaps) 243766 blocks will be read
0%....20%....40%....60%....80%....100% left 0, 6588 /sec
"r5" hash is selected
Flushing..finished
Read blocks (but not data blocks) 243766
Leaves among those 56
Objectids found 77
Pass 1 (will try to insert 56 leaves):
Looking for allocable blocks .. finished
0%....20%....40%....60%....80%....100% left 0, 56 /sec
Flushing..finished
56 leaves read
45 inserted
11 not inserted
non-unique pointers in indirect items (zeroed) 633
Pass 2:
0%....20%....40%....60%....80%....100% left 0, 0 /sec
Flushing..finished
Leaves inserted item by item 11
Pass 3 (semantic):
Flushing..finished
Files found: 42
Directories found: 12
Pass 3a (looking for lost dir/files):
Looking for lost directories:
Looking for lost files:0 /sec
Flushing..finished 48, 0 /sec
Objects without names 16
Dirs linked to /lost+found: 1
Files linked to /lost+found 15
Pass 4 - finished done 44, 0 /sec
Flushing..finished
Syncing..finished
###########
reiserfsck finished at Thu Dec 1 21:02:31 2005
###########
4)掛載loop 設(shè)備,查看數(shù)據(jù)恢復(fù)情況;
bash# mkdir recoversda1 注:創(chuàng)建一個(gè)目錄;
bash# mount /dev/loop0 recoversda1 注:把/dev/loop0掛載到 recoversda1 上;
bash# more undelete.log 注:查看恢復(fù)日志;
bash# cd recoversda1 注:進(jìn)入recoversda1目錄查看數(shù)據(jù)恢復(fù)情況;
一般的情況下,如果您是rm 刪除的東西,大多會(huì)百分之百的恢復(fù)了,有些內(nèi)容可能會(huì)恢復(fù)到lost+found的目錄中,要通過恢復(fù)日志來對(duì)比查看;
如果您認(rèn)為您的數(shù)據(jù)恢復(fù)的差不多了,這時(shí)就可以把損失數(shù)據(jù)的硬盤分區(qū)掛載上,然后拷貝已經(jīng)恢復(fù)的數(shù)據(jù)過去;
bash# cd .. 注:從 recoversda1 退出,返回上級(jí)目錄;
bash# mkdir sda1 注:創(chuàng)建sda1目錄;
bash# mount /dev/sda1 sda1 注:掛載 /dev/sda1 到sda1目錄上;
下面的就是從recoversda1目錄中,把已經(jīng)恢復(fù)的數(shù)據(jù)復(fù)制到數(shù)據(jù)損失的硬盤分區(qū)上;這個(gè)工作就簡(jiǎn)單了吧;cp命令應(yīng)該會(huì)用吧,如果真的不會(huì),那我也沒有辦法了,看來你和我的水平真的差不多;哈哈。。。。
5)恢復(fù)好數(shù)據(jù)的掃尾工作;
要正常卸載一系列掛載的盤;
bash# umount /dev/hda8
bash# umount /dev/sda1
bash# umount /dev/loop1
bash# losetup -d /dev/loop0
... ...
如果出現(xiàn)設(shè)備忙的提示,可能是您正處于掛載目錄中;退出就好了;