鍍金池/ 教程/ Linux/ 文件系統(tǒng)簡介
Linux 學習記錄--開機掛載錯誤
日志系統(tǒng)
數(shù)據(jù)流重定向
內(nèi)存交換空間的構建
文件系統(tǒng)簡介
Linux 學習記錄--軟件安裝 RPM|SRPM|YUM
文件特殊權限
目錄配置 FHS
文件內(nèi)容查閱
Boot Loader
文件壓縮
Linux 學習記錄--文件權限
Linux 命令縮寫
命令與文件的查詢
文件|目錄的默認權限與隱藏權限
shell script
服務
Linux 學習記錄--程序編譯與函數(shù)庫
正則表達式與其應用
關機相關指令
shell
vim 與 vi 常用命令
系統(tǒng)調(diào)用:進程控制
文件系統(tǒng)簡單操作
磁盤掛載與卸載
有名管道通訊
磁盤分區(qū),格式化與檢驗
工作管理與進程管理
匿名管道通訊
Linux 學習記錄--啟動流程
文件與目錄管理
管道命令
命名別名與歷史命令
文件備份|還原
shell變量
Linux 學習記錄--ACL 權限控制
內(nèi)核|內(nèi)核模塊編譯
文件管理相關系統(tǒng)編程

文件系統(tǒng)簡介

對于 Linux 來說正規(guī)的文件系統(tǒng)為 EXT2,一個文件系統(tǒng)存儲的數(shù)據(jù)通常包括文件權限和屬性,以及文件數(shù)據(jù),這兩部分分別存儲在不同的地方。

簡單的說文件系統(tǒng)數(shù)據(jù)分為3部分 Superblock:記錄次文件系統(tǒng)的整體信息,包括 inode/iblock 的總量,使用量,剩余量,已經(jīng)文件系統(tǒng)的整體信息 Inode:記錄文件的屬性,一個文件占用一個 inode,同時記錄此文件數(shù)據(jù)所在的 block 號碼 Iblock:實際記錄文件的內(nèi)容,若文件過大時,會占用多個 block

我的理解 文件系統(tǒng)由包含多個文件,每個文件都會占用1個 inode 和若干 iblock,inode 用來存儲文件權限和屬性.以及文件數(shù)據(jù)存放的 iblock 的編號,iblock 則存放文件的實際數(shù)據(jù)(每個 inode 和 iblock都含有一個編號)

對于容量很大的文件系統(tǒng),EXT2格式化時會分為多個 block group,每個組隊都有一個獨立的/inode/block/superblock

iblock (數(shù)據(jù)區(qū)塊)

iblock 是用來放置文件內(nèi)容數(shù)據(jù)地方,在 Ext2 文件系統(tǒng)中所支持的 block 大小有 1 K, 2 K 及 4 K 三種而已。 每個 block 內(nèi)最多只能夠放置一個文件的數(shù)據(jù); 承上,如果文件大于 block 的大小,則一個文件會占用多個 block 數(shù)量; 承上,若文件小于 block ,則該 block 的剩余容量就不能夠再被使用了(磁盤空間會浪費)。

Inode

Inode 主要包含信息

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

每個 inode 大小均固定為 128 bytes; 每個文件都僅會占用一個 inode 而已; 承上,因此文件系統(tǒng)能夠創(chuàng)建的文件數(shù)量與 inode 的數(shù)量有關; 系統(tǒng)讀取文件時需要先找到 inode,并分析 inode 所記錄的權限與用戶是否符合,若符合才能夠開始實際讀取 block 的內(nèi)容。

Inode 三級間接索引

inode 要記錄的數(shù)據(jù)非常多,但偏偏又只有128 bytes 而已,為了記錄更多的數(shù)據(jù),系統(tǒng)很將 inode 記錄 block 號碼的區(qū)域定義為12個直接,一個間接, 一個雙間接與一個三間接記錄區(qū)。記錄區(qū)。

http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/1.jpg" alt="" />

假設 block 為1 K

12 個直接指向: 121 K=12 K 由于是直接指向,所以總共可記錄 12 筆記錄,因此總額大小為如上所示; 間接: 2561 K=256 K 每筆 block 號碼的記錄會花去 4 bytes,因此 1 K 的大小能夠記錄 256 筆記錄,因此一個間接可以記錄的文件大小如上; 雙間接: 2562561 K=2562 K 第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個號碼,因此總額大小如上; 三間接: 2562562561 K=2563 K 第一層 block 會指定 256 個第二層,每個第二層可以指定 256 個第三層,每個第三層可以指定 256 個號碼,因此總額大小如上; 總額:將直接、間接、雙間接、三間接加總,得到 12 + 256 + 256256 + 256256256 (K) = 16 GB

Superblock (超級區(qū)塊)

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

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

    Superblock 信息查看

通過 dumpe2fs 命令查看文件系統(tǒng)的 superblock

舉例:觀察文件系統(tǒng)的相關信息


[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             <==這個是文件系統(tǒng)的名稱(Label)
Filesystem features:      has_journal ext_attr resize_inode dir_index 
 filetype needs_recovery sparse_super large_file
Default mount options:    user_xattr acl <==默認掛載的參數(shù)
Filesystem state:         clean          <==這個文件系統(tǒng)是沒問題的(clean)
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              2560864        <==inode 的總數(shù)
Block count:              2560359        <==block 的總數(shù)
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 內(nèi)容, 包含 block 的啟始/結(jié)束號碼
Primary superblock at 0, Group descriptors at 1-1  <==超級區(qū)塊在 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)
....(底下省略)....

目錄與文件讀取

在文件系統(tǒng)下創(chuàng)建一個文件都會分配一個 inode 和若干 iblock,目錄和文件都是文件系統(tǒng)下的一個文件,

對于目錄來說

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:記錄文件實際數(shù)據(jù)

舉例來說,如果我想要讀取/etc/passwd 這個文件時,系統(tǒng)是如何讀取的呢?

[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 1228802-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 規(guī)范的權限讓我們可以讀取該 block 的內(nèi)容(有 r 與 x) ;
  2. / 的 block: 經(jīng)過上個步驟取得 block 的號碼,并找到該內(nèi)容有 etc/ 目錄的 inode 號碼 (1912545);
  3. etc/ 的 inode: 讀取 1912545 號 inode 得知 vbird 具有 r 與 x 的權限,因此可以讀取 etc/ 的 block內(nèi)容;
  4. etc/ 的 block: 經(jīng)過上個步驟取得 block 號碼,并找到該內(nèi)容有 passwd 文件的 inode 號碼 (1914888);
  5. passwd 的 inode: 讀取 1914888 號 inode 得知 vbird 具有 r 的權限,因此可以讀取 passwd 的 block 內(nèi)容;
  6. passwd 的 block: 最后將該 block 內(nèi)容的數(shù)據(jù)讀出來
上一篇:shell下一篇:vim 與 vi 常用命令