Snappy Ubuntu 入门

241 阅读14分钟

在这篇文章中,我们将介绍Snappy Ubuntu的一些基本知识.我们将介绍如何在我们的电脑上安装KVM,并利用它来学习Snappy的一些基本的命令.在前面的文章" 到底Snappy Ubuntu是什么?"中,我们已经介绍了Snappy Ubuntu的一些最基本的知识.

Snappy Ubuntu Core 是Ubuntu的定位于物联网(IOT)互联网一个新的演绎。Snappy Ubuntu Core典型地运行于一个无屏幕的诸如家庭网关,机器人,开发板或一个VM。这个设备被称为目标。这是你想要编写的应用程序和部署应用程序的设备。用于编写和构建代码的计算机被称为开发主机.\

\

1)安装自己的开发的Ubuntu开发主机

\

\

我们可以选用 Ubuntu 14.04 LTS作为我们开发主机的操作系统.当然我们也可以采用最新Ubuntu系统,比如 15.04,或15.10作为桌面系统.一旦安装好我们的系统后,我们打开一个Terminal (Ctrl + Alt + T),并在Terminal中输入如下的命令来得到最新的开发工具来开发Snappy系统.

$ sudo add-apt-repository ppa:snappy-dev/tools
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install snappy-tools bzr snapcraft


通过上面的命令,我们可以得到如下的工具:

  • snappy build - make snap packages out of a file hierarchy
  • snappy-remote - run snappy operations on remote snappy target by IP
  • snapcraft - the snap build tool for all snaps
  • ubuntu-device-flash - image creation tool for snappy ubuntu

\

开发者可以在连接找到 snapcraft的源码,并可以在里面的 examples查看各种语言的例程.

\

\

2)本地启动一个Snappy Ubuntu Core 实例 - KVM

\

\

当前的Ubuntu Core可作为KVM虚拟机。在我们的Ubuntu的开发主机上,通过Terminal加入如下的指令来安装KVM,并检测你的电脑是否支持运行虚拟机.

\

$ sudo apt-get install qemu-kvm
...say yes and install the packages...

\

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

\

如果你看见上面的结果,那么我恭喜你啦!这是最好的结局 - 这意味着Snappy将在你的系统运行速度快,并充分利用硬件加速。如果KVM不支持您的系统上,我们建议您尝试Ubuntu的核心在云上运行.


接下来,下载Ubuntu的核心下列发布,它是一个大约100MB的压缩图像:

$ wget http://releases.ubuntu.com/15.04/ubuntu-15.04-snappy-amd64-generic.img.xz
$ unxz ubuntu-15.04-snappy-amd64-generic.img.xz


现在,您可以启动该虚拟机KVM:

$kvm -m 512 -redir :8090::80 -redir :8022::22 -redir :4200::4200  ubuntu-15.04-snappy-amd64-generic.img 

\

在这里,虚拟机的口地址我们已经做了重定向:

\

-8090 本地端口将指向虚拟机中的80口 (web server)

-8022 本地端口将指向虚拟机中的22口 (ssh)

-4200 本地端口将指向虚拟机中的4200口 (webdm) 

\

\

\

在使用QEMU时,如果我们想切换回我们的桌面时,我们需要使用"Ctrl + Alt"键组合来得到鼠标或键的Focus.


你应该看到一个窗口弹出来,在里面你的Ubuntu核心的虚拟机正在启动。一旦它给你一个登录提示.注意登陆的用户名及密码是ubuntu/ubuntu.你可以直接在本地,重定向端口窗口或SSH连接到虚拟机登录(我们映射虚拟机的SSH端口连接到你的笔记本电脑不同的本地端口):

$ ssh -p 8022 ubuntu@localhost

\

如果上面的命令不成功,我们可以使用如下的命令来完成:

$ ssh -p 8022 ubuntu@127.0.0.1

\

对于此预览版,我们已经硬编码了一个用户“ ubuntu”及密码“ ubuntu”。在云中,你会如果你希望能够登录到它在所有指定的用户名和SSH密钥到机器的安全访问。因此,继续前进,并登录到虚拟机,并欢迎来到一个崭新的Snappy Ubuntu!为了能够部署我们的应用到KVM中去,我们必须能够建立ssh连接,所有这一步的成功完成是非常重要的.\

\

\

3)Snappy Ubuntu的基本命令

\

\

