snap

Ubuntu推出的 软件管理程序(类似debian系列是apt,arch系列是pacman),跨linux的

linuxs

Install

Arch

1
2
3
4
sudo pacman -S snapd

# enable the snapd systemd service:
sudo systemctl enable --now snapd.socket

Debian (Sid only)

1
sudo apt install snapd

Ubuntu >16.04默认安装了

Fedora

1
sudo dnf install snapd

Gentoo

Install the gentoo-snappy overlay.
OpenEmbedded/Yocto
Install the snap meta layer.

openSuSE

1
2
sudo zypper addrepo http://download.opensuse.org/repositories/system:/snappy/openSUSE_Leap_42.2/ snappy
sudo zypper install snapd

start using

1
2
3
4
5
6
7
snap find hello
sudo snap install hello
hello
snap list
sudo snap refresh <snap name>
sudo snap refresh
sudo snap remove

好消息是snap每日自动在后台更新

软件默认安装的是stable版本

如果要其他版本则通过指定channel

1
2
sudo snap refresh hello --channel=beta
sudo snap refresh hello --beta

可选的channel有 stable稳定,candidate稍早于稳定版的版本,beta未完成但是一个里程碑的版本,edge每日构建的冒烟测试

版本回滚

1
sudo snap revert hello 

进阶snap用法

首先申请个账号https://login.ubuntu.com/

1
sudo snap login

登陆以后,你再使用snap就不需要sudo了,除非你执行了snap logout

可以看snap使用历史记录,以及一个历史记录的细节

1
2
3
4
snap changes
snap change <changes ID>
snap watch <changes ID>
snap abort <changes ID>

snap安装的流程

下载->验证->mount->备份老版本的一些data到另一个文件夹->The security profiles are set and snapd checks which interfaces to connect to.->添加到$PATH->设置aliases->运行snap中定义的services-> 运行snap中定义的 configure钩子

类似的可以查看refresh remove revert的过程

离线安装例子

1
2
snap download nethack
ls

会下载本身的(.snap)包以及对应(.assert)文件

直接 snap install XXXX.snap会报错 cannot find signatures

解决方案(误,如果你勇敢或疯狂 想无视assertion的install)snap install --dangerous XXXX.snap

--devmode内涵了--dangerous

正确的安装方式

1
2
snap ack XXX.assert
snap install XXX.snap

关于assert(大概了解 account-key, account, snap-declaration, snap-revision 各个部分的元数组)

1
cat XXX.assert

查看已知(即是ack 过的)

1
snap known snap-declaration snap-name=nethack

所有stable channel的是confined,相对的devmode是unconfined,意味有访问系统的权限,所以要么这个开发者是你,要么是你信任的

interfaces

先安装chuck-norris-webserver

interfaces是可插拔插槽模式

1
snap interfaces

你可以看到,chuck-norris-webserver绑定到了nextwork-bind 上,

但有一些连接的Slot是空的(如camera),这种 是认为非安全的,访问用户的摄像机

执行chuck-norris-webserver.cli 你可以看到 有一些权限访问是被拒绝了的

授权camera

1
snap connect chuck-norris-webserver:camera :camera

我们再执行snap interfaces可以看到camera被连接上了

取消连接

1
snap disconnect chuck-norris-webserver:camera

例如,服务和cli请求访问不同的接口定义:

1
2
3
4
5
6
7
8
node-service:
command: bin/chuck-norris-app
daemon: simple
restart-condition: always
plugs: [network-bind]
cli:
command: bin/chuck-norris-cli
plugs: [network, camera]

读写network,使用camera

devmode 是用于开发者的不是 devil 23333

保证devmode的不会在stable里,也就不会被snap find到

你如果要安装,可以强制–beta,–devmode,前提是你信任它

安装后你会在snap list的notes中看到 它的channel

一种看法是把它看成container式的样子,在它上面运行的未授权的看不到根目录, 重定位

--classic强制使用 未重定位的包,这种classic的包和重定位的包不兼容,这种classic的包是能够读到宿主系统的目录的

综上这么多模式虽然你可能不是开发者也可以了解一下,主要还是为开发设计的,

  1. 先用classic模式开发
  2. 再用重定位dev模式
  3. 最后用严格模式包

snaps&services的可用性,日志,状态

  1. 当一个snap被安装,意味着,该snap命令在用户$PATH中可访问
  2. snap中包括的services都被启动,它们会跟随系统启动和关闭,而启动关闭,当它们crash可以自动重启

你可以snap enable,snap restart,snap disable控制这些服务

[原来我机器上有apache,然后安了这个用来讲例子的webserver,需要先stop apache再重启这个webserver]

ll /etc/systemd/system/snap*

cat /etc/systemd/system/snap.chuck-norris-webserver.node-service.service

所以snap用的还是系统的systemd的工具来管理服务,所以可以用传统的systemctl来管理

systemctl status -l snap.chuck-norris-webserver.node-service

这里在讲systemctl就不记了

同样可以查看日志sudo journalctl -fu snap.chuck-norris-webserver.node-service

管理snap配置

snap set

snap set chuck-norris-webserver title="I can bind Chuck Norris to my will"

snap set chuck-norris-webserver port=81

这应该是看具体应用提供的key和value范围了

snap set <snap-name> key1=value1 [key2=value2...]

与set对应的就是 get,可以获取值 snap get <snap-name> key

snap run --shell chuck-norris-webserver.cli

--shell会提供一个subshell

subshell的环境env | grep SNAP

直接cd 和 touch都会无权,能够操作的是 ls $SNAP(可读 不可写),touch $SNAP_USER_DATA/foo(读+写),$SNAP_USER_COMMON (读+写)

实际路径echo $SNAP_USER_COMMON => /home/didrocks/snap/chuck-norris-webserver/common

你通过snap set配置的值在$SNAP_DATA/config

snap info chuck-norris-webserver ,相对于snap find可以看stable以及非stable的channel

这里举例如果1.0.3(–beta)版本的revision是22(–edge)

然后得到了一些反馈,修复了一些issues

作者再提交,则还是1.0.3(–beta),但revision会变化可能就成了24(–edge)

snap find --section

创建发布snap TODO

总有人想搞统一 :-)

参考

https://tutorials.ubuntu.com/tutorial/basic-snap-usage

https://tutorials.ubuntu.com/tutorial/advanced-snap-usage

https://tutorials.ubuntu.com/tutorial/create-your-first-snap