Snappy Ubuntu 入门

在这篇文章中,我们将介绍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 http://ports.ubuntu.com/pool/main/n/nano/nano-udeb_2.2.6-3_armhf.udeb

在我们的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的话,请点击 连接 进行报告.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值