当前位置: 首页 > news >正文

RK3588 Debian 系统安装与WiFi/SSH配置笔记

目录

  • 一、目标
  • 二、切换 rootfs 前先确认工作目录和产物位置
  • 三、将 rootfs 从 Buildroot 切换为 Debian
  • 四、解决 Debian rootfs 构建依赖问题
  • 五、构建 Debian rootfs
  • 六、重新编译 kernel,确保 boot.img 被打包
  • 七、打包 Debian 版 update.img
  • 八、烧录 Debian 系统
  • 九、Debian 下 WiFi 问题定位
  • 十、手动加载 WiFi 驱动
  • 十一、手动连接 WiFi
  • 十二、网络验证
  • 十三、SSH 登录问题与修复
  • 十四、配置 WiFi 开机自动连接
  • 十五、最终闭环结果
  • 十六、最终常用命令
  • 十七、注意事项

一、目标

原来 RK3588 烧录出来的是 Buildroot 系统。Buildroot 适合做产品固件,但开发体验不如 Debian。为了后续部署 RKNN、YOLO、OpenCV、C/C++、Python 等应用,我们将系统从:

  • Buildroot rootfs

切换为:

  • Debian 11 bullseye rootfs

最终目标是:

RK3588 Debian 启动 ↓ 自动加载 WiFi 驱动 ↓ 自动连接 WiFi ↓ 自动获得固定 IP:192.168.0.135 ↓ Ubuntu 主机通过 SSH 登录 RK3588

二、切换 rootfs 前先确认工作目录和产物位置

严格说这一步不是「手动设置文件存储位置」,而是要先明确:在哪个 SDK 目录里操作、修改哪个配置文件、生成的镜像会保存到哪里。需要先确认工作目录和输出位置,但不需要手动设置新的存储位置——SDK 会自动把 Debian rootfs 放到debian/linaro-rootfs.img,并在 updateimg 阶段打包到最终的rockdev/update.img

本次 SDK 在宿主机中的目录为:

~/rk3588/rk3588_linux

在 Docker 容器中挂载为:

/workspace/rk3588_sdk

所以后续所有 SDK 编译操作都应该在容器内执行:

dockerstart-airk3588_buildcd/workspace/rk3588_sdk

这一步非常重要。因为如果不在 SDK 根目录执行,build.shdevice/rockchip/output/rockdev/等路径都会找不到。

1. 先备份当前 Buildroot 固件

切换 Debian 之前,建议先备份已经能启动的 Buildroot 固件:

cd/workspace/rk3588_sdkmkdir-pbackup_imagescp-Lrockdev/update.img backup_images/update_buildroot_working.imgls-lhbackup_images/update_buildroot_working.img

注意:这里要用cp -L,不要用普通的cp -a。因为rockdev/update.img是软链接:

rockdev/update.img -> ../update/Image/update.img

cp -L才会复制真实的 update.img 文件。

2. 明确几个关键输出位置

切换 Debian 后,各类产物默认位置如下:

Debian rootfs: /workspace/rk3588_sdk/debian/linaro-rootfs.img rootfs 链接: /workspace/rk3588_sdk/output/rootfs/rootfs.ext4 -> ../../debian/linaro-rootfs.img firmware 目录: /workspace/rk3588_sdk/output/firmware/ 最终 update.img: /workspace/rk3588_sdk/output/update/Image/update.img 常用软链接: /workspace/rk3588_sdk/rockdev/update.img -> ../update/Image/update.img

所以烧录时仍然使用:

/home/nash/rk3588/rk3588_linux/rockdev/update.img

不需要额外指定新的 Debian 镜像保存位置,SDK 会自动把 Debian rootfs 打包进最终的 update.img。

三、将 rootfs 从 Buildroot 切换为 Debian

在 SDK 中先确认当前 rootfs 配置:

grep-n"RK_ROOTFS_SYSTEM"output/.config

原来是:

RK_ROOTFS_SYSTEM="buildroot" RK_ROOTFS_SYSTEM_BUILDROOT=y # RK_ROOTFS_SYSTEM_DEBIAN is not set

