Armbian系统的构建

构建环境说明

1
2
3
4
5
6
7
8
9
10
# WSL2上由于网络隔离了,所以需要先宿主机防火墙放行再设置虚拟机的代理
# PowerShell中运行来放开对wsl2的局域网访问权限, 设置 -> 防火墙 -> 高级设置 -> 入站规则中可看到
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow

# 开启代理,需要在国外下载相应文件
proxy_port=7890
proxy_host=$(ip route | awk '/default/ {print $3}')
export https_proxy="http://${proxy_host}:${proxy_port}"
export http_proxy="http://${proxy_host}:${proxy_port}"
export all_proxy="socks5://${proxy_host}:${proxy_port}"

开始构建系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 获取Armbian Build项目,项目运行时会自行安装缺少的依赖
git clone --depth=1 https://github.com/armbian/build
cd build

# 因为H88K设备无线网卡是MT7916,所以需要backport内核并使用我们自定义的内核配置
wget https://github.com/leux0/armbian-h88k-images/raw/main/backport-v6.1.39.patch -O patch/kernel/rk35xx-legacy/055-backport-v6.1.39.patch
wget https://github.com/leux0/armbian-h88k-images/raw/main/linux-rk35xx-legacy.config -O config/kernel/linux-rk35xx-legacy.config

# 构建不带桌面的最小系统镜像,计划用来当无线路由器
./compile.sh build BOARD=hinlink-h88k BRANCH=legacy RELEASE=bookworm GITHUB_MIRROR=cnpmjs \
BUILD_DESKTOP=no BUILD_MINIMAL=yes KERNEL_CONFIGURE=no KERNEL_GIT=shallow REGIONAL_MIRROR=china \
PACKAGE_LIST_BOARD="vim-tiny dnsmasq hostapd bridge-utils ifupdown iptables wireless-regdb"

# 构建带GNOME桌面的系统镜像
./compile.sh build BOARD=hinlink-h88k BRANCH=legacy RELEASE=bookworm \
BUILD_DESKTOP=yes BUILD_MINIMAL=no KERNEL_CONFIGURE=no KERNEL_GIT=shallow \
DESKTOP_ENVIRONMENT=gnome DESKTOP_ENVIRONMENT_CONFIG_NAME=config_base \
DESKTOP_APPGROUPS_SELECTED='3dsupport browsers desktop_tools internet' \
BOARD_FIRMWARE_INSTALL="-full" \
COMPRESS_OUTPUTIMAGE=sha,gpg,xz DEB_COMPRESS=xz SHARE_LOG=yes DEBUG=yes \
MAINLINE_MIRROR=tuna UBOOT_MIRROR=gitee GITHUB_MIRROR=cnpmjs DOWNLOAD_MIRROR=china

# 构建完成后可在 build/output/images 下看到img镜像,build/output/debs 中可找到内核安装包

构建参数解析

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
# 设备相关参数
BOARD 在 build/config/boards/ 下可找到支持的设备代号
BRANCH 在 build/config/kernel/ 下可找到支持的内核分支。legacy,vendor,edge
RELEASE 在 build/config/distributions/ 下可找到支持的发行版
BUILD_MINIMAL (yes | no) 如为yes则默认网络管理为:systemd-networkd,否则为:NetworkManager
BUILD_DESKTOP 是否安装桌面,与 BUILD_MINIMAL 相冲突
DESKTOP_ENVIRONMENT 在 build/config/desktop/common/environments 下可找到支持的桌面

