Linux 查磁盘空间:df、lsblk、du 各看什么
查 Linux 磁盘时,容易遇到这样的疑问:明明有一块 200G 的盘,为什么业务目录可用空间只有几十 G?df 和 du 的数字为什么又对不上?
先弄清楚每个命令在看什么,再判断要不要清理或者扩容。
下面的路径和输出都是示意,不对应真实机器。执行时,请把 /srv/app 换成已经确认存在的业务目录。这篇只介绍查询,不涉及删除文件、修改挂载或初始化磁盘。
先看业务目录还能用多少空间
关心某个目录能使用多少空间,可以直接把路径交给 df:
df -h /srv/app
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 20G 28G 42% /
这个结果表示,/srv/app 所在的文件系统总量约 50G,可用约 28G。最后一列是 /,说明它当前使用根文件系统的空间。
df 查的是整个文件系统的容量。即使 /srv/app 这个目录里只有几个小文件,显示的也仍然是所在文件系统的用量。
如果文件还没创建,就查它准备写入的、已经存在的父目录。比起只看一遍所有挂载点,这样更容易找准业务实际用的盘。
再看机器上到底接了哪些盘
查看块设备和挂载情况,可以用:
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
NAME SIZE FSTYPE MOUNTPOINT
sda 50G
└─sda1 50G ext4 /
sdb 200G
示例里确实有一块 200G 的 sdb,但没有显示挂载点。它接在机器上,不代表这 200G 已经成为业务目录可用的空间。
这里有个很容易误判的地方:FSTYPE 和挂载点为空,不能直接证明盘里没有数据。它还可能涉及权限、识别情况或其他存储层,不能看到空白就按新盘处理。
一些旧系统不支持复数的 MOUNTPOINTS,会报 unknown column。这时可以先换成上面单数的 MOUNTPOINT,不必为了看磁盘去升级系统。两列也有区别:同一文件系统有多个挂载点时,单数列只显示其中一个,复数列可列出多个。
目录叫 data,也要核对它实际落在哪
目录名称不能说明存储位置。叫 /data 的目录,也可能一直在使用系统盘。
不确定时,可以查具体路径:
findmnt -T /srv/app
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1 ext4 rw,relatime
结果说明,示例中的 /srv/app 落在 /dev/sda1,对应的挂载点是 /。后面看容量,就应该围绕这个文件系统判断。
findmnt -T 查的是包含指定路径的文件系统,路径本身不需要是挂载点。如果原本打算让业务使用另一块盘,却查到了系统盘,先核对挂载设计和业务配置,别急着清文件。
确认位置后,再找哪个目录占空间
du 适合查看目录和文件占用。假设已经确认 /srv/app 就是要排查的业务目录:
du -x -h --max-depth=1 /srv/app
4.1G /srv/app/cache
8.8G /srv/app/logs
2.3G /srv/app/uploads
16G /srv/app
先看哪一项占得多,再缩小到相应子目录继续查。看到日志目录大,也要先了解日志用途和保留要求,不能光凭大小决定处理方式。
这条命令里,-x 表示不跨到其他文件系统,--max-depth=1 控制显示到一层子目录。只显示一层,不代表只扫描一层:为了计算总量,du 仍要遍历里面的文件,文件多时会产生明显 I/O。
所以查业务目录就从业务目录开始,不要一上来扫描整盘。遇到 Permission denied 时,统计也可能不完整。
df 和 du 的数字不必完全一致:前者看文件系统的空间分配,后者统计能遍历到的文件。文件系统元数据、被进程占用的已删除文件、统计权限等,都可能造成差异。
容量不紧张,还可以补看 inode
如果是新文件创建失败,而容量检查没发现问题,可以再看:
df -i /srv/app
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 3276800 393216 2883584 12% /
重点看 IFree 和 IUse%。对示例中的 ext4 这类文件系统,大量小文件可能先耗尽可用 inode;只看剩余容量,容易漏掉这一点。这里的示意结果还有余量,没有表示正在发生故障。
排查顺序可以很简单:先确定业务路径,用 df 看容量,用 lsblk 和 findmnt 对上设备与挂载关系,需要定位占用时再运行范围明确的 du。涉及新文件创建失败,补看 inode。
这些检查都正常时,就回到程序的原始报错继续查。写入失败还可能涉及权限、只读挂载、配额等原因,不能因为看到了“磁盘”两个字就直接扩容。
参考资料
- GNU Coreutils:df
- GNU Coreutils:du
- util-linux:lsblk 手册
- util-linux:findmnt 手册
- 点赞
- 收藏
- 关注作者
评论(0)