背景

在日常的系统维护中,我遇到了一个典型的问题——根目录 / 分区空间紧张,系统磁盘使用率飙升到 93%,有些时候直接飙升到99%,这样的结果就是没法远程连接服务器开发。尤其是 /usr/home 这两个目录,由于包含大量程序库和用户数据,成为了空间占用的主要来源。为了提升系统稳定性并避免空间爆满,我决定对系统进行优化。

优化目标

  • 释放根分区(/)的空间,使其可用空间提升到更健康的状态。
  • 优化 /home/usr 的空间分配,确保系统运行的流畅性。
  • 保持系统稳定性,在不影响功能的前提下实现扩容。

执行步骤

1. 考虑两种扩容方案

在开始实际扩容操作之前,我首先对两种扩容方法进行了比较:

1.1 软链接迁移

  • 优点

    • 灵活性强:通过软链接迁移目录,空间管理更加灵活,根分区(/)不需要改动,适合动态扩展。

    • 操作简单:不需要重新分区或调整文件系统,极大降低了风险。

    • 不影响现有系统结构:迁移后的目录仍能通过软链接正常访问,系统对用户透明,程序无感知。

  • 缺点

    • 需要在迁移时保证软链接指向正确,避免因软链接错误导致找不到目录或文件。

1.2 硬扩容(直接分区扩展)

  • 优点
    • 彻底解决空间不足问题:通过扩展根分区或其他分区,可以从根本上增加系统可用空间。
  • 缺点
    • 风险高:需要修改磁盘分区,特别是对于非 LVM 系统,涉及到分区工具如 gpartedfdisk,不当操作可能导致数据丢失。
    • 操作复杂:涉及到系统重启和磁盘操作,错误的操作会导致系统无法启动,恢复起来十分麻烦。

1.3 选择扩容方案

在评估了两种扩容方法后,我决定先尝试 软链接迁移,因为它操作简单且灵活,不需要改变磁盘分区结构,能够解决空间问题的同时,避免操作风险。

2. 迁移 /usr/local 目录

由于 /usr/local 目录下包含了大量的程序和依赖(尤其是 CUDA 相关工具),这个目录占用了 14GB 的空间。为了解决这一问题,我决定将其迁移到 /opt,并使用软链接指向新位置:

步骤:

  1. 使用 rsync/usr/local 迁移到 /opt/usr_local

    1
    sudo rsync -aXS /usr/local/ /opt/usr_local/
  2. 删除原目录并创建软链接:

    1
    2
    sudo mv /usr/local /usr/local.bak
    sudo ln -s /opt/usr_local /usr/local
  3. 验证 CUDA 等程序是否正常运行:

    1
    nvcc --version

成功将 14GB 空间从 /usr 转移到 /opt,且程序运行没有任何问题。

3. 清理 /var/log 和日志文件

在检查磁盘空间时,我发现 /var/log 中存在大量的日志文件,这些文件占用了几 GB 的空间。为了释放更多空间,我决定清理旧的日志文件:

步骤:

  1. 使用 journalctl 清理旧的系统日志:

    1
    sudo journalctl --vacuum-time=7d
  2. 手动清理缓存和无用的日志文件:

    1
    2
    sudo rm -rf /var/cache/*
    sudo rm -rf /var/lib/apt/lists/*

    这一步成功释放了 2.2GB 的空间。

4. 清理 /tmp 目录

/tmp 目录包含一些临时文件,我检查后发现其中的文件大部分已经过时,于是我清理了超过 7 天未访问的临时文件:

1
sudo find /tmp -type f -atime +7 -delete

优化效果

在执行完以上步骤后,系统的磁盘空间得到了显著优化。原来 / 分区的 93% 使用率,已经降到 78.27%,可用空间提升了大约 14GB。

总结:

  • 在大多数情况下,软连接迁移是一种更加安全、灵活的扩容方法。特别是当你不希望重新分配分区或进行复杂的磁盘操作时,软链接可以很好地解决空间不足问题。

  • 如果你使用了 LVMZFS 等灵活的文件系统,硬扩容是一个可靠的方案,适合长期扩展。

总结

通过这一轮优化,我成功解决了根分区空间紧张的问题,并且将系统的磁盘使用率控制在健康范围。软链接迁移和日志清理是非常有效的手段,我将继续保持这些操作,确保系统稳定运行。