Snappy Ubuntu 入门

article/2025/8/21 21:11:08
在这篇文章中,我们将介绍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-corePolicy version: 15.04Templates: defaultunconfinedCaps: network-adminnetwork-clientnetwork-firewallnetwork-servicenetwork-statusnetworkingsnapd
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/mqttpublishparts:mqtt:plugin: python3source: git://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.pythonpublish:plugin: copyfiles:./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 serviceservices:webserver:description: "Go websever"start: bin/golang-httpcaps:- network-client- network-service    parts:webserver:plugin: gosource: 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-corePolicy version: 15.04Templates: default- Description: Allows access to app-specific directories and basic runtime- Usage: commonunconfined- Description: Allows unrestricted access to the system- Usage: reservedCaps: network-admin- Description: Can configure networking- Usage: reservednetwork-client- Description: Can access the network as a client- Usage: commonnetwork-firewall- Description: Can configure firewall- Usage: reservednetwork-service- Description: Can access the network as a server- Usage: commonnetwork-status- Description: Can query network status information- Usage: reservednetworking- Description: Can access the network as a client- Usage: commonsnapd- 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-corePolicy version: 15.04Templates: default- Description: Allows access to app-specific directories and basic runtime- Usage: commonunconfined- Description: Allows unrestricted access to the system- Usage: reservedCaps: network-admin- Description: Can configure networking- Usage: reservednetwork-client- Description: Can access the network as a client- Usage: commonnetwork-firewall- Description: Can configure firewall- Usage: reservednetwork-service- Description: Can access the network as a server- Usage: commonnetwork-status- Description: Can query network status information- Usage: reservednetworking- Description: Can access the network as a client- Usage: commonsnapd- 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的话,请点击 连接 进行报告.






http://chatgpt.dhexx.cn/article/sBHiicYv.shtml

相关文章

Linux--Ubuntu入门篇(在Ubuntu中安装软件)

1. 方法&#xff1a; &#xff08;1&#xff09;APP Store安装 &#xff08;2&#xff09;Sudo apt-get install安装法 &#xff08;3&#xff09;deb软件包安装 &#xff08;4&#xff09;自己下载源码编译安装 &#xff08;5&#xff09;其他安装方法 2. &#xff08;1&am…

Linux--Ubuntu入门篇(Ubuntu下的磁盘管理)

引言&#xff1a; U盘类型&#xff1a; FAT32 &#xff08;U盘右键属性&#xff09; 一、Ubuntu磁盘文件(在/dev中) /dev/sd* 文件&#xff0c;此类文件时磁盘设备文件&#xff0c;并不能直接访问磁盘&#xff0c;必须要将磁盘挂载到某一个目录才可以访问。&#xff08;sd* …

Linux之Ubuntu入门篇

Linux之Ubuntu入门篇 第1讲 开发电脑的选择 第2讲 VMware软件安装和虚拟机创建 第3讲 Ubuntu操作系统的安装 第4讲 Ubuntu初次体验 第5讲 虚拟机连接USB设备 第6.1讲 Ubuntu终端操作与Shell命令1 显示当前问价夹下所有文件详细信息 ls -al回跟目录 cd /显示当前路径 pwd系统信…

Linux-Ubuntu入门到精通之远程操作指令

目录 1️⃣shutdown2️⃣查看或配置网卡信息3️⃣网卡和IP地址4️⃣ifconfig5️⃣ping6️⃣远程登录和复制文件7️⃣ ssh 基础&#xff08;重点&#xff09;8️⃣域名 和 端口号9️⃣SSH 客户端的简单使用1️⃣0️⃣Windows 下 SSH 客户端的安装1️⃣1️⃣scp&#xff08;掌握&…

Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等

系列文章目录 一、Linux嵌入式学习之Ubuntu入门&#xff08;一&#xff09;基本命令、软件安装及文件结构 文章目录 系列文章目录前言磁盘文件磁盘容量查询挂载与卸载卸载手动挂载 磁盘分区补充介绍文件系统类别 前言 继续学习Ubuntu操作 磁盘文件 磁盘文件是在/dev下的&…

Ubuntu入门编写

在Ubuntu系统中编写简单程序及简单命令的使用 一&#xff0c;编写简单的hello world 命令行输入vi hello.c 编写主程序 写程序 然后使用gcc命令编译 运行./hello得到结果 二&#xff0c;在Ubuntu上写一个简单的程序与在Windows上编写 1&#xff0c;编写主程序与子程序 …

vmware安装ubuntu入门教程

1 ubuntu下载地址&#xff1a; Ubuntu 22.04.1 LTS (Jammy Jellyfish) 2 vmware下载地址&#xff1a; https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/17_0 vmware安装按照默认安装即可 3 在vmware中设置ub…

00_Ubuntu系统入门

