1. 当你的Linux系统突然吃撑了那天我正在赶一个项目 deadline突然终端弹出红色报错fatal error: cant write PCH file: 设备上没有空间。就像突然发现钱包被掏空一样我赶紧用df -h命令查看磁盘情况结果发现/dev/loop系列设备全部显示100%占用。这些神秘设备其实都是Snap包搞的鬼——它们像贪吃蛇一样悄无声息地吞掉了我的磁盘空间。这种情况太常见了。特别是Ubuntu 18.04之后系统默认会安装Snap来管理软件包。Snap的设计理念很好沙盒化运行、自动更新、依赖打包。但就像外卖app虽然方便却会产生大量包装垃圾一样Snap会在系统里留下大量版本快照导致/var/lib/snapd目录像吹气球一样膨胀。2. Snap空间膨胀的三大元凶2.1 版本保留机制舍不得删的前任们Snap默认会保留每个软件包的3个旧版本就像有些人手机里存着前任的所有聊天记录。执行这个命令你会看得更清楚snap list --all输出结果里那些标记为disabled的条目就是Snap舍不得删除的旧版本。我见过一个案例系统里光Chromium的旧版本就占了1.2GB空间。2.2 循环挂载看不见的空间黑洞Snap通过/dev/loop设备挂载镜像文件这就像在房间里又搭了很多小帐篷。用mount命令查看时你会看到类似这样的挂载点/dev/loop0 on /snap/snapd/12345 type squashfs (ro,nodev,relatime)这些只读挂载虽然安全但每个都会占用独立空间。更麻烦的是用常规的rm命令删除文件对这些挂载点无效。2.3 核心组件预装软件的代价新装系统时GNOME桌面、Snap商店等核心组件都会以Snap形式预装。这些全家桶单个就可能占用几百MB空间。比如gnome-3-34-1804这个平台snap在我的系统里就占了1.2GB。3. 四步彻底清理术附详细操作3.1 精准诊断找到真正的空间杀手先使用这个组合命令查看磁盘使用情况sudo du -sh /var/lib/snapd # 查看snap总占用 df -h | grep loop # 查看loop设备占用 snap list --all | grep disabled | wc -l # 统计旧版本数量在我的工作电脑上这三个命令分别输出了5.4G、7个100%和23。这意味着有23个旧版本占用5.4GB空间7个loop设备被占满。3.2 手动清理删除旧版本的正确姿势创建名为clean-snap.sh的脚本#!/bin/bash # 安全删除所有禁用状态的snap旧版本 set -eu LANGC snap list --all | awk /disabled/{print $1, $3} | while read snapname revision; do echo 正在清理 $snapname 修订版$revision sudo snap remove $snapname --revision$revision done给脚本执行权限后运行chmod x clean-snap.sh sudo ./clean-snap.sh这个脚本会像整理衣柜一样只保留最新版本的衣服把过时的都处理掉。我上次运行后直接腾出了3.2GB空间。3.3 根治方案调整Snap的囤积癖修改系统保留版本数配置建议设为2sudo snap set system refresh.retain2这就像给爱囤货的室友定规矩最多留两件旧衣服。实测这个设置能让后续更新少占用30%-50%空间。3.4 深度清理连根拔起的终极手段如果确定不用Snap可以彻底卸载sudo apt autoremove --purge snapd sudo rm -rf ~/snap /var/lib/snapd注意这会导致通过Snap安装的所有软件不可用。我建议先记录已安装的Snap软件snap list改用apt版本替代。4. 预防胜于治疗的三个好习惯4.1 定期检查给系统做肠镜把这行加入你的~/.bashrc每次打开终端都会显示Snap空间使用echo Snap占用: $(sudo du -sh /var/lib/snapd | cut -f1)我习惯每月用这个命令深度扫描sudo ncdu /var/lib/snapd --exclude /var/lib/snapd/cache4.2 安装策略能不用Snap就不用优先选择传统deb包sudo apt install 软件名如果必须用Snap添加--channelstable/edge参数可以减小体积sudo snap install 软件名 --channelstable4.3 空间隔离给Snap划专用领地如果是服务器环境建议单独挂载分区# 假设/dev/sdb1是新分区 sudo mkfs.ext4 /dev/sdb1 sudo mkdir /var/lib/snapd sudo mount /dev/sdb1 /var/lib/snapd然后在/etc/fstab添加自动挂载配置。我的生产服务器采用这种方案后再没出现过根分区爆满的情况。5. 进阶技巧当常规方法失效时5.1 处理顽固的loop设备有时候卸载后/dev/loop设备仍显示占用。用这个组合拳强制清理sudo losetup -D # 解除所有loop设备 sudo systemctl restart snapd.service sudo snap list # 触发重新挂载5.2 修复损坏的Snap包遇到snap-confine has bad permissions错误时sudo snap repair sudo snap refresh --list这相当于给Snap做一次全身检查。上周帮同事解决这个问题挽救了8个无法启动的Snap应用。5.3 日志文件清理术Snap的日志也可能悄悄膨胀sudo journalctl --vacuum-size100M # 限制日志大小 sudo find /var/lib/snapd/cache -type f -mtime 30 -delete # 清理旧缓存我的笔记本通过这两条命令又找回了1.5GB空间。