全面對Linux文件系統(tǒng)解說反刪除方法
本人很喜歡Linux文件系統(tǒng),下面就這個問題來詳細(xì)說說Linux文件系統(tǒng)的反刪除方法。Linux是由開發(fā)工具軟件、編輯器軟件、CPU圖形用戶界面、網(wǎng)絡(luò)工具軟件等組成的一個完整的軟件包。Linux具備現(xiàn)代一切功能完整的UNIX系統(tǒng)所具備的全部特征。
作為一個多用戶、多任務(wù)的操作系統(tǒng),Linux文件系統(tǒng)一旦被刪除,是難以恢復(fù)的。盡管刪除命令只是在文件節(jié)點(diǎn)中作刪除標(biāo)記,并不真正清除文件內(nèi)容,但是其他用戶和一些有寫盤動作的進(jìn)程會很快覆蓋這些數(shù)據(jù)。不過,對于家庭單機(jī)使用的Linux文件系統(tǒng),或者誤刪文件后及時補(bǔ)救,還是可以恢復(fù)的。
Ext2文件系統(tǒng)結(jié)構(gòu)的簡單介紹
在Linux文件系統(tǒng)所用的Ext2文件系統(tǒng)中,文件是以塊為單位存儲的,默認(rèn)情況下每個塊的大小是1K,不同的塊以塊號區(qū)分。每個文件還有一個節(jié)點(diǎn),節(jié)點(diǎn)中包含有文件所有者,讀寫權(quán)限,文件類型等信息。對于一個小于12個塊的文件,在節(jié)點(diǎn)中直接存儲文件數(shù)據(jù)塊的塊號。如果文件大于12個塊,那么節(jié)點(diǎn)在12個塊號之后存儲一個間接塊的塊號,在這個間接塊號所對應(yīng)的塊中,存儲有256個文件數(shù)據(jù)塊的塊號(Ext2fs中每個塊號占用4字節(jié),這樣一個塊中所能存儲的塊號就是1024/4=256)。如果有更大的文件,那么還會在節(jié)點(diǎn)中出現(xiàn)二級間接塊和三級間接塊。
恢復(fù)被誤刪文件的方法
大多數(shù)Linux文件系統(tǒng)發(fā)行版都提供一個debugfs工具,可以用來對Ext2文件系統(tǒng)進(jìn)行編輯操作。不過在使用這個工具之前,還有一些工作要做。首先以只讀方式重新掛載被誤刪的文件所在分區(qū)。使用如下命令:(假設(shè)文件在/usr分區(qū))mount –r –n –o remount /usr -r表示只讀方式掛載;-n表示不寫入/etc/mtab,如果是恢復(fù)/etc上的文件,就加上這個參數(shù)。如果系統(tǒng)說xxx partion busy,可以用fuser命令查看一下是哪些進(jìn)程使用這個分區(qū)上的文件:
fuser –v –m /usr
如果沒有什么重要的進(jìn)程,用以下命令停掉它們:
fuser -k –v –m /usr
然后就可以重新掛載這些Linux文件系統(tǒng)了。
如果是把所有的文件統(tǒng)一安裝在一個大的/分區(qū)當(dāng)中,可以在boot提示符下用linux single進(jìn)入單用戶模式,盡量減少系統(tǒng)進(jìn)程向硬盤寫入數(shù)據(jù)的機(jī)會,要不干脆把硬盤掛在別的機(jī)器上。另外,恢復(fù)出來的數(shù)據(jù)不要寫到/上面,避免破壞那些有用的數(shù)據(jù)。如果機(jī)器上有dos/windows,可以寫到這些分區(qū)上面:
mount –r –n /dev/hda1 /mnt/had
然后就可以執(zhí)行debugfs:(假設(shè)Linux在 /dev/hda5)
#debugfs /dev/hda5
就會出現(xiàn)debugfs提示符debugfs:
使用lsdel命令可以列出很多被刪除的文件的信息:
debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001
196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001
debugfs:
列出的文件有很多(這里找到2692個),***字段是文件節(jié)點(diǎn)號,第二字段是文件所有者,第三字段是讀寫權(quán)限,接下來是文件大小,占用塊數(shù),刪除時間。然后就可以根據(jù)文件大小和刪除日期判斷那些是我們需要的。比如我們要恢復(fù)節(jié)點(diǎn)是196829的文件:
可以先看看文件數(shù)據(jù)狀態(tài):
debugfs:stat
Inode: 196829 Type: regular Mode: 0644 Flags: 0x0 Version: 1
User: 0 Group: 0 Size: 149500
File ACL: 0 Directory ACL: 0
Links: 0 Blockcount: 38
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x31a9a574 -- Mon May 27 13:52:04 2001
atime: 0x31a21dd1 -- Tue May 21 20:47:29 2001
mtime: 0x313bf4d7 -- Tue Mar 5 08:01:27 2001
dtime: 0x31a9a574 -- Mon May 27 13:52:04 2001
BLOCKS:
594810 594811 594814 594815 594816 594817
TOTAL: 38
然后就可以用dump指令恢復(fù)文件:
debugfs:dump /mnt/hda/01.sav
這樣就把文件恢復(fù)出來了。退出debugfs:
debugfs:quit
另一種方法是手工編輯inode:
debugfs:mi
Mode [0100644]
User ID [0]
Group ID [0]
Size [149500]
Creation time [0x31a9a574]
Modification time [0x31a9a574]
Access time [0x31a21dd1]
Deletion time [0x31a9a574] 0
Link count [0] 1
Block count [38]
File flags [0x0]
Reserved1 [0]
File acl [0]
Directory acl [0]
Fragment address [0]
Fragment number [0]
Fragment size [0]
Direct Block #0 [594810]
Triple Indirect Block [0]
使用mi指令后每次顯示一行信息以供編輯,其它行可以直接按回車表示確認(rèn),把deletion time改成0(未刪除),Link count改成1。改好后退出debugfs:
debugfs:quit
然后用fsck檢查/dev/hda5
fsck /dev/hda5
程序會說找到丟失的數(shù)據(jù)塊,放在lost+found里面。這個目錄里的文件就是我們要的東東。
Now all O.K. Good Luck.
Linux文件系統(tǒng)分區(qū)方案
硬盤的分區(qū)由主分區(qū)、擴(kuò)展分區(qū)和邏輯分區(qū)組成;所以我們在對硬盤分區(qū)時要遵循這個標(biāo)準(zhǔn);主分區(qū)(包括擴(kuò)展分區(qū))的***個數(shù)是四個,主分區(qū)(包含擴(kuò)展分區(qū))的個數(shù)硬盤的主引導(dǎo)記錄MBR(Master Boot Recorder)決定的,MBR存放啟動管理程序(GRUB,LILO,NTLOARDER等)和分區(qū)表記錄。其中擴(kuò)展分區(qū)也算一個主分區(qū);擴(kuò)展分區(qū)下可以包含更多的邏輯分區(qū);所以主分區(qū)(包括擴(kuò)展分區(qū))范圍是從1-4,邏輯分區(qū)是從5開始的;
關(guān)于一個磁盤的分區(qū),一個磁盤應(yīng)該有四個主分區(qū),其中擴(kuò)展也算一個主分區(qū);存在以下分配方案:
1)分區(qū)結(jié)構(gòu)之一:四個主分區(qū),沒有擴(kuò)展分區(qū);[主|分區(qū)1] [主分|區(qū)2] [主|分區(qū)3] [主|分區(qū)4]這種情況,如果您想在一個磁盤上劃分五個以上分區(qū),這樣是行不通的;三個主分區(qū) 一個擴(kuò)展分區(qū);[主|分區(qū)1] [主|分區(qū)2] [主|分區(qū)3] [擴(kuò)展分區(qū)][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] 這種情況行得通,而且分區(qū)的自由度比較大;分區(qū)也不受約束,能分超過5個分區(qū);這只是舉一個例子;
2)最合理的的分區(qū)方式;
最合理的分區(qū)結(jié)構(gòu):主分區(qū)在前,擴(kuò)展分區(qū)在后,然后在擴(kuò)展分區(qū)中劃分邏輯分區(qū);主分區(qū)的個數(shù)+擴(kuò)展分區(qū)個數(shù)要控制在四個之內(nèi);比如下面的分區(qū)是比較好的;[主|分區(qū)1] [主|分區(qū)2] [主|分區(qū)3] [擴(kuò)展分區(qū)][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] ... ...
[主|分區(qū)1] [主|分區(qū)2] [擴(kuò)展分區(qū)][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] ... ...
[主|分區(qū)1] [擴(kuò)展分區(qū)][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] ... ...
最不合理的分區(qū)結(jié)構(gòu):主分區(qū)包圍擴(kuò)展分區(qū);比如下面的;
[主|分區(qū)1] [主|分區(qū)2] [擴(kuò)展分區(qū)] [主|分區(qū)4] [空白未分區(qū)空間][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] ... ...
這樣 [主|分區(qū)2] 和 [主|分區(qū)4] 之間的 [擴(kuò)展分區(qū)] 是有自由度,但[主|分區(qū)4]后的[空白未分區(qū)空間]怎么辦?除非把主分區(qū)4完全利用擴(kuò)展分區(qū)后的空間,否則您想在主分區(qū)4后再劃一個分區(qū)是不可能的,劃分邏輯分區(qū)更不可能; 雖然類似此種辦法也符合一個磁盤四個主分區(qū)的標(biāo)準(zhǔn),但這樣主分區(qū)包圍擴(kuò)展分區(qū)的分區(qū)方法實(shí)在不可?。?/P>
推薦的分區(qū)方案
盡管可以將Red Hat Linux裝在一個單一的大分區(qū)中,但更好的主意是將它分開. 綜合了單一分區(qū)的簡單性和多分區(qū)的靈活性,推薦以下配置:
注意: 如果想安裝Red Hat Linux的所有軟件包, 必須使用較大的分區(qū)尺寸。一個交換分區(qū) -- 交換分區(qū)用來支持虛擬內(nèi)存。交換分區(qū)一般是內(nèi)存的兩倍大小。一個根分區(qū) -- 根分區(qū)是/(根目錄)所在地. 它只需要啟動系統(tǒng)所須的文件和系統(tǒng)配置文件. 對于大多數(shù)系統(tǒng)50MB到100MB的根分區(qū)可以工作的很好. 一個 /usr 分區(qū) -- /usr 是Red Hat Linux文件系統(tǒng)的許多軟件的所在的地方. 根據(jù)您交換安裝的包的數(shù)量, 這個分區(qū)應(yīng)該在300MB到700MB之間. 如果可能, 將*** 的空間用于/usr分區(qū). 任何您以后將要安裝的基于RPM的包都會使用比其他 分區(qū)更多的/usr空間.
一個 /home 分區(qū) -- 這是用戶的home目錄所在地; 它的大小取決于您的Red Hat Linux文件系統(tǒng)有多少用戶, 以及這些用戶將存放多少數(shù)據(jù).
[下面這個分區(qū)只適用于Red Hat Linux/Alpha的安裝.
一個MILO分區(qū) -- 使用MILO啟動系統(tǒng)的Alpha用戶需要創(chuàng)建一個1.5MB的DOS分區(qū), 在安裝結(jié)束時MILO可以拷貝到這個分區(qū).。
另外, 用戶環(huán)境可能會要求創(chuàng)建一個和多個以下的分區(qū): 一個 /usr/local 分區(qū) -- 一般, /usr/local用來存放與其余Red Hat Linux文件系統(tǒng) 不同的軟件, 如不是RPM包的軟件. 它的大小取決于準(zhǔn)備存放的這些軟件的數(shù)量. 一個 /usr/src 分區(qū) -- Red Hat Linux文件系統(tǒng)中, /usr/src通常存放兩樣?xùn)|西:
Linux文件系統(tǒng)內(nèi)核源程序 -- Linux內(nèi)核的所有源程序都放在這, 新的內(nèi)核也在這創(chuàng)建. 目前, 內(nèi)核源程序大概30MB。注意:可能需要更多的空間來創(chuàng)建內(nèi)核, 或保存幾個不同版本的內(nèi)核.
RPM包的源程序 -- 如果安裝了包的源程序, 文件將存放在這. 注意:除非特別指定, 創(chuàng)建包也將使用在這的一個'創(chuàng)建目錄'. here.
同樣, 這個分區(qū)的尺寸也取決于將在這安裝的軟件的數(shù)量。
一個 /tmp 分區(qū) -- 就象它的名字, /tmp分區(qū)用來存放臨時文件。對于一個大型的, 多用戶的系統(tǒng)或者網(wǎng)絡(luò)服務(wù)器, 專門創(chuàng)建一個/tmp分區(qū)是一個好主意. 對于一個單用戶的工作站, 就不必專門創(chuàng)建一個/tmp分區(qū)了。
一個 /var 分區(qū) -- Red Hat Linux文件系統(tǒng)將把日志寫在/var/log。 打印 隊(duì)列的文件通常寫在/var/spool。 這只是兩個寫在/var的例子。 除非特別配置, /var將是根Linux文件系統(tǒng)的一部分, 通常不占很多空間。 如果系統(tǒng)有很多打印, 郵件, 或者日志, 可以考慮專門創(chuàng)建一個/var分區(qū)。 一般來講, 只有多用戶或者服務(wù)器才需要專門的/var分區(qū)。
一個 /boot 分區(qū) -- 這里提到的分區(qū)多數(shù)是針對大的系統(tǒng),這個分區(qū)則對空間很少的小的系統(tǒng)很有用。所有LILO啟動需要的文件都在/boot目錄。因?yàn)?boot中的這些文件(包括Linux內(nèi)核)占 1M空間, 如果很難為LILO要用的根分區(qū)安排100MB空間, 可以只用5-10MB (通常不用那么多)的分區(qū)來存放/boot。 雖然仍需要創(chuàng)建一個根分區(qū), 但這時它可以在系統(tǒng)的任何地方 -- BIOS的限制僅適用含有/boot的分區(qū)。
Linux文件系統(tǒng)下加掛
在使用Linux文件系統(tǒng)的過程,常常使用虛擬文件系統(tǒng)VFS,通過VFS可以直接存取其它已被內(nèi)核支持的各種Linux文件系統(tǒng),用起來就像是在普通的 Linux的ext系列文件系統(tǒng)一樣。只是有一些如NTFS需要重新編譯內(nèi)核才能支持。
Linux文件系統(tǒng)下加掛一個使用的是mount命令,用man mount命令可以得到命令參數(shù)的詳細(xì)解釋。下面就來介紹一下在幾種情況下以命令行方式加掛文件系統(tǒng)的具體方法:
1.加掛FAT32文件系統(tǒng)
最簡單的用法:mount /dev/hda6 /mnt/d
其中,/dev/hda6是筆者Windows的D盤,/mnt/d是目錄加掛點(diǎn)。Linux文件系統(tǒng)會識別到/dev/hda6分區(qū)的文件系統(tǒng)類型是什么,然后加掛。當(dāng)然也可以指定分區(qū)的文件系統(tǒng)類型,命令如下:
mount -t vfat /dev/hda6 /mnt/d
在實(shí)際中操作中,直接加掛一個windows的分區(qū),中文的文件名和目錄名會出現(xiàn)亂碼,為了避免這種情況可以指定字符集,命令如下:
mount /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
mount -t vfat /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
2.加掛NTFS文件系統(tǒng)
在目前多數(shù)的Linux文件系統(tǒng)版本上,需要重編譯Linux核心才能,加掛NTFS分區(qū)(參閱
http://www.linux-ntfs.org/
)。核心支持NTFS后,可以用以下命令加掛:
mount -t /dev/hda2 /mnt/c
同樣對于中文的文件名和目錄名會出現(xiàn)亂碼的問題可以指定字符集,不過和加掛vfat分區(qū)不同,實(shí)際中用以下命令是可行的:
mount -t ntfs -o iocharset=cp936 /dev/hda2 /mnt/c -r
mount -t ntfs -o iocharset=cp936,rw /dev/hda2 /mnt/c
3.加掛U盤/移動硬盤上的文件系統(tǒng)
現(xiàn)在使用U盤的人越來越多了,其實(shí)在Linux文件系統(tǒng)下使用U盤也非常簡單,Linux對USB設(shè)備有很好的支持,在插入U盤后,U盤被識別為一個SCSI盤,通常您用以下命令就能加掛U盤上的文件系統(tǒng)
mount /dev/sda1 /usb
同樣對于中文的文件名和目錄名會出現(xiàn)亂碼的問題可以指定字符集,命令類似于上面對FAT32介紹的:
mount /dev/sda1 /usb -o pagecode=936,iocharset=cp936
4.加掛Linux文件系統(tǒng)通過samba共享出來的目錄
利用samba共享出來的目錄其實(shí)很難說其原來是哪種文件系統(tǒng),不過這一點(diǎn)不重要,只要它對用戶是透明的就好啦。加掛時,我們指定類型為smbfs,在加掛samba共享的分區(qū)時,也會出現(xiàn)中文的文件名和目錄名亂碼情況,可以用以下命令加掛:
mount -t smbfs -o
username=terry,password=terry,codepage=936,iocharset=cp936
//terry-linux/terry /mp3/
mount -t smbfs -o
username=terry,password=terry,codepage=936,iocharset=cp936
//192.168.100.228/terry /mp3/
注意:可以不直接寫password=terry這個參數(shù),系統(tǒng)界時會要你輸入密碼,這樣就可以防止有人直接看到你的密碼。視具體情況而定,-o后面的參數(shù)可以對應(yīng)增減。
5.加掛Window系統(tǒng)共享出來的目錄
在局域網(wǎng)中,常常需要去訪問其它Windows系統(tǒng)共享出來的目錄。在Linux文件系統(tǒng)下,安裝了samba后就可以使用samba中帶的命令來訪問Windows機(jī)器的共享資源。
用smbclient來列出Windows機(jī)器的共享資源
smbclient -L 192.168.100.111
根據(jù)上面所列出Windows的共享資源后,可以選擇需要加掛到本地Linux文件系統(tǒng)中去的Windows的共享資源,然后使用smbmount或mount來加掛,請參照下面幾條命令:
smbmount //192.168.100.111/public /public/
mount //192.168.100.111/d /mnt/cdrom -o username=terry (這樣要在命令行輸入密碼的)
mount //192.168.100.111/d /mnt/cdrom -o username=terry$1234 (這樣則不必在命令行輸入密碼)
注:除了上面介紹的命令行方法,***的方法就是使用其它的客戶端,如LinNeighborhood、networkneighbours、ksmbshare等,請參考其它文章。
以上介紹的都是命令行的方式,每次使用時都要輸入一次,如果你常常要加掛一些Linux文件系統(tǒng),想在啟動時自動加掛應(yīng)該怎樣做呢?下面介紹兩種方法:
方法1.
把加掛的命令放在/etc/rc.d/rc.local中。
方法2.
修改分區(qū)配置文件/etc/fstab,在啟動時加掛Linux文件系統(tǒng),下面是我的/etc/fstab文件:
LABEL=/ / ext3 defaults1 1
none /dev/pts devpts gid=5,mode=6200 0
LABEL=/home /home ext3 defaults 1 2
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660
noauto,owner,kudzu,ro 0 0
/dev/hda2 /ntfs ntfs defaults,iocharset=cp936 0 0
/dev/hda6 /win vfat defaults,codepage=936,iocharset=cp936 0 0
//192.168.100.228/terry /mp3 smbfs username=terry,password=terry,codepage=cp936,iocharset=cp936 0 0
注意***三行:
倒數(shù)第四行,加掛我的C盤,NTFS格式的
倒數(shù)第三行,加掛我的D盤,F(xiàn)AT32格式的
倒數(shù)第二行,加掛的是我的局域網(wǎng)中另一臺安裝samba的Linux文件系統(tǒng)服務(wù)器
【編輯推薦】