让我们来看看感觉如何通过Snappy的方式来做一些事情。您需要登录到你的Ubuntu核心的实例来尝试这些命令,他们不会在一个传统的apt-get或者deb的Ubuntu系统工作!

我们将通过检查我们是哪个版本的Ubuntu core开始。

$ snappy info
release: ubuntu-core/15.04/stable
architecture: armhf
frameworks:
apps:


这是一个最原始的系统,没有框架,没有最新安装的的应用。 “release”告诉你,你正在运行最新的Ubuntu核心的稳定版本。我们可以根据我们的需求从 image channel中安装我们的Image.需要注意的是在未来,我们也会有LTS Ubuntu Core。

$ snappy list -v       


\

\

我们可以通过这个版本查看到我们系统里安装的Components.这里*表示目前正在运行的版本.当我们安装一个新版本后,只有重新启动后,新版本才可以起作用.

\

因为这是一个Snappy系统,在Ubuntu桌面系统的那套安装及跟新的指令将不能正常工作:

$ apt-get update
Ubuntu Core does not use apt-get, see 'snappy --help'
$ sudo apt-get install docker
Ubuntu Core does not use apt-get, see 'snappy --help'


现在让我们看一下有没有最新的系统软件及在系统已经安装的软件.我们可以使用这个命令的update选项来检查Snappy Store里有没有最新的软件.

$snappy list -uv


\

\

\

我们可以通过如下的命令来安装一个应用:

$ sudo snappy install fizzler
Installing fizzler
fizzler failed to install: snappy package not found

\

如果我们想查看所有的包,我们可以通过如下的方法来查看:

$ snappy search "" | grep "docker"

\

一个空字符 "" 可以用来搜寻所有的包.\


我们可以通过如下的命令来搜索docker包

$ snappy search docker
Name   Version   Summary 
docker 1.6.0.002 Docker  

\

看起来,我们已经找到一个docker的包,我们使用如下的命令来进行安装:

$ sudo snappy install docker
Installing docker
Starting download of docker
8.36 MB / 8.36 MB [===========================================================] 100.00 % 419.70 KB/s 
Done
Name        Date       Version   Developer 
ubuntu-core 2015-06-11 3         ubuntu    
docker      2015-06-11 1.6.1.002           
beagleblack 2015-06-11 1.7.1      


让我们在显示一下我们的系统安装的Components:

$ snappy list
Name        Date       Version   Developer 
ubuntu-core 2015-06-11 3         ubuntu    
docker      2015-06-11 1.6.1.002           

\

上面显示我们已经安装好一个docker的Component.

\

我们也可以通过如下的方法来安装一个hello-world的snap:

$ sudo snappy install hello-world
Installing hello-world.canonical
Starting download of hello-world.canonical
32.73 KB / 32.73 KB [=========================================================] 100.00 % 617.46 KB/s 
Done
Name        Date       Version   Developer 
ubuntu-core 2015-06-11 3         ubuntu    
docker      2015-06-11 1.6.1.002           
hello-world 2015-06-11 1.0.17    canonical              

\

让我们重新来看一下我们的系统信息:

$ snappy info
release: ubuntu-core/15.04/stable
architecture: armhf
frameworks: docker
apps: hello-world


从这里我们可以看出来,docker是一个framework,而hello-world是一个应用(app).这个两个都是通过snap包进行安装的.framework是用来拓展系统的,它有自己的security profile.所有安装的app都是是隔离的,不可以访问彼此的空间.

\

如法炮制,我们也可以安装自己的web server:

$ snappy search webserver
Name                 Version Summary              
go-example-webserver 1.0.7   go-example-webserver     
xkcd-webserver       0.5     xkcd-webserver       


这是一个用golang写的webserver.我们可以在接下来的章节中介绍如何下载这个snap的源码.

\

下面,我们来介绍一下如何更新我们的Ubuntu-core系统:

$ sudo snappy update ubuntu-core
Installing ubuntu-core (4)
Syncing boot files
Starting download of ubuntu-core
8.81 KB / 8.81 KB [==========================================] 100.00 % 463 B/s
Apply done
Updating boot files
8.81 KB / 8.81 KB [==========================================] 100.00 % 412 B/s
Done
Name        Date       Version Developer
ubuntu-core 2015-06-11 4       ubuntu!   
Reboot to use the new ubuntu-core.

\

通过上面的命令,我们可以更新我们的ubuntu-core系统.系统更新允许我们有2个或更多的ubuntu-core build同时存在.

