根分区满了通常并不意味着必须停机。在大多数情况下,你都可以在不中断服务、不重启系统的前提下,在线扩展服务器根分区。

正确的操作步骤取决于你使用的文件系统。LVM、ext4 和 XFS 的处理命令各不相同,而 XFS 只支持扩容,不支持缩容。

如果是虚拟机环境,还需要额外一步:必须先在虚拟化平台中扩大虚拟磁盘,然后客户机系统内部的扩容操作才能识别并使用这部分新增空间。

当磁盘空间告急时,不要急于“临场发挥”。请先做完整备份,再仔细检查当前磁盘与分区布局。

扩展根分区前的准备条件

本文中的每一条命令都需要 root 权限或具备 sudo 权限的账户。若没有相应权限,内核会拒绝分区或文件系统扩容操作。你可以先执行 sudo -v 确认权限是否可用。若可以继续,该命令会静默返回。建议在检查任何存储设备之前先执行它。

在修改分区前,务必先做完整备份。在线扩容通常是安全的,但断电或误操作仍可能造成数据损坏。备份能为你提供明确的恢复路径。请将备份保存到独立磁盘或远程主机上,并在开始操作前确认备份可以正常读取。

确认 Root 权限并备份数据

执行 sudo -i,在整个操作会话中进入 root shell。这样可以避免扩容过程中途出现权限问题。如果你本身就是 root 用户,可以跳过这一步。但备份仍然必不可少。你可以使用 dump、tar,或虚拟化平台的快照功能进行备份。备份内容必须覆盖完整的根文件系统。请用日期和服务器名称为备份打标签,以便在服务器意外中断时快速定位并恢复。

识别是否使用 LVM、ext4 或 XFS

执行 df -hT / 查看文件系统类型。这个命令会在容量输出中增加 Type 列。挂载到 / 的那一行会显示为 ext4 或 xfs。Type 列会与 Size、Used、Avail、Use% 和 Mounted on 一起显示。

接着执行 lsblk -f。该命令会展示从物理磁盘到分区的完整存储层级结构,你可以借此判断根文件系统是否位于 LVM 之上。如果是 LVM,请进一步使用 pvs、vgs 和 lvs 检查卷组信息。pvs 会列出物理卷及其大小;vgs 会显示卷组剩余可用空间;lvs 会给出执行扩容命令时所需的逻辑卷精确路径。

XFS 只能扩容,不能缩容。如果你的根文件系统使用 XFS,请在开始前确认确实存在可用空间,然后再次核对 Type 列以避免误操作。掌握这一点,才能更安全地扩展根分区。

在 Linux 服务器上扩展根分区前,先评估当前布局

在你安全地扩展 Linux 服务器根分区之前,必须先梳理清楚当前存储布局。请按顺序执行以下命令,并记录每一项输出结果。

  1. 执行 df -h,确认根文件系统的当前使用情况。
  2. 执行 lsblk,查看磁盘与分区树状结构。
  3. 执行 fdisk -l 和 parted -l,列出分区边界。
  4. 执行 vgs,检查卷组中是否有可用空闲空间。

检查磁盘和虚拟 Linux 系统分区

parted -l 的输出会显示每个分区的起始扇区和结束扇区。请留意某个分区结束位置与下一个分区开始位置之间是否存在空隙。这个空隙就是尚未分配的可用空间。在线扩容要求这段空闲空间必须紧接在目标分区之后。

虚拟 Linux 系统分区还有一个额外限制:在虚拟化平台层面扩大虚拟磁盘,并不会自动扩大客户机内部的分区。你必须先在虚拟化平台上完成磁盘扩容,然后在客户机内部再执行 growpart 或 LVM 相关命令。客户机只能使用虚拟磁盘层面已经存在的新增空间。

检查卷组空闲空间

vgs 命令的输出中会包含一个 VFree 列。例如,卷组 myvolg 的示例输出可能显示 VFree <139.99g。这表示卷组内部可用于扩展逻辑卷的空间大小。

请区分两种“空闲空间”。卷组内部的空闲空间,是 LVM 可直接用于扩展逻辑卷的容量;而物理磁盘上的未分配空间,则位于任何分区之外。对于非 LVM 布局,只有第二种空间才有帮助。在选择扩容方法之前,请务必同时确认这两类空间,并核实磁盘上的剩余空间是否与你的扩容方案一致。

通过 LVM 在线扩展服务器根分区

LVM 是在线扩展服务器根分区最简洁的方式。你只需扩展逻辑卷,内核就会在系统运行中识别新增块设备。无需重启,也不会中断服务。

使用卷组中的空闲空间进行扩展

