linux xfs_growfs命令

重要提示: XFS 文件系统支持在线扩容,无需卸载文件系统,但请注意:
  • XFS 文件系统只能扩展,不能缩小
  • 扩展操作需要底层设备有足够的可用空间
  • 操作前建议备份重要数据
  • 确保文件系统处于健康状态

一、Xfs_growfs 简介

xfs_growfs 是用于扩展 XFS 文件系统大小的命令行工具。XFS 是一种高性能的 64 位日志文件系统,特别适合大容量存储和并行 I/O。

XFS 文件系统特点
  • 高性能:特别适合大文件和高并发场景
  • 在线扩容:支持无需卸载的在线扩展
  • 大容量:支持最大 8EB(exabytes)的文件系统
  • 延迟分配:优化写入性能
  • 数据完整性:支持元数据日志和校验和
  • 快照支持:通过 xfs_freeze 支持快照

二、基本语法

xfs_growfs [选项] 挂载点|设备

三、常用选项

选项 说明
-d 扩展数据部分(默认行为)
-D 大小 指定扩展数据部分到指定大小
-e 扩展可以存储inode的区域
-i 不更改inode,只打印信息
-L 大小 设置日志区域大小
-m 更新挂载选项
-n 不实际执行,只显示会做什么
-r 扩展实时部分
-t 使用备用挂载表
-V 显示版本信息
-x 解锁文件系统

四、常用实例

1. 查看当前文件系统信息

# 查看挂载点信息
xfs_growfs -n /mnt/data

# 查看设备信息
xfs_growfs -n /dev/sda1

# 查看详细信息
xfs_info /mnt/data
xfs_admin -l /dev/sda1

# 使用df查看空间
df -hT /mnt/data

2. 扩展XFS文件系统到最大可用空间

# 使用挂载点(无需卸载,在线扩展)
sudo xfs_growfs /mnt/data

# 使用设备文件(需要先确保分区已扩展)
sudo xfs_growfs /dev/sda1

# 显示扩展过程
sudo xfs_growfs -d /mnt/data

3. 扩展到指定大小

# 扩展到100GB
sudo xfs_growfs -D 100G /mnt/data

# 使用512字节块为单位指定大小
sudo xfs_growfs -D 209715200 /mnt/data  # 100GB = 100*1024*1024*1024/512

# 扩展到分区最大(需要先扩展底层分区)
sudo xfs_growfs /mnt/data

4. 扩展inode区域

# 扩展可以存储inode的区域
sudo xfs_growfs -e /mnt/data

# 同时扩展数据和inode区域
sudo xfs_growfs -d -e /mnt/data

# 查看inode信息
xfs_db -c "sb 0" -c "print inopblock" /dev/sda1

5. 模拟扩展操作(不实际执行)

# 查看如果要扩展会做什么
sudo xfs_growfs -n /mnt/data

# 查看指定大小的扩展效果
sudo xfs_growfs -n -D 50G /mnt/data

# 查看所有可能的扩展选项
sudo xfs_growfs -n -d -e /mnt/data

五、完整扩容流程

场景1:标准分区上的XFS扩展

#!/bin/bash
# 标准分区XFS扩展流程
DEVICE="/dev/sdb1"
MOUNT_POINT="/mnt/data"

echo "=== Step 1: 检查当前状态 ==="
df -h "$MOUNT_POINT"
sudo xfs_info "$MOUNT_POINT"

echo "=== Step 2: 检查设备空间 ==="
sudo parted "$DEVICE" unit GB print

echo "=== Step 3: 扩展底层分区(如果需要) ==="
# 使用 parted 扩展分区
# sudo parted "$DEVICE" resizepart 1 100%

echo "=== Step 4: 重新读取分区表 ==="
sudo partprobe "$DEVICE"

echo "=== Step 5: 扩展XFS文件系统 ==="
sudo xfs_growfs "$MOUNT_POINT"

echo "=== Step 6: 验证扩展结果 ==="
df -h "$MOUNT_POINT"
sudo xfs_info "$MOUNT_POINT"

场景2:LVM逻辑卷上的XFS扩展

#!/bin/bash
# LVM逻辑卷XFS扩展流程
VG="vg_data"
LV="lv_data"
LV_PATH="/dev/$VG/$LV"
MOUNT_POINT="/data"

echo "=== LVM逻辑卷XFS扩展 ==="

# 1. 检查当前状态
echo "当前空间使用:"
df -h "$MOUNT_POINT"
sudo lvs

