概述
有很多开源软件并没有提供 arm 安装包或者二进制,或者能通过包管理工具安装但是版本比较旧(比如 Pandoc)。如果想为树莓派编译软件,一个方法是直接在树莓派上编译,另外就是在 x86 平台上借助 qemu-user-static
来构建 armv7l 或者 aarch64 编译环境。使用 qemu-user-static
方法的好处是方便在 CI 里编译,毕竟大部分 CI 服务都是 x86 环境。另外一个好处是能够编译大型的耗内存的软件,树莓派的内存最大只有 8GB,某些软件,比如 Pandoc,可能遇到内存不足的情况。
qemu-user-static
- 安装:
apt install qemu-user-static
- 下载基础文件系统,比如 arm64 的 Ubuntu:
aria2c -x 16 http://cdimage.ubuntu.com/ubuntu-base/releases/19.10/release/ubuntu-base-19.10-base-arm64.tar.gz
mkdir rootfs
cd rootfs
tar xvf ../ubuntu-base-19.10-base-arm64.tar.gz
- 复制对应版本的 qemu-user-static 到 chroot 环境:
cp /usr/bin/qemu-aarch64-static usr/bin
- 复制 DNS 配置:
cp /etc/resolv.conf etc
- 挂载文件系统
1 2 3 4 5 |
sudo mount -t devtmpfs devtmpfs dev sudo mount -t devpts devpts dev/pts sudo mount -t sysfs sysfs sys sudo mount -t tmpfs tmpfs tmp sudo mount -t proc proc proc |
然后使用 chroot . /bin/bash
就可以 chroot 到这个 aarch64 架构的 Ubuntu 系统了。
持续集成
chroot 的命令格式为:
1 |
chroot [OPTION] NEWROOT [COMMAND [ARG]...] |
如果要在持续集成中使用 qemu-user-static
, chroot 时的 [COMMAND [ARG]...]
改为要执行的脚本即可,比如将构建过程写在 build.sh
中并复制到 chroot 环境的根目录,然后执行以下代码即可:
1 |
chroot . /build.sh |
下面是使用 Github Action 编译 Pandoc aarch64 的一个例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
name: pandoc-aarch64 on: [push] jobs: aarch64-pandoc: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: build run: | mkdir rootfs export pkg=`curl -s "http://hackage.haskell.org/package/pandoc" |grep "base href" |awk -F'"' '{print $2}' |sed 's/\/$//g' |awk -F'/' '{print $NF}'` curl -s -L "https://github.com/arm4rpi/pandoc-arm/releases/download/v0.1/aarch64-$pkg.tar.gz" -o rootfs/aarch64-$pkg.tar.gz MIME=`file -b --mime-type rootfs/aarch64-$pkg.tar.gz` echo $MIME [ "$MIME"x == "application/gzip"x ] && echo "Already exists" && exit 0 || echo "Not exists" sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=12288 sudo dd if=/dev/zero of=/home/swapfile bs=1M count=10240 sudo mkswap /mnt/swapfile sudo mkswap /home/swapfile sudo swapon /mnt/swapfile sudo swapon /home/swapfile free -m df -h sudo apt-get update sudo apt-get install -y qemu-user-static aria2 aria2c -x 16 http://cdimage.ubuntu.com/ubuntu-base/releases/19.10/release/ubuntu-base-19.10-base-arm64.tar.gz cd rootfs echo "decompression rootfs" tar xvf ../ubuntu-base-19.10-base-arm64.tar.gz &>/dev/null && echo "decompression rootfs successfull" cp /usr/bin/qemu-aarch64-static usr/bin cp /etc/resolv.conf etc cp ../build.sh ${pkg} cp ../cabal.project* . sudo mount -t devtmpfs devtmpfs dev sudo mount -t devpts devpts dev/pts sudo mount -t sysfs sysfs sys sudo mount -t tmpfs tmpfs tmp sudo mount -t proc proc proc echo "chroot to arm" sudo chroot . /${pkg} echo "Upload Asset" for id in `ls aarch64-*.tar.gz`;do curl -H "Authorization: token ${{ secrets.TOKEN }}" -H "Content-Type: application/x-gzip" "https://uploads.github.com/repos/arm4rpi/pandoc-arm/releases/24024627/assets?name=$id" --data-binary @$id done |
后记
折腾这些主要是想给树莓派编译最新的 Pandoc,但是折腾了半个月,还是没成功,主要是 qemu-user-static
性能比较差,Haskell 编译本来就不快。结果就是 6 小时都没法执行完成,超过了 Github Action 的限制。还有就是 Haskell 编译很耗内存,Github Action 内存已经挺大了,还需要建 swap
。但是这种方法应该还是有意义的,其他程序应该不至于这么耗时。
还是 Golang 方便,编译快,交叉编译也很简单:
1 |
CGO_ENABLED=0 GOOS=linux GOARCH=arm go build |
参考资料
1 |
1. https://www.jianshu.com/p/ee7ba9a188d0 |
发表回复