1. 为什么运维人员都在删除Ubuntu服务器上的snapd
第一次接触Ubuntu服务器版时,我发现几乎所有运维同事在系统安装完成后,第一件事就是执行sudo apt purge snapd。这个看似简单的操作背后,其实隐藏着服务器环境与桌面环境在需求上的本质差异。
snapd是Canonical推出的通用包管理系统,设计初衷是解决Linux软件分发碎片化问题。在桌面环境中,它确实带来了便利:自动更新、依赖隔离、跨发行版兼容。但在服务器领域,这些"优点"反而成了运维人员的噩梦。我管理过上百台Ubuntu服务器,实测发现保留snapd会导致以下问题:
资源占用过高:每个snap应用都自带完整依赖,基础安装就占用300MB+内存。在16GB内存的服务器上,跑20个容器后内存吃紧,清除snapd后立即释放400MB。
更新不可控:自动化运维最怕突发更新。有次凌晨3点,snap自动更新导致Nginx配置失效,监控系统疯狂报警。后来发现是snap版Nginx更新后重置了符号链接。
性能损耗明显:通过
systemd-analyze对比,启用snapd的服务器启动时间平均延长8秒。对于需要快速扩容的云环境,这个延迟无法接受。
关键提示:生产环境务必禁用
snapd.socket服务,否则即使卸载snapd,系统仍会尝试自动重装。执行sudo systemctl disable --now snapd.socket是必须的。
2. 彻底卸载snapd的完整操作指南
2.1 标准卸载流程
在Ubuntu 22.04 LTS服务器版上,完整清除snapd需要执行以下步骤:
# 先停止所有snap服务 sudo systemctl stop snapd.socket sudo systemctl stop snapd.seeded.service sudo systemctl stop snapd.service # 卸载所有snap应用(重要!直接卸载snapd会导致残留) for pkg in $(snap list | awk 'NR>1 {print $1}'); do sudo snap remove --purge $pkg done # 彻底移除snapd及其数据 sudo apt purge -y snapd gnome-software-plugin-snap # 清理残留文件和目录 sudo rm -rf /var/cache/snapd/ sudo rm -rf ~/snap # 防止自动重新安装 sudo apt-mark hold snapd2.2 处理顽固残留
某些情况下(特别是升级安装的系统),可能会遇到snapd死灰复燃的情况。这时需要检查以下文件:
/etc/apt/preferences.d/nosnap.pref- 确保包含:
Package: snapd Pin: release a=* Pin-Priority: -10/etc/apt/apt.conf.d/20snapd.conf- 直接删除该文件检查
/etc/systemd/system/snap-*.mount- 这些挂载点可能残留
2.3 替代方案配置
卸载snapd后,核心工具需要改用传统deb包:
- lxd:从Ubuntu官方源安装
sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable sudo apt install lxdcore20:改用deb版的systemd和基础库
certbot:通过PPA安装:
sudo add-apt-repository ppa:certbot/certbot sudo apt install certbot python3-certbot-nginx3. 运维实战中的深度优化技巧
3.1 系统镜像预处理
在大规模部署时,建议定制系统镜像。使用virt-sysprep工具处理基础镜像:
# 安装工具 sudo apt install libguestfs-tools # 下载官方cloud-image wget https://cloud-images.ubuntu.com/releases/22.04/release/ubuntu-22.04-server-cloudimg-amd64.img # 自定义处理 virt-sysprep -a ubuntu-22.04-server-cloudimg-amd64.img \ --delete /usr/lib/snapd \ --upload /etc/apt/preferences.d/nosnap.pref:/etc/apt/preferences.d/nosnap.pref \ --run-command "apt-mark hold snapd"3.2 自动化运维集成
在Ansible playbook中加入snapd处理环节:
- name: Remove snapd completely hosts: all become: yes tasks: - name: Stop snap services systemd: name: "{{ item }}" state: stopped enabled: no loop: - snapd.socket - snapd.seeded.service - snapd.service - name: Remove all snaps command: snap remove --purge {{ item }} loop: "{{ ansible_facts.snaps | map(attribute='name') | list }}" when: ansible_facts.snaps | length > 0 - name: Purge snapd apt: name: snapd state: absent purge: yes - name: Clean up snap directories file: path: "{{ item }}" state: absent loop: - /var/cache/snapd/ - /root/snap - /home/*/snap3.3 性能对比数据
在同等配置的c5.xlarge AWS实例上测试:
| 指标 | 保留snapd | 移除snapd | 提升幅度 |
|---|---|---|---|
| 启动时间 | 22.8s | 14.2s | 37.7% |
| 内存占用 | 1.4GB | 980MB | 30% |
| 容器启动延迟 | 1.3s | 0.9s | 30.8% |
| apt更新速度 | 45s | 28s | 37.8% |
4. 疑难问题解决方案实录
4.1 常见报错处理
问题1:卸载后出现snap-confine has disappeared错误
解决方案:
sudo rm -f /usr/lib/snapd/snap-confine sudo dpkg-divert --rename --remove /usr/lib/snapd/snap-confine问题2:apt报错Could not open lock file /var/lib/dpkg/lock
这通常是snapd后台进程未完全退出导致:
sudo killall snapd sudo systemctl stop snapd.* sudo rm /var/lib/dpkg/lock sudo dpkg --configure -a4.2 特殊场景处理
Kubernetes节点:某些CNI插件(如Calico)的snap版本会导致网络异常。解决步骤:
- 先卸载snap版:
sudo snap remove calico- 改用官方源安装:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yamlLXD容器主机:如果必须使用snap版LXD,建议:
- 仅保留lxd snap:
sudo snap install lxd --channel=latest/stable- 禁用其他snap服务:
sudo systemctl mask snapd.service snapd.seeded.service4.3 安全加固建议
即使卸载了snapd,还需要:
- 检查apparmor配置:
sudo aa-status | grep snap- 移除相关profile:
sudo find /etc/apparmor.d/ -name "*snap*" -delete sudo systemctl restart apparmor- 审计残留的mount点:
grep snap /proc/mounts | awk '{print $2}' | xargs -I{} sudo umount {}在经历数十次生产环境事故后,我总结出一个铁律:服务器环境必须保持最小化。那些为桌面设计的便利工具,往往会给服务器带来意想不到的隐患。每次系统部署后,删除snapd已经成为我的肌肉记忆动作,这个习惯至少帮团队减少了30%的半夜告警。