全面對(duì)Linux文件系統(tǒng)解說反刪除方法
本人很喜歡Linux文件系統(tǒng),下面就這個(gè)問題來詳細(xì)說說Linux文件系統(tǒng)的反刪除方法。Linux是由開發(fā)工具軟件、編輯器軟件、CPU圖形用戶界面、網(wǎng)絡(luò)工具軟件等組成的一個(gè)完整的軟件包。Linux具備現(xiàn)代一切功能完整的UNIX系統(tǒng)所具備的全部特征。
作為一個(gè)多用戶、多任務(wù)的操作系統(tǒng),Linux文件系統(tǒng)一旦被刪除,是難以恢復(fù)的。盡管刪除命令只是在文件節(jié)點(diǎn)中作刪除標(biāo)記,并不真正清除文件內(nèi)容,但是其他用戶和一些有寫盤動(dòng)作的進(jìn)程會(huì)很快覆蓋這些數(shù)據(jù)。不過,對(duì)于家庭單機(jī)使用的Linux文件系統(tǒng),或者誤刪文件后及時(shí)補(bǔ)救,還是可以恢復(fù)的。
Ext2文件系統(tǒng)結(jié)構(gòu)的簡(jiǎn)單介紹
在Linux文件系統(tǒng)所用的Ext2文件系統(tǒng)中,文件是以塊為單位存儲(chǔ)的,默認(rèn)情況下每個(gè)塊的大小是1K,不同的塊以塊號(hào)區(qū)分。每個(gè)文件還有一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)中包含有文件所有者,讀寫權(quán)限,文件類型等信息。對(duì)于一個(gè)小于12個(gè)塊的文件,在節(jié)點(diǎn)中直接存儲(chǔ)文件數(shù)據(jù)塊的塊號(hào)。如果文件大于12個(gè)塊,那么節(jié)點(diǎn)在12個(gè)塊號(hào)之后存儲(chǔ)一個(gè)間接塊的塊號(hào),在這個(gè)間接塊號(hào)所對(duì)應(yīng)的塊中,存儲(chǔ)有256個(gè)文件數(shù)據(jù)塊的塊號(hào)(Ext2fs中每個(gè)塊號(hào)占用4字節(jié),這樣一個(gè)塊中所能存儲(chǔ)的塊號(hào)就是1024/4=256)。如果有更大的文件,那么還會(huì)在節(jié)點(diǎn)中出現(xiàn)二級(jí)間接塊和三級(jí)間接塊。
恢復(fù)被誤刪文件的方法
大多數(shù)Linux文件系統(tǒng)發(fā)行版都提供一個(gè)debugfs工具,可以用來對(duì)Ext2文件系統(tǒng)進(jìn)行編輯操作。不過在使用這個(gè)工具之前,還有一些工作要做。首先以只讀方式重新掛載被誤刪的文件所在分區(qū)。使用如下命令:(假設(shè)文件在/usr分區(qū))mount –r –n –o remount /usr -r表示只讀方式掛載;-n表示不寫入/etc/mtab,如果是恢復(fù)/etc上的文件,就加上這個(gè)參數(shù)。如果系統(tǒng)說xxx partion busy,可以用fuser命令查看一下是哪些進(jìn)程使用這個(gè)分區(qū)上的文件:
fuser –v –m /usr
如果沒有什么重要的進(jìn)程,用以下命令停掉它們:
fuser -k –v –m /usr
然后就可以重新掛載這些Linux文件系統(tǒng)了。
如果是把所有的文件統(tǒng)一安裝在一個(gè)大的/分區(qū)當(dāng)中,可以在boot提示符下用linux single進(jìn)入單用戶模式,盡量減少系統(tǒng)進(jìn)程向硬盤寫入數(shù)據(jù)的機(jī)會(huì),要不干脆把硬盤掛在別的機(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
就會(huì)出現(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個(gè)),***字段是文件節(jié)點(diǎn)號(hào),第二字段是文件所有者,第三字段是讀寫權(quán)限,接下來是文件大小,占用塊數(shù),刪除時(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
程序會(huì)說找到丟失的數(shù)據(jù)塊,放在lost+found里面。這個(gè)目錄里的文件就是我們要的東東。
Now all O.K. Good Luck.
Linux文件系統(tǒng)分區(qū)方案
硬盤的分區(qū)由主分區(qū)、擴(kuò)展分區(qū)和邏輯分區(qū)組成;所以我們?cè)趯?duì)硬盤分區(qū)時(shí)要遵循這個(gè)標(biāo)準(zhǔn);主分區(qū)(包括擴(kuò)展分區(qū))的***個(gè)數(shù)是四個(gè),主分區(qū)(包含擴(kuò)展分區(qū))的個(gè)數(shù)硬盤的主引導(dǎo)記錄MBR(Master Boot Recorder)決定的,MBR存放啟動(dòng)管理程序(GRUB,LILO,NTLOARDER等)和分區(qū)表記錄。其中擴(kuò)展分區(qū)也算一個(gè)主分區(qū);擴(kuò)展分區(qū)下可以包含更多的邏輯分區(qū);所以主分區(qū)(包括擴(kuò)展分區(qū))范圍是從1-4,邏輯分區(qū)是從5開始的;
關(guān)于一個(gè)磁盤的分區(qū),一個(gè)磁盤應(yīng)該有四個(gè)主分區(qū),其中擴(kuò)展也算一個(gè)主分區(qū);存在以下分配方案:
1)分區(qū)結(jié)構(gòu)之一:四個(gè)主分區(qū),沒有擴(kuò)展分區(qū);[主|分區(qū)1] [主分|區(qū)2] [主|分區(qū)3] [主|分區(qū)4]這種情況,如果您想在一個(gè)磁盤上劃分五個(gè)以上分區(qū),這樣是行不通的;三個(gè)主分區(qū) 一個(gè)擴(kuò)展分區(qū);[主|分區(qū)1] [主|分區(qū)2] [主|分區(qū)3] [擴(kuò)展分區(qū)][邏輯|分區(qū)5] [邏輯|分區(qū)6] [邏輯|分區(qū)7] [邏輯|分區(qū)8] 這種情況行得通,而且分區(qū)的自由度比較大;分區(qū)也不受約束,能分超過5個(gè)分區(qū);這只是舉一個(gè)例子;
2)最合理的的分區(qū)方式;
最合理的分區(qū)結(jié)構(gòu):主分區(qū)在前,擴(kuò)展分區(qū)在后,然后在擴(kuò)展分區(qū)中劃分邏輯分區(qū);主分區(qū)的個(gè)數(shù)+擴(kuò)展分區(qū)個(gè)數(shù)要控制在四個(gè)之內(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后再劃一個(gè)分區(qū)是不可能的,劃分邏輯分區(qū)更不可能; 雖然類似此種辦法也符合一個(gè)磁盤四個(gè)主分區(qū)的標(biāo)準(zhǔn),但這樣主分區(qū)包圍擴(kuò)展分區(qū)的分區(qū)方法實(shí)在不可?。?/P>
推薦的分區(qū)方案
盡管可以將Red Hat Linux裝在一個(gè)單一的大分區(qū)中,但更好的主意是將它分開. 綜合了單一分區(qū)的簡(jiǎn)單性和多分區(qū)的靈活性,推薦以下配置:
注意: 如果想安裝Red Hat Linux的所有軟件包, 必須使用較大的分區(qū)尺寸。一個(gè)交換分區(qū) -- 交換分區(qū)用來支持虛擬內(nèi)存。交換分區(qū)一般是內(nèi)存的兩倍大小。一個(gè)根分區(qū) -- 根分區(qū)是/(根目錄)所在地. 它只需要啟動(dòng)系統(tǒng)所須的文件和系統(tǒng)配置文件. 對(duì)于大多數(shù)系統(tǒng)50MB到100MB的根分區(qū)可以工作的很好. 一個(gè) /usr 分區(qū) -- /usr 是Red Hat Linux文件系統(tǒng)的許多軟件的所在的地方. 根據(jù)您交換安裝的包的數(shù)量, 這個(gè)分區(qū)應(yīng)該在300MB到700MB之間. 如果可能, 將*** 的空間用于/usr分區(qū). 任何您以后將要安裝的基于RPM的包都會(huì)使用比其他 分區(qū)更多的/usr空間.
一個(gè) /home 分區(qū) -- 這是用戶的home目錄所在地; 它的大小取決于您的Red Hat Linux文件系統(tǒng)有多少用戶, 以及這些用戶將存放多少數(shù)據(jù).
[下面這個(gè)分區(qū)只適用于Red Hat Linux/Alpha的安裝.
一個(gè)MILO分區(qū) -- 使用MILO啟動(dòng)系統(tǒng)的Alpha用戶需要?jiǎng)?chuàng)建一個(gè)1.5MB的DOS分區(qū), 在安裝結(jié)束時(shí)MILO可以拷貝到這個(gè)分區(qū).。
另外, 用戶環(huán)境可能會(huì)要求創(chuàng)建一個(gè)和多個(gè)以下的分區(qū): 一個(gè) /usr/local 分區(qū) -- 一般, /usr/local用來存放與其余Red Hat Linux文件系統(tǒng) 不同的軟件, 如不是RPM包的軟件. 它的大小取決于準(zhǔn)備存放的這些軟件的數(shù)量. 一個(gè) /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)核, 或保存幾個(gè)不同版本的內(nèi)核.
RPM包的源程序 -- 如果安裝了包的源程序, 文件將存放在這. 注意:除非特別指定, 創(chuàng)建包也將使用在這的一個(gè)'創(chuàng)建目錄'. here.
同樣, 這個(gè)分區(qū)的尺寸也取決于將在這安裝的軟件的數(shù)量。
一個(gè) /tmp 分區(qū) -- 就象它的名字, /tmp分區(qū)用來存放臨時(shí)文件。對(duì)于一個(gè)大型的, 多用戶的系統(tǒng)或者網(wǎng)絡(luò)服務(wù)器, 專門創(chuàng)建一個(gè)/tmp分區(qū)是一個(gè)好主意. 對(duì)于一個(gè)單用戶的工作站, 就不必專門創(chuàng)建一個(gè)/tmp分區(qū)了。
一個(gè) /var 分區(qū) -- Red Hat Linux文件系統(tǒng)將把日志寫在/var/log。 打印 隊(duì)列的文件通常寫在/var/spool。 這只是兩個(gè)寫在/var的例子。 除非特別配置, /var將是根Linux文件系統(tǒng)的一部分, 通常不占很多空間。 如果系統(tǒng)有很多打印, 郵件, 或者日志, 可以考慮專門創(chuàng)建一個(gè)/var分區(qū)。 一般來講, 只有多用戶或者服務(wù)器才需要專門的/var分區(qū)。
一個(gè) /boot 分區(qū) -- 這里提到的分區(qū)多數(shù)是針對(duì)大的系統(tǒng),這個(gè)分區(qū)則對(duì)空間很少的小的系統(tǒng)很有用。所有LILO啟動(dòng)需要的文件都在/boot目錄。因?yàn)?boot中的這些文件(包括Linux內(nèi)核)占 1M空間, 如果很難為L(zhǎng)ILO要用的根分區(qū)安排100MB空間, 可以只用5-10MB (通常不用那么多)的分區(qū)來存放/boot。 雖然仍需要?jiǎng)?chuàng)建一個(gè)根分區(qū), 但這時(shí)它可以在系統(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)下加掛一個(gè)使用的是mount命令,用man mount命令可以得到命令參數(shù)的詳細(xì)解釋。下面就來介紹一下在幾種情況下以命令行方式加掛文件系統(tǒng)的具體方法:
1.加掛FAT32文件系統(tǒng)
最簡(jiǎn)單的用法:mount /dev/hda6 /mnt/d
其中,/dev/hda6是筆者Windows的D盤,/mnt/d是目錄加掛點(diǎn)。Linux文件系統(tǒng)會(huì)識(shí)別到/dev/hda6分區(qū)的文件系統(tǒng)類型是什么,然后加掛。當(dāng)然也可以指定分區(qū)的文件系統(tǒng)類型,命令如下:
mount -t vfat /dev/hda6 /mnt/d
在實(shí)際中操作中,直接加掛一個(gè)windows的分區(qū),中文的文件名和目錄名會(huì)出現(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
同樣對(duì)于中文的文件名和目錄名會(huì)出現(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盤/移動(dòng)硬盤上的文件系統(tǒng)
現(xiàn)在使用U盤的人越來越多了,其實(shí)在Linux文件系統(tǒng)下使用U盤也非常簡(jiǎn)單,Linux對(duì)USB設(shè)備有很好的支持,在插入U(xiǎn)盤后,U盤被識(shí)別為一個(gè)SCSI盤,通常您用以下命令就能加掛U盤上的文件系統(tǒng)
mount /dev/sda1 /usb
同樣對(duì)于中文的文件名和目錄名會(huì)出現(xiàn)亂碼的問題可以指定字符集,命令類似于上面對(duì)FAT32介紹的:
mount /dev/sda1 /usb -o pagecode=936,iocharset=cp936
4.加掛Linux文件系統(tǒng)通過samba共享出來的目錄
利用samba共享出來的目錄其實(shí)很難說其原來是哪種文件系統(tǒng),不過這一點(diǎn)不重要,只要它對(duì)用戶是透明的就好啦。加掛時(shí),我們指定類型為smbfs,在加掛samba共享的分區(qū)時(shí),也會(huì)出現(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這個(gè)參數(shù),系統(tǒng)界時(shí)會(huì)要你輸入密碼,這樣就可以防止有人直接看到你的密碼。視具體情況而定,-o后面的參數(shù)可以對(duì)應(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來加掛,請(qǐng)參照下面幾條命令:
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等,請(qǐng)參考其它文章。
以上介紹的都是命令行的方式,每次使用時(shí)都要輸入一次,如果你常常要加掛一些Linux文件系統(tǒng),想在啟動(dòng)時(shí)自動(dòng)加掛應(yīng)該怎樣做呢?下面介紹兩種方法:
方法1.
把加掛的命令放在/etc/rc.d/rc.local中。
方法2.
修改分區(qū)配置文件/etc/fstab,在啟動(dòng)時(shí)加掛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)中另一臺(tái)安裝samba的Linux文件系統(tǒng)服務(wù)器
【編輯推薦】