香橙派 Pi Zero 上的容器操作系统 BalenaOS

香橙派是深圳迅龙公司的产品。该公司旗下有不同种类的基于 AllWinner 芯片的不同的 Pi. Pi Zero 只是其中一个比较低端的产品,H2(ARM Cortex-A7 Quad-core) 的CPU,512M 内存,1x 100M 网口, Wi-Fi 模块, OTG 电源 + 1x USB 2.0 ,最大 32GB TF 卡。当然操作系统要灌在 TF 卡上。

去 balenaCloud 注册一个账号以后,添加设备,选择香橙派 Pi Zero,下载 img,烧写到 TF 卡上,插入到香橙派,上电,插网线,它会自动 DHCP 从网络里取到 IP 地址,然后,过了很长很长时间(1天,2天?)后,在 balena 的云端可以看到“Online”,之前一直 Inactive,不理解是网络那里有问题。

Balena 在他们家网站介绍就是一堆构建,部署,管理 Linux 设备的工具集。下面的这个图基本上能概括他们家的产品列表。这是一家初创公司,看上去充满了很多创新的元素。

部署的前面10个设备是免费的,20个以内每个月 99 美元!50个设备,每个月 299 美元,100 个设备的话要 1299 美元,企业级支持是每月 2999 美元!

先看下,我们已经上线的香橙派吧:

让我们通过命令行进入香橙派看看里面到底是什么东西。我们用 balena scan 看下局域网内的设备:

我们用 balena ssh IP地址,就可以进入香橙派了。 使用 lsof -Pi 命令,我们就可以查看设备侦听的所有网络口:

看下板子的信息:

不需要重建分区的SD 卡分区扩容方案

OpenWrt 等一些操作系统刷完 img 到 SD 卡后, 16G 的 SD 卡,只用了一点点,经常需要“扩容”。之前的做法比较傻,就是重建分区,每次还要敲很多命令,还要把删除分区的起始扇区记录下来。

现在有了这段简单的代码,三行核心的代码就把这个工作自动化了,无需关心 SD 卡容量是 8G 还是 16G 还是更多,反正既然烧了,就是整张卡都是用在操作系统上了。

代码里的 DISK 就是类似 /dev/sdb 这样的, PART 就是分区 /dev/sdb2 这样的。 这里默认是第二分区。分区文件系统格式默认是 ext2/3/4 而不是其他。

burn () {
        fdisk -l ${DISK}>> /dev/null 2>&1 || (echo "could not find device $DISK - please check the name" && exit 1)
        # 烧写
        dd if=$IMG of=${DISK} bs=4M
        [ $? != 0 ] && echo "烧写出错了!" && exit 10
        MAXSIZEMB=$(printf %s\\n 'unit MB print list' | parted | grep "Disk ${DISK}" | cut -d' ' -f3 | tr -d MB)
        echo "[ok] ${PART} Will change to ${MAXSIZEMB} MB "
        parted ${DISK} resizepart 2 ${MAXSIZEMB}
        [ $? != 0 ] && echo "扩展分区出错了!" && exit 2
        e2fsck -y ${PART}
        resize2fs ${PART}
        [ $? = 0 ] && echo "文件系统扩展成功"
}

刷机愉快!

香橙派 Pi Zero Plus 上手记

废话不多说,树莓派玩了几台,之前买的是 Google AIY,还托兄弟从美国买了4台,69美刀一台,送了2台,自己留了2台,号称有 Tensorflow Lite 版本。但是自己没时间玩。后来又买了树莓派 4B,1G 内存的各种操作系统刷。 打算做一款屏蔽广告的产品,先要低成本啊, 搜到了老外用 Aliexpress 买的 Pi Zero,再一搜原来是深圳迅龙的产品,当然是挑 100 RMB 内的产品买,而且是要有有线网口的。所以就选了 Zero Plus。坑的是支持的操作系统版本没几个。 Arch Linux 的下载只有 135M,所以先从 Arch Linux Server 开始干起。