$ snappy list -v
Name        Date       Version   Developer  
ubuntu-core 2015-06-11 3         ubuntu*    
ubuntu-core 2015-06-11 4         ubuntu!    
docker      2015-06-11 1.6.1.002 *          
hello-world 2015-06-11 1.0.17    canonical*         
Reboot to use the new ubuntu-core.


我们可以看到有两个ubuntu-core存在于系统中.当前正在使用的有一个 *****号来表示的.我们可以通过重新启动来启用最新的安装的ubuntu-core.

\

$ sudo reboot


重新启动系统后,我们在来看一下我们的系统:

$ snappy list -v
Name        Date       Version   Developer  
ubuntu-core 2015-06-11 4         ubuntu*    
ubuntu-core 2015-06-11 3         ubuntu     
docker      2015-06-11 1.6.1.002 *          
hello-world 2015-06-11 1.0.17    canonical*          


我们看到ubuntu-core已经跟新到最新的版本.如果我们想回到(rollback)以前的版本,我们可以使用如下的命令:

\

$ sudo snappy rollback ubuntu-core
Setting ubuntu-core to version 3
Name        Date       Version Developer
ubuntu-core 2015-06-11 2       ubuntu!   
Reboot to use the new ubuntu-core.

\

$ snappy list -v
Name        Date       Version   Developer  
ubuntu-core 2015-06-11 4         ubuntu*    
ubuntu-core 2015-06-11 3         ubuntu!    
docker      2015-06-11 1.6.1.002 *          
hello-world 2015-06-11 1.0.17    canonical*
beagleblack 2015-06-11 1.7.1     *          
Reboot to use ubuntu-core version 3 .

\

$ sudo reboot

\

我们看到ubuntu-core已经回到先前的版本了!

如何开发者想知道更多关于snappy命令的信息, 可以在命令行中打入如下的命令:

$snappy --help

或者:

$snappy -h

\

\

如果你想更多地了解每个命令的具体的帮助:

$snappy rollback -h


你将看到如下的帮助信息:

\

\


\

通过上面的帮助信息,我们可以对该命令有更多的认识.比如:

(amd64)ubuntu@localhost:~$ snappy list -v
Name          Date       Version      Developer  
ubuntu-core   2015-11-13 10           ubuntu*    
ubuntu-core   2015-10-23 9            ubuntu     
hello-world   2015-11-03 IEYVCgYIIDJe sideload   
hello-world   2015-11-03 IEYVDLXLHXJD sideload*  
hello-xiaoguo 2015-11-05 IEeNDQQRGSGL sideload   
hello-xiaoguo 2015-11-05 IEeNEfBRVYGe sideload*  
pastebinit    2015-11-02 1.4.0.0.2    mvo*       
webcam        2015-11-14 IFUaQLgTUKSU sideload*  
webdm         2015-10-23 0.9.2        canonical* 
generic-amd64 2015-10-23 1.4          canonical* 

\

我们想把我们的hello-word rollback到我们的另外一个先前的版本" IEYVCgYIIDJe",我们可以通过如下的命令来实现:

(amd64)ubuntu@localhost:~$ sudo snappy rollback hello-world IEYVCgYIIDJe
Setting hello-world to version IEYVCgYIIDJe
Name        Date       Version      Developer 
hello-world 2015-11-03 IEYVCgYIIDJe sideload* 
(amd64)ubuntu@localhost:~$ snappy list -v
Name          Date       Version      Developer  
ubuntu-core   2015-11-13 10           ubuntu*    
ubuntu-core   2015-10-23 9            ubuntu     
hello-world   2015-11-03 IEYVCgYIIDJe sideload*  
hello-world   2015-11-03 IEYVDLXLHXJD sideload   
hello-xiaoguo 2015-11-05 IEeNDQQRGSGL sideload   
hello-xiaoguo 2015-11-05 IEeNEfBRVYGe sideload*  
pastebinit    2015-11-02 1.4.0.0.2    mvo*       
webcam        2015-11-14 IFUaQLgTUKSU sideload*  
webdm         2015-10-23 0.9.2        canonical* 
generic-amd64 2015-10-23 1.4          canonical* 

通过上面我们可以看到,我们已经把hello-world应用rollback到我们想要的版本"IEYVCgYIIDJe"了.
\