首先使用这个一步到位的命令:lvextend -r -l 100%FREE /dev/mapper/<vg>-<lv>。其中 -r 参数会自动调整文件系统大小。对于 ext4,LVM 会调用 resize2fs;对于 XFS,则会调用 xfs_growfs。这条命令会一次性使用卷组中全部空闲 extent。

在执行之前,请先用 lvs 确认逻辑卷路径。输出会列出每个逻辑卷、所属卷组以及大小。典型结果中可能会看到诸如 lv_root 为 20.00g、lv_home 为 10.00g,并都属于卷组 vg_os。然后再用 df -hTP / 交叉确认根目录所挂载的设备,例如 /dev/mapper/vg_os-lv_root。请务必将这个准确路径传给 lvextend。如果路径写错,可能扩展的是错误的逻辑卷,而根分区本身仍然没有变化。

步骤 6:使用 lvs 命令检查需要扩容的逻辑卷名称。在我的例子中,它是 lv_root。再使用 df -hTP 命令获取 lv_root 逻辑卷的具体路径。在我的例子中,root 逻辑卷的具体路径是 /dev/mapper/vg_os-lv_root

这种方法仅适用于卷组中已经存在空闲空间的情况。请先检查 vgs 输出中的 VFree 列。如果它为零,就需要改用下一种方法。

向卷组中添加一块新磁盘

如果卷组中已经没有剩余空间,那就需要挂载一块新磁盘,并将其加入现有卷组。你需要先在虚拟化平台中附加该磁盘,并重新扫描 SCSI 总线,让客户机识别它。然后按下面的顺序执行:

  1. 将新磁盘初始化为物理卷:pvcreate /dev/sdd
  2. 把它加入现有卷组:vgextend datavg /dev/sdd
  3. 扩展逻辑卷并自动调整文件系统大小:lvextend -L +50G -r /dev/datavg/datalv

如果要扩展的是根逻辑卷,请按同样方式替换成根卷路径,例如:lvextend -L +10G -r /dev/rhel/root。你也可以一次性吃掉所有剩余空间:lvextend -l 100%FREE /dev/myvg/root。这里的 -r 参数同样会在扩展逻辑卷的同时调整文件系统大小,因此整个操作可以在线完成,无需卸载文件系统。

执行 lvextend 之前,请先用 pvs 和 vgs 验证新增物理卷是否已成功加入。此时 VFree 的数值应反映出新增容量。确认无误后,再执行 lvextend。这样的顺序可以避免在卷组尚未真正接收新磁盘时就执行扩容,从而导致失败。

只要按步骤操作,通过 LVM 在线扩展根分区的风险通常很低。确认路径、确认可用空间,然后让 -r 自动完成后续文件系统扩容即可。

在非 LVM 环境下在线扩展系统分区

如果不是 LVM 布局,可用的“安全垫”会少一些。你必须先扩展分区本身,然后再单独扩展文件系统。这两个步骤都可以在系统保持在线的情况下完成。

使用 growpart 或 parted 扩展分区

growpart 工具是在线扩大分区最简洁的方法。它会读取分区表,查找目标分区之后的空闲空间,并在不触碰已有数据的前提下重写分区条目。

它的第一个参数是磁盘设备,第二个参数是分区号。该工具支持在线运行,因此无需卸载文件系统。如果目标分区不是 LVM 物理卷,工具可能会输出类似 /dev/vde1 is not an lvm pv 的提示后退出。这个提示恰恰说明该分区是一个普通文件系统,这正是本节所讨论的场景。

parted 也可以用于扩展分区。执行 parted /dev/sdX,然后使用 resizepart 命令,指定分区号和新的结束扇区。无论你使用哪种工具,完成后都要执行 partprobe,让内核重新读取分区表。

使用 fdisk 删除后重建分区条目的方法同样可行,但风险确实更高。你需要先删除原分区条目,再用相同的起始扇区和更大的结束扇区重新创建。继续之前,请务必了解以下风险:

  • 用 fdisk 操作分区,如果执行者对流程不熟悉,尤其是在生产环境中,可能会直接导致虚拟机客户机操作系统无法启动。
  • 重建根分区后,bootable 标记可能会丢失,系统启动时可能报出 “could not find a file system” 之类的错误。

如果你必须使用 fdisk,完成后请再次进入该工具,并使用 a 命令把启动分区重新标记为 active。务必先在开发或测试环境中完整演练流程,并提前备份所有关键数据。

在线扩展 ext4 和 XFS 文件系统

仅仅扩大分区边界,并不会让根文件系统自动获得新空间。你还必须执行第二步:扩展文件系统本身。上述所有方法都必须遵循这一原则。

