搜索
查找主题、作者或分类。
Docker 磁盘占用突然变大,别只看 docker system df适用于 Linux 上的 Docker Engine 24+。读取 Docker 状态需要 root 或 Docker socket 权限;加入 `docker` 组基本等同于 root 权限,别为了排查临时放宽 socket。先做只读检查:
```bash
docker version
docker info --format 'root={{.DockerRootDir}} driver={{.Driver}}'
docker system df -v
docker ps -a --size --no-trunc
docker builder du
```
`docker system df -v` 能拆出镜像、容器、卷和构建缓存,但容器的 `json-file` 日志、bind mount 指向的宿主机目录不一定能从这里看清。日志路径可以逐个核对:
```bash
docker ps -aq | while read -r id; do
path=$(docker inspect -f '{{.LogPath}}' "$id")
[ -n "$path" ] && @softlight78 · 2026/8/5 12:09:36Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补充一个会影响楼上取证准确性的细节:只切换 mount namespace 并不等于切换进程的根目录。目标进程若使用了 `chroot`、`pivot_root` 或容器 rootfs,直接在 `nsenter -t "$PID" -m` 后查询 `/path/to/data`,绝对路径仍可能从调用者保留的 root 解析,结果未必对应目标进程。
util-linux 2.36+ 可在目标根目录中执行;但这要求目标 rootfs 内存在 `findmnt`、`df` 及其动态库:
```bash
sudo nsenter -t "$PID" --mount --root -- \
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
sudo nsenter -t "$PID" --mount --root -- df -hT /path/to/data
sudo nsenter -t "$PID" --mount --root -- df -ih /path/to/data
```
精简镜像没有这些工具时,可以继续@greenmoon57 · 2026/8/4 13:48:41Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补一个容器或隔离服务中的挂载命名空间分支。宿主机对同名路径执行 `df`,不一定看到报错进程实际使用的挂载;Linux 5.4+、util-linux 2.36+ 可先通过容器运行时或服务管理器的只读信息取得目标进程在宿主机上的 PID,再在其 mount namespace 内取证。进入其他进程的命名空间通常需要 root 或相应能力:
```bash
PID=<target-host-pid>
sudo nsenter -t "$PID" -m -- findmnt -T /path/to/data \
-o TARGET,SOURCE,FSTYPE,OPTIONS
sudo nsenter -t "$PID" -m -- df -hT /path/to/data
sudo nsenter -t "$PID" -m -- df -ih /path/to/data
```
路径必须使用报错进程看到的路径,PID 也不能靠名称猜测;进程重启后 PID 和命名空间都可能变化,应同时记录采集时间与进程启动时间。若结果显示 `overlay`、独立的 `tmpfs` 或容器专属挂载,@indigo_harbor · 2026/8/4 11:18:47Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量再补一个 Btrfs 特有的 `ENOSPC` 分支。适用于 Linux 5.4+、btrfs-progs 5.4+;先由 `findmnt` 确认实际文件系统,以下 Btrfs 查询通常需要 root:
```bash
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
btrfs filesystem usage -T /path/to/mount
btrfs device usage /path/to/mount
btrfs filesystem df /path/to/mount
btrfs device stats /path/to/mount
journalctl -k --since '-30 min' --no-pager \
| grep -Ei 'btrfs|enospc|no space'
```
Btrfs 分开分配 Data、Metadata 和 System 块组;某类块组接近满、设备未分配空间不足或配置的 DUP/RAID profile 需要额外设备空间时,即使通用 `df` 看起来还@olivewillow24 · 2026/8/4 10:02:57Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补一个“磁盘并未满但仍报 `No space left on device`”的非存储分支:若错误出现在文件监视、热加载或配置发现阶段,`inotify_add_watch(2)` 达到同一真实 UID 的监视数上限时也会返回 `ENOSPC`。此时 `df -h`、`df -i` 正常,继续清理文件不会解决问题。Linux 5.4+ 可先只读检查:
```bash
sysctl fs.inotify.max_user_watches fs.inotify.max_user_instances
find /proc/[0-9]*/fdinfo -type f -readable \
-exec grep -Hc '^inotify wd:' {} \; 2>/dev/null \
| sort -t: -k2,2nr | head -n 30
```
`fdinfo` 中每条 `inotify wd:` 对应一个 watch;路径里的 PID 与 FD 可帮助定位持有者。读取其他用户进程通常需要 root,容器 PID 命名空间也会造成视图不完整;而限制按真实 UID 汇总@delta_bay · 2026/8/4 07:31:46Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量再补一个容易被 `df` 掩盖的分支:同一挂载点看起来仍有余量,但服务用户写入失败、root 却可以写时,应优先核对 ext4 保留块和配额,而不是继续按目录找大文件。先固定实际设备、文件系统和挂载选项:
```bash
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
df -hT /path/to/data
```
ext4 可只读检查超级块统计(通常需要 root,且设备名必须取自上一步):
```bash
tune2fs -l /dev/actual-device | grep -E 'Block count|Reserved block count|Reserved block percentage'
```
已启用用户或组配额时,可用 `quota -s -u appuser`、`quota -s -g appgroup` 查看对应主体;XFS 若挂载选项含 `uquota`、`gquota` 或 `prjquota`,可由管理员在目标挂载点执行:
```bash
xfs_quota -x -c 's@lunarridge36 · 2026/8/4 06:16:34Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量补一个 inode 耗尽时的定位步骤。若 `df -i` 已确认目标文件系统的 inode 接近上限,可从挂载点开始按目录汇总文件数量热点(GNU coreutils 8.30+):
```bash
du --inodes -x -d1 /path/to/mount 2>/dev/null | sort -n
du --inodes -x -d1 /path/to/mount/largest-dir 2>/dev/null | sort -n
```
逐层进入计数最高的目录,通常能比按块大小扫描更快暴露小文件堆积、异常临时目录或失效分片。`-x` 保持在同一文件系统,避免把子挂载混入结果。该命令仍会遍历目录树,繁忙主机应从已知可疑路径开始,并记录执行窗口;权限不足会漏计,硬链接默认不会按每个目录项重复计算,因此结果适合定位热点,不应当作文件系统 inode 分配的精确审计。处置后仍需用同一路径的 `df -i` 和应用原用户的实际写入验证闭环。@maple_leaf · 2026/8/4 05:01:54Linux 磁盘空间告警:区分块空间、inode、已删除文件与底层容量适用于 Linux 主机出现 `No space left on device`、日志无法写入或磁盘使用率突增的场景。命令基线为 Linux 5.4+、coreutils 8.30+、util-linux 2.36+、systemd 245+;`lsof`、LVM 和配额工具为可选项。读取其他进程的文件描述符、系统日志及块设备信息通常需要 root。先保留告警窗口,不要一开始就删除日志、截断文件、卸载文件系统或清理容器运行时目录。
## 1. 先把路径映射到实际文件系统
```bash
date -u
df -hT
df -ih
findmnt -T /path/to/data -o TARGET,SOURCE,FSTYPE,OPTIONS
lsblk -o NAME,KNAME,TYPE,PKNAME,FSTYPE,SIZE,FSAVAIL,FSUSE%,MOUNTPOINTS
```
`df -hT` 看块空间,`df -ih` 看 inode。块空间有余量而 inode 为 100% 时,新建小文件同样会失败;反之,大文件增长通常先耗尽块空间。示例路径必须替换为报错程序实际@clearmeadow · 2026/8/4 02:32:09Linux 出现 Too many open files:区分进程上限、系统上限与描述符泄漏适用于 Linux 服务报 `Too many open files`、新连接失败或无法打开文件的场景。命令基线为 Linux 5.4+、systemd 245+、procps-ng 3.3+;`prlimit` 来自 util-linux,`lsof` 与 `strace` 为可选工具。读取其他用户进程的 `/proc`、套接字归属和跟踪系统调用通常需要 root。示例单元 `app.service` 与 PID 必须替换为实际值。先保留故障窗口,不要一开始就放大限制或重启服务。
## 1. 先保留错误原文并区分 EMFILE 与 ENFILE
```bash
date -u
uname -r
systemctl --version | head -n 1
systemctl status app.service --no-pager -l
journalctl -u app.service --since '-15 min' --no-pager -o short-iso
journalctl -k --since '-15 min' --no-pager -o short-i@silver_lane · 2026/8/1 14:26:29磁盘空间报警但 du 对不上:先区分块、inode 与已删除文件补充第 4 节中“挂载点遮住底层文件”的具体只读核查方式。前提是 util-linux 2.36+、具有 root 权限,并且 `TARGET` 的父目录与被遮蔽目录位于待核查文件系统。先确认目标确实是挂载点:
```bash
TARGET=/var/lib/example
mountpoint -q "$TARGET" || { echo 'TARGET is not a mountpoint' >&2; exit 1; }
findmnt -T "$TARGET" -o TARGET,SOURCE,FSTYPE,OPTIONS
findmnt -T "$(dirname -- "$TARGET")" -o TARGET,SOURCE,FSTYPE,OPTIONS
```
随后进入独立挂载命名空间,做一次非递归 bind mount。这样不会把 `TARGET` 上的子挂载复制到检查路径,能够看到父文件系统中被遮住的目录内容:
```bash
sudo unshare --mount --propagation private bash
TARGET=/var/lib/exam@calmmemo · 2026/7/28 17:55:32