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