# 内核相关参数。注意:由于rk3588的legacy内核已被Armbian官方抛弃,所以legacy内核都需要自行编译
INSTALL_HEADERS (yes | no) 是否安装内核头文件
BUILD_KSRC (yes | no) 是否在构建时创建内核源码包
INSTALL_KSRC (yes | no) 是否在预安装内核源码到镜像
KERNEL_GIT - shallow:仅含特定的分支。- full:包含所有支持的分支,不仅下载量非常大,也需要大量磁盘空间
KERNEL_CONFIGURE - prebuilt:使用预编译的内核包(仅适用于在维护的硬件)。- yes:通过内核配置界面配置(增减模块或功能)。
- no:使用Armbian提供的内核配置编译。如果留空则弹出内核配置界面。
# 镜像相关参数
BOOTSIZE 设置 /boot 分区大小(以MB为单位),如果 ROOTFS_TYPE=ext4 则失效
FIXED_IMAGE_SIZE 创建指定大小的镜像文件(以MB为单位),而不是按 rootfs 大小计算
ROOTFS_TYPE (ext4 | f2fs | btrfs | nilfs2 | xfs | nfs) 创建根文件系统时使用哪种格式
TRFS_COMPRESSION (lzo | none | zlib | zstd) 在 ROOTFS_TYPE=btrfs 时文件系统的压缩级别,默认为:zlib
IMAGE_XZ_COMPRESSION_RATIO (1-9) 使用xz压缩镜像时压缩级别。调高时要注意内存消耗
COMPRESS_OUTPUTIMAGE 压缩镜像文件和GPG签名等以便重新分发。 - sha:为镜像生成SHA256哈希。- gpg:使用GPG对映像进行签名
- 7z:将镜像、哈希和签名压缩到7Z存档。- gz:仅使用GZ格式压缩镜像。 - xz:仅使用XZ格式压缩镜像
# 下载来源相关
DOWNLOAD_MIRROR (china | bfsu) 选择 toolchain、debian、ubuntu、packages 等的下载源,留空为使用官方下载源
ARMBIAN_MIRROR (auto) 默认为自动选择Armbian的源,更改举例:ARMBIAN_MIRROR="https://yourlocalmirror.com"
MAINLINE_MIRROR (google | tuna | bfsu) 选择主线内核源码下载源,留空为使用官方地址:git.kernel.org
USE_MAINLINE_GOOGLE_MIRROR (yes | no) 如为yes则与MAINLINE_MIRROR=google的作用相同,即使用谷歌的主线内核源
UBOOT_MIRROR (github | gitee) 选择主线UBOOT源码的下载源,留空为使用官方地址:source.denx.de
USE_GITHUB_UBOOT_MIRROR (yes | no) 如为yes则与UBOOT_MIRROR=gtihub的作用相同,即使用GITHUB的UBOOT源
GITHUB_MIRROR (fastgit | gitclone | cnpmjs) 选择GitHub托管存储库的下载镜像。留空为直连到GitHub,但对于中国大陆用户来说可能很慢
REGIONAL_MIRROR (china) 根据选择区域设置apt源,不会覆盖已指定下载源选项的值。如果留空则使用默认设置
该值为china会设置后面变量的值为:MAINLINE_MIRROR=tuna, UBOOT_MIRROR=gitee, GITHUB_MIRROR=fastgit, DOWNLOAD_MIRROR=china
debootstrap也会从中国的tuna源获取rootfs,后续sources.list和armbian.list里用的也是 mirrors.tuna.tsinghua.edu.cn
# 其他相关参数
NAMESERVER ( IPv4 ) 在chroot中使用的DNS解析器,它不会影响最终镜像。默认为:1.0.0.1
CONSOLE_AUTOLOGIN (yes | no) 是否自动以root身份登录本地控制台(可能不安全,建议为no禁用)
SKIP_BOOTSPLASH (yes | no) 跳过内核启动画面

其他构建技巧

  1. 使用自定义的内核配置文件
1
2
3
4
5
6
7
8
9
# UBOOT和内核源码地址及分支都在该文件中定义:build/config/sources/families/rk35xx.conf
# 如果该内核配置文件存在:userpatches/linux-$LINUXFAMILY-$BRANCH.config
# 则将使用它们而不是默认的配置文件:build/config/kernel/linux-rk35xx-legacy.config
userpatches/linux-rk35xx-legacy.config # 例子1
userpatches/linux-rockchip64-current.config # 例子2

# 内核补丁存放位置,根据数字字母排序先后应用补丁
build/patch/kernel/rk35xx-legacy/0000.patching_config.yaml
build/userpatches/kernel/rk35xx-legacy/0000.patching_config.yaml
  1. 查看桌面集合包内含软件包
1
2
3
4
# DESKTOP_APPGROUPS_SELECTED 中的包集合可在 build/config/desktop/common/appgroups/xxx/packages 中查看其包含的具体包
# DESKTOP_APPGROUPS_SELECTED="browsers chat desktop_tools editors email internet multimedia office programming remote_desktop"
build/config/desktop/common/appgroups/ # 通用包集合,对应 DESKTOP_APPGROUPS_SELECTED
build/config/desktop/common/environments/ # 桌面包集合,对应 DESKTOP_ENVIRONMENT
  1. 安装特定的软件包
