Snap是Ubuntu母公司Canonical于2016年4月发布Ubuntu16.04时候引入的一种安全的、易于管理的、沙盒化的软件包格式,与传统的dpkg/apt有着很大的区别。
Snap可以让开发者将他们的软件更新包随时发布给用户,而不必等待发行版的更新周期;其次Snap应用可以同时安装多个版本的软件,比如安装Python2.7和Python3.3。
0X02 基础常用操作 #查询已经安装了的软件sudo snap list#搜索要安装的Snap软件包sudo snap find xxxx#查看Snap软件的更多信息sudo snap info xxxx#安装Snap软件包sudo snap install xxxx#更换软件安装通道sudo snap switch –channel=xxxx xxxx#更新Snap软件包sudo snap refresh xxxx#还原到之前版本sudo snap revert xxxx#卸载Snap软件sudo snap remove xxxx当然光靠命令你想搜索什么snap软件包也是一头雾水吧!可以去uappexplorer里查询下,有什么snap软件包呢!喜欢的就都安装上。
#Uappexplorer
https://uappexplorer.com/snaps
0x03 将软件打包为Snap软件Snapcraft是用来构建snaps的软件,他使用也非常的简单,我们仅仅需要写一个snapcraft.yaml的配置文件即可。接下来就用Snapcraft打包一下GNU项目里的hello和bash。先从hello开始。
由于Ubuntu 18.04LTS中已经安装有Snapcraft了,我们就不需要在去apt安装了。可以直接开始打包我们的snap软件。
0X0301 初始打包1.创建一个打包snap的目录hello。
mkdir hellocd hello2.初始化snapcraft。
snapcraft init3.使用vim编辑配置文件snapcraft.yaml。
vim snap/snapcraft.yaml将其修改为以下内容。
name:描述这个snap软件的名称
version:描述这个软件的版本,可以用ascii码。
summary:对软件的一个总结。
Description:对软件进行一个描述。
grade:软件的发行通道。
confinement:对软件做一个限制,如devmode或者strict。
之后按照格式定义以下parts。
其中source表示打包软件的来源,plugin表示此软件安装时候需要的一些依赖关系,使用autotools即可。
4.编译snap打包软件。
snapcraft
由于我们的source需要从GNU的ftp服务器上下载程序,待下载好后,其会自动打包编译。
5.之后进行测试安装。
sudo snap install --devmode hello2.10amd64.snap可以通过snap list查看是否安装成功,注意看Notes部分,其为devmode。
6.进行测试,输入hello命令。
神马??竟然抱错了。当然你肯定会想用which hello进行检查。不过我可以告诉你答案,hello的二进制文件在/snap/仁爱的台灯里,是不是明白哪里出问题了?
0X0302 Snap全局命令我们已经知道了为什么hello不能成为全局命令了,当然也还是只能通过修改snapcraft.yaml配置文件来使之成为全局命令。
1.修改snapcraft.yaml,添加一个apps部分,使命令hello指向仁爱的台灯/hello即可。
2.迭代你的snap打包软件。
snapcraft prime3.之后再次尝试hello命令,终于生效了。
0X0303 Snap打包进阶1.为了让我们的snap更有意思一点,我们添加一个新的parts和apps。
2.之后我们重新执行。
Snapcraft prime毫无疑问你肯定会报错失败。为什么呢??因为gnu-hello和gnu-bash两个不同的parts都将定向到了一个share/info/dir里,这里就发生了冲突。
3.其实在执行snapcraft的时候,类似于执行./configure,这里只用给./configure一个参数即可。那么snapcraft.yaml配置文件可以这么修改。
这相当于将—infodir=/var/bash/info作为一个参数传递给了./configure。
3.之后重新编译。
snapcraft clean gnu-bash -s build这里的clean只是相当于重新构架了一下gnu-bash,并不需要重新下载gnu-bash,当然可以snapcraft成功了。
4.之后重新测试。
sudo snap try --devmode prime5.之后再次测试hello和hello.bash命令,看看是否能进入这个子shell。
之后通过env查询当前的环境,确认进入子shell,要退出的话,按q哦!
删除devmode
之前通过snap list可以看出Notes部分标记hello为devmode,既然我们都测试完毕了,那么是时候改为strict了。
1.修改配置文件snapcraft.yaml。
将devmode修改为strict;其实也可以将grade后面的devel修改为stable了。
2.再次snapscraft一下。
3.你可以尝试安装它。
sudo snap install hello2.10amd64.snap不出意外会报错:error: cannot find signatures with metadata for snap "hello2.10amd64.snap"。
4.为什么会报错呢?是由于我们的软件没有经过Snap Store签名,而之前的安装是因为是devmode所以可以被安装,因而要在本地安装非devmode的snap时候,需要加入—dangerous选项。
之后snap打包后的hello即可被安装,在通过snap list看一下,Notes部分已经没有devmode的字样了。而程序也可以正常的运行。
节选自:https://www.linuxidc.com/Linux/2018-06/152993.htm