Snap 是 Canonical 开发的包管理系统,默认安装于 Ubuntu 16.04 及其后的发行版本中。
优势:
- 自包含:不受限于发行版的系统库版本,且每个包之间不存在运行库依赖。
- 只读挂载:应用程序不能修改或删除,且不会污染系统应用程序或库。
- 回退:内置回退旧版本。
- 快照:内置备份和恢复应用数据。
- 版本新:相比发行版更新缓慢,其应用程序版本都比较新。
劣势主要为安装包占用较多存储空间。
以下主要以 LXD 的 snap 包为例。
一、安装 snapd
1
|
|
查看版本
1
|
|
二、安装 snap 包
为避免系统可能存在旧版本 LXD 与 snap 安装的最新版 LXD 冲突:
1
|
|
然后:
1
|
|
默认 stable
频道,也可以指定 edge
频道:
1
|
|
安装后,可切换频道。
1
|
|
相比 RPM 和 Debian 包需手动更新,snap 包将在后台自动更新。若需手动更新,则
1
|
|
snap 还能切换频道并更新
1
|
|
snap 应用程序位于 /snap/bin
,如: /snap/bin/lxd
为便于使用,可将该路径追加于 ~/.bashrc
或 ~/.zshrc
环境变量 PATH
,如:
1
|
|
下载包
1
|
|
离线安装
1 2 |
|
三、搜索包
1
|
|
也可通过浏览器在应用市场 Snapcraft 上搜索需要的包(应用)。
四、列表已安装的包
列表所有包
1
|
|
输出:
1 2 3 4 |
|
若 --all
, 则列表包的所有版本 (revision)
列表指定包
1
|
|
输出:
1 2 |
|
五、回退版本
1
|
|
若遇到当前版本bug,则可考虑回退程序。当前跟踪的 channel 不会因上一版本源于不同 channel 而改变。
snap refesh
不会更新已回退的包,除非指定包名,如:snap refresh lxd
- 新版本发布,将继续自动更新已回退的包。
六、卸载 snap 包
1
|
|
卸载旧版本(释放空间)。
1
|
|
七、启用/禁用 snap 包
为避免卸载和重装而禁用:
1
|
|
反之:
1
|
|
八、服务
列表
1
|
|
输出:
1 2 3 |
|
启动、停止和重启
1 2 3 |
|
停止服务,并禁用自动启动:
1
|
|
开始服务,并启用自动启动:
1
|
|
查看日志
1 2 3 |
|
九、快照
创建
1
|
|
输出:
1 2 3 4 |
|
或指定包
1
|
|
若 --no-wait
, 则后台运行。
列表
1
|
|
或指定Set ID
1
|
|
校验
1
|
|
还原
1
|
|
删除
1
|
|
十、剖析
包的安装
相比 RPM 和 Debian 等传统安装包,通过解开来安装。
存于 /var/lib/snapd
,格式为 squashfs 的 snap 包,不直接解开,而是(只读)挂载至 /snap/<snapname>/<revision>
目录。如:
lxd
的 revision 14890 的包存储于 /var/lib/snapd/snaps/lxd_14890.snap
:
1
|
|
发现:
1
|
|
另外, /snap/<snapname>/current
为当前版本挂载点,它为指向 /snap/<snapname>/<revision>
的符号链接。
而且,每个 snap 包含了不依赖系统库的完整的运行时库。
包的缓存
snap 为了加速二次安装,首次安装会将 snap 包缓存至 /var/lib/snapd/cache
。
目前为止, snap 未提供命令清楚缓存。若需 释放空间 ,须手动删除该目录中的文件。
包的运行数据
/var/snap
存储每个包的运行数据(或元数据)。如:/var/snap/lxd
主要为 lxd 的元数据。
该目录或将消耗大量的存储空间,因受制于 AppArmor ,不能通过移动目录(至另外分区)和符号链接来释放空间,须 mount --bind
移动的目录。
包的应用程序
/snap/bin
存储指向包的应用程序(符号链接),如:
1
|
|
看到 lxd
仅为 snap
的符号链接
1
|
|
快照
每个包快照用独立的 zip 文件存储,包含:
meta.json
: 描述快照内容、配置和校验码。archive.tgz
: 包含系统数据。user/<username>.tgz
: 包含每个系统的用户数据。
快照存储于 /var/lib/snapd/snapshots