什么是Linux分区扩容及何时需要
很多人一开始装Linux系统时,只给根分区划分了20或30GB,觉得够用。但真正用起来才发现,日志文件、缓存、Docker镜像、数据库都会慢慢把空间吃光。等你发现系统弹出“磁盘空间不足”的警告时,往往已经无法正常写入文件了。这时候就需要做Linux分区扩容。
需要注意的是,Linux分区扩容和Windows不一样,不能直接把相邻分区的空闲空间拖拽合并。它涉及到物理卷、逻辑卷、分区表等底层概念,尤其是生产服务器上操作前一定要先备份。我这些年处理过不少因为误操作导致分区表损坏的案例,所以先把这句话放在前面:无论你多着急,先备份重要数据。

为什么我的Linux分区明明有空闲磁盘空间却无法直接扩容
这个问题非常常见。很多人用df -h看到根分区满了,再用lsblk一看,发现磁盘上还有未分配的空闲空间,但就是没法直接给根分区加上去。原因在于分区类型。
如果你用的是传统MBR分区,且根分区前后都被其他分区卡住了,那空闲空间即便相邻也无法合并。比如你的根分区在sda2,空闲空间在sda3之后,那就无法直接扩展。除非你删除中间的分区,但删除分区意味着数据丢失。

另一种情况是你在虚拟机里,系统用的是LVM逻辑卷管理。这时候情况就好办很多,LVM支持在线扩容。你可以用pvcreate把新磁盘或空闲分区做成物理卷,再用vgextend加入卷组,最后用lvextend给逻辑卷增加空间。扩容后别忘了用resize2fs或者xfs_growfs更新文件系统大小,不然df -h看到的还是老样子。
使用LVM做Linux分区扩容的具体步骤
假设你的服务器上已经有一块新加的硬盘或者虚拟磁盘,比如/dev/sdb,而且你之前安装系统时已经用了LVM。那操作流程大概是这样的。

先查看现有卷组名称linux运维面试题,用vgs或者vgdisplay命令。假设卷组叫vg_root。接着把新磁盘做成物理卷:pvcreate /dev/sdb。然后把它加入卷组:vgextend vg_root /dev/sdb。之后查看根分区对应的逻辑卷路径,通常在/dev/vg_root/root或者/dev/mapper/下。用lvextend命令增加空间,比如增加10GB:lvextend -L +10G /dev/vg_root/root。最后根据文件系统类型执行扩容命令。如果是ext4就用resize2fs /dev/vg_root/root,如果是xfs就用xfs_growfs /挂载点。
整个过程不需要重启,只要文件系统支持在线扩容就能直接生效。不过提醒一下,如果你对命令不熟,建议先在测试环境里演练一遍。我一个同事曾经在扩xfs时忘了-growfs步骤,导致后面系统报错,折腾了半天才搞定。
没有LVM的普通分区如何扩容

如果你装系统时没有用LVM,用的是标准分区,比如/dev/sda1挂载根分区,那扩容就麻烦一些。你可以用gparted或者fdisk配合操作,但大部分时候需要卸载分区或者进入救援模式。
比较常见的做法是用一个U盘启动到Live CD环境,然后用GParted图形化工具拖动分区边界。你也可以用fdisk删除原分区再重建,但必须注意保持起始扇区和文件系统对齐,否则数据会丢失。我一般建议用户,只要不是特别老的系统,尽量在安装阶段就配置LVM,哪怕只分给根分区50GB,但用LVM管理,后续扩容也就是几条命令的事。
另外还有一种情况是你有多块磁盘,比如系统盘是sda,数据盘是sdblinux 分区扩容,你想把sdb的空闲空间挪给sda上的分区。这在标准分区模式下基本行不通,只能通过软链接或者重新挂载目录的方式绕过去。比如把/var/log单独挂载到sdb的一个分区上,释放根分区的空间。
扩容后如何确认分区是否真的生效

很多人执行完扩容命令后,用df -h一看空间没变,就以为操作失败了。其实不是,因为df显示的是文件系统大小,而文件系统不会自动感知底层设备的变化。你必须在lvextend之后执行resize2fs或者xfs_growfs。还有一个常见疏忽是,扩容时指定的大小单位错了linux查看磁盘空间,比如lvextend -L +10G,如果你写成了lvextend -l +10linux 分区扩容,那加的是PE数量而不是GB,可能只多了几十MB。
建议扩容后先用lsblk查看块设备大小,确认物理卷和逻辑卷已经变大。再用df -h查看挂载点的可用空间是否增加。如果文件系统是xfs,记得xfs_growfs命令后面跟挂载点而不是设备路径。如果你不确定当前逻辑卷路径,用lvdisplay或者lvs命令都能看到。
另外,如果是给根分区扩容,一定要确认当前文件系统是否支持在线扩容。xfs支持,但只能扩大不能缩小。ext4也支持在线扩大。如果你用的是btrfs或者zfs,命令不同,需要单独查文档。
