如何为树莓派安装Ubuntu Core并在Snap系统中进行编译

在这篇文章中,我们将介绍如何在snap系统中进行交叉汇编来把我们的应用编译并安装到目标机器中.我们知道目前Snap支持ARM及x86芯片.在我们的Classic 16.04的系统中,我们很容易地编译出我们想要的在x86上的snap文件,但是我们如何生产为ARM板生产相应的armhf的snap文件呢?

下面我们以树莓派2板子为例来描述是如何实现的.但是这里的教程适合于任何其它的Ubuntu Core所支持的板子,比如高通的snapdragon 410c板子.

 

1)为树莓派2/3安装snap系统

 

我们可在地址下载最新的树莓派2的image,并存于系统的~/Downloads目录中.如果你是使用树莓派3的话,那么你可以在地址下载image.你也可以在如下的地址找到所有最新的Ubuntu Core image:

http://cdimage.ubuntu.com/ubuntu-core/16/stable/current/

如果你希望使用最新的daily build 镜像的话,可以使用连接:

http://cdimage.ubuntu.com/ubuntu-core/xenial/daily-preinstalled/current/

正式的发布软件可以在地址http://releases.ubuntu.com/ubuntu-core/16/找到.

如果大家有beaglebone的板子的话,那么你可以在地址http://people.canonical.com/~ogra/snappy/all-snaps/stable/current/找到最新的Ubuntu Core的软件.

 

整个image的大小约为161M.我们把我们的SD卡插入到我们电脑的MMC卡槽中,或插入到一个USB的adapter中.在进行拷贝image前,我们必须unmount我们的卡.然后,我们使用如下的命令来拷贝我们的image到卡中:

 

 

# Note: replace /dev/sdX with the device name of your SD card (e.g. /dev/mmcblk0, /dev/sdg1 ...)

xzcat ~/Downloads/ubuntu-core-16-pi2.img.xz | sudo dd of=/dev/sdX bs=32M
sync

 

注意这里的"ubuntu-core-16-pi2.img.xz"是我们下载后的image的名称.目前对于p3设备来说,默认的输出是通过串口,可以连接到我们的电脑上并进行查看启动的信息.大家可以买一个像链接所示的串口线.在我们的terminal中打入如下的命令:

 

$ sudo screen /dev/ttyUSB0 115200

 

这样就可以看到我们启动时的信息了.

 

当然,如果大家没有这样的连接线的话,我们可以通过修改如下的文件,并最终使得显示的结果输出到HDMI的显示器中:

 

 

上面的cmdline.txt里面的原始的内容为:

 

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty0 elevator=deadline

 

我们把cmdline.txt中的文件的内容,修改为:

 

dwc_otg.lpm_enable=0 console=tty1 elevator=deadline

 

这样,我们就可以在HDMI的显示器上看到输出的结果了.通过键盘的操作,我们第一次完成Network的设置后,就可以在电脑上通过刚ssh的方式来进行登陆了.记住,我们必须提供launchpad的账号信息来完成设置的动作.关于如何创建一个launchpad的账号,请参阅文章"创建Ubuntu Core账号并为Ubuntu Core设备添加新的账号".


等上面的操作完成后,拔出我们的SD卡,并插入到我们的树莓派的SD卡插槽中.然后启动我们的树莓派.第一次的启动的时间比较长,需要耐心等待.

 

 

注意:这里的image名字"all-snaps-pi2.img.xz"可能会跟着版本的变化而发生改变.请根据你下载的具体的文件来替换.这里的sdX需要换成我们卡的设备号,比如在我们的电脑的MMC插槽中就是mmcblk0:

 

 

在我们刷卡时,我们可以使用sudo fdisk -l,或lsblk来获取我们的设备的代码.注意在我们执行命令时,命令行中的"/dev/sdX"可以是/dev/sdb而不是/dev/sdb1,可能是 /dev/mmcblk0 而不是 /dev/mmcblk0p1.

 

 

2)连接我们的树莓派设备

 

如果大家有路由器的话,建议大家把树莓派和自己的电脑同时连接到同一个路由器上.我们可以参阅文章"如何在装上Snappy Ubuntu的树莓派上启动WiFi"来找到树莓派上的IP地址.

 

如果我们的树莓派中已经安装了snapweb应用,我们可以通过如下的方式看到:

 

liu-xiao-guo@localhost:~$ snap list
Name         Version       Rev  Developer  Notes
bluez        5.37-1        7    canonical  -
classic      16.04         14   canonical  devmode
lights-app   0.1           x1              devmode
pi2-kernel   4.4.0-1021-3  14   canonical  -
pi3          16.04-0.4     5    canonical  -
piglow-app   1.0           x2              devmode
sensortag    1.0           x3              devmode
snapweb      0.21.1        21   canonical  -
ubuntu-core  16.04.1       760  canonical  -
webcam-app   1.0           x1              devmode

 

