前言linux文件系統(tǒng)構(gòu)成文件式的文件結(jié)構(gòu)Linux的一個具體文件系統(tǒng)對文件的訪問方式Linux系統(tǒng)的刪除方式shred與rm的區(qū)別rm刪除文件的恢復(fù)
閑來無事復(fù)習(xí)了下Linux文件系統(tǒng)的基本構(gòu)成,做下記錄。主要涉及的內(nèi)容有: Ext文件系統(tǒng)的記錄方式; Linux文件系統(tǒng)的訪問方式; rm刪除的原理以及恢復(fù)方案。
現(xiàn)在一般使用的是Ext4格式的文件系統(tǒng), 由最初的Ext2發(fā)展而來。 對于Ext2和Ext3文件系統(tǒng)的描述, 請見:
初窺Linux 之 ext2/ext3文件系統(tǒng)淺談Linux下的EXT3文件系統(tǒng)Linux將文件系統(tǒng)抽象為一個樹形結(jié)構(gòu),可以在系統(tǒng)內(nèi)掛載多個磁盤。 Linux里面所有數(shù)據(jù)都是文件,文件夾也是文件。 文件由如下內(nèi)容構(gòu)成:
目錄項(即文件名與Inode的映射)Inode(文件基本信息與數(shù)據(jù)塊 DataBlock 索引)DataBlock以文件 /root/File 為例:
# pwd/root# stat /root/ File: `/root/' Size: 4096 Blocks: 8 IO Block: 4096 directoryDevice: fd01h/64769d Inode: 2315 Links: 14access: (0550/dr-xr-x---) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2017-02-08 16:09:51.510593179 +0800Modify: 2017-02-08 16:09:45.789604414 +0800Change: 2017-02-08 16:09:45.789604414 +0800# stat File File: `File' Size: 23496 Blocks: 48 IO Block: 4096 regular fileDevice: fd01h/64769d Inode: 57115 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2017-02-08 16:06:52.739596489 +0800Modify: 2017-02-08 16:06:52.739596489 +0800Change: 2017-02-08 16:06:52.739596489 +0800當(dāng)前操作系統(tǒng)持有的磁盤, 0~1號扇區(qū)為引導(dǎo)扇區(qū), 2號扇區(qū)歸”/”使用。
# stat / File: `/' Size: 4096 Blocks: 8 IO Block: 4096 directoryDevice: fd01h/64769d Inode: 2 Links: 30Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2017-02-08 13:21:03.821594978 +0800Modify: 2016-07-31 03:53:01.651715290 +0800Change: 2016-07-31 03:53:01.651715290 +0800其包含:
Innode: 通過上級目錄項的Innode序列’2’找到InnodeInnode中的DataBlock又是一個目錄項,其中有root -> 2315的映射由此層層找到了/root/File這個文件。該文件依然包含:
Innode(大小共128B):
DataBlock(文件具體內(nèi)容)其中DataBlock的計算方式為:
十五個索引的大小都是4B, 共60B。前十二個直接索引直接索引到Block, Linux支持的Block大小有1K,2K, 4K間接索引就是索引的索引。可以索引 (Block大小 / 4B) * Block大小數(shù)據(jù)雙間接索引是間接索引的索引,三間接索引是雙間接索引的索引設(shè)置為1KB Block大小的文件系統(tǒng)的最大單個文件支持量16G。
Block大小設(shè)1KB為,則間接為(1KB / 4B) * 1KB = 256KB。
總空間= 直接+ 間接+ 雙間接+ 三間接 總空間= 12K + 256K + 256 * 256K + 256 * 256 *256K = 16G.
其余:
| Block大小 | 最大單一文件限制 |
|---|---|
| 1KB | 16GB |
| 2KB | 256GB |
| 4KB | 2TB |
文件和文件夾的一個區(qū)別為其DataBlock里面儲存的內(nèi)容不一樣。文件夾儲存的是當(dāng)前文件夾下一級所有的文件名與Innode號的映射;而文件則儲存的是文件的具體內(nèi)容。
新建一個空文件 空文件/root/EmptyFile 進行對比
# touch EmptyFile# stat EmptyFile File: `EmptyFile' Size: 0 Blocks: 0 IO Block: 4096 regular empty fileDevice: fd01h/64769d Inode: 57109 Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2017-02-08 16:09:45.789604414 +0800Modify: 2017-02-08 16:09:45.789604414 +0800Change: 2017-02-08 16:09:45.789604414 +0800它的文件名儲存在 /root 的 DataBlock中。即目錄項。Innode里面包含了 Inode: 57109 、Links: 1、Access: (0644/-rw-r–r–)等信息數(shù)據(jù)塊大小扇區(qū)大小 0.5KB, 8個扇區(qū)湊成一個Block,所占Block: 0, Size: 0。該文件無數(shù)據(jù)。作為對比File的Blocks: 48, Size: 23496。 一個Block只能屬于一個文件。未使用完畢則空置。 每個扇區(qū)的大小、Block由多少個扇區(qū)組成、Block的大小在系統(tǒng)格式化的時候就已經(jīng)定好。理論上不能更改。
如上一章節(jié)所訴。系統(tǒng)在訪問文件的時候必須從根”/”開始逐級通過文件名尋找對應(yīng)的Innode號,再通過Innode訪問到文件的具體數(shù)據(jù)。
例如訪問/home/work/File
在這里面, 每次目錄的訪問都會對訪問用戶的權(quán)限進行校驗,如果沒有權(quán)限都會報權(quán)限錯誤
了解了文件的儲存形式,才能知道怎么刪除它。
Linux對每一個文件都設(shè)置了兩個引用計數(shù)器i_count/i_nlink。這兩個計數(shù)器是關(guān)乎Linux操作系統(tǒng)的,跟文件系統(tǒng)無太大關(guān)聯(lián)。
i_count: 引用計數(shù)器,文件被一進程引用,i_count數(shù)增加 ,可以認為是當(dāng)前文件使用者的數(shù)量; i_nlink: 硬鏈接數(shù)目(可以理解為磁盤的引用計數(shù)器),創(chuàng)建硬鏈接對應(yīng)的 i_nlink 就會增加
通過分析rm的源碼得知它是調(diào)用了系統(tǒng)函數(shù)unlinkat
即rm的時候i_count加一再減二。 i_nlink減一(刪除目錄項中的文件名與Innode號的映射, 即無法再通過這個文件名進行索引)。
如圖: 
可以看到rm的刪除僅僅是去掉目錄項里面的一個值而已
也就可以解釋如下兩個觀點:
當(dāng)一個進程正在訪問文件時,文件依然可以被訪問。 進程已經(jīng)得到了文件的DataBlockls或者cat等操作必須通過文件名,而文件名已經(jīng)在目錄項里面刪除了當(dāng)文件存在其余硬鏈接時,文件依然可以顯示。 硬鏈接是文件名對Innode號的映射只要映射一直存在,文件一定能訪問到(rm不會抹掉Innode)shred 在去掉目錄項的時候,還會修改Innode以及覆蓋DataBlock(3次)。 此外shred還有多種模式,比如補充0,多次抹掉等等。
rm 只是刪除了目錄項的一個鏈接。只要刪除之后當(dāng)前數(shù)據(jù)塊沒有被操作。 文件是一定可以被恢復(fù)的。 見testdisk: How to use TestDisk
還有其它很多的文件恢復(fù)軟件,其使用原理都是繞過文件系統(tǒng),直接訪問磁盤。每讀取到一個Innode就根據(jù)其DataBlock索引找到被刪除文件。
后續(xù)可能會寫一個C的單個文件恢復(fù)的代碼。寫好之后貼上來。
我的代碼本文若有錯誤敬請輕拍。
新聞熱點
疑難解答
圖片精選