找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

262

积分

0

好友

32

主题
发表于 昨天 23:27 | 查看: 1| 回复: 0

snap 是由 Canonical 公司推出的一款软件打包与分发工具,旨在实现跨 Linux 发行版的应用程序部署。在 Ubuntu 20.04 及之后的版本中,系统默认预装了 snapd 服务。但因其设计理念与部分用户的使用习惯不符,且运行时资源占用较高,不少用户选择将其卸载以简化系统。本文将提供一份详细的指南,帮助你在 Ubuntu 系统上彻底移除 snap。

1. 查看已安装的 snap 软件包

在开始卸载前,首先需要了解系统当前安装了哪些 snap 应用。打开终端,执行以下命令:

snap list

命令输出示例如下:

Name    Version        Rev    Tracking       Publisher   Notes
core20  202404162318   latest/stable  canonical✓  base
lxd     5.0.3-80aeff7  29351 5.0/stable/…   canonical✓  -
snapd   2.6321759      latest/stable  canonical✓  snapd

此列表显示了所有已安装的 snap 包及其版本、发布者等信息。其中 Notes 列为 base 的包(如 core20)通常是其他 snap 应用运行所依赖的基础环境,需要在最后移除。

2. 停止并禁用 snapd 相关服务

为了防止在卸载过程中服务自动重启,需要先禁用 snapd 的核心服务。

sudo systemctl disable snapd.service
sudo systemctl disable snapd.socket
sudo systemctl disable snapd.seeded.service

3. 移除所有已安装的 snap 软件包

接下来,需要按照依赖关系,依次移除 snap list 中列出的所有软件包。通常建议先移除普通应用,最后移除基础包。

手动移除示例:

# 先移除非基础依赖的 snap,例如 lxd
sudo snap remove --purge lxd

# 最后移除基础 snap,如 core20 和 snapd 自身
sudo snap remove --purge core20
sudo snap remove --purge snapd

使用 Shell 脚本批量移除: 如果安装的 snap 包较多,可以创建一个简单的脚本来自动化此过程。

#!/bin/bash
# 先移除可能存在的特定应用,如 lxd
snap remove --purge lxd
# 循环移除剩余的所有 snap
sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
while [ $sum -ne 0 ]; do
    for p in $(snap list | awk 'NR>=2{print $1}'); do
        snap remove --purge $p
    done
    sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
done

将上述内容保存为脚本(如 remove_snaps.sh),并赋予执行权限后运行即可。

卸载过程中常见报错处理: 在执行移除命令时,可能会遇到以下问题:

  • 提示“Waiting for conflicting change in progress...” 这表示有另一个 snap 操作(如自动更新)正在进行。可以按 Ctrl+C 终止当前命令,然后查看并中止冲突的操作。

    # 查看正在进行的 snap 操作 ID
    snap changes
    # 中止指定 ID 的操作(例如 ID 为 4)
    sudo snap abort 4
  • 提示“error: snap \"core20\" has \"auto-refresh\" change in progress” 处理方式同上,使用 snap changessnap abort <ID> 命令。

  • 提示“error: daemon is restarting” 这表明 snapd 守护进程正在重启,需要先将其稳定下来。

    sudo systemctl restart snapd

    等待几秒后,再尝试执行移除命令。

4. 通过 apt 彻底清除 snapd

在移除所有 snap 软件包后,需要使用系统自带的 apt 包管理器来卸载 snapd 及其相关依赖包。

sudo apt -y autoremove --purge snapd

此命令会移除 snapd 以及因它而安装的依赖包(如 squashfs-tools),并清理配置文件。

5. 清理残留的目录和缓存

为确保彻底清除,需要手动删除 snap 相关的各种目录。

rm -rf ~/snap
sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd

注意:此操作不可逆,请确保你已不再需要任何 snap 应用。

6. 防止系统自动重新安装 snap

完成上述步骤后,如果不进行设置,在执行 sudo apt update 或系统更新时,可能会重新安装 snapd。为防止这种情况,需要配置 APT 的优先级设置。

创建并编辑配置文件:

sudo vim /etc/apt/preferences.d/no-snapd.pref

在文件中输入以下内容:

Package: snapd
Pin: release a=*
Pin-Priority: -10

保存并退出。这个配置会告诉 APT 系统,永远不要自动安装或升级 snapd 包。

最后,更新一次软件包列表,使配置生效:

sudo apt update

7. 一键卸载脚本参考

对于经常需要在多台 Ubuntu 服务器上执行此操作的用户,可以编写一个完整的自动化 Shell 脚本。以下是一个功能更健全的脚本框架,它包含了系统版本判断、错误处理和颜色提示:

#!/bin/bash
# 脚本:remove_snap.sh
# 描述:支持 Ubuntu Server 20.04, 22.04, 24.04 LTS 的 snap 卸载

COLOR="echo -e \\033[01;31m"
END='\033[0m'
LOGIN_USER=$(whoami)

# 获取系统信息
. /etc/os-release
MAIN_NAME=$ID
MAIN_VERSION_ID=${VERSION_ID%%.*}

ubuntu_remove_snap() {
    # 检查 snapd 是否已安装
    dpkg -s snapd &> /dev/null || { ${COLOR}"snap 已卸载或未安装!"${END}; exit; }

    # 禁用服务
    sudo systemctl disable --now snapd.service snapd.socket snapd.seeded.service

    # 移除所有 snap 包(示例逻辑,可根据实际情况调整)
    if [[ “$MAIN_VERSION_ID” == “20” || “$MAIN_VERSION_ID” == “22” ]]; then
        sudo snap remove --purge lxd 2>/dev/null
        for p in $(snap list | awk ‘NR>=2{print $1}‘); do
            sudo snap remove --purge $p 2>/dev/null
        done
    fi

    # 通过 apt 清除
    sudo apt -y autoremove --purge snapd

    # 清理目录
    rm -rf ~/snap
    sudo rm -rf /snap /var/snap /var/lib/snapd /var/cache/snapd 2>/dev/null

    # 阻止自动安装
    sudo bash -c ‘cat > /etc/apt/preferences.d/no-snapd.pref << EOF
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF‘

    sudo apt update
    ${COLOR}"${PRETTY_NAME} 操作系统,snap 卸载完成!"${END}
}

# 主函数
main() {
    if [[ “$LOGIN_USER” != “root” ]]; then
        ${COLOR}"请使用 root 用户权限执行此脚本!"${END}
        exit 1
    fi
    ubuntu_remove_snap
}

# 执行入口
if [[ “$MAIN_NAME” == “ubuntu” ]]; then
    if [[ “$MAIN_VERSION_ID” == “20” || “$MAIN_VERSION_ID” == “22” || “$MAIN_VERSION_ID” == “24” ]]; then
        main
    else
        ${COLOR}"此脚本暂不支持 Ubuntu ${VERSION_ID}。"${END}
    fi
else
    ${COLOR}"此脚本仅适用于 Ubuntu 系统。"${END}
fi

使用说明:将脚本保存为 remove_snap.sh,赋予执行权限(chmod +x remove_snap.sh),并使用 sudo 权限运行。请注意,脚本中的批量移除逻辑可能需要根据你的实际 snap 列表进行调整。

通过以上步骤,你可以彻底地从 Ubuntu 系统中移除 snap 及其所有组件,并确保它不会在系统更新时被自动装回。这有助于保持一个更精简、完全由传统 apt/dpkg 或 Flatpak 管理的系统环境。

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-3 14:50 , Processed in 0.942449 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表