磁盘组成和分区

  • 扇区是最小的物理存储单位,每个扇区为512bytes;

  • 将扇区组成一个圆,那就是柱面(Cylinder),柱面是分区的最小单位

  • 第一个扇区最重要,里面有硬盘主引导记录(MBR,Masterbootrecord)及分区表(partion table),其中MBR占有446bytes,而partition table则占有64bytes

所谓的磁盘分区指的是告诉操作系统“我这块磁盘在此分区可以访问的区域是由A柱面到B柱面之间的块”

因为分区表仅有64bytes而已,因此最多只能记录四条分区的记录,这四条记录我们称为主分区或扩展分区,其中扩展分区还可以再分出逻辑分区,而能被格式化的则仅有分区与逻辑分区而已。

总结如下:

  • 主分区与扩展分区最多可以有4个(硬盘的限制)

  • 扩展分区最多只能有一个(操作系统的限制)

  • 逻辑分区是由扩展分区持续分出来的分区

  • 能够被格式化后作为数据访问的分区为主分区与逻辑分区,扩展分区无法格式化

  • 逻辑分区的数量依操作系统而不同,在linux系统中,IDE硬盘最多有59个逻辑分区(5号到63号),SATA硬盘则有11个逻辑分区(5号到15号)

文件系统特性

较新的操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,例如linux操作系统的文件权限(rwx)与文件属性(所有者、群组、时间参数等)。
文件系统通常会将这两部分的数据分别存放在不同的块,权限与属性放置到inode中,至于实际数据则放置到data block中。另外,还有一个超级快(super block)会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。

  • super block:记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息

  • inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码

  • block:实际记录文件额内容,若文件太大是,会占用多个block

linux的EXT2文件系统

文件系统一开始就inode和block规划好了,除非重新格式化(或者利用resize2fs等命令变更文件系统大小),否则inode与block固定后就不再变动。
EXT2文件系统在格式化的时候基本上是区分为多个块组的,每个块组都有自己独立的inode/block/superblock系统。

在整体的规划当中,文件系统最前面有一个启动扇区,这个启动扇区可以安装引导装载程序,这是非常重要的设计,因为如此一来我们就可以将不同的引导装载程序安装到个别文件系统的最前端,而不用覆盖整块硬盘唯一的MBR。

每一个块组的6个主要内容为:superblock, 文件描述系统, 块对应表, inode对应表, inode table, data block

data block

data block是用来放置文件内容的地方,在ext2文件系统所支持额block大小有1KB,2KB,4KB。在格式化时block大小就固定了,且每个block都有编号,以方便inode的记录。

每个block内最多只能放置一个文件的数据
如果文件大于block的大小,则一个文件会占用多个block数量
若文件小于block,则该block的剩余空间就不能够被再使用了(会造成空间浪费)

inodetable

inode记录的文件数据至少有:

  • 该文件的访问模式(rwx)

  • 该文件的所有者与组

  • 该文件的大小

  • 该文件创建或状态改变的时间(ctime)

  • 最近一次的读取时间(atime)

  • 最近修改的时间(mtime)

  • 定义文件特性的标识(flag),如SetUID等

  • 该文件的真正内容指向

inode的数量与大小也是在格式化时已经固定了,除此之外inode还有其他特色:

  • 每个inode大小均固定为128bytes

  • 每个文件都仅会占用一个inode而已

  • 系统读取文件时,需要先找到inode并分析inode所记录的权限与用户是否符合,若符合才能开始实际读取block的内容

inode的结构示意图如下:

\inode.jpg

superblock

  • block与inode的总量

  • 未使用与已使用的inode/block数量

  • block与inode的大小(block为1K,2K,4K,inode为128bytes)

  • 文件系统额挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息

  • 一个validbit数值,若此文件系统已挂载,则valid bit为0,若未被挂载,则valid bit为1

File system Description

这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪个block号码之间。

block bitmap

