ubuntu(8)snap

Ubuntu 的 Snap 包管理系统是一个由 Canonical(Ubuntu 的开发公司)推出的现代化软件包管理工具,旨在提供跨平台的软件分发和安装方式


snapcraft

什么是 Snap?

Snap 是一种软件打包和部署系统,与传统的 Debian 包管理工具(如 apt.deb 文件)不同,它将应用程序及其依赖项打包到一个独立的容器中。这种设计使得 Snap 包可以在不同的 Linux 发行版上运行,具有更高的兼容性和一致性。

Snap 的核心特点

  1. 跨平台支持

    • Snap 包可以在多个 Linux 发行版上运行(如 Ubuntu、Fedora、Arch 等),甚至在 IoT 设备上也能使用。
    • 开发者只需打包一次,用户的系统无需担心依赖问题。
  2. 自包含性

    • 每个 Snap 包都包含应用程序及其所有依赖库,与系统其他部分隔离。这避免了“依赖地狱”问题(即不同软件需要不同版本的库导致冲突)。
  3. 沙盒安全

    • Snap 包运行在沙盒环境中,使用类似容器化的技术(如 AppArmor、seccomp)限制权限,提升安全性。
  4. 自动更新

    • Snap 支持后台自动更新,用户无需手动干预即可保持软件最新。
    • 更新是增量式的,只下载变化的部分,节省带宽。
  5. 版本并存

    • 可以同时安装同一软件的多个版本(如你的 lsblk 输出中 snapd/23545snapd/23771),互不干扰。

Snap 的工作原理

  • Snapd:Snap 的核心守护进程,负责管理 Snap 包的安装、更新和运行。在你的 lsblk 输出中,loop1loop3 挂载了不同版本的 snapd
  • 回环设备(Loop Devices):Snap 包以压缩文件(.snap 文件)的形式存储,通过回环设备挂载到文件系统(如 /snap/core20/2496)。这解释了你看到的 loop0loop3
  • 挂载点:Snap 包挂载后,应用程序会被映射到 /snap 目录下,用户可以通过命令或桌面环境直接运行。
1.安装
root@vgt-ubuntu-10:~# snap install redis
redis 7.4.2 from Redis (redislabs) installed

2.支持命令
root@vgt-ubuntu-10:~# redis.
redis.benchmark  redis.check-aof  redis.check-rdb  redis.cli        redis.sentinel

3.挂载情况
root@vgt-ubuntu-10:~# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0    7:0    0 44.4M  1 loop /snap/snapd/23545
loop1    7:1    0 44.4M  1 loop /snap/snapd/23771
loop2    7:2    0 63.7M  1 loop /snap/core20/2496
loop3    7:3    0 89.4M  1 loop /snap/lxd/31333
loop4    7:4    0 10.1M  1 loop /snap/redis/1574  ### redis运行映射目录
sda      8:0    0   40G  0 disk 
└─sda1   8:1    0   40G  0 part /
sdb      8:16   0   10M  0 disk 

4.映射目录
root@vgt-ubuntu-10:~# tree  /snap/redis/1574/
/snap/redis/1574/
├── meta
│   └── snap.yaml
├── snap
│   ├── command-chain
│   │   └── snapcraft-runner
│   ├── manifest.yaml
│   └── snapcraft.yaml
└── usr
    └── bin
        ├── redis-benchmark
        ├── redis-check-aof -> redis-server
        ├── redis-check-rdb -> redis-server
        ├── redis-cli
        ├── redis-sentinel -> redis-server
        └── redis-server

Snap 的组成部分

  1. Core Snap
    • 提供运行 Snap 包所需的基础运行时环境。例如 core20(基于 Ubuntu 20.04)是你输出中的 loop0
  2. 应用程序 Snap
    • 具体的软件包,如 lxd(容器管理工具,见 loop2)。
  3. Snapd 工具
    • 管理 Snap 的命令行工具(如 snap installsnap list),见 loop1loop3

Snap与传统包(如 APT、DEB)的区别:

  • DEB(APT)依赖系统的共享库,安装时需要解决依赖关系。
  • Snap:独立打包,占用更多磁盘空间,但安装简单且隔离性强。

Snap 架构

Snap 的架构主要由以下几个部分组成:

  1. Snap 包格式

    • Snap 包是一个压缩文件(.snap),基于 SquashFS 文件系统。
    • 包含应用程序、二进制文件、依赖库、元数据(snap.yaml)等。
  2. Snapd

    • Snap 的核心守护进程,负责管理 Snap 包的安装、更新、删除和运行。
    • 通过 snapd 与 Snap Store(Canonical 的应用商店)通信,获取软件包。
    • 支持命令行工具 snap,用户通过它与 Snapd 交互。
  3. 沙盒机制

    • Snap 使用 confinement(隔离)机制,分为两种模式:
      • Strict(严格模式):应用运行在沙盒中,限制对系统资源的访问。
      • Classic(经典模式):类似传统软件,拥有更多系统权限。
    • 依赖 Linux 内核的安全特性,如 AppArmor 和 Seccomp。
  4. Channels(通道)

    • Snap 支持多个更新通道,例如:
      • stable(稳定版)
      • candidate(候选版)
      • beta(测试版)
      • edge(边缘版)
    • 用户可以选择不同的通道来获取不同版本的软件。
  5. Snap Store

    • 官方的应用分发平台,用户可以从中下载 Snap 包。
    • 开发者也可以上传自己的 Snap 应用。

