CentOS 7.3在线扩容根分区(无需LiveCD)
线上业务跑着跑着,根分区突然飙红,监控短信一条接一条,谁不慌?关机插光盘、找机房、排队重启,这一套流程下来,老板的脸色早就比告警灯还红。其实,CentOS 7.3自带的热扩容能力就能把这事在运行中搞定,不用LiveCD,也不用重启,键盘敲几下,空间就长出来。

先搞清楚:到底能不能热扩
很多人担心在线操作会把系统搞崩,先把顾虑打消:只要根分区落在LVM上,磁盘接口是virtio/scsi,文件系统用的是ext4/xfs,就能原地扩容。用lsblk看一眼,如果根分区对应的是/dev/mapper/centos-root,基本稳了;要是直接落在物理盘/dev/sda2,那就别硬撑,老老实实走LiveCD更保险。
动手之前:快照+多开一条SSH
线上操作再稳也要留后路。云平台先打一份快照,物理机就让备份同事拉一份全量。自己开两条SSH窗口,一条用来干活,一条闲着待命,万一第一条手抖断开,还能靠第二条救场。顺便把tmux或screen启起来,断网也不怕命令丢失。
第一步:把新磁盘喂给系统
云主机就在控制台点“扩容磁盘”,物理机直接插盘。完成后dmesg | grep -i block能看到容量变化,再用fdisk -l确认新空间已经识别。记住,只扩容不重启的话,千万别动现有分区表,直接走LVM把空闲段吞掉最干净。

第二步:创建物理卷
假设新空间在/dev/sdb,一条命令:
pvcreate /dev/sdb
系统回显“Successfully created”就算完成。如果之前已经把旧盘扩容,比如/dev/sda从100G变200G,那就用fdisk /dev/sda新建一个Linux LVM类型的分区,再pvcreate /dev/sda3,效果一样。
第三步:把物理卷塞进卷组
用vgdisplay找到根分区所在的卷组,默认一般是centos。接着:

vgextend centos /dev/sdb
执行完用vgdisplay | grep Free能看到一堆Free PE,这就是待会儿要分给根分区的“原材料”。
第四步:在线拉伸逻辑卷
根分区对应的逻辑卷名叫/dev/centos/root,直接:
lvextend -l +100%FREE /dev/centos/root
系统瞬间把刚加的Free PE全部吃光,lvdisplay里LV Size一栏立刻变大,但这时候文件系统还没意识到自己被“整容”了。
第五步:让文件系统认下新空间
ext4和xfs两条路:
ext4:resize2fs /dev/centos/root
xfs:xfs_growfs /
执行过程秒级完成,df -h再一看,根分区容量已经在线膨胀,业务进程毫无感知,告警灯瞬间转绿。
踩坑记录:这些报错别慌
1. Device or resource busy:八成是文件系统没挂载对,确认命令路径别写错。
2. Cannot allocate memory:老内核偶尔抽风,先sync; echo 3 > /proc/sys/vm/dropcaches清缓存再试。
3. NOSPACE:卷组Free PE被别的逻辑卷抢光,用vgdisplay确认剩余,再精确指定扩容大小。
验证:写个1G大文件试试
dd if=/dev/zero of=/test.img bs=1M count=1024
写满1G后df -h看剩余空间是否同步减少,确认扩容真实生效,再rm /test.img把垃圾清掉。
脚本化:下次10秒搞定
把上面五步写成脚本,放在跳板机,下次谁再喊根分区满,直接复制粘贴:
#!/bin/bash自动扩容根分区,前提:新盘已识别为/dev/sdb
pvcreate /dev/sdb
vgextend centos /dev/sdb
lvextend -l +100%FREE /dev/centos/root
if [[ $(df -T / | awk 'NR==2{print $2}') == xfs ]]; then
xfs_growfs /
else
resize2fs /dev/centos/root
fi
df -h /
保存成growroot.sh,加执行权限,一键运行,老板都来不及发飙。
根分区在LVM就能热扩,不在就认怂;先扩卷再扩文件系统,顺序别反;快照+双SSH是底线,别偷懒。把这套流程吃透,下次告警再闪,你能淡定喝完咖啡再把空间拍回去。
