在今天的教程中,我们来展示如何来hack一个已经发布的Ubuntu Core应用.这个方法特别是对已经发布在Ubuntu Core商店的应用进行hack非常有用.
最近,我想把在Ubuntu Desktop上面的一个叫做vtop的应用移植到我们的Ubuntu Core的dragonboard上面.vtop是一个非常好的应用,它可以展示在Ubuntu系统中的应用资源:
我们可以在我们的Ubuntu Desktop上面利用如下的命令来安装它:
$ sudo snap install vtop
在这里,我们没有用到任何的channel选项,表明它是从我们的stable channel进行安装的.没有任何的安全的问题.我们可以在terminal中直接打入如下的命令:
$ vtop
就可以运行这个应用.
为了得到同样的应用,我也尝试使用如下的snapcraft.yaml文件来创建一个同样的应用:
snapcraft.yaml
name: v-top # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: This is a snap for vtop # 79 char long summary
description: |
This is vtop. More info can be found at https://parall.ax/vtop
grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots
apps:
v-top:
command: bin/vtop
plugs: [home, network, system-observe, process-control,network-bind]
parts:
vtop:
# See 'snapcraft plugins'
plugin: nodejs
source: https://github.com/MrRio/vtop
source-type: git
node-engine: 6.9.2
这个snapcraft.yaml文件非常简单.等我们打包过后,我们发现这个应用只能在devmode下进行安装,否则会出现一些问题,比如:
liuxg@liuxg:~/snappy/desktop/vtop2$ v-top
TypeError: Cannot read property 'replace' of undefined
at child.exec (/snap/v-top/x1/lib/node_modules/vtop/sensors/memory.js:45:43)
at ChildProcess.exithandler (child_process.js:213:5)
at emitTwo (events.js:106:13)
at ChildProcess.emit (events.js:191:7)
at maybeClose (internal/child_process.js:877:16)
at Socket.<anonymous> (internal/child_process.js:334:11)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at Pipe._handle.close [as _onclose] (net.js:498:12)
那么我们的问题出现在哪里呢?显然它出现在最新的发布版本中https://github.com/MrRio/vtop.这个最新发布的软件里面含有一些不利于我们进行snap打包工作的代码.为了解决这个问题,我想到了已经发布在我们的Ubuntu Core商店里的软件vtop.我进行了如下的操作:
创建一个目录,比如tmp,然后进入到我们的目录中中:
$ snap download vtop
我们通过上面的命令来把发布到商店里的vtop应用下载到本地:
liuxg@liuxg:~/tmp$ ls
vtop_1.snap
显然我们已经下载了发布到我们商店里的vtop应用.接下来,我们使用如下的命令:
liuxg@liuxg:~/tmp$ unsquashfs vtop_1.snap
Parallel unsquashfs: Using 4 processors
2205 inodes (2419 blocks) to write
[==========================================/] 2419/2419 100%
created 2202 files
created 483 directories
created 3 symlinks
created 0 devices
created 0 fifos
liuxg@liuxg:~/tmp$ ls
squashfs-root vtop_1.snap
这样在我们的当前的应用中,我们发现一个被创建的squashfs-root的目录.这个目录里的所有文件就是我们最终被安装到Ubuntu Core系统的文件.我们可以对这个squashfs-root里的文件进行我们任何的hacking,然后再重新按照下面的指令打包.如果我们此时不做任何的改动,我们直接使用如下的命令,我们就可以把它里面的文件重新打包为一个snap文件:
liuxg@liuxg:~/tmp$ snapcraft snap squashfs-root/
Snapping 'vtop' |
Snapped vtop_1.0.1_amd64.snap
liuxg@liuxg:~/tmp$ ls
squashfs-root vtop_1.0.1_amd64.snap vtop_1.snap
当然,这不是我们的最终的目的.我们的目的是为了能把这个同样的应用能够发布到Ubuntu Core的系统中去.为此,我们进入到我们已经展开的文件夹中:
liuxg@liuxg:~/tmp$ cd squashfs-root/
liuxg@liuxg:~/tmp/squashfs-root$ ls
bin CHANGELOG.md command-vtop.wrapper etc include lib LICENSE meta README.md share
liuxg@liuxg:~/tmp/squashfs-root$ cd bin/
liuxg@liuxg:~/tmp/squashfs-root/bin$ ls
node npm vtop
liuxg@liuxg:~/tmp/squashfs-root/bin$ ./node --version
v4.2.2
首先,我们发现在这个包里的nodejs的版本是4.2.2.这个信息很重要.在我们的snap包应用中,我们可以指定任何一个python或nodejs的版本.针对我们的情况,我们希望在最终的版本中,这里的nodejs的版本和原来的一致,这样不会造成安全的问题.另外,我们也进入到另外一个目录中:
liuxg@liuxg:~/tmp/squashfs-root/lib/node_modules$ ls
npm vtop
在这里,我们可以看见我们所有的能够运行我们的vtop的代码都被保存到一个叫做vtop的目录之中:
liuxg@liuxg:~/tmp/squashfs-root/lib/node_modules$ ls vtop
app.js CHANGELOG.md LICENSE node_modules README.md themes
bin docs Makefile package.json sensorsupgrade.js
无论它在原来的应用中是怎样形成的,它肯定是被定义为一个被叫做vtop的part.我们需要这个部分的软件.我们可以把这个目录的文件考入到我们打包的文件中:
liuxg@liuxg:~/snappy/desktop/vtop$ ls
snapcraft.yaml vtop
比如,在上面我们创建的项目中,我们把vtop整个目录都拷入到我们的项目中.同时我们的snapcraft.yaml的内容如下:
name: v-top # you probably want to 'snapcraft register <name>'
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: This is a snap for vtop # 79 char long summary
description: |
This is vtop. More info can be found at https://parall.ax/vtop
grade: stable # must be 'stable' to release into candidate/stable channels
confinement: strict # use 'strict' once you have the right plugs and slots
apps:
v-top:
command: bin/vtop
plugs: [system-observe]
parts:
vtop:
# See 'snapcraft plugins'
plugin: nodejs
source: ./vtop
node-engine: 4.2.2
这里我们同时指定了和原来一样的nodejs的版本4.2.2.我们重新打包我们的应用,我们会发现它和原来的应用运行的一模一样,并且在安装时,不需要devmode.我们此时也可以查看在meta文件目录下的snap.yaml文件,并找到相应的所需要的plug system-observe.当然针对目前的这种情况似乎并不需要这个plug就可以很好地运行.
那么这样的一个应用,在QualComm的dragonboard上的安装是如何呢?
我们可以安装文章"如何为树莓派安装Ubuntu Core并在Snap系统中进行编译"(http://www.linuxdiyf.com/linux/23642.html)来在Dragonboard上打包我们的v-top应用,我们最终的运行的情况和在Ubuntu Destop上一模一样,并且它也不需要devmode.
从上面的图片中看出,v-top应用被成功安装,并且不汗devmode.
整个项目的源码在:https://github.com/liu-xiao-guo/v-top
在64为的dragonboard上,我们可以通过如下的命令来安装:$ sudo snap install v-top