安装snap应用到Ubuntu 16.4桌面系统
时间:2016-07-13 16:57:49
收藏:0
阅读:883
Canonical公司于最近2016年4月发布了一个新的16.04系统,并且这个系统是长期支持版(Long Term Support - LTS).它一如既往地支持debian安装包,但同时它也支持最新的snap安装包.snap安装包是Canonical公司最新发布的一种安装包的格式.更多的信息可以在我们的官方开发者网站:https://developer.ubuntu.com/en/desktop/或http://snapcraft.io/查看.
1)16.04桌面支持
从上面的图中,我们可以看出来在16.04的桌面中支持两种格式的安装包:snap及debian.另外我们可以看出,snap包每个安装的应用都是自成一体:包含应用运行所需要的任何依赖(dependencies);同时我们可以看出每个应用都是互相隔离的.和debian包相比较,我们可以看出来每个debian应用的安装依赖于其它包的安装;debian应用之间可以互相访问而造成安全问题;删除其中的一个debian应用可能导致其它的应用不可以正常运行.相比较而言,不同的snap应用可以安装同样一个软件的不同版本(比如一个安装python 2.7,另外一个应用安装python 3.3)而不造成任何的干扰.从理论上讲,一个snap应用可以安装到任何一个Linux的发行版上,因为它不依赖于操作系统及其发布版本.这对于应用的维护来说是非常好的.
Canonical公司目前正在向全社区把应用移植成为snap包,并最终把操作系统变为ubuntu core系统,从而打造最安全的操作系统及良好的应用维护.
2)安装
为了能够使得在16.04的系统上运行snap应用,我们必须做一些安装.在我们的terminal中打入:
$ sudo apt update $ sudo apt install snapd $ sudo apt install snapcraft
在我们的16.04系统中,我们必须打开universe,这样我们可以在以后的开发中安装snapcraft工具了.snapcraft是为了我们能够编译一个snap项目而必须的一个工具,尽管在运行时并不需要.它位于下图所示的universe channel中.
然后,你就可以在我们的terminal中安装及运用一个我们所需要的应用:
$ sudo snap install ubuntu-calculator-app $ ubuntu-calculator-app.calculator
我们可以在我们的电脑的dash中直接运行我们所安装的应用:
如果大家想安装更多的应用的话,可以直接到我们桌面系统的应用商店进行安装:
从上面我们可以看出来,calculator应用也是在里面的.如果大家想知道这个应用是如何实现的,请参考源码:
https://code.launchpad.net/~dpm/ubuntu-calendar-app/snap-all-things
细心的开发者也许会发现,这个应用实际上是使用了同样一个和Ubuntu手机一样的代码.没有做任何的改变.从某种意义上讲,Ubuntu真正实现了真正意义上的融合(Convergence)应用设计.从另外一个角度上讲,这个snap应用时间上可以部署到任何一个Linux的发行版上,只要有它支持snap包,并且它将不依赖于操作系统的版本发布.维护性应该是非常好的.
我们怎么通过命令行来查找我们所需要的snap应用呢?
liuxg@liuxg:~$ snap find calculator Name Version Developer Notes Summary ubuntu-calculator-app 2.1+snap3 ubuntucoredev - Ubuntu Calculator application for the Unity 7 desktop
我们可以通过上面的命令来查找在商店里应用名字含有calculator的应用.我们可以通过如下的命令来寻找所有在商店里发布的snap应用:
liuxg@liuxg:~$ snap find Name Version Developer Notes Summary ab 1.0 snappy-test - Test snap with shortest name ag-mcphail 1.0.1 njmcphail - The Silver Searcher - mcphail's build and upstream git version alsa-utils 1.1.0-1 woodrow - Utilities for configuring and using ALSA apktool 2.1.1 ligboy - A tool for reverse engineering 3rd party, closed, binary Android apps. ...
当然,我们也可以通过如下的方法找寻到我们所需要的应用:
liuxg@liuxg:~$ snap find | grep hello hello 2.10 canonical - GNU Hello, the "hello world" snap hello-bluet 0.1 bluet - Qt Hello World example hello-huge 1.0 noise - a really big snap hello-snap 0.01 muhammad - GNU hello-snap, the "Hello, Snap!" snap
3)删除一个snap应用
刚才我们已经成功安装了一个snap应用到我们的桌面系统中.我们现在可以通过如下的命令来删除该应用.我们首先在命令行中显示已经被安装的应用:
liuxg@liuxg:~$ snap list Name Version Rev Developer Notes hello-world 6.1 26 canonical - rssreader 1.0 x1 devmode rssreader-app 1.0 x2 - snaptest 1 x1 devmode snaptest-app 1 x3 devmode ubuntu-calculator-app 2.1+snap3 5 ubuntucoredev - ubuntu-core 16.04+20160531.11-56 122 canonical - webcam-webui 1 x1 -
在上面,我们看到已经安装了ubuntu-calculator-app应用.我们可以通过如下的方法来删除它.
liuxg@liuxg:~$ sudo snap remove ubuntu-calculator-app [sudo] password for liuxg: Done
重新显示我们已经安装的snap应用列表:
liuxg@liuxg:~$ snap list Name Version Rev Developer Notes hello-world 6.1 26 canonical - rssreader 1.0 x1 devmode rssreader-app 1.0 x2 - snaptest 1 x1 devmode snaptest-app 1 x3 devmode ubuntu-core 16.04+20160531.11-56 122 canonical - webcam-webui 1 x1显然我们再也找不到ubuntu-calculator-app应用了.
4)在哪里找到安装的文件
当我们把一个应用到我们的系统中后,我们可以通过如下的命令来查看在我们的系统中所安装的所有的snap应用:
liuxg@liuxg:~$ snap list Name Version Rev Developer Notes hello-world 6.1 26 canonical - rssreader 1.0 x1 devmode rssreader-app 1.0 x2 - snaptest 1 x1 devmode snaptest-app 1 x3 devmode ubuntu-calculator-app 2.1+snap3 5 ubuntucoredev - ubuntu-core 16.04+20160531.11-56 122 canonical - webcam-webui 1 x1 -
对于一些开发者来说,snap的一些命令可能比较陌生.我们可以通过如下的方法来得到帮助:
$ snap --help # Or use 'snap <command> --help' for help on a specific command
liuxg@liuxg:/var/lib/snapd/snaps$ ls hello-world_26.snap rssreader_x1.snap snaptest-app_x3.snap ubuntu-core_122.snap rssreader-app_x1.snap snaptest-app_x1.snap snaptest_x1.snap webcam-webui_x1.snap rssreader-app_x2.snap snaptest-app_x2.snap ubuntu-calculator-app_5.snap
我们可以通过如下的方法查看系统中的mount的情况:
liuxg@liuxg:~$ mount | grep calculator /var/lib/snapd/snaps/ubuntu-calculator-app_5.snap on /snap/ubuntu-calculator-app/5 type squashfs (ro,relatime)
liuxg@liuxg:/snap/ubuntu-calculator-app/5$ tree -L 2
.
├── bin
│ └── calculator
├── build
│ └── ubuntu-calculator-app
├── command-calculator.wrapper
├── etc
│ ├── apparmor.d
│ ├── dbus-1
│ ├── default
│ ├── drirc
│ ├── fonts
│ ├── gps.conf
│ ├── gss
│ ├── init
│ ├── init.d
│ ├── ldap
│ ├── pki
│ ├── pulse
│ ├── ucf.conf
│ ├── X11
│ └── xdg
├── lib
│ ├── systemd
│ └── x86_64-linux-gnu
├── meta
│ ├── gui
│ └── snap.yaml
├── usr
│ ├── bin
│ ├── lib
│ └── share
└── var
└── lib
细心的读者也许已经发现,在被mount的目录中的文件就像另外一个Linux的安装文件结构.它实际上是把这个calculator所需要的所有需要的文件安装到同样的一个根目录中,从而摆脱对系统文件的任何需求.理论上讲,我们的应用不会因为系统的升级或版本的变化而造成不能运行的情况.这对于一些软件开发商来说无疑是一个天大的利好!我们今天设计好的软件,在Ubuntu升级为20.4时,我们不需要做任何的修改.当然,我们也可以把我们的应用部署到其它的任何一个Linux发行版上,它也可以运行得非常好.我们不需要考虑它到底运行的是什么版本的Linux系统及什么版本的发行.
当然对于一个snap应用来说,它的snap文件包的大小也是非常大的.
-rw-r--r-- 1 liuxg liuxg 122M 7月 12 12:00 ubuntu-calculator-app_2.1+snap3_amd64.snap
从上面可以看出来,我们的snap包的大小达到122M.如果我们想查看我们所在包里面的内容,我们可以通过如下的命令来实现:
$ unsquashfs -l ubuntu-calculator-app_2.1+snap3_amd64.snap | less
squashfs-root squashfs-root/bin squashfs-root/bin/calculator squashfs-root/command-calculator.wrapper squashfs-root/etc squashfs-root/etc/X11 squashfs-root/etc/X11/Xreset squashfs-root/etc/X11/Xreset.d squashfs-root/etc/X11/Xreset.d/README squashfs-root/etc/X11/Xresources squashfs-root/etc/X11/Xresources/x11-common squashfs-root/etc/X11/Xsession squashfs-root/etc/X11/Xsession.d squashfs-root/etc/X11/Xsession.d/20x11-common_process-args squashfs-root/etc/X11/Xsession.d/30x11-common_xresources squashfs-root/etc/X11/Xsession.d/35x11-common_xhost-local squashfs-root/etc/X11/Xsession.d/40x11-common_xsessionrc squashfs-root/etc/X11/Xsession.d/50x11-common_determine-startup squashfs-root/etc/X11/Xsession.d/60x11-common_localhost squashfs-root/etc/X11/Xsession.d/60x11-common_xdg_path ...
我们也可以直接通过如下的命令来得到在snap包中所有的文件:
$ unsquashfs ubuntu-calculator-app_2.1+snap3_amd64.snap $ cd cd squashfs-root # Hack hack hack $ snapcraft snap
我们可以通过最后的命名snapcraft snap来重新打包我们的应用.
我们来看一看我们安装后的应用所占的空间大小:
也就是说一个应用安装后的空间大小是350M大小.当然这也依赖于我们所安装的应用类型.针对我们的ubuntu-calculator-app来说,我们在包里把我们所需要的Qt库及其它需要的任何东西都打入到包里面了.对于其它的任何python应用来说,也是同样的,我们可以把python版本所需要的任何库都打入到我们的包里面.我们根本不需要担心它会不会对其它的应用造成任何的影响.
375M ./ubuntu-calculator-app/
5)发布我们的应用到商店
我们可以很方便地把我们已经开发好的应用通过"My Apps"发布到我们的应用商店.在上传我们的应用时,我们一定要记得选择"Ubuntu Core"作为商店来上传.
为了上传一个新的snap应用到商店,我们只需要填入我们所需要的metadata信息及上传我们开发的snap文件即可:
6)受限的snap应用
实现这个安全沙箱的技术叫做AppArmor,seccomp及device cgroups.每个应用都有自己的/tmp目录,devpts等.这个受限的设置是由一个叫做snapcraft.yaml的项目文件所定义的.在这个文件中,snap申明它想要访问的资源,系统将会为它生产相应的限制.关于snapcraft.yaml的详细介绍,我们会在以后的文章中逐步介绍.
作为一个例子,当我们使用snapcraft来生产我们想要的snap文件时,我们想要我们的snap应用最终能够访问我们用户的$HOME文件目录.在snap系统中,我们是通过一个叫做plug及slot的概念来实现的.我们可以通过如下的命令来查看我们已经存在的plug及slot.
liuxg@liuxg:~$ snap interfaces Slot Plug :camera - :cups-control - :firewall-control - :gsettings - :home rssreader-app,snaptest-app :locale-control - :log-observe - :modem-manager - :mount-observe - :network - :network-bind webcam-webui :network-control - :network-manager - :network-observe - :opengl rssreader-app,snaptest-app,ubuntu-calculator-app :optical-drive - :ppp - :pulseaudio - :snapd-control - :system-observe - :timeserver-control - :timezone-control - :unity7 rssreader-app,snaptest-app,ubuntu-calculator-app :x11 -
name: foo
apps:
bar:
command: bin/bar
plugs: [ home, unity7 ]
另外我们值得指出的是:如果我们想我们的应用还是像我们以前在ubuntu的桌面上运行而不受snap安全机制的限制,我们可以使用如下的命令来安装我们的应用:
$ sudo snap install <package.snap> --devmode
关于snapcraft.yaml的知识,我们会在以后的章节中详细介绍,所以大家先不要着急!
7)如何得到snap帮助
就想我们上面所写的那样,我们可以通过如下命令来得到snap的帮助:
liuxg@liuxg:~$ snap --help
Usage:
snap [OPTIONS] <command>
The snap tool interacts with the snapd daemon to control the snappy software platform.
Application Options:
--version print the version and exit
Help Options:
-h, --help Show this help message
Available commands:
abort Abort a pending change
ack Adds an assertion to the system
change List a change's tasks
changes List system changes
connect Connects a plug to a slot
create-user Creates a local system user
disconnect Disconnects a plug from a slot
find Finds packages to install
help Help
install Install a snap to the system
interfaces Lists interfaces in the system
known Shows known assertions of the provided type
list List installed snaps
login Authenticates on snapd and the store
logout Log out of the store
refresh Refresh a snap in the system
remove Remove a snap from the system
run Run the given snap command
try Try an unpacked snap in the system
针对每个snap下面的命令,我们可以通过如下的方式来得它的帮助信息:
liuxg@liuxg:~$ snap install -h
Usage:
snap [OPTIONS] install [install-OPTIONS] <snap>
The install command installs the named snap in the system.
Application Options:
--version print the version and exit
Help Options:
-h, --help Show this help message
[install command options]
--channel= Use this channel instead of stable
--edge Install from the edge channel
--beta Install from the beta channel
--candidate Install from the candidate channel
--stable Install from the stable channel
--devmode Install the snap with non-enforcing security
通过上面的方法,我们可以对snap命令有更深的理解.
7)如编译一个snap应用
如果大家已经有一个snap的项目,你只需要:
- 安装snapcraft.请参阅文章的开始部分
- 在项目的根目录下,直接键入"snapcraft"即可.在项目的根目录下通常含有snapcraft.yaml文件或.snapcraft.yaml文件.
Canonical公司已经号召很多的全球开发者开发snap应用.我们已经把已经开发好的应用放在如下的仓库里了.如果大家对这个感兴趣,请安装如下的指令来下载这些应用作为参考:
$ git clone https://github.com/ubuntu/snappy-playpen.git $ cd snappy-playpen
目前已经有如下的项目可以供我们参考:
atom/ idea/ openttd/ tinyproxy/ cloudfoundry-cli/ imagemagick-edge/ plank/ tyrant-unleashed-optimizer/ consul/ imagemagick-stable/ qcomicbook/ ubuntu-clock-app/ dcos-cli/ keepassx/ qdriverstation/ ubuntukylin-icon-theme/ deis-workflow-cli/ kpcli/ ristretto/ vault/ dosbox/ leafpad/ scummvm/ vlc/ ffmpeg/ minetest/ shotwell/ wallpaperdownloader/ galculator/ moon-buggy/ smplayer/ youtube-dl/ gitter-im/ mpv/ snap-template/ heroku/ openjdk-demo/ snaptest/
我们可以直接进入到项目的根目录下,键入如下的命令即可:
$ snapcraft当项目被成功编译完后,我们可以直接在项目的根目录下找到一个扩展名为.snap的文件.这就是我们所需要的snap安装文件.我们可以参照我们上面讲述的方法来安装这个文件.
如果大家对如何开发一个Ubuntu桌面的应用感兴趣的话,可以参阅我的文章"如何把一个qmake的Ubuntu手机应用打包为一个snap应用".
8)如何运行一个snap应用
我们可以在Dash中运行我们的应用,同时,我们也可以在terminal中通过命令行的方式来启动我们的应用.在我们设计我们的snap应用时,通常我们使用一个叫做snapcraft..yaml的项目文件.我们现在来用一个例子来说明:
snapcraft.yaml
name: snaptest-app
version: 1
summary: This is a summary
description: This is the description
confinement: devmode
apps:
test:
command: desktop-launch $SNAP/lib/x86_64-linux-gnu/bin/snaptest
plugs: [home,unity7,opengl]
parts:
application:
source: ./src
plugin: qmake
qt-version: qt5
build-packages:
- cmake
- gettext
- intltool
- ubuntu-touch-sounds
- suru-icon-theme
- qml-module-qttest
- qml-module-qtsysteminfo
- qml-module-qt-labs-settings
- qtdeclarative5-u1db1.0
- qtdeclarative5-qtmultimedia-plugin
- qtdeclarative5-qtpositioning-plugin
- qtdeclarative5-ubuntu-content1
- qt5-default
- qtbase5-dev
- qtdeclarative5-dev
- qtdeclarative5-dev-tools
- qtdeclarative5-folderlistmodel-plugin
- qtdeclarative5-ubuntu-ui-toolkit-plugin
- xvfb
stage-packages:
- ubuntu-sdk-libs
- qtubuntu-desktop
- qml-module-qtsysteminfo
snap:
- -usr/share/doc
- -usr/include
after: [desktop/qt5]在上面的snapcraft.yaml文件中,我们的包的名字叫做"snaptest-app".在apps下定义了一个应用叫做"test".那么在命令行中,我们可以通过如下的方式来运行我们的最终的应用:
$ snaptest-app.test
更多的学习资源可以参阅我们的链接地址:
- https://github.com/snapcore/snapcraft/tree/master/docs
- https://developer.ubuntu.com/en/desktop/
- https://developer.ubuntu.com/en/snappy/
- http://snapcraft.io/
评论(0)