)
无损的 Linux 磁盘清理Linux 服务器的根分区/被写满是运维和开发环境里很常见的问题。尤其是在装了 CUDA、Anaconda、Docker、IDE、大型仿真软件或长期运行日志的机器上根分区很容易从“还能用”突然变成 100%。最近正好在自己配置了很久的服务器出现问题故此给出对系统影响较小的清理办法方法主要是包括清理和空间迁移仅供参考。很多人遇到这种情况的第一反应是rm-rf某个看起来很大的目录这很危险。真正稳妥的做法应该是先定位再判断再迁移或清理最后验证和回滚。本文讨论的是“无损的 Linux 磁盘清理”。这里的“无损”不是指绝对不删除任何文件而是指不盲删系统目录不破坏软件依赖不影响已有路径不让业务服务因为路径变化而失效。常见手段包括清理缓存、压缩或轮转日志、迁移大目录到其他磁盘再用软链接或 bind mount 保持原路径可用。本文会重点介绍/tmp、cache 目录、CUDA、本地安装包仓库、/opt软件目录的处理方法。零、全文速看章节目录快速查看磁盘查看一到三、几类清理四已删除的文件五日志六package缓存七tmp文件夹八caches;九和十CUDA十一/opt下载的软件目录迁移检查命令十二到十四一个清理模板和后续补充十五到十七一、查看磁盘状态首先查看整体磁盘使用情况df-h这个命令用于查看各个文件系统的磁盘容量、已用空间、可用空间和使用率。参数解释dfdisk free查看文件系统空间。-hhuman-readable以 G、M 等更易读的单位显示。如果只关心根分区/df-h/如果还想看文件系统类型df-hT/参数解释-T显示文件系统类型例如xfs、ext4、overlay等。再确认/到底挂载在哪个设备上findmnt /这个命令会显示/的挂载来源、文件系统类型和挂载参数。例如你可能会看到/ /dev/mapper/centos-root xfs这说明根分区使用的是/dev/mapper/centos-root文件系统类型是 XFS。如果怀疑 inode 用尽也要看 inodedf-ih/参数解释-i查看 inode 使用情况。-h以易读方式显示。如果磁盘空间没满但 inode 满了也会出现无法创建新文件的情况。二、不要直接进目录乱删先用 du 定位df是看分区是否满了du告诉我们哪个目录占空间。查看根分区一级目录大小sudodu-xhd1/2/dev/null|sort-h这个命令非常重要。参数解释sudo用 root 权限查看否则很多目录没权限访问结果会低估。dudisk usage统计目录实际占用。-x不要跨文件系统。比如/home、/share、/tools如果是单独挂载的磁盘就不会被算进根分区。-h以易读单位显示。-d1只统计一层目录。/从根目录开始统计。2/dev/null隐藏权限不足等错误输出。sort -h按人类可读的容量大小排序。典型输出可能类似548M /opt 7.0G /var 8.4G /root 11G /usr 28G /然后继续深入sudodu-xhd1/var2/dev/null|sort-hsudodu-xhd1/usr2/dev/null|sort-hsudodu-xhd1/usr/local2/dev/null|sort-hsudodu-xhd1/opt2/dev/null|sort-hsudodu-xhd1/root2/dev/null|sort-h这些命令的作用是逐层缩小范围直到找到真正的大目录。三、查找大文件有时候不是某个目录整体很大而是某几个文件特别大比如日志、安装包、模型文件、静态库。可以查找根分区内大于 500M 的文件sudofind/-xdev-typef-size500M-printf%s %p\n2/dev/null|sort-n|numfmt--field1--toiec参数解释find /从根目录开始查找。-xdev不跨文件系统避免把/home、/share等其他磁盘也扫进去。-type f只找普通文件。-size 500M只找大于 500M 的文件。-printf %s %p\n输出文件大小和路径。sort -n按数字大小排序。numfmt --field1 --toiec把字节数转换成 MiB、GiB 这种可读格式。典型结果可能包括2.6G /var/log/messages-20260607 661M /usr/local/cuda-12.4/targets/x86_64-linux/lib/libcudnn_cnn_infer_static.a 641M /var/cuda-repo-rhel8-12-8-local/libcublas-devel-xxx.rpm这种输出比盲目清理有效得多因为它直接告诉你“大文件是谁”。四、检查 deleted 文件占用有一种情况很隐蔽文件已经被删除但仍被进程打开。此时du看不到它但df仍然显示空间被占用。检查命令sudolsofL1命令解释lsoflist open files列出进程打开的文件。L1列出链接数小于 1 的文件也就是已经被删除但仍被进程占用的文件。如果看到很大的 deleted 日志文件例如java 1234 root 1w REG ... 20G /var/log/app.log (deleted)说明这个文件虽然被删除了但对应进程还在写它。此时需要重启对应服务sudosystemctl restart 服务名或者在确认安全的前提下结束对应进程。不要反复rm因为文件已经删除了真正占用空间的是进程句柄。五、日志清理优先压缩、轮转、限制大小日志是最常见的根分区占用来源之一尤其是/var/log/messages、/var/log/secure、应用日志、systemd journal。查看/var/logsudodu-xhd1/var/log2/dev/null|sort-h查找大日志sudofind/var/log-typef-size100M-printf%s %p\n2/dev/null|sort-n|numfmt--field1--toiec如果是已经轮转的历史日志例如/var/log/messages-20260607可以压缩sudogzip/var/log/messages-20260607命令解释gzip压缩文件原文件会变成.gz文件。适合保留历史日志但减少占用。如果确认不再需要也可以删除历史日志sudorm-f/var/log/messages-20260607命令解释rm删除文件。-f强制删除不提示。注意不要直接删除正在写入的日志文件。对于正在写入的日志更推荐截断sudotruncate-s0/var/log/xxx.log命令解释truncate调整文件大小。-s 0把文件大小设为 0。好处是文件路径和进程写入句柄仍然保留不容易影响服务。查看 systemd journal 占用sudojournalctl --disk-usage限制 journal 总大小sudojournalctl --vacuum-size1G只保留最近 7 天sudojournalctl --vacuum-time7d命令解释journalctl查看和管理 systemd 日志。--disk-usage查看 journal 占用空间。--vacuum-size1G清理旧日志让总量降到约 1G。--vacuum-time7d只保留最近 7 天日志。六、缓存清理优先清理 package、pip、conda、npm 缓存缓存一般是低风险清理对象但仍然建议先查看大小。1. yum / dnf 缓存CentOS / RHEL 常见sudoyum clean all命令解释yum clean all清理 yum 下载缓存、元数据缓存。不会卸载已安装软件。如果是新版本系统使用 dnfsudodnf clean all命令解释dnf clean all清理 dnf 缓存。有些旧系统没有dnf会提示 command not found这很正常。查看 yum 缓存目录sudodu-sh/var/cache/yum2/dev/nullsudodu-sh/var/cache/dnf2/dev/null2. apt 缓存Ubuntu / Debian 常见sudoaptclean命令解释清理/var/cache/apt/archives下的安装包缓存。不卸载软件。也可以自动移除不再需要的依赖sudoaptautoremove注意autoremove会卸载包虽然通常安全但建议先查看它准备删除什么。3. pip 缓存查看 pip 缓存位置pip cachedir查看 pip 缓存信息pip cache info清理 pip 缓存pip cache purge如果是 root 用户产生的 pip 缓存sudorm-rf/root/.cache/pip命令解释/root/.cache/pip是 root 用户执行 pip 时产生的缓存。删除缓存不会删除已安装的 Python 包。4. conda 缓存查看 conda 缓存conda clean--all--dry-run命令解释--dry-run只显示将要清理什么不真正执行。适合先确认风险。真正清理conda clean-a命令解释-a/--all清理包缓存、索引缓存、tarballs 等。不会删除正在使用的 conda 环境但可能导致以后重新创建环境时需要重新下载包。查看 conda 环境位置condaenvlist如果某些环境很大不建议直接删除应该先确认是否使用。5. npm / yarn 缓存查看 npm 缓存路径npmconfig get cache清理 npm 缓存npmcache clean--forceyarnyarncache clean七、tmp 目录清理与迁移要分开/tmp和/var/tmp都可能变大但它们含义不同/tmp临时文件通常重启后可以清理。/var/tmp更持久的临时文件很多程序假设它可以跨重启存在。查看大小sudodu-sh/tmp /var/tmp2/dev/null查看大文件sudofind/tmp /var/tmp-xdev-typef-size100M-printf%s %p\n2/dev/null|sort-n|numfmt--field1--toiec清理 7 天未访问的普通临时文件sudofind/tmp-xdev-typef-atime7-delete命令解释-atime 7超过 7 天未访问。-delete删除匹配文件。这个命令只删普通文件不删目录。对/var/tmp要更谨慎例如只清理 30 天未访问的文件sudofind/var/tmp-xdev-typef-atime30-delete如果你希望把/tmp迁到大盘不建议只靠软链接。更稳的是使用 bind mount。假设新位置是/share/system-tmpsudomkdir-p/share/system-tmpsudochmod1777/share/system-tmp命令解释mkdir -p创建目录如果父目录不存在也一起创建。chmod 1777设置临时目录权限。1777中的1是 sticky bit表示用户只能删除自己的文件777表示所有用户可读写执行。这是/tmp的标准权限。迁移现有内容sudorsync-aHAX--numeric-ids /tmp/ /share/system-tmp/命令解释rsync同步文件。-a归档模式保留权限、时间戳、软链接等。-H保留硬链接。-A保留 ACL。-X保留扩展属性。--numeric-ids按数字 UID/GID 保留属主避免用户名映射差异。/tmp/末尾的斜杠表示复制目录内容而不是目录本身。临时挂载测试sudomount--bind/share/system-tmp /tmp命令解释mount --bind把一个已有目录挂载到另一个路径。程序仍然访问/tmp但实际数据落在/share/system-tmp。写入/etc/fstab持久化echo/share/system-tmp /tmp none bind 0 0|sudotee-a/etc/fstab验证findmnt /tmptouch/tmp/test-filels-l/share/system-tmp/test-file命令解释findmnt /tmp确认/tmp是否已经 bind 到新目录。touch创建测试文件。ls确认文件是否实际出现在新位置。八、cache 目录迁移适合开发机和 AI 服务器很多开发工具会把缓存写到用户目录或根分区例如/root/.cache /home/user/.cache /root/.conda /root/.npm /var/cache如果某个 cache 目录很大可以迁移到大盘后软链接回来。以 root 的 pip cache 为例sudodu-sh/root/.cache假设要迁到/tools/cache/root-cachesudomkdir-p/tools/cache/root-cachesudorsync-aHAX--numeric-ids /root/.cache/ /tools/cache/root-cache/sudomv/root/.cache /root/.cache.baksudoln-s/tools/cache/root-cache /root/.cache命令解释du -sh查看目录总大小。mkdir -p创建目标目录。rsync无损复制目录内容。mv把原目录改名为备份。ln -s创建软链接让原路径指向新位置。验证ls-ld/root/.cache readlink-f/root/.cache命令解释ls -ld查看目录或软链接本身。readlink -f查看软链接最终指向哪里。确认程序正常后再删除备份sudorm-rf/root/.cache.bak这就是“无损迁移”的核心流程复制 → 改名备份 → 建链接 → 验证 → 删除备份。九、CUDA 目录迁移不要破坏 /usr/local/cuda 入口CUDA 常见安装位置是/usr/local/cuda /usr/local/cuda-12.4 /usr/local/cuda-11.8很多程序默认找/usr/local/cuda所以不要随便删除这个路径。先查看 CUDA 占用sudodu-xhd1/usr/local2/dev/null|sort-hsudodu-sh/usr/local/cuda-12.4ls-l/usr/local|grepcuda命令解释第一条查看/usr/local下谁最大。第二条查看具体 CUDA 目录大小。第三条查看 CUDA 相关软链接。如果发现/usr/local/cuda - /usr/local/cuda-12.4/ /usr/local/cuda-12.4 13G可以迁到大盘例如/tools/usr-local/cuda-12.4sudomkdir-p/tools/usr-localsudorsync-aHAX--numeric-ids /usr/local/cuda-12.4/ /tools/usr-local/cuda-12.4/解释创建新目录。用 rsync 完整复制 CUDA 文件尽量保留权限和属性。然后把原目录改成备份sudomv/usr/local/cuda-12.4 /usr/local/cuda-12.4.bak解释不是直接删除而是先改名。如果迁移失败可以快速回滚。创建软链接sudoln-s/tools/usr-local/cuda-12.4 /usr/local/cuda-12.4解释让/usr/local/cuda-12.4这个老路径继续存在。实际文件在/tools/usr-local/cuda-12.4。验证 CUDA/usr/local/cuda-12.4/bin/nvcc--version/usr/local/cuda/bin/nvcc--versionreadlink-f/usr/local/cuda readlink-f/usr/local/cuda-12.4命令解释nvcc --version验证 CUDA compiler 是否能正常运行。readlink -f确认软链接最终指向新目录。如果系统使用动态库缓存可以刷新sudoldconfig解释ldconfig刷新动态链接库缓存。当 CUDA library 路径写在/etc/ld.so.conf.d/*.conf中时这一步很有用。确认没问题后再删除备份sudorm-rf/usr/local/cuda-12.4.bak注意删除备份前一定要确认以下命令都正常/usr/local/cuda/bin/nvcc--versionls/usr/local/cuda/lib642/dev/nullls/usr/local/cuda/targets/x86_64-linux/lib2/dev/null十、CUDA 本地 repo安装包仓库可以移走但 repo 配置要处理CUDA 安装时可能会生成本地 repo例如/var/cuda-repo-rhel8-12-8-local /etc/yum.repos.d/cuda-rhel8-12-8-local.repo这种目录通常是安装包仓库不是 CUDA 运行时的主目录。先确认大小sudodu-sh/var/cuda-repo-rhel8-12-8-local查看是否有对应 rpm 记录rpm-qa|grep-icuda-repo查看 yum repo 文件ls/etc/yum.repos.d/|grep-icuda如果 CUDA 已经安装完成不想让它占用根分区可以先移动到大盘备份sudomkdir-p/share/system-backupsudomv/var/cuda-repo-rhel8-12-8-local /share/system-backup/命令解释mkdir -p /share/system-backup创建备份目录。mv移动本地 repo 目录到大盘。然后清理 yum 缓存sudoyum clean all但是注意repo 文件仍然可能指向原来的/var/cuda-repo-rhel8-12-8-local。如果不处理以后yum install或yum update可能报错。建议禁用这个 reposudocp/etc/yum.repos.d/cuda-rhel8-12-8-local.repo /etc/yum.repos.d/cuda-rhel8-12-8-local.repo.baksudosed-is/^enabled.*/enabled0//etc/yum.repos.d/cuda-rhel8-12-8-local.reposudoyum clean all命令解释cp先备份 repo 文件。sed -i原地修改文件。s/^enabled.*/enabled0/把enabled1或其他 enabled 配置改成enabled0。yum clean all清理 yum 缓存让 repo 状态重新生效。如果你仍然想保留这个离线 repo可以把 repo 文件里的baseurl改成新路径例如file:///share/system-backup/cuda-repo-rhel8-12-8-local然后保持enabled0需要时再启用。十一、/opt 软件迁移适合 IDE、商业软件、手工安装工具/opt通常放第三方软件例如 PyCharm、VSCode、MATLAB、ANSYS、ToDesk 等。这类目录很适合迁移因为它们通常不是系统启动的核心依赖。查看/optsudodu-xhd1/opt2/dev/null|sort-h假设发现2.2G /opt/pycharm-community-2025.1.1迁移到/tools/optsudomkdir-p/tools/optsudorsync-aHAX--numeric-ids /opt/pycharm-community-2025.1.1/ /tools/opt/pycharm-community-2025.1.1/sudomv/opt/pycharm-community-2025.1.1 /opt/pycharm-community-2025.1.1.baksudoln-s/tools/opt/pycharm-community-2025.1.1 /opt/pycharm-community-2025.1.1命令解释rsync完整复制软件目录。mv 原目录 原目录.bak保留原始目录作为回滚备份。ln -s 新目录 原路径保持原路径不变让桌面快捷方式、脚本、PATH 配置继续有效。验证ls-ld/opt/pycharm-community-2025.1.1 readlink-f/opt/pycharm-community-2025.1.1 /opt/pycharm-community-2025.1.1/bin/pycharm.sh确认能启动后删除备份sudorm-rf/opt/pycharm-community-2025.1.1.bak十二、软链接还是 bind mount目录迁移后常见两种保持路径不变的方式方式一软链接sudoln-s/tools/opt/app /opt/app优点简单。易查看。易回滚。缺点少数程序对软链接路径敏感。某些服务或安全策略可能不喜欢软链接。适合/opt/xxx/usr/local/cuda-xx用户 cacheconda env手工安装的软件方式二bind mountsudomount--bind/tools/app /opt/app持久化echo/tools/app /opt/app none bind 0 0|sudotee-a/etc/fstab优点对程序来说更像真实目录。兼容性比软链接更强。缺点需要维护/etc/fstab。如果目标盘没挂载可能影响启动或服务。适合/tmp/var/tmp/var/lib/docker/var/lib/containerd对路径敏感的服务数据目录十三、Docker / containerd 数据目录不要简单软链接如果根分区满是因为 Docker常见大目录是/var/lib/docker /var/lib/containerd /var/lib/kubelet先查看sudodu-sh/var/lib/docker /var/lib/containerd /var/lib/kubelet2/dev/nulldockersystemdf命令解释du -sh查看各目录大小。docker system df查看 Docker 镜像、容器、volume、build cache 占用。清理未使用的 Docker 对象dockersystem prune更激进地清理未使用镜像dockersystem prune-a注意docker system prune会删除未使用的容器、网络、悬空镜像、构建缓存。-a会删除所有未被容器使用的镜像执行前必须确认。迁移 Docker 推荐修改data-root不要只做软链接。示例sudosystemctl stopdockersudomkdir-p/share/docker-datasudorsync-aHAXS--numeric-ids /var/lib/docker/ /share/docker-data/sudomv/var/lib/docker /var/lib/docker.baksudomkdir-p/var/lib/docker编辑配置sudovi/etc/docker/daemon.json写入{data-root:/share/docker-data}启动验证sudosystemctl startdockerdockerinfo|grepDocker Root Dirdockerps确认正常后sudorm-rf/var/lib/docker.bak命令解释systemctl stop docker迁移前停止 Docker避免复制过程中数据变化。rsync -aHAXS复制 Docker 数据-S用于稀疏文件处理。daemon.json的data-root告诉 Docker 新的数据目录。docker info验证 Docker 实际使用的新目录。十四、哪些目录不要轻易迁移或删除以下目录不要随便迁移、软链接或删除/bin /sbin /lib /lib64 /etc /boot /dev /proc /sys /run /usr/bin /usr/lib /usr/lib64 /var/lib/rpm原因这些目录属于系统启动、包管理、动态链接、设备管理的核心路径。一旦误删或软链接失败可能导致系统无法启动、无法登录、无法安装软件。可以重点处理的目录/tmp /var/tmp /var/cache /root/.cache /home/*/.cache /usr/local/cuda-* /opt/* /var/log /var/cuda-repo-* /var/lib/docker /var/lib/containerd原则是应用数据和缓存优先系统核心目录谨慎。十五、一个完整的无损清理流程模板下面是一套通用流程可以直接套用。第一步确认根分区状态df-h/df-hT/ findmnt /df-ih/分别确认/是否真的满了。文件系统类型是什么。/挂载在哪个设备。inode 是否充足。第二步定位一级目录sudodu-xhd1/2/dev/null|sort-h如果/usr大sudodu-xhd1/usr2/dev/null|sort-hsudodu-xhd1/usr/local2/dev/null|sort-h如果/var大sudodu-xhd1/var2/dev/null|sort-hsudodu-xhd1/var/log2/dev/null|sort-hsudodu-xhd1/var/lib2/dev/null|sort-h如果/opt大sudodu-xhd1/opt2/dev/null|sort-h如果/root大sudodu-xhd1/root2/dev/null|sort-h第三步找大文件sudofind/-xdev-typef-size500M-printf%s %p\n2/dev/null|sort-n|numfmt--field1--toiec根据结果判断是日志、安装包、CUDA 库、模型文件、数据库文件还是镜像文件。第四步检查 deleted 文件sudolsofL1如果有大 deleted 文件重启对应服务。第五步优先清缓存和日志sudoyum clean allsudojournalctl --disk-usagesudojournalctl --vacuum-size1G或在 Ubuntu / Debian 上sudoaptcleansudojournalctl --vacuum-size1G第六步迁移大目录通用模板sudomkdir-p/目标磁盘/目标目录sudorsync-aHAX--numeric-ids /原目录/ /目标磁盘/目标目录/sudomv/原目录 /原目录.baksudoln-s/目标磁盘/目标目录 /原目录验证ls-ld/原目录 readlink-f/原目录如果是可执行软件/原目录/bin/程序--version确认没问题后sudorm-rf/原目录.bak十六、我的一次实践从 100% 到 55%某台 CentOS 机器的根分区只有 50G一开始状态如下/dev/mapper/centos-root 50G 50G 78M 100% /通过du -xhd1 /发现主要占用在23G /usr 11G /var 2.8G /opt继续拆分后发现14G /usr/local 13G /usr/local/cuda-12.4 5.6G /var/cuda-repo-rhel8-12-8-local 4.4G /var/log 2.2G /opt/pycharm-community-2025.1.1处理策略按照前置命令主要是第六步将/var/cuda-repo-rhel8-12-8-local移到/share/system-backup/。清理 yum 缓存。删除或压缩历史大日志/var/log/messages-20260607。将/usr/local/cuda-12.4迁移到/tools/usr-local/cuda-12.4再用软链接保留原路径。将/opt/pycharm-community-2025.1.1迁移到/tools/opt/pycharm-community-2025.1.1再用软链接保留原路径。验证 CUDA 的nvcc --version正常。确认无误后删除.bak备份目录。最终/dev/mapper/centos-root 50G 28G 23G 55% /这就是比较理想的无损清理结果没有盲删系统目录没有破坏 CUDA 路径也没有重装系统。十七、最后检查清理完成后建议执行df-h/sudodu-xhd1/2/dev/null|sort-hfindmnt /确认/使用率降到安全范围。df和du差距不大。迁移目录的挂载或软链接正常。检查软链接readlink-f/usr/local/cuda readlink-f/usr/local/cuda-12.4 readlink-f/opt/pycharm-community-2025.1.1检查 CUDA/usr/local/cuda/bin/nvcc--version检查 repoyum repolist检查日志sudojournalctl --disk-usage检查 deleted 文件sudolsofL1如果lsof L1中出现异常路径例如/var/tmp/.crond/java、memfd:elf、随机名的/tmp/xxxxx除了磁盘问题还应考虑安全排查。磁盘清理有时会暴露隐藏进程、异常任务或被删除但仍驻留的可疑文件。总结无损的 Linux 磁盘清理是一个判断过程用df判断哪个分区满。用findmnt确认挂载关系。用du -xhd1找出根分区内的大目录。用find -size找出大文件。用lsof L1找出 deleted 占用。对 cache 和日志优先清理。对 CUDA、/opt、工具链、软件目录优先迁移。用软链接或 bind mount 保持原路径不变。验证服务可用后再删除.bak备份。最重要的原则是先备份后替换先验证后删除能迁移就不盲删能保留路径就不改配置。