开发者
第 4 期:存储管理与文件系统 —— XFS 的进阶与 RAID 实战
第 4 期:存储管理与文件系统 —— XFS 的进阶与 RAID 实战
原创
发表于05/27
230

定位:中级 目标:掌握 openEuler 默认文件系统 XFS 的核心参数调优,熟练使用 LVM 瘦供给,能够模拟磁盘故障并完成热替换 实验环境:虚拟机,额外添加 3 块 5GB 虚拟磁盘(sdb、sdc、sdd),用于 LVM 和故障模拟

一、为什么 openEuler 选择 XFS 作为默认文件系统?

从 openEuler 21.03 开始,安装程序的默认文件系统就是 XFS,而不是传统的 ext4。原因很直接:

  • 大文件与大容量:XFS 支持最大 8EB 文件系统,单个文件可达 8EB,元数据使用 B+ 树索引,在大目录(百万级文件)下性能远超 ext4。
  • 并发写入能力:XFS 设计之初就考虑了高并发,分配组(Allocation Group)机制让多个 CPU 可以同时操作不同组的元数据。
  • 在线扩缩容:XFS 支持在线扩大xfs_growfs),但不支持缩小;ext4 可以缩小但操作复杂且易出错。
  • 企业特性:支持项目配额、实时子卷(RT subvolumes,用于低延迟场景)等。

对于运维来说,核心变化是:不能再用 resize2fs,而是 xfs_growfs不能缩小文件系统(除非备份后重建)。

二、XFS 基础操作与关键参数

2.1 创建 XFS 文件系统(mkfs.xfs)

最基本的用法:

mkfs.xfs /dev/sdb1

但生产环境建议指定以下关键参数:

参数含义推荐值
-i size=512inode 大小(字节)512(默认256,提高可容纳更多扩展属性)
-d agcount=4分配组数量=CPU 核心数(通常4~8)
-d su=64k,sw=4条带单元/宽度(RAID 场景)匹配底层 RAID 的 chunk size 和磁盘数量
-n ftype=1启用目录文件类型支持必须为1(否则无法升级到新内核特性)

示例:一个 4 块盘 RAID10(chunk=256k),创建 XFS:

mkfs.xfs -d su=256k,sw=4 -i size=512 -n ftype=1 /dev/md0

2.2 挂载参数优化

/etc/fstab 或手动挂载时,可添加:

mount -o defaults,noatime,nodiratime,allocsize=1M,inode64 /dev/sdb1 /mnt/data
  • noatime:不更新文件访问时间,减少写操作(对日志、数据库等大 I/O 场景显著提升)。
  • inode64:允许 inode 分布在任意位置(突破早期 32 位限制,对大文件系统必需)。
  • allocsize=1M:预分配块大小,减少碎片。

查看 XFS 详细信息:xfs_info /mnt/data

三、LVM 瘦供给(Thin Provisioning)实战

传统 LVM 在创建逻辑卷时会立即占用全部声明空间。瘦供给允许你“超额分配”:创建一个 1TB 的卷,但物理存储只在你写入时才真正消耗。这对虚拟化环境或容器存储非常有用。

3.1 创建 Thin Pool

假设我们有 VG vg_data(由 sdb、sdc 组成),创建一个 8G 的 thin pool(实际占用物理空间)和多个 thin 卷:

# 创建 thin pool(元数据大小 1% 左右)
lvcreate --type thin-pool -L 8G -n thinpool vg_data --poolmetadatasize 128M

# 创建两个 thin volume(各声明 20G,实际只吃写入量)
lvcreate --type thin -V 20G -n thinvol1 --thinpool vg_data/thinpool
lvcreate --type thin -V 20G -n thinvol2 --thinpool vg_data/thinpool

# 格式化并挂载
mkfs.xfs /dev/vg_data/thinvol1
mount /dev/vg_data/thinvol1 /mnt/thin1

3.2 监控与处理“存储超售”风险

瘦供给的危险是:所有 thin volume 实际写入总和超过了 thin pool 的物理大小,导致文件系统进入“只读”甚至无法写入。

监控命令:

lvs -a --units g vg_data
# 关注 Data% 和 Meta% 两列

设置自动扩展阈值(需启用 lvm2-monitor):

# 在 lvm.conf 中设置 thin_pool_autoextend_threshold = 70
# 当使用率达到 70% 时自动扩展 thin pool(需先有 VG 的空闲空间)

生产建议:保留 thin pool 物理容量的 20% 缓冲,并配置监控报警。

3.3 回收已删除空间(TRIM/DISCARD)