就像我们先前所说的一样,每个Ubuntu core含有两个root filesystem A和B.我们可以通过如下的命令来得到到底是那个分区:

$sudo grub-editenv list
snappy-mode=regular
snappy_ab=b


目前在KVM中,我们很难拷贝及粘贴,我们可以通过如下的方法.在KVM target中:

\

$snappy install pastebinit.mvo


安装完后,为我们就可以用如下的命令来输出一个可以在我们浏览器中的url:

\

cat /boot/grub/grub.cfg|pastebinit.pastebinit 

\

另外一个技巧是使用ssh登陆到我们的KVM中,这样,我们就可以自由地拷贝我们所需要的东西了.

\

$ ssh -p 8022 ubuntu@localhost


这里的8022口是我们重定向的KVM中的22口.

\

\

\

从上面我们可以看出来,我们可以选择我们所需要的内容进行自由地拷贝.

\

我们可以通过如下的service命令来查看目前在Snappy系统中正在运行的services:

\

$ snappy service status
Snap		Service		State
glowapi2	glowapi2	enabled; loaded; active (running)
port-listener	port-listener	enabled; loaded; active (running)
webdm		snappyd		; not-found; inactive (dead)
webdm		snappyd		enabled; loaded; active (running)


在上面显示我们已经在运行几个services,它们在系统启动时就开始运行了.我们在这里也可以看到目前运行的状态,我们也可以通过如下的方式来查看我们service的状态:

\

# Show status of all services for a particular snap
$ snappy service status SNAPNAME
...
# Show status of a given service for a particular snap
$ snappy service status SNAPNAME SERVICENAME


我们可以通过service start/stop/restart 命令来启动或关掉一个服务:

\

$snappy service status
Snap		Service		State
glowapi2	glowapi2	enabled; loaded; active (running)
port-listener	port-listener	enabled; loaded; active (running)
webdm		snappyd		; not-found; inactive (dead)
webdm		snappyd		enabled; loaded; active (running)
$ sudo snappy service port-listener stop
Waiting for glowapi_glowapi_0.1.2.service to stop.
Waiting for glowapi2_glowapi2_IETOPLPFaBXK.service to stop.
Waiting for port-listener_port-listener_IERSNIVOKWSF.service to stop.
unable to stop webdm's service snappyd: [stop webdm_snappyd_0.9.3.service] failed with exit status 5: Failed to stop webdm_snappyd_0.9.3.service: Unit webdm_snappyd_0.9.3.service not loaded.
snappy service status
Snap		Service		State
glowapi2	glowapi2	enabled; loaded; failed (failed)
port-listener	port-listener	enabled; loaded; failed (failed)
webdm		snappyd		; not-found; inactive (dead)
webdm		snappyd		enabled; loaded; active (running)

\

我们可以看到port-listener应用的状态是 failed
\

如果我们想看到一些service在runtime的信息,我们可以通过如下的命令来得到.这对于我们调试我们的service是非常有用的:

\

(RaspberryPi2)ubuntu@localhost:~$ sudo snappy service logs | grep "Starting"
2015-11-01T02:31:18.017158Z systemd Starting The docker app deployment mechanism...
2015-11-01T02:31:18.061493Z systemd Starting Snappy WebDM...
2015-11-01T02:31:18.099741Z systemd Starting template Go snappy project...
2015-11-01T02:31:18.124886Z systemd Starting API for piglow as a service...
2015-11-01T02:31:18.150106Z systemd Starting Go websever...
2015-11-01T02:31:18.174013Z systemd Starting template Go snappy project...
2015-11-12T01:44:49.276470Z ubuntu-core-launcher 2015/11/12 01:44:49 Starting webserver on :8081
2015-11-12T01:44:49.331184Z ubuntu-core-launcher 2015/11/12 01:44:49 Starting webserver on :8082

\

在上面我们可以看到我们的webserver已经在相应的口地址8081上运行.这些输出相应于我们在我们的 代码中的输出.大家可以在我稍后的 练习中体会到.我们也使用如下的命令来更精准地显示每个service的输出信息:

(RaspberryPi2)ubuntu@localhost:~$ sudo snappy service logs go-webserver
2015-11-01T02:31:18.148438Z systemd Started Go websever.
2015-11-01T02:31:18.150106Z systemd Starting Go websever...
2015-11-12T01:44:49.276470Z ubuntu-core-launcher 2015/11/12 01:44:49 Starting webserver on :8081