后来修改为:

RK_ROOTFS_SYSTEM="debian" # RK_ROOTFS_SYSTEM_BUILDROOT is not set RK_ROOTFS_SYSTEM_DEBIAN=y # RK_ROOTFS_SYSTEM_YOCTO is not set

同时保留正确的 10.1 寸 MIPI 屏 DTS:

RK_KERNEL_DTS_NAME="rk3588-atk-mipi-10p1_800x1280"

这一步非常关键,否则系统虽然能启动,但屏幕可能不正常。

1. 修改 rootfs 类型的位置

注意output/.config是生成出来的配置,真正要修改的是板级 defconfig:

device/rockchip/.chips/rk3588/alientek_rk3588_defconfig device/rockchip/.chip/alientek_rk3588_defconfig

把 rootfs 类型写进去:

forfin\device/rockchip/.chips/rk3588/alientek_rk3588_defconfig\device/rockchip/.chip/alientek_rk3588_defconfigdosed-i'/RK_ROOTFS_SYSTEM/d'"$f"cat>>"$f"<<'EOF' RK_ROOTFS_SYSTEM="debian" RK_ROOTFS_SYSTEM_DEBIAN=y # RK_ROOTFS_SYSTEM_BUILDROOT is not set # RK_ROOTFS_SYSTEM_YOCTO is not set EOFdone

然后重新生成配置:

./build.sh alientek_rk3588_defconfig

确认:

grep-n"RK_ROOTFS_SYSTEM"output/.config

应该看到:

RK_ROOTFS_SYSTEM="debian" # RK_ROOTFS_SYSTEM_BUILDROOT is not set RK_ROOTFS_SYSTEM_DEBIAN=y # RK_ROOTFS_SYSTEM_YOCTO is not set

2. 同时确认屏幕 DTS 没变

因为用的是 10.1 寸 800x1280 MIPI 屏,所以要确认:

grep-n"RK_KERNEL_DTS_NAME"output/.config

应该是:

RK_KERNEL_DTS_NAME="rk3588-atk-mipi-10p1_800x1280"

这一步和 rootfs 切换同样重要。rootfs 负责系统用户空间,DTS 负责板级硬件配置;如果 DTS 变回默认值,可能会导致屏幕显示异常。

四、解决 Debian rootfs 构建依赖问题

执行:

./build.sh debian

过程中遇到两个主要问题。

1. live-build 版本太旧

报错:

Your live-build doesn't support bullseye

解决方法是在 Docker 容器中替换 live-build:

apt-getremove-ylive-buildcd/tmprm-rflive-buildgitclone https://salsa.debian.org/live-team/live-build.git\--depth1\-b'debian/1%20230131'cdlive-buildrm-rfmanpages/po/makeinstall-j$(nproc)lb--version

确认版本:

20230131

2. qemu-aarch64-static 版本太旧

报错:

Your qemu-aarch64-static is too old: 4.2.1

解决:

cd/workspace/rk3588_sdk update-binfmts--unimportqemu-aarch642>/dev/null||trueupdate-binfmts--disableqemu-aarch642>/dev/null||truerm-f/usr/bin/qemu-aarch64-staticcp/workspace/rk3588_sdk/device/rockchip/common/data/qemu-aarch64-static /usr/bin/chmod+x /usr/bin/qemu-aarch64-static update-binfmts--enableqemu-aarch642>/dev/null||trueupdate-binfmts--importqemu-aarch642>/dev/null||trueqemu-aarch64-static--version

确认版本变成:

qemu-aarch64 version 8.0.3

五、构建 Debian rootfs

修复依赖后重新执行:

cd/workspace/rk3588_sdk ./build.sh clean:rootfs ./build.sh debian2>&1|teebuild_debian.log

构建成功后生成:

/workspace/rk3588_sdk/debian/linaro-rootfs.img

该镜像后来被链接为:

output/rootfs/rootfs.ext4 -> ../../debian/linaro-rootfs.img

六、重新编译 kernel,确保 boot.img 被打包

一开始 update.img 中没有包含 boot.img,而分区表里明确存在 boot 分区:

