對於 Linux 來講正規的文件系統爲 EXT2,一個文件系統存儲的數據一般包括文件權限和屬性,以及文件數據,這兩部分分別存儲在不一樣的地方。node
簡單的說文件系統數據分爲3部分:spa
Superblock:記錄此文件系統的總體信息,包括 inode/iblock 的總量、使用量、剩餘量、以及文件系統的總體信息;code
Inode:記錄文件的屬性,一個文件佔用一個 inode,同時記錄此文件數據所在的 block 號碼;blog
Iblock:實際記錄文件的內容,若文件過大時,會佔用多個 block。索引
個人理解 文件系統由包含多個文件,每一個文件都會佔用1個 inode 和若干 iblock。inode 用來存儲文件權限和屬性,以及文件數據存放的 iblock 的編號。iblock 則存放文件的實際數據(每一個 inode 和 iblock都含有一個編號)。ip
對於容量很大的文件系統,EXT2格式化時會分爲多個 block group,每一個組隊都有一個獨立的/inode/iblock/superblockit
iblock 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1 K, 2 K 及 4 K 三種而已。 每一個 block 內最多隻可以放置一個文件的數據; 承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量; 承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)。io
Inode 主要包含信息table
每一個 inode 大小均固定爲 128 bytes; 每一個文件都僅會佔用一個 inode 而已; 承上,所以文件系統可以建立的文件數量與 inode 的數量有關; 系統讀取文件時須要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合纔可以開始實際讀取 block 的內容。ast
inode 要記錄的數據很是多,但恰恰又只有128 bytes 而已,爲了記錄更多的數據,系統會將 inode 記錄 block 號碼的區域定義爲12個直接,一個間接, 一個雙間接與一個三間接記錄區。記錄區。
假設 block 爲1 K
12 個直接指向: 12*1 K=12 K 因爲是直接指向,因此總共可記錄 12 筆記錄,所以總額大小爲如上所示;
間接:256*1 K=256 K 每筆 block 號碼的記錄會花去 4 bytes,所以 1 K 的大小可以記錄 256 筆記錄,所以一個間接能夠記錄的文件大小如上;
雙間接: 256*256*1 K=256^2 K 第一層 block 會指定 256 個第二層,每一個第二層能夠指定 256 個號碼,所以總額大小如上;
三間接: 256*256*256*1 K=256^3 K 第一層 block 會指定 256 個第二層,每一個第二層能夠指定 256 個第三層,每一個第三層能夠指定 256 個號碼,所以總額大小如上;
總額:將直接、間接、雙間接、三間接加總,獲得 12 + 256 + 256*256 + 256*256*256 (K) = 16 GB
Superblock 是記錄整個 filesystem 相關信息的地方, 沒有 Superblock,就沒有這個 filesystem 了。他記錄的信息主要有:
經過 dumpe2fs 命令查看文件系統的 superblock
舉例:觀察文件系統的相關信息
[root@www ~]# df <==這個命令能夠叫出目前掛載的裝置 Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3822848 5585708 41% / /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm [root@www ~]# dumpe2fs /dev/hdc2 dumpe2fs 1.39 (29-May-2006) Filesystem volume name: /1 <==這個是文件系統的名稱(Label) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file Default mount options: user_xattr acl <==默認掛載的參數 Filesystem state: clean <==這個文件系統是沒問題的(clean) Errors behavior: Continue Filesystem OS type: Linux Inode count: 2560864 <==inode 的總數 Block count: 2560359 <==block 的總數 Free blocks: 1524760 <==還有多少個 block 可用 Free inodes: 2411225 <==還有多少個 inode 可用 First block: 0 Block size: 4096 <==每一個 block 的大小啦! Filesystem created: Fri Sep 5 01:49:20 2008 Last mount time: Mon Sep 22 12:09:30 2008 Last write time: Mon Sep 22 12:09:30 2008 Last checked: Fri Sep 5 01:49:20 2008 First inode: 11 Inode size: 128 <==每一個 inode 的大小 Journal inode: 8 Journal backup: inode blocks Journal size: 128M Group 0: (Blocks 0-32767) <==第一個 data group 內容, 包含 block 的啓始/結束號碼 Primary superblock at 0, Group descriptors at 1-1 <==超級區塊在 0 號 block Reserved GDT blocks at 2-626 Block bitmap at 627 (+627), Inode bitmap at 628 (+628) Inode table at 629-1641 (+629) <==inode table 所在的 block 0 free blocks, 32405 free inodes, 2 directories <==全部 block 都用完了! Free blocks: Free inodes: 12-32416 <==剩餘未使用的 inode 號碼 Group 1: (Blocks 32768-65535) ....(底下省略)....
在文件系統下建立一個文件都會分配一個 inode 和若干 iblock,目錄和文件都是文件系統下的一個文件。
inode :記錄了目錄的權限, block:記錄了目錄的名稱,目錄下包含的文件名名與文件名所佔用的 inode 號碼。
[root@bogon ~]# ls -li
2366420 -rw------- 1 root root 1377 02-18 20:26 anaconda-ks.cfg
2366454 drwxr-xr-x 2 root root 4096 02-18 20:41 Desktop
2366370 -rw-r--r-- 1 root root 35014 02-1820:25 install.log
2366371 -rw-r--r-- 1 root root 6431 02-18 20:22 install.log.syslog
文件名:在包含其的目錄對應的 iblock 中記錄 inode :記錄了文件的權限, block:記錄文件實際數據
舉例來講,若是我想要讀取/etc/passwd 這個文件時,系統是如何讀取的呢?
[root@bogon ~]# ll -di / /etc /etc/passwd
2 drwxr-xr-x 24 root root 4096 02-22 19:34 /
1134561 drwxr-xr-x 114 root root 12288 02-22 19:36 /etc
2528506 -rw-r--r-- 1 root root 2219 02-18 20:39 /etc/passwd