记录过年回家前的一次折腾,把ArmSom-Sige5开发版刷了社区版Armbian又降回板子厂商提供的unofficial Armbian,配置软路由功能兼有Linux环境开发体验。
免责声明:初次接触开发版我也忘记哪里看到ArmSom的广告就买了,可能我只是喜欢他家的💜紫色外壳,不保证本文有参考价值,仅作为个人踩坑记录。
固件eMMC烧写
因为手头没有可用的microSD卡,选择type-C数据线直连电脑和板子烧录固件到eMMC。具体步骤如下:
准备工作
- 两根type-C线,一根用于开发版和电脑连接,一根为开发版供电。
- 准备 MiniLoader (ArmSom官方提供,sige5为RK3576_MiniLoaderAll)
- 准备 System Image
- 我使用的是ArmSom提供的unofficial Armbian镜像
- Armbian Community 镜像
- 其他镜像请参考ArmSom Sige5文档
- 烧录工具
- Windows 使用 RKDevTool(ArmSom官方提供)
- Linux/macOS 使用 rkdeveloptool
烧录步骤
进入 Maskrom 模式,参考镜像烧录步骤
- 断开所有供电电线,连接开发版和电脑
- 使用一根Type-C线连接开发版Type-C口(非供电接口)和电脑的usb接口,使用软件检测
- Windows RKDevTool 下方显示
No Devices Found
- Linux/macOS 运行
rkdevelotool ld
显示not found any devices!
- Windows RKDevTool 下方显示
- 按住Mashrom按键,使用另一根Type-C线连接开发版Type-C口(供电接口)和电源
- Windows RKDevTool 下方显示 “Found One Loader Device”,可松开按键
- Linux/macOS 运行
rkdevelotool ld
检测到设备DevNo=1 Vid=0x2207,Pid=0x350e,LocationID=201 Maskrom
,可松开按键
- 根据下面的平台/软件选择要烧录的 System Image 进行烧录
Windows RkDevTool
其中 Loader Path 为MiniLoader路径,Image Path 为所烧录镜像的路径。起始地址为 0x0000 无需修改,注意勾选 Write by Address,点击 Run 开始烧录。右侧Download image完成即烧录完成。
Linux/macOS rkdeveloptool
命令行执行
rkdeveloptool db RK3576_MiniLoaderAll.bin
rkdeveloptool wl 0x0000 Armbian_community_25.2.0-trunk.86_Armsom-sige5_noble_vendor_6.1.75_gnome_desktop.img
rkdeveloptool rd
等待烧录完成。
Armbian 初始配置
开发版接电,使用HDMI接口外接显示器,我烧录的是带有GNOME桌面环境的Armbian镜像,初次登录需要一些配置,还不能直接进入桌面系统。Armbian 默认登录root密码为1234。初始配置包含以下:
Welcome to Armbian!
Documentation: https://docs.armbian.com/ | Community support: https://forum.armbian.com/
IP address: Network connection timeout!
Create root password: ********
Repeat root password: ********
Shell: BASH
Please provide a username (eg. your first name): ?
Create user (Jane) password: ********
Repeat user (Jane) password: ********
...
完成配置后桌面系统会重启进入GNOME桌面,非桌面系统会新建 ssh 对话。
Armbian 系统换源
由于国内网络问题,进入系统首先更换镜像源[1] [2],Armbian是构建在Debian或Ubuntu发行版上,需要编辑:
/etc/apt/sources.list/armbian.list
armbian专属软件源和/etc/apt/sources.list
发行版基础的软件源。
Armbian 专属软件源换源
可参考 TUNA Mirror Help
或者使用下面的镜像选择脚本
#!/bin/bash
GREEN='\033[0;32m'
CYAN='\033[0;36m'
RED='\033[0;31m'
NC='\033[0m'
SOURCE_FILE="/etc/apt/sources.list.d/armbian.list"
CURRENT_SOURCE=$(grep -Eo 'https?://[^ ]+' "$SOURCE_FILE" | head -n 1)
if [[ "$CURRENT_SOURCE" == *"tuna.tsinghua.edu.cn"* ]]; then
CURRENT_SOURCE_NAME="Tsinghua 清华大学镜像源"
elif [[ "$CURRENT_SOURCE" == *"ustc.edu.cn"* ]]; then
CURRENT_SOURCE_NAME="USTC 中国科学技术大学镜像源"
elif [[ "$CURRENT_SOURCE" == *"apt.armbian.com"* ]]; then
CURRENT_SOURCE_NAME="官方镜像源"
else
CURRENT_SOURCE_NAME="未知镜像源"
fi
echo -e "${CYAN}======================================${NC}"
echo -e "${CYAN} Armbian Mirror Switcher Script ${NC}"
echo -e "${CYAN}======================================${NC}"
if [ -n "$CURRENT_SOURCE" ]; then
echo -e "${GREEN}当前源:$CURRENT_SOURCE${NC}"
echo -e "${GREEN}镜像源名称:$CURRENT_SOURCE_NAME${NC}"
else
echo -e "${RED}未检测到有效的源配置!${NC}"
fi
echo -e "${GREEN}请选择要切换的镜像源:${NC}"
echo -e "1. Tsinghua 清华大学源 (https://mirrors.tuna.tsinghua.edu.cn)"
echo -e "2. USTC 中国科学技术大学源 (https://mirrors.ustc.edu.cn)"
echo -e "3. 恢复为默认的官方源 (http://apt.armbian.com)"
echo -ne "${CYAN}请输入选项 (1, 2 或 3): ${NC}"
read -r choice
case $choice in
1)
echo -e "${GREEN}切换到 Tsinghua 源...${NC}"
sudo sed -i.bak -E 's#https?://(mirrors\.(tuna\.tsinghua\.edu\.cn|ustc\.edu\.cn)|apt\.armbian\.com)#https://mirrors.tuna.tsinghua.edu.cn#g' "$SOURCE_FILE"
echo -e "${GREEN}源已成功更换为 Tsinghua 清华大学镜像!${NC}"
;;
2)
echo -e "${GREEN}切换到 USTC 源...${NC}"
sudo sed -i.bak -E 's#https?://(mirrors\.(tuna\.tsinghua\.edu\.cn|ustc\.edu\.cn)|apt\.armbian\.com)#https://mirrors.ustc.edu.cn#g' "$SOURCE_FILE"
echo -e "${GREEN}源已成功更换为 USTC 中国科学技术大学镜像!${NC}"
;;
3)
echo -e "${GREEN}恢复为默认的官方源...${NC}"
sudo sed -i.bak -E 's#https?://(mirrors\.(tuna\.tsinghua\.edu\.cn|ustc\.edu\.cn)|apt\.armbian\.com)#http://apt.armbian.com#g' "$SOURCE_FILE"
echo -e "${GREEN}源已恢复为默认的官方镜像!${NC}"
;;
*)
echo -e "${RED}无效输入!请重新运行脚本并选择 1, 2 或 3。${NC}"
exit 1
;;
esac
echo -ne "${CYAN}是否立即更新软件包索引?(y/n): ${NC}"
read -r update_choice
if [[ "$update_choice" =~ ^[Yy]$ ]]; then
echo -e "${CYAN}更新软件包索引...${NC}"
sudo apt-get update
echo -e "${GREEN}软件包索引更新完成!${NC}"
else
echo -e "${CYAN}已跳过更新软件包索引。${NC}"
fi
echo -e "${GREEN}镜像源切换操作完成!${NC}"
发行版基础Debian/Ubuntu 换源
根据登录开发版 motd 信息获取确定发行版基础[2],比如我的显示如下:
Noble 表示基于 Ubuntu 24.04 (noble)
或者可以使用cat /etc/os-release
获取详细系统信息
edwardzcn@armsom-sige5:~$ cat /etc/os-release
PRETTY_NAME="Armbian 24.11.3 noble"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.armbian.com"
SUPPORT_URL="https://forum.armbian.com"
BUG_REPORT_URL="https://www.armbian.com/bugs"
PRIVACY_POLICY_URL="https://www.armbian.com"
UBUNTU_CODENAME=noble
LOGO="armbian-logo"
ARMBIAN_PRETTY_NAME="Armbian 24.11.3 noble"
确定是ubuntu还是debian就可以选择镜像源,以清华源为例
- 清华大学Debian源 https://mirrors.tuna.tsinghua.edu.cn/help/debian
- 清华大学Ubuntu Ports源 https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu-ports
注意Ubuntu系要选择ubuntu-port源,换源可参考 TUNA Mirror help 或者 USTC Mirror Help
还是以使用清华源为例,手动修改/etc/apt/sources.list
sudo nano /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ noble-backports main restricted universe multiverse
现在你不用看着10+Kbps的网速干着急可放心使用
sudo apt update
sudo apt upgrade
瞧瞧你的板子,说实话ASCII画我还是喜欢原来那个大A。
sudo apt install neofetch -y && neofetch
静态 IP + ssh 调试
我更习惯使用我的工作机(一台mac)通过网线连接板子,使用 ssh 做基础路由设置以及一些软件更新,桌面系统开始会有卡顿(以及无浏览器等问题)
插入网线后,假定工作机以太网接口连接开发版eth1接口
- 在工作机上设置网络-以太网
手动
配置IPv4,IP地址192.168.1.100
,子网掩码255.255.255.0
- 在开发版上设置网络 手动(Manual)IPv4(取消掉自动DHCP),IP地址
192.168.1.1
(常见路由器地址),子网掩码255.255.255.0
ping
测试是否可以连通,确定ICMP可用,然后使用 Armbian初始配置中 设置的用户密码(桌面系统建议连接非root用户)
# 工作机 ping 开发板
zmac-mini:~:% ping -c 5 192.168.1.1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=0.918 ms
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.885 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.818 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.773 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.867 ms
--- 192.168.1.1 ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.773/0.852/0.918/0.051 ms
使用 ssh 密码登录,后续 Armbian开发板 ssh 登录配置类似于 VPS 远程 ssh 登录配置[3],可根据自己习惯和需求配置密钥登录等。
调整电源计划和休眠设置
有些时候可能 ssh连接一段时间会遇到系统被挂起(suspend)的提示,方便起见还是关掉GNOME电源选项的 Automatic Suspend,我并不确定是因为这个挂起的,因为suspend的日志没看懂也没找到命令行设置方式。
Armbian 基础路由
好的似乎终于进入正题了,先说说为什么突然想着折腾小板子,以及为什么选择了 Armbian,我先放几个理由,有想到再补充
- 兼顾软路由,但又不想要openwrt
- openwrt固然很方便,但有两个点为人诟病:包管理问题、为照顾大量低性能的设备做了兼容(但事实上,你并不一定会用这些IoT设备对吗?)。Armbian 基于Ubuntu或者Debian给了更多玩法,特别是对有Linux使用经验的玩家/开发者,可以使用apt包管理工具,充分利用这一价位开发版的价值(比如利用板载npu做一点推理,毕竟都自称mini computer了)
- 套壳/层叠的软件栈带来很多负担。个人便好,不喜欢docker虚拟机套壳最后只部署一个软路由。
- 另外有技术佬说
openwrt 很灵车但我没遇到过
- Use Armbian just like Ubuntu+/Debian+
- 虽然没有openwrt或者硬路由提供的面板,
armbian-config
基本上覆盖了应有的便捷配置(如果你喜欢这种 CLI 交互就更适合了),不过你现在还用不了,armbian-config
需建立和github.com的通信 - 恰有基于arm镜像的服务需要跑
- 剩余的性能释放出来跑我的脚本和检测🐤面板
出来吧 NAS
本节先更新基础的路由部分,以及对桌面环境的必要调整
其实一个基本的(软)路由器系统主要包括下面几项服务,开箱即用的面板或者一键式脚本只是简化帮助完成这些配置[1]。
- DNS:域名解析服务,用于将主机名称(局域网主机名,域名解析)解析为IP地址
- 可以当作:小区户名-门牌号查询簿
- 请注意:公网上提供DNS服务是被禁止的,会被封IP,该项服务只允许运营商提供
- 由于传统DNS查询是明文,可以被中间人截留修改造成DNS污染,需要适当调整,比如使用DoH和DoT分流。
- 可用工具 systemd-resolved,TelescopeDNS,EasyMosdns和dnsmasq
- DHCP:动态IP地址分配协议(服务器)。终端网络设备一般会装载DHCP客户端(client)来自动请求并获取动态ip。(软)路由器系统的DHCP这里实际上是指DHCP服务器(server),用来分发管理局域网的ip地址,回应DHCP客户端发来的请求。
- 可以当作:小区住户门牌号地址簿(搬家会更新)
- 可用工具 coredhcp(yaml配置)/ dnsmasq(conf配置)
- NAT:网络地址转换,建立局域网
<IP,Port>
元组与外网<IP,Port>
映射,并进行转换。- 可以当作:小区特派巴士座位表(巴士是和城市沟通的交通方式)
- 可用工具 iptables,nftables
- IP Forwarding:IP转发,只有启用后才会将开发版某个接口(比如连接局域网设备)不经本地程序转发至外网接口。作为操作系统内核功能,用于支持多网卡设备在不同接口间的通信。
- 可以当作:手拿座位表的特派巴士司机/售票员
在基础路由中我都挑选配置尽量简单,易兼容的工具。
网络连接管理
Linux的网络连接管理可以使用 systemd-networkd
或 NetworkManager
。我搭建的基于Ubuntu的Armbian习惯用后者,还提供了更高层次的抽象netplan
。理解成网络计划,简化编写,完成后可以自动渲染成NetworkManager
描述。
修改netplan
配置文件,默认在/etc/netplan/
目录,序号大的覆盖小的,为避免冲突,合并用一个文件描述,名字设为00-default-use-network-manager.yaml
。如果你看到了其他以UUID命名的文件,则是通过GUI界面生成的配置,可以删除。
未经修改的文件类似:
network:
version: 2
renderer: NetworkManager
修改后:
network:
version: 2
renderer: NetworkManager
ethernets:
eth1:
dhcp4: false
addresses:
- 192.168.1.1/24
nameservers:
addresses:
- 192.168.1.1
执行sudo netplan apply
使改变生效。可以在 GNOME 桌面的网络配置 GUI 中看到改变生效(名称暴露了是谁修改的):
DNS 和 DHCP 配置
Armbian 默认使用 NetworkManager 中的 systemd-resolved组件,这个 DNSstub 监听 127.0.0.53
上的 53
端口,其仅能监听本机请求而不能接受局域网内其他机器的请求,当路由肯定是不够的,安装并使用 dnsmasq
作为DNS服务器,同时它也是一个轻量级的DHCP服务器,配置文件默认在/etc/dnsmasq.conf
[4]。
sudo apt install dnsmasq
sudo vim /etc/dnsmasq.conf
dnsmasq默认配置注释,初看很吓人,但实际上我们需要让路由跑起来并不需要调整很多,大多数配置看注释就能明白。这里给出我的最小化配置(还是假定开发版的eth1接口连接局域网设备)
server=1.1.1.1 # 指明上游 DNS服务器
interface=eth1 # 指定 DHCP 服务绑定的网络接口
bind-interfaces # 只监听对应接口的请求(即eth1 接口的地址)
dhcp-range=192.168.1.100,192.168.1.200,12h # 分配 IP 地址范围(这里分配100-200)
dhcp-option=option:router,192.168.1.1 # 指定使用本网关 (默认网关)
dhcp-option=option:dns-server,192.168.1.1 # 指定使用本路由器 DNS
log-queries
log-dhcp
bind-interfaces
设置使dnsmasq
只监听对应接口请求,而非监听0.0.0.0所有可用地址,用于兼容正在运行的 systemd-resolved
(监听127.0.0.53的53端口),防止冲突。dhcp-option
开头的设置都和DHCP协议中option段有关,上述两条会让client端自动配置网关和DNS为当前配置路由器的地址。
如果不打算兼容systemd-resolved
,我们需要调整/etc/resolv.conf
并停止systemd-resolved
服务,这里我们暂不考虑,优先让路由器跑起来。
重启 dnsmasq
服务,查看状态
sudo systemctl restart dnsmasq.service
sudo systemctl status dnsmasq.service
服务Active,请先忽略那条Fail,现在可以修改你工作机的网络设置,调整为DHCP(动态获取IP地址),效果如下:
NAT 和 IP Forwarding
虽然客户机能拿到ip地址,但我们还不能访问外网。此时开发版并不会将数据包从eth1(内网接口)递送至eth0(外网接口),也不知道内网地址和外网地址的翻译规则。
IP Forwarding 是 NAT 实现的基础,它负责将数据包在不同接口之间转发,而NAT更像是定义规则怎么修改为内网/外网地址,两者搭配食用味道更佳。
启用 IP 转发
编辑/etc/systl.conf
:
sudo vim /etc/systl.conf
找到对应行取消注释,开启ipv4和ipv6转发。
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
net.ipv6.conf.all.forwarding=1
运行sudo sysctl -p
使改变生效。
配置 iptables 进行 NAT
在我的实验环境中,外网接口为 eth0
,内网接口为 eth1
:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
保存规则:
sudo apt-get install iptables-persistent
sudo netfilter-persistent save
由于iptables规则默认只在当前会话生效。一旦系统重启或者服务重启规则会被清空,借助iptables-persistent
持久化规则到文件中,每次系统或服务启动时自动加载。
基本路由配置 Done!现在可以试试用工作机通过板子访问外部网络了。