文件系統(tǒng)特性
文件系統(tǒng)通常會將這兩部份的數(shù)據(jù)分別存放在不同的區(qū)塊,權(quán)限與屬性放置到 inode 中,至于實際數(shù)據(jù)則放置到 data block 區(qū)塊中但金。 另外,還有一個超級區(qū)塊 (superblock) 會記錄整個文件系統(tǒng)的整體信息,包括 inode 與 block 的總量、使用量、剩余量等。
每個 inode 與 block 都有編號谷朝,至于這三個數(shù)據(jù)的意義可以簡略說明如下:
- superblock:記錄此 filesystem 的整體信息,包括inode/block的總量武花、使用量圆凰、剩余量, 以及文件系統(tǒng)的格式與相關(guān)信息等髓堪;
- inode:記錄文件的屬性送朱,一個文件占用一個inode,同時記錄此文件的數(shù)據(jù)所在的 block 號碼干旁;
- block:實際記錄文件的內(nèi)容驶沼,若文件太大時,會占用多個 block 争群。
由于每個 inode 與 block 都有編號回怜,而每個文件都會占用一個 inode ,inode 內(nèi)則有文件數(shù)據(jù)放置的 block 號碼。 找到文件的 inode 的話玉雾,就會知道這個文件所放置數(shù)據(jù)的 block 號碼翔试, 就能夠讀出該文件的實際數(shù)據(jù)了。這種數(shù)據(jù)存取的方法我們稱為索引式文件系統(tǒng)(indexed allocation)复旬。如下圖所示:
[圖片上傳中...(image-2f8871-1600850655336-5)]
inode/block 數(shù)據(jù)存取示意圖
還有一種鏈式存儲結(jié)構(gòu)垦缅,F(xiàn)AT 這種格式的文件系統(tǒng)并沒有 inode 存在,所以 FAT 沒有辦法將這個文件的所有 block 在一開始就讀取出來驹碍。每個 block 號碼都記錄在前一個 block 當中壁涎, 他的讀取方式有點像底下這樣:
[圖片上傳中...(image-66ced4-1600850655336-4)]
FAT文件系統(tǒng)數(shù)據(jù)存取示意圖
Linux 的 EXT2 文件系統(tǒng)(inode):
Linux 文件系統(tǒng) Ext2 就是使用 inode 為基礎的文件系統(tǒng)啦!
Ext2 文件系統(tǒng)在格式化的時候基本上是區(qū)分為多個區(qū)塊群組 (block group) 的志秃,每個區(qū)塊群組都有獨立的 inode/block/superblock 系統(tǒng)怔球。Ext2 格式化后有點像底下這樣:
[圖片上傳失敗...(image-fe6002-1600850655336)]
在整體的規(guī)劃當中,文件系統(tǒng)最前面有一個啟動扇區(qū)(boot sector)浮还,這個啟動扇區(qū)可以安裝啟動管理程序竟坛, 這是個非常重要的設計,因為如此一來我們就能夠?qū)⒉煌膯庸芾沓绦虬惭b到個別的文件系統(tǒng)最前端钧舌,而不用覆蓋整顆硬盤唯一的 MBR担汤, 這樣也才能夠制作出多重引導的環(huán)境啊延刘!
- data block (數(shù)據(jù)區(qū)塊)
data block 是用來放置文件內(nèi)容數(shù)據(jù)地方漫试,在 Ext2 文件系統(tǒng)中所支持的 block 大小有 1K, 2K 及 4K 三種而已六敬。在格式化時 block 的大小就固定了碘赖,且每個 block 都有編號,以方便 inode 的記錄啦外构。 不過要注意的是普泡,由于 block 大小的差異,會導致該文件系統(tǒng)能夠支持的最大磁盤容量與最大單一文件容量并不相同审编。 因為 block 大小而產(chǎn)生的 Ext2 文件系統(tǒng)限制如下:
Block 大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大單一文件限制 | 16GB | 256GB | 2TB |
最大文件系統(tǒng)總?cè)萘?/td> | 2TB | 8TB | 16TB |
除此之外 Ext2 文件系統(tǒng)的 block 還有限制如下:
- 原則上撼班,block 的大小與數(shù)量在格式化完就不能夠再改變了(除非重新格式化);
- 每個 block 內(nèi)最多只能夠放置一個文件的數(shù)據(jù)垒酬;
- 承上砰嘁,如果文件大于 block 的大小,則一個文件會占用多個 block 數(shù)量勘究;
- 承上矮湘,若文件小于 block ,則該 block 的剩余容量就不能夠再被使用了(磁盤空間會浪費)口糕。
- inode table (inode 表格)
inode 記錄的文件數(shù)據(jù)至少有底下這些:
- 該文件的存取模式(read/write/excute)缅阳;
- 該文件的擁有者與群組(owner/group);
- 該文件的容量景描;
- 該文件創(chuàng)建或狀態(tài)改變的時間(ctime)十办;
- 最近一次的讀取時間(atime)秀撇;
- 最近修改的時間(mtime);
- 定義文件特性的旗標(flag)向族,如 SetUID...呵燕;
- 該文件真正內(nèi)容的指向 (pointer);
inode 的數(shù)量與大小也是在格式化時就已經(jīng)固定了件相,除此之外 inode 還有如下特點:
- 每個 inode 大小均固定為 128 bytes虏等;
- 每個文件都僅會占用一個 inode 而已;
- 承上适肠,因此文件系統(tǒng)能夠創(chuàng)建的文件數(shù)量與 inode 的數(shù)量有關(guān)霍衫;
- 系統(tǒng)讀取文件時需要先找到 inode,并分析 inode 所記錄的權(quán)限與用戶是否符合侯养,若符合才能夠開始實際讀取 block 的內(nèi)容敦跌。
我們約略來分析一下 inode / block 與文件大小的關(guān)系好了。inode 要記錄的數(shù)據(jù)非常多逛揩,但偏偏又只有 128bytes 而已柠傍, 而 inode 記錄一個 block 號碼要花掉 4byte ,假設我一個文件有 400MB 且每個 block 為 4K 時辩稽, 那么至少也要十萬筆 block 號碼的記錄呢惧笛!inode 哪有這么多可記錄的信息?為此我們的系統(tǒng)很聰明的將 inode 記錄 block 號碼的區(qū)域定義為12個直接逞泄,一個間接, 一個雙間接與一個三間接記錄區(qū)患整。這是啥?我們將 inode 的結(jié)構(gòu)畫一下好了喷众。
[圖片上傳失敗...(image-e5def4-1600850655335)]
這樣子 inode 能夠指定多少個 block 呢各谚?我們以較小的 1K block 來說明好了,可以指定的情況如下:
12 個直接指向: 12*1K=12K
由于是直接指向到千,所以總共可記錄 12 筆記錄昌渤,因此總額大小為如上所示;間接: 256*1K=256K
每筆 block 號碼的記錄會花去 4bytes憔四,因此 1K 的大小能夠記錄 256 筆記錄膀息,因此一個間接可以記錄的文件大小如上;雙間接: 2562561K=2562K
第一層 block 會指定 256 個第二層了赵,每個第二層可以指定 256 個號碼潜支,因此總額大小如上;三間接: 256256256*1K=2563K
第一層 block 會指定 256 個第二層斟览,每個第二層可以指定 256 個第三層毁腿,每個第三層可以指定 256 個號碼,因此總額大小如上;總額:將直接已烤、間接鸠窗、雙間接、三間接加總胯究,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB
- Superblock (超級區(qū)塊)
Superblock 是記錄整個 filesystem 相關(guān)信息的地方稍计, 沒有 Superblock ,就沒有這個 filesystem 了裕循。他記錄的信息主要有:
- block 與 inode 的總量臣嚣;
- 未使用與已使用的 inode / block 數(shù)量;
- block 與 inode 的大小 (block 為 1, 2, 4K剥哑,inode 為 128 bytes)硅则;
- filesystem 的掛載時間、最近一次寫入數(shù)據(jù)的時間株婴、最近一次檢驗磁盤 (fsck) 的時間等文件系統(tǒng)的相關(guān)信息怎虫;
- 一個 valid bit 數(shù)值,若此文件系統(tǒng)已被掛載困介,則 valid bit 為 0 大审,若未被掛載,則 valid bit 為 1 座哩。
Superblock 是非常重要的徒扶,因為我們這個文件系統(tǒng)的基本信息都寫在這里,因此根穷,如果 superblock 死掉了姜骡, 你的文件系統(tǒng)可能就需要花費很多時間去挽救啦!一般來說缠诅, superblock 的大小為 1024bytes溶浴。 事實上除了第一個 block group 內(nèi)會含有 superblock 之外乍迄,后續(xù)的 block group 不一定含有 superblock 管引, 而若含有 superblock 則該 superblock 主要是做為第一個 block group 內(nèi) superblock 的備份,這樣可以進行 superblock 的救援呢闯两!
- Filesystem Description (文件系統(tǒng)描述說明)
這個區(qū)段可以描述每個 block group 的開始與結(jié)束的 block 號碼褥伴,以及說明每個區(qū)段 (superblock, bitmap, inodemap, data block) 分別介于哪一個 block 號碼之間。這部份也能夠用來觀察的漾狼。
- block bitmap (區(qū)塊對照表)
從 block bitmap 當中可以知道哪些 block 是空的重慢,因此我們的系統(tǒng)就能夠很快速的找到可使用的空間來處置文件啰。同樣的逊躁,刪除文件時似踱,那么那些文件原本占用的 block 號碼就得要釋放出來。
- inode bitmap (inode 對照表)
這個其實與 block bitmap 是類似的功能。
- 目錄
在 Linux 下的 ext2 文件系統(tǒng)中核芽,目錄的 block 則是記錄在這個目錄下的文件名與該文件名占用的 inode 號碼數(shù)據(jù)囚戚。也就是說目錄所占用的 block 內(nèi)容在記錄如下的信息:
[圖片上傳中...(image-7ed6fa-1600850655335-1)]
目錄占用的 block 記錄的數(shù)據(jù)示意圖
下面展示 /etc/passwd 有關(guān)的目錄與文件數(shù)據(jù)的讀取流程為(假設讀取者身份為 vbird 這個一般身份使用者):
/ 的 inode:
透過掛載點的信息找到 /dev/hdc2 的 inode 號碼為 2 的根目錄 inode,且 inode 規(guī)范的權(quán)限讓我們可以讀取該 block 的內(nèi)容(有 r 與 x) 轧简;/ 的 block:
經(jīng)過上個步驟取得 block 的號碼驰坊,并找到該內(nèi)容有 etc/ 目錄的 inode 號碼 (1912545);etc/ 的 inode:
讀取 1912545 號 inode 得知 vbird 具有 r 與 x 的權(quán)限哮独,因此可以讀取 etc/ 的 block 內(nèi)容拳芙;etc/ 的 block:
經(jīng)過上個步驟取得 block 號碼,并找到該內(nèi)容有 passwd 文件的 inode 號碼 (1914888)皮璧;passwd 的 inode:
讀取 1914888 號 inode 得知 vbird 具有 r 的權(quán)限舟扎,因此可以讀取 passwd 的 block 內(nèi)容;passwd 的 block:
最后將該 block 內(nèi)容的數(shù)據(jù)讀出來悴务。
- 掛載點的意義 (mount point):
每個 filesystem 都有獨立的 inode / block / superblock 等信息浆竭,這個文件系統(tǒng)要能夠鏈接到目錄樹才能被我們使用。 將文件系統(tǒng)與目錄樹結(jié)合的動作我們稱為掛載惨寿。 掛載點一定是目錄邦泄,該目錄為進入該文件系統(tǒng)的入口。 因此并不是你有任何文件系統(tǒng)都能使用裂垦,必須要掛載到目錄樹的某個目錄后顺囊,才能夠使用該文件系統(tǒng)的。
其他 Linux 支持的文件系統(tǒng)與 VFS
雖然 Linux 的標準文件系統(tǒng)是 ext2 蕉拢,且還有添加了日志功能的 ext3 特碳,事實上,Linux 還有支持很多文件系統(tǒng)格式的晕换, 尤其是最近這幾年推出了好幾種速度很快的日志式文件系統(tǒng)午乓,包括 SGI 的 XFS 文件系統(tǒng), 可以適用更小型文件的 Reiserfs 文件系統(tǒng)闸准,以及 Windows 的 FAT 文件系統(tǒng)等等益愈, 都能夠被 Linux 所支持喔!常見的支持文件系統(tǒng)有:
- 傳統(tǒng)文件系統(tǒng):ext2 / minix / MS-DOS / FAT (用 vfat 模塊) / iso9660 (光盤)等等夷家;
- 日志式文件系統(tǒng): ext3 / ReiserFS / Windows' NTFS / IBM's JFS / SGI's XFS
- 網(wǎng)絡文件系統(tǒng): NFS / SMBFS
了解了我們使用的文件系統(tǒng)之后蒸其,再來則是要提到,那么 Linux 的核心又是如何管理這些認識的文件系統(tǒng)呢库快? 其實摸袁,整個 Linux 的系統(tǒng)都是透過一個名為 Virtual Filesystem Switch 的核心功能去讀取 filesystem 的。 也就是說义屏,整個 Linux 認識的 filesystem 其實都是 VFS 在進行管理靠汁,我們使用者并不需要知道每個 分區(qū)上的 filesystem 是什么~ VFS 會主動的幫我們做好讀取的動作呢~
假設你的 / 使用的是 /dev/hda1 蜂大,用 ext3 ,而 /home 使用 /dev/hda2 蝶怔,用 reiserfs 县爬, 那么你取用 /home/dmtsai/.bashrc 時,有特別指定要用的什么文件系統(tǒng)的模塊來讀取嗎添谊? 應該是沒有吧财喳!這個就是 VFS 的功能啦!透過這個 VFS 的功能來管理所有的 filesystem斩狱, 省去我們需要自行配置讀取文件系統(tǒng)的定義啊~方便很多耳高!整個 VFS 可以約略用下圖來說明:
實體鏈接與符號鏈接: ln
在 Linux 底下的連結(jié)檔有兩種,一種是類似 Windows 的快捷方式功能的文件所踊,可以讓你快速的鏈接到目標文件(或目錄)泌枪; 另一種則是透過文件系統(tǒng)的 inode 連結(jié)來產(chǎn)生新文件名,而不是產(chǎn)生新文件秕岛!這種稱為實體鏈接 (hard link)碌燕。
Hard Link (實體鏈接, 硬式連結(jié)或?qū)嶋H連結(jié))
文件名只與目錄有關(guān),但是文件內(nèi)容則與 inode 有關(guān)继薛。而hard link 只是在某個目錄下新增一個文件名鏈接到某 inode 號碼的關(guān)連記錄而已修壕。
hard link 有如下限制:
- 不能跨 Filesystem;
- 不能 link 目錄遏考。
Symbolic Link (符號鏈接慈鸠,亦即是快捷方式)
Symbolic link 就是在創(chuàng)建一個獨立的文件,會創(chuàng)建inode和block灌具,而這個文件會讓數(shù)據(jù)的讀取指向他 連接的文件的inode青团。由于只是利用文件來做為指向的動作, 所以咖楣,當源文件被刪除之后督笆,symbolic link 的文件會開不了。