α.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、新建/存文件
过程
- 先確定使用者對於欲新增檔案的目錄是否具有 w 與 x 的權限,若有的話才能新增;
- 根據 inode bitmap 找到沒有使用的 inode 號碼,並將新檔案的權限/屬性寫入;
- 根據 block bitmap 找到沒有使用中的 block 號碼,並將實際的資料寫入 block 中,且更新 inode 的 block 指向資料;
- 將剛剛寫入的 inode 與 block 資料同步更新 inode bitmap 與 block bitmap,並更新 superblock 的內容。
3、资料不一致状态(Inconsistent)
出现的原因: 写入的过程中出现错误,导致写入中断,导致写入的资料仅有inode table及data block而已,最後一個同步更新中介資料的步驟並沒有做完。
4、日志式文件系统(Journaling filesystem)
出现的原因: 为了避免"资料不一致状态"的出现 运作过程:
- 預備:當系統要寫入一個檔案時,會先在日誌記錄區塊中紀錄某個檔案準備要寫入的資訊;
- 實際寫入:開始寫入檔案的權限與資料;開始更新 metadata 的資料;
- 結束:完成資料與 metadata 的更新後,在日誌記錄區塊當中完成該檔案的紀錄。 功能: 在這樣的程序當中,萬一資料的紀錄過程當中發生了問題,那麼我們的系統只要去檢查日誌記錄區塊, 就可以知道哪個檔案發生了問題,針對該問題來做一致性的檢查即可,而不必針對整塊 filesystem 去檢查, 這樣就可以達到快速修復 filesystem 的能力了
四、Linux 檔案系統的運作
1、非同步處理 (asynchronously)
优点: 避免磁盘的速度拖慢计算机处理的速度(所有的資料都得要載入到記憶體後 CPU 才能夠對該資料進行處理,如果频繁的写入写出磁盘,就会成为高速内存的累赘,拖慢进程速度)
系统载入文件到内存中,用干净(clean)和脏(Dirty)以文件是否被变动为根据进行标识。然后通过定期的将Dirty数据写入硬盘中来实现磁盘和内存中数据的同步性。