3: boot at 0x00008000 size=0x00020000(64M)

所以重新编译 kernel:

./build.sh kernel2>&1|teebuild_kernel_debian.log

确认生成:

Image: resource.img (with rk3588-atk-mipi-10p1_800x1280.dtb logo.bmp logo_kernel.bmp) is ready Image: boot.img (with Image resource.img) is ready Image: zboot.img (with Image.lz4 resource.img) is ready

并确认:

ls-lhkernel/boot.img kernel/resource.img kernel/zboot.img

七、打包 Debian 版 update.img

执行:

./build.sh firmware2>&1|teebuild_firmware_debian.log ./build.sh updateimg2>&1|teebuild_updateimg_debian.log

最终 package-file 正确包含:

# NAME PATH package-file package-file parameter parameter.txt bootloader MiniLoaderAll.bin uboot uboot.img misc misc.img boot boot.img backup RESERVED rootfs rootfs.img oem oem.img userdata userdata.img

确认最终固件大小:

ls-lhLrockdev/update.img

结果:

3.1G rockdev/update.img

这说明 Debian rootfs 已经被打进最终固件中。

建议备份最终固件:

cp-Lrockdev/update.img backup_images/update_debian_bullseye_10p1_mipi_with_boot.img

八、烧录 Debian 系统

在 Ubuntu 宿主机中执行:

cd~/rk3588/Linux_Upgrade_Tool/Linux_Upgrade_Toolsudo./upgrade_tool uf /home/nash/rk3588/rk3588_linux/rockdev/update.img

烧录完成后,通过串口进入系统。

串口命令:

sudopicocom-b1500000/dev/ttyACM0

进入系统后验证:

cat/etc/os-releaseuname-adf-hfree-h

确认系统已经是:

Debian GNU/Linux 11 (bullseye) Linux 5.10.160 aarch64 /dev/root 14G 内存约 16GB

九、Debian 下 WiFi 问题定位

最开始 Debian 中执行:

iplink

只看到:

lo can0 eth0 eth1

没有wlan0

检查服务:

systemctl status wifibt-init.service-l--no-pager

发现:

Failed to detect Wi-Fi/BT chip!

进一步查看 USB 设备:

