文件系统

文件系统

柱面通常是分区文件系统的最小单位。当然如果使用GPT格式的分区表,最小单位可以为扇区

磁盘分区完后,要进行格式化,使之成为操作系统能用的文件系统

文件(或目录)包含属性(比如文件权限,文件属性)及内容

权限与属性 实际数据
inode表 数据区块

区块有放置inode表的区块,有放置数据的数据区块,以及记录整个文件系统整体信息的超级区块

超级区块:记录inode和数据区块总量、使用量、剩余量及文件系统格式等

inode:记录文件属性,一个文件占一个inode,同时记录文件对应数据所放置的区块号码

数据区块:记录实际内容,当一个区块占不下的时候,就会占用多个数据区块

索引式文件系统,包含了inode。通过inode,我们可以数据存放在哪些数据区块里面,所以可以一次性全部提取出来。该方式性能比较好,比如linux的ext2文件系统

再比如u盘一般使用FAT文件系统,这种就不是索引式文件系统。它没有inode,所以无法把数据一次性全提取出来。每个区块号码都记录在前一个区块里面,所以提取的时候得一个连着一个提取。

碎片整理,在非索引式文件系统里面,由于有时候数据写入的区块太过于分散,所以读取的时候性能会很差,通过磁盘碎片整理,可以把同一个文件的区块集合在一起,这样读取起来就比较容易。

1.ext2文件系统

在分区上进行格式化的时候,就已经规划好了inode数据区块

把放置inode的区块和数据区块全部都放一起,会导致很难管理

所以在ext2的文件系统上,会弄出多个区块群组,每个区块群组都有自己的inode数据区块超级区块

文件系统最前面有个启动扇区,里面可以存放启动引导程序。(注:或是想到之前的磁盘分区,分区的第一个扇区用来放MBR,MBR中的446字节来存放启动引导程序)

这种设计可以把引导启动程序放在不同文件系统的最前端,而不必把程序全都放在整个磁盘唯一的MBR下。

1.1数据区块

数据区块用来放置文件数据。ext2文件系统支持的区块大小有1k,2k及4k共3种。

每个区块都有编号,方便inode表记录。

数据放在数据区块里面,如果数据的大小要小于区块的容量的话,就会造成浪费。

1.2inode表

inode表记录如下内容

  • 该文件的读写属性(读、写、执行)
  • 文件所有者及用户组
  • 文件大小
  • 文件建立或状态改变时间
  • 最近一次读取时间
  • 最近修改时间
  • 定义文件特征标识
  • 文件真正内容指向

inode表的数量和大小在格式化的时候就确定好了

  • 每个inode表大小为128B(其中4B来记录一个数据区块的位置编号,一共能记录12个)
  • 每个文件仅占用一个inode表
  • 文件系统能建立的文件数量和inode数量有关
  • 系统读取文件先找到inode表,分析文件记录用户及权限是否符合,如果符合最后才去找数据区块读取

1.3超级区块

没有超级区块,就没有文件系统,它记录整个文件系统相关信息。

  • 数据区块与inode的总量
  • 未使用与已经使用的inode与数据区块的数量
  • 数据区块与inode的大小
  • 文件系统的挂载时间、最近一次写入数据时间等文件系统相关信息
  • 一个有效位数值,文件系统被挂载,则有效位为0,未被挂载则为1
1
2
3
# 显示目前系统被格式化的设备
[root@vultr ~]# blkid
/dev/vda1: UUID="19c82273-828c-4d85-bc4e-6fc269acc524" TYPE="ext4"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
[root@vultr ~]# dumpe2fs /dev/vda1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: 19c82273-828c-4d85-bc4e-6fc269acc524
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery 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: 640000 #inode总数
Block count: 2621179 #区块总数
Reserved block count: 131057 #保留的区块总数
Free blocks: 2026205 #还有多少可用区块
Free inodes: 599345 #还有多少可用inode
First block: 0
Block size: 4096 #单个区块大小
Fragment size: 4096
Group descriptor size: 64
Reserved GDT blocks: 248
Blocks per group: 32768
Fragments per group: 32768
Inodes per group: 8000
Inode blocks per group: 500
Flex block group size: 16
Filesystem created: Wed Dec 5 17:22:49 2018
Last mount time: Wed Apr 10 10:10:48 2019
Last write time: Wed Apr 10 10:10:46 2019
Mount count: 4
Maximum mount count: -1
Last checked: Sat Mar 9 02:38:28 2019
Check interval: 0 (<none>)
Lifetime writes: 3452 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256 #inode表大小
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 6cbf0c8a-63c4-43df-aaba-cd82ae9cb153
Journal backup: inode blocks
Journal features: journal_incompat_revoke journal_64bit
Journal size: 32M
Journal length: 8192
Journal sequence: 0x0004f118
Journal start: 7195


Group 0: (Blocks 0-32767) [ITABLE_ZEROED] #区块组0所占区块号码为0-32767
Checksum 0x6f25, unused inodes 0
Primary superblock at 0, Group descriptors at 1-2 #文件系统描述说明在1-2号区块内
Reserved GDT blocks at 3-250
Block bitmap at 251 (+251), Inode bitmap at 267 (+267)
#区块对照表和inode对照表在251和267区块内
Inode table at 283-782 (+283)
#一个inode表占256B,总共有782-283+1=500个区块,一个区块大小占4KB。所以inode的总数是500*4kB/256B

#以下几行记录,记录了可用的区块数,及可用的inode表述。可知,inode表为0了。
19990 free blocks, 0 free inodes, 1728 directories
Free blocks: 11866, 11890-11922, 11928-11935, 11943-11951, 12249, 12313, 12350, 12832-32767
Free inodes:
……后续省略……

2.文件系统与目录树的关系

2.1目录

在文件系统上创建一个目录时,文件系统会分配一个inode至少一块区块(里面记录了子目录及文件的inode表位置编号)给目录

2.2文件

在文件系统上创建一个文件时,文件系统会分配一个inode及所需个数的数据区块

2.3目录树的读取

文件存放在目录下,所以我们得要先知道该目录所对应的区块。区块里面记录了子目录及文件的inode表号。找到我想要的文件所对应的inode表号,再去找该文件的inode。找到之后就知道该文件放置在哪个区块了。

3.挂载

文件系统和目录树结合的操作称为挂载

挂载点一定是目录,该目录为进入文件系统的入口

文件系统要挂载在目录树的某个目录后,我们才能使用该文件系统

4.XFS文件系统

ext文件系统的支持度虽然广,但是格式化所需要时间长。因为是预先就规划好了inode和区块的位置,所以后续可以直接使用,也就是说并没有使用动态配置的做法

现在的磁盘越来越大,对于虚拟化磁盘那就更大了。对于巨型文件要考虑性能问题,不然虚拟磁盘的处理效率就会差。

xfs是一个日志式文件系统,用于高容量磁盘及高性能文件。同时还几乎有ext4文件系统有的功能。此外,inode与区块都是需要时才动态配置产生,不会预分配,所以格式化操作会很快。

4.1数据区

包含inode、数据区块、超级区块等数据,类似于之前ext里面的区块群组

4.2文件系统活动登陆区

用来记录文件系统的变化,有点像日志区

4.3实时运行区

当有文件要被建立时,xfs会在这个区段里找一个到数个的扩展区块,将文件放置在这个区块内,等分配完毕再写入到数据区的inode与区块中。