Linux File System浅析

Table of Contents

    折腾了Linux这么久,对磁盘存储也吃了不少亏,现在总结点Linux文件系统方面的东西。

 

一、硬件层面

 

    一个真实的机械硬盘物理结构大致如下图所示:

 

585883061DBDE77FBD36A1DC963228EB

其中磁头和盘片之间的距离是微米数量级,且磁盘内部是真空封闭的,一旦有空气进入,硬盘很容易故障。

对磁盘盘片上的抽象图如下图所示:

 

 wKioL1O0_yPhvkMkAACvy0UIsAc816

 

在磁盘盘片上主要有三部分划分:

    track:磁道,以转轴为中心,划分了许多同心圆,每个圆命名为一个磁道,类似体育场上的跑道

    sector:扇区,相邻两个磁道之间的区域,又被划分许多区域,叫做扇区

    cynlinder:柱面,对于多盘片的硬盘来说,由于臂杆和磁头固定,为了分区方便,引入柱面概念,一个分区的开始和结束都以柱面进行标识

 

二、软件层面

典型的ext 文件系统在格式化的时候基本上会划分为多个块组(Block Group)的,每个块组都有独立的 inode/block/super block 系统,整体展示图如下,

 

linux_file_system@201606170225

其中各块的含义如下:

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

..............

 

 

引用位置:

http://wuchong.me/blog/2014/07/19/linux-file-system/

http://www.ibm.com/developerworks/linux/library/l-linux-filesystem/?S_TACT=105AGX52&S_CMP=cn-a-l

马哥Linux运维视频01-磁盘文件系统管理