1
2
# 既可以在构建时使用 PACKAGE_LIST_BOARD="vim-tiny" 来安装,但需注意 build/config/boards/hinlink-h88k.csc 中是否已定义
# 也可在 build/userpatches/customize-image.sh 中使用 apt install vim-tiny 来安装自定义的软件包
  1. 克隆的源码在本地的路径
1
2
3
4
5
6
7
8
# 源码在本地的路径
build/cache/sources/rkbin-tools/ # rkbin克隆到本地的位置
build/cache/sources/u-boot-worktree/u-boot-rockchip64/next-dev-v2024.03/ # u-boot源码克隆到本地的位置
build/cache/sources/linux-kernel-worktree/5.10__rk35xx__arm64/ # 内核源码克隆到本地的位置

# Armbian预编译的软件包版本查看
https://github.com/armbian/os/pkgs/container/os%2Fuboot-hinlink-h88k-legacy # uboot-hinlink-h88k-legacy
https://github.com/armbian/os/pkgs/container/os%2Farmbian-firmware-full # armbian-firmware-full
  1. 怎么跳过首次登录脚本(创建用户、时区语言、网络连接等)

如果存在文件 /root/.not_logged_in_yet 那么启动就会运行Armbian的首次登录脚本 /usr/lib/armbian/armbian-firstlogin 来配置系统环境
删除它后可跳过执行,后续再想执行首次登录脚本来配置系统环境,可先 touch /root/.not_logged_in_yet,然后执行 /usr/lib/armbian/armbian-firstlogin

  1. 怎么在 chroot 环境中运行用户的脚本来自定义系统镜像
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
46
47
48
# 脚本 build/userpatches/customize-image.sh 会被复制到 chroot 环境中的 /tmp 目录并在 chroot 环境中执行
# 在 git clone armbian build 项目后创建的 userpatches/customize-image.sh 脚本不会在编译时被覆盖
# 构建主机上的 build/userpatches/overlay 目录在 chroot 环境中会绑定到 /tmp/overlay
# 将文件放在 build/userpatches/overlay 下,即可在 customize-image.sh 中通过 /tmp/overlay 路径进行访问
# 在 customize-image.sh 中可通过 $1 $2 $3 $4 来获取 RELEASE LINUXFAMILY BOARD BUILD_DESKTOP 等变量

leux@B650:~$ cat build/userpatches/customize-image.sh
#!/bin/bash

RELEASE=$1
LINUXFAMILY=$2
BOARD=$3
BUILD_DESKTOP=$4

# 输出的内容为:bookworm rk35xx hinlink-h88k no
echo "$RELEASE $LINUXFAMILY $BOARD $BUILD_DESKTOP"

# 跳过首次脚本(默认用户密码:root:1234)
rm /root/.not_logged_in_yet

# 禁网卡重命名
echo "extraboardargs=net.ifnames=0" >> /boot/armbianEnv.txt

# 开启内核转发
sed -i "s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/" /etc/sysctl.conf
sed -i "s/#net.ipv6.conf.all.forwarding=1/net.ipv6.conf.all.forwarding=1/" /etc/sysctl.conf

# 拷贝编译好的程序
cp -p /tmp/overlay/quectel-CM /usr/local/bin/
chmod 755 /usr/local/bin/quectel-CM

# 配置脚本来开机自启
cat << EOF > /etc/systemd/system/quectel-cm.service
[Unit]
Description=Quectel-CM Service
After=network.target
Wants=network.target

[Service]
ExecStop=/bin/kill -s TERM \$MAINPID
ExecStart=/usr/local/bin/quectel-CM -s ctnet -4 -6

[Install]
WantedBy=multi-user.target
EOF

# 设置软件开机自启
systemctl enable quectel-cm

构建问题修复

  1. 需要使用支持UTF-8的终端例如Windows Terminal,或者出现该问题时输入<Enter>跳过,否则10秒后将退出
1
2
3
4
Please use a terminal that supports UTF-8. For example: [ Windows Terminal ]
[💲|🚸] Get it at the Microsoft Store [ https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701 ]
[💲|💥] Problem detected [ WSL2 Terminal does not support UTF-8 ]
[💲|💥] Exiting in 10 seconds [ Press <Ctrl-C> to abort, <Enter> to ignore and continue ]