如果在你的系统还没有发现snapweb已经安装,我们可以使用如下的命令来安装我们的snapweb:

 

$ sudo snap install snapweb


我们可以通过如下的方式找到它是否运行正常:

 

liu-xiao-guo@localhost:~$ systemctl status -l snap.snapweb.snapweb
● snap.snapweb.snapweb.service - Service for snap application snapweb.snapweb
   Loaded: loaded (/etc/systemd/system/snap.snapweb.snapweb.service; enabled; vendor preset: enabled
   Active: active (running) since Mon 2016-09-12 07:49:32 UTC; 1 months 5 days ago
 Main PID: 1793 (snapweb)
   CGroup: /system.slice/snap.snapweb.snapweb.service
           └─1793 /snap/snapweb/21/bin/arm-linux-gnueabihf/snapweb


我们可以看到它在正常运行.如果是这样的话,我们可以通过如下的方式来在我们的host电脑上打入如下的指令:

 

liuxg@liuxg:~$ ping snapweb.local
PING snapweb.local (10.42.0.140) 56(84) bytes of data.
64 bytes from 10.42.0.140: icmp_seq=1 ttl=64 time=0.539 ms
64 bytes from 10.42.0.140: icmp_seq=2 ttl=64 time=0.534 ms
64 bytes from 10.42.0.140: icmp_seq=3 ttl=64 time=0.580 ms
^C
--- snapweb.local ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.534/0.551/0.580/0.020 ms

 

我们可以从上面看到我们所连的设备的IP地址.

 

一旦得到树莓派的IP地址,我们就可以通过如下的命令来完成和树莓派的ssh连接.在电脑上打入如下的命令:

 

$ ssh <your-launchpad-account-name>@your_raspberry_pi_ip_address

 

特别值得注意的是,如果是使用最新的Ubuntu Core的软件的话,这里的ubuntu应改为自己的launchpad的用户名.对于我的情况是liu-xiao-guo@your_raspberry_pi_ip_address.

 

 

一旦我们连接上我们的树莓派,我们可以参照文章"安装snap应用到Ubuntu 16.4桌面系统"来安装和检查我们的snap系统,比如:

 

 

 

一旦进入到我们的Ubuntu Core系统后,我们可以利用如下的命令来为我们的账号创建一个用户密码,这样我们可以在login画面(HDMI或serial terminal中)通过用户名/密码的方式进行登陆:

 

$ sudo passwd <your-launchpad-username> <your-password>

 

这样我们不一定需要用ssh的方式进行登陆.

 

 

 

3)交叉编译我们的应用

 

 

在这一节中,我们来展示如何把我们的应用进行交叉编译,并最终形成可以在我们的树莓派上可以运行的snap包.

 

首先我们在树莓派中安装如下的叫做"classic"的应用:

 

$ sudo snap install classic --devmode --edge

 

然后,我们打入如下的命令:

 

$ sudo classic.create
$ sudo classic


我们再打入如下的命令来更新我们的系统:

 

$ sudo apt-get update

 

 

我们可以把git安装到系统中:

 

$ sudo apt install snapcraft git-core build-essential

 

如果我们需要使用到add-apt-repository命令来添加额外的ppa的话,那么我们必须使用如下的命令来安装这个命令:

 

$ sudo apt-get install software-properties-common python-software-properties


这样我们就安装好了我们的系统,我们可以用这里的环境来交叉编译我们的任何一个snap应用.编译后的snap包就可以直接在我们的树莓派上直接运行:

 



编译完我们的应以后,我们可以直接在我们的shell环境中安装我们的应用:

 


 

我们通过如下的方法来安装我们的应用:

 

$ sudo snap install webcam-webui_1_armhf.snap --devmode --dangerous

 

这里我们采用了--devmode,也就是说我们让我们的应不受任何的安全机制的限制,就像我们以前的Ubuntu桌面上的应用一样.在以后的章节中,我们必须通过interface来连接我们的plug及slot.camera的plug目前还没有在树莓派的image中.

 

 


 

至此,我们已经把我们的项目webcam-webui编译为我们树莓派可以使用的snap了.

 

4)查看snappy应用的运行状态及信息

 

$ sudo journalctl -u snap.grovepi-server.start-monitor
$ sudo systemctl status -l snap.grovepi-server.start-monitor

可以用如下的命令直接修改 meta/snap.yaml,并在上一级的目录中使用如下的命令

$ snap pack

来直接生产新的.snap文件。这种实话snapd已经支持,但是snapcraft还没有支持的情况。

大家可以参照文章“如何在Ubuntu Core上配置自己的WiFi”来配置自己的wifi。

我们其实也可以在https://launchpad.net/上创建我们的项目,并利用launchpad所提供的服务来帮我们打包我们的应用到我们想要的架构中.具体的步骤请参阅文章:https://kyrofa.com/posts/building-your-snap-on-device-there-s-a-better-way

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值