如果你手头那台 Linux 服务器或者家用 NAS 的根目录 / 又满了或者 /home 空间不太够这篇文章应该能帮你少走不少弯路。我这次是 20231008 的一次真实操作记录处理的是“/home 和根目录扩容”的问题前后折腾了小半天所幸顺利搞定。本文会把 LVM 和非 LVM 两条路线都讲清楚还包括 VMware 虚拟机里 vmdk 扩容后的完整操作链路适合 Linux 运维、自建 NAS 玩家以及那些第一次接手生产服务器但又不敢乱动分区的朋友。1. 扩容前必须搞清楚的3件事很多新手一看到 df -h 里 / 或者 /home 使用率达到 100%第一反应就是去找新硬盘或者直接删文件。其实在动手扩容之前有三个问题必须先确认清楚否则操作到一半很可能遇到“没法在线扩容”“文件系统不支持缩容”“重启后找不到分区”这种坑。1.1 先判断文件系统格式和分区结构扩容方式完全取决于你的磁盘是怎么分区的、文件系统是哪种格式。同一台机器上/ 和 /home 可能分别隶属于独立分区也可能都挂在同一个卷组下面甚至 /home 可能只是根目录里的一个普通目录而不是独立分区。所以第一步就是用命令把“家底”翻出来df -hT lsblk blkid pvs vgs lvsdf -hT 能直观看到文件系统类型和挂载点比如 ext4、xfs、btrfs。lsblk 可以看分区的树形结构能区分出 sda1、sda2 这些是物理分区还是 lvm 逻辑卷。blkid 则能显示每个分区和逻辑卷的 UUID 和类型。如果 pvs、vgs、lvs 能输出内容说明系统在用 LVM 管理磁盘如果提示 command not found那就是传统分区或者云镜像的默认分区。这一步决定后续能不能直接在系统里热扩容。举个例子我这次处理的机器就是 /dev/sda2 挂在 //dev/sda3 挂在 /home两个分区都属于同一个卷组 vg_root那就简单多了直接 lvextend 就能搞定。1.2 判断能不能在线扩容知道是不是 LVM 之后还要清楚“在线扩容”的边界LVM 的逻辑卷 LV 可以在系统运行状态下扩展甚至可以在线缩小ext4 可以xfs 不行。传统分区非 LVM如果要扩展根分区因为根分区始终处于挂载状态不能直接修改分区表必须借助 live CD 之类的离线环境。ext4 文件系统支持在线扩大也支持缩容时需要离线并先缩小文件系统xfs 只支持扩大不支持缩小。如果你的根分区不是 LVM而是云服务器那种 vda1 直接挂载很多云厂商的“一键扩容”功能会自动处理分区表但自建物理机没有这个便利。所以先别急着下载工具先跑一遍 1.1 的命令把类型确定下来再决定走哪条路线。我见过有人在一台 btrfs 上用 resize2fs结果直接报错因为 btrfs 要用 btrfs filesystem resize完全不是一套东西。1.3 备份和数据安全优先扩容操作的失败率不高但一旦失败丢数据的代价极高。尤其是缩容 /home 或者用 GParted 调整分区边界时中间任何一步断电、死机都可能导致分区表错乱。所以操作之前一定要备份。最稳妥的方式是把整个系统做成虚拟机快照如果是虚拟机或者用 dd 备份关键分区。考虑到根分区通常比较大全量 dd 不一定现实至少要把 /home 里不可再生的数据比如数据库文件、容器 volume、个人文档拷贝到外部存储或者另一块磁盘上。我自己的习惯是操作前执行一次rsync -av /home/ /mnt/backup/home/然后把 /etc/fstab、分区表信息也导出来fdisk -l partition.txt cat /etc/fstab这些记录能在事故发生后帮你快速恢复现场。别嫌麻烦这个动作能省掉 99% 的后续风险。2. 基于LVM的扩容实操CentOS/RHEL主流方案如果你的系统是 CentOS、RHEL、Rocky Linux并且安装时默认用了 LVM那扩容其实非常顺滑。整体思路是新磁盘或者未分配空间 → 创建物理卷 PV → 扩展到卷组 VG → 再扩展逻辑卷 LV → 最后刷新文件系统。2.1 添加新磁盘并创建PV假设原卷组 vg_root 已经没有空闲空间了而系统里新识别了一块 100G 的磁盘 /dev/sdb。先确认一下lsblk如果能看到 /dev/sdb 但没有分区就可以直接把它做成物理卷pvcreate /dev/sdb vgextend vg_root /dev/sdb这里有个细节很多人习惯先用 fdisk 给新盘建立分区再 pvcreate其实如果把整个盘给 LVM 用直接 pvcreate /dev/sdb 也不会有问题。但如果你后面还要维护这块盘或者想更规范一点建议还是用 fdisk 建一个分区并把分区类型改成 8efdisk /dev/sdb依次输入 n 新建分区、p 主分区、回车选默认分区号、再回车选起始扇区、回车选结束扇区最后 t 改类型为 8ew 保存。然后再 pvcreate /dev/sdb1。建完之后用 pvs 确认新的 PV 已经出现再用 vgs 查看卷组的空闲空间。如果显示 VFree 100G说明 VG 已经扩展成功。2.2 扩展VG和LV接下来就要决定把这 100G 给哪个逻辑卷了。先看一下现有逻辑卷列表lvs通常会有类似这样的输出lv_root vg_root -wi-ao---- 50G lv_home vg_root -wi-ao---- 200G如果这次需要给根目录扩 80G给 /home 扩 20G可以这样lvextend -L 80G /dev/vg_root/lv_root lvextend -L 20G /dev/vg_root/lv_home注意这里的 -L 80G 是“增加 80G”如果是 -L 80G 就是“扩展到 80G”。一字之差含义完全不一样实际操作时最好再 lvs 确认一下。扩展完 LV 之后还差最后一步刷新文件系统。很多新手在这一步翻车因为 lvextend 只改变了逻辑卷大小文件系统还停留在原来的尺寸df -h 不会立刻看到变化。2.3 刷新文件系统ext4/xfs区别处理文件系统刷新命令取决于你的类型。如果是 ext4resize2fs /dev/vg_root/lv_root resize2fs /dev/vg_root/lv_home如果是 xfsxfs_growfs / xfs_growfs /home注意 xfs 的刷新命令后面跟的是“挂载点”而不是逻辑卷设备路径。命令执行后用 df -hT 验证df -hT看到 / 和 /home 的空间增加就说明扩容成功了。这里为什么要区分 ext4 和 xfs因为 ext4 可以支持缩小也就是说你将来可以先把 /home 缩小再把空间挪给 / 这种操作。但 xfs 只能扩大不能缩小如果你当初 /home 用了 xfs想缩它是没门的只能备份数据、删除逻辑卷、重建再恢复数据。这一点在选择文件系统时就要考虑好。3. 非LVM分区如何扩容Ubuntu/纯分区方案很多 Ubuntu 桌面版、windowslinux 双系统或者一些云主机镜像用的不是 LVM而是传统分区。比如 /dev/sda2 直接挂载 //dev/sda3 挂载 /home。这种情况想扩大根分区就麻烦一些因为根分区在系统运行中无法卸载不能直接改分区表。最靠谱的就是做一张 GParted Live 启动盘离线调整分区。3.1 GParted Live的烧录与启动GParted 是目前调整分区最好用的工具之一它同时支持 ext4、xfs、btrfs、ntfs 等多种文件系统的移动和缩放操作。第一步是下载 GParted Live 的 ISO 镜像然后用 rufusWindows或者 dd 命令Linux写入 U 盘。在 Linux 里写 U 盘时注意不要写错设备dd ifgparted-live-xxx.iso of/dev/sdX bs4M statusprogress sync然后重启电脑从 U 盘启动。如果没进入 GParted而进到了原系统检查 BIOS 里的启动顺序或者临时按 F12、Esc 选择启动介质。进入 GParted Live 后如果默认是英文界面可以在启动菜单选择键盘布局和语言。图形界面起来后会直接显示所有磁盘和分区。3.2 调整分区流程与注意事项假设当前磁盘布局是 /dev/sda2 挂载 //dev/sda3 挂载 /homesda2 前面或者后面有未分配空间那就直接选中 sda2右键 Resize/Move把右边的箭头拉到最大然后 Apply。如果空间在 /home 附近而你想扩充根分区那就需要先缩小 /home再扩大根分区。但这里有一个大坑如果 /home 是独立分区GParted 想要缩小它分区必须处于卸载状态。在 GParted Live 里由于根分区已经是未挂载状态/home 一般也不会自动挂载所以条件通常可以满足。但一旦 /home 的分区有数据正在被系统占用或者 swap 分区挂载了操作会被拒绝。调整时要注意“对齐到 MiB”。GParted 默认启用对齐不要取消它否则新分区边界可能没有按柱面对齐导致性能变差甚至无法启动。全部操作完成后退出 GParted Live重启进入系统df -hT 就能看到变化。这里面的关键点就是传统分区根目录扩容必须离线操作不能在系统里直接完成。3.3 在线扩容根分区的约束有人会问我在云服务器上扩容根分区好像不用启动盘啊对云厂商通常通过底层卷扩容和 virtio 驱动配合在线把磁盘大小变大然后再用 growpart 扩展分区resize2fs 扩展文件系统。但这属于云环境的特殊机制物理机和传统虚拟机里根分区不能这样搞。在物理机上即便是加了新硬盘想把新硬盘的空间合并到已有的 sda 分区也做不到因为传统分区的边界是固定的。GParted 能做到的只是移动和改变同一块物理磁盘上的分区边界并不能跨磁盘合并。所以如果你有一块新硬盘想给非 LVM 系统的根目录扩容现实一点的方案是把新盘挂到某个目录然后把数据挪过去或者干脆重装系统时用 LVM。这也是为什么我更推荐在生产环境用 LVM 的核心理由。4. 虚拟机扩容场景vmdk/磁盘扩容后的完整链路现在很多自建服务器都是虚拟机跑出来的VMware、Proxmox、VirtualBox 都有各自的虚拟磁盘格式。扩容前如果只改虚拟机设置里面看不到新空间如果直接改客户机分区又会把虚拟磁盘文件搞坏。这里我用 vmdk 举例把完整链路走一遍。4.1 宿主机层磁盘扩容在 VMware 中先关机虚拟机强制要求尤其是有快照的情况下。然后右键虚拟机 → 编辑设置 → 硬盘 → 工具 → 扩展把磁盘大小从 100G 改成 200G。如果虚拟机有快照扩展按钮是灰色的必须先删除或用快照创建新分支否则无法扩展。VirtualBox 也类似设置 → 存储 → 选中虚拟硬盘 → 属性 → 调整大小。宿主机层扩容完成后新空间对客户机来说还是“未分区”的空白空间。如果你用 lsblk 看会看到 /dev/sda 的容量变大了但 sda1、sda2、sda3 这些分区的大小没变sda 末尾多了空闲空间。4.2 fdisk新建分区与PV/VG/LV扩展如果客户机是 LVM 系统就可以把新增的空白空间变成一个新分区然后加入 LVM。先在客户机里看磁盘lsblk比如原来 /dev/sda1 → /boot/dev/sda2 → LVM 的 PV/dev/sda3 → 其他分区。现在磁盘多了 100G可以用 fdisk 在空闲空间新建一个分区fdisk /dev/sda输入 n选择分区号通常选 4起始扇区直接回车结束扇区回车t 修改分区类型为 8ew 保存。然后让内核重新读取分区表partprobe /dev/sda如果分区表一直被占用也可以先 lsblk 确认或者用 partx -a /dev/sda 刷新。然后把新分区变成 PVpvcreate /dev/sda4 vgextend vg_root /dev/sda4接下来和 2.2、2.3 一样lvextend resize。4.3 /home和/根目录同时扩容的思路有时候根本不需要新磁盘而是 /home 分多了/ 不够用。如果整个系统是 LVM且 / 和 /home 是两个独立的 LV同时同一个 VG那么完全可以把 /home 缩下来把空间补给根目录。但前提是 /home 的文件系统必须是 ext4xfs 不能缩。流程如下先备份 /home 数据然后卸载 /homeumount /home检查文件系统e2fsck -f /dev/vg_root/lv_home把文件系统从 200G 缩到 180Gresize2fs /dev/vg_root/lv_home 180G再把逻辑卷本身也缩到 180Glvreduce -L 180G /dev/vg_root/lv_home注意顺序不能反必须先缩小文件系统再缩小 LV。如果先 lvreduce 再 resize2fs文件系统认为后面的块不见了大概率丢数据。释放出来的 20G 就留在卷组里可以扩展根目录lvextend -L 20G /dev/vg_root/lv_root resize2fs /dev/vg_root/lv_root最后重新挂载 /home恢复数据mount /home rsync -av /mnt/backup/home/ /home/这样根目录和 /home 都得到了扩容整个链路清晰且不会丢数据。这里面最考验人的是操作顺序和耐心尤其在 umount /home 之后任何中断都可能导致数据无法访问所以开机时尽量用 tmux 或者 screen 跑这些命令防止终端断线。5. 常见问题与排查技巧就算流程看得再明白实际操作中还是会遇到各种“意外”。我把这次以及之前几次扩容踩过的坑整理成了一张速查表另外也分享几个自己的避坑心得。5.1 典型问题速查表下面这些都是我真实遇到的问题不是无端猜测故障现象可能原因解决办法df -h 显示还是原来的大小扩完 LV 没有执行 resize2fs 或 xfs_growfs检查文件系统类型执行对应刷新命令resize2fs 报错 Bad magic number in super-block文件系统不是 ext4而是 xfs 或 btrfs不要用 resize2fsxfs 用 xfs_growfsbtrfs 用 btrfs filesystem resizexfs_growfs 报 Is a directory参数写成了设备路径xfs_growfs 后面跟挂载点比如 xfs_growfs /虚拟机硬盘扩展后 lsblk 看不到新容量客户机没有重新识别磁盘重启虚拟机或触发在线重新扫描如 echo 1 /sys/class/scsi_device/.../device/rescanfdisk 新建分区后保存正常partprobe 还是看不到分区分区表被系统缓存占用大多数情况重启最省事也可以尝试 partx -a /dev/sdaPV 状态显示 unknown device底层磁盘或分区发生变更vgreduce --removemissing --force 移除丢失 PV 后再重新添加lvreduce 后数据无法访问先缩小了 LV后缩小文件系统立刻停止一切写入使用 e2fsck 尝试修复下一次先缩文件系统再缩 LV扩容后 / 挂载异常无法启动调整分区导致 UUID 变了尽量别动原有分区起点若变了在 live 环境改 /etc/fstab 的 UUID5.2 我的避坑心得与建议这次 20231008 的操作让我印象最深的几点单独拿出来说下第一扩容之前一定要确认根目录和 /home 到底是不是同一个卷组。如果是同一个卷组调整起来非常灵活如果根本不在一块磁盘上那思路就完全不同了。用 vgs 看一下就明白。第二尽量用 tmux 或 screen。我习惯在远程服务器上操作时先把会话开成 tmux即使 SSH 断线命令也能继续跑完不会出现扩容到一半卡住的尴尬。第三别盲目追求最新工具。CentOS 7 上旧版 resize2fs 对超大分区性能很差但也没有必要为了扩容去升级内核。只要顺序对就够用。第四如果你的 /home 用的 xfs建议别再想“缩 home 扩根”的操作了xfs 不支持缩容唯一办法就是全新备份、删除 LV、重建成 ext4 再恢复数据过程繁琐且风险高。所以新装系统时如果不是特别需要 xfs 的特性用 ext4 会多一条“后悔药”。当然xfs 的稳定性在大并发写入场景确实有优势选型时要自己权衡。最后再分享一个小技巧扩容后不同目录的空间变化有时候 df 显示不对是因为文件系统有延迟等一两分钟再刷新。另外 lvextend 支持 -r 参数像这样lvextend -r -L 20G /dev/vg_root/lv_root它会在扩展逻辑卷之后自动调用 resize2fs 或者 xfs_growfs一步到位。但这个自动行为只在部分发行版上可用老系统还是手动执行更稳妥。我更建议手动来每跑一步都确认一次心里有底。这次扩容最终把根目录从 50G 扩到了 130G/home 也从 200G 扩到了 220G整个过程没有重启生产服务算是比较顺的一次。希望这篇记录也能帮你把 /home 和根目录的空间理顺别再被“磁盘满了”追着跑。