凌晨3点17分,监控告警:根分区使用率98%。
SSH连上服务器,df一敲,/dev/mapper/centos-root只剩1.2G。业务还在跑,日志还在写,你必须在不中断服务的前提下把容量扩上去。
Linux的磁盘管理其实很简单。静下心学习一下,以后十分钟搞定继续睡;不会的人,通宵到天亮还可能丢数据。
这篇文章以一台真实CentOS 7.9服务器为例,把磁盘巡检、故障排查和LVM扩容的实战操作讲透。所有命令输出均为真实环境截取。
一、磁盘监控与故障排查
日常巡检,三条命令看清全局。
df -h —— 看空间使用率。超过80%关注,超过90%必须处理。
在服务器上执行,输出如下:
[root@ct100 ~]# df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 11M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/mapper/centos-root 36G 3.0G 33G 9% / /dev/vda1 1014M 216M 799M 22% /boot /dev/mapper/centos-home 18G 33M 18G 1% /home tmpfs 376M 0 376M 0% /run/user/0
重点关注Use%列。这台服务器根分区9%,很健康。如果看到90%+,就该出手了。注意/dev/mapper/centos-root——看到mapper就说明用了LVM,后面扩容会用到这个信息。
iostat -x 1 —— 看磁盘I/O性能。%util持续接近100%,磁盘已是瓶颈。
[root@ct100 ~]# iostat -x 1 2 Linux 3.10.0-1160.el7.x86_64 (ct100) 07/03/2026 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.73 0.00 1.11 0.01 0.03 98.12 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.23 2.00 1.29 84.78 14.11 60.03 0.00 0.72 0.48 1.09 0.46 0.15 vdb 0.00 0.00 0.03 0.00 0.91 0.00 72.34 0.00 0.17 0.17 0.00 0.34 0.00 dm-0 0.00 0.00 1.89 1.41 78.30 14.63 56.18 0.00 1.10 0.49 1.93 0.17 0.06 dm-1 0.00 0.00 0.02 0.00 0.39 0.00 50.09 0.00 0.25 0.25 0.00 0.17 0.00 dm-2 0.00 0.00 0.03 0.00 0.46 0.37 53.61 0.00 0.24 0.19 0.57 0.15 0.00
看最后一列%util。vda只有0.15%,非常空闲。如果这个值持续90%以上,说明磁盘I/O已经打满,要么优化应用,要么换更快的盘(SSD)。await列看延迟,超过10ms就要关注。
注意:iostat需要安装sysstat包(yum install -y sysstat)。很多最小化安装的系统默认没有,巡检时先确认。
smartctl -a /dev/sda —— SMART信息提前发现磁盘硬件上的坏道和温度异常(这也是服务器卡慢的主要常见原因之一)。
但要注意:虚拟化环境下smartctl可能无法读取。比如这台服务器是KVM虚拟机,磁盘是virtio设备:
[root@ct100 ~]# smartctl -a /dev/vda smartctl 7.0 2018-12-30 r4883 [x86_64-linux-3.10.0-1160.el7.x86_64] Copyright (C) 2002-18, Bruce Allen, Christian Franke /dev/vda: Unable to detect device type Please specify device type with the -d option.
虚拟磁盘看不到SMART信息,这是正常的。SMART主要用于物理机巡检。如果你的服务器是物理机,重点看这几个指标:Reallocated_Sector_Ct(重映射扇区,非0说明有坏道)、Current_Pending_Sector(待处理扇区)、Temperature_Celsius(温度)。任何一个异常都要提前换盘。
再看磁盘整体结构:lsblk。
lsblk是磁盘巡检的补充命令,一眼看清分区和LVM结构:
[root@ct100 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 1024M 0 rom vda 252:0 0 80G 0 disk ├─vda1 252:1 0 1G 0 part /boot ├─vda2 252:2 0 59G 0 part │ ├─centos-root 253:0 0 55.6G 0 lvm / │ ├─centos-swap 253:1 0 6G 0 lvm [SWAP] │ └─centos-home 253:2 0 17.4G 0 lvm /home └─vda3 252:3 0 20G 0 part └─centos-root 253:0 0 55.6G 0 lvm / vdb 252:16 0 2G 0 disk └─vdb1 252:17 0 2G 0 part
这棵树很清晰:vda是系统盘80G,分了3个分区,vda2和vda3都加入了centos卷组(VG),切成了root、swap、home三个逻辑卷(LV)。vdb是一块2G的数据盘。看到TYPE列有lvm的,就是LVM管理的分区。
磁盘满了怎么排查。
第一反应是搞清楚谁占了空间(通过du查看),再判断是否有文件可以删除以释放空间,还是增加磁盘进行扩容:
[root@ct100 ~]# du -sh /* 2>/dev/null | sort -rh | head -10 2.2G /usr 710M /var 183M /boot 47M /opt 33M /etc 11M /run 360K /root 16K /home 4.0K /tmp 0 /sys
从大到小排,/usr占2.2G排第一,进/usr继续du,层层深入,很快定位。常见磁盘杀手:
以笔者的经验,90%的情况都是日志分区(/var/log)没限制大小,文件日积月累后占用空间过大。
已删除但未释放的文件 —— 最隐蔽的杀手。文件删了但进程没退出,空间不释放。用lsof | grep deleted找到进程kill掉,空间立刻释放。这台服务器上就有实际的例子:
[root@ct100 ~]# lsof | grep deleted firewalld 722 root 8u REG 253,0 4096 67152471 /tmp/#67152471 (deleted) gmain 722 899 root 8u REG 253,0 4096 67152471 /tmp/#67152471 (deleted) tuned 1104 root 8u REG 253,0 4096 67756630 /tmp/#67756630 (deleted) gmain 1104 1563 root 8u REG 253,0 4096 67756630 /tmp/#67756630 (deleted)
firewalld和tuned进程持有已删除的/tmp临时文件。这些文件虽然删了,但空间没释放。虽然这里每个只有4KB不影响,但如果是日志文件被删而进程没退出,可能是几个G的空间不释放。找到对应进程,kill掉或重启服务即可。
现在的服务器大多是跑在虚拟化平台上的,而且默认是采用LVM管理方式,可以在虚拟化平台增加磁盘,将磁盘扩容到磁盘组,实现0停机安全扩容。
二、LVM在线扩容速查:六条命令解决凌晨三点的告警
上面那台服务器,centos卷组已经用完了所有空间(VFree=0)。如果根分区满了,需要加盘扩容。以下是从"加盘"到"扩容完成"的完整流程,全程不停服务。
先看当前LVM状态:
[root@ct100 ~]# vgs VG #PV #LV #SN Attr VSize VFree centos 2 3 0 wz--n- 78.99g 0 [root@ct100 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert home centos -wi-ao---- <17.39g root centos -wi-ao---- <55.61g swap centos -wi-ao---- 6.00g
centos卷组78.99G,VFree=0,一点空间都没了。root逻辑卷55.61G。现在假设云平台已给这台服务器加了一块50G新盘,开始扩容:
# 第1步:扫描识别新盘 [root@ct100 ~]# echo "- - -" > /sys/class/scsi_host/host0/scan [root@ct100 ~]# lsblk # 确认新盘出现,假设是 /dev/vdc # 第2步:把新盘做成物理卷(PV) [root@ct100 ~]# pvcreate /dev/vdc # 第3步:把新PV加入现有的centos卷组 [root@ct100 ~]# vgextend centos /dev/vdc # 第4步:把新增空间全部给根逻辑卷 [root@ct100 ~]# lvextend -l +100%FREE /dev/centos/root # 第5步:扩展文件系统(xfs用xfs_growfs,ext4用resize2fs) [root@ct100 ~]# xfs_growfs / # 第6步:验证 [root@ct100 ~]# df -h /
六条命令,从满到有余。不停服务、不重启、不卸载,用户毫无感知。这就是LVM的价值——把磁盘扩容从高风险运维操作变成一条命令的安全操作。
注意:ext4文件系统第5步用resize2fs而不是xfs_growfs,搞错了会报错。怎么判断文件系统类型?看df -T或lsblk -f。
三、三条血泪教训
教训一:fstab写错,系统起不来。
设备名写错,重启后系统卡住。解决:进单用户模式修复(启动时按e,linux16行末加rd.break)。预防:每次改完fstab跑mount -a验证。十秒钟的验证,能省你两小时的rescue mode。
教训二:fsck跑在挂载分区上。
对挂载中的分区执行fsck,文件系统损坏加剧,数据丢失。铁律:fsck只对未挂载分区执行,根分区需进救援模式。执行前先备份。
教训三:没有监控,裸奔到死。
服务器跑几年没人管,某天生产线突然反馈系统卡到无法用。一个crontab定时df检查、超阈值发邮件,五分钟搞定,但就是没做。
写在最后
Linux磁盘管理核心就三件事:分区、格式化、LVM。
巡检记住三条命令:df看空间、iostat看性能、smartctl看健康。排查记住du层层深入、lsof找隐藏文件。扩容记住六步LVM流程。
剩下的靠经验:fstab改完跑mount -a,fsck只在卸载状态执行,磁盘监控必须配置。这些是用代价换来的习惯。
磁盘是服务器的心脏。管理好磁盘,就是管理好服务器的生命线。
凌晨三点的告警终会来。但如果你做好了准备,它只是一个通知,而不是一场灾难。
Tips:账号名中「天真」二字源于耳根笔下的《仙逆》,书中角色天真,让我一直记到如今。运维之路多是枯燥繁琐,“天真”是给自己一份念想:纵然世间繁杂、故障不断,仍愿保留一份简单纯粹,认真对待每一台网络设备、服务器以及每一行运维代码。