CentOS 7 开始,默认的文件系统已经由原本的 EXT4 变成了 XFS 文件系统了!为啥 CentOS 要舍弃对 Linux 支持度最完整的 EXT 家族而改用 XFS 呢? 这是有一些原因存在的。
- EXT 家族当前较伤脑筋的地方:支持度最广,但格式化超慢!
Ext 文件系统家族对于文件格式化的处理方面,采用的是预先规划出所有的 inode/block/meta data 等数据,未来系统可以直接取用, 不需要再进行动态配置的作法。这个作法在早期磁盘容量还不大的时候还算 OK 没啥问题,但时至今日,磁盘容量越来越大,连传统的 MBR 都已经被 GPT 所取代,连我们这些老人家以前听到的超大 TB 容量也已经不够看了!现在都已经说到 PB 或 EB 以上容量了呢!那你可以想像得到,当你的 TB 以上等级的传统 ext 家族文件系统在格式化的时候,光是系统要预先分配 inode 与 block 就消耗你好多好多的人类时间了...
Tips之前格式化过一个 70 TB 以上的磁盘阵列成为 ext4 文件系统,按下格式化,去喝了咖啡、吃了便当才回来看做完了没有... 所以,后来立刻改成 xfs 文件系统了。
另外,由于虚拟化的应用越来越广泛,而作为虚拟化磁盘来源的巨型文件 (单一文件好几个 GB 以上!) 也就越来越常见了。 这种巨型文件在处理上需要考虑到性能问题,否则虚拟磁盘的效率就会不太好看。因此,从 CentOS 7.x 开始, 文件系统已经由默认的 Ext4 变成了 xfs 这一个较适合大容量磁盘与巨型文件性能较佳的文件系统了。
Tips其实鸟哥有几组虚拟计算机教室服务器系统,里面跑的确实是 EXT4 文件系统,老实说,并不觉得比 xfs 慢!所以,对鸟哥来说, 性能并不是主要改变文件系统的考虑!对于文件系统的复原速度、创建速度,可能才是鸟哥改换成 xfs 的思考点。
- XFS 文件系统的配置 [6]
基本上 xfs 就是一个日志式文件系统,而 CentOS 7.x 拿它当默认的文件系统,自然就是因为最早之前,这个 xfs 就是被开发来用于大容量磁盘以及高性能文件系统之用, 因此,相当适合现在的系统环境。此外,几乎所有 Ext4 文件系统有的功能, xfs 都可以具备!也因此在本小节前几部份谈到文件系统时, 其实大部份的操作依旧是在 xfs 文件系统环境下介绍给各位的哩!
xfs 文件系统在数据的分佈上,主要规划为三个部份,一个数据区 (data section)、一个文件系统活动登录区 (log section)以及一个实时运行区 (realtime section)。 这三个区域的数据内容如下:
- 数据区 (data section)
基本上,数据区就跟我们之前谈到的 ext 家族一样,包括 inode/data block/superblock 等数据,都放置在这个区块。 这个数据区与 ext 家族的 block group 类似,也是分为多个储存区群组 (allocation groups) 来分别放置文件系统所需要的数据。 每个储存区群组都包含了 (1)整个文件系统的 superblock、 (2)剩余空间的管理机制、 (3)inode的分配与追踪。此外,inode与 block 都是系统需要用到时, 这才动态配置产生,所以格式化动作超级快!
另外,与 ext 家族不同的是, xfs 的 block 与 inode 有多种不同的容量可供设置,block 容量可由 512Bytes ~ 64K 调配,不过,Linux 的环境下, 由于内存控制的关系 (分页档 pagesize 的容量之故),因此最高可以使用的 block 大小为 4K 而已!(鸟哥尝试格式化 block 成为 16K 是没问题的,不过,Linux 核心不给挂载! 所以格式化完成后也无法使用啦!) 至于 inode 容量可由 256Bytes 到 2M 这么大!不过,大概还是保留 256Bytes 的默认值就很够用了!
Tips总之, xfs 的这个数据区的储存区群组 (allocation groups, AG),你就将它想成是 ext 家族的 block 群组 (block groups) 就对了!本小节之前讲的都可以在这个区块内使用。 只是 inode 与 block 是动态产生,并非一开始于格式化就完成配置的。
- 文件系统活动登录区 (log section)
在登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区啦!文件的变化会在这里纪录下来,直到该变化完整的写入到数据区后, 该笔纪录才会被终结。如果文件系统因为某些缘故 (例如最常见的停电) 而损毁时,系统会拿这个登录区块来进行检验,看看系统挂掉之前, 文件系统正在运行些啥动作,借以快速的修复文件系统。
因为系统所有动作的时候都会在这个区块做个纪录,因此这个区块的磁盘活动是相当频繁的!xfs 设计有点有趣,在这个区域中, 你可以指定外部的磁盘来作为 xfs 文件系统的日志区块喔!例如,你可以将 SSD 磁盘作为 xfs 的登录区,这样当系统需要进行任何活动时, 就可以更快速的进行工作!相当有趣!
- 实时运行区 (realtime section)
当有文件要被创建时,xfs 会在这个区段里面找一个到数个的 extent 区块,将文件放置在这个区块内,等到分配完毕后,再写入到 data section 的 inode 与 block 去! 这个 extent 区块的大小得要在格式化的时候就先指定,最小值是 4K 最大可到 1G。一般非磁盘阵列的磁盘默认为 64K 容量,而具有类似磁盘阵列的 stripe 情况下,则建议 extent 设置为与 stripe 一样大较佳。这个 extent 最好不要乱动,因为可能会影响到实体磁盘的性能喔。
- XFS 文件系统的描述数据观察
刚刚讲了这么多,完全无法理会耶~有没有像 EXT 家族的 dumpe2fs 去观察 superblock 内容的相关指令可以查阅呢?有啦!可以使用 xfs_info 去观察的! 详细的指令作法可以参考如下:
[root@study ~]# xfs_info 挂载点
&
#124;设备文件名
范例一:找出系统 /boot 这个挂载点下面的文件系统的 superblock 纪录
[root@study ~]# df -T /boot
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/vda2 xfs 1038336 133704 904632 13% /boot
# 没错!可以看得出来是 xfs 文件系统的!来观察一下内容吧!
[root@study ~]# xfs_info /dev/vda2
1 meta-data=/dev/vda2 isize=256 agcount=4, agsize=65536 blks
2 = sectsz=512 attr=2, projid32bit=1
3 = crc=0 finobt=0
4 data = bsize=4096 blocks=262144, imaxpct=25
5 = sunit=0 swidth=0 blks
6 naming =version 2 bsize=4096 ascii-ci=0 ftype=0
7 log =internal bsize=4096 blocks=2560, version=2
8 = sectsz=512 sunit=0 blks, lazy-count=1
9 realtime =none extsz=4096 blocks=0, rtextents=0
上面的输出讯息可以这样解释:
- 第 1 行里面的 isize 指的是 inode 的容量,每个有 256Bytes 这么大。至于 agcount 则是前面谈到的储存区群组 (allocation group) 的个数,共有 4 个, agsize 则是指每个储存区群组具有 65536 个 block 。配合第 4 行的 block 设置为 4K,因此整个文件系统的容量应该就是 4 65536 4K 这么大!
- 第 2 行里面 sectsz 指的是逻辑扇区 (sector) 的容量设置为 512Bytes 这么大的意思。
- 第 4 行里面的 bsize 指的是 block 的容量,每个 block 为 4K 的意思,共有 262144 个 block 在这个文件系统内。
- 第 5 行里面的 sunit 与 swidth 与磁盘阵列的 stripe 相关性较高。这部份我们下面格式化的时候会举一个例子来说明。
- 第 7 行里面的 internal 指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了 4K * 2560 个 block,总共约 10M 的容量。
- 第 9 行里面的 realtime 区域,里面的 extent 容量为 4K。不过目前没有使用。
由于我们并没有使用磁盘阵列,因此上头这个设备里头的 sunit 与 extent 就没有额外的指定特别的值。根据 xfs(5) 的说明,这两个值会影响到你的文件系统性能, 所以格式化的时候要特别留意喔!上面的说明大致上看看即可,比较重要的部份已经用特殊字体圈起来,你可以瞧一瞧先!