fordin/sys/bus/usb/devices/*;do[-d"$d"]||continueecho"====$d===="[-f"$d/idVendor"]&&echo"idVendor=$(cat"$d/idVendor")"[-f"$d/idProduct"]&&echo"idProduct=$(cat"$d/idProduct")"[-f"$d/product"]&&echo"product=$(cat"$d/product")"[-f"$d/manufacturer"]&&echo"manufacturer=$(cat"$d/manufacturer")"done

发现 WiFi 芯片是:

idVendor=0bda idProduct=b733 product=802.11n WLAN Adapter manufacturer=Realtek

对应:

Realtek RTL8733BU 驱动模块:8733bu.ko

脚本/usr/bin/wifibt-util.sh中也有对应表项:

Realtek RTL8733BU 0bda:b733 8733bu.ko

但自动检测脚本没有正确识别,所以我们采用手动加载驱动的方式。

十、手动加载 WiFi 驱动

执行:

cd/lib/modules insmod /lib/modules/8733bu.kosleep3iplink

成功后出现:

wlx4ca38f7e64b7

内核日志显示:

usbcore: registered new interface driver rtl8733bu rtl8733bu 1-1:1.2 wlx4ca38f7e64b7: renamed from wlan0

注意:Debian 中无线接口不是wlan0,而是wlx4ca38f7e64b7。这是根据 WiFi MAC 地址生成的 predictable interface name。

十一、手动连接 WiFi

配置 WiFi:

cat>/etc/wpa_supplicant.conf<<'EOF' ctrl_interface=/var/run/wpa_supplicant update_config=1 country=CN EOFwpa_passphrase"ZTE_HDLD""你的WiFi密码">>/etc/wpa_supplicant.confsed-i'/#psk=/d'/etc/wpa_supplicant.conf

连接 WiFi:

IFACE=wlx4ca38f7e64b7 rfkill unblock wifi2>/dev/nulliplinkset"$IFACE"upmkdir-p/var/run/wpa_supplicantkillallwpa_supplicant2>/dev/nullkillalldhclient2>/dev/nullkillalludhcpc2>/dev/null wpa_supplicant-B-i"$IFACE"-c/etc/wpa_supplicant.conf-Dnl80211,wext

如果遇到:

ctrl_iface exists and seems to be in use

需要彻底清理旧进程和 socket:

IFACE=wlx4ca38f7e64b7 systemctl stop wpa_supplicant.service2>/dev/null||truesystemctl stop wpa_supplicant@${IFACE}.service2>/dev/null||truesystemctl stop NetworkManager.service2>/dev/null||truesystemctl stop connman.service2>/dev/null||truewpa_cli-p/run/wpa_supplicant-i"$IFACE"terminate2>/dev/null||truewpa_cli-p/var/run/wpa_supplicant-i"$IFACE"terminate2>/dev/null||truepkill-9wpa_supplicant2>/dev/null||truepkill-9dhclient2>/dev/null||truepkill-9udhcpc2>/dev/null||truerm-rf/run/wpa_supplicantrm-rf/var/run/wpa_supplicantmkdir-p/run/wpa_supplicantln-s/run/wpa_supplicant /var/run/wpa_supplicant2>/dev/null||true

重新连接:

IFACE=wlx4ca38f7e64b7iplinkset"$IFACE"downsleep1iplinkset"$IFACE"up wpa_supplicant-B\-i"$IFACE"\-c/etc/wpa_supplicant.conf\-Dnl80211,wext\-P/run/wpa_supplicant_${IFACE}.pidsleep8wpa_cli-p/run/wpa_supplicant-i"$IFACE"status

连接成功时:

ssid=ZTE_HDLD wpa_state=COMPLETED

获取 IP:

dhclient-v"$IFACE"ipaddr show"$IFACE"

成功后:

inet 192.168.0.135/24

这与原 Buildroot 笔记里的基本流程一致:先让无线接口存在,再通过 wpa_supplicant 认证,最后 DHCP 获取 IP。

十二、网络验证

执行:

ping-c3192.168.0.1ping-c38.8.8.8ping-c3www.baidu.com

验证结果:

  • 192.168.0.1可通:局域网正常
  • 8.8.8.8可通:外网 IP 正常
  • www.baidu.com可通:DNS 正常

十三、SSH 登录问题与修复

Ubuntu 主机第一次登录:

sshroot@192.168.0.135

如果出现:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

执行:

ssh-keygen-R192.168.0.135

这是因为重新烧录 Debian 后,RK3588 的 SSH host key 变化了。你的 Buildroot WiFi/SSH 笔记里也记录过这个问题。

然后再次登录:

sshroot@192.168.0.135

如果提示密码错误,需要在 RK3588 串口里开启 root 密码登录。

修改 SSH 配置:

sed-i's/^#\?PermitRootLogin.*/PermitRootLogin yes/'/etc/ssh/sshd_configsed-i's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/'/etc/ssh/sshd_configsed-i's/^#\?UsePAM.*/UsePAM yes/'/etc/ssh/sshd_config

确认:

grep-nE"PermitRootLogin|PasswordAuthentication|UsePAM"/etc/ssh/sshd_config

应该看到:

PermitRootLogin yes PasswordAuthentication yes UsePAM yes

重启 SSH:

systemctl restartsshsystemctl statusssh--no-pager

设置 root 密码:

passwdroot

最后 Ubuntu 主机登录成功:

sshroot@192.168.0.135

成功后看到:

Linux ATK-DLRK3588 5.10.160 ... aarch64 Debian GNU/Linux

十四、配置 WiFi 开机自动连接

1. 创建自动连接脚本