安装软件包,一定很慢, 所以先找国内的镜像, 国内有清华的,中科大的, 我们就把 /etc/pacman.d/mirrorlist 第一行修改为:
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo
然后 pacman Syuw 就可以去掉那个更新时的因为 ca-certificates 的冲突报错的问题。


再返回去,说一下板子的镜像烧写问题,因为有之前树莓派的经验,所以,手册也没看,就下载了其他不相关的镜像,导致以为板子坏了,投诉了售后的黄小姐,在她热情的指点下,终于明白了,这个板子是必须插 SD 卡才能会亮灯的。正常的启动后是 DHCP 拿地址的,然后板子是红灯亮,网口灯黄灯亮(100M?),绿灯闪。
吐槽一下他们家的百度下载,那个百度网盘实在坑爹,从 Google 网盘下载都有 4M每秒,可是百度上就只能是 100多 Kb/秒。

然后就是 pacman -S vim sudo proxychains dnsutils 等各种工具了

且慢! 磁盘空间不够了!根文件系统只有 1.1G,已经 100% 满了!

这个难不倒我们, 把 SD 卡拔出来放到一台 Linux 机器下, 用 fdisk 删分区,建分区,扩展,然后挂接, growfs 就可以。

敲入 shutdown -h now,Zero+ 就自己灭灯了, 只有绿灯还常亮。拔卡!

前面具体删分区,建分区的步骤就是比较简单, 建分区的时候要注意起始扇区要用前面删除之前的那个起始扇区号,其他都是默认就可以。 然后挂接到 /mnt 的时候,可能会遇到超级块错误,也不要慌, 先用 fsck.ext4 -y /dev/sdb2 来做好 fsck 就可以挂接了。 我们看下挂接好之后, resize2fs 前后的磁盘空间

好了, SD 卡已经扩容完毕,我们umount /mnt; eject /dev/sdb 把 SD 卡插回 Pi Zero+

接下来就是安装其他软件的事情了,我们且听下回分解 … …

树莓派4B 上安装最新版本的 Ubuntu 1910 eoan

下载地址: https://ubuntu.com/download/raspberry-pi

下载到 Linux 机器上后解压:
# xz -d ubuntu-19.10.1-preinstalled-server-arm64+raspi3.img.xz
# dd if=ubuntu-19.10.1-preinstalled-server-arm64+raspi3.img of=/dev/sdb bs=32M
# mkdir /mnt/boot; mount /dev/sdb1 /mnt/boot
# touch /mnt/boot/ssh
# umount /mnt/boot; rmdir /mnt/boot
# eject /dev/sdb
拔掉 micro SD 卡,插入到 树莓派, 在 DHCP 网络里, 树莓派会自动取 IP 地址, arp 或者 nmap 或者网关上查看,或者 直接 ping ubuntu 看看上线。如果没有看到树莓派,看看网线问题。 然后
# ssh ubuntu@ubuntu 密码也是 ubuntu , 第一次登录会要求更改密码,并退出。
再次登录就能正常使用 ubuntu 了。

OpenWrt 树莓派 根文件系统大小的调整

在一台 Linux 机器上,当我们用 dd 命令把 OpenWrt 的操作系统 img 映像文件写入到 Micro SD 卡的时候,根文件系统默认只有 104M。

在系统还没有进一步更新之前(SD 卡还插在 Linux 机器上),我们实际上应该先扩充根文件系统,否则后面也要走这一步的。 设SD 卡盘号为【/dev/sdb】

删除第二个分区,重新建一个第二分区,设置起始扇区为原先的扇区号,结束为默认。

新建完以后:

然后运行 resize2fs /dev/sdb2 就可以。
挂接后确认文件系统已经是 15GB:
# mount /dev/sdb2 /mnt
# df -h /mnt

把 SD 卡插回树莓派,启动验证。

树莓派 4B + OpenWrt

先看 OpenWrt 官方关于树莓派的文档。 知道 4B 是 BCM2711的 family,去对应的下载目录就能找到对应的镜像。 下载 gz 文件到 Linux 上, gunzip, 用 fdisk -l 找到插入的要烧写的 SD卡 的盘号。然后

