在这篇文章中,我们将介绍Snappy Ubuntu的一些基本知识.我们将介绍如何在我们的电脑上安装KVM,并利用它来学习Snappy的一些基本的命令.在前面的文章"
到底Snappy Ubuntu是什么?"中,我们已经介绍了Snappy Ubuntu的一些最基本的知识.
我们可以选用 Ubuntu 14.04 LTS作为我们开发主机的操作系统.当然我们也可以采用最新Ubuntu系统,比如 15.04,或15.10作为桌面系统.一旦安装好我们的系统后,我们打开一个Terminal (Ctrl + Alt + T),并在Terminal中输入如下的命令来得到最新的开发工具来开发Snappy系统.
通过上面的命令,我们可以得到如下的工具:
开发者可以在连接找到 snapcraft的源码,并可以在里面的 examples查看各种语言的例程.
当前的Ubuntu Core可作为KVM虚拟机。在我们的Ubuntu的开发主机上,通过Terminal加入如下的指令来安装KVM,并检测你的电脑是否支持运行虚拟机.
如果你看见上面的结果,那么我恭喜你啦!这是最好的结局 - 这意味着Snappy将在你的系统运行速度快,并充分利用硬件加速。如果KVM不支持您的系统上,我们建议您尝试Ubuntu的核心在云上运行.
接下来,下载Ubuntu的核心下列发布,它是一个大约100MB的压缩图像:
现在,您可以启动该虚拟机KVM:
在这里,虚拟机的口地址我们已经做了重定向:
-8090 本地端口将指向虚拟机中的80口 (web server) -8022 本地端口将指向虚拟机中的22口 (ssh) -4200 本地端口将指向虚拟机中的4200口 (webdm)
在使用QEMU时,如果我们想切换回我们的桌面时,我们需要使用"Ctrl + Alt"键组合来得到鼠标或键的Focus.
你应该看到一个窗口弹出来,在里面你的Ubuntu核心的虚拟机正在启动。一旦它给你一个登录提示.注意登陆的用户名及密码是ubuntu/ubuntu.你可以直接在本地,重定向端口窗口或SSH连接到虚拟机登录(我们映射虚拟机的SSH端口连接到你的笔记本电脑不同的本地端口):
如果上面的命令不成功,我们可以使用如下的命令来完成:
对于此预览版,我们已经硬编码了一个用户“ ubuntu”及密码“ ubuntu”。在云中,你会如果你希望能够登录到它在所有指定的用户名和SSH密钥到机器的安全访问。因此,继续前进,并登录到虚拟机,并欢迎来到一个崭新的Snappy Ubuntu!为了能够部署我们的应用到KVM中去,我们必须能够建立ssh连接,所有这一步的成功完成是非常重要的.
让我们来看看感觉如何通过Snappy的方式来做一些事情。您需要登录到你的Ubuntu核心的实例来尝试这些命令,他们不会在一个传统的apt-get或者deb的Ubuntu系统工作!
我们将通过检查我们是哪个版本的Ubuntu core开始。
这是一个最原始的系统,没有框架,没有最新安装的的应用。 “release”告诉你,你正在运行最新的Ubuntu核心的稳定版本。我们可以根据我们的需求从 image channel中安装我们的Image.需要注意的是在未来,我们也会有LTS Ubuntu Core。
我们可以通过这个版本查看到我们系统里安装的Components.这里*表示目前正在运行的版本.当我们安装一个新版本后,只有重新启动后,新版本才可以起作用.
因为这是一个Snappy系统,在Ubuntu桌面系统的那套安装及跟新的指令将不能正常工作:
现在让我们看一下有没有最新的系统软件及在系统已经安装的软件.我们可以使用这个命令的update选项来检查Snappy Store里有没有最新的软件.
我们可以通过如下的命令来安装一个应用:
如果我们想查看所有的包,我们可以通过如下的方法来查看:
一个空字符 ""可以用来搜寻所有的包.
我们可以通过如下的命令来搜索docker包
看起来,我们已经找到一个docker的包,我们使用如下的命令来进行安装:
让我们在显示一下我们的系统安装的Components:
上面显示我们已经安装好一个docker的Component.
我们也可以通过如下的方法来安装一个hello-world的snap:
让我们重新来看一下我们的系统信息:
从这里我们可以看出来,docker是一个framework,而hello-world是一个应用(app).这个两个都是通过snap包进行安装的.framework是用来拓展系统的,它有自己的security profile.所有安装的app都是是隔离的,不可以访问彼此的空间.
如法炮制,我们也可以安装自己的web server:
这是一个用golang写的webserver.我们可以在接下来的章节中介绍如何下载这个snap的源码.
下面,我们来介绍一下如何更新我们的Ubuntu-core系统:
通过上面的命令,我们可以更新我们的ubuntu-core系统.系统更新允许我们有2个或更多的ubuntu-core build同时存在.
我们可以看到有两个ubuntu-core存在于系统中.当前正在使用的有一个 *号来表示的.我们可以通过重新启动来启用最新的安装的ubuntu-core.
重新启动系统后,我们在来看一下我们的系统:
我们看到ubuntu-core已经跟新到最新的版本.如果我们想回到(rollback)以前的版本,我们可以使用如下的命令:
我们看到ubuntu-core已经回到先前的版本了! 如何开发者想知道更多关于snappy命令的信息, 可以在命令行中打入如下的命令:
如果你想更多地了解每个命令的具体的帮助:
你将看到如下的帮助信息:
通过上面的帮助信息,我们可以对该命令有更多的认识.比如:
我们想把我们的hello-word rollback到我们的另外一个先前的版本" IEYVCgYIIDJe",我们可以通过如下的命令来实现:
就像我们先前所说的一样,每个Ubuntu core含有两个root filesystem A和B.我们可以通过如下的命令来得到到底是那个分区:
目前在KVM中,我们很难拷贝及粘贴,我们可以通过如下的方法.在KVM target中:
安装完后,为我们就可以用如下的命令来输出一个可以在我们浏览器中的url:
另外一个技巧是使用ssh登陆到我们的KVM中,这样,我们就可以自由地拷贝我们所需要的东西了.
这里的8022口是我们重定向的KVM中的22口.
从上面我们可以看出来,我们可以选择我们所需要的内容进行自由地拷贝.
我们可以通过如下的service命令来查看目前在Snappy系统中正在运行的services:
在上面显示我们已经在运行几个services,它们在系统启动时就开始运行了.我们在这里也可以看到目前运行的状态,我们也可以通过如下的方式来查看我们service的状态:
我们可以通过service start/stop/restart 命令来启动或关掉一个服务:
我们可以看到port-listener应用的状态是 failed.
如果我们想看到一些service在runtime的信息,我们可以通过如下的命令来得到.这对于我们调试我们的service是非常有用的:
在上面我们可以看到我们的webserver已经在相应的口地址8081上运行.这些输出相应于我们在我们的 代码中的输出.大家可以在我稍后的 练习中体会到.我们也使用如下的命令来更精准地显示每个service的输出信息:
在上面的例程中,我们已经展示了如何从命令行启动Snappy Ubuntu:
在运行上面的命令时没我们必须在snappy image所处的目录中运行该命令.在上面我们已经讲到,端口 4200是webdm (Web Device Manager)的口地址.通过上面的重定向,我们可以在我们的Desktop上打开我们的浏览器,并输入地址localhost:4200:
从上面,我们可以看到已经安装的应用和framework.我们也可以点击其中的应用或framework,得到他们的更详细的细节.我们也可以从这里删除他们:
当然,我们也可以点击上图中的"Snappy Store".这样我们可以选择我们需要的应用或framework进行安装:
我们可以从 链接来上传我们的snap应用:
在上传我们的应用之前,我们可以使用click review工具来检查我们的snap文件是否符号所需要的要求:
如果检查没有问题,我们可以直接把我们的应用上传到我们的商店即可.
如果我们可以使用如下的命令来安装我们的.snap应用或框架到我们的Snappy Ubuntu系统去.比如我们想安装我们的.snap应用到我们的KVM中,我们还是按照我们上面的方法来启动我们的KVM:
这里,Desktop的" 8022"口重定向到Snappy Ubuntu系统的"22"口.我们可以用如下的命令来安装我们的hello-world snap应用
如果你这是第一次连接到目标系统的话,snappy-remote将会尽可能利用已有的ssh key来建立连接,以避免提示输入输入密码.
如果我们想把我们的snap应用安装到我们的一个网路上的设备的话:
对于我们在和我们电脑同一个网路上的设备来说,比如我们也可以使用如下的方法来安装:
这里,我们必须在设备上安装webdm.如果上面的方法不能稳定地工作的话,我们可以使用实际设备的IP地址来代替上面的webdm.local.
另外一种方式是使用scp拷贝我们的文件到我们的Snappy Ubuntu系统中,并在Snappy Ubuntu系统中进行安装我们的snap:
在我们的Snappy Ubuntu系统中,我们使用如下的命令来安装:
在上面的图中,我们可以看到我们刚才安装的应用hello-world的 Developer显示的是sideload,表明它不是从Snappy Store里来安装的.我们也可以看到它的版本是一个虚假的版本号码.这样的好处是不需要改变metadata文件,就很轻松地迭代.
安装好后的应用可以在Snappy Ubuntu如下的位置找到: /apps/name-of-snap-in-store-folder
首先,我们可以通过snappy list -v命令来查看已经被安装的snap,并使用snap remove命令来删除已经被安装的应用:
当然,我们可以通过Snappy Store来卸载我们已经安装的snap:
如果我们查看一下一个snap打包时的.yaml文件,比如在 连接:
在这里 name定义为"mqtttestclient", binaries被定义为"mqttpublish".当我们在Snappy Ubuntu上运用一个snap应用时,它的命令为:
这样做的好处是即使其它的应用的binaries和我们的应用有一样的名字,它们运行时也不会冲突,因为它的前面是有一个snap的名字作为前缀.
对于Snappy应用来说,有些应用被定义为service,它们的启动是由系统来启动的.当系统启动后,service会被自动启动.下面是一个service的snapcraft.yaml的 样板:
一个Snappy系统由如下的几个分区组成:
从上面可以看出来,Snappy系统具有两个只读的根文件分区.这个两个A/B分区是用来支撑我们的rollback功能的.我们可以通过我们上面学的"snappy list -v"命令来查看到到底是那个ubuntu core正在使用.通过使用"snappy update"命令来更新我们的ubuntu core.这两个分区是不可以修改的.目前,自动更新的功能正在开发.它可以使得我们的系统永远保持最新的状态.这个功能在默认的情况下是关掉的,如果你想打开这个功能的话,可以参阅文章 autopilot.
每个应用在Snappy Ubuntu中都是处于一个沙箱之中的.彼此之间是不可以互相访问的.每个应用都有自己的独立的控件.在系统中只有三个地方是可以写的:
每个snap包都会按照自己版本安装于自己独立的文件目录;每个snap包不会覆盖任何其它的snap所安装的文件或不同版本的snap;每个snap只能自己特定的读写的区域,这是由apparmor来及通常的沙箱机制来完成的.
在我们的实际编程中,我们可以使用如下的两个环境变量来得到我们应用相关的路径名称
这样避免我们需要硬编码来设置我们应用的路径.如果我们想看到更多的关于环境变量的内容,我们可以在Snappy Store中安装hello-world,并在命令行输入一下命令:
我们可以看到:所有的snap相关的环境变量值都以" SNAP"开头的.如果你想体验一下snap中的沙箱,你可以在命令行中输入hello-world.sh.
如果你想对如果打包一个Snappy的应用,请参阅文章" 利用snapcraft为我们的Snappy Ubuntu应用打包"
Snappy Ubuntu的系统是可读的.但是有时我们需要修改这个系统,并安装一些我们需要的包到系统中去测试或其它的一些原因,我们可以通过如下的方式做.首先我们把系统的文件系统设为可写:
然后,我们通过dpkg -i的方式来安装一个我喜欢的包,比如nano.我们可以在desktop上下载它的包,并把包存于到我们设备的卡里去或放到kvm的目录里:
wget http://ports.ubuntu/pool/main/n/nano/nano-udeb_2.2.6-3_armhf.udeb
在我们的Snappy系统中,执行:
这样这个包就会被成功安装.具体的细节可以参阅" how-to-connect-wifi-network-from-raspberry-pi-2-snappy".
对于一个snap包,我们想看看它里面的内容.在没有安装的情况下,我们可以通过如下的命令来查看他里面的内容:
从上面我们可以看到在该snap所包含的所有的文件.它其实就是在我们在编译我们的项目中的snap目录下的内容.
我们在Snappy ubuntu下,加入如下的命令:
或命令:
如果一个应用没有定一任何的caps或security-template,那么它的默认的caps是 network-client.关于caps的使用可以参阅我的 例程.
有时我们希望能够知道我们系统的硬件被应用的使用的情况.我们可以通过如下的命令来查询:
这一般来说是通过如下的命令来完成的:
目前Snappy Ubuntu技术正在紧罗密布地开发.如果大家有问题的话,可以参加IRC上的在freenode上的# snappy channel.
上面有很多的专家在上面可以帮你解答你所提出的问题.另外,开发者也可以订购我们的mailinglist: snappy-app-devel-request@lists.ubuntu来得到问题的回答. 如果你发现我们的Snappy有上面bug的话,请点击 连接 进行报告.
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/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>
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/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>
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/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中都是处于一个沙箱之中的.彼此之间是不可以互相访问的.每个应用都有自己的独立的控件.在系统中只有三个地方是可以写的:
- /var/lib/apps: 这个目录是由系统来填写应用的配置文件的
- /apps: 这个是我们安装的snap应用文件目录
- /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/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来得到问题的回答. 如果你发现我们的Snappy有上面bug的话,请点击 连接 进行报告.
更多推荐
Snappy Ubuntu 入门
发布评论