cat>/usr/local/sbin/rk3588-wifi-connect.sh<<'EOF' #!/bin/sh IFACE="wlx4ca38f7e64b7" MODULE="/lib/modules/8733bu.ko" WPA_CONF="/etc/wpa_supplicant.conf" CTRL_DIR="/run/wpa_supplicant" echo "==== RK3588 WiFi auto connect start ====" date echo "[1] Load WiFi driver..." if ! lsmod | grep -q "^8733bu"; then insmod "$MODULE" fi sleep 3 if ! ip link show "$IFACE" >/dev/null 2>&1; then echo "Error: WiFi interface $IFACE not found." ip link exit 1 fi echo "[2] Bring up interface: $IFACE" rfkill unblock wifi 2>/dev/null || true ip link set "$IFACE" down 2>/dev/null || true sleep 1 ip link set "$IFACE" up echo "[3] Clean old WiFi processes..." systemctl stop wpa_supplicant.service 2>/dev/null || true systemctl stop "wpa_supplicant@${IFACE}.service" 2>/dev/null || true systemctl stop NetworkManager.service 2>/dev/null || true systemctl stop connman.service 2>/dev/null || true wpa_cli -p /run/wpa_supplicant -i "$IFACE" terminate 2>/dev/null || true wpa_cli -p /var/run/wpa_supplicant -i "$IFACE" terminate 2>/dev/null || true pkill -9 wpa_supplicant 2>/dev/null || true pkill -9 dhclient 2>/dev/null || true pkill -9 udhcpc 2>/dev/null || true rm -rf /run/wpa_supplicant mkdir -p "$CTRL_DIR" echo "[4] Start wpa_supplicant..." wpa_supplicant -B \ -i "$IFACE" \ -c "$WPA_CONF" \ -D nl80211,wext \ -P "/run/wpa_supplicant_${IFACE}.pid" echo "[5] Wait for WiFi association..." i=0 while [ $i -lt 45 ]; do STATE=$(wpa_cli -p "$CTRL_DIR" -i "$IFACE" status 2>/dev/null | grep '^wpa_state=' | cut -d= -f2) echo "Current WiFi state: ${STATE:-unknown}" if [ "$STATE" = "COMPLETED" ]; then break fi sleep 1 i=$((i + 1)) done STATE=$(wpa_cli -p "$CTRL_DIR" -i "$IFACE" status 2>/dev/null | grep '^wpa_state=' | cut -d= -f2) if [ "$STATE" != "COMPLETED" ]; then echo "Error: WiFi association failed. Current state: ${STATE:-unknown}" wpa_cli -p "$CTRL_DIR" -i "$IFACE" status 2>/dev/null || true exit 1 fi echo "[6] Request IPv4 address..." dhclient -v "$IFACE" echo "[7] Current IP:" ip addr show "$IFACE" echo "==== RK3588 WiFi auto connect end ====" date exit 0 EOFchmod+x /usr/local/sbin/rk3588-wifi-connect.sh

2. 创建 systemd 服务

cat>/etc/systemd/system/rk3588-wifi.service<<'EOF' [Unit] Description=Load RTL8733BU and connect WiFi on RK3588 Debian After=local-fs.target Before=ssh.service Wants=ssh.service [Service] Type=oneshot ExecStart=/usr/local/sbin/rk3588-wifi-connect.sh RemainAfterExit=yes StandardOutput=append:/var/log/rk3588-wifi.log StandardError=append:/var/log/rk3588-wifi.log [Install] WantedBy=multi-user.target EOF

启用服务:

systemctl daemon-reload systemctlenablerk3588-wifi.service

手动测试:

systemctl start rk3588-wifi.service systemctl status rk3588-wifi.service --no-pagercat/var/log/rk3588-wifi.logipaddr show wlx4ca38f7e64b7

日志中看到:

Current WiFi state: COMPLETED DHCPACK of 192.168.0.135 from 192.168.0.1 inet 192.168.0.135/24 ==== RK3588 WiFi auto connect end ====

说明开机自动 WiFi 服务成功。

十五、最终闭环结果

最终链路已经闭环:

RK3588 Debian 系统启动 ↓ systemd 启动 rk3588-wifi.service ↓ 加载 /lib/modules/8733bu.ko ↓ 出现 wlx4ca38f7e64b7 ↓ wpa_supplicant 连接 ZTE_HDLD ↓ dhclient 获取 192.168.0.135 ↓ ssh.service 监听 22 端口 ↓ Ubuntu 主机 ssh root@192.168.0.135 登录成功

