“no space left on device”不一定是磁盘容量耗尽,需逐层排查:先用df -h和df -i确认是否为inode耗尽;再用lvs/vgs/lsblk检查lvm各层(底层设备、pv、vg、lv)是否扩容到位;最后执行resize2fs或xfs_growfs同步文件系统大小,并排查快照、deleted文件等隐藏占用。

遇到“No space left on device”报错,不能直接认定是磁盘满了。LVM环境下,问题可能出在多个层级,必须逐层排查,否则容易误操作或漏掉关键原因。
先确认是不是真空间不足
运行 df -h 查看各挂载点使用率,重点关注报错目录(如 /、/var/log、/data)对应的文件系统。但注意:df 显示“100%”不等于物理空间耗尽——可能是 inode 耗尽,也可能是 LV 已满但 VG 还有空闲,或者文件系统没同步识别 LV 的新大小。
进一步验证:
- 用 df -i 检查 inode 使用率,若 Use% 接近 100%,说明大量小文件占满元数据,需清理或归档
- 用 lvs 和 vgs 对比:LV 大小是否已到上限?VG 的 Free PE 是否为 0?若 vgs 显示 VFree=0,lvextend 就会失败
- 用 lsblk 看底层设备容量是否已实际扩容(比如云盘调大后,/dev/vdb 显示仍是旧大小,说明未通知内核)
检查 LVM 各层是否“断链”
LVM 扩容失败常因某一层未更新,导致上层“看不见”新空间:
- 如果底层磁盘扩容了(如云平台调大了 /dev/vdb),但 fdisk -l /dev/vdb 仍显示旧容量,需执行 echo 1 > /sys/block/vdb/device/rescan 让内核重读设备大小
- 若 PV 所在分区(如 /dev/vdb1)未扩大,即使磁盘变大了,pvdisplay 仍不会显示新增空间,需用 fdisk 或 parted 扩展分区,再运行 pvresize /dev/vdb1
- 若 PV 已扩容但 VG Free 仍为 0,检查是否误删了 PV,或 PV 处于 missing 状态(pvs 中显示 unknown)
排查文件系统是否“没认出”LV 新大小
即使 lvextend 成功执行,文件系统也可能未同步扩容,导致 df -h 不更新:
- 对 ext4 文件系统,执行 resize2fs /dev/mapper/vgname-lvname(可在线)
- 对 xfs 文件系统,执行 xfs_growfs /mount/point(必须指定挂载点,不能写设备名)
- 若 resize2fs 报错 “Bad magic number”,说明 LV 未真正扩展,要回溯检查 lvextend 是否成功;若 xfs_growfs 报错 “invalid filesystem mount point”,说明该路径未挂载或挂载点错误
别忽略快照和隐藏占用
某些情况空间被“看不见”的资源占着:
- 运行 lvs -o +snap_percent 查看快照使用率,若 SNAP% ≥ 100%,快照已满,会导致原 LV 写入失败(COW 机制卡住)
- 用 lsof +L1 找出已删除但仍被进程打开的文件(deleted 状态),它们持续占用空间,需重启对应进程释放
- 检查是否有未卸载的快照或临时 LV 处于 active 状态(lvs | grep -v "owi-a-s" 可辅助识别异常 attr)











