记录过年回家前的一次折腾,把ArmSom-Sige5开发版刷了社区版Armbian又降回板子厂商提供的unofficial Armbian,配置软路由功能兼有Linux环境开发体验。

免责声明:初次接触开发版我也忘记哪里看到ArmSom的广告就买了,可能我只是喜欢他家的💜紫色外壳,不保证本文有参考价值,仅作为个人踩坑记录。

sige5

固件eMMC烧写

因为手头没有可用的microSD卡,选择type-C数据线直连电脑和板子烧录固件到eMMC。具体步骤如下:

准备工作

  • 两根type-C线,一根用于开发版和电脑连接,一根为开发版供电。
  • 准备 MiniLoader (ArmSom官方提供,sige5为RK3576_MiniLoaderAll)
  • 准备 System Image
  • 烧录工具
    • Windows 使用 RKDevTool(ArmSom官方提供)
    • Linux/macOS 使用 rkdeveloptool

烧录步骤

进入 Maskrom 模式,参考镜像烧录步骤

  1. 断开所有供电电线,连接开发版和电脑
  2. 使用一根Type-C线连接开发版Type-C口(非供电接口)和电脑的usb接口,使用软件检测
    • Windows RKDevTool 下方显示 No Devices Found
    • Linux/macOS 运行 rkdevelotool ld 显示 not found any devices!
  3. 按住Mashrom按键,使用另一根Type-C线连接开发版Type-C口(供电接口)和电源
    • Windows RKDevTool 下方显示 “Found One Loader Device”,可松开按键
    • Linux/macOS 运行 rkdevelotool ld 检测到设备 DevNo=1 Vid=0x2207,Pid=0x350e,LocationID=201 Maskrom,可松开按键
  4. 根据下面的平台/软件选择要烧录的 System Image 进行烧录

Windows RkDevTool

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.listarmbian专属软件源和
  • /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],比如我的显示如下:

motd

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

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的日志没看懂也没找到命令行设置方式

suspend

Armbian 基础路由

好的似乎终于进入正题了,先说说为什么突然想着折腾小板子,以及为什么选择了 Armbian,我先放几个理由,有想到再补充

  1. 兼顾软路由,但又不想要openwrt
  • openwrt固然很方便,但有两个点为人诟病:包管理问题、为照顾大量低性能的设备做了兼容(但事实上,你并不一定会用这些IoT设备对吗?)。Armbian 基于Ubuntu或者Debian给了更多玩法,特别是对有Linux使用经验的玩家/开发者,可以使用apt包管理工具,充分利用这一价位开发版的价值(比如利用板载npu做一点推理,毕竟都自称mini computer了)
  • 套壳/层叠的软件栈带来很多负担。个人便好,不喜欢docker虚拟机套壳最后只部署一个软路由。
  • 另外有技术佬说openwrt 很灵车但我没遇到过
  1. 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-networkdNetworkManager 。我搭建的基于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 中看到改变生效(名称暴露了是谁修改的):

netplan0

netplan1

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地址),效果如下:

dhcp

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!现在可以试试用工作机通过板子访问外部网络了。


  1. Armbian,更适合 R2S 软路由的系统 ↩2

  2. 夏的博客 | Armbian换源教程. ↩2

  3. VPS基本安全措施 - 开发调优 - LINUX DO

  4. RHEL 9 | systemd-resolved 使用