snap 命令详解与参数实测(Ubuntu 22.04)

snap 命令详解:在 Ubuntu 22.04(snap 2.76.3)环境实测 version/list/find/info/changes/services 与 install/refresh 全过程,含 snapd 两种运行形态的真实回显、channel 通道解读、squashfs 与 systemd 依赖机制;install/refresh 受环境 mount 能力限制的失败形态如实记录并给出生产形态说明。

Linux命令Linux系统UbuntuUbuntu 22.04命令行包管理2026/10/16

snap 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 snap 的每一个常用参数——version/list/find/info/install/refresh/changes/services 核心子命令、snapd 服务巡检与安装失败排障,全部命令与回显已在 Ubuntu 22.04(snap 2.76.3)实测通过;受环境能力限制而失败的部分(install/refresh)如实呈现失败形态,不编造成功输出。

一、环境信息

本篇所有命令均在以下环境中逐条真实执行,回显为实际输出(非编造):

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64),内核 6.8.0-138-generic
  • snap 客户端版本:2.76.3+ubuntu22.04.1
  • snapd 守护进程版本:2.76.3+ubuntu22.04.1(运行态下 snap version 实测)
  • 经 apt 安装 snapd:DEBIAN_FRONTEND=noninteractive apt-get install -y snapd,安装正常完成
  • ⚠️ 本实测环境为最小化系统,未以 systemd 作为 1 号进程引导:systemctl 无法操作 snapd 服务,snapd 在本环境以直接运行守护进程的方式拉起(等价于生产机上 systemctl start snapd 完成后的运行态,生产机无需任何手工步骤)
  • ⚠️ 内核已内建 squashfs(modprobe squashfs 返回 0),但本环境 mount 系统调用受限,导致 snapd 的系统自检失败——这决定了 3.5/3.6 节 install/refresh 的实测结果为失败形态,属环境能力边界,非命令本身问题

💡 说明:在标准 Ubuntu 桌面/服务器上,snapd 由 systemd 开机自启(snapd.socket + snapd.service),内核 mount 能力完整,上述两个前置全部满足,snap install 可正常完成安装。本文对生产形态给出命令与流程说明,对实测输出逐字照抄、成败如实。

二、命令概览

2.1 语法与测试数据

snap 是 Ubuntu 的通用软件包体系:包内自带运行时与依赖(以 squashfs 只读文件系统挂载运行),由 snapd 守护进程统一管理生命周期与自动刷新。

snap <command> [<options>...]
snap version                  # 查看 snap/snapd/系统各组件版本
snap list                     # 列出已安装的 snap 包
snap find <关键词>            # 在 Snap Store 检索
snap info <包名>              # 查看包详情与通道版本
snap install <包名>           # 安装
snap refresh [包名]           # 刷新(升级)
snap changes                  # 变更历史
snap services                 # snap 服务清单

常用子命令一览:

子命令作用本文实测
version组件版本表是(3.1 节,两种形态)
list已安装清单是(3.2 节,两种形态)
findStore 检索是(3.3 节)
info包详情与通道是(3.4 节)
install安装 snap是(3.5 节,实测失败形态)
refresh刷新升级是(3.6 节,实测失败形态)
changes变更历史是(3.7 节)
services服务清单是(3.7 节)
--help帮助是(2.2 节)

💡 技术拓展:Linux 通用软件分发格式不止 snap 一家,横向对比——

格式代表生态依赖方式特点
debDebian/Ubuntu apt共享系统依赖体积小、系统集成深,依赖冲突需自行协调
snapUbuntu snapd包内自带,squashfs 挂载自动刷新、沙箱隔离、跨发行版;体积偏大
flatpakFedora/桌面端运行时共享面向桌面应用,沙箱化
AppImage独立打包单文件全带免安装即用,无中心仓库与自动更新

本文主角 snap:Ubuntu 22.04 官方主推、snapd 托管、以 store 通道(channel)做版本发布管理。

测试数据说明:选用 Store 里最小的 hello-world(约 20.5kB)作为安装演示对象,hello 作为检索关键词。

2.2 --help 全量输出(逐行照抄)

$ snap --help 2>&1
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, component
          ...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
  Issue reporting: report-issue
           Device: model, remodel, reboot, recovery
     Quota Groups: set-quota, remove-quota, quotas, quota
  Validation Sets: validate
        ... Other: warnings, okay, known, ack, version
      Development: download, pack, run, try, sign

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