这个项目的snapcraft.yaml的源码在 地址.它里面所使用的golang webserver源码在 地址

\

Snappy debugging tools

我可以安装如下的snap应用:

$ sudo snappy install snappy-debug 
(RaspberryPi2)ubuntu@localhost:~$ snappy-debug.security list
System policy:
 Policy vendor: ubuntu-core
 Policy version: 15.04
 Templates: 
  default
  unconfined
 Caps: 
  network-admin
  network-client
  network-firewall
  network-service
  network-status
  networking
  snapd
Framework policy:
 Templates: 
 Caps: 
  docker_client

\

$ snappy-debug.security scanlog

上述命令用来查看/var/log/syslog中所有的安全policy问题

\

$ sudo aa-status

上述命令用来显示在系统已经装载的所有apparmor的policy.
\

\

4)Snappy Ubuntu Store

\

\

在上面的例程中,我们已经展示了如何从命令行启动Snappy Ubuntu:

\

$ kvm -m 512 -redir :8090::80 -redir :8022::22 -redir :4200::4200  ubuntu-15.04-snappy-amd64-generic.img 


在运行上面的命令时没我们必须在snappy image所处的目录中运行该命令.在上面我们已经讲到,端口 4200是webdm (Web Device Manager)的口地址.通过上面的重定向,我们可以在我们的Desktop上打开我们的浏览器,并输入地址localhost:4200:

\

\

\

从上面,我们可以看到已经安装的应用和framework.我们也可以点击其中的应用或framework,得到他们的更详细的细节.我们也可以从这里删除他们:

\

\

\

当然,我们也可以点击上图中的"Snappy Store".这样我们可以选择我们需要的应用或framework进行安装:

\

\

\

\

我们可以从 链接来上传我们的snap应用:

\

\

\

\

\

在上传我们的应用之前,我们可以使用click review工具来检查我们的snap文件是否符号所需要的要求:

\

$ sudo apt-get install click-reviewers-tools
$ click-review webcam_1.0_armhf.snap 
webcam_1.0_armhf.snap: pass

\

如果检查没有问题,我们可以直接把我们的应用上传到我们的商店即可.

\

\

5)如何从Snappy系统外安装应用

\

\

如果我们可以使用如下的命令来安装我们的.snap应用或框架到我们的Snappy Ubuntu系统去.比如我们想安装我们的.snap应用到我们的KVM中,我们还是按照我们上面的方法来启动我们的KVM:

\

$ kvm -m 512 -redir :8090::80 -redir :8022::22 -redir :4200::4200  ubuntu-15.04-snappy-amd64-generic.img 


这里,Desktop的" 8022"口重定向到Snappy Ubuntu系统的"22"口.我们可以用如下的命令来安装我们的hello-world snap应用

\

$ snappy-remote --url=ssh://localhost:8022 install hello-world_1.0.18_all.snap

\

如果你这是第一次连接到目标系统的话,snappy-remote将会尽可能利用已有的ssh key来建立连接,以避免提示输入输入密码.

\

\

\

\

如果我们想把我们的snap应用安装到我们的一个网路上的设备的话:

\

$ snappy-remote --url=ssh://IPaddressOfDevice install hello-world.snap

\

对于我们在和我们电脑同一个网路上的设备来说,比如我们也可以使用如下的方法来安装:

\

$ snappy-remote --url=ssh://webdm.local install port-listener_0.1_multi.snap


这里,我们必须在设备上安装webdm.如果上面的方法不能稳定地工作的话,我们可以使用实际设备的IP地址来代替上面的webdm.local.

\

另外一种方式是使用scp拷贝我们的文件到我们的Snappy Ubuntu系统中,并在Snappy Ubuntu系统中进行安装我们的snap:

\

$ scp -P 8022 hello-world_1.0.18_all.snap  ubuntu@127.0.0.1:/home/ubuntu
hello-world_1.0.18_all.snap                   100%   21KB  21.0KB/s   00:00  

\

在我们的Snappy Ubuntu系统中,我们使用如下的命令来安装:

\

$ sudo snappy install --allow-unauthenticated  hello-world_1.0.18_all.snap 


\

\

在上面的图中,我们可以看到我们刚才安装的应用hello-world的 Developer显示的是sideload,表明它不是从Snappy Store里来安装的.我们也可以看到它的版本是一个虚假的版本号码.这样的好处是不需要改变metadata文件,就很轻松地迭代.

