跳转到内容

系统盘满了 ​

适用范围 ​

系统盘指 OMV 所在的根文件系统 /。它写满之后,常见的表现有:

  • 密码正确却登录失败(官方排障页给出的经验),或者界面报 502、Failed to connect to socket。
  • 保存设置、安装更新失败,apt 报 No space left on device。
  • 容器起不来,或者应用写不进日志。
  • 收到 monit 的邮件,提示根文件系统(rootfs)使用率过高。

不适用:数据盘写满了,那是清理数据或扩容的问题,和系统盘无关。

开始排查前 ​

清理就是删除,先分清哪些能删、哪些不能删

影响范围:本页的清理步骤会删除日志、缓存和镜像。系统盘上其他位置的文件,例如 Docker 卷、应用数据库、你自己放的文件,删了就无法恢复。

前置条件:每一步都先用只读命令确认占用者和内容,再动手。Docker 的 volumes 目录里往往是应用的真实数据,不要执行会清理卷的命令(docker volume prune、docker system prune --volumes),也不要手工 rm -rf /var/lib/docker。

回退办法:删掉的日志和缓存会重新生成;其他删除只能靠备份恢复,系统盘的备份方法见备份系统盘:backup 插件。

排查步骤 ​

1. 确认是系统盘,看看有多满 ​

sh
# 在 OMV 的 shell 里执行(只读)
df -h /
df -i /

df -h / 看容量使用率。df -i / 看 inode,使用率 100% 而容量没满,说明小文件太多。

OMV 的 monit 在根文件系统使用率超过 85%(环境变量 OMV_MONIT_SERVICE_FILESYSTEM_ROOT_USAGEWARNTHRESHOLD)并持续一段时间后发出告警,前提是邮件通知可用,且「监测 - 文件系统」通知项开着。

2. 找出谁占了空间 ​

sh
# 在 OMV 的 shell 里执行(只读)
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -n 12

-x 表示不跨文件系统,挂载在 /srv 下的数据盘不会被算进来。顺着最大的目录一层层往下查,例如 du -xh --max-depth=1 /var | sort -h | tail -n 12。

官方排障页里把这条命令写成了 df -hx --max-depth=1 /,但 --max-depth 是 du 的选项,应当用上面的 du。

常见的大户:

位置是什么怎么处理
/var/lib/dockerDocker 的镜像、容器层和卷,Compose 插件默认把 Docker 存储放在这里先用 docker system df 看明细;长期做法是把 Docker 存储迁到数据盘,见Compose 插件设置详解
/var/lib/containersPodman 的存储同上
/var/log、/var/log/journal日志。OMV 8.1.1 起把 journald 的上限设为 1 GiB(环境变量 OMV_SYSTEMD_JOURNALD_SYSTEMMAXUSE),约合三个月的日志journalctl --disk-usage;日志短时间暴涨,就去找刷屏的服务
/var/cache/apt、/var/lib/apt/listsapt 的下载缓存和索引apt-get clean
/srv/dev-disk-by-uuid-…,而数据盘当前并没有挂载数据盘没挂上时,写进挂载点目录的数据其实落在系统盘上见第 4 节
/root、/home、/tmp手工下载或复制的大文件确认之后手工清理
备份类插件、Timeshift 等备份目标误设在系统盘上改到数据盘或外部盘

3. 清理最安全的部分 ​

  1. apt 缓存,随时可以重新下载:
sh
# 在 OMV 的 shell 里执行
apt-get clean
  1. 旧日志,保留最近 200 MiB:
sh
# 在 OMV 的 shell 里执行;删除的是已归档的旧日志,不影响当前日志
journalctl --vacuum-size=200M
  1. Docker:先只读地看明细。
sh
# 在 OMV 的 shell 里执行(只读)
docker system df

回收空间的做法是:在 服务 → Compose → 镜像(Services → Compose → Images)里删除没有被任何容器使用的镜像,具体按钮以你界面上的显示为准。卷不要动。

  1. 你自己放在 /root、/tmp 等位置的大文件,确认不需要之后删除。

4. df 与 du 对不上 ​

df 说满了,du 加起来却小得多,常见两种原因:

  1. 已删除但仍被进程占用的文件,例如某个服务的日志被删了,进程还开着它。
sh
# 在 OMV 的 shell 里执行(只读)
lsof +L1

找到占用的进程之后,重启那个服务或容器,空间才会释放。

  1. 数据盘没挂载时,数据被写进了挂载点目录,后来盘挂上,这些数据被「盖住」了,du 看不到,df 却一直在计数。先确认现在是否已挂载,再用绑定挂载看看被盖住的内容:
sh
# 在 OMV 的 shell 里执行
findmnt /srv/dev-disk-by-uuid-<UUID>
mkdir -p /mnt/rootview
mount --bind / /mnt/rootview
du -xh --max-depth=2 /mnt/rootview/srv 2>/dev/null | sort -h | tail
umount /mnt/rootview

看到被盖住的数据之后,不要直接删:先弄清是容器还是备份任务在盘没挂上的时候写进去的,把需要的数据移到真正的数据盘,再清理。盘为什么没挂上,见磁盘或文件系统不见了。

5. 空间释放之后 ​

6. 防止再次写满 ​

  • 数据和容器数据放数据盘。 在 Compose 设置里指定放在数据盘上的共享文件夹,并规划好 Docker 存储的位置。
  • 监控根文件系统。 在 系统 → 通知 → 事件(System → Notification → Events)里确认「监测 - 文件系统」是开着的,并配置好邮件,见配置邮件通知。
  • 系统盘要留够容量。 官方文档对在 Debian 上手动安装的建议是:根分区至少 4 GiB,最佳 120 GiB。
  • 谨慎使用 sharerootfs 插件。 它允许把共享文件夹建在系统盘上,容易把系统盘写满,见在系统盘上建共享文件夹:sharerootfs。
  • 系统盘是 U 盘或 SD 卡的,再装上 writecache,见减少系统盘写入:writecache 插件。

确认恢复 ​

  1. df -h / 显示使用率回到官方告警线(85%)之下,并留有余量。
  2. 重新登录 Web 界面,保存一个设置,确认能成功写入。
  3. systemctl --failed 没有失败的单元,容器都起来了。
  4. 重启一次,几天后再用 du 复查,确认没有重新增长。

仍未解决 ​

附上:df -h、df -i 的输出,du -xh --max-depth=1 / 的前 12 行,docker system df 和 journalctl --disk-usage 的输出。读如何有效求助。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。