帮助按用途分组列出了全部子命令族:Basics(基础增删查)、History(变更审计)、Daemons(服务管理)、Permissions(接口授权)等。注意 --help 只依赖客户端,snapd 未运行也能查看(3.1 节同款前提)。

2.3 版本信息

snapd 未运行与运行两种形态下,版本输出不同,实测如下(详见 3.1 节解读):

$ snap version
snap    2.76.3+ubuntu22.04.1
snapd   unavailable
series  -

运行态:

$ snap version
snap          2.76.3+ubuntu22.04.1
snapd         2.76.3+ubuntu22.04.1
series        16
ubuntu        22.04
kernel        6.8.0-138-generic
architecture  amd64

Ubuntu 22.04 官方源当前提供的 snap/snapd 为 2.76.3+ubuntu22.04.1。snap version 是判断「客户端在、守护进程不在」的第一入口:daemon 未运行时 snapd 行显示 unavailable。

三、参数逐项实测

3.1 version:组件版本表(含 daemon 未运行的诊断价值)

snap 体系分两层:snap 客户端 + snapd 守护进程。客户端永远可用,守护进程必须存活才有完整输出。daemon 未运行时:

$ snap version
snap    2.76.3+ubuntu22.04.1
snapd   unavailable
series  -

unavailable 即「socket 上没有应答的守护进程」。运行态输出补全为 6 行,多出 snapd 版本、series(snap API 协议版本,恒为 16)、ubuntu 发行版、kernel、architecture:

$ snap version
snap          2.76.3+ubuntu22.04.1
snapd         2.76.3+ubuntu22.04.1
series        16
ubuntu        22.04
kernel        6.8.0-138-generic
architecture  amd64

💡 要点:snapd unavailable 不代表 snapd 没装,只代表此刻没在运行。巡检顺序:snap version 看形态 → systemctl status snapd 查服务(见 3.8 节)。

3.2 list:已安装清单(空列表与报错两种真实形态)

daemon 未运行时,客户端连不上 /run/snapd.socket:

$ snap list 2>&1; echo rc=$?
error: cannot list snaps: cannot communicate with server: Get "http://localhost/v2/snaps": dial unix /run/snapd.socket: connect: no such file or directory
rc=1

报错直指根因:/run/snapd.socket 不存在(socket 文件由 snapd 启动时创建)。snapd 运行后,全新系统输出:

$ snap list 2>&1; echo rc=$?
No snaps are installed yet. Try 'snap install hello-world'.
rc=0

💡 要点:No snaps are installed yet... 是空列表的正常形态,rc=0;装过包之后这里变为表格输出(Name/Version/Rev/Tracking/Publisher/Notes 六列)。rc=1 + cannot communicate with server 则是排障的第一信号。

3.3 find:在 Snap Store 检索

find 走 snapd 向 Snap Store 发起网络查询,检索 hello:

$ snap find hello 2>&1 | head -8
Name                    Version               Publisher           Notes  Summary
hello                   2.10                  canonical**         -      GNU Hello, the "hello world" snap
hello-world             6.4                   canonical**         -      The 'hello-world' of snaps
hello-nginx             2.2.0                 carlos-bravo        -      Zero-config nginx web server for developers, listening on port 8080
hello-pasman            0.25                  pasman1             -      Hello and welcome greetings.
helloworld-gui          1.5                   enjoysoftware       -      GUI version of HelloWorld - Displays the famous "Hello, world!" message
hello-lhc               1.0                   cprov               -      Hello world application for LHC☂
hello-node-snap         1.0.2                 bhdouglass          -      A simple hello world command

五列表头:Name/Version/Publisher/Notes/Summary。Publisher 带星号(如 canonical**)表示经过 Store 验证的发布者。find 结果直接给出版本与一句话简介,是选型第一步;确定目标后用 info 看通道详情(3.4 节)。

💡 要点:find 是联网查询(走 Store API),离线机器只会得到网络超时错误——离线环境改用 snap info 包名 读本地断言缓存。选 snap 包时优先认准 canonical** 验证发布者与 Notes 列的 classic/lxd 标记,classic 意味着包拥有全系统权限,安全评估时要单独对待。

3.4 info:包详情与版本通道

$ snap info hello-world 2>&1 | head -18
name:      hello-world
summary:   The 'hello-world' of snaps
publisher: Canonical**
store-url: https://snapcraft.io/hello-world
contact:   snaps@canonical.com
license:   MIT
description: |
  This is a simple hello world example.
