Ubuntu根目录爆满5个清理命令与3个迁移技巧拯救你的磁盘空间当Ubuntu系统弹出Low Disk Space on Filesystem root警告时大多数用户的直觉反应是扩容分区。但作为一个经历过数十次类似场景的系统管理员我想告诉你80%的根目录爆满问题不需要扩容就能解决。本文将分享一套经过实战检验的清理组合拳以及更优雅的目录迁移方案让你在不动分区表的情况下重获磁盘自由。1. 诊断快速定位空间吞噬者在动手清理前我们需要像医生一样先确诊病因。Ubuntu根目录爆满通常由三类罪犯导致系统垃圾旧内核、日志文件、软件包缓存不当存储Docker镜像、下载文件默认存放在/var或/home异常占用失控的日志、崩溃转储、僵尸文件1.1 使用ncdu进行可视化分析ncdu(NCurses Disk Usage)是我最推荐的空间分析工具它能以交互式界面展示目录大小sudo apt install ncdu -y sudo ncdu / --exclude /mnt --exclude /media执行后会显示类似下面的分层结构--- / --------------------------------------------------------- 148.3GiB [##########] /var 45.2GiB [### ] /home 8.7GiB [ ] /usr 3.1GiB [ ] /opt提示按d删除选中文件n按文件名排序s按文件大小排序1.2 快速定位大文件的四种方法对于喜欢命令行的用户这些组合命令能快速揪出空间杀手# 查看各目录占用总览 sudo du -h --max-depth1 / | sort -h # 查找大于100MB的文件 sudo find / -type f -size 100M -exec ls -lh {} \; 2/dev/null # 统计前10大文件 sudo find / -type f -exec du -h {} 2/dev/null | sort -rh | head -n 10 # 检查APT缓存大小 sudo du -sh /var/cache/apt/archives2. 清理五把手术刀精准切除脂肪确诊问题后下面这五个命令能安全释放大量空间我按风险从低到高排序2.1 清理APT缓存安全Ubuntu会保留所有下载过的软件包这是最安全的清理项# 查看可释放空间 sudo apt-get --dry-run autoremove # 执行清理 sudo apt-get clean sudo apt-get autoremove --purge典型释放空间500MB-2GB2.2 删除旧内核较安全每更新一次内核旧版本就会留在系统中# 列出所有已安装内核 dpkg --list | grep linux-image # 删除旧内核保留当前和上一个版本 sudo apt purge linux-image-5.4.0-XX-generic典型释放空间1-3GB2.3 清理journal日志需谨慎系统日志会像滚雪球一样增长# 查看日志占用空间 journalctl --disk-usage # 保留最近100MB日志 sudo journalctl --vacuum-size100M # 或保留最近7天日志 sudo journalctl --vacuum-time7d典型释放空间500MB-5GB2.4 清理Snap和Flatpak缓存安全但可能影响启动速度这些容器化应用的缓存可能大得惊人# 清理Snap旧版本 sudo snap list --all | grep disabled | awk {print $1, $3} | \ while read snapname revision; do sudo snap remove $snapname --revision$revision; done # 清理Flatpak未运行应用 flatpak uninstall --unused典型释放空间1-10GB2.5 手动清理/var目录高风险但高效/var是最大的嫌犯需要针对性清理# 清理Docker无用数据 docker system prune -a --volumes # 删除超过30天的Tomcat日志 find /var/lib/tomcat9/logs/ -name *.log -type f -mtime 30 -delete # 清理崩溃报告 sudo rm /var/crash/*警告操作前建议备份重要数据某些服务可能需要重启3. 迁移三个目录搬家方案治本清理是治标迁移才是治本。这三个目录迁移方案能永久解决根目录压力3.1 迁移/var/lib/docker到新分区Docker默认存储位置会快速吞噬空间# 1. 停止Docker服务 sudo systemctl stop docker # 2. 复制数据到新位置假设新分区挂载在/mnt/data sudo rsync -avz /var/lib/docker /mnt/data/ # 3. 修改配置文件 sudo nano /etc/docker/daemon.json # 添加内容 { data-root: /mnt/data/docker } # 4. 重启服务 sudo systemctl start docker3.2 迁移/home到独立分区用户文件是另一个增长点迁移步骤# 1. 创建新分区并格式化假设为/dev/sdb1 sudo mkfs.ext4 /dev/sdb1 # 2. 临时挂载新分区 sudo mkdir /mnt/newhome sudo mount /dev/sdb1 /mnt/newhome # 3. 复制数据保持权限 sudo rsync -aXS --progress /home/. /mnt/newhome/ # 4. 修改fstab实现永久挂载 echo /dev/sdb1 /home ext4 defaults 0 2 | sudo tee -a /etc/fstab # 5. 重新挂载 sudo umount /mnt/newhome sudo mount -a3.3 重定向/var/log到内存日志量大的系统对于频繁写日志的系统可以改用tmpfs# 编辑fstab文件 sudo nano /etc/fstab # 添加这行 tmpfs /var/log tmpfs defaults,noatime,nosuid,nodev,noexec,mode0755,size1G 0 0 # 创建日志目录结构 sudo mkdir /var/log/history sudo chown root:syslog /var/log/history4. 预防建立空间监控体系解决问题后建立预防机制才能避免重蹈覆辙4.1 设置自动化清理脚本创建/usr/local/bin/disk-cleanup#!/bin/bash # 每周清理APT缓存 apt-get clean apt-get autoremove --purge -y # 每月清理旧日志 find /var/log -type f -name *.log -mtime 30 -delete journalctl --vacuum-time30d # 每季度清理Docker docker system prune -a --volumes -f然后添加到cronsudo chmod x /usr/local/bin/disk-cleanup sudo crontab -e # 添加 0 3 * * 1 /usr/local/bin/disk-cleanup4.2 配置磁盘空间告警安装并配置smartmontoolssudo apt install smartmontools mailutils sudo nano /etc/smartd.conf # 添加 /dev/sda -a -m adminexample.com -M exec /usr/local/bin/disk-alert创建告警脚本/usr/local/bin/disk-alert#!/bin/bash THRESHOLD90 CURRENT$(df / --outputpcent | tail -1 | tr -d % ) [ $CURRENT -gt $THRESHOLD ] \ echo Warning: Root partition usage $CURRENT% | mail -s Disk Alert adminexample.com4.3 推荐目录结构规划对于新系统建议采用这样的分区方案挂载点推荐大小文件系统备注/20-30GBext4只装系统/home剩余50%ext4用户数据/var20-30GBext4日志/缓存swap内存大小swap休眠需要2倍内存实现方法是在安装Ubuntu时选择Something else进行手动分区。