创龙 Linux 镜像编译
(文章是编译创龙的 t153 开发板系统时记录的,不一定适用于所有开发板)
准备环境
准备系统源码
一般开发板厂商都会随系统给一份 linux 的源码,大概好几个 G,下载这份源码。放到希望编译的机器里。
我是要在一台 linux PC 里编译,所以会复制到系统里,找一个工作目录解压。
准备文件系统
我因为要编译的是 ubuntu 系统,厂商有提供预制好的 ubuntu 文件系统,需要复制到 buildroot 目录下替代原始的 buildroot 文件系统。这块根据厂商的文档来。
准备编译系统
根据厂商的文档,看他们要求系统镜像要在什么环境下构建。比如我这里是要求在 ubuntu 22.04 LTS 版本里构建。
我们可以在虚拟机里准备系统环境,也可以在 docker 里准备,我比较习惯在 docker 里。
运行 docker 镜像,将前面准备的源码挂载到容器里。
我这里为了安装包方案,也挂了一个镜像源进去了。
services:
ubuntu-builder:
image: ubuntu:22.04
container_name: ubuntu_container
# 对应 -it
stdin_open: true
tty: true
# 对应 -v $(pwd):/work
volumes:
- .:/work
- ./source.list:/etc/apt/sources.list
working_dir: /work
# 对应 /bin/bash
command: /bin/bash
source.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# 以下安全更新软件源为官方源配置
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
deb http://us.archive.ubuntu.com/ubuntu trusty main universe
提前安装依赖库
sudo apt install -y build-essential libssl-dev flex bison gawk git unzip libxml2-utils rsync python3 python3-dev libncurses5-dev libncursesw5-dev pkg-config busybox
官方文档里可能也会提供依赖清单,也复制到系统里安装。
在最后选 no。
Use dash as the default system shell (/bin/sh)? [yes/no] no
开始编译
进入到解压的源码目录
配置编译选项
.build.sh config
正常情况下会给出脚本的帮助信息。
选择内核
./build.sh menuconfig
All available platform:
0. android
1. linux
2. ubuntu
这里我需要选 ubuntu,因为我是要构建 ubuntu 系统。
All available linux_dev:
0. bsp
1. buildroot
bsp(Board Support Package),板级支持包是更底层的程序,只包含了一个硬件平台能跑起来的最基本的代码。我这里需要构建一个比较完整的系统,所以选 buildroot。
All available flash:
0. default
1. nor
default 通常指 NAND Flash 或者 eMMC。nor 指 SPI NOR Flash,通常用于启动引导或超小型路由,容量极小。我这里是 NAND Flash,所以选 default。
All available kern_name:
0. linux-5.10-origin
1. linux-5.10-rt
2. linux-5.10-xenomai
origin 是标准 Linux 内核,通用应用场景,我是做网关,选这个。
rt 是实时内核补丁,主要用于中等实时性的工业控制。
xenomai 是硬实时双内核框架,在一个 linux 旁边跑一个实时微内核,用于高性能工业机器人框架。
内核模块选择
选择完后就会进入一个这样的蓝底 TUI 选择框

一种方式是手动点选,比如
把光标移到 Device Drivers,按回车进入。
向下翻,找到 Network device support,按回车进入。
找到 Universal TUN/TAP device driver support。
操作:按空格键,直到前面的括号里显示 <>(代表直接编译进内核)。
2. 开启 WireGuard(Netbird 的性能加速)
就在刚才那个 Network device support 目录下不要退出。
向下翻,寻找 WireGuard secure network tunnel。
操作:同样按空格键,确保前面是 <>。
第二种是直接使用搜索,在勾选模块的页面按 /,然后输入下面的内容,如果是 =y 表示开启了,否则就是没有开启,可以点前面的数字直接进入配置项勾选。
- tun 相关
- wireguard (CONFIG_WIREGUARD):WireGuard 核心协议模块。Linux 5.6 以上内核已原生自带。
- tun (CONFIG_TUN):虚拟网络设备模块。Netbird 创建 wt0 必须依赖它。
- udp_tunnel (CONFIG_NET_UDP_TUNNEL):UDP 隧道支持。
- nat 相关
- nf_nat / iptable_nat (CONFIG_IP_NF_NAT):提供 MASQUERADE(网络地址转换),没有它局域网设备上不了网。
- nf_conntrack (CONFIG_NF_CONNTRACK):连接状态跟踪(RELATED, ESTABLISHED),非常重要,用于识别回程包。
- iptable_filter (CONFIG_IP_NF_FILTER):支持 INPUT/FORWARD 等过滤链。
- 网桥模块
- bridge (CONFIG_BRIDGE):如果你要把多个物理网口或者局域网设备绑在一起。
- br_netfilter (CONFIG_BRIDGE_NETFILTER):允许 iptables 规则对网桥(br0)上的流量生效。
- IP_NF_TARGET_MASQUERADE
保存配置
./build.sh saveconfig
编译
# 这是全量编译
./build.sh
# 我只是改了内核相关的,可以只编译内核和驱动模块
./build.sh kernel
./build.sh modules
打包
./build.sh pack
打包完成后就可以得到完整的 linux 镜像了。然后按流程写入到开发板即可。如果遇到构建的系统无法正常进入系统,可以参考[[mac 连接开发板串口]]通过串口连接上开发板查看开机日志。