在最新的snapd 2.20中,它开始支持一个叫做classic模式的snap 应用开发.这种classic可以使得我们的应用开发者能够快速地开发我们所需要的应用,这是因为我们不必要对我们的现有的应用做太多的改变.在classic模式下的应用,它可以看见host系统的所有的位于"/"下的文件,就像我们目前正常的应用一样.但是在安装我们的应用后,它的所有文件将位于/snap/foo/current下.它的执行文件将位于/snap/bin目录下,就像我们目前的所有其它的snap应用一样.
当我们安装我们的classic模式下的snap应用时,我们需要使用--classic选项.在上传我们的应用到Ubuntu Core商店时,也需要人工检查.它可以看见位于/snap/core/current下的所有的文件,同时也可以对host里的任何位置的文件进行操作.这样做的目的是为了能够使得开发者快速地发布自己的以snap包为格式的应用,并在以后的开发中逐渐运用Ubuntu Core的confinement以得到完善.在目前看来,classic模式下的应用在可以遇见的将来不能够安装到all-snap系统中,比如Ubuntu Core 16.
对于classic模式的应用来说,它的"/"目录对应于host系统的"/".更多的信息可以参阅地址:http://snapcraft.io/docs/reference/confinement
安装
在开发之前,我们在desktop上安装core而不是ubuntu-core.我们可以用snap list命令来查看:
liuxg@liuxg:~$ snap list
Name Version Rev Developer Notes
core 16.04.1 714 canonical -
firefox-snap 0.1 x1 classic
hello 1.0 x1 devmode
hello-world 6.3 27 canonical -
如果你的系统里是安装的ubuntu-core的话,建议大家使用devtool中的reset-state来使得我们的系统恢复到最初的状态(没有任何安装的snap).在以后的snapd发布中,我们将不再有ubuntu-core这个snap了.
在今天的教程中,我们来做一个例程来进行将讲解:
https://github.com/liu-xiao-guo/helloworld-classic
在上面的例程中,它的snapcraft.yaml的文件如下:
snapcraft.yaml
name: hello
version: "1.0"
summary: The 'hello-world' of snaps
description: |
This is a simple snap example that includes a few interesting binaries
to demonstrate snaps and their confinement.
* hello-world.env - dump the env of commands run inside app sandbox
* hello-world.evil - show how snappy sandboxes binaries
* hello-world.sh - enter interactive shell that runs in app sandbox
* hello-world - simply output text
grade: stable
confinement: classic
type: app #it can be gadget or framework
apps:
env:
command: bin/env
evil:
command: bin/evil
sh:
command: bin/sh
hello-world:
command: bin/echo
createfile:
command: bin/createfile
createfiletohome:
command: bin/createfiletohome
listhome:
command: bin/listhome
showroot:
command: bin/showroot
parts:
hello:
plugin: dump
source: .
从上面的例程中,我们可以看出来,我们在confinement的位置定义为:
confinement: classic
这定义了我们的这个snap应用是一个classic的应用.我们安装时也必须使用--classic的选项来进行安装.细心的开发者会发现,在我们的应用中,我们没有定义任何的plug,也就是我们没有使用任何的interface.大家可以和我们的另外一个项目https://github.com/liu-xiao-guo/helloworld-demo进行比较一下.
就像我们之前所说的,我们只希望能尽快把我们的应用以snap形式发布,在classic模式下,我们暂时不考虑安全的问题.
我们可以打包我们的应用,并以如下的命令来进行安装:
$ sudo snap install hello_1.0_amd64.snap --classic --dangerous
我们的脚本showroot内容如下:
#!/bin/bash
cd /
echo "list all of the content in the root:"
ls
echo "show the home content:"
cd home
ls
当我们运行我们的应用showroot时,我们可以看到:
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ hello.showroot
list all of the content in the root:
bin core home lib media proc sbin sys var
boot dev initrd.img lib64 mnt root snap tmp vmlinuz
cdrom etc initrd.img.old lost+found opt run srv usr vmlinuz.old
show the home content:
liuxg root.ini
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ ls /
bin core home lib media proc sbin sys var
boot dev initrd.img lib64 mnt root snap tmp vmlinuz
cdrom etc initrd.img.old lost+found opt run srv usr vmlinuz.old
显然,它可以看到我们整个host系统的文件目录.这个应用时间上可以对它所看到的文件及目录进行操作.
当然,我们也可以运行evil脚本:
#!/bin/sh
set -e
echo "Hello Evil World!"
echo "This example demonstrates the app confinement"
echo "You should see a permission denied error next"
echo "Haha" > /var/tmp/myevil.txt
echo "If you see this line the confinement is not working correctly, please file a bug"
运行结果如下:
liuxg@liuxg:~/snappy/desktop/helloworld-classic$ hello.evil
Hello Evil World!
This example demonstrates the app confinement
You should see a permission denied error next
If you see this line the confinement is not working correctly, please file a bug
显然在我们没有使用interface的情况下,我们可以想其它的任何目录进行操作,并写入我们想要的数据.confinement在classic模式下不起任何的作用.对于我们开发者来说,我们只需要快速地把我的应用打包为snap即可.
最后,作为一个速成的例子,我们通过classic模式来快速地把Firefox打包为一个snap:
Firefox snapcraft.yaml
name: firefox-snap
version: '0.1'
summary: "A Firefox snap"
description: "Firefox in a classic confined snap"
grade: devel
confinement: classic
apps:
firefox-snap:
command: firefox
aliases: [firefox]
parts:
firefox:
plugin: dump
source: https://download.mozilla.org/?product=firefox-50.1.0-SSL&os=linux64&lang=en-US
source-type: tar
在这里,我们直接下载我们需要的版本,并进行打包.安装并运行我们的Firefox应用:
整个项目的源码在地址:https://github.com/liu-xiao-guo/firefox-snap