α.Linux的文件系统

Linux文件系統属于索引式文件系统 其通常會將檔案權限(rwx)與檔案屬性(擁有者、群組、時間參數等)的資料分別存放在不同的區塊,權限與屬性放置到 inode 中,至於實際資料則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊,包括 inode 與 block 的總量、使用量、剩餘量等。

  • superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等;

  • inode:記錄檔案的屬性,一個檔案佔用一個inode(唯一性),同時記錄此檔案的資料所在的 block 碼;

    • block码,文件真正的内容指向
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。

一、读取文件的过程

系统读取文件时,会先向inode询问文件的属性和权限、文件的block码,如果权限那块允许调用,就会通过inode中记录的block码去读取文件。

二、inode

1、主要功能

  • 文件的存取模式
  • 文件所处群组
  • 文件的大小
  • 文件的创建和修改时间
  • 最后一次的读取时间

2、inode能记录的block数量(不会)

  • 12个直接指向
  • 间接指向
  • 双间接指向
  • 三间接指向

三、data block (資料區塊)

1、block的大小影响文件系统

2、block的基本限制:

  • 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
  • 每個 block 內最多只能夠放置一個檔案的資料;
  • 承上,如果檔案大於 block 的大小,則一個檔案會佔用多個 block 數量;
  • 承上,若檔案小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁碟空間會浪費)。

四、inode table (inode 表格)

1、inode中存储的东西

  • 該檔案的存取模式(read/write/excute);
  • 該檔案的擁有者與群組(owner/group);
  • 該檔案的容量;
  • 該檔案建立或狀態改變的時間(ctime);
  • 最近一次的讀取時間(atime);
  • 最近修改的時間(mtime);
  • 定義檔案特性的旗標(flag),如 SetUID...;
  • 該檔案真正內容的指向 (pointer);

五、Superblock(超级区块)

  • 超级区块记录着文件系统的基本信息,如果其出现问题,文件系统也会出现问题
  • 超级区块一个文件系统只会有一个,但存在其备份。(每个block grop都可能含有一个超级区块,但大都是作为第一个block group内superblock的备份)

1、记录的信息

  • block 與 inode 的總量;
  • 未使用與已使用的 inode / block 數量;
  • block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128bytes 或 256bytes);
  • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊;
  • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1

2、block bitmap(区块对照表)

  • 文件占用block,block号码的标志会被修改成"使用中"
  • 文件被删除时,文件原本占用的block号码就会被释放出来,并被标记成"未使用" block bitmap用来记录block的状态,通过这个,系统在需要block记录信息的时候,才能知道哪个block是空的,从而迅速找到可使用的空间来待存储文件。

3、inode bitmap (inode 對照表)

inode bitmap 則是記錄使用與未使用的 inode 號碼

4、dumpe2fs: 查詢 Ext 家族 superblock 信息的指令

(1)、格式

dumpe2fs [-bh] 裝置檔名

(2)、选项与参数

  • -b :列出保留為壞軌的部分(一般用不到吧!?)
  • -h :僅列出 superblock 的資料,不會列出其他的區段內容!
範例:鳥哥的一塊 1GB ext4 檔案系統內容
[root@study ~]# blkid   <==這個指令可以叫出目前系統有被格式化的裝置
/dev/vda1: LABEL="myboot" UUID="ce4dbf1b-2b3d-4973-8234-73768e8fd659" TYPE="xfs"
/dev/vda2: LABEL="myroot" UUID="21ad8b9a-aaad-443c-b732-4e2522e95e23" TYPE="xfs"
/dev/vda3: UUID="12y99K-bv2A-y7RY-jhEW-rIWf-PcH5-SaiApN" TYPE="LVM2_member"
/dev/vda5: UUID="e20d65d9-20d4-472f-9f91-cdcfb30219d6" TYPE="ext4"  <==看到 ext4 了!

[root@study ~]# dumpe2fs /dev/vda5
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:              # 檔案系統的名稱(不一定會有)
Last mounted on:            # 上一次掛載的目錄位置
Filesystem UUID:          e20d65d9-20d4-472f-9f91-cdcfb30219d6
Filesystem magic number:  0xEF53           # 上方的 UUID 為 Linux 對裝置的定義碼
Filesystem revision #:    1 (dynamic)      # 下方的 features 為檔案系統的特徵資料
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit 
 flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash
Default mount options:    user_xattr acl   # 預設在掛載時會主動加上的掛載參數
Filesystem state:         clean            # 這塊檔案系統的狀態為何,clean 是沒問題
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536            # inode 的總數
Block count:              262144           # block 的總數
Reserved block count:     13107            # 保留的 block 總數
Free blocks:              249189           # 還有多少的 block 可用數量
Free inodes:              65525            # 還有多少的 inode 可用數量
First block:              0
Block size:               4096             # 單個 block 的容量大小
Fragment size:            4096
Group descriptor size:    64
....(中間省略)....
Inode size:               256              # inode 的容量大小!已經是 256 了喔!
....(中間省略)....
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      3c2568b4-1a7e-44cf-95a2-c8867fb19fbc
Journal backup:           inode blocks
Journal features:         (none)
Journal size:             32M              # Journal 日誌式資料的可供紀錄總容量
Journal length:           8192
Journal sequence:         0x00000001
Journal start:            0

Group 0: (Blocks 0-32767)                  # 第一塊 block group 位置
  Checksum 0x13be, unused inodes 8181
  Primary superblock at 0, Group descriptors at 1-1   # 主要 superblock 的所在喔!
  Reserved GDT blocks at 2-128
  Block bitmap at 129 (+129), Inode bitmap at 145 (+145)
  Inode table at 161-672 (+161)                       # inode table 的所在喔!
  28521 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes
  Free blocks: 142-144, 153-160, 4258-32767           # 底下兩行說明剩餘的容量有多少
  Free inodes: 12-8192
Group 1: (Blocks 32768-65535) [INODE_UNINIT]          # 後續為更多其他的 block group 喔!
....(底下省略)....
# 由於資料量非常的龐大,因此鳥哥將一些資訊省略輸出了!上表與你的螢幕會有點差異。
# 前半部在秀出 supberblock 的內容,包括標頭名稱(Label)以及inode/block的相關資訊
# 後面則是每個 block group 的個別資訊了!您可以看到各區段資料所在的號碼!
# 也就是說,基本上所有的資料還是與 block 的號碼有關就是了!很重要!

β .与目录树的关系

一、目录

每新建一个目录,文件系统都会分配一个inode和至少一块block给该目录。 目录中inode和block存储的内容

  • inode:记录这个目录的相关权限和属性,并记录分配到的block码
  • block:记录这个目录下所有文件/目录所占用的inode码的资料(仅记录这些而已),如果一个不够Linux系统会给予更多的block用以继续记录。

二、文件

新建文件时,Linux会为文件分配一个inode,并根据文件的大小,创建存储这个文件需要的block.

栗子

前提: 系统创建的block的大小是4Kbytes **实行:**建立一个100kb大小的文件,那么LInux会分配25个block来存储这个文件。

三、目录树的读取

1、fileSystem大小与磁盘读取效能

当文件太大时,就需要多个block来记录,要是他们分布相对集中还好,但凡他们分布的较分散,就会降低读取效率。

2、新建/存文件

过程

  1. 先確定使用者對於欲新增檔案的目錄是否具有 w 與 x 的權限,若有的話才能新增;
  2. 根據 inode bitmap 找到沒有使用的 inode 號碼,並將新檔案的權限/屬性寫入;
  3. 根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的資料寫入 block 中,且更新 inode 的 block 指向資料;
  4. 將剛剛寫入的 inode 與 block 資料同步更新 inode bitmap 與 block bitmap,並更新 superblock 的內容。

3、资料不一致状态(Inconsistent)

出现的原因: 写入的过程中出现错误,导致写入中断,导致写入的资料仅有inode table及data block而已,最後一個同步更新中介資料的步驟並沒有做完。

4、日志式文件系统(Journaling filesystem)

出现的原因: 为了避免"资料不一致状态"的出现 运作过程:

  1. 預備:當系統要寫入一個檔案時,會先在日誌記錄區塊中紀錄某個檔案準備要寫入的資訊;
  2. 實際寫入:開始寫入檔案的權限與資料;開始更新 metadata 的資料;
  3. 結束:完成資料與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的紀錄。 功能: 在這樣的程序當中,萬一資料的紀錄過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄區塊, 就可以知道哪個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 這樣就可以達到快速修復 filesystem 的能力了

四、Linux 檔案系統的運作

1、非同步處理 (asynchronously)

优点: 避免磁盘的速度拖慢计算机处理的速度(所有的資料都得要載入到記憶體後 CPU 才能夠對該資料進行處理,如果频繁的写入写出磁盘,就会成为高速内存的累赘,拖慢进程速度)

 系统载入文件到内存中,用干净(clean)和脏(Dirty)以文件是否被变动为根据进行标识。然后通过定期的将Dirty数据写入硬盘中来实现磁盘和内存中数据的同步性。

五、挂载点的意义

最后修改:2023 年 11 月 28 日
如果觉得我的文章对你有用,请随意赞赏