# 2. 扩展逻辑卷(增加20GB)
echo "扩展逻辑卷20GB..."
sudo lvextend -L +20G "$LV_PATH"

# 3. 扩展XFS文件系统(在线扩展,无需卸载)
echo "扩展XFS文件系统..."
sudo xfs_growfs "$MOUNT_POINT"

# 4. 验证结果
echo "扩展完成:"
df -h "$MOUNT_POINT"
sudo xfs_info "$MOUNT_POINT"

场景3:RAID设备上的XFS扩展

#!/bin/bash
# RAID设备XFS扩展
RAID_DEVICE="/dev/md0"
MOUNT_POINT="/raid"

echo "=== RAID设备XFS扩展 ==="

# 1. 检查RAID状态
sudo mdadm --detail "$RAID_DEVICE"

# 2. 检查文件系统状态
df -h "$MOUNT_POINT"
sudo xfs_info "$MOUNT_POINT"

# 3. 添加新磁盘到RAID(如果需要)
# sudo mdadm --add "$RAID_DEVICE" /dev/sdd

# 4. 扩展RAID设备
# sudo mdadm --grow "$RAID_DEVICE" --raid-devices=4

# 5. 扩展XFS文件系统
sudo xfs_growfs "$MOUNT_POINT"

echo "扩展完成"

六、XFS文件系统管理

1. 创建XFS文件系统

# 创建XFS文件系统
sudo mkfs.xfs /dev/sdb1

# 指定inode大小和特性
sudo mkfs.xfs -f -i size=512 /dev/sdb1

# 指定标签
sudo mkfs.xfs -L "DataVolume" /dev/sdb1

# 使用更大的日志
sudo mkfs.xfs -l size=128m /dev/sdb1

# 挂载新创建的文件系统
sudo mount /dev/sdb1 /mnt/data

2. XFS检查和修复

# 检查XFS文件系统(需要卸载)
sudo umount /mnt/data
sudo xfs_check /dev/sdb1

# 修复XFS文件系统
sudo xfs_repair /dev/sdb1

# 检查但不修复
sudo xfs_repair -n /dev/sdb1

# 强制修复
sudo xfs_repair -f /dev/sdb1

# 重新挂载
sudo mount /dev/sdb1 /mnt/data

3. XFS性能优化

# 查看当前挂载选项
mount | grep xfs

# 优化挂载选项
sudo mount -o noatime,nodiratime,allocsize=1G /dev/sdb1 /mnt/data

# 或修改/etc/fstab
# /dev/sdb1 /mnt/data xfs noatime,nodiratime,allocsize=1G 0 0

# 使用大块I/O
sudo mount -o allocsize=1G,largeio,inode64,swalloc /dev/sdb1 /mnt/data

# 启用写屏障(数据安全)
sudo mount -o barrier /dev/sdb1 /mnt/data

# 禁用写屏障(性能优先)
sudo mount -o nobarrier /dev/sdb1 /mnt/data

七、高级用法

1. 扩展实时设备部分

# 检查实时设备配置
xfs_info /mnt/data | grep -i realtime

# 扩展实时设备部分
sudo xfs_growfs -r /mnt/data

# 指定实时设备大小
sudo xfs_growfs -r -D 50G /mnt/data

2. 更新日志大小

# 查看当前日志大小
sudo xfs_info /mnt/data | grep log

# 更新日志大小(需要卸载)
sudo umount /mnt/data
sudo xfs_growfs -L 256m /dev/sdb1
sudo mount /dev/sdb1 /mnt/data

# 或者在线更新(某些内核支持)
sudo xfs_growfs -m /mnt/data

3. 批量扩展脚本

#!/bin/bash
# 批量扩展所有XFS文件系统
for MOUNT_POINT in $(mount -t xfs | awk '{print $3}'); do
    echo "检查 $MOUNT_POINT ..."

    # 检查是否有可用空间
    DEVICE=$(mount | grep " $MOUNT_POINT " | awk '{print $1}')
    PARTITION_SIZE=$(sudo blockdev --getsize64 "$DEVICE")
    FS_SIZE=$(sudo xfs_info "$MOUNT_POINT" | grep "data blocks" | awk '{print $4}')

    if [ "$PARTITION_SIZE" -gt "$FS_SIZE" ]; then
        echo "扩展 $MOUNT_POINT ..."
        sudo xfs_growfs "$MOUNT_POINT"
    else
        echo "$MOUNT_POINT 已使用所有空间"
    fi
done

八、故障排除

# 原因:挂载点被其他进程占用或挂载选项问题
# 解决方法:

# 1. 检查是否有进程占用
sudo lsof /mnt/data

# 2. 检查挂载状态
mount | grep /mnt/data
cat /proc/mounts | grep /mnt/data

# 3. 尝试使用设备路径
sudo xfs_growfs /dev/sda1

# 4. 检查文件系统类型
df -T /mnt/data

# 5. 如果是只读挂载,重新挂载为读写
sudo mount -o remount,rw /mnt/data

# 原因:底层设备没有足够的空间
# 解决方法:

# 1. 检查分区大小
sudo parted /dev/sda unit GB print

# 2. 检查逻辑卷大小
sudo lvs

# 3. 扩展底层存储
# 对于分区:使用 parted 扩展分区
# sudo parted /dev/sda resizepart 1 100%

# 对于LVM:扩展逻辑卷
# sudo lvextend -L +10G /dev/vg/data

# 对于RAID:扩展RAID设备
# sudo mdadm --grow /dev/md0 --size=max

# 4. 重新读取分区表
sudo partprobe /dev/sda

# 5. 重试扩展
sudo xfs_growfs /mnt/data

# 原因:不是XFS文件系统或未挂载
# 解决方法:

# 1. 检查文件系统类型
df -T /mnt/data

# 2. 检查是否挂载
mount | grep /mnt/data

# 3. 如果是其他文件系统,使用相应工具
# ext4: sudo resize2fs /dev/sda1
# btrfs: sudo btrfs filesystem resize /mnt/data

# 4. 如果是未挂载的XFS,使用设备路径
sudo xfs_growfs /dev/sda1

# 5. 重新挂载XFS文件系统
sudo mount -t xfs /dev/sda1 /mnt/data

# 原因:指定的大小超过设备容量
# 解决方法:

# 1. 检查设备最大容量
sudo blockdev --getsize64 /dev/sda1

# 2. 计算可用空间
sudo xfs_info /mnt/data | grep "data blocks"

# 3. 使用合理的大小
# 例如,扩展到90%容量
DEVICE_SIZE=$(sudo blockdev --getsize64 /dev/sda1)
TARGET_SIZE=$((DEVICE_SIZE * 90 / 100))
sudo xfs_growfs -D "${TARGET_SIZE}b" /mnt/data

# 4. 或使用默认扩展到最大
sudo xfs_growfs /mnt/data

九、相关命令对比

文件系统 扩展命令 缩小命令 在线操作 特点
XFS xfs_growfs 不支持 支持 高性能,大文件优化
ext4 resize2fs 支持 部分支持 通用性好,兼容性强
Btrfs btrfs filesystem resize 支持 支持 支持快照,压缩,去重
ZFS zfs set quota 限制支持 支持 企业级,数据完整性

十、最佳实践

XFS 扩容最佳实践
  • 在线操作:充分利用XFS的在线扩容能力,避免停机
  • 顺序操作:先扩展底层存储,再扩展文件系统
  • 监控容量:使用监控工具,提前规划扩容
  • 测试环境验证:生产环境操作前在测试环境验证
  • 备份策略:重要数据定期备份,即使支持在线操作
  • 性能优化:根据使用场景调整挂载选项
  • inode规划:创建时合理设置inode数量,避免后期不足
  • 日志大小:根据写入量合理设置日志大小

十一、XFS工具集

xfs_info

显示XFS文件系统信息

xfs_info /mnt/data
xfs_admin

修改XFS文件系统参数

xfs_admin -L label /dev/sda1
xfs_repair

修复XFS文件系统

xfs_repair /dev/sda1
xfs_db

XFS文件系统调试器

xfs_db /dev/sda1
xfs_freeze

冻结XFS文件系统

xfs_freeze -f /mnt/data
xfs_quota

XFS配额管理

xfs_quota -x -c report /mnt/data

十二、应用场景建议

场景 建议文件系统 原因
数据库服务器 XFS 或 ext4 XFS的高并发性能优秀,ext4稳定可靠
大文件存储(视频、备份) XFS XFS对超大文件支持更好
需要频繁调整大小的系统 Btrfs 或 ext4 支持缩小操作,更灵活
桌面系统 ext4 稳定、兼容性好
云存储/分布式存储 XFS 或 CephFS XFS性能好,适合高负载
专业建议: 对于大多数生产环境,如果主要需求是高性能和大文件处理,XFS是优秀的选择。如果经常需要调整分区大小,考虑使用ext4或Btrfs。无论选择哪种文件系统,都要建立完善的监控和备份机制。