大家好,我是冯哥的缓存。今天来聊一聊 Linux 的磁盘空间管理,怎么看哪里占了空间、怎么安全清理、怎么防止它悄悄涨起来。
一、先搞清楚现状:df 和 du
1.1 df 看各分区占用
df是"disk free"的缩写,显示各挂载点的磁盘使用情况:
df -h
-h表示"human readable",用GB/MB 显示,比默认的字节数直观多了。
典型输出:
文件系统 容量已用可用 已用% 挂载点
/dev/sda250G38G10G79%/
/dev/sda1511M6.1M505M2%/boot/efi
tmpfs3.9G1.2M3.9G1%/dev/shm
重点看根分区/,如果已用超过 80%,就该清理了,建议开始清理;超过 95% 可能无法正常写入日志。
⚠️注意:df显示的是分区级别的情况,不能显示"是哪个目录占了这么多",那是 du的活。
1.2 du——看具体目录大小
du是"disk usage"的缩写,递归统计目录大小:
# 查看当前目录,排序显示前10大项
du -h --max-depth=1 | sort -hr | head -10
常用参数说明:
参数 | 含义 |
-h | 人类可读格式(GB/MB) |
-s | 只显示汇总,不递归(summarize) |
--max-depth=1 | 只看一层子目录 |
-a | 同时显示文件(不只目录) |
实用组合:
# 查看 /var 目录下每个子目录的大小(常见的大户)
sudo du -h --max-depth=1 /var | sort -hr
# 查看家目录里哪个文件夹最大
du -h --max-depth=1 ~ | sort -hr
# 找出整个系统里超过 500MB 的目录(慢,但全面)
sudo du -h / --max-depth=3 2>/dev/null | sort -hr | head -20
二、可视化神器:ncdu
命令行的du输出一行一行的,找起来费眼睛。ncdu(NCurses Disk Usage)是一个终端里的可视化磁盘分析工具,交互式操作,一目了然。
2.1 安装
# Debian/Ubuntu
sudo apt install ncdu
# Fedora
sudo dnf install ncdu
# Arch Linux
sudo pacman -S ncdu
2.2 基本使用
# 分析当前目录
ncdu
# 分析根目录(需要 sudo,不然很多目录进不去)
sudo ncdu /
# 分析指定目录
ncdu /var
2.3 操作快捷键
按键 | 功能 |
↑ ↓ | 上下移动 |
Enter | 进入目录 |
← / h | 返回上级目录 |
d | 删除选中的文件/目录(危险!要确认) |
i | 查看当前项详情 |
s | 按大小排序(默认) |
n | 按名称排序 |
q | 退出 |
💡提示:d键直接删除,如果只是查看,不要按 d。操作前建议先确认是什么文件,非把握十足不要在系统目录用这个键。
三、常见的空间黑洞在哪里
用 ncdu 或 du 扫一遍,就会发现这几个地方容易藏大文件:
目录 | 常见原因 | 参考大小 |
/var/log/ | 系统日志、应用日志堆积 | 几十 MB ~ 几 GB |
/var/cache/apt/ | apt 下载的 .deb 包缓存 | 几百 MB ~ 几 GB,如果用了 Docker,这通常是最大的占用源之一 |
/var/lib/docker/ | Docker 镜像、容器、volumes | 几 GB ~ 几十 GB |
~/.cache/ | 应用缓存(浏览器缓存、缩略图等) | 几百 MB ~ 数 GB |
~/.local/share/Trash/ | 回收站里的文件 | 视情况 |
/tmp/ | 临时文件(一般重启清空) | 通常不大 |
/home/*/下载/ | 用户下载目录 | 视使用习惯 |
~/snap/ 或 /var/lib/snapd/ | snap 包残留 | 每个版本单独存储,容易积累 |
四、apt/dpkg包缓存清理
Ubuntu/Debian 系常见的占用源之一。
4.1 查看当前缓存大小
du -sh /var/cache/apt/archives/
4.2 清理方式
# 只删除已不再需要的旧版本包缓存(保留最新版本,相对保守)
sudo apt autoclean
# 删除所有下载的包缓存(彻底,反正重新安装会重新下载)
sudo apt clean
# 删除孤立依赖包(安装软件时自动装的、现在没用了的)
sudo apt autoremove
# 组合使用,一次性清完
sudo apt clean && sudo apt autoremove
💡提示:apt autoremove删的是"自动安装、现在无用"的依赖包,一般安全,但如果看到它要删某个认识的软件,先确认一下再操作。
五、系统日志清理
5.1 journalctl 日志
systemd 的 journal 日志默认保留在 /var/log/journal/,时间长了可以积累到几个 GB。
# 查看当前日志占用多少空间,如果这个数字超过1GB,就该清理了
journalctl --disk-usage
# 只保留最近 2 周的日志
sudo journalctl --vacuum-time=2weeks
# 只保留最近 500MB 的日志
sudo journalctl --vacuum-size=500M
# 两个条件都加上(两个条件满足任一就会触发清理,保留日志不超过500M且不超过2周,达到任一限制即清理)
sudo journalctl --vacuum-time=2weeks --vacuum-size=500M
5.2 设置永久限制(防止再次膨胀)
编辑/etc/systemd/journald.conf,找到(或添加)这几行:
[Journal]
SystemMaxUse=500M
SystemKeepFree=100M
MaxRetentionSec=2weeks
保存后重启journald:
sudo systemctl restart systemd-journald
5.3 其他日志文件
# 查看 /var/log 下各文件大小
sudo du -h --max-depth=1 /var/log | sort -hr
# 清空某个具体的日志文件(不要删文件,清空内容)
sudo truncate -s 0 /var/log/syslog
⚠️注意:不要直接 rm正在被程序写入的日志文件,用 truncate清空内容更安全,文件描述符不会断。
六、用户缓存清理
6.1 ~/.cache 目录
这里存放各种应用的缓存:浏览器缓存、缩略图、字体缓存、pip 下载缓存等。
# 查看大小
du -sh ~/.cache/
# 查看里面各子目录的大小
du -h --max-depth=1 ~/.cache/ | sort -hr
# 清空(整个目录清掉一般没问题,应用会自动重建)
rm -rf ~/.cache/*
💡提示:~/.cache是应用设计为"可以随时删"的目录,清掉之后应用第一次启动可能慢一点(要重建缓存),但不会丢失任何设置或数据。
6.2 回收站
# 查看回收站大小
du -sh ~/.local/share/Trash/
# 清空回收站
rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/info/*
6.3 缩略图缓存
文件管理器显示图片预览时会在这里生成缩略图,图片多了可能积累几百 MB:
du -sh ~/.cache/thumbnails/
rm -rf ~/.cache/thumbnails/*
七、pip/conda缓存清理
如果用Python 做开发,pip 和 conda 的包缓存也是常见大户。
# 查看 pip 缓存大小
pip cache info
# 清除 pip 缓存
pip cache purge
# conda 缓存清理(包括包、索引、临时文件)
conda clean --all
八、Docker清理
Docker 是磁盘杀手之一,镜像、停止的容器、未使用的 volumes可以轻松占用几十 GB。
# 查看 Docker 整体占用
docker system df
# 清理所有未使用的资源(停止的容器、悬空镜像、未使用的网络),是比较安全的日常清理方式
docker system prune
# 加上 -a 连未使用的镜像也一起删(更彻底,但会删掉可能还想用的镜像,执行前用 docker images 确认哪些镜像还在使用。)
docker system prune -a
# 只清理 volumes(--volumes 参数)
docker system prune --volumes
⚠️注意:docker system prune -a会删掉所有没有容器在用的镜像,下次用到的话要重新 pull,执行前确认一下。
8.1 分项清理
# 只删停止的容器
docker container prune
# 只删悬空镜像(没有 tag 的)
docker image prune
# 只删未使用的 volumes
docker volume prune
# 只删未使用的网络
docker network prune
九、snap 包清理
如果系统里有snap 包,每次更新都会保留旧版本,默认保留 3 个版本,可以积累不少空间。
# 查看 snap 包占用
du -sh /var/lib/snapd/snaps/
# 查看每个 snap 包的各个版本
snap list --all
# 手动删除旧版本(disabled 状态的)
sudo snap remove --purge <包名> --revision <版本号>
一键清理所有旧版本的脚本:
snap list --all | awk '/disabled/{print $1, $3}' | while read snapname revision; do
sudo snap remove "$snapname" --revision="$revision"
done
十、找出大文件
有时候不是某个目录整体大,而是某个单独的大文件在某个意想不到的地方(比如核心转储文件、虚拟机镜像备份等)。
# 找出整个系统里超过 1GB 的文件
sudo find / -type f -size +1G 2>/dev/null
# 找出超过 500MB 的文件,如果 find 输出太多,可以用 head -20 限制行数。
sudo find / -type f -size +500M 2>/dev/null
# 在 /var 下找超过 100MB 的文件
sudo find /var -type f -size +100M 2>/dev/null
特别关注这几类大文件:
文件类型 | 特征 | 处理 |
核心转储 | core、core.*,在 / 或应用目录 | 调试完就可以删 |
虚拟机磁盘 | .vmdk、.vdi、.qcow2 | 确认没用再删 |
备份压缩包 | .tar.gz、.zip,在家目录 | 确认已备份再清理 |
数据库文件 | .db、.sqlite | 谨慎,确认是否在用 |
日志归档 | .log.1、.log.gz,在 /var/log/ | 一般可以清理 |
如果不确定文件用途,建议先 ls -la 查看文件信息再决定。
十一、整体清理脚本
把常用的清理操作打包成一个脚本,定期跑一下:
#!/bin/bash
# clean_disk.sh - Linux 日常磁盘清理脚本
set -euo pipefail
echo "========== 清理前磁盘状态 =========="
df -h /
echo ""
echo "========== 清理apt 缓存 =========="
sudo apt clean
sudo apt autoremove -y
echo "apt 清理完成"
echo ""
echo "========== 清理journald 日志(保留最近 2 周 / 500MB) =========="
sudo journalctl --vacuum-time=2weeks --vacuum-size=500M
echo "日志清理完成"
echo ""
echo "==========清理用户缓存 =========="
CACHE_BEFORE=$(du -sh ~/.cache/ 2>/dev/null | cut -f1)
rm -rf ~/.cache/thumbnails/*
rm -rf ~/.cache/pip/*
echo "缓存清理完成(清理前约$CACHE_BEFORE)"
echo ""
echo "========== 清理回收站 =========="
rm -rf ~/.local/share/Trash/files/*
rm -rf ~/.local/share/Trash/info/*
echo "回收站清理完成"
echo ""
echo "========== 清理后磁盘状态 =========="
df -h /
保存为~/bin/scripts/clean_disk.sh,加执行权限:
chmod +x ~/bin/scripts/clean_disk.sh
十二、/proc/meminfo与 /dev/shm 说明
有时候df -h里看到 /dev/shm占用了一些空间,这是共享内存(tmpfs),是内存里的虚拟文件系统,不占磁盘空间,不用管。
另外df输出里的 tmpfs类型条目(/run、/dev/shm、/run/lock等)都是内存虚拟文件系统,统计磁盘空间时可以忽略,重点看 ext4/xfs/btrfs 类型的真实分区。
十三、定期维护建议
与其等到磁盘满了再慌着清,不如养成定期检查的习惯:
频率 | 操作 |
每周 | df -h 扫一眼使用率,超过 75% 就检查 |
每月 | sudo apt clean && sudo apt autoremove;清理 ~/.cache |
每季度 | sudo ncdu / 全盘扫一次,找出大文件/目录 |
装完大软件后 | docker system prune(如果在用 Docker) |
系统更新后 | sudo apt autoremove 清掉旧内核 |
💡提示: Ubuntu 在安装新内核后会保留旧内核,时间长了 /boot分区会被塞满。sudo apt autoremove会自动清理旧内核,但如果 /boot已经满了连apt 都跑不起来,需要手动用 dpkg --list | grep linux-image找旧内核,然后 sudo dpkg --remove 手动删除。
速查表
查看磁盘使用
命令 | 作用 |
df -h | 各分区使用率 |
du -sh 目录 | 某目录总大小 |
du -h --max-depth=1 目录 | sort -hr | 子目录大小排序 |
sudo ncdu / | 可视化全盘分析 |
sudo find / -type f -size +500M | 找超过500MB的文件 |
清理操作
命令 | 作用 |
sudo apt clean | 清空 apt 下载缓存 |
sudo apt autoremove | 清除孤立依赖包 |
sudo journalctl --vacuum-size=500M | 限制日志大小 |
sudo journalctl --vacuum-time=2weeks | 删除两周前的日志 |
rm -rf ~/.cache/* | 清空用户应用缓存 |
rm -rf ~/.local/share/Trash/files/* | 清空回收站 |
pip cache purge | 清空 pip 下载缓存 |
docker system prune | 清理 Docker 无用资源 |
总结
Linux 磁盘管理的思路就三步:看、找、清。
1.看——df -h看各分区整体用量,超过 80% 要处理了
2.找——ncdu或 du精确找到是哪个目录/文件在吃空间
3.清——按来源分类处理:apt缓存、journald 日志、用户缓存、Docker、snap、大文件各有对应方案
养成定期维护的习惯,比等到磁盘满了再抢救要省心得多。
下篇预告:cron 与定时任务——让系统自动做重复的工作,比如定时清理、定时备份、定时检查。