\

安装好后的应用可以在Snappy Ubuntu如下的位置找到:

/apps/name-of-snap-in-store-folder 

\

\

6)如何删除一个snap

\

\

首先,我们可以通过snappy list -v命令来查看已经被安装的snap,并使用snap remove命令来删除已经被安装的应用:

$ sudo snappy remove hello-world

\

$ snappy list -v
Name          Date       Version      Developer  
ubuntu-core   2015-09-25 2            ubuntu*    
ubuntu-core   2015-09-25 2            ubuntu     
docker        2015-11-09 1.6.2.004    canonical* 
hello-world   2015-10-31 1.0.18       canonical* 
mqtt-piglow   2015-11-02 IEWUKJCENbWA sideload*  
port-listener 2015-10-31 IERSNIVOKWSF sideload*  
webdm         2015-10-27 0.9.3        sideload   
webdm         2015-10-29 0.9.4        sideload*  
pi2           2015-09-25 0.16         canonical* 
~$ sudo snappy remove hello-world
Removing hello-world


当然,我们可以通过Snappy Store来卸载我们已经安装的snap:

\

\

\

\

7)如何运行一个Snap应用

\

\

如果我们查看一下一个snap打包时的.yaml文件,比如在 连接

\

name: mqtttestclient
version: 1
vendor: Thibaut Rouffineau <thibaut.rouffineau@canonical.com>
summary: MQTT client on Eclipse Foundation sandbox
description: This app is a small client using Eclipse Foundation MQTT client and using the Eclipse Foundation sandbox
icon: ./icons/Paho.png
binaries:
 mqttpublish: 
  exec: bin/mqttpublish

parts:
 mqtt:
  plugin: python3
  source: git://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python
 publish:
  plugin: copy
  files:
    ./bin/mqttpublish.py: bin/mqttpublish

\

在这里 name定义为"mqtttestclient", binaries被定义为"mqttpublish".当我们在Snappy Ubuntu上运用一个snap应用时,它的命令为:****

\

$ mqtttestclient.mqttpublish

\

这样做的好处是即使其它的应用的binaries和我们的应用有一样的名字,它们运行时也不会冲突,因为它的前面是有一个snap的名字作为前缀.

\

对于Snappy应用来说,有些应用被定义为service,它们的启动是由系统来启动的.当系统启动后,service会被自动启动.下面是一个service的snapcraft.yaml的 样板

name: go-webserver
vendor: XiaoGuo, Liu <xiaoguo.liu@canonical.com>
icon: go.png
version: 1.0.7
summary: Go webserver
description: This is a simple go webserver. It is a service

services:
  webserver:
    description: "Go websever"
    start: bin/golang-http
    caps:
     - network-client
     - network-service    
         
parts:
  webserver:
    plugin: go
    source: git://github.com/liu-xiao-guo/golang-http

就像上面指出的那样,它的启动方式是一个service.启动路径由"start"项指定.
\

\

8)Snappy 文件系统

\

一个Snappy系统由如下的几个分区组成:

\

\

\

\

从上面可以看出来,Snappy系统具有两个只读的根文件分区.这个两个A/B分区是用来支撑我们的rollback功能的.我们可以通过我们上面学的"snappy list -v"命令来查看到到底是那个ubuntu core正在使用.通过使用"snappy update"命令来更新我们的ubuntu core.这两个分区是不可以修改的.目前,自动更新的功能正在开发.它可以使得我们的系统永远保持最新的状态.这个功能在默认的情况下是关掉的,如果你想打开这个功能的话,可以参阅文章 autopilot

\

\

每个应用在Snappy Ubuntu中都是处于一个沙箱之中的.彼此之间是不可以互相访问的.每个应用都有自己的独立的控件.在系统中只有三个地方是可以写的:

\

  1. /var/lib/apps: 这个目录是由系统来填写应用的配置文件的
  2. /apps: 这个是我们安装的snap应用文件目录
  3. /home/username/apps: 在我们测试的系统中,目前username就是ubuntu.这个目录是每个应用用来存储自己的文件的地方

\

每个snap包都会按照自己版本安装于自己独立的文件目录;每个snap包不会覆盖任何其它的snap所安装的文件或不同版本的snap;每个snap只能自己特定的读写的区域,这是由apparmor来及通常的沙箱机制来完成的.

\

\

\

\

\