常用 Snap 命令

  • 查看已安装的 Snap 包:snap list
  • 安装 Snap 包:snap install <package_name>
  • 更新所有 Snap 包:snap refresh
  • 更新特定包: snap refresh xxxx
  • 删除 Snap 包:snap remove <package_name>
  • 查看 Snap 版本:snap version
root@vgt-ubuntu-10:~# snap --help
The snap command lets you install, configure, refresh and remove snaps.
Snaps are packages that work across many different Linux distributions,
enabling secure delivery and operation of the latest apps and utilities.

Usage: snap <command> [<options>...]

Commonly used commands can be classified as follows:

           Basics: find, info, install, remove, list, components
          ...more: refresh, revert, switch, disable, enable, create-cohort

          History: changes, tasks, abort, watch

          Daemons: services, start, stop, restart, logs

      Permissions: connections, interface, connect, disconnect

    Configuration: get, set, unset, wait

      App Aliases: alias, aliases, unalias, prefer

          Account: login, logout, whoami

        Snapshots: saved, save, check-snapshot, restore, forget

           Device: model, remodel, reboot, recovery

     Quota Groups: set-quota, remove-quota, quotas, quota

  Validation Sets: validate
        ... Other: warnings, okay, known, ack, version
      Development: validate

For more information about a command, run 'snap help <command>'.
For a short summary of all commands, run 'snap help --all'.

Snap 使用方法

以下是 Snap 的基本使用指南,主要通过命令行工具 snap 操作。

1. 安装 Snapd

在 Ubuntu 上,Snapd 默认已安装。如果没有,可以通过以下命令安装:

1
2
sudo apt update
sudo apt install snapd

2. 常用命令

  • 安装 Snap 应用

    1
    sudo snap install <应用名>

    示例:安装 VLC 播放器

    1
    sudo snap install vlc
  • 列出已安装的 Snap 包

    1
    snap list
  • 更新 Snap 应用

    • 更新单个应用:
      1
      sudo snap refresh <应用名>
    • 更新所有应用:
      1
      sudo snap refresh
  • 删除 Snap 应用

    1
    sudo snap remove <应用名>
  • 查看应用信息

    1
    snap info <应用名>

    示例:

    1
    snap info vlc
  • 切换更新通道

    1
    sudo snap refresh <应用名> --channel=<通道名>

    示例:切换到 beta 版

    1
    sudo snap refresh vlc --channel=beta
  • 仅查看可用更新
    要查看有哪些更新可用,而不立即安装,可以使用:

sudo snap refresh --list
  • 运行 Snap 应用
    大多数 Snap 应用安装后会自动添加到系统菜单,或直接在终端输入应用名运行:
    1
    vlc
snap find <关键字或软件包名称>
snap info <软件包名称>
sudo snap install <软件包名称> --channel=preview/candidate  # 从特地渠道安装
sudo snap refresh <软件包名称> --channel=latest/stable  # 软件切换到特定渠道

sudo snap remove <软件包名称>  # 卸载 Snap 软件包
sudo snap remove <软件包1> <软件包2>
sudo snap remove <软件包名称> --purge  # 彻底删除软件及相关数据

sudo snap refresh  # 检查并更新所有已安装的软件包
sudo snap refresh <软件包名称> # 只更新特定的软件包:
sudo snap refresh --list # 仅查看可用更新

sudo snap disable <软件包名称> # 禁用 Snap 软件包
sudo snap enable <软件包名称> # 启用 Snap 软件包

# 切换更新渠道
sudo snap switch --channel=latest/stable <软件包名称> # 更换渠道
sudo snap refresh <软件包名称> # 应用更改

sudo snap logs <软件包名称>  # 日志诊断

3. 检查 Snap 版本和服务状态

  • 查看 Snap 版本:
    1
    snap version
  • 检查 Snapd 服务状态:
    1
    systemctl status snapd

4. 手动安装 Snap 包

如果有本地 .snap 文件,可以手动安装:

1
sudo snap install <文件名>.snap --dangerous

--dangerous 表示跳过签名验证,谨慎使用)


优缺点

#优点:

  • 安装简单,跨发行版兼容。
  • 自动更新,始终保持最新。
  • 安全性高,沙盒隔离。

#缺点:

  • Snap 包体积较大,占用更多磁盘空间。
  • 启动速度可能比传统应用慢(首次启动需要加载依赖)。
  • 部分用户对 Canonical 的中心化控制(如 Snap Store)有争议。