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.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.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 set2. 同时确认屏幕 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确认版本:
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/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.sh2. 创建 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 wlx4ca38f7e64b7Ubuntu 主机 SSH 登录:
sshroot@192.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密码。
