国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

Linux文件系統(tǒng)及文件儲存方式

2024-06-28 16:02:04
字體:
供稿:網(wǎng)友

前言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ù)方案。

Linux文件系統(tǒng)構(gòu)成

現(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

文件式的文件結(jié)構(gòu)

以文件 /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):

Created with Rapha?l 2.1.0Innode文件權(quán)限(rwx)文件所有者(root/other)文件創(chuàng)建時間... ... ...數(shù)據(jù)索引 DataBlock文件是否為空?Innode直接數(shù)據(jù)索引一直接數(shù)據(jù)索引二... ... ...直接數(shù)據(jù)索引十二間接一級數(shù)據(jù)索引間接二級數(shù)據(jù)索引間接三級數(shù)據(jù)索引yesnoDataBlock(文件具體內(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)容。

Linux的一個具體文件

新建一個空文件 空文件/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)定好。理論上不能更改。

系統(tǒng)對文件的訪問方式

如上一章節(jié)所訴。系統(tǒng)在訪問文件的時候必須從根”/”開始逐級通過文件名尋找對應(yīng)的Innode號,再通過Innode訪問到文件的具體數(shù)據(jù)。

例如訪問/home/work/File

Created with Rapha?l 2.1.0找到"/"是否是個文件夾?目錄項里有無下級目標(biāo)?找到目標(biāo)文件夾下級目標(biāo)是文件?文件是否存在?找到/home/work/File錯誤結(jié)束yesnoyesnoyesnoyesno

在這里面, 每次目錄的訪問都會對訪問用戶的權(quán)限進行校驗,如果沒有權(quán)限都會報權(quán)限錯誤

Linux系統(tǒng)的刪除方式

了解了文件的儲存形式,才能知道怎么刪除它。

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

static enum RM_statusexcise (FTS *fts, FTSENT *ent, struct rm_options const *x, bool is_dir){ int flag = is_dir ? AT_REMOVEDIR : 0; if (unlinkat (fts->fts_cwd_fd, ent->fts_accpath, flag) == 0) { // PRint // .... return RM_OK; } /* The unlinkat from kernels like linux-2.6.32 reports EROFS even for nonexistent files. When the file is indeed missing, map that to ENOENT, so that rm -f ignores it, as required. Even without -f, this is useful because it makes rm print the more precise diagnostic. */ // .... if (ignorable_missing (x, errno)) return RM_OK; /* When failing to rmdir an unreadable directory, we see errno values like EISDIR or ENOTDIR (or, on Solaris 10, EEXIST), but they would be meaningless in a diagnostic. When that happens and the errno value from the failed open is EPERM or EACCES, use the earlier, more // .... return RM_ERROR;}

即rm的時候i_count加一再減二。 i_nlink減一(刪除目錄項中的文件名與Innode號的映射, 即無法再通過這個文件名進行索引)。


如圖: 文件刪除

可以看到rm的刪除僅僅是去掉目錄項里面的一個值而已

也就可以解釋如下兩個觀點:

當(dāng)一個進程正在訪問文件時,文件依然可以被訪問。 進程已經(jīng)得到了文件的DataBlockls或者cat等操作必須通過文件名,而文件名已經(jīng)在目錄項里面刪除了當(dāng)文件存在其余硬鏈接時,文件依然可以顯示。 硬鏈接是文件名對Innode號的映射只要映射一直存在,文件一定能訪問到(rm不會抹掉Innode)

shred與rm的區(qū)別

shred 在去掉目錄項的時候,還會修改Innode以及覆蓋DataBlock(3次)。 此外shred還有多種模式,比如補充0,多次抹掉等等。

rm刪除文件的恢復(fù)

rm 只是刪除了目錄項的一個鏈接。只要刪除之后當(dāng)前數(shù)據(jù)塊沒有被操作。 文件是一定可以被恢復(fù)的。 見testdisk: How to use TestDisk

還有其它很多的文件恢復(fù)軟件,其使用原理都是繞過文件系統(tǒng),直接訪問磁盤。每讀取到一個Innode就根據(jù)其DataBlock索引找到被刪除文件。

后續(xù)可能會寫一個C的單個文件恢復(fù)的代碼。寫好之后貼上來。

我的代碼

本文若有錯誤敬請輕拍。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 洪泽县| 华亭县| 冷水江市| 乌拉特中旗| 阿克苏市| 阿尔山市| 牙克石市| 铜山县| 长治市| 田东县| 中西区| 龙陵县| 林口县| 博爱县| 长顺县| 麻江县| 保定市| 安龙县| 车险| 阳曲县| 山东省| 临江市| 陈巴尔虎旗| 双桥区| 北碚区| 黑龙江省| 东台市| 九寨沟县| 勃利县| 湟源县| 项城市| 景洪市| 台东县| 莱州市| 澄迈县| 凤凰县| 镶黄旗| 奇台县| 湘潭县| 大连市| 北碚区|