创建干净可迁移的 Armbian 环境
各种环境缺点
Armbian 的构建项目 一直以来都是有自己官方的构建要求,而且随着版本更迭,会有不同要求。如 23.08 和 21.08 的构建脚本在系统包和构建方式就有很大区别。
使用一般环境
老版本有非官方的 Docker 项目,但是问题很多。虚拟机的话,虽然在官方支持列表,效率和内存暂不说,硬盘这个就是大问题,你挂 Virtualbox 的 vboxsf 和 cifs 都是编译不了的,如果代码要放到虚拟机里头,那就真的麻烦了。主机系统来搞的话,很容易又把系统搞得很脏,还不利于分版本编译。
使用容器环境
最好的方式就是利用如 lxd
或 systemd-nspawn
等系统级别的容器来创建,但是容器有个缺点,需要有创建并读取新设备的权限,可惜系统级别的容器都会以 tmpfs
自动挂载 /dev
,虽然可以给予设备权限,但是新设备是没法自动看到的。于是这里有个 /dev
需要读写(通过主机的 loop 设备,创建新的主机 loopXpY 设备能够读到并且操作)和不该被读写(容器会覆盖主系统,导致安全和奔溃)的矛盾。如果利用如 docker
这样应用级别的容器,将 /dev
完全开放,是一个解决办法,但是比起系统级别的容器来讲,有动态映射的问题和系统管理的麻烦,且依旧摆脱不聊覆盖系统设备的风险。
使用 chroot
环境
如果系统级容器解决不了设备问题,那么最简单的方式就是 chroot
或者各种 fakeroot
技术。为了不使容器系统的系统级别的包影响到主机设备,最好是在 chroot
之前,借用 lxd
或 systemd-nspawn
等运行 Armbian 的构建脚本把需要的包安装好。
开始
这里以老版本 21.08 来说,其他版本同理。
创建系统
21.08 依赖的操作系统是 Ubuntu Hirsute:
debootstrap --include=systemd,dbus hirsute hirsute http://mirrors.ustc.edu.cn/ubuntu-old-releases/ubuntu/
安装依赖
这里假定 Armbian 的构建项目在 $HOME/Documents/Projects/Other/Armbian/build
。
systemd-nspawn -D hirsute
passwd
exit
systemd-nspawn -D hirsute -b --bind="$HOME/Documents/Projects/Other/Armbian:/mnt"
然后进入系统创建普通用户并成为 sudoer,使用用户到 /mnt/build
执行 ./compile.sh
。该怎么执行就怎么执行,主要是为了在正式构建镜像之前把包自动安装。安装完就退出容器。
运行环境
for target in dev dev/pts proc sys ; do mount -o bind /$target ./hirsute/$target ; done
mount --bind "$HOME/Documents/Projects/Other/Armbian" ./hirsute/mnt
chroot hirsute
使用完后最好把设备都 umount
掉:
umount -R ./hirsute/{mnt,dev/pts,dev,proc,sys}