snap-id: buPKUD3TKqCOgLEjjHx5kSiCpIs5cMuQ
channels:
  latest/stable:    6.4 2024-02-27 (29) 20.5kB -
  latest/candidate: 6.4 2024-02-27 (29) 20.5kB -
  latest/beta:      6.4 2024-02-27 (29) 20.5kB -
  latest/edge:      6.4 2024-02-27 (29) 20.5kB -

逐字段解读:snap-id 是包在 Store 的全局唯一 ID;store-url 对应网页详情页;channels 段列出各通道的版本、发布日期、修订号(括号内数字,如 (29))与大小(20.5kB)。hello-world 四个通道同版本,属典型小包;活跃软件各通道版本通常不同。

💡 技术拓展:snap 的版本通道(channel)按风险等级分层,安装/刷新时可显式指定——

通道内容适用场景
latest/stable官方稳定版(默认)生产环境
latest/candidate候选版(功能冻结待验证)上线前验证
latest/beta测试版尝鲜反馈
latest/edge最新构建(每提交都可能更新)开发调试

形态如 snap install 包名 --channel=latest/edge。生产一律默认 stable;本文实测全部走默认 stable 通道。

3.5 install:安装 snap(实测失败形态 + 生产流程说明)

安装命令形态与实测(本环境 mount 受限,如实记录失败):

$ snap install hello-world 2>&1; echo rc=$?
error: system does not fully support snapd: cannot mount squashfs image using
       "squashfs": mount: /tmp/syscheck-mountpoint-3325652196: mount failed:
       Operation not permitted.
rc=1

$ snap list 2>&1; echo rc=$?
No snaps are installed yet. Try 'snap install hello-world'.
rc=0

失败后 snap list 确认包未进入系统——失败是干净的,不会留半成品。

生产机上的完整流程说明:snap install hello-world 依次执行——从 Store 下载(进度条)→ 校验并登记断言(assertion)→ mount 挂载 squashfs 到 /snap/hello-world/<版本> → 完成配置并刷新 PATH 软链(/snap/bin/)。成功后命令即可用:hello-world 直接输出问候语,snap list 表格中出现该包(Name/Version/Rev/Tracking/Publisher/Notes)。⚠️ 前置要求:内核支持 squashfs 且允许挂载(标准 Ubuntu 桌面/服务器默认满足);本实测环境因 mount 受限止步于自检阶段,失败形态如上、逐字真实。

💡 要点:snap 安装失败是「事务式」的——自检不过就整体拒绝,snap list 里不会出现半成品包,这与 apt 中断后留下 iU 半安装态完全不同。恢复排障从 snap changes 入手:失败的变更会记录 Error 状态与 ID,修复环境后重跑 install 即可。

3.6 refresh:刷新升级(实测失败形态 + 生产说明)

$ snap refresh 2>&1; echo rc=$?
error: system does not fully support snapd: cannot mount squashfs image using
       "squashfs": mount: /tmp/syscheck-mountpoint-3325652196: mount failed:
       Operation not permitted.
rc=1

snap refresh 不带参数即全量刷新,带包名则定点刷新(snap refresh hello-world)。执行前 snapd 会做系统自检(试挂载 squashfs),本环境止步于自检、报错与 install 同源。

生产机上的行为说明:无可更新包时 snap refresh 输出 All snaps up to date.(或等价的刷新提示)并返回 0;有更新时逐包显示 包名: 版本a → 版本b。snapd 默认每日自动检查刷新(refresh.timer 定时器),snap refresh 是手工触发入口。

💡 要点:生产服务器建议对关键 snap 做版本钉扎(snap refresh --hold=forever 包名),防止自动刷新在维护窗口外带入不兼容版本;临时冻结可用 snap refresh --hold=24h,恢复刷新用 snap refresh --unhold 包名。变更时间窗用 snap set system refresh.hold="<日期>" 全局延后。

3.7 changes / services:变更历史与服务清单

$ snap changes; echo rc=$?
ID   Status  Spawn               Ready               Summary
1    Done    today at 22:29 UTC  today at 22:29 UTC  Initialize system state

rc=0

$ snap services; echo rc=$?
There are no services provided by installed snaps.
rc=0

changes 是 snap 体系的审计账本:每一条变更(安装/刷新/移除/接口连接)都有 ID、状态(Done/Doing/Error/Undo)、起止时间与摘要;排障时用 snap changes 找到失败 ID,再 snap change <ID> 看逐任务明细。services 列出已装 snap 提供的后台服务——本环境未装包,输出为空态提示。