删除 thin volume 中的文件后,底层不会自动释放,需要手动 fstrim:

fstrim -v /mnt/thin1

也可以在挂载时添加 -o discard 启用实时回收(可能影响性能)。

四、磁盘故障模拟与热替换

场景:RAID1 或单盘故障,需要在不重启的情况下替换磁盘并恢复数据。这里以普通的 LVM 单盘为例,实际操作类似。

4.1 模拟故障

# 假设 /dev/sdd 是 vg_data 的物理卷
echo 1 > /sys/block/sdd/device/delete   # 模拟拔盘
# 此时 dmesg 会看到 I/O 错误,vg 显示 missing PV

4.2 移除故障 PV 并替换

vgreduce --removemissing vg_data   # 移除丢失的 PV
# 插入新盘(重新扫描)
echo "- - -" > /sys/class/scsi_host/host0/scan
# 将新盘创建 PV,并加入 VG
pvcreate /dev/sdd
vgextend vg_data /dev/sdd

如果使用 RAID(如 mdadm),替换流程类似,但需要先移除、再添加。

4.3 文件系统修复

对于 XFS,若因磁盘故障导致不一致,可以使用 xfs_repair(注意必须先卸载):

umount /mnt/data
xfs_repair -L /dev/vg_data/lv_data   # -L 会清除日志,丢失未提交数据

高级技巧:如果只是部分元数据损坏,可以尝试 xfs_repair -n(只检查不修复)来评估损失。

五、运维锦囊:xfs_quota 限制目录容量

生产环境中,常需要限制某个目录(例如 /var/log/nginx)的最大使用空间,避免单个服务写满磁盘。XFS 的项目配额(project quota)可以做到:

# 1. 启用项目配额挂载选项
mount -o prjquota /dev/vg_data/lv_data /mnt/data
# 永久添加到 fstab: defaults,prjquota

# 2. 初始化配额
xfs_quota -x -c 'init' /mnt/data

# 3. 给目录分配项目 ID(例如 100)
echo 100:/mnt/data/nginx_logs >> /etc/projects
echo 100: /mnt/data/nginx_logs >> /etc/projid
xfs_quota -x -c 'project -s 100' /mnt/data

# 4. 设置硬限制(1GB)
xfs_quota -x -c 'limit -p bhard=1g 100' /mnt/data

# 5. 验证
xfs_quota -x -c 'report -p' /mnt/data

超过限制后,写入会返回 ENOSPC(磁盘满错误),应用层应捕获并处理。

六、实验指南

  1. XFS 条带化实验:创建两个 1G 文件作为 loop 设备,模拟 RAID0,对比有无条带参数时的 mkfs 和 dd 性能。

    dd if=/dev/zero of=disk1 bs=1M count=1024
    dd if=/dev/zero of=disk2 bs=1M count=1024
    losetup /dev/loop1 disk1; losetup /dev/loop2 disk2
    mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/loop1 /dev/loop2
    mkfs.xfs -d su=64k,sw=2 /dev/md0   # 对比不加 sw 参数
  2. LVM 瘦供给填满测试:创建 thin pool 2G,thin volume 声明 10G,用 dd 写入 2.1G 数据,观察 lvs 中 Data% 超过 100% 时系统的行为。

  3. 磁盘热替换模拟:用 echo 1 > /sys/block/sdX/device/delete 模拟移除,然后重新挂载 VG 并恢复。

七、小结与下期预告

本期我们深入了 XFS 的高级特性(条带化、配额),以及 LVM 瘦供给和磁盘故障处理。记住 XFS 与 ext4 的核心差异:不能缩小,只能扩大;同时善用项目配额防止“磁盘写满导致服务挂掉”这个经典故障。

下期预告:第 5 期《系统监控与性能基石 —— 不装第三方软件也能看透一切》。我们将使用 openEuler 自带的 sysstatbpftrace 分析 CPU 高 load、内存泄漏和 D 状态进程,并教你配置持久化 sysctltuned 调优方案。

上期思考答案:rich rule 比直接端口放行更安全,是因为它支持源 IP、时间、连接状态等条件判断。--direct 用于传递原生 iptables/nftables 规则,通常只在 firewalld 不支持的复杂匹配时使用(如 string 匹配、owner 模块)。

本期思考:XFS 的 inode64 挂载选项与老系统兼容性有何冲突?如果你要将 XFS 文件系统挂载到较老内核(如 CentOS 6),需要注意什么?

收藏举报
Level 1
0
帖子
0
粉丝
0
获赞