在我们的实际编程中,我们可以使用如下的两个环境变量来得到我们应用相关的路径名称

\

$SNAP_APP_PATH = /apps/<app-name>/<version>/
$SNAP_APP_DATA_PATH = /var/lib/apps/<app-name>/<version>/

\

这样避免我们需要硬编码来设置我们应用的路径.如果我们想看到更多的关于环境变量的内容,我们可以在Snappy Store中安装hello-world,并在命令行输入一下命令:

\

$ hello-world.env | grep SNAP
SNAP_APP_PATH=/apps/hello-world.sideload/IEYVDLXLHXJD
SNAP_ORIGIN=sideload
SNAP_APP_USER_DATA_PATH=/home/ubuntu/apps/hello-world.sideload/IEYVDLXLHXJD
SNAP_FULLNAME=hello-world.sideload
SNAPP_OLD_PWD=/home/ubuntu
SNAPPY_APP_ARCH=amd64
SNAPP_APP_USER_DATA_PATH=/home/ubuntu/apps/hello-world.sideload/IEYVDLXLHXJD
SNAPP_APP_DATA_PATH=/var/lib/apps/hello-world.sideload/IEYVDLXLHXJD
SNAPP_APP_TMPDIR=/tmp
SNAP_NAME=hello-world
SNAP_APP_TMPDIR=/tmp
SNAP_OLD_PWD=/home/ubuntu
SNAPP_APP_PATH=/apps/hello-world.sideload/IEYVDLXLHXJD
SNAP_ARCH=amd64
SNAP_VERSION=IEYVDLXLHXJD
SNAP_APP_DATA_PATH=/var/lib/apps/hello-world.sideload/IEYVDLXLHXJD


我们可以看到:所有的snap相关的环境变量值都以" SNAP"开头的.如果你想体验一下snap中的沙箱,你可以在命令行中输入hello-world.sh.

\

\

如果你想对如果打包一个Snappy的应用,请参阅文章" 利用snapcraft为我们的Snappy Ubuntu应用打包

\

\

9)如何安装一个包到系统的文件系统中去

\

\

Snappy Ubuntu的系统是可读的.但是有时我们需要修改这个系统,并安装一些我们需要的包到系统中去测试或其它的一些原因,我们可以通过如下的方式做.首先我们把系统的文件系统设为可写:

\

$ sudo mount -o remount,rw /

\

然后,我们通过dpkg -i的方式来安装一个我喜欢的包,比如nano.我们可以在desktop上下载它的包,并把包存于到我们设备的卡里去或放到kvm的目录里:

\

wget ports.ubuntu.com/pool/main/n…\

\

在我们的Snappy系统中,执行:

\

$ sudo dpkg -i *.deb


这样这个包就会被成功安装.具体的细节可以参阅" how-to-connect-wifi-network-from-raspberry-pi-2-snappy".

\

\

10)如何查看一个snap包的内容:

\

对于一个snap包,我们想看看它里面的内容.在没有安装的情况下,我们可以通过如下的命令来查看他里面的内容:

\

$ dpkg -c webcam-webui_1_amd64.snap
drwxrwxr-x root/root         0 2015-12-02 12:39 ./bin
-rwxr-xr-x root/root   5781872 2015-12-02 12:34 ./bin/golang-static-http
-rwxrwxr-x root/root       297 2015-11-27 16:33 ./bin/webcam-webui
-rwxr-xr-x root/root       540 2015-12-02 12:39 ./bin/webcam-webui.wrapper
drwxrwxr-x root/root         0 2015-12-02 12:39 ./etc
-rw-r--r-- root/root       449 2015-01-07 03:12 ./etc/mailcap.order
-rw-r--r-- root/root     24146 2015-01-07 03:12 ./etc/mime.types
drwxrwxr-x root/root         0 2015-12-02 12:39 ./etc/python3.4
-rw-r--r-- root/root       155 2015-03-27 07:18 ./etc/python3.4/sitecustomize.py
drwxrwxr-x root/root         0 2015-12-02 12:39 ./lib
drwxrwxr-x root/root         0 2015-12-02 12:39 ./lib/x86_64-linux-gnu
-rw-r--r-- root/root   1965440 2015-06-11 23:35 ./lib/x86_64-linux-gnu/libcrypto.so.1.0.0
lrwxrwxrwx root/root         0 2015-12-02 12:39 ./lib/x86_64-linux-gnu/libexpat.so.1 -> libexpat.so.
1.6.0
-rw-r--r-- root/root    166000 2015-08-28 23:04 ./lib/x86_64-linux-gnu/libexpat.so.1.6.0
lrwxrwxrwx root/root         0 2015-12-02 12:39 ./lib/x86_64-linux-gnu/libpng12.so.0 -> libpng12.so.0.51.0
-rw-r--r-- root/root    153936 2015-11-19 21:56 ./lib/x86_64-linux-gnu/libpng12.so.0.51.0
-rw-r--r-- root/root    395640 2015-06-11 23:35 ./lib/x86_64-linux-gnu/libssl.so.1.0.0
drwxrwxr-x root/root         0 2015-12-02 12:39 ./meta
drwxrwxr-x root/root         0 2015-12-02 12:39 ./meta/hooks
-rwxr-xr-x root/root       574 2015-12-02 12:39 ./meta/hooks/config
-rw-rw-r-- root/root     14565 2015-12-02 12:39 ./meta/icon.png
...