💡 要点:snap changes 是 snap 独有的审计能力(apt 家族要翻 /var/log/apt/history.log),接手服务器时先看最近 10 条变更即可还原「谁在什么时候装/删/刷了什么」。services 空输出是正常态——只有提供 daemon 的 snap(如 lxd、certbot 的定时器)才会出现在列表里。

3.8 snapd 服务巡检与依赖机制

snapd 是典型的 systemd 服务型守护进程,巡检入口:

$ systemctl status snapd 2>&1 | head -3
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

本实测环境未以 systemd 引导(1 号进程非 systemd),因此 systemctl 不可操作——这是环境能力边界,报错信息本身也是一类真实的排障形态:凡 systemctl 报 System has not been booted with systemd as init system,说明当前系统没有 systemd 在管服务。标准 Ubuntu 服务器上此命令会输出 snapd 服务的 active 状态与主进程号,常用巡检组合为:

systemctl status snapd          # 服务状态(active (running) 为正常)
systemctl is-enabled snapd      # 是否开机自启
systemctl restart snapd         # 重启守护进程(socket 异常时常用)

依赖机制说明:snapd 对系统有两项硬依赖——systemd(服务托管、socket 激活、挂载单元编排)与内核 squashfs 支持(snap 以 squashfs 只读文件系统分发,安装即挂载)。两者缺一,snap 体系只能停在客户端查询层面(version/help),install/refresh 均无法落地,本文 3.5/3.6 节正是这两种受限的实录。

💡 要点:snapd 自检报错只说「System does not fully support snapd」,不指明缺哪一项——排障时按顺序排查两点:stat -fc %T /sys/fs/cgroup/ 确认 cgroup v2 挂载、modprobe squashfs 确认内核模块。两项都正常仍失败,再查 /etc/fstab 是否限制了 snap 目录挂载。

四、实战示例

4.1 接手服务器巡检三连

场景:接手一台 Ubuntu 服务器,先确认 snap 体系健康度。三步:看形态 → 查服务 → 看清单。

$ snap version
snap    2.76.3+ubuntu22.04.1
snapd   unavailable
series  -

$ systemctl status snapd 2>&1 | head -3
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

$ snap list 2>&1; echo rc=$?
error: cannot list snaps: cannot communicate with server: Get "http://localhost/v2/snaps": dial unix /run/snapd.socket: connect: no such file or directory
rc=1

解读:本环境三连结果为「客户端正常、守护进程不可达、systemd 缺位」——三份证据互相印证,定位明确。生产机上同样的巡检若见 snapd unavailable,下一步就是 systemctl start snapd 并查 journalctl -u snapd 日志;若 systemctl 报 systemd 缺位,则说明系统不是标准引导方式,需回到系统层面排查。

4.2 软件选型安装链(find → info → install → list)

场景:装一个新软件的标准链路。以 hello 系列为例:

$ snap find hello 2>&1 | head -8
Name                    Version               Publisher           Notes  Summary
hello                   2.10                  canonical**         -      GNU Hello, the "hello world" snap
hello-world             6.4                   canonical**         -      The 'hello-world' of snaps
hello-nginx             2.2.0                 carlos-bravo        -      Zero-config nginx web server for developers, listening on port 8080
hello-pasman            0.25                  pasman1             -      Hello and welcome greetings.
helloworld-gui          1.5                   enjoysoftware       -      GUI version of HelloWorld - Displays the famous "Hello, world!" message
hello-lhc               1.0                   cprov               -      Hello world application for LHC☂
hello-node-snap         1.0.2                 bhdouglass          -      A simple hello world command

$ snap info hello-world 2>&1 | head -18
name:      hello-world
summary:   The 'hello-world' of snaps
publisher: Canonical**
store-url: https://snapcraft.io/hello-world
contact:   snaps@canonical.com
license:   MIT
description: |
  This is a simple hello world example.
snap-id: buPKUD3TKqCOgLEjjHx5kSiCpIs5cMuQ
channels:
  latest/stable:    6.4 2024-02-27 (29) 20.5kB -
  latest/candidate: 6.4 2024-02-27 (29) 20.5kB -
  latest/beta:      6.4 2024-02-27 (29) 20.5kB -
  latest/edge:      6.4 2024-02-27 (29) 20.5kB -

