1.rm-rf刪除目錄裡的檔案後,為什麼可以恢複?
首先建立一個空目錄test,目錄的blocksize為4096位元組
為了空目錄還是4096?首先,目錄的大小取決它所包含的檔案的inode(訪問時間,檔案的位元組數,uid和gid),4096的大小是在建立檔案系統時規劃的。可以使用dumpe2fs查看
看到根分區的blocksize是預設4096
下面繼續,我們在建立的test目錄裡建立1000個檔案
1
for
((i=
0
;i<
1000
;i++));
do
touchfile$i;done
由於建立了1000個新檔案,所以test目錄的blocksize也變大了,隨即我們把test目錄下的所有檔案刪除,再次查看test目錄發現,目錄裡為空白,但是目錄本身的bocksize仍然不變,這也就是我們“資料恢複”的原理:因為rm-rf只是刪除了directoryentry相關的描述符(dirfd)而datablocks,inodes和metadata仍然存在磁碟裡。
可以使用stace查看我的想法,rm-rf過程中主要調用unlinkat()和fstatat64()兩個systemcall
fstatat()這個systemcall作用是getfilestatusrelativetoadirectoryfiledescriptor
unlinkat()這個systemcall作用是removeadirectoryentryrelativetoadirectoryfiledescriptor
可以看出刪除的過程中只是擷取與目錄檔案描述資訊有關的檔案狀態並且刪除directoryentry對應的檔案描述符(其實“目錄”的內容就是一長串directoryentry的資料結構,directoryentry用來描述檔案名稱和inode地址)因為datablocks,inodes以及inodes裡存放的metadata(檔案大小、所屬關係等)仍然存在磁碟裡,所以目錄的大小在刪除目錄裡檔案後沒有任何變化。
所以使用photorec恢複一下被刪除的檔案,輕而易舉恢複了。
2.關於使用vim編輯檔案大小問題
我們建立一個檔案file,vim開啟輸入內容“1234567”共7個位元組
查看file檔案的大小為8個位元組
使用od查看,vim會自動補上一個位元組\n分行符號,所以7個位元組變成8個位元組
3.軟串連大小問題
首先給install.log檔案建立一個軟串連名為install,查看軟串連install的大小為11位元組,為什麼是11位元組呢?數數原檔案的檔案名稱位元組數11位元組,這就對了。
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)。