一、磁盘不够用时的扩容思路
服务器磁盘满了是高频故障。判断方式:站点无法写入、MySQL 只读报错、日志中断。扩容不是玄学,Linux 的 LVM(Logical Volume Manager)把物理磁盘抽象成可动态伸缩的逻辑卷,支持"在线扩容、无需重启"。但前提是分区当初就是用 LVM 建的。下面分"已有 LVM 怎么扩"和"怎么新增一块盘扩展卷组、卷"两部分讲,最后给非 LVM 的补救方案。先看现状:
df -h # 磁盘与挂载点占用 lsblk # 块设备与分区关系清晰视图 lvdisplay; vgdisplay; pvdisplay # 查看逻辑卷/卷组/物理卷
关键概念:PV(物理卷)→ VG(卷组)→ LV(逻辑卷)。扩容二选一:LV 有剩余空间就直接扩 LV;空间不够就往 VG 里加新 PV 再扩 LV。
二、LVM 三步扩容
前提:系统盘或某分区使用 LVM。以想把 /home 从 20G 扩到 50G 为例,若 VG 还有空闲则三步到位:
# 1. 扩大逻辑卷(+30G 或直接到 50G) sudo lvextend -L +30G /dev/vgdata/lvhome # 或 sudo lvextend -L 50G /dev/vgdata/lvhome # 2. 让文件系统感知新空间(分区表与文件系统都要认) # ext4/xfs 使用此命令 sudo resize2fs /dev/vgdata/lvhome # ext4 # xfs 需用(在挂载状态下也行) sudo xfs_growfs /mount/point # XFS 用 xfs_growfs,路径是挂载点 # 3. 验证 df -h | grep home
注意:`resize2fs` 针对 ext2/3/4,XFS 则是另一个工具 `xfs_growfs`,用错命令会报错。扩容逻辑卷不影响在线服务,XFS 甚至可以在挂载状态下在线扩展,这是 LVM 的核心优势。
三、VG 空间不足:加 PV 后才可扩
若 `vgdisplay` 显示 Free PE 很小,"先加一块新磁盘/分区到卷组",再把空间给 LV:
# 假设新设备是 /dev/sdb sudo pvcreate /dev/sdb # 初始化为物理卷(可丢数据,确保盘是空盘) sudo vgextend vgdata /dev/sdb # 加入卷组 sudo lvextend -L +50G /dev/vgdata/lvhome # 从新增空间扩容逻辑卷 sudo resize2fs /dev/vgdata/lvhome # 文件系统感知新空间(或 xfs_growfs)
如果整块盘尚未建分区,可先 fdisk 建一个整盘分区 /dev/sdb1 再 pvcreate /dev/sdb1。加进 VG 后还需在挂载场景把它对应的 LV 挂载到目标目录,或直接扩已有 LV。
四、扩容前务必先备份(安全第一)
虽然 LVM 扩容风险低,但任何磁盘操作都有出错可能。操作前确认:
# 确认文件系统完整性(对目标卷) sudo e2fsck -f /dev/vgdata/lvhome # ext 系检查,XFS 用 xfs_check/xfs_repair -n # 重要数据用之前 rsync 备份(务必) rsync -avz /重要目录 /backup/
扩容顺序严格是"扩 LV → 扩文件系统",颠倒会让文件系统元数据不识别超出边界,极其危险。对不熟悉的环境,先在测试机演练一次,别在唯一的生产数据盘上贸然操作。
五、非 LVM 场景的补救方案
如果系统当初用非 LVM 建的分区(ext4 直接分区),无法在线扩,可行方案:
# 方案1:若还有相邻空闲空间,可用 parted 调整分区边界后 resize2fs # (有风险,需离线操作,务必先备份) # 方案2:替换大容量盘再迁移(镜像克隆后用新盘接管启动) # 方案3:把大目录挂到独立大分区/云盘(更适合云主机) # 例:把 /var/lib/mysql 迁到挂载在 /data 的大数据盘 sudo rsync -avz /var/lib/mysql/ /data/mysql/ # 改配置文件 datadir 指向新路径,再重启 mysql # 方案4:清理无用数据腾空间(最安全快捷) du -sh /var/log/* | sort -rh | head # 看看日志占了多大
对无 LVM 又无法改分区的场景,"迁移大目录到独立盘"往往比冒险调分区更实用,配合前面 logrotate 日志轮转还能长期控制日志占用。
六、日常监控与防止再次写满
扩容不代表一劳永逸,要习惯盯磁盘用量:
# 快速看哪些目录最占空间 sudo du -xhd1 / | sort -rh | head -20 # 挂在 crontab 里每天检查,超过阈值发告警(可用 uptime-kuma 或自定义脚本) # 前面文章讲的 logrotate 记得给应用日志配置保留份数上限
配合监控工具如 uptime-kuma/磁盘告警脚本,在磁盘写满前就能收到提醒,而不是等故障发生再应急扩容。
写在最后
磁盘扩容掌握三条主线:一是判断是否 LVM(lsblk/pvs 看类型),LVM 才能在线扩;二是空间来源——VG 有剩余直接扩 LV,没有就先 pvcreate+pvextend 加进 VG 再扩;三是"扩 LV 在前、扩文件系统在后",ext4 用 resize2fs、XFS 用 xfs_growfs。操作前务必备份。若非 LVM,优先用"迁移大目录 + 清理 + 日志轮转"的温和方案。把这三件事理顺,磁盘告警就不再是让你抓瞎的难题。