对于 ext2、ext3 或 ext4,请对对应设备执行 resize2fs:

sudo resize2fs /dev/sda3

同样的写法也适用于其他 ext 分区,例如 resize2fs /dev/sdb1。该工具会在文件系统保持挂载的状态下,将其扩展到整个分区大小。

对于 XFS,请使用 xfs_growfs,并指定挂载点或设备路径:

xfs_growfs /dev/sdh1

如果要扩展已经挂载的根文件系统,建议直接把命令指向挂载点:

sudo xfs_growfs /

命令输出会确认数据块数量已发生变化,这也意味着扩容成功。请记住,XFS 只能扩容,无法后续缩容。

在确认设备路径正确的前提下,使用这种两步法在线扩展根分区是很常见的操作。如果你跳过文件系统扩容这一步,那么即使分区边界已经变大,根分区看起来依然会是满的。

验证在线扩容结果与系统健康状态

使用 df、lvs 和 lsblk 确认新容量

先执行 df -h。输出会显示根文件系统的新容量。将 Size 列与扩容前记录的数值进行比较。此时 Avail 列也应体现新增的可用空间。如果这些数值符合你的预期目标,就说明文件系统扩容已经成功。

接着执行 sudo lvs 检查逻辑卷。LSize 列会显示每个逻辑卷的当前大小。示例输出可能类似 lv_root vg_os -wi-ao---- 20.00g。扩容完成后,这里的值应变为你希望扩大的目标大小。再执行 lsblk -o NAME,SIZE,TYPE,MOUNTPOINT 查看完整结构。根逻辑卷会以 lvm 设备形式出现,并挂载到 /,其大小应与 lvs 的输出一致。

检查日志与挂载状态

执行 dmesg,检查是否存在与文件系统或分区相关的错误信息。重点留意提到磁盘设备名或扩容操作的日志。如果出现 I/O 故障或分区表冲突相关错误,就必须立刻处理。然后执行 journalctl -xe,查看最近的系统事件。该命令可以捕获 dmesg 可能遗漏的服务级告警信息。

确认根文件系统仍然以可读写模式挂载。执行 mount | grep ' / ',检查输出中是否包含 rw 标志。如果根目录被挂载为只读,就说明存在需要进一步排查的问题。还应确认扩容过程中没有服务重启或失败。执行 systemctl --failed 查看失败状态的 systemd 单元。若输出为空,表示各项服务在扩容过程中没有受到影响;如果出现失败项,请检查其日志,并在需要时进行重启。

只要根据文件系统类型选择正确方法,你就可以安全地在线扩展服务器根分区。LVM、ext4 和 XFS 都有清晰可行的路径,内核也能够在服务持续运行时识别新增块设备。

有两条原则必须始终坚持。第一,先备份根分区;第二,在动手之前,先用 df、lsblk 和 vgs 检查布局。每次完成修改后,再用 df -h、lvs 和 lsblk 验证结果。

最后,建议先在预发布或测试环境中完整演练整个流程。一次演练就能暴露路径错误、空间不足等问题。当你已经在测试环境中成功在线扩展过服务器根分区后,生产环境中的操作就会从容许多。

常见问题

以下回答涵盖了在线扩展根分区时最常见的问题。

扩展根分区需要重启吗?

不需要。本文中的命令都可以在系统保持在线的情况下执行。LVM 的 lvextend -r 会自动完成文件系统扩容。非 LVM 布局则需要两步:先扩大分区,再扩展文件系统。整个过程都无需重启。

如果根分区后面没有可用空闲空间怎么办?

先检查你的存储布局。对于 LVM,可以新增一块物理磁盘并扩展卷组。对于非 LVM,空闲空间必须紧挨在该分区之后。如果空闲空间不在它后面,那么在不移动或删除其他分区的前提下,就无法在线扩展这个分区。

ext4 文件系统在挂载状态下可以扩容吗?

可以。Linux 支持在线扩容。resize2fs 可以在文件系统保持挂载的情况下完成扩展。操作前请先备份,并通过 df -hTP / 确认设备路径无误后再执行命令。

XFS 的扩容流程有什么不同?

使用 xfs_growfs /,而不是 resize2fs。XFS 只能扩容,不能缩容。除非你使用的是 LVM,否则分区后方必须有可用空闲空间。XFS 支持在线扩展,但无法回退缩小。

如何确认扩容已经成功?

执行 df -h,比较 Size 列变化;再用 lvs 检查逻辑卷大小;然后使用 lsblk 确认分区与设备层级;查看 dmesg 是否存在错误;最后通过 mount | grep ' / ' 确认 / 仍以读写模式挂载。