折騰了Linux這麼久,對磁盤存儲也吃了不少虧,現在總結點Linux文件系統方面的東西。
一、硬件層面
一個真實的機械硬盤物理結構大致如下圖所示:
其中磁頭和盤片之間的距離是微米數量級,且磁盤內部是真空封閉的,一旦有空氣進入,硬盤很容易故障。
對磁盤盤片上的抽象圖如下圖所示:
在磁盤盤片上主要有三部分劃分:
track:磁道,以轉軸爲中心,劃分了許多同心圓,每個圓命名爲一個磁道,類似體育場上的跑道
sector:扇區,相鄰兩個磁道之間的區域,又被劃分許多區域,叫做扇區
cynlinder:柱面,對於多盤片的硬盤來說,由於臂杆和磁頭固定,爲了分區方便,引入柱面概念,一個分區的開始和結束都以柱面進行標識
二、軟件層面
典型的ext 文件系統在格式化的時候基本上會劃分爲多個塊組(Block Group)的,每個塊組都有獨立的 inode/block/super block 系統,整體展示圖如下,
其中各塊的含義如下:
MBR:master boot record,硬盤的主引導記錄,前446字節存放主引導程序,中間64字節存放分區表信息(主分區+擴展分區<=4),最後2個字節是結束標誌位。
Super Block:記錄此文件系統的整體系統,包括 inode 和 block 的總量、使用量、剩餘量,以及文件系統類型等。
Group Descriptor Table:文件系統描述說明,描述每個 block group 的開始與結束的 block 號碼。
Block Bitmap:塊對照表,用來快速尋找可用的 block 塊。
Inode Bitmap:inode對照表,用來快速尋找可用的 inode 塊。
Inode Table:存放 inode 塊的地方。它們是文件系統的關鍵。記錄了文件的屬性,一個文件佔用一個 inode,同時包含多個指針,指向了屬於該文件的各個 data block 塊。
Data Block:真正存放數據的地方。文件太大會佔用多個 block 。
我們可以使用dumpe2fs查看superblock和每個區塊組的信息:
[root@S5 ~]# dumpe2fs /dev/sda2
dumpe2fs 1.41.12 (17-May-2010)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: d50a6d8f-ae89-498b-93bb-abf17f9bf4fd
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery sparse_super large_file
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 1310720
Block count: 5242880
Reserved block count: 262144
Free blocks: 2250122
Free inodes: 1075111
First block: 0
Block size: 4096
Fragment size: 4096
Reserved GDT blocks: 1022
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8192
Inode blocks per group: 512
Filesystem created: Thu Mar 19 12:24:26 2015
Last mount time: Thu Jun 23 07:14:38 2016
Last write time: Mon Jun 13 22:33:27 2016
Mount count: 833
Maximum mount count: -1
Last checked: Thu Mar 19 12:24:26 2015
Check interval: 0 (<none>)
Lifetime writes: 2312 kB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
First orphan inode: 172059
Default directory hash: half_md4
Directory Hash Seed: 191ce352-9cd6-4d24-9773-2908302b1a32
Journal backup: inode blocks
Journal features: journal_incompat_revoke
Journal size: 128M
Journal length: 32768
Journal sequence: 0x000a2dac
Journal start: 1
Group 0: (Blocks 0-32767)
………….
………….
………….
Block bitmap at 327680 (+0), Inode bitmap at 327681 (+1)
Inode table at 327682-328193 (+2)
200 free blocks, 4663 free inodes, 287 directories
Free blocks: 328195-328199, 331776-331880, 331882-331919, 336568-336576, 339968-339971, 344064-344072, 344196-344225
Free inodes: 82425-82430, 85226, 85395, 85457-85542, 85544-90112
Group 11: (Blocks 360448-393215)
Block bitmap at 360448 (+0), Inode bitmap at 360449 (+1)
Inode table at 360450-360961 (+2)
0 free blocks, 4713 free inodes, 671 directories
…………..