Linux File System淺析

折騰了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

………….. 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章