从block bitmap中可以知道哪些block是空的,因此我们的系统能够快速的找到可以使用的空间来处置文件;如果你删除某些文件,那么哪些原本被占用的block号码就得释放出来,将其状态设置为未使用

inode bitmap

记录使用与未使用的inode号码

使用dumpe2fs查看文件系统的信息:

dumpe2fs [-bh] 设备文件名
参数:
-b:列出保留为坏道的部分
-h:仅列出superblock的数据

范例:
使用df调出目前挂载的设备

//阿里云上的
dumpe2fs /dev/xvda1

   1 Filesystem volume name:   <none>
   2 Last mounted on:          /
   3 Filesystem UUID:          af414ad8-9936-46cd-b074-528854656fcd
   4 Filesystem magic number:  0xEF53
   5 Filesystem revision #:    1 (dynamic)
   6 Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_fi     le huge_file uninit_bg dir_nlink extra_isize
   7 Filesystem flags:         signed_directory_hash
   8 Default mount options:    user_xattr acl
   9 Filesystem state:         clean
  10 Errors behavior:          Continue
  11 Filesystem OS type:       Linux
  12 Inode count:              2621440
  13 Block count:              10485248
  14 Reserved block count:     524261
  15 Free blocks:              8712899
  16 Free inodes:              2308814
  17 First block:              0
  18 Block size:               4096
  19 Fragment size:            4096
  20 Reserved GDT blocks:      1021
  21 Blocks per group:         32768
  22 Fragments per group:      32768
  23 Inodes per group:         8192
  24 Inode blocks per group:   512
  25 RAID stride:              32639
  26 Flex block group size:    16
  27 Filesystem created:       Mon Aug 11 19:04:51 2014
  28 Last mount time:          Thu Dec 15 14:33:03 2016
  29 Last write time:          Thu Dec 15 14:33:03 2016
  30 Mount count:              22
  31 Maximum mount count:      -1
  32 Last checked:             Wed Jan 20 16:26:17 2016
  33 Check interval:           0 (<none>)
  34 Lifetime writes:          24 GB
  35 Reserved blocks uid:      0 (user root)
  36 Reserved blocks gid:      0 (group root)
  37 First inode:              11
  38 Inode size:               256
  39 Required extra isize:     28
  40 Desired extra isize:      28
  41 Journal inode:            8
  42 First orphan inode:       262230
  43 Default directory hash:   half_md4
  44 Directory Hash Seed:      cfa7044e-4961-4a88-8d55-e49c668ab4e7
  45 Journal backup:           inode blocks
  46 Journal features:         journal_incompat_revoke
  47 Journal size:             128M
  48 Journal length:           32768
  49 Journal sequence:         0x00067aca
  50 Journal start:            14365
  51
  52
  53 Group 0: (Blocks 0-32767) [ITABLE_ZEROED]
  54   Checksum 0x5075, unused inodes 0
  55   Primary superblock at 0, Group descriptors at 1-3
  56   Reserved GDT blocks at 4-1024
  57   Block bitmap at 1025 (+1025), Inode bitmap at 1041 (+1041)
  58   Inode table at 1057-1568 (+1057)
  59   21949 free blocks, 0 free inodes, 1193 directories
  60   Free blocks: 10795-11263, 11280-11775, 11784-32767
  61   Free inodes:

如上所示,利用dumpe2fs可以查询到非常多的信息,依内容主要可以区分上半部是superblock内容,下半部则是每个block group的信息了

与目录树的关系

在Linux系统下,每个文件(不管是一般文件还是目录文件)都会占用一个inode,且依据文件内容的大小来分配多个block给该文件使用。

当我们在linux下的ext2文件系统新建一个目录时,ext2会分配一个inode与至少一块block给该目录。
当我们在linux下的ext2文件系统新建一个文件时,ext2会分配一个inode与相对于该文件大小的block给该文件。

经过上面的说明应该知道inode本身并不记录文件名,文件名的记录是在目录的block中。


参考书籍:

  • 鸟哥的Linux私房菜


Linux

登陆发表评论