\

从上面我们可以看到在该snap所包含的所有的文件.它其实就是在我们在编译我们的项目中的snap目录下的内容.

\

\

11)如何显示目前已经支持的security policies

\

我们在Snappy ubuntu下,加入如下的命令:

$ sudo snappy install snappy-debug
$ snappy-debug.security list -V ubuntu-core -i 

显示结果如下:

\

(amd64)ubuntu@localhost:~$ snappy-debug.security list -V ubuntu-core -i 
System policy:
 Policy vendor: ubuntu-core
 Policy version: 15.04
 Templates: 
  default
  - Description: Allows access to app-specific directories and basic runtime
  - Usage: common
  unconfined
  - Description: Allows unrestricted access to the system
  - Usage: reserved
 Caps: 
  network-admin
  - Description: Can configure networking
  - Usage: reserved
  network-client
  - Description: Can access the network as a client
  - Usage: common
  network-firewall
  - Description: Can configure firewall
  - Usage: reserved
  network-service
  - Description: Can access the network as a server
  - Usage: common
  network-status
  - Description: Can query network status information
  - Usage: reserved
  networking
  - Description: Can access the network as a client
  - Usage: common
  snapd
  - Description: Can use snapd
  - Usage: reserved
Framework policy:
 Templates: 
 Caps: 

\

或命令:

$ snappy-debug.security list -i

\

(amd64)ubuntu@localhost:~$ snappy-debug.security list -i 
System policy:
 Policy vendor: ubuntu-core
 Policy version: 15.04
 Templates: 
  default
  - Description: Allows access to app-specific directories and basic runtime
  - Usage: common
  unconfined
  - Description: Allows unrestricted access to the system
  - Usage: reserved
 Caps: 
  network-admin
  - Description: Can configure networking
  - Usage: reserved
  network-client
  - Description: Can access the network as a client
  - Usage: common
  network-firewall
  - Description: Can configure firewall
  - Usage: reserved
  network-service
  - Description: Can access the network as a server
  - Usage: common
  network-status
  - Description: Can query network status information
  - Usage: reserved
  networking
  - Description: Can access the network as a client
  - Usage: common
  snapd
  - Description: Can use snapd
  - Usage: reserved
Framework policy:
 Templates: 
 Caps: 


\


如果一个应用没有定一任何的caps或security-template,那么它的默认的caps是 **network-client.**关于caps的使用可以参阅我的 例程

\

\

12)如何查询应用的硬件使用情况

\

有时我们希望能够知道我们系统的硬件被应用的使用的情况.我们可以通过如下的命令来查询:

\

\

(RaspberryPi2)ubuntu@localhost:~$ sudo snappy hw-info temp.sideload
temp.sideload: /dev/i2c-1


这一般来说是通过如下的命令来完成的:

\

$ sudo snappy hw-assign temp.sideload /dev/i2c-1 


\

13)技术支持

\

目前Snappy Ubuntu技术正在紧罗密布地开发.如果大家有问题的话,可以参加IRC上的在freenode上的# snappy channel.

\

\

\

上面有很多的专家在上面可以帮你解答你所提出的问题.另外,开发者也可以订购我们的mailinglist:  snappy-app-devel-request@lists.ubuntu.com来得到问题的回答. 如果你发现我们的Snappy有上面bug的话,请点击 连接 进行报告.

\

\

\


\