Linux 用户最常面临的问题之一,尤其是在磁盘空间有限的系统上,就是 root 分区 (/) 完全被占满。

当这种情况发生时,您可能会遇到如下错误:

设备上没有剩余空间

不要惊慌!这只是意味着您的 root 目录(/ 分区)已满,这是一个常见的问题,尤其是在磁盘空间有限的系统或全天候运行的服务器上。

当这种情况发生时,您可能会遇到以下问题:

  • 无法安装或升级软件包。
  • 系统无法启动。
  • 服务无法运行。
  • 日志或临时文件无法写入。

在本文中,我们将为您介绍实用的步骤,以识别问题、安全清理空间并防止再次发生。这些指导适用于初学者和中级用户。

步骤 1:检查 Linux 磁盘使用情况

第一步是使用 df 命令确认问题,该命令会显示 root 分区使用的空间和可用空间。如果使用率达到 100%,则必须采取行动。

df -h /

现在让我们找出哪些文件夹占用了最多的空间。

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

这将显示按大小排序的 / 下的顶级目录。

/var
/usr
/home
/tmp
/opt

一旦您确定了最大的目录,可以进一步检查它,例如,如果 /var 很大:

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

步骤 2:清理 Linux 软件包缓存

当您安装或更新软件时,Linux 会将下载的软件包文件存储在本地缓存中。随着时间的推移,这个缓存可能会变得非常庞大,特别是如果您系统经常进行更新或安装。

清理这个缓存是释放空间的安全有效方法。

sudo apt clean         # 适用于 Debian/Ubuntu
sudo dnf clean all     # 适用于 RHEL 系列

这些命令会从 /var/cache/apt/archives/(针对 APT)和 /var/cache/dnf/(针对 DNF)中移除所有缓存的软件包文件,这些文件会随时间积累并占用大量空间。

步骤 3:移除 Linux 旧内核

当您的系统安装内核更新时,通常会保留旧版本,以便在新版本失败时进行恢复。随着时间的推移,这可能会消耗大量空间,尤其是 /boot 分区,其容量有限。

为了释放 Linux 系统的空间,最好移除旧的未使用内核。但是,切勿移除当前正在运行的内核,因为它是系统启动和正常运行所必需的。

首先,检查当前运行的内核版本。

uname -r

然后列出所有已安装的内核:

dpkg --list | grep linux-image    # 适用于 Debian/Ubuntu
rpm -q kernel                     # 适用于 RHEL 系列

一旦您确定哪些内核版本不再需要,就可以移除它们。例如,在 Ubuntu 上移除 5.15.0-88-generic 版本。

sudo apt remove --purge linux-image-5.15.0-88-generic

在 RHEL 系列系统上:

sudo dnf remove kernel-4.18.0-305.el8.x86_64

移除后,更新引导加载程序。

sudo update-grub

移除旧内核后,运行以下命令清理剩余的软件包和依赖项:

sudo apt autoremove      # 适用于 Debian/Ubuntu
sudo dnf autoremove      # 适用于 RHEL 系列

步骤 4:清除 Linux 日志文件

Linux 在 /var/log 目录中的日志文件中记录系统活动和事件,这些日志有助于系统管理员排除故障、跟踪用户活动并了解系统性能。

但随着时间的推移,它们可能会变得非常庞大,特别是如果:

  • 某个服务频繁崩溃
  • 系统不断记录调试或错误信息
  • 磁盘空间即将耗尽,日志不断堆积

如果您的根分区 / 已满,日志很可能占用了大量空间。清理或缩小这些日志文件可以立即释放一些空间,使系统恢复正常状态。

首先,运行以下命令查看每个日志文件或文件夹占用的空间大小:

sudo du -sh /var/log/*

一旦您知道哪些日志文件是最大的问题来源,就可以截断日志文件,这意味着清除其内容而不删除实际文件。

sudo truncate -s 0 /var/log/syslog
sudo truncate -s 0 /var/log/kern.log
sudo truncate -s 0 /var/log/auth.log

如果您使用的是 journalctl(Systemd 系统中常见),可以使用以下命令清理日志:

sudo journalctl --vacuum-time=7d

这将仅保留过去 7 天的日志。

步骤 5:在 Linux 中清理 Docker(如果已安装)

如果您使用 Docker,由于图像、容器和卷的存在,它可能会占用大量空间。

检查 Docker 的空间使用情况:

docker system df

要移除未使用的 Docker 数据:

docker system prune -a

请注意:这将删除所有未使用的图像、容器和卷。

步骤 6:全根分区的Live USB 救援方法

如果系统完全已满且无法响应,您可以使用 Live USB 启动到 Live Linux 环境,并挂载您的根分区。

sudo fdisk -l
sudo mount /dev/sda1 /mnt  # 将 sda1 替换为您的实际根分区

浏览文件系统并删除大型不需要的文件。

cd /mnt
sudo du -sh var/*
sudo rm -rf var/log/*

删除文件时要小心——避免删除重要的系统文件。

未来预防此问题的措施

以下是一些避免填满根分区的最佳实践:

  • 使用独立分区——在安装过程中为 /var、/home 和 /tmp 创建独立分区。
  • 监控磁盘使用率——设置简单的监控工具,如 monit、cron 任务或电子邮件提醒,以便在磁盘使用率过高时通知您。
  • 定期清理计划——创建 cron 任务定期清理日志和缓存。
  • 避免在 / 中存储大文件——将备份文件、下载文件和媒体数据存储在挂载的外部驱动器或单独的数据分区上。

如果您尝试清理了 Linux 根分区,但它仍然会不断填充,那么可能是时候增加根 (/) 分区的大小了。扩展根分区可以为系统提供更多的空间用于应用程序、日志和数据。

请查看我们的详细指南:如何在 Linux 中扩展根分区

总结

当根分区被填满时,可能会导致严重的问题,从包安装失败和服务崩溃,到日志记录错误甚至系统启动失败。幸运的是,通过正确的命令集和一些仔细的清理工作,您可以恢复空间,使系统恢复正常状态,而无需重新安装。

您在 Linux 系统中是否遇到过根 (/) 分区已满的情况?您采取了什么措施来修复它?请在下方评论中分享您的经验——您的建议可能有助于社区中的其他人!