snap
Ubuntu推出的 软件管理程序(类似debian系列是apt,arch系列是pacman),跨linux的
Install
Arch
1 | sudo pacman -S snapd |
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 | sudo zypper addrepo http://download.opensuse.org/repositories/system:/snappy/openSUSE_Leap_42.2/ snappy |
start using
1 | snap find hello |
好消息是snap每日自动在后台更新
软件默认安装的是stable版本
如果要其他版本则通过指定channel
1 | sudo snap refresh hello --channel=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 | snap changes |
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 | snap download nethack |
会下载本身的(.snap)包以及对应(.assert)文件
直接 snap install XXXX.snap
会报错 cannot find signatures
解决方案(误,如果你勇敢或疯狂 想无视assertion的install)snap install --dangerous XXXX.snap
注--devmode
内涵了--dangerous
正确的安装方式
1 | snap ack XXX.assert |
关于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 | node-service: |
读写network,使用camera
devmode 是用于开发者的不是 devil 23333
保证devmode的不会在stable里,也就不会被snap find到
你如果要安装,可以强制–beta,–devmode,前提是你信任它
安装后你会在snap list的notes中看到 它的channel
一种看法是把它看成container式的样子,在它上面运行的未授权的看不到根目录, 重定位
--classic
强制使用 未重定位的包,这种classic的包和重定位的包不兼容,这种classic的包是能够读到宿主系统的目录的
综上这么多模式虽然你可能不是开发者也可以了解一下,主要还是为开发设计的,
- 先用classic模式开发
- 再用重定位dev模式
- 最后用严格模式包
snaps&services的可用性,日志,状态
- 当一个snap被安装,意味着,该snap命令在用户$PATH中可访问
- 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