本人很喜歡Linux檔案系統,下面就這個問題來詳細說說Linux檔案系統的反刪除方法。Linux是由開發工具軟體、編輯器軟體、CPU圖形化使用者介面、網路工具軟體等組成的一個完整的軟體包。Linux具備現代一切功能完整的UNIX系統所具備的全部特徵。
作為一個多使用者、多任務的作業系統,Linux檔案系統一旦被刪除,是難以恢複的。儘管刪除命令只是在檔案節點中作刪除標記,並不真正清除檔案內容,但是其他使用者和一些有寫盤動作的進程會很快覆蓋這些資料。不過,對於家庭單機使用的Linux檔案系統,或者誤刪檔案後及時補救,還是可以恢複的。
Ext2檔案系統結構的簡單介紹
在Linux檔案系統所用的Ext2檔案系統中,檔案是以塊為單位儲存的,預設情況下每個塊的大小是1K,不同的塊以塊號區分。每個檔案還有一個節點,節點中包含有檔案所有者,讀寫權限,檔案類型等資訊。對於一個小於12個塊的檔案,在節點中直接隱藏檔資料區塊的塊號。如果檔案大於12個塊,那麼節點在12個塊號之後儲存一個間接塊的塊號,在這個間接塊號所對應的塊中,儲存有256個檔案資料區塊的塊號Ext2fs中每個塊號佔用4位元組,這樣一個塊中所能儲存的塊號就是1024/4=256)。如果有更大的檔案,那麼還會在節點中出現二級間接塊和三級間接塊。
恢複被誤刪檔案的方法
大多數Linux檔案系統發行版都提供一個debugfs工具,可以用來對Ext2檔案系統進行編輯操作。不過在使用這個工具之前,還有一些工作要做。首先以唯讀方式重新掛載被誤刪的檔案所在分區。使用如下命令:假設檔案在/usr分區)mount –r –n –o remount /usr -r表示唯讀方式掛載;-n表示不寫入/etc/mtab,如果是恢複/etc上的檔案,就加上這個參數。如果系統說xxx partion busy,可以用fuser命令查看一下是哪些進程使用這個分區上的檔案:
fuser –v –m /usr
如果沒有什麼重要的進程,用以下命令停掉它們:
fuser -k –v –m /usr
然後就可以重新掛載這些Linux檔案系統了。
如果是把所有的檔案統一安裝在一個大的/分區當中,可以在boot提示符下用linux single進入單一使用者模式,盡量減少系統進程向硬碟寫入資料的機會,要不乾脆把硬碟掛在別的機器上。另外,恢複出來的資料不要寫到/上面,避免破壞那些有用的資料。如果機器上有dos/windows,可以寫到這些分區上面:
mount –r –n /dev/hda1 /mnt/had
然後就可以執行debugfs:假設Linux在 /dev/hda5)
#debugfs /dev/hda5
就會出現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個),第一欄位是檔案節點號,第二欄位是檔案所有者,第三欄位是讀寫權限,接下來是檔案大小,佔用塊數,刪除時間。然後就可以根據檔案大小和刪除日期判斷那些是我們需要的。比如我們要恢複節點是196829的檔案:
可以先看看檔案資料狀態:
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指令恢複檔案:
debugfs:dump /mnt/hda/01.sav
這樣就把檔案恢複出來了。退出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指令後每次顯示一行資訊以供編輯,其它行可以直接按斷行符號表示確認,把deletion time改成0未刪除),Link count改成1。改好後退出debugfs:
debugfs:quit
然後用fsck檢查/dev/hda5
fsck /dev/hda5
程式會說找到丟失的資料區塊,放在lost+found裡面。這個目錄裡的檔案就是我們要的東東。
Now all O.K. Good Luck.
Linux檔案系統資料分割配置
硬碟的分區由主要磁碟分割、擴充分區和邏輯分區組成;所以我們在對硬碟分區時要遵循這個標準;主要磁碟分割包括擴充分區)的最大個數是四個,主要磁碟分割包含擴充分區)的個數硬碟的主引導記錄MBRMaster Boot Recorder)決定的,MBR存放啟動管理程式(GRUB,LILO,NTLOARDER等)和分區表記錄。其中擴充分區也算一個主要磁碟分割;擴充分區下可以包含更多的邏輯分區;所以主要磁碟分割包括擴充分區)範圍是從1-4,邏輯分區是從5開始的;
關於一個磁碟的分區,一個磁碟應該有四個主要磁碟分割,其中擴充也算一個主要磁碟分割;存在以下分配方案:
1)分區結構之一:四個主要磁碟分割,沒有擴充分區;[主|分區1] [主分|區2] [主|分區3] [主|分區4]這種情況,如果您想在一個磁碟上劃分五個以上分區,這樣是行不通的;三個主要磁碟分割 一個擴充分區;[主|分區1] [主|分區2] [主|分區3] [擴充分區][邏輯|分區5] [邏輯|分區6] [邏輯|分區7] [邏輯|分區8] 這種情況行得通,而且分區的自由度比較大;分區也不受約束,能分超過5個分區;這隻是舉一個例子;
2)最合理的的分區方式;
最合理的分區結構:主要磁碟分割在前,擴充分區在後,然後在擴充分區中劃分邏輯分區;主要磁碟分割的個數+擴充分區個數要控制在四個之內;比如下面的分區是比較好的;[主|分區1] [主|分區2] [主|分區3] [擴充分區][邏輯|分區5] [邏輯|分區6] [邏輯|分區7] [邏輯|分區8] ... ...
[主|分區1] [主|分區2] [擴充分區][邏輯|分區5] [邏輯|分區6] [邏輯|分區7] [邏輯|分區8] ... ...
[主|分區1] [擴充分區][邏輯|分區5] [邏輯|分區6] [邏輯|分區7] [邏輯|分區8] ... ...
最不合理的分區結構:主要磁碟分割包圍擴充分區;比如下面的;
[主|分區1] [主|分區2] [擴充分區] [主|分區4] [空白未分區空間][邏輯|分區5] [邏輯|分區6] [邏輯|分區7] [邏輯|分區8] ... ...
這樣 [主|分區2] 和 [主|分區4] 之間的 [擴充分區] 是有自由度,但[主|分區4]後的[空白未分區空間]怎麼辦?除非把主要磁碟分割4完全利用擴充分區後的空間,否則您想在主要磁碟分割4後再劃一個分區是不可能的,劃分邏輯分區更不可能; 雖然類似此種辦法也符合一個磁碟四個主要磁碟分割的標準,但這樣主要磁碟分割包圍擴充分區的分區方法實在不可取;
推薦的資料分割配置
儘管可以將Red Hat Linux裝在一個單一的大分區中,但更好的主意是將它分開. 綜合了單一分區的簡單性和多分區的靈活性,推薦以下配置:
注意: 如果想安裝Red Hat Linux的所有軟體包, 必須使用較大的分區尺寸。一個交換分區 -- 交換分區用來支援虛擬記憶體。交換分區一般是記憶體的兩倍大小。一個根分區 -- 根分區是/(根目錄)所在地. 它只需要啟動系統所須的檔案和系統設定檔. 對於大多數系統50MB到100MB的根分區可以工作的很好. 一個 /usr 分區 -- /usr 是Red Hat Linux檔案系統的許多軟體的所在的地方. 根據您交換安裝的包的數量, 這個分區應該在300MB到700MB之間. 如果可能, 將最大 的空間用於/usr分區. 任何您以後將要安裝的基於RPM的包都會使用比其他 分區更多的/usr空間.
一個 /home 分區 -- 這是使用者的home目錄所在地; 它的大小取決於您的Red Hat Linux檔案系統有多少使用者, 以及這些使用者將存放多少資料.
[下面這個分區只適用於Red Hat Linux/Alpha的安裝.
一個MILO分區 -- 使用MILO啟動系統的Alpha使用者需要建立一個1.5MB的DOS分區, 在安裝結束時MILO可以拷貝到這個分區.。
另外, 使用者環境可能會要求建立一個和多個以下的分區: 一個 /usr/local 分區 -- 一般, /usr/local用來存放與其餘Red Hat Linux檔案系統 不同的軟體, 如不是RPM包的軟體. 它的大小取決於準備存放的這些軟體的數量. 一個 /usr/src 分區 -- Red Hat Linux檔案系統中, /usr/src通常存放兩樣東西:
Linux檔案系統核心來源程式 -- Linux核心的所有來源程式都放在這, 新的核心也在這建立. 目前, 核心來源程式大概30MB。注意:可能需要更多的空間來建立核心, 或儲存幾個不同版本的核心.
RPM包的來源程式 -- 如果安裝了包的來源程式, 檔案將存放在這. 注意:除非特別指定, 建立包也將使用在這的一個'建立目錄'. here.
同樣, 這個分區的尺寸也取決於將在這安裝的軟體的數量。
一個 /tmp 分區 -- 就象它的名字, /tmp分區用來存放臨時檔案。對於一個大型的, 多使用者的系統或者網路伺服器, 專門建立一個/tmp分區是一個好主意. 對於一個單使用者的工作站, 就不必專門建立一個/tmp分區了。
一個 /var 分區 -- Red Hat Linux檔案系統將把日誌寫在/var/log。 列印 隊列的檔案通常寫在/var/spool。 這隻是兩個寫在/var的例子。 除非特別配置, /var將是根Linux檔案系統的一部分, 通常不佔很多空間。 如果系統有很多列印, 郵件, 或者日誌, 可以考慮專門建立一個/var分區。 一般來講, 只有多使用者或者伺服器才需要專門的/var分區。
一個 /boot 分區 -- 這裡提到的分區多數是針對大的系統,這個分區則對空間很少的小的系統很有用。所有LILO啟動需要的檔案都在/boot目錄。因為/boot中的這些檔案(包括Linux核心)占 1M空間, 如果很難為LILO要用的根分區安排100MB空間, 可以只用5-10MB (通常不用那麼多)的分區來存放/boot。 雖然仍需要建立一個根分區, 但這時它可以在系統的任何地方 -- BIOS的限制僅適用含有/boot的分區。
Linux檔案系統下加掛
在使用Linux檔案系統的過程,常常使用虛擬檔案系統VFS,通過VFS可以直接存取其它已被核心支援的各種Linux檔案系統,用起來就像是在普通的 Linux的ext系列檔案系統一樣。只是有一些如NTFS需要重新編譯核心才能支援。
Linux檔案系統下加掛一個使用的是mount命令,用man mount命令可以得到命令參數的詳細解釋。下面就來介紹一下在幾種情況下以命令列方式加掛檔案系統的具體方法:
1.加掛FAT32檔案系統
最簡單的用法:mount /dev/hda6 /mnt/d
其中,/dev/hda6是筆者Windows的D盤,/mnt/d是目錄加掛點。Linux檔案系統會識別到/dev/hda6分區的檔案系統類型是什麼,然後加掛。當然也可以指定分區的檔案系統類型,命令如下:
mount -t vfat /dev/hda6 /mnt/d
在實際中操作中,直接加掛一個windows的分區,中文的檔案名稱和目錄名會出現亂碼,為了避免這種情況可以指定字元集,命令如下:
mount /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
mount -t vfat /dev/hda6 /mnt/d -o codepage=936,iocharset=cp936
2.加掛NTFS檔案系統
在目前多數的Linux檔案系統版本上,需要重編譯Linux核心才能,加掛NTFS分區(參閱
http://www.linux-ntfs.org/
)。核心支援NTFS後,可以用以下命令加掛:
mount -t /dev/hda2 /mnt/c
同樣對於中文的檔案名稱和目錄名會出現亂碼的問題可以指定字元集,不過和加掛vfat分區不同,實際中用以下命令是可行的:
mount -t ntfs -o iocharset=cp936 /dev/hda2 /mnt/c -r
mount -t ntfs -o iocharset=cp936,rw /dev/hda2 /mnt/c
3.加掛隨身碟/移動硬碟上的檔案系統
現在使用隨身碟的人越來越多了,其實在Linux檔案系統下使用隨身碟也非常簡單,Linux對USB裝置有很好的支援,在插入隨身碟後,隨身碟被識別為一個SCSI盤,通常您用以下命令就能加掛隨身碟上的檔案系統
mount /dev/sda1 /usb
同樣對於中文的檔案名稱和目錄名會出現亂碼的問題可以指定字元集,命令類似於上面對FAT32介紹的:
mount /dev/sda1 /usb -o pagecode=936,iocharset=cp936
4.加掛Linux檔案系統通過samba共用出來的目錄
利用samba共用出來的目錄其實很難說其原來是哪種檔案系統,不過這一點不重要,只要它對使用者是透明的就好啦。加掛時,我們指定類型為smbfs,在加掛samba共用的分區時,也會出現中文的檔案名稱和目錄名亂碼情況,可以用以下命令加掛:
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這個參數,系統界時會要你輸入密碼,這樣就可以防止有人直接看到你的密碼。視具體情況而定,-o後面的參數可以對應增減。
5.加掛Window系統共用出來的目錄
在區域網路中,常常需要去訪問其它Windows系統共用出來的目錄。在Linux檔案系統下,安裝了samba後就可以使用samba中帶的命令來訪問Windows機器的共用資源。
用smbclient來列出Windows機器的共用資源
smbclient -L 192.168.100.111
根據上面所列出Windows的共用資源後,可以選擇需要加掛到本地Linux檔案系統中去的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檔案系統,想在啟動時自動加掛應該怎樣做呢?下面介紹兩種方法:
方法1.
把加掛的命令放在/etc/rc.d/rc.local中。
方法2.
修改分區設定檔/etc/fstab,在啟動時加掛Linux檔案系統,下面是我的/etc/fstab檔案:
LABEL=//ext3defaults1 1
none /dev/pts devpts gid=5,mode=6200 0
LABEL=/home/homeext3defaults 1 2
none /procprocdefaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda4 swap swapdefaults 0 0
/dev/cdrom /mnt/cdrom iso9660
noauto,owner,kudzu,ro 0 0
/dev/hda2/ntfs ntfs defaults,iocharset=cp9360 0
/dev/hda6/win vfat defaults,codepage=936,iocharset=cp936 0 0
//192.168.100.228/terry /mp3smbfsusername=terry,password=terry,codepage=cp936,iocharset=cp936 0 0
注意最後三行:
倒數第四行,加掛我的C盤,NTFS格式的
倒數第三行,加掛我的D盤,FAT32格式的
倒數第二行,加掛的是我的區域網路中另一台安裝samba的Linux檔案系統伺服器
- 簡單講述Linux檔案系統分區瞭解
- Linux檔案系統安裝模組化講解
- Linux檔案系統類型引領入門
- 綜合講解linux檔案系統分類
- 兩個Linux檔案系統效能測試工具