服务器跑着跑着突然报警,一看是根目录空间不足,这种场景运维同学应该都不陌生。上周我就遇到一个典型案例:某台线上服务器的根目录使用率突然飙升到95%,导致应用日志无法写入,差点触发生产事故。这种紧急情况下,最稳妥的解决方案就是通过LVM在线扩容。
先教大家几个快速排查的命令组合。当收到磁盘告警时,第一件事就是用df -h查看各分区使用情况:
bash复制[root@server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 50G 47G 3.0G 94% /
devtmpfs 16G 0 16G 0% /dev
tmpfs 16G 0 16G 0% /dev/shm
这里重点关注/dev/mapper/centos-root这一行,这就是我们的根目录。如果Use%超过90%,就需要立即处理。接着用lsblk查看磁盘物理结构:
bash复制[root@server ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
这个输出告诉我们几个关键信息:
sda总容量100GLVM(Logical Volume Manager)是Linux的卷管理神器,它把物理磁盘抽象成三层结构:
扩容的本质就是:
必须注意的风险点:
vgdisplay确认VG有可用空间xfs_growfs扩容,ext4则用resize2fslsblk和df -h双重验证假设我们有一块未使用的磁盘/dev/sdb,先用fdisk分区:
bash复制[root@server ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Command (m for help): n # 新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p # 主分区
Partition number (1-4, default 1): 1 # 分区号
First sector (2048-209715199, default 2048): # 直接回车
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): +20G # 分配20G空间
Command (m for help): t # 修改分区类型
Selected partition 1
Hex code (type L to list all codes): 8e # LVM类型代码
Changed type of partition 'Linux' to 'Linux LVM'
Command (m for help): w # 写入并退出
用partprobe让内核重新读取分区表:
bash复制[root@server ~]# partprobe /dev/sdb
将新分区初始化为物理卷:
bash复制[root@server ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created.
查看当前卷组名称(通常为centos或vg00):
bash复制[root@server ~]# vgdisplay
--- Volume group ---
VG Name centos
System ID
Format lvm2
VG Size 99.00 GiB
PE Size 4.00 MiB
Total PE 25344
Alloc PE / Size 13824 / 54.00 GiB
Free PE / Size 11520 / 45.00 GiB
将新PV加入卷组:
bash复制[root@server ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
查看需要扩容的逻辑卷路径:
bash复制[root@server ~]# lvdisplay
--- Logical volume ---
LV Path /dev/centos/root
LV Name root
VG Name centos
LV Size 50.00 GiB
执行扩容(这里扩展全部可用空间):
bash复制[root@server ~]# lvextend -l +100%FREE /dev/centos/root
Size of logical volume centos/root changed from 50.00 GiB (12800 extents) to 70.00 GiB (17920 extents).
Logical volume centos/root successfully resized.
对于XFS文件系统:
bash复制[root@server ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=512 agcount=4, agsize=3276800 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=13107200, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=6400, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 13107200 to 18350080
最后验证扩容结果:
bash复制[root@server ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 70G 47G 23G 68% /
扩容失败怎么办?
vgextend报错"Volume group has insufficient free space",先用pvdisplay确认新PV是否创建成功xfs_growfs报错时,检查文件系统类型是否为XFS(用df -T查看)空间释放技巧:
journalctl --vacuum-size=200Myum clean allfind / -type f -size +100M -exec ls -lh {} \;预防性措施:
我在实际运维中发现,很多同学扩容后忘记更新监控阈值,导致后续又出现类似告警。建议扩容完成后,同步调整监控系统的告警规则,比如把根目录警戒线从90%下调到80%,给自己留足缓冲时间。