操作前务必谨慎!仔细核对步骤,确认环境安全,备份重要数据,明确操作目的与潜在风险,必要时寻求专业指导,确认无误后再执行,避免不可逆损失。
当你的 Linux 系统突然弹出“磁盘空间不足”的警告,或者执行命令时遇到 No space left on device
的错误,意味着你需要立即采取行动清理磁盘了,磁盘空间耗尽不仅会导致程序崩溃、数据无法保存,甚至可能让系统变得不稳定,别担心,本文将手把手教你如何诊断问题根源、安全有效地清理空间,并预防未来再次发生。
- 理解你在删除什么: 随意删除系统文件可能导致系统崩溃、程序无法运行或数据永久丢失。
- 备份关键数据: 在进行大规模删除操作前,强烈建议备份重要文件和数据。
- 使用
sudo
需谨慎: 很多清理命令需要管理员权限 (sudo
),确保你清楚命令的作用。 - 优先清理用户数据:
/home
目录下的用户文件(如下载、缓存、旧项目)是最安全的清理起点。 - 避免直接删除
/tmp
或/dev
: 这些目录通常由系统管理,直接删除可能引发问题。
第一步:精准诊断 – 找出空间被谁吃掉了
盲目删除效率低且危险,我们需要精确找出是哪个分区(或挂载点)满了,以及是哪些文件或目录占用了大量空间。
-
查看整体磁盘使用情况 (
df
):df -h
-h
选项让结果以人类可读的单位(G, M)显示。- 重点关注
Use%
列,找出使用率接近或达到 100% 的分区(如 ,/home
,/var
)。 - 记下满的分区对应的
Mounted on
(挂载点), 或/var
。
-
深入定位大文件/目录 (
du
/ncdu
):
知道哪个分区满后,需要深入该分区找出“罪魁祸首”。-
使用
du
(disk usage):sudo du -h --max-depth=1 /path/to/full/mountpoint | sort -h
- 将
/path/to/full/mountpoint
替换为上一步找到的满的挂载点(如 ,/var
,/home
)。 -h
:人类可读格式。--max-depth=1
:只显示指定目录下一级子目录的大小。| sort -h
:将结果按人类可读的大小排序(从小到大)。注意看最后几行,最大的目录会排在最后。- 找到最大的目录后,可以
cd
进入它,再次运行sudo du -h --max-depth=1 | sort -h
来层层深入,直到定位到大文件或特定的大目录。
- 将
-
推荐使用
ncdu
(NCurses Disk Usage):ncdu
是一个交互式、更直观的工具,强烈推荐安装使用:# 安装 ncdu (根据发行版选择命令) sudo apt install ncdu # Debian/Ubuntu sudo yum install ncdu # CentOS/RHEL sudo dnf install ncdu # Fedora
使用:
sudo ncdu /path/to/full/mountpoint
- 它会扫描目录并显示一个带进度条的可导航界面。
- 使用方向键浏览,按
Enter
进入子目录,按d
删除选中的文件或目录(非常小心!),按 查看帮助。 - 它能快速直观地展示目录大小占比,是定位空间占用者的利器。
-
第二步:针对性清理 – 安全有效地释放空间
根据 df
和 du
/ncdu
定位的结果,针对性地清理:
-
清理用户空间 (
/home/用户名
):- 浏览器缓存: Chrome, Firefox 等浏览器的缓存文件可能非常大,通常在
~/.cache
(~/.cache/mozilla/firefox/
,~/.cache/google-chrome/
) 目录下,可以在浏览器设置里清理,或手动删除~/.cache
下的内容(注意有些应用缓存也在这里)。 - 下载目录 (
~/Downloads
): 检查并删除不再需要的大文件。 - 旧文档、媒体文件: 音乐、视频、图片、旧项目归档等。
- 应用缓存和临时文件: 查看
~/.local/share/
和~/.config/
下特定应用的缓存目录(谨慎操作,删除前了解作用)。 Trash
(回收站): 图形界面清空回收站,或命令行清空~/.local/share/Trash/files/
。
- 浏览器缓存: Chrome, Firefox 等浏览器的缓存文件可能非常大,通常在
-
清理系统日志 (
/var/log
):
系统和服务日志会不断增长,是/var
分区满的常见原因。- 查看日志大小:
sudo ncdu /var/log
或sudo du -sh /var/log/* | sort -h
- 使用
logrotate
: Linux 通常有logrotate
服务自动管理日志轮转和删除旧日志,检查其配置 (/etc/logrotate.conf
和/etc/logrotate.d/
) 确保正常工作,可以手动运行sudo logrotate -f /etc/logrotate.conf
强制立即轮转。 - 清理特定日志文件 (谨慎!):
- 可以安全清理
*.gz
文件(这是logrotate
压缩的旧日志)。 - 对于巨大的当前日志文件 (如
syslog
,messages
,kern.log
),最佳实践是清空内容而不是删除文件本身,因为有些服务需要文件存在:sudo sh -c 'echo > /var/log/syslog' # 清空 syslog 文件内容
- 或者使用
truncate
命令:sudo truncate -s 0 /var/log/messages # 将 messages 文件大小截断为 0
- 绝对避免直接
rm
重要的当前日志文件! 这可能导致记录日志的服务出错。
- 可以安全清理
- 清理
journald
日志 (Systemd 系统):journalctl --disk-usage # 查看日志占用的磁盘空间 sudo journalctl --vacuum-size=100M # 将日志总大小限制到 100M,删除旧日志 sudo journalctl --vacuum-time=2weeks # 删除超过 2 周的日志
也可以编辑
/etc/systemd/journald.conf
中的SystemMaxUse=
或SystemMaxFileSize=
来永久限制大小。
- 查看日志大小:
-
清理包管理器缓存:
包管理器 (apt
,yum/dnf
,pacman
) 会下载并缓存安装包,长期积累会占用不少空间。- APT (Debian/Ubuntu):
sudo apt clean # 删除 /var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/ 中所有 .deb 包 sudo apt autoclean # 删除已卸载软件的旧版本 .deb 包
- YUM (CentOS/RHEL 7):
sudo yum clean all # 清理所有缓存(元数据和包文件)
- DNF (Fedora/CentOS/RHEL 8+):
sudo dnf clean all # 清理所有缓存
- Pacman (Arch/Manjaro):
sudo pacman -Sc # 删除缓存中未安装的包和旧版本(保留当前安装版本的缓存) sudo pacman -Scc # 删除缓存中所有包文件(更彻底,但下次安装需重新下载)
- APT (Debian/Ubuntu):
-
清理临时文件 (
/tmp
和/var/tmp
):- 系统重启通常会清空
/tmp
。 /var/tmp
设计用于在重启后保留的临时文件,但也可能积累垃圾。- 安全清理: 可以删除其中明显是临时文件且长时间未修改(如超过 7 天)的文件:
sudo find /tmp -type f -atime +7 -delete # 删除 /tmp 下超过 7 天未访问的文件 sudo find /var/tmp -type f -atime +14 -delete # 删除 /var/tmp 下超过 14 天未访问的文件
- 谨慎使用
-delete
! 建议先运行不带-delete
的find
命令查看会匹配哪些文件,确认安全后再执行删除。sudo find /var/tmp -type f -atime +14 # 先列出,确认无误 sudo find /var/tmp -type f -atime +14 -delete # 再删除
- 谨慎使用
- 系统重启通常会清空
-
查找并删除核心转储文件 (
Core Dumps
):
程序崩溃时可能生成很大的核心转储文件,通常位于/var/lib/systemd/coredump/
或应用程序的当前目录(如 或用户主目录),查找并删除不再需要的:sudo find / -name 'core.*' -size +100M -exec ls -lh {} \; # 查找大于 100M 的 core 文件并列出 sudo find / -name 'core.*' -size +100M -delete # 找到后删除 (谨慎!确认位置)
-
清理未使用的 Snap 或 Flatpak 包 (如果使用):
- Snap:
snap list --all | grep disabled # 查看已禁用(旧版本)的 snap sudo snap remove --purge <package-name>@<revision> # 清除指定版本的 snap
- Flatpak:
flatpak uninstall --unused # 卸载未使用的运行时和扩展
- Snap:
-
查找并删除重复文件 (可选):
使用工具如fdupes
或rmlint
可以查找并帮助删除重复文件,释放空间。
第三步:预防胜于治疗 – 建立长效机制
清理之后,采取措施防止空间再次耗尽:
-
设置磁盘空间监控:
- 使用
df -h
定期手动检查。 - 配置监控系统(如
Nagios
,Zabbix
,Prometheus
+Grafana
)或简单的cron
任务,在空间使用率达到阈值(如 80%)时发送邮件或告警。 - 使用
ncdu
定期扫描关键目录。
- 使用
-
配置合理的日志轮转 (
logrotate
):
检查并优化/etc/logrotate.conf
和/etc/logrotate.d/
下的配置文件,确保日志文件按大小或时间轮转,并保留适当数量的旧日志(如保留 4 周或 4 个轮转文件),对于特别活跃的日志(如应用日志),可以单独配置更激进的轮转策略。 -
定期清理包缓存:
可以将apt clean
/dnf clean all
/pacman -Sc
等命令加入cron
计划任务,每周或每月自动执行一次。 -
分离关键目录到独立分区:
在安装系统或之后调整分区时,考虑将/home
,/var
,/tmp
甚至/var/log
挂载到独立的磁盘分区,这样即使某个分区(如/var/log
)满了,也不会导致根 分区崩溃影响整个系统。 -
培养良好习惯:
- 及时清理下载目录和回收站。
- 定期归档或删除不再需要的项目文件和大媒体文件。
- 了解常用应用缓存的位置,适时清理。
处理 Linux 磁盘空间满的问题,关键在于精准诊断(df
, du
, ncdu
)和安全清理,优先从用户数据(/home
)和可再生的缓存(包缓存、浏览器缓存)入手,谨慎处理系统日志和临时文件,建立监控和自动化清理机制(logrotate
, cron
)是防止问题复发的根本,操作前务必确认目标,备份重要数据,对 sudo
和 rm
命令保持敬畏之心,通过系统性的方法,你可以高效、安全地释放空间,保持 Linux 系统健康稳定运行。
引用与进一步学习:
df
命令手册:man df
(终端输入)du
命令手册:man du
(终端输入)ncdu
官网: https://dev.yorhel.nl/ncdulogrotate
手册:man logrotate
(终端输入) 或 https://linux.die.net/man/8/logrotatejournalctl
手册:man journalctl
(终端输入)- Linux Filesystem Hierarchy Standard (FHS): https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html (了解标准目录用途)
- 各发行版官方文档: (如 Ubuntu, CentOS, Arch Wiki) 通常有详细的存储管理和清理指南。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/9049.html