$ snap install hello-world 2>&1; echo rc=$?
error: system does not fully support snapd: cannot mount squashfs image using
       "squashfs": mount: /tmp/syscheck-mountpoint-3325652196: mount failed:
       Operation not permitted.
rc=1

$ snap list 2>&1; echo rc=$?
No snaps are installed yet. Try 'snap install hello-world'.
rc=0

解读:find 检索到目标 → info 核对发布者(Canonical**)、许可与通道版本 → install 执行。本环境 install 止步于 mount 自检(失败形态如实呈现),snap list 确认无残留;生产机上此链路终点是 snap list 表格出现 hello-world 且命令可直接运行。选型环节的两个关键核对点:发布者星标与 stable 通道版本。

4.3 变更审计(changes)

场景:核查 snap 体系近期做过什么(装过什么、何时刷新过、有没有失败记录):

$ snap changes; echo rc=$?
ID   Status  Spawn               Ready               Summary
1    Done    today at 22:29 UTC  today at 22:29 UTC  Initialize system state

rc=0

解读:当前仅有一条系统初始化变更,状态 Done。生产机上这里会出现 install/refresh/remove 的完整历史;Status 为 Error 的条目即故障现场,用 snap change <ID> 下钻任务明细,必要时 snap abort <ID> 中止卡住的变更。

4.4 安装失败排障三板斧

场景:snap install 报 system does not fully support snapd 时的检查顺序——先内核模块、再 daemon、再环境:

$ modprobe squashfs 2>&1; echo rc=$?
rc=0

$ lsmod | grep squashfs; echo rc=$?
rc=1

$ snap version
snap          2.76.3+ubuntu22.04.1
snapd         2.76.3+ubuntu22.04.1
series        16
ubuntu        22.04
kernel        6.8.0-138-generic
architecture  amd64

解读:modprobe squashfs 返回 0 说明内核已内建(或已加载)squashfs 支持——内建模块不会出现在 lsmod 中,所以第二条 grep 无命中属正常;snap version 完整说明 daemon 在位。三板斧过后仍失败,则问题指向 mount 权限层面(本环境即如此:Operation not permitted)。生产服务器上一般不会遇到,多为受限的专用系统形态。

五、注意事项与常见问题

Q1:snapd unavailable / cannot communicate with server 怎么处理? 两者同源:snapd 守护进程没有在运行(3.1/3.2 节实测形态)。处理顺序:systemctl status snapd 看状态 → systemctl start snapd 拉起 → 仍失败查 journalctl -u snapd。socket 文件在 /run/snapd.socket,daemon 启动即创建。

Q2:error: system does not fully support snapd: cannot mount squashfs image ... Operation not permitted? snapd 自检(试挂载 squashfs)未通过。检查顺序:modprobe squashfs(内核支持)、snap version(daemon 版本)、系统层 mount 权限。本文实测环境属于 mount 受限形态(3.5 节实录);标准 Ubuntu 桌面/服务器内核与权限齐备,不会出现此错。

Q3:snap 和 apt 什么关系?同一个软件两边都能装吗? 两套独立体系:apt 装的是 deb(共享系统依赖、按版本仓库分发),snap 装的是 squashfs 包(自带依赖、Store 通道分发、自动刷新)。同一软件两边同名的情况不少(如 coreutils 与若干 CLI 工具),PATH 中 /snap/bin 与 /usr/bin 的先后决定实际命中哪一个,可用 which 命令名 确认。生产上建议一类软件固定一个来源,避免混装冲突。

Q4:snap 会自己升级吗?能关吗? 会。snapd 默认每日定时(refresh.timer)自动刷新全部 snap,这是与 deb 生态最大的行为差异之一。可用 snap refresh --time 查看刷新计划,snap hold 系列(Ubuntu 22.04 的 snapd 已支持 snap refresh --hold 包名)暂停指定包的自动刷新;不过 hold 属刷新策略,与本文实测的 install/refresh 主线无冲突。

Q5:snap list 的 Notes 列里的 -、- 与 disabled 都是什么意思? Notes 常见标记:- 无特殊标记;classic 表示以非沙箱方式安装(需 --classic,常见于 IDE 类);disabled 表示该版本已回退但保留(revert 后旧版本行会这样显示)。本环境未装包,表格形态未实测,此处仅说明字段含义供对照。

Q6:安装 snap 需要 root 吗? 需要 root 或 sudo 组成员——install/refresh/remove 都要操作挂载与系统目录,属特权操作;find/info/version/list 只读,普通用户即可。

六、参考链接