目录一、目标二、切换 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 ↓ 自动获得固定 IP192.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.sh、device/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.imgcp -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-nRK_ROOTFS_SYSTEMoutput/.config原来是RK_ROOTFS_SYSTEMbuildroot RK_ROOTFS_SYSTEM_BUILDROOTy # RK_ROOTFS_SYSTEM_DEBIAN is not set后来修改为RK_ROOTFS_SYSTEMdebian # RK_ROOTFS_SYSTEM_BUILDROOT is not set RK_ROOTFS_SYSTEM_DEBIANy # RK_ROOTFS_SYSTEM_YOCTO is not set同时保留正确的 10.1 寸 MIPI 屏 DTSRK_KERNEL_DTS_NAMErk3588-atk-mipi-10p1_800x1280这一步非常关键否则系统虽然能启动但屏幕可能不正常。1. 修改 rootfs 类型的位置注意output/.config是生成出来的配置真正要修改的是板级 defconfigdevice/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$fcat$fEOF RK_ROOTFS_SYSTEMdebian RK_ROOTFS_SYSTEM_DEBIANy # RK_ROOTFS_SYSTEM_BUILDROOT is not set # RK_ROOTFS_SYSTEM_YOCTO is not set EOFdone然后重新生成配置./build.sh alientek_rk3588_defconfig确认grep-nRK_ROOTFS_SYSTEMoutput/.config应该看到RK_ROOTFS_SYSTEMdebian # RK_ROOTFS_SYSTEM_BUILDROOT is not set RK_ROOTFS_SYSTEM_DEBIANy # RK_ROOTFS_SYSTEM_YOCTO is not set2. 同时确认屏幕 DTS 没变因为用的是 10.1 寸 800x1280 MIPI 屏所以要确认grep-nRK_KERNEL_DTS_NAMEoutput/.config应该是RK_KERNEL_DTS_NAMErk3588-atk-mipi-10p1_800x1280这一步和 rootfs 切换同样重要。rootfs 负责系统用户空间DTS 负责板级硬件配置如果 DTS 变回默认值可能会导致屏幕显示异常。四、解决 Debian rootfs 构建依赖问题执行./build.sh debian过程中遇到两个主要问题。1. live-build 版本太旧报错Your live-build doesnt support bullseye解决方法是在 Docker 容器中替换 live-buildapt-getremove-ylive-buildcd/tmprm-rflive-buildgitclone https://salsa.debian.org/live-team/live-build.git\--depth1\-bdebian/1%20230131cdlive-buildrm-rfmanpages/po/makeinstall-j$(nproc)lb--version确认版本202301312. 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/chmodx /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 debian21|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 size0x00020000(64M)所以重新编译 kernel./build.sh kernel21|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 firmware21|teebuild_firmware_debian.log ./build.sh updateimg21|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]echoidVendor$(cat$d/idVendor)[-f$d/idProduct]echoidProduct$(cat$d/idProduct)[-f$d/product]echoproduct$(cat$d/product)[-f$d/manufacturer]echomanufacturer$(cat$d/manufacturer)done发现 WiFi 芯片是idVendor0bda idProductb733 product802.11n WLAN Adapter manufacturerRealtek对应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配置 WiFicat/etc/wpa_supplicant.confEOF ctrl_interface/var/run/wpa_supplicant update_config1 countryCN EOFwpa_passphraseZTE_HDLD你的WiFi密码/etc/wpa_supplicant.confsed-i/#psk/d/etc/wpa_supplicant.conf连接 WiFiIFACEwlx4ca38f7e64b7 rfkill unblock wifi2/dev/nulliplinkset$IFACEupmkdir-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需要彻底清理旧进程和 socketIFACEwlx4ca38f7e64b7 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$IFACEterminate2/dev/null||truewpa_cli-p/var/run/wpa_supplicant-i$IFACEterminate2/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重新连接IFACEwlx4ca38f7e64b7iplinkset$IFACEdownsleep1iplinkset$IFACEup wpa_supplicant-B\-i$IFACE\-c/etc/wpa_supplicant.conf\-Dnl80211,wext\-P/run/wpa_supplicant_${IFACE}.pidsleep8wpa_cli-p/run/wpa_supplicant-i$IFACEstatus连接成功时ssidZTE_HDLD wpa_stateCOMPLETED获取 IPdhclient-v$IFACEipaddr 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 主机第一次登录sshroot192.168.0.135如果出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!执行ssh-keygen-R192.168.0.135这是因为重新烧录 Debian 后RK3588 的 SSH host key 变化了。你的 Buildroot WiFi/SSH 笔记里也记录过这个问题。然后再次登录sshroot192.168.0.135如果提示密码错误需要在 RK3588 串口里开启 root 密码登录。修改 SSH 配置sed-is/^#\?PermitRootLogin.*/PermitRootLogin yes//etc/ssh/sshd_configsed-is/^#\?PasswordAuthentication.*/PasswordAuthentication yes//etc/ssh/sshd_configsed-is/^#\?UsePAM.*/UsePAM yes//etc/ssh/sshd_config确认grep-nEPermitRootLogin|PasswordAuthentication|UsePAM/etc/ssh/sshd_config应该看到PermitRootLogin yes PasswordAuthentication yes UsePAM yes重启 SSHsystemctl restartsshsystemctl statusssh--no-pager设置 root 密码passwdroot最后 Ubuntu 主机登录成功sshroot192.168.0.135成功后看到Linux ATK-DLRK3588 5.10.160 ... aarch64 Debian GNU/Linux十四、配置 WiFi 开机自动连接1. 创建自动连接脚本cat/usr/local/sbin/rk3588-wifi-connect.shEOF #!/bin/sh IFACEwlx4ca38f7e64b7 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 21; 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... i0 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 EOFchmodx /usr/local/sbin/rk3588-wifi-connect.sh2. 创建 systemd 服务cat/etc/systemd/system/rk3588-wifi.serviceEOF [Unit] DescriptionLoad RTL8733BU and connect WiFi on RK3588 Debian Afterlocal-fs.target Beforessh.service Wantsssh.service [Service] Typeoneshot ExecStart/usr/local/sbin/rk3588-wifi-connect.sh RemainAfterExityes StandardOutputappend:/var/log/rk3588-wifi.log StandardErrorappend:/var/log/rk3588-wifi.log [Install] WantedBymulti-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 root192.168.0.135 登录成功十六、最终常用命令查看 WiFi 服务systemctl status rk3588-wifi.service --no-pager查看 WiFi 日志cat/var/log/rk3588-wifi.log手动重连 WiFisystemctl restart rk3588-wifi.service查看无线 IPipaddr show wlx4ca38f7e64b7Ubuntu 主机 SSH 登录sshroot192.168.0.135SSH key 冲突时ssh-keygen-R192.168.0.135RK3588 查看系统版本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密码。