# dd if=openwrt-brcm2708-bcm2711-rpi-4-ext4-sysupgrade.img of=/dev/sdb bs=2M conv=fsync
记录了88+0 的读入
记录了88+0 的写出
184549376 bytes (185 MB, 176 MiB) copied, 8.47041 s, 21.8 MB/s

把 SD卡插入树莓派上启动, 插入网线,看到网口绿灯闪烁,就是有线已经连接上了。

烧写完毕的 OpenWrt 默认的 IP 地址是 192.168.1.1,有两种更改 IP 的办法。
一种就是前面的步骤中,烧写完毕后, mount /dev/sdb2 /mnt
然后修改 /etc/config/network 文件, 把里面的 IP 地址修改掉就可以。
(在系统没有第一次启动之前是没有这个 network 文件的)
另外一种,就是等默认系统启动后,把自己的 PC 设置一个静态的 192.168.1.x 的地址,直接 ssh root@192.168.1.1,然后 uci show network 看下。
然后 uci set network.lan.ipaddr=’192.168.x.y’; uci commit 就可以了。
然后把 PC 修改回 DHCP 方式,用修改好的 IP 重新 ssh 就可以进入 4B 了。

这个时候操作系统上啥也没有,只有命令行界面。 我们先 route add default gw 192.168.x.1 把网关加上, 修改 /etc/resolv.conf 把 dns 服务指定好。 这样 nslookup baidu.com 看看是否能解析, 如果可以,恭喜!我们接下来就可以 opkg update ,开始安装软件了!

# opkg install lsof curl coreutils proxychains-ng vim bash uhttpd luci procps-ng-ps procps-ng-w bind-tools bind-host fdisk block-mount haveged libustream-openssl file unzip netcat

为了一些简单的开发工具下载,我们需要:
# opkg install git make

安装好以上基本包后,浏览器应该就可以登录了。 超级强大的 树莓派, 不能浪费啊!安装其他东东:(因为会自动安装相关的依赖包,我们就只写一个)

# opkg install luci-i18n-base-zh-cn luci-i18n-samba4-zh-cn

# opkg install luci-i18n-wireguard-zh-cn luci-i18n-cifsd-zh-cn luci-i18n-dnscrypt-proxy-zh-cn

树莓派的另外一种管理无线网络的办法

如果一个设备只能通过无线网络连接,真是蛮郁闷的,如果需要连接到不同的无线网络里去, 每次都要修改 SD 卡上的配置文件 /etc/wpa_supplicant/wpa_supplicant.conf
那不是郁闷死? 一种办法就是写一个自己手机的共享热点的 名称和密码, 记录下来。 下次万一需要设置树莓派, 把自己的手机名称和共享热点的密码修改一下,然后 PC 端也可以连接到手机的共享热点,这样,PC 端就能登录树莓派了。

话说 Mac 上如果要修改 SD 卡上的 Linux 分区还是真是不好办, 要安装一个什么 osxfuse 和 ext4fuse 的东东,Homebrew 又极其缓慢,最后还是用 VirtualBox 挂接的一个没有硬盘的只有的 CentOS7-Minimal ISO 启动到 Rescue 模式,挂接 U盘后解决的。 还有另外一个 USB OTG(On The Go) 的办法, 要去修改 /boot/cmdline.txt 如下:核心的就是在 rootwait 之后,添加了:
modules-load=dwc2,g_ether
还要确认 /boot/config.txt 包含:
dtoverlay=dwc2

重新启动后,可以看到树莓派上多出一块 usb0 的“网卡”,会提供 DHCP 给连接到上面的设备。我们的 Macbook 上网络设备会多出一个 RNDIS/Ethernet Gadget 的网卡,地址是 192.168.11.54,我们可以用 arp 或者 nmap 发现树莓派,这样就无需无线网络就可以登录树莓派了。

总结一下连接办法:一种是通过 Linux 虚拟机挂接 SD 卡修改无线配置文件,另外一种就是通过 USB 连接 data 端口,让 PC 设备成为 DHCP 客户端,还有一种就是把无线热点的配置固定写死到树莓派里。