十六、最终常用命令

查看 WiFi 服务:

systemctl status rk3588-wifi.service --no-pager

查看 WiFi 日志:

cat/var/log/rk3588-wifi.log

手动重连 WiFi:

systemctl restart rk3588-wifi.service

查看无线 IP:

ipaddr show wlx4ca38f7e64b7

Ubuntu 主机 SSH 登录:

sshroot@192.168.0.135

SSH key 冲突时:

ssh-keygen-R192.168.0.135

RK3588 查看系统版本:

cat/etc/os-releaseuname-a

十七、注意事项

  • Debian 中不要再写死wlan0,你的真实接口是wlx4ca38f7e64b7
  • WiFi 驱动需要手动或服务加载:/lib/modules/8733bu.ko
  • RTNETLINK answers: File exists不一定是错误,只要最后有bound to 192.168.0.135,就说明 DHCP 成功。
  • /etc/resolvconf/update.d/libc的 warning 通常不影响联网,只要域名能 ping 通就可以。
  • 整理文档时不要写真实 WiFi 密码,建议统一写成:你的WiFi密码
http://www.cnnetsun.cn/news/2566208.html

相关文章:

  • FPG财盛国际:从风险提示看平台责任意识
  • Linux系统启动慢?从UEFI的DXE阶段入手,优化驱动加载让你的开机快人一步
  • 【复现】中国上市公司全要素生产率测算与分析(论文+数据)
  • 从Sora 2原始张量到可交付MP4:端到端Pipeline中被92%开发者忽略的色彩空间转换断点(BT.2020→BT.709→sRGB三级校准手册)
  • 【Claude AI深度SWOT解码】:20年AI架构师亲授,4大维度拆解其商用致命短板与突围路径
  • 你的副业计划又黄了。不是意志力的锅
  • 基于ESP32打造智能网络收音机:硬件选型、软件实现与音质优化全攻略
  • ESP32多任务水位监测:从Arduino到ESP-IDF的FreeRTOS实战
  • 高频率登录尝试 ip封禁已经实现
  • 给服务器添加最外层风控系统
  • 基于ESP8266与WS2812B的智能氛围灯DIY:从硬件连接到Web控制
  • 基于STM32WB与BLE-MIDI的体感节奏控制器:BeatShaker设计与实现
  • AMD锐龙SDT调试工具终极指南:5个进阶技巧解锁处理器深度调优
  • Linux——进程和线程
  • Linux服务器被挖矿木马劫持的五步应急处置指南
  • 基于放射性衰变的真随机数生成器:从量子物理到嵌入式实现
  • ‌2026智慧校园规划必读:如何在预算吃紧下选到高性价比方案‌
  • 抖音批量下载神器:douyin-downloader 免费工具全攻略
  • Lovable电商网站搭建陷阱大全(2024最新版):Nuxt 3 SSR失效、Stripe Webhook丢包、SEO结构坍塌三大隐形杀手曝光
  • 惠普战99新机踩坑记:Win11家庭版下VMware装Ubuntu,键盘延迟1秒怎么破?
  • AI写的论文双率如何压到20%以下?这几款工具实测有效
  • 基于TTP223的离线电容触摸开关设计:厨房灯控DIY方案
  • 转行网络安全运维:从0到1的可落地指南
  • pan-baidu-download:百度网盘多线程下载加速器架构解析与性能优化指南
  • 【Sceneform-EQR】让Android 原生 3D开发更容易
  • 为什么说AI革命才刚刚开始?从技术演进到商业落地的真实变化
  • DeepSeek幻觉问题深度复盘(2023–2024真实故障库首发):从token级偏差到语义坍塌的全链路溯源
  • vectorizer图像矢量化工具:3步实现PNG/JPG到SVG的智能转换
  • 驰骋低代码bpm对于工程项目管理的设计几点思考
  • 如何处理AI生成代码中的错误