Linux文件系統簡介

對於 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 (數據區塊)

iblock 是用來放置文件內容數據地方,在 Ext2 文件系統中所支持的 block 大小有 1 K, 2 K 及 4 K 三種而已。 每一個 block 內最多隻可以放置一個文件的數據; 承上,若是文件大於 block 的大小,則一個文件會佔用多個 block 數量; 承上,若文件小於 block ,則該 block 的剩餘容量就不可以再被使用了(磁盤空間會浪費)。io

Inode

Inode 主要包含信息table

  1. 該文件的存取模式(read/write/excute);
  2. 該文件的擁有者與羣組(owner/group);
  3. 該文件的容量;
  4. 該文件建立或狀態改變的時間(ctime);
  5. 最近一次的讀取時間(atime);
  6. 最近修改的時間(mtime);
  7. 定義文件特性的旗標(flag),如 SetUID...;
  8. 該文件真正內容的指向(pointer);
  9. 其餘信息

每一個 inode 大小均固定爲 128 bytes; 每一個文件都僅會佔用一個 inode 而已; 承上,所以文件系統可以建立的文件數量與 inode 的數量有關; 系統讀取文件時須要先找到 inode,並分析 inode 所記錄的權限與用戶是否符合,若符合纔可以開始實際讀取 block 的內容ast

Inode 三級間接索引

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 (超級區塊)

Superblock 是記錄整個 filesystem 相關信息的地方, 沒有 Superblock,就沒有這個 filesystem 了。他記錄的信息主要有:

  1. block 與 inode 的總量;
  2. 未使用與已使用的 inode / block 數量; block 與 inode 的大小 (block 爲 1, 2, 4 K,inode 爲 128 bytes); filesystem 的掛載時間、最近一次寫入數據的時間、最近一次檢驗磁盤 (fsck) 的時間等文件系統的相關信息; 一個 valid bit 數值,若此文件系統已被掛載,則 valid bit 爲 0 ,若未被掛載,則 valid bit 爲 1 。

    Superblock 信息查看

經過 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 號碼。

舉例:查看 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

  1. / 的 inode: 透過掛載點的信息找到 /dev/hdc2 的 inode 號碼爲 2 的根目錄 inode,且 inode 規範的權限讓咱們能夠讀取該 block 的內容(有 r 與 x) ;
  2. / 的 block: 通過上個步驟取得 block 的號碼,並找到該內容有 etc/ 目錄的 inode 號碼 (1912545);
  3. etc/ 的 inode: 讀取 1912545 號 inode 得知 vbird 具備 r 與 x 的權限,所以能夠讀取 etc/ 的 block內容;
  4. etc/ 的 block: 通過上個步驟取得 block 號碼,並找到該內容有 passwd 文件的 inode 號碼 (1914888);
  5. passwd 的 inode: 讀取 1914888 號 inode 得知 vbird 具備 r 的權限,所以能夠讀取 passwd 的 block 內容;
  6. passwd 的 block: 最後將該 block 內容的數據讀出來
相關文章
相關標籤/搜索