ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

RK3568开发板从Buildroot换到Debian并根治重启IP漂移问题

RK3568开发板从Buildroot换到Debian并根治重启IP漂移问题 自己折腾开发板也有一阵子了手上这块 RK3568 的板子原厂默认给的 Buildroot 系统说好听叫精简说难听叫要啥没啥。平时跑点简单的服务还行一旦想装个像样的软件、跑个虚拟化、调个摄像头驱动那种处处碰壁的感觉真是让人头大。更让人崩溃的是每次重启板子的 IP 就跟你玩失踪DHCP 分到的地址随缘变化要么就得手动进串口敲命令配置非常浪费时间。前阵子我终于下决心把系统从 Buildroot 换成 Debian顺手把重启手配 IP这个老大难问题也根治了整个过程踩了不少坑今天把完整思路和实操记录整理出来希望能帮到正在折腾 RK3568 或者 RK3566 的朋友。1. 为什么要把 Buildroot 扔进回收站1.1 Buildroot 能用但是憋屈Buildroot 本质上是给你生成一套定制化 Linux 系统的工具集它按照你选的配置编译内核、busybox、各种应用最后打包成一个可以烧录的镜像。对于量产产品来说Buildroot 确实很合适因为体积可以做到很小启动也快安全性好管控。但作为开发板或个人玩法的底层系统它就显得过于克制了。我举个很直观的例子。板子刷了 Buildroot 之后我想装个 htop 看看系统负载结果发现没有现成的包管理器你得先搞清楚这个 Buildroot 的版本和软件包配置然后用 make menuconfig 重新编译整个系统再重新烧录。一次两次能忍天天这样搞谁能顶得住更别提你想装个 Python 库、跑个 Docker 容器Buildroot 那套机制根本容不下这种灵活性。从系统裁剪角度讲Buildroot 把大部分你用不上的驱动和库都去掉了这对精简产品是好事但对开发调试是灾难。比如我想调试 OV5695 摄像头时Buildroot 里连 v4l2-ctl 都没有还得自己交叉编译工具链。这种别扭的感觉就像给你一台只有螺丝刀的工具箱而你需要的是整套电钻加扳手组合。1.2 Debian 到底香在哪Debian 给我的第一感受就是真正意义上的完整系统。它有成熟的 dpkg/apt 包管理体系软件源里直接就有几十万个软件包装个 nginx、Python、gcc、ffmpeg一条命令搞定再也不用为编译依赖耗掉整个晚上。更重要的是 Debian 的启动流程和服务管理非常标准systemd 一统天下写 systemd service、看日志、配网络都极其顺手。RK3568 是 arm64 架构Debian 官方对 arm64 支持非常完善Ubuntu、麒麟、统信这些桌面系统也都是基于 Debian 衍生出来的这意味着整个生态的兼容性很高社区资料也多。从开发效率讲换到 Debian 之后我几乎是在用一台标准 Linux 服务器的心智模型来对待这块开发板。想装什么直接 apt 搜依赖冲突了用 apt 自动解决想跑 KVM 虚拟化装 qemu-system-arm 加上内核模块就够了想调试外设直接改设备树然后重编内核即可。Buildroot 时代那种处处受限的挫败感彻底消失了。1.3 RK3568 和 RK3566 怎么选别拿错镜像这里特别提醒一下瑞芯微 RK3568 和 RK3566 这两颗芯片非常像都是四核 Cortex-A55都带 Mali-G52 显卡连引脚定义都有大量重叠。区别主要在于 RK3568 更偏工业/边缘计算定位支持双千兆网口、PCIe 3.0、USB 3.0CPU 频率略高跑的是 1.8GHz~2.0GHz而 RK3566 更偏消费类产品比如平板、学习机网络接口通常是百兆PCIe 被砍掉USB 也是 2.0 的。这两者之间的设备树源文件、内核配置、甚至部分 uboot 参数都不通用。如果你拿 RK3566 的镜像去刷 RK3568大概率会出现网口不识别、USB 3.0 失效、PCIe 设备挂不上这些诡异问题。先确认板子丝印再确认 SoC 型号最后看官方 SDK 里对于板型的定义MACHINE 配置选错了后面所有功夫都白费。这块怎么小心都不为过因为很多时候板子硬件上用 RK3568M 之类的衍生型号兼容性又会有微调不能偷懒全信默认配置。2. 刷机前的准备工作2.1 先把工具链备齐不管是刷 Buildroot 还是刷 Debian第一步都是要把刷机环境准备好。我这里用的是 Windows 主机加瑞芯微官方的 RKDevTool 烧录工具如果你习惯 Linux也可以用 upgrade_tool 命令行工具效果一样。硬件上需要一条质量靠谱的 USB Type-C 数据线注意不是那种只能充电的线必须支持数据传输。开发板上找到烧录口通常标着 OTG 或者 Type-C 的接口实际项目里我还见过 Type-A 口做烧录通信的奇葩设计用万用表量一下引脚定义再操作最稳妥。电脑端装好 USB 驱动瑞芯微的驱动叫 Rockusb Driver如果不识别设备多半是 Windows 驱动签名问题或线的问题。2.2 进 Loader 模式的方法RK3568 的 ROM 自带烧录引导上电时检测到特定条件就会进入 Loader 模式。不同板子的进法略有差异常见做法是先按住板子上的 Recovery 或 MASKROM 按键不放再插上 USB 线到电脑然后给板子上电等电脑设备管理器里出现一个Rockusb Device的未知设备这时候松开按键。如果你的板子没有实体按键也可以试一下在串口终端里操作。比较容易踩坑的地方是有些板子在 uboot 阶段会快速跳过检测窗口手一抖就错过了更隐蔽的问题是 USB 线插到 HUB 上导致识别不稳定建议直连电脑主板 USB 口。进 Loader 模式之后打开 RKDevTool如果界面右下角变成发现一个 MASKROM/LOADER 设备说明连接成功。Loader 模式主要用来烧录完整镜像MASKROM 模式则用于 U-Boot 损坏后的强制恢复二者用的操作流程基本一致。2.3 旧镜像还是得先备份在做任何系统更换之前永远先把原厂系统完整备份出来这个习惯帮我避免过很多次返厂抢救。RKDevTool 里有一个设备分区表页面能读出当前板子所有分区的起始扇区和大小把重要的分区右键保存成镜像文件。常见分区是uboot、misc、boot、recovery、rootfs、userdata 等。rootfs 通常最大导出的时间也最久耐心等就行。备份完你手上就有了原厂固件的救命稻草后面折腾坏了随时能刷回去。另外如果你板子出厂带了 Android可能还会有 vendor、dtbo 之类分区顺手一起导出排查问题时会很有用。2.4 RKDevTool 的使用节奏RKDevTool 的界面简单粗暴左侧是烧录分区列表右侧是设备状态中间是日志。烧录时先点击分区表区域里的空白单元格选择对应的镜像文件配置好每个分区要写入的镜像路径然后点击执行按钮。过程中千万别断开 USB 线不要动板子电源否则轻则烧录失败重则把 bootloader 写坏那就真的只能去按 MASKROM 强制恢复了。还有个小细节如果你当前板子的分区表和你准备烧录的镜像分区表不一致RKDevTool 会提示参数不匹配。这时候建议先擦除设备再做一次高级功能里的导入配置把分区表同步成新镜像的参数。不然烧完 boot 分区对着 rootfs 分区找文件必挂。3. 制作 Debian 根文件系统3.1 两条路现成镜像 or 自己生成把 Debian 刷到 RK3568 上最简单的做法是直接找社区做好的 arm64 Debian 镜像。很多开发板厂商的 wiki 里都会提供 Ubuntu 或 Debian 的 rootfs 镜像下载解压后用 dd 或 RKDevTool 烧入。优点是省事缺点是你不知道里面缺了什么、多了什么也难以复现。我更推荐的做法是先用 debootstrap 自己生成一个 rootfs这样每一步都尽在掌握还能顺便选最小化安装还是带桌面的完整版。debootstrap 可以从 Debian 官方源或国内镜像源拉取基础系统纯命令行工具在任意一台 Linux 机器上就能完成。3.2 debootstrap 构建 rootfs 实操先在一台 x86 Linux 机器上准备好构建目录网速允许的话建议用国内 Debian 源的镜像否则拉包时等到怀疑人生。核心命令如下mkdir -p ~/rk3568-rootfs sudo debootstrap --archarm64 --foreign bookworm ~/rk3568-rootfs http://mirrors.aliyun.com/debian/--foreign参数表示目标架构与当前主机不一致需要先做第一阶段的解包。然后挂载好 qemu 用户态模拟器进入第二阶段sudo cp /usr/bin/qemu-aarch64-static ~/rk3568-rootfs/usr/bin/ sudo chroot ~/rk3568-rootfs /debootstrap/debootstrap --second-stage第二阶段是真正的系统配置会在目标 rootfs 里完成 dpkg 配置、基础软件安装、locale 生成等操作需要几分钟时间。完成后你就拥有一个能直接 chroot 进去操作的 Debian 根目录了。在这里面可以继续安装必要软件包sudo chroot ~/rk3568-rootfs /bin/bash apt update apt install -y systemd systemd-sysv ifupdown dhcpcd-base locales如果你计划在这个系统里跑桌面或者 KVM 虚拟化也可以把task-lxde-desktop、qemu-system-arm、libvirt-daemon-system这些包一并装上不过要注意 rootfs 体积会显著膨胀烧录时分区大小要预留。3.3 写死文件系统配置避免入门就翻车生成 rootfs 之后在打包前必须确认几处关键配置否则刷进板子很可能直接起不来或进了系统用不了网络。首要的是/etc/fstabRK3568 的 boot 和 rootfs 分区通常是挂在 mmcblk0pX 上的fstab 写错会导致内核 panic。典型写法UUIDxxx /boot vfat defaults 0 0 UUIDyyy / ext4 defaults 1 1如果怕麻烦可以启动时用 root/dev/mmcblk0p4 这类枚举方式先跑起来再回头用 blkid 拿到 UUID 写死稳定性更高。然后是网络配置Debian 12 默认会启用 NetworkManager但很多开发板的串口终端里没有显示管理器NetworkManager 加载后可能没有配置文件导致网卡起不来。我习惯在 rootfs 里直接写好/etc/network/interfaces的静态配置或 dhcp 配置见下面的根治章节。另外还要安装好 SSH 服务并开启否则只能对着串口做事效率太低。/etc/apt/sources.list建议直接用 deb.debian.org 或国内镜像目录比如清华、阿里替换成deb http://mirrors.tuna.tsinghua.edu.cn/debian bookworm main contrib non-free-firmware记得加上 non-free-firmware 组件否则后面装 Wi-Fi、蓝牙、编解码固件时会包找不到。4. 刷入 Debian 并启动4.1 分区规划与镜像打包制作好 rootfs 后需要把它打包成一个能被烧录工具识别的镜像。先计算 rootfs 的实际大小sudo du -sh ~/rk3568-rootfs假设目标是 2GB 的 rootfs 镜像用 dd 创建空文件然后格式化dd if/dev/zero ofrootfs.img bs1M count2048 mkfs.ext4 rootfs.img然后把 rootfs 目录内容全部拷贝到挂载好的镜像里sudo mkdir /mnt/target sudo mount -o loop rootfs.img /mnt/target sudo cp -a ~/rk3568-rootfs/. /mnt/target/ sudo umount /mnt/target这里有一个非常容易忽视的点如果 rootfs 里有符号链接指向绝对路径或者像 dev、proc、sys 这类虚拟目录被 cp 进去会导致启动后系统行为异常。我自己就遇到过/lib/aarch64-linux-gnu下的软链接全部失效的问题最后怎么查都找不到原因一琢磨才发现是cp -a的时候源系统上的绝对路径软链被原样搬过去了。稳妥做法是在 chroot 环境里先清掉这些虚拟目录再手动创建空目录让 systemd 在启动时自动挂载。4.2 uboot 参数与设备树配对的学问镜像准备好之后烧录时有个关键操作boot 分区的 uboot 参数必须与你的 Debian rootfs 匹配。RK3568 的 uboot 会从 boot 分区读取extlinux.conf或boot.scr里面有一行核心内容label kernel kernel /Image fdt /rk3568-board.dtb append root/dev/mmcblk0p4 rootfstypeext4 consolettyS2,1500000n8很多 RK3568 开发板的调试串口是 ttyS2波特率 1500000也就是 1.5Mbps这个参数如果不对串口终端就是一片乱码或无输出。设备树文件名必须与你的板子完全匹配名字错了内核起不来或者起一半就 hang 住。设备树本身也值得单独说。RK3568 的设备树比较复杂不但包含 CPU、内存、中断还定义了 DVFS 频率表、IO 电压、GMAC 的 PHY 模式、PCIe 的复位 GPIO 等等。如果你用原厂 Buildroot 内核设备树是编译进内核或随 boot 分区加载的刷 Debian 建议直接沿用原厂 boot 分区里的rk3568-xxx.dtb不要去折腾重新编译 DTB 的事。除非你确认要改外设驱动比如加个 OV5695 摄像头再考虑从 SDK 里提取 dts 修改后编译。4.3 首次启动前的自检清单刷好镜像后别急着通电先在心中过一遍电源是否稳定RK3568 对电源质量比较敏感供电不足会导致高负载下重启或烧录过程中断。串口线是否接对波特率是否设置为 1500000。是否插了有线网卡方便启动后直接 SSH。确认 boot 分区中内核镜像和设备树文件存在且文件名正确。上电后到串口观察日志先是 uboot 版本信息然后是内核解压接着看到 systemd 启动画面。如果一切正常很快就出现登录界面。第一次登录用的 root 密码在你用 debootstrap 生成 rootfs 时应该已经用 chroot passwd 设置好了如果没有那就只能再重新打包一次 rootfs。首次启动后第一件事就是apt update apt upgrade把系统更新到最新。这时候国内源的优势立刻体现出来阿里云源和清华源的速度远比 Debian 官方源快几分钟就能把几百 MB 的更新拉完。5. 根治重启手配 IP5.1 问题到底出在哪Buildroot 系统里通常没有 NetworkManager网络靠 busybox 的 udhcpc 或脚本动态配置重启后 IP 丢失是因为 DHCP 客户端没有开机自启或者设备名变了导致之前配置的网卡名对不上。Debian 系统虽然带了 Systemd-networkd 或 NetworkManager但如果两者冲突或者配置不对照样会出现开机没 IP 的问题。我遇到过最隐蔽的情况是网络上存在多个 DHCP 服务器每次重启分到的 IP 段不同看起来就像IP 自己变了。这时候就算正常启动行为也是乱的和你手动配不配置 IP 反而无关。排查时要先确认局域网里只有一个 DHCP 服务在运行尤其是那种光猫、路由器、旁路由同时开 DHCP 的环境很容易造成地址漂移。5.2 方案一直接上 systemd-networkd以 Debian 12 为例直接就写/etc/systemd/network/10-eth0.network[Match] Nameeth0 [Network] DHCPyes如果希望静态 IP就改成[Network] Address192.168.1.100/24 Gateway192.168.1.1 DNS192.168.1.1启用服务systemctl enable systemd-networkd systemctl restart systemd-networkd这个方案最干净不需要碰 NetworkManager非常适合无桌面的服务器模式开发板。要注意Match部分的Nameeth0在部分内核上是 enP2p33s0 这种 PCIe 命名RK3568 的内置 GMAC 通常会显示为 eth0但如果你接了个 PCIe 转 USB 网卡设备名可能就是 eth1 或 enx 开头。先用ip link确认一下实际名称再写 Match 规则。5.3 方案二让 NetworkManager 接管如果你打算在板子上跑桌面环境NetworkManager 更适合图形化操作。安装apt install network-manager然后编辑/etc/NetworkManager/NetworkManager.conf[main] pluginsifupdown,keyfile [ifupdown] managedtrue再配置连接nmcli con add type ethernet con-name eth0-dhcp ifname eth0 ipv4.method auto nmcli con up eth0-dhcpNetworkManager 的 keyfile 方式在重启后非常稳定而且支持连接优先级、自动切换热点和有线做嵌入式桌面产品体验很好。如果你既装了 NetworkManager 又装了 systemd-networkd两者可能抢网卡这时候要么把 systemd-networkd 的 .network 文件删掉要么禁用 NetworkManager 的systemd-udevd冲突规则。我建议是二选一不要把两套网络管理层叠着跑否则排查成本翻倍。5.4 换个思路干脆用 hostapd 加白名单这里再分享一个额外思路。有些场景下你压根不想让板子从路由器拿 IP而是希望它 IP 固定且还能对外发 WiFi那就可以用 hostapd 把板子变成热点然后在/etc/dhcp/dhcpd.conf里固定分配给某个 MAC 地址的 IPhost my-device { hardware ethernet 00:11:22:33:44:55; fixed-address 192.168.4.100; }这样就算重启无数遍这个设备始终拿到固定地址。这个应用形态在野外部署、边缘节点、设备演示场合特别实用而且和 Debian 生态结合得也很好。6. 常见问题与排查实录6.1 启动卡在 U-Boot 或刷机后不启动这几乎是新手翻车率最高的环节。先分清是 U-Boot 卡住还是内核卡住如果串口只有 U-Boot 版本号没有任何内核信息说明 U-Boot 参数有问题主要检查boot_parts和mmcroot变量是否指向了正确的分区位置如果内核已经开始加载又突然死掉那多数是设备树和内核不匹配。另一个高发原因是 rootfs 分区 ID 不对U-Boot 引导时root/dev/mmcblk0p4写的是 p4但实际你的分区表 rootfs 在 p6自然是找不着根文件系统进入 initramfs 的 busybox 急救模式。建议在 U-Boot 控制台里执行printenv查看所有环境变量重点核对mmcroot、bootargs、fdtfile。像这样逐项对比往往一眼就能看出问题出在哪个环节。6.2 网卡驱动正常但拿不到 IP排除法三步走先ip link看网卡状态如果显示 DOWN执行ip link set eth0 up手动拉起再dhclient eth0手动获取一次 IP看 DHCP 交互是否成功最后看/var/log/syslog里 dhcp 客户端的报错。多数情况下是 networkd 没启用或者 NetworkManager 冲突按第五节的方法重配一遍就行。如果ip link里干脆没有 eth0那就是驱动没加载。RK3568 的内置 GMAC 驱动是stmmac检查内核是否选配了该驱动或者在设备树里是否把gmac0或gmac1节点的 status 设为了 okay。晶晨、瑞芯微这类 SoC 经常在默认配置里把用不到的网口关掉需要手动开启。6.3 更新源太慢或直接超时Debian 官方源在海外国内访问噩梦级别。解决办法就是用镜像源替换清华、阿里、中科大都有 Debian 的 arm64 仓库。改完 sources.list 后执行apt update如果之前/var/lib/apt/lists/里有旧数据残留可能出现哈希校验错误直接删除该目录重新 update 即可。还想进一步提速的话可以把apt的并发连接数调大新建/etc/apt/apt.conf.d/99parallel写入Acquire::http::Pipeline-Depth 5; Acquire::http::Dl-Limit 0;实测下来普通百兆宽带拉包基本能跑满带宽。6.4 桌面起不来或没有声音KVM、桌面这类重负载场景问题主要集中在内存和显示驱动上。RK3568 虽然带 GPU但都要装对应的 mali 用户态驱动Debian 官方源一般不直接提供需要从芯片原厂或板卡厂商 SDK 里提取 blob。debootstrap 生成的纯净 rootfs 不一定包含 GPU 的 libmali 相关文件所以桌面环境花屏、黑屏属于常见现象。没有 GPU 驱动时可以先跑 X11 的 fbdev 或 dummy 驱动验证桌面栈是否正常再决定是否适配官方 mali 驱动。现在 Debian 12 已经支持 Wayland 的一堆组件但内核如果没有panfrost驱动而板卡只支持mali的 blob默认 Wayland 会处于无 GPU 渲染的软件渲染状态CPU 占用偏高。对开发调试来说还不如直接用 fbdev 或 legacy X11 来得稳定。6.5 日志、时区、语言等日常小事刷完 Debian 之后建议顺手做几件事把时区设置成 Asia/Shanghai安装 tzdata 后执行dpkg-reconfigure tzdata设置 locale生成 zh_CN.UTF-8 或用默认的 en_US.UTF-8 防止中文乱码打开 systemd-journald 持久化存储重启之后还能看到上次启动日志对排查重启原因很有帮助。没做这些之前我遇到过开机日志满屏挤爆 journal 的情况重启后想查历史日志结果全部丢光非常烦人。6.6 我私藏的调试三板斧每次刷完新系统我都会马上做三件事第一把串口终端工具配好推荐使用 minicom 或 picocom参数设置为 1500000 波特率8 数据位无校验1 停止位。开发板的串口就是最快的救命通道。第二开启内核日志镜像到串口echo consolettyS2,1500000n8 /etc/kernel/cmdline update-initramfs -u这样即使网络断开我还能从串口看到整个启动过程的内核输出定位代码级问题非常方便。第三装好 nfs-common 和 rsync配合 PC 上的 NFS 服务器把 rootfs 目录挂载到/mnt/remote直接改文件、测试脚本不需要反复烧录镜像调试效率翻倍。结尾整套流程走完这块 RK3568 板子终于从能用进化成了好用。Buildroot 之于嵌入式产品是贴心管家之于开发调试就是一条捆住手脚的绳子Debian 则像一间无限扩展的工具房想要什么直接搭出了问题排查起来也有标准流程可循。诚然这个过程并不轻松烧录踩坑、设备树不匹配、网络配置互相打架各种问题一个接一个但当你看到熟悉的 Debian 开机 logo 出现在自己的 ARM 板子上那种手感是任何模拟器都给不了的。如果你也在用 RK3568/RK3566 折腾系统希望这篇实战记录能帮你少走几个坑把省下来的时间更多地花在真正有价值的功能开发上。后面有机会我再深入写一写如何在这个 Debian 环境里调摄像头、跑 KVM 虚拟化、做边缘计算网关咱们下次继续聊。
返回列表