K230 无线调试与分区自动扩容方案实施总结

K230 无线调试与分区自动扩容方案实施总结

本项目在嘉楠勘智 K230 双核异构平台(小核 Linux + 大核 RT-Smart)上,实现了控制台无线化免密登录、Wi-Fi 自动联网、大核终端虚拟重定向(Virt-TTY)以及首次运行自动扩容分区的完整方案。

以下是完整的技术实施步骤与细节总结。


方案大图与架构

#mermaid-svg-Gr9NBINyXes4mhjh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Gr9NBINyXes4mhjh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Gr9NBINyXes4mhjh .error-icon{fill:#552222;}#mermaid-svg-Gr9NBINyXes4mhjh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Gr9NBINyXes4mhjh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Gr9NBINyXes4mhjh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Gr9NBINyXes4mhjh .marker.cross{stroke:#333333;}#mermaid-svg-Gr9NBINyXes4mhjh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Gr9NBINyXes4mhjh p{margin:0;}#mermaid-svg-Gr9NBINyXes4mhjh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Gr9NBINyXes4mhjh .cluster-label text{fill:#333;}#mermaid-svg-Gr9NBINyXes4mhjh .cluster-label span{color:#333;}#mermaid-svg-Gr9NBINyXes4mhjh .cluster-label span p{background-color:transparent;}#mermaid-svg-Gr9NBINyXes4mhjh .label text,#mermaid-svg-Gr9NBINyXes4mhjh span{fill:#333;color:#333;}#mermaid-svg-Gr9NBINyXes4mhjh .node rect,#mermaid-svg-Gr9NBINyXes4mhjh .node circle,#mermaid-svg-Gr9NBINyXes4mhjh .node ellipse,#mermaid-svg-Gr9NBINyXes4mhjh .node polygon,#mermaid-svg-Gr9NBINyXes4mhjh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Gr9NBINyXes4mhjh .rough-node .label text,#mermaid-svg-Gr9NBINyXes4mhjh .node .label text,#mermaid-svg-Gr9NBINyXes4mhjh .image-shape .label,#mermaid-svg-Gr9NBINyXes4mhjh .icon-shape .label{text-anchor:middle;}#mermaid-svg-Gr9NBINyXes4mhjh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Gr9NBINyXes4mhjh .rough-node .label,#mermaid-svg-Gr9NBINyXes4mhjh .node .label,#mermaid-svg-Gr9NBINyXes4mhjh .image-shape .label,#mermaid-svg-Gr9NBINyXes4mhjh .icon-shape .label{text-align:center;}#mermaid-svg-Gr9NBINyXes4mhjh .node.clickable{cursor:pointer;}#mermaid-svg-Gr9NBINyXes4mhjh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Gr9NBINyXes4mhjh .arrowheadPath{fill:#333333;}#mermaid-svg-Gr9NBINyXes4mhjh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Gr9NBINyXes4mhjh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Gr9NBINyXes4mhjh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gr9NBINyXes4mhjh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Gr9NBINyXes4mhjh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gr9NBINyXes4mhjh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Gr9NBINyXes4mhjh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Gr9NBINyXes4mhjh .cluster text{fill:#333;}#mermaid-svg-Gr9NBINyXes4mhjh .cluster span{color:#333;}#mermaid-svg-Gr9NBINyXes4mhjh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Gr9NBINyXes4mhjh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Gr9NBINyXes4mhjh rect.text{fill:none;stroke-width:0;}#mermaid-svg-Gr9NBINyXes4mhjh .icon-shape,#mermaid-svg-Gr9NBINyXes4mhjh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Gr9NBINyXes4mhjh .icon-shape p,#mermaid-svg-Gr9NBINyXes4mhjh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Gr9NBINyXes4mhjh .icon-shape .label rect,#mermaid-svg-Gr9NBINyXes4mhjh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Gr9NBINyXes4mhjh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Gr9NBINyXes4mhjh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Gr9NBINyXes4mhjh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Wi-Fi / SSH
核间共享内存 / IPCM
Virt-TTY 设备节点
virt-tty client
PC 终端
小核 Linux
大核 RT-Smart


第一阶段:大核 RT-Smart 控制台虚拟化重定向 (Virt-TTY)

大核默认的控制台输出设备名称为 "uart"。为了通过小核无线读取大核日志,需要将其修改为 "virt-tty",通过核间通信机制将输出映射到小核 Linux 端的 /dev/virt-tty/c908 设备节点上。

1. 修改大核控制台驱动参数

修改了大核配置文件模板和生成的头文件,以支持虚拟串口设备:

  • 配置文件模板common_rttlinux.config(file:///home/bhw98/k230_sdk/src/big/rt-smart/kernel/bsp/maix3/configs/common_rttlinux.config) 第 47 行。
  • 生成的头文件rtconfig.h(file:///home/bhw98/k230_sdk/src/big/rt-smart/kernel/bsp/maix3/rtconfig.h) 第 47 行。
diff 复制代码
- #define RT_CONSOLE_DEVICE_NAME "uart"
+ #define RT_CONSOLE_DEVICE_NAME "virt-tty"

同时确保使能了 RT_USING_VIRT_TTY 宏,使核间虚拟串口驱动生效。

2. 验证内核初始化调用

通过对反汇编文件 sdk_kernel_init.o 的分析,验证了在内核初始化时会调用 virt_tty_client_init(),以此与小核的 k_virt-tty 驱动建立共享内存交互通道。


第二阶段:小核 Linux 系统初始化与 Wi-Fi 自动联网

为了在系统启动后不需要物理串口输入联网指令,我们在小核 Linux 启动脚本中自动加载核间虚拟串口模块,并挂载 Wi-Fi 自动联网。

1. 自动加载核间模块

rcS(file:///home/bhw98/k230_sdk/board/common/post_copy_rootfs/etc/init.d/rcS) 启动脚本中追加了核间通信和虚拟串口驱动加载命令:

bash 复制代码
insmod k_ipcm.ko        # 加载核间通信底层驱动
insmod k_virt-tty.ko    # 加载虚拟串口设备驱动

2. 自动运行 Wi-Fi 联网脚本

rcS(file:///home/bhw98/k230_sdk/board/common/post_copy_rootfs/etc/init.d/rcS) 末尾添加后台自启动 Wi-Fi 联网指令,确保不阻塞主启动链(WiFi热点名与密码已替换):

bash 复制代码
/bin/sta.sh wlan0 "xxxxxxxxx" "yyyyyyyy" &

第三阶段:解决控制台 Getty 引导死循环

在去掉串口连接时,我们需要保证控制台能够自动进入 shell。如果直接使用 -a root,在 BusyBox 自带的精简版 getty 中会因为找不到 -a 选项而报错退出,并被 init 不断 respawn 导致打印死循环。

  • 修改方案
    inittab(file:///home/bhw98/k230_sdk/board/common/post_copy_rootfs/etc/inittab) 中修改 getty 配置,将其改为调用 /bin/sh 直接登录:

    复制代码
    console::respawn:/sbin/getty -L -n -l /bin/sh console 0 vt100 # GENERIC_SERIAL

    这样能够安全绕过密码输入界面,直接向串口暴露 root shell,解决循环报错问题。


第四阶段:分区尺寸优化与首次运行自动扩容

为了减小镜像包(sysimage-sdcard.img)的大小,同时在首次插入大容量 SD 卡(如 64GB)时能够自动利用所有空闲空间, we 采用了"小尺寸烧录 + 首次启动自动拉伸分区"的方案。

1. 静态分区定义调整

genimage-sdcard.cfg(file:///home/bhw98/k230_sdk/board/common/gen_image_cfg/genimage-sdcard.cfg) 中调整了出厂分区:

  • /sharefs(大核数据共享区) :设置为 256MB,容纳更大、更多的调试可执行文件。
  • /video(录像存储区) :初始大小设置为 512MB(使得固件体积降低至 1.0GB,便于打包和网络分发)。

2. 首次启动自动扩容脚本

rcS(file:///home/bhw98/k230_sdk/board/common/post_copy_rootfs/etc/init.d/rcS) 挂载逻辑前,插入自动扩容指令:

bash 复制代码
# 首次启动:自动扩容并格式化第 5 分区 (/video)
if [ ! -f /etc/.video_extended ] && [ -n "${bootddev}" ]; then
    echo "First boot: expanding /video partition to fill the remaining SD card space..."
    # 1. 修复 GPT 分区表,将备份 GPT 移动到 SD 卡实际物理末尾
    printf "Fix\n" | parted ---pretend-input-tty ${bootddev} print >/dev/null 2>&1
    # 2. 扩容第 5 分区到 100% 空间
    parted -s ${bootddev} resizepart 5 100% >/dev/null 2>&1
    # 3. 重新格式化第 5 分区为 FAT32 格式
    mkfs.vfat ${bootddev}p5 >/dev/null 2>&1
    # 4. 写入扩容标记,避免后续重复拉伸
    touch /etc/.video_extended
    echo "Expansion of /video complete."
fi

第五阶段:最终运行状态核对

重新烧录后,将板卡上电,通过串口及 SSH 连接进行系统验证,测试结果完美:

1. 分区挂载容量

小核控制台输入 df -h,扩容结果显示成功:

bash 复制代码
/ # df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root               120.0M     61.0M     55.1M  53% /
/dev/mmcblk0p4          255.9M     91.6M    164.3M  36% /sharefs  # 256MB sharefs 挂载正常
/dev/mmcblk0p5           57.7G     32.0K     57.7G   0% /video     # 57.7GB 空间已自动扩展格式化完成

2. 多终端无线调试工作流

此时物理串口线可完全拔掉,扔到一边去了。利用网络环境,开发者可以同时开启 3 个无线终端交互:

  1. 终端 1(小核监控)ssh root@192.168.0.103 监控小核应用与状态。
  2. 终端 2(大核虚拟控制台) :在 SSH 中运行 /mnt/virt-tty c908,与大核 RT-Smart 交互。
  3. 终端 3(自动化部署编译) :PC 终端通过 make deploy 自动将编译产物用 scp 传输至大核共享存储 /sharefs/