目录 前言 一、Ubuntu系统安装 1.1 VMware15安装虚拟机不兼容&#xff0c;无法打开 1.2 Ubuntu联网问题 二、Ubuntu系统入门 2.1 Ubuntu系统初体验 2.2 Ubuntu终端操作 2.3 shell操作 2.3.1 shell简介 2.3.3 常用shell命令 2.4 APT下载工具 2.5Ubuntu 下文本编辑 …

Ubuntu入门系列

1.ubuntu软件安装 1.通过App store 安装 2.通过APT 安装 使用apt工具安装软件&#xff0c;需要sudo&#xff0c;也就是root权限 发现出现错误出现进程占用&#xff0c;。 解决办法; 安装成功 3.deb软件包安装 window 是exe ubuntu shi .deb 文件 例如安装网易云音乐 4.…

Ubuntu新手入门全攻略

Ubuntu可以说是Linux系统的一面旗帜&#xff0c;相比于大多数发行版&#xff0c;美观易用&#xff0c;具有强大的社区支持&#xff0c;因而也成为了新手入门Linux系统的一个不错选择&#xff08;再深入点的CentOS之类的就另说了&#xff09;。 笔者在尝试Ubuntu系统的时候遇到了…

MS SQL 数据库出现损坏(可疑)的修复方法

当数据库出现这种情况的时候&#xff0c;说明数据库已经出现损坏&#xff0c;需要对数据库进行修复处理&#xff1b; 1、打开数据库管理器SQL server Management Studio&#xff0c;将当前数据库实例服务停止&#xff1b; 然后找到需要修复的数据库的存放目录&#xff0c;并将.…

SQLServer数据库可疑的解决方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言方法 前言 介绍数据库可疑后的解决方法&#xff0c;原理是通过数据库deckdb语句进行检测和修复&#xff0c;亲测有效&#xff0c;操作前建议先拷出数据库实体文…

Sql Server 数据库出现“可疑”的解决办法

第一步&#xff1a; ALTER DATABASE DB_NAME SET EMERGENCY 第二步&#xff1a; ALTER DATABASE DB_NAME SET SINGLE_USER&#xff08;用时可能较久&#xff09; (ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE) 第三步&#xff1a; DBCC CheckDB (DB_N…

记一则SQL 数据库状态(可疑)(紧急)解决方案

错误信息如下&#xff1a; 可以看到数据库CStation状态为可疑&#xff0c;导致原因为服务器意外停电&#xff0c;第一次遇到这种情况&#xff0c;折腾了很久终于解决&#xff0c;记下解决方案&#xff1a; 1&#xff0c;将SQL数据库停止&#xff0c;不能停止就强制结束进程 2…

手机上的软件APP,安全吗?

点击上方蓝字关注我们 背景介绍 APP安全合规的监管机构&#xff1a;APP违法违规收集使用个人信息治理工作组(APP治理小组)、工业和信息化部信息通讯管理局(工信部)、国家移动互联网应用安全管理中心(病毒中心)、地方通信局、地方网安。 具体执行APP合规检测和产出报告的是和网安…

几个好玩的区块链app推荐

不得不承认&#xff0c;各种区块链App相继出现&#xff0c;活跃在微信群、电报群等&#xff0c;貌似很多用户都在或多或少地参与着。经别人推荐试用了几个&#xff0c;感觉还可以&#xff0c;这几个App自带“挖矿”功能&#xff0c;每天都会产生一些数字token可供领取&#xff…

(六)区块的生成、验证及挖矿

转载&#xff0c;作者&#xff1a;Alphabet_666 1. 交易的传播和验证 交易包含两部分&#xff1a;n个输入个m个输出&#xff0c;其中n>0&#xff0c;m>0 输入要花费的UTXO解锁脚本 输出UTXO&#xff08;币的数量锁定脚本&#xff09; 钱包生成交易&#xff0c;并向邻近…

如何使用API接口

API其实就是一类服务的封装。我们可以使用不同的编程语言编写API&#xff0c;开发习惯和编程语言的不同导致API风格也存在差异。常见的API有以下几种形式&#xff1a; 1、HTTP类型接口 基于HTTP协议提供的API&#xff0c;这类API常常以“网址”形式提供的&#xff0c;像现在主…

微信小程序:调用API接口

首先去果创云之类的API调用的网站找到你想调用的API 以大学查询接口为例 复制API的接口&#xff0c;然后要现在第一个&#xff1f;前面加上appkey&#xff0c;然后name可以换成变量&#xff0c;最后的10是显示的条数&#xff0c;也可以改。 最后效果是可以查询你想要查询的学校…

api接口如何有效对接

一、背景 在平时工作中&#xff0c;经常会遇到的一种场景是&#xff1a;A公司要对接B公司的API方法&#xff0c;这时&#xff0c;A公司就要阅读B公司的接口文档&#xff0c;从接口文档中找到自己需要对接的API&#xff0c;并根据接口文档的要求&#xff0c;完成编码工作&#…