当前位置:首页>Linux>Linux 磁盘空间管理与清理

Linux 磁盘空间管理与清理

  • 2026-10-11 07:05:22
Linux 磁盘空间管理与清理

大家好,我是冯哥的缓存。今天来聊一聊 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 与定时任务——让系统自动做重复的工作,比如定时清理、定时备份、定时检查。

最新文章

随机文章