半夜收到告警备份任务失败日志里一行cp: cannot create regular file /backup/2026-09-27.tar: No space left on device登上去df -h一看——才用了 40%还有 30 多个 G。那一瞬间人是懵的。磁盘明明有空间系统凭什么说没空间提前说一句这篇讲的是「df 看起来还有空间」的情况。如果 df 真的显示 100%那另一篇更该看——lsof L1那套查已删除文件的打法。〇、先花两分钟空间有两种个数也是一种空间先把两个概念分清后面全通。块block是真正装数据的地方df -h看的就是它单位是 G、M。inode是每个文件的「档案卡」——记录这个文件归谁、什么权限、什么时候改的、数据块在哪。每创建一个文件哪怕内容是空的就要占用一张档案卡。用图书馆打个比方块 书架上的位置一本书占一格inode 图书馆的登记卡。你每借进一本书都要占一张卡。现在问题来了书架的格子还有一大半空着但登记卡用完了。这时候你拿着一本新书进来管理员只能说「没地方放了」——因为真正用尽的是卡片不是书架。关键点inode 的数量是格式化时定死的不像书架格子那样随便扩。所以那些「文件很小但数量极多」的场景——邮件队列、缓存碎片、会话文件、几百万个小日志——会先用完 inode而不是先占满磁盘。先看一眼正常状态长什么样等你看到异常数字时才有对照。这是我那台 30G 的 Ubuntu 虚拟机$ df -h / 文件系统 大小 已用 可用 已用% 挂载点 /dev/sda2 30G 14G 15G 48% / ​ $ df -i / 文件系统 Inodes 已用I 可用I 已用I% 挂载点 /dev/sda2 1966080 221653 1744427 12% /怎么读块用了 48%、inode 用了 12%——两个数字都健康而且 inode 明显比块宽裕。记住这个「正常的样子」块和 inode 都离 100% 很远。等你哪天看到一个 100%、另一个才 12%答案就自己跳出来了。一、第一步先确定报错的是哪个文件系统这一步极其重要因为/backup可能是独立挂载的一块盘df -h看整体看不出问题。别猜直接问内核$ findmnt -T /backup TARGET SOURCE FSTYPE OPTIONS /backup /dev/sdb1 ext4 rw,relatime怎么读SOURCE告诉你这条路径真正落在哪个设备上FSTYPE是文件系统类型后面判断 inode 行为要用到。如果findmnt -T输出的 TARGET 只是/说明/backup并不是独立挂载点它就在根分区上——那你要查的是根分区。-T的意思是「从这条路径往上找看它属于哪个挂载点」比死记df的顺序可靠得多。二、第二步看 inode八成答案在这里$ df -i /backup Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sdb1 1310720 1310720 0 100% /backup怎么读看IUse%这一列。100%就是这个了。块还剩一大半但卡片发完了。IUse%正常比如 3%那就继续往下查。如果确认是 inode 用尽下一步是找出谁在用——注意这里要找的是文件个数不是体积# 按目录统计文件数量列出最多的前 10 个 sudo find /backup -xdev -type f | cut -d/ -f3 | sort | uniq -c | sort -rn | head怎么读输出第一列是文件个数第二列是目录名。-xdev的作用是「不要跨到别的文件系统去」——少了这个参数你统计的是整台机器不是这块满掉的盘。清完之后 inode 会立刻释放不需要重启。但要注意正在被进程打开的文件删了不释放这是下一篇的主角。三、第三步df 和 du 数字对不上多半是「删了但没释放」如果 inode 没满下一步是比对两个命令的口径$ df -h /backup Filesystem Size Used Avail Use% Mounted on /dev/sdb1 50G 40G 7.3G 85% /backup ​ $ sudo du -xsh /backup 12G /backup怎么读df说用了 40Gdu把/backup翻了个底朝天只找到 12G。差了 28G。这两个命令的口径本来就不一样命令视角df文件系统用了多少块含被进程占着、已删除文件du目录树里现在还能看到的文件占了多少对不上说明有28G 的数据「存在但看不见」——最典型的两种情况文件被删了但还有进程打开着它——空间不会释放详见报错排查 03用lsof L1定位文件被挂载点遮住了——数据写在某目录里之后又在这上面挂了一个新文件系统里面的老数据还占着块但看不见了。第 2 种的验证方式findmnt 路径看有没有挂载或者把可疑挂载卸掉umount再看原来的目录。四、第四步保留块——用量一切正常只有普通用户写不进去这个坑的特征特别好认root 用户可以写普通用户 / 服务账号报 No space left。原因在 ext4 的一个默认设置格式化时会留出 5% 的空间给 root 专用目的是「磁盘满了系统还有余量自救」。于是就会出现tune2fs -l需要 root设备名不用手打直接用findmnt取$ sudo tune2fs -l $(findmnt -no SOURCE /) | grep -iE block count|reserved block count Block count: 7863552 Reserved block count: 393177怎么读第二行 ÷ 第一行 393177 ÷ 7863552 5.0%那 5% 还在。换成实际容量更直观一个块 4K393177 × 4096 ≈ 1.5 GiB——这台 30G 的盘上有 1.5G 是普通用户永远写不进去的。顺手核对一下量级7863552 × 4096 ≈ 30 GiB和df -h报的 30G 对得上。把你机器上的数字代进去第二行除以第一行得到 0.05 就说明那 5% 还在如果算出来明显小于 0.05比如 0.01说明有人已经调过了。这 5% 是不给普通用户用的但df显示Avail时是按普通用户口径算的——所以会出现「Avail 还有 2G非 root 却写失败」的怪事。数据盘上这 5% 常常是浪费10T 的盘白留 500G可以调低sudo tune2fs -m 1 /dev/sdb1 # 保留比例改成 1%立刻生效不用卸载⚠️系统盘/别随手调。那 5% 是留给系统在磁盘满时还能写日志、还能登录的余地动它会把自己逼进更麻烦的境地。五、第五步还剩两种少见情况① 配额用完了。如果文件系统开了 quota用户超过自己的配额也会报 ENOSPC——而磁盘整体还挺空。查$ quota -u 用户名 Disk quotas for user xxx (uid 1001): Filesystem blocks quota limit grace /dev/sdb1 1048576 1048576 1048576怎么读blocks已经顶到limit就是这个了。报错里不会告诉你「是配额」——这是它的坑。顺便说一句Ubuntu 桌面版默认连quota这个命令都没装我敲上去直接是「未找到命令」——因为配额是服务器上的玩法。所以在家用机/开发机上排查到这一步基本可以直接跳过。② 目录本身膨胀了。ext4 的目录像是「可伸不可缩」一个曾经装过几百万文件的目录把文件删光了目录本身占的块不会还回来。极端情况下目录自己占十几 MB往里放新文件还会失败。$ ls -ld /backup/hotdir drwxr-xr-x 2 root root 14680064 Sep 27 03:00 /backup/hotdir怎么读目录的「大小」正常只有 4K 上下这里是14MB说明它的目录项结构曾经撑得极大。处理办法是把目录整体删掉重建先移走文件rm -rf目录本身再mkdir同名。六、顺手记一个差异XFS 不看 inode 余量如果你的盘是 XFSRHEL / Rocky 系默认df -i的结果会让你以为没救了——它显示IUse%是 0% 或者直接不显示因为XFS 的 inode 是动态分配的用多少给多少不存在「格式化时定死」。所以在 XFS 上遇到 ENOSPC别在 inode 上费时间直接从第三步df 与 du 对比往下走。七、一张排查顺序表步查什么命令结论长什么样1哪个文件系统findmnt -T 报错路径拿到设备名和文件系统类型2inode 够不够df -i /挂载点IUse%100% → 就是这个3df 与 du 差多少df -hsudo du -xsh 路径差值大 → 已删未释放 / 挂载遮蔽4保留块tune2fs -l 设备 \| grep -i reserved只有非 root 失败 → 保留块5配额 / 目录膨胀quota -u 用户、ls -ld 目录配额顶格 / 目录几十 MB—日志占了多少对照用du -xsh /var/log我这台 30G 机器上是 335M占 1%正常速查表文末收藏版这条路径属于哪块盘 → findmnt -T /报错路径 看还剩多少块 → df -h /挂载点 看还剩多少 inode → df -i /挂载点 IUse% 是关键列 找谁在吃 inode → sudo find /挂载点 -xdev -type f | cut -d/ -f3 | sort | uniq -c | sort -rn | head 目录到底占多少 → sudo du -xsh /路径 和 df 对比差值就是看不见的空间 看保留块比例 → sudo tune2fs -l $(findmnt -no SOURCE /) | grep -iE block count|reserved 调低保留块数据盘 → sudo tune2fs -m 1 设备 查用户配额 → quota -u 用户名 查目录是否异常膨胀 → ls -ld 目录 正常几 KB异常几十 MB 格式化时多给 inode → mkfs.ext4 -i 16384 设备 每 16K 一个 inode慎用 XFS 没有 inode 上限 → XFS 上直接跳过 df -i 这一步