深刻理解Linux文件系統

1.rm-rf刪除目錄裏的文件後,爲何能夠恢復?node

105317164.jpg

首先建立一個空目錄test,目錄的blocksize爲4096字節vim

100805859.jpg

爲了空目錄仍是4096?首先,目錄的大小取決它所包含的文件的inode(訪問時間,文件的字節數,uid和gid),4096的大小是在創建文件系統時規劃的。可使用dumpe2fs查看數據結構

101617189.jpg

看到根分區的blocksize是默認4096dom

下面繼續,咱們在新建的test目錄裏建立1000個文件ide

for ((i=0; i<1000; i++)); do touch file$i; done

102127989.jpg

因爲建立了1000個新文件,因此test目錄的blocksize也變大了,隨即咱們把test目錄下的全部文件刪除,再次查看test目錄發現,目錄裏爲空,可是目錄自己的bocksize仍然不變,這也就是咱們「數據恢復」的原理:由於rm-rf只是刪除了directoryentry相關的描述符(dirfd)而datablocks,inodes和metadata仍然存在磁盤裏。ui

102453701.jpg

可使用stace查看個人想法,rm-rf過程當中主要調用unlinkat()和fstatat64()兩個systemcallspa

110525380.jpg

fstatat()這個systemcall做用是getfilestatusrelativetoadirectoryfiledescriptor3d

unlinkat()這個systemcall做用是removeadirectoryentryrelativetoadirectoryfiledescriptorblog

能夠看出刪除的過程當中只是獲取與目錄文件描述信息有關的文件狀態而且刪除directoryentry對應的文件描述符(其實「目錄」的內容就是一長串directoryentry的數據結構,directoryentry用來描述文件名和inode地址)由於datablocks,inodes以及inodes裏存放的metadata(文件大小、所屬關係等)仍然存在磁盤裏,因此目錄的大小在刪除目錄裏文件後沒有任何變化。ip

因此使用photorec恢復一下被刪除的文件,垂手可得的恢復了。

2.關於使用vim編輯文件大小問題

咱們建立一個文件file,vim打開輸入內容「1234567」共7個字節

143058110.jpg

查看file文件的大小爲8個字節

使用od查看,vim會自動補上一個字節\n換行符,因此7個字節變成8個字節

143642274.jpg


3.軟鏈接文件大小問題

首先給install.log文件建立一個軟鏈接名爲install,查看軟鏈接install的大小爲11字節,爲何是11字節呢?數數原文件的文件名字節數11字節,這就對了。

144723127.jpg

4.如何真正刪除一個文件

1.刪除文件描述符(filedescriptor),由第一個問題能夠知道,執行rm-rf*後其實刪除的文件是能夠恢復的,也就是說文件的數據仍是能夠被訪問的,是由於datablocks,inodes以及inodes裏存放的metadata都在磁盤上。

2.刪除元數據(metadata),可使用>filename,datablock裏的真實數據依然存在磁盤裏。

3.刪除真實數據(datablock),須要產生一些隨機數填充文件,而後再刪除文件

順序是ddif=/dev/randomof=filename而後rm-rffilename

這樣真實數據就會被刪除。更快的方法是使用設備/dev/urandom,不過雖然沒有/dev/random的隨機性強,但已經能知足擦除磁盤數據的目的了。

爲何使用/dev/random設備比使用/dev/zero設備更好一些呢?

二者設備都會讀取以前數據記錄(datatrace),使用/dev/zero會比使用/dev/random設備更容易讀取到以前的數據記錄(datatrace)。

相關文章
相關標籤/搜索