标签: Linux

  • Linux 系统扩容分区及文件系统完整指南:从磁盘到 ext4/xfs 的实操步骤

    Linux 系统扩容分区及文件系统完整指南:从磁盘到 ext4/xfs 的实操步骤

    为什么需要扩容?磁盘空间告急的常见场景

    服务器运维中最常见的告警之一就是 “No space left on device”。无论是虚拟机的虚拟磁盘扩了容、云主机的云盘升级了规格,还是物理服务器插了新硬盘,最终都要面对同一个问题:如何让操作系统真正使用上这些新增的空间?

    很多人以为给虚拟机加了磁盘、或者在云平台点了”扩容”按钮就完事了——其实这只是完成了 L0(物理层) 的扩容,还需要逐层往上走,让分区表、LVM、文件系统都知道”我变大了”。

    先搞懂:Linux 存储的五层架构

    在动手扩容之前,必须搞清楚数据是怎么一层一层存到磁盘上的。简单来说,一条完整的存储栈长这样:

    Linux 存储层级架构图 - 物理磁盘 → 分区 → LVM → 文件系统 → 挂载点

    1. L1 物理磁盘:/dev/sda、/dev/vda、/dev/nvme0n1 —— 实实在在的硬件,扩容的起点。
    2. L2 分区表:MBR(最多 4 个主分区,2TB 上限)或 GPT(128 分区,无容量限制),把磁盘切成若干块。
    3. L3 LVM(可选但推荐):PV(物理卷)→ VG(卷组)→ LV(逻辑卷),动态管理空间的神器。
    4. L4 文件系统:ext4、xfs、btrfs,决定了数据怎么组织。
    5. L5 挂载点:/、/boot、/home,目录到设备的映射。

    扩容就是要确认每一层都知道”空间变大了”——少一层都不行。

    场景一:LVM 逻辑卷扩容(最常见,强烈推荐)

    如果你的系统用了 LVM(绝大多数现代发行版的默认选择),恭喜你——这是最灵活的方案。完整操作流程如下:

    LVM 扩容 6 步操作流程图

    Step 1:检查当前状态

    # 看磁盘布局
    lsblk
    # 看分区
    fdisk -l /dev/sda
    # 看 LVM 状态
    pvs; vgs; lvs
    # 看文件系统使用率
    df -h

    Step 2 & 3:扩容分区表

    假设 /dev/sda2 是 LVM PV 所在分区,磁盘已经从 50GB 扩到了 100GB:

    parted /dev/sda
    (parted) print                 # 记住分区编号 (假设是 2)
    (parted) resizepart 2 100%    # 把 2 号分区扩到磁盘末尾
    (parted) print                 # 确认
    (parted) quit
    # 刷新内核分区表(避免 reboot)
    partprobe /dev/sda

    Step 4:扩容 PV(物理卷)

    # 让 LVM 知道 PV 变大了
    pvresize /dev/sda2
    # 确认 VG 空闲空间增加了
    vgs
    # 输出应该显示 VFree 变大了

    Step 5:扩容 LV(逻辑卷)

    # 把 VG 所有空闲空间都给 LV
    lvextend -l +100%FREE /dev/vg_name/lv_root
    # 或者指定大小
    lvextend -L +50G /dev/vg_name/lv_root

    Step 6:扩容文件系统

    最后一步,让文件系统使用新增的空间:

    # ext4 (最常见) —— 在线扩容,无需卸载
    resize2fs /dev/vg_name/lv_root
    
    # xfs (CentOS/RHEL 默认) —— 挂载点路径,不是设备
    xfs_growfs /
    
    # btrfs
    btrfs filesystem resize max /
    # 验证
    df -h
    # 应该看到 / 的 Size 变大了 ✓

    场景二:非 LVM 原生分区扩容(ext4)

    如果系统没有用 LVM,直接在分区上做了文件系统(简单但不灵活)。这种情况 ext4 支持在线扩容,比缩容容易得多:

    # 1. 用 parted 扩容分区表(同上)
    parted /dev/sda resizepart 1 100%
    partprobe /dev/sda
    
    # 2. 直接 resize2fs
    resize2fs /dev/sda1
    
    # 3. 验证
    df -h

    注意:非 LVM 方案中,分区必须是磁盘上的最后一个分区才能用 parted 在线扩容。如果根分区在中间位置,需要用 LiveCD/USB 离线操作。

    场景三:xfs 文件系统扩容

    xfs 是 RHEL/CentOS 7+ 的默认文件系统,和 ext4 的关键区别是:

    • xfs 只支持扩容,不支持缩容(缩容需要备份→重建→恢复)
    • xfs_growfs 用挂载点路径而不是设备名
    • 扩容需要挂载状态(在线扩容)
    # LVM 部分和 ext4 完全一样
    pvresize /dev/sda2
    lvextend -l +100%FREE /dev/vg/lv_root
    
    # xfs 文件系统扩容(注意是挂载点 / ,不是 /dev/vg/lv_root)
    xfs_growfs /
    # 或者 -d 选项指定数据块大小
    xfs_growfs -d /
    
    # 验证
    df -h
    xfs_info /

    场景四:根分区(/)扩容的特殊处理

    根分区的特殊之处在于:它一直在使用中,大多数情况下是可以在线扩容的(LVM + ext4/xfs 都支持),但如果是非 LVM + 需要缩容,就麻烦了:

    组合 能否在线扩容 备注
    LVM + ext4 ✅ 直接在线 最推荐
    LVM + xfs ✅ 直接在线 RHEL/CentOS 默认
    非 LVM + ext4 ⚠️ 分区表需离线 resize2fs 可在线
    非 LVM + xfs ⚠️ 同上 xfs 不支持缩容

    对于非 LVM + 根分区的情况,最安全的做法是用 LiveCD:

    # 1. 用 LiveCD/USB 启动
    # 2. 挂载原根分区到 /mnt
    mount /dev/sda2 /mnt
    
    # 3. 用 parted 扩容分区表(离线更安全)
    parted /dev/sda
    (parted) resizepart 2 100%
    
    # 4. 扩容文件系统
    resize2fs /dev/sda2
    
    # 5. 卸载、重启
    umount /mnt
    reboot

    扩容后如何验证?

    # 1. df -h 看大小
    df -h /
    # Filesystem     Size  Used Avail Use% Mounted on
    # /dev/sda2      100G   20G   80G  20% /    ← 应该看到 100G
    
    # 2. lsblk 确认分区和文件系统都扩了
    lsblk /dev/sda
    # NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    # sda      8:0    0  100G  0 disk 
    # └─sda2   8:2    0  100G  0 part /          ← 100G ✓
    
    # 3. LVM 专项检查
    lvs            # LV Size 变大了
    vgs            # VFree  = 0 (全部用完了)
    
    # 4. xfs 专项
    xfs_info /
    
    # 5. 跑一个简单的写入测试
    dd if=/dev/zero of=/tmp/test.bin bs=1M count=1000
    rm /tmp/test.bin

    常见坑与避坑指南

    干了 10 年运维,扩容踩过的坑总结:

    1. 忘了 partprobe 或 reboot
    parted 改了分区表后,内核可能还在用旧的。partprobe /dev/sdX 或 blockdev --rereadpt /dev/sdX 让内核重新读分区表。不行就重启。

    2. xfs_growfs 传了设备名而不是挂载点
    xfs_growfs /dev/vg/lv_root ❌ —— 报错 “not a mounted XFS filesystem”
    xfs_growfs / ✅ —— 挂载点路径

    3. MBR 的 2TB 限制
    超过 2TB 的磁盘必须用 GPT。parted 支持 GPT,但如果系统装在 MBR 上又要扩容到 2TB+,就需要 gdisk 转换(⚠️ 高风险)。

    4. 云主机还要先扩容云盘
    AWS(EBS)、阿里云(云盘)、腾讯云(CBS)都要先在控制台扩容磁盘,进系统后还要执行 echo 1 > /sys/class/block/xvda/device/rescan 或重启让内核识别新大小。

    5. 扩容顺序不能反
    ❌ 先 resize2fs 再 lvextend
    ✅ 正确顺序:磁盘→分区→PV→LV→文件系统(从下往上)

    6. btrfs 特殊处理
    btrfs 用 btrfs filesystem resize max /,如果是多设备还需要 btrfs device resize。

    写在最后:为什么强烈推荐 LVM?

    如果你的系统还没用 LVM,而磁盘扩容的场景几乎肯定会遇到,建议花时间迁移到 LVM。LVM 的好处:

    • 在线扩容:不停机就能扩
    • 灵活调整:LV 可以在 VG 内任意移动、分配
    • 快照(Snapshot):扩容前拍一个快照,操作失误秒回滚
    • 多磁盘聚合:多块小磁盘组成一个大 VG

    最后一个忠告:操作前备份数据。哪怕是在线扩容、哪怕是 ext4/LVM,一个断电、一个 OOM、一个命令敲错,都有可能把文件系统搞崩。rsync 一把或者 LVM snapshot 一下,花不了 2 分钟。

    适用系统:RHEL/CentOS 6-9、Ubuntu 18.04-24.04、Debian 10-12、以及主流 Linux 发行版。命令以 GNU parted 和 LVM2 为准。