Linux中磁盘空间的占用情况分析与垃圾清理方案

这里以一台基于Docker部署微服务和中间件的虚拟机为例, 首先使用df -h查看文件系统整体的磁盘空间占用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 5.8G 0 5.8G 0% /dev
tmpfs 5.8G 0 5.8G 0% /dev/shm
tmpfs 5.8G 602M 5.2G 11% /run
tmpfs 5.8G 0 5.8G 0% /sys/fs/cgroup
/dev/mapper/cl-root 345G 335G 9.6G 98% /
/dev/sda2 1014M 254M 761M 26% /boot
/dev/sda1 599M 7.3M 592M 2% /boot/efi
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/6f110ba5ff2cdec846816ab0dba7f3a9e85cb2af7e01eb1cb0158744059b2593/merged
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/302d996a90a044c816326d4efcdec1d4a879bc846a36bad14fc7bcdd5f70f92f/merged
tmpfs 1.2G 0 1.2G 0% /run/user/0
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/8c2d6256fc4df0dfcf72e119cdfb1c6cc306e859c0e2d0a1b88c5042c46beb6e/merged
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/a1f389166549f932641e106d40da31b7d9863c8172c764f34a34ac8650ce0d97/merged
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/744eb5fb76ad07d8beb635ab610550dc77d557f141bd8d765cb9c882cb16e34e/merged
overlay 345G 335G 9.6G 98% /var/lib/docker/overlay2/a1509283502587cc9a9b16cde32efce0a240a6c98a34f52f418bfaab8dbe4b21/merged

磁盘空间几乎被占满, 尤其是根分区/和Docker的overlay文件系统

清理Docker的占用空间

查看 Docker 镜像和容器的磁盘使用情况

docker system df -v

清理未使用的 Docker 镜像、容器、网络和数据卷

docker system prune -a

参考文档

查找大文件和目录

使用du命令查找占用大量空间的文件和目录

  1. 查看根目录下各个子目录的大小, sort -hr 倒序排列

    du -h --max-depth=1 / | sort -hr

  2. 进一步深入查看占用空间较大的目录

    1
    2
    3
    du -h --max-depth=1 /var
    du -h --max-depth=1 /var/lib
    du -h --max-depth=1 /var/lib/docker

优雅删除

查找并删除旧的日志文件

批量/var/log删除日志文件名为*.log文件

find /var/log -type f -name "*.log" -delete

批量删除当前路径日志文件名不包含当日的时间戳的文件, 在删除之前务必要检查你的工作路径

find . -type f ! -name "*.2024-07-21.log" -exec rm {} \;

不确定会删除哪些文件的话, 可以先移除掉-exec rm {} \;看看哪些文件会筛选出来

有保留的删除文件

使用ls命令列出所有的备份文件, 使用-t参数来按修改时间排序, -r参数来反向排序(最新的文件在前)

列出特定文件名的文件

ls -rt /var/atlassian/application-data/confluence/backups/backup-*.zip

使用head命令来筛选除了最新的三个文件之外的所有文件列表

ls -rt | head -n -3

搭配xargs命令来删除这些文件

ls -rt | head -n -3 | xargs rm

使用清空而不是删除文件

truncate命令可以用来清空文件, 使其大小变为0

ls -t /var/atlassian/application-data/confluence/backups/backup-*.zip | head -n -3 | xargs truncate -s 0

使用>重定向操作符, 它将一个空文件的内容重定向到指定的文件, 从而清空文件内容

ls -t /var/atlassian/application-data/confluence/backups/backup-*.zip | head -n -3 | xargs -I {} > {}

清理僵尸文件

有时, 删除的文件仍被进程占用, 导致空间未释放, 查找并清理僵尸文件

lsof | grep delete | sort -k7 -rn | more

通过重启相关进程或服务器来释放这些文件占用的空间

检查inode使用情况

如果inode用完了, 即使有可用空间也无法创建新文件

查看inode使用情况

df -i

清理占用大量inode的文件或目录

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

Linux inode详解

什么时候清空文件, 什么时候删除文件

如果文件非常大, 清空文件可能会比删除文件消耗更多的资源, 可能需要更多的磁盘I/O来写入零值

但是涉及到文件正在被引用时, 直接删除并不会释放空间, 参考Linux文件删除后空间没有被释放的原因和解决方案, 这个时候就应该选择清空而不是删除