昇腾310B启动镜像制作与烧写实战:从SD卡到eMMC完整指南
做嵌入式Linux久了你会发现越是看起来“高大上”的AI芯片开发板越容易栽在最底层那一步——启动镜像。最近我这边正好在做华为昇腾310B相关的边缘推理项目手上一块Atlas 200I A2的板子前前后后把SD卡启动、eMMC系统烧写、串口异常排查全走了一遍踩了不少坑。这篇文章就围绕昇腾310B的启动镜像制作与烧写把从拿到空板到系统正常跑起来的完整流程整理出来包括工具选型、分区规划、烧写命令、日志诊断这些实操细节。不管你是刚拿到开发板的初学者还是被烧写失败折磨过几天的老手照着这篇走一遍应该能少走很多弯路。1. 动手之前聊聊昇腾310B的启动链路和镜像的本质1.1 310B到底是什么场景的板子华为昇腾310B是昇腾系列里面向边缘和端侧推理场景的AI处理器典型的形态就是Atlas 200I A2加速模块、Atlas 200 DK A2开发者套件以及各类嵌入式的AI盒子。它和传统的MCU板子或者普通ARM Linux开发板最大的区别在于除了CPU核心之外还集成了专门的AI计算单元所以用户拿到板子之后既要管好底层的Linux系统还要在上面部署CANN推理环境。启动镜像这关过不了后面再怎么优化模型都是白搭因为系统根本起不来。这类板子的启动方式一般是SD卡启动或者eMMC启动。开发者套件上通常会预留一个microSD卡槽出厂时有些批次不带系统需要你自己制作一张可启动的SD卡。而量产的嵌入式设备为了稳定性和速度通常会把系统固化到板载eMMC里面。两种方式对应用镜像的制作和烧写要求不太一样。SD卡相对灵活插拔方便适合开发调试eMMC烧写则需要借助串口或者fastboot通道来完成一次烧好之后基本就是正式运行的状态了。1.2 启动镜像里到底装了什么很多人第一次接触“启动镜像”这几个字以为就是拿个dd命令把某个文件怼到SD卡里就完事。实际上昇腾310B的启动镜像是一个复合结构里面至少包含以下几部分Bootloader负责初始化DDR、时钟和关键外设然后把内核加载到内存。昇腾平台一般用U-Boot它的代码和配置信息独立存放在一个分区里。内核镜像即Linux内核的Image文件编译时针对昇腾310B的架构做了裁剪跑起来之后再加载各个硬件模块的驱动。设备树文件.dtb文件描述板级的硬件资源比如串口、GPIO、PCIe、SD控制器这些。设备树跟内核版本必须匹配否则会出现莫名其妙的外设无法识别问题。根文件系统常见的出厂系统是Ubuntu或者openEuler里面包含了运行库、工具链、以及昇腾的固件和驱动安装包。额外的数据分区用于存放日志、模型文件、应用数据等生产环境往往要单独规划一个可读写的分区避免系统分区被写满。整个启动链路可以简化成一句话板上ROM固件从SD卡或者eMMC的第一个扇区读取BootloaderBootloader再引导内核内核解析设备树之后挂载根文件系统最后把控制权交给init进程。这个链路里任何一个环节出错串口上呈现的日志表现都不一样后续排查也要顺着这个链路一层一层查。1.3 为什么需要自己制作启动镜像官方其实提供过SD卡制作工具很多用户也习惯于直接拿Windows版本的工具一键制作。工具好用是好用但实际做项目的时候你会发现有几个场景它cover不住第一定制根文件系统。官方镜像里的rootfs是通用版预装了一堆你可能用不到的东西而你想装一个裁剪过的、只有特定运行环境的系统这时就得手工做镜像。第二修改内核参数或设备树。比如你想调整串口波特率、修改默认网口IP、或者适配一个自己的外设扩展板就必须改dtb甚至重新编内核。第三批量生产烧录。产线上不会一台一台插SD卡跑图形界面工具而是需要一个可重复执行的命令脚本方式把干净的镜像写到eMMC里。第四官方工具不支持的操作系统或者主机环境。某些情况下你的开发机是纯Linux环境没有Windows虚拟机那就只能走命令行方案。所以理解镜像的文件组织方式和底层烧写逻辑比单纯会点几下鼠标重要得多。后面我讲的都是基于命令行和脚本的流程既能用于单板调试也能迁移到产线脚本里。2. 环境准备主机侧工具链与镜像包选型2.1 主机环境要求做昇腾310B的烧写工作我强烈建议你准备一台Linux主机Ubuntu 18.04或20.04的x86_64环境最稳我用的是Ubuntu 20.04.6整个流程没出过大问题。要是你手里只有Windows机器也不是不行官方有Windows版的SD卡制作工具但那个工具只能做SD卡做不了eMMC而且出了问题不好排查。主机的硬件条件不用太高8GB内存加20GB空闲磁盘足够。但有几个软件依赖得提前装好parted、dosfstools、e2fsprogs、wget、unzip、python3。这些在Ubuntu上都好装直接sudo apt install一条命令搞定。另外串口调试工具必须有minicom或者picocom任选一个我习惯用picocom因为它退出和日志保存都比minicom简单。还有一个容易被忽略的点主机的/etc/hosts和代理设置。下载官方固件包时经常需要访问外部资源如果你在公司内网环境要么配置好代理要么提前把需要的固件包下载到本地不然脚本跑到一半卡在下载会非常难受。2.2 工具链清单与用途我用到的工具和包大致如下做一个表格方便你对照准备工具/包用途备注昇腾310B固件包包含Bootloader、内核、设备树、驱动等原始文件从昇腾社区下载注意版本匹配CANN Toolkit安装包提供AI运行环境和驱动如果只需要跑系统层可后装make_sd_card.py脚本官方提供的SD卡自动制作脚本封装了分区、格式化、拷贝等步骤parted/mkfs.vfat/mkfs.ext4手工分区和格式化工具Linux自带dd整卡或分区镜像写入工具系统自带但参数要小心balenaEtcher图形化整卡写入工具适合快速恢复镜像picocom/minicom串口终端工具查看启动日志、进入Uboot控制台除了这些Windows下常用的是Etcher、Rufus、Win32DiskImager还有官方SD卡制作工具。我的习惯是开发阶段用命令行出了问题能用串口日志说话给同事或者客户制作演示卡时才用图形工具因为操作门槛低。2.3 拿到官方包后先做的事固件包下载回来后别急着解压执行先做三件事。第一校验文件完整性。很多官方包页面会提供SHA256校验值下载完了先sha256sum比对一下避免下载过程中文件损坏。这一步看着多余实际遇到过一次包解压中途报CRC错误浪费了半天时间从那以后我每次都先校验。第二看包目录结构。解压之后通常能看到uboot、kernel、dtb、rootfs、还有make_sd_card.py之类的文件。花几分钟读一下目录结构能让你理解官方脚本干了什么。比如有些包里rootfs是一个压缩的rootfs.ext4.tar.gz有些则是可以直接挂载的img文件这两种后续处理方式完全不同。第三确认固件版本和板子型号匹配。昇腾310B的板子虽然核心都是310B但同一芯片在不同载板上的启动时序、DDR配置可能不同固件包里一般会写明支持的板型。我在一次项目里就碰过固件包和板卡硬件版本不匹配现象是U-Boot起来没几秒就死机查了两天才发现是DDR初始化参数不对。所以这一步务必不要跳过。3. 制作启动镜像从SD卡到eMMC的完整流程3.1 SD卡方案最快跑起来的路径如果你是第一次接触310B开发板我建议先用官方方案把板子跑起来确认硬件没问题再研究定制镜像。官方make_sd_card.py脚本的用法大概是这样# 先切到root或者用sudo执行 python3 make_sd_card.py local --sd-dev/dev/sdb --log/tmp/make_sd_card.log脚本执行过程中会自动完成SD卡分区、格式化、拷贝Bootloader和内核、解压rootfs这几件事。执行完再用sync确保数据落盘然后就可以插卡上电了。这里必须强调一个操作禁忌/dev/sdb这个设备号一定要用lsblk确认清楚。我见过不止一个同事因为机器上挂着移动硬盘把系统写进了移动硬盘里好几天的工作直接报销。正确姿势是先插卡再运行lsblk看清楚SD卡的设备名和容量然后再填进命令里。命令执行过程中出现任何IO error优先怀疑卡本身有问题换一张卡再试别在坏卡上反复折腾。官方脚本赢在省心但它的定制能力非常弱。它是一套写死的流程你没法在脚本里额外指定内核参数、没法调整rootfs的预装包、也没法改变分区大小。所以它适合作为验证手段不适合作为项目交付的生产工具。3.2 手工制作镜像的精细化操作当你需要定制系统时手工制作镜像就是必修课。核心思路和通用嵌入式Linux开发一模一样分为分区、拷boot文件、解压rootfs、配置系统四步。第一步分区。昇腾310B的镜像我一般分成两个区第一个区是boot分区格式vfat大小256MB到512MB都够用第二个区是rootfs分区格式ext4容量根据根文件系统大小来定通常给8GB以上。用parted操作时注意如果SD卡之前烧过镜像会有残留分区表建议先wipefs -a /dev/sdX清一遍避免奇怪的问题。# 假设设备是 /dev/sdb8GB SD卡 sudo wipefs -a /dev/sdb sudo parted /dev/sdb --script mklabel msdos sudo parted /dev/sdb --script mkpart primary fat32 1MiB 513MiB sudo parted /dev/sdb --script mkpart primary ext4 513MiB 100% sudo mkfs.vfat -n BOOT /dev/sdb1 sudo mkfs.ext4 -L ROOTFS /dev/sdb2第二步拷贝boot相关文件。把固件包里的Image、*.dtb、以及U-Boot环境变量文件拷贝到boot分区。这里有个小细节不同固件包对Bootloader的存放位置有要求有的是放在boot分区里让U-Boot主动读取有的是直接写在SD卡特定扇区。前者直接拷贝文件即可后者需要用dd把u-boot.bin写到偏移位置。具体看固件包里的说明文档没有文档就从make_sd_card.py脚本里反推看它用了什么命令。第三步解压rootfs。官方给的rootfs通常是rootfs.tar.gz直接解压到rootfs分区对应的挂载点sudo mount /dev/sdb2 /mnt/rootfs sudo tar -xzf rootfs.tar.gz -C /mnt/rootfs sudo sync如果你用的是已经制作好的整卡镜像其实不用手工做这三步直接用dd整卡写入就行这个放在下一节讲。但手工分区的优势在于你可以完全掌控每个分区的大小和内容特别是rootfs分区可以提前把CANN工具包、模型文件、启动脚本全部预置进去上电就能直接跑业务。第四步微调系统配置。解压完rootfs之后建议在/mnt/rootfs/etc/fstab里检查一下启动分区的挂载项确认为UUID或者设备名正确。如果你改了默认IP、主机名、SSH密钥也要在这个阶段改好。这一部做仔细了后面插卡上电就少很多麻烦。3.3 eMMC系统烧写思路eMMC烧写和SD卡制作是两个思路。SD卡你可以把卡拿下来插到电脑上操作eMMC焊死在板子上只能通过板子上的串口或者USB下载通道来写。昇腾310B常见的eMMC烧写路径是先让板子进入一个下载模式或者启动到U-Boot然后通过fastboot或者U-Boot命令把镜像写入eMMC。具体来说有几个关键点确认板子的启动拨码或者跳线设置。有些开发板支持从SD卡优先启动你可以把一张临时SD卡插上正常进入Linux之后再通过flash_erase和dd把eMMC写掉。为了保证eMMC里的Bootloader完整还要用mmc命令或者emmc专属工具写boot区域。如果没有SD卡槽或者想走下载模式一般需要在U-Boot启动阶段中断自动启动流程进入U-Boot命令行然后使用fastboot相关的命令烧写。U-Boot下可以用fastboot 0打开fastboot服务主机上配合fastboot工具烧写boot和rootfs分区。烧写eMMC比SD卡更怕断电一断电整块eMMC分区表可能就花了。所以一定要保证供电稳定最好用稳压电源而不是普通的USB口。我们在实验室就吃过亏用笔记本USB口供电烧写到一半供电波动板子直接变砖最后用串口重新走了一遍下载流程才救回来。4. 烧写环节工具对比与关键参数4.1 常用烧写工具对比昇腾310B相关的烧写工具我梳理下来无非三类整卡写入工具、分区级烧写工具、以及厂商专用工具。这里我用表格做一个横向对比场景推荐工具优点缺点整卡SD镜像恢复balenaEtcher / dd操作直接恢复快只能整卡写不适合自定义分区单分区更新boot、rootfsdd 分区设备文件灵活可针对单分区操作容易搞混分区号风险高eMMC系统烧写fastboot / U-Boot命令无需拆机适合量产依赖串口和下载模式学习成本高Windows下快速制作SD卡官方SD卡制作工具图形化对新手友好定制性差不支持eMMC这套选择和Zynq、RK3588那类板子很像。Zynq烧写讲究FSBL、U-Boot、bitstream、elf多个文件组合流程复杂得多RK3588有RKDevTool按分区单独烧写逻辑上和昇腾310B的fastboot分区烧写很像。这些对照理解之后你会发现所有嵌入式平台的底层套路都是相通的区别只在于厂家把流程封装到了什么程度。4.2 dd命令烧写的正确姿势dd是Linux下万能的块设备写入工具昇腾310B的整卡镜像也常用它来恢复。正确用法是这样sudo dd ifascend310b_full.img of/dev/sdb bs4M statusprogress convfsync参数解释一下bs4M设成4MB块大小能明显提高写入速度实测比默认的512字节快非常多statusprogress可以实时看到写入进度不然你会以为电脑卡死了convfsync确保数据真正同步到硬件而不是停留在page cache里。写完再执行一条sync然后安全弹出SD卡。用dd之前一定要用lsblk确认目标设备我反复强调因为这是事故率最高的环节。另外写入的时候不要再挂载这个设备否则内核报device or resource busy数据也是错的。我有一次图省事没卸载分区就写结果写到一半报错整张卡的分区表混乱最后全部重新来过。dd写整卡镜像适合你手里已经有一份完全正常的SD卡、想复制出多份的场景。先把正常的卡做成img备份然后快速克隆到其他卡上。生产环境里这个做法很实用比一台一台跑官方制作脚本快得多还能保证每张卡完全一致。4.3 串口烧写失败与排查串口烧写失败是新手遇到最多、也最容易崩溃的问题。很多人以为把板子用USB转串口线连上电脑打开终端就能看到日志结果按了复位键屏幕上一片空白。这里我把最常见的失败场景和排查顺序列出来完全没有输出串口终端黑屏先确认串口线接的是调试UART不是其他排针再检查终端波特率是否设成115200、数据位8、停止位1、无校验。这两个基础问题占了至少一半的串口失败案例。板子上电只有电源灯亮串口没有日志检查SD卡是否插到位、镜像是否烧写成功、启动模式是否选对。有些板子需要拨码开关指定从SD启动还是从eMMC启动。日志输出到一半就卡住这种情况常见于DDR初始化失败或者U-Boot环境变量被破坏。优先检查固件包和板子型号匹配再考虑清除U-Boot环境变量。主机设备管理器能看到串口但minicom没反应大概率是串口被别的程序占了或者权限不足直接sudo usermod -aG dialout $USER重新登录就好了。串口烧写失败之所以让人抓狂是因为现象很相似但原因千差万别。我的排查逻辑是先看电再看时钟先看硬件再看软件。但凡是上电后一点输出都没有多半是硬件通路问题有输出但卡住才是软件和镜像问题。这套思路帮我快速定位过好几次问题比瞎试命令高效得多。5. 第一次启动从串口日志确认系统状态5.1 串口配置与日志怎么看板子系统起来之后串口就是你和设备沟通最重要的窗口。我用的串口工具是picocom启动命令很简单sudo picocom -b 115200 /dev/ttyUSB0启动过程中串口会依次打印Bootrom日志、U-Boot信息、内核启动日志直到出现登录提示符。有几个关键节点需要重点关注Bootrom阶段会打印芯片型号和启动介质信息确认它确实读到了你烧写的介质。U-Boot阶段会出现Hit any key to stop autoboot的倒计时可以在这个窗口进U-Boot命令行执行printenv查看环境变量也能在这里中断启动做维护。内核启动阶段会打印设备树信息和驱动程序加载情况看到Freeing unused kernel memory说明内核已经基本起来了。最后出现Ubuntu xxx login:或者openEuler的登录信息说明rootfs挂载成功系统进入用户态。建议第一次启动时用picocom的日志保存功能把完整启动过程记录下来命令是picocom启动后在终端里按CtrlA再按CtrlL开启日志。后续排查问题日志就是最直接的证据。5.2 常见启动异常与对策我整理了一个昇腾310B启动异常速查表都是实操中真实碰过的情况现象可能原因处理办法串口完全无输出串口接错、波特率错误、供电不足检查线路、串口参数换独立电源日志停在Bootrom阶段SD卡没读到或者固件版本不匹配重新制作SD卡对比固件包支持列表U-Boot能启动内核加载失败Image或dtb损坏内核版本不匹配重新拷贝boot分区文件检查文件完整性内核报VFS: Unable to mount root fsrootfs分区不存在或格式错误检查分区表重新格式化rootfs分区能到登录界面但root密码不对出厂rootfs的默认密码未按文档修改查看固件包文档中的默认账号密码网络不通设备树网络节点错误或驱动未加载dmesg看网卡驱动日志检查dtb适配其中VFS: Unable to mount root fs这个错误最容易引发恐慌但本质上就是内核找不到根文件系统。排查路径很清晰先确认rootfs分区是否存在再确认分区格式是不是ext4最后确认内核cmdline里root参数指向的分区对不对。在U-Boot里执行printenv bootargs就能看到内核引导参数如果root/dev/mmcblk0p2而你的rootfs分区在p3那就改环境变量或者重新分区就好了。5.3 启动成功后的系统确认与收尾系统能进登录界面只是万里长征第一步。我习惯上电之后马上做一轮基础检查确认硬件资源是否全部就位。cat /proc/cpuinfo free -h lsblk dmesg | grep -i error再看昇腾相关的设备节点是否存在典型的比如/dev/davinci0这个AI加速设备节点以及npu-smi info能不能正常输出NPU信息。如果设备节点没有生成说明内核驱动没有加载成功多半是驱动和内核版本不匹配需要回头重新装固件包里的驱动模块。系统确认通过之后我建议立刻给这个健康的rootfs做一个备份镜像命令就是把SD卡整个读出来sudo dd if/dev/sdb ofascend310b_golden.img bs4M statusprogress这份golden image就是后面所有批量复制和故障恢复的底牌。我做了这么多板卡项目最有安全感的一刻就是手里有一份验证过的干净镜像因为不管后续怎么折腾dd回一张卡就能恢复出厂状态。6. 从Zynq到RK3588昇腾310B烧写方法论的心得6.1 各家烧写异同对比搜过zynq烧写、rk3588烧写ubuntu20.04、rkdevtool单独烧写boot.img这些关键词的朋友应该能感受到各家方案的差异性。拿Zynq来说它的启动流程里涉及BootROM读FSBL、FSBL加载bitstream和U-Boot烧写时代还要把MMI、bit、elf这些文件按特定方式生成的MSC文件写到QSPI Flash或者SD卡步骤繁琐且组合文件多。相比之下昇腾310B的SD卡启动链路简单一些Bootloader、内核、rootfs分层清晰尤其是rootfs直接用ext4分区挂载不像有些FPGA方案要搞复杂的image格式转换。RK3588则是另一套思路。它的RKDevTool支持按分区烧写比如单独烧写boot.img、单独烧写rootfs非常灵活。昇腾310B通过fastboot也可以做类似的分区级写入逻辑上是相通的U-Boot启动后进入fastboot模式主机端fastboot flash boot boot.img、fastboot flash rootfs rootfs.img这样逐个分区烧。理解了这套原理做生产烧录脚本就很容易了无非是把手动命令包装成shell脚本再配上分区表校验。至于像r7f702301b如何烧写这种瑞萨MCU场景那就是完全不同的世界了MCU烧写一般是基于片上Flash编程器和调试器实现的跟Linux SoC的启动镜像完全两码事但排查思路是共通的先确认芯片是否进入编程模式再确认连接和电平最后才是镜像文件本身。方法论一致细节全在芯片手册里。6.2 量产烧录时的一些建议如果你不是只烤一块板子而是要备几十台设备我建议把烧写流程脚本化、可重复化。具体来说维护一份标准的镜像制作脚本仓库用Git管理每个版本的镜像都有tag和说明。产线烧录时统一用Linux主机运行一个交互式脚本插入SD卡后脚本自动检测设备并烧写烧完自动校验分区内容的哈希值通过才亮绿灯。不要把关键步骤留在手工操作上。手工操作一定会有遗漏我见过生产时因为某个同事没执行sync导致整批卡都有隐性问题的案例。每张卡或者每台设备烧写完成后做一次冒烟测试开机进系统、运行npu-smi info确认NPU正常、跑一个最小推理用例。不要相信“烧完了肯定能启动”这种话。6.3 最后分享一点个人经验昇腾310B的启动镜像制作与烧写说难不难说简单也不简单。难在它的环节链路长任何一个环节出问题表现出来的现象都可能是“毫无反应”让人无从下手。简单在于它本质上就是标准的嵌入式Linux启动流程Bootloader、内核、rootfs三板斧只要掌握好分层排查思路绝大多数问题都能通过串口日志定位到具体层级。我自己最大的一个体会是不要把烧写工具当成黑盒子。无论你用官方脚本还是dd命令都要清楚它背后到底做了什么——写了哪个分区、格式化成什么文件系统、拷了哪些文件。这样一旦出了问题你才有判断依据而不是病急乱投医。还有一点务实建议准备几张容量可靠的高速SD卡以及一个稳定的5V电源适配器这些东西在烧写环节扮演的角色比你想象的更重要。卡的质量差会导致镜像写入过程报错电源不稳会导致eMMC写入失败甚至变砖。这些小问题看着不起眼却是项目进度的头号隐形杀手。整套流程走一遍之后遇到“串口烧写失败”这类问题你应该不会再慌乱了。按启动链路逐层排查从串口硬件、供电、镜像文件到分区表每一步都有检查依据。希望这篇实战记录能帮你在昇腾310B的启动镜像这条路上少踩几个坑把精力留在后面真正有价值的AI应用开发上。