公司动态

RK3568开发板Raspbian系统从SD卡迁移至eMMC存储完整指南

📅 2026/8/2 2:03:09
RK3568开发板Raspbian系统从SD卡迁移至eMMC存储完整指南
1. 项目缘起为什么需要将Raspbian刷写到eMMC最近在折腾一块Jetson Orin Nano核心板但手头正好有一台基于瑞芯微RK3568的reComputer R1000开发板闲置着。这块板子性能不错接口也全想着能不能把它变成一个轻量级的家庭服务器或者边缘计算节点。板载的存储是eMMC容量比常见的SD卡大读写速度和可靠性也更好用来跑服务更稳定。官方默认的系统镜像通常是烧录到SD卡启动的但长期运行尤其是涉及到频繁读写数据库或者日志的服务SD卡终究是个隐患。所以我的目标很明确把Raspbian操作系统直接从SD卡启动的模式迁移并固化到板载的eMMC存储里让它从“外置U盘启动”变成“内置硬盘启动”。这个操作听起来简单但实际动手时你会发现它介于“常规系统安装”和“嵌入式设备烧录”之间。它不像在x86电脑上装系统那样有图形化的引导程序也不像给单片机烧录固件那样直接用编程器搞定。你需要理解开发板的启动流程、存储分区结构并且手头要有合适的工具链。网上关于RK3568刷机的资料不少但针对reComputer R1000这个具体型号把Raspbian刷进eMMC的完整、细节清晰的教程并不多很多都是只言片语或者直接给个命令了事背后的原理和可能遇到的坑都没说清楚。我花了差不多两个周末的时间踩了好几个坑才最终跑通整个流程。这篇文章就是把我摸索出来的步骤、背后的原理以及那些官方文档里不会写的“坑点”全部记录下来。2. 准备工作硬件、软件与镜像的抉择工欲善其事必先利其器。在开始刷写之前确保你手头有所有必要的“装备”并且理解每一个选择背后的原因。2.1 硬件清单与连接确认首先你需要准备好以下硬件reComputer R1000开发板主角确认其eMMC版本通常是5.1或更高容量常见为16GB或32GB。MicroSD卡与读卡器容量至少8GBClass 10或以上速度。这是我们的“安装媒介”和初始系统载体。刷写过程本身并不复杂但前期需要用它来启动一个基础系统。USB Type-C数据线一条支持数据传输的Type-C线用于连接开发板和主机。很多手机充电线只支持供电务必确认这条线可以传数据这是后续使用adb或rkdeveloptool等工具的关键。主机电脑一台运行Linux推荐Ubuntu 20.04/22.04或Windows需要安装相关驱动的电脑。我强烈推荐使用Linux主机因为后续的命令行工具在Linux环境下兼容性最好几乎不需要处理驱动问题。网线可选但推荐用于给开发板提供稳定的网络连接方便通过SSH远程操作比直接在串口终端里敲命令要舒服得多。串口调试板USB to TTL与杜邦线这是最重要的调试工具。reComputer R1000通常留有UART调试串口通常是三根线GND, TX, RX。通过串口你可以在系统完全无法启动时看到最底层的Bootloader输出信息是救砖和深度调试的终极手段。我使用的是CH340芯片的USB转TTL模块在Linux下即插即用。硬件连接上先用MicroSD卡启动Raspbian通过网线或Wi-Fi让开发板获得IP地址然后通过SSH登录进行操作。同时建议把串口也接好打开一个串口终端软件如minicom或picocom以备不时之需。2.2 软件工具链选型软件方面我们需要以下几类工具镜像烧录工具用于SD卡在主机上将Raspbian系统镜像写入SD卡。推荐使用Raspberry Pi Imager。它官方、易用会自动处理分区和引导。当然在Linux下用dd命令也是经典选择sudo dd ifyour-raspbian-image.img of/dev/sdX bs4M statusprogress。使用dd时务必再三确认of后面的设备名如/dev/sdb是你的SD卡写错了会清空主机硬盘瑞芯微开发工具这是与RK3568芯片通信、进行底层烧录的桥梁。主要有两个rkdeveloptool这是Rockchip官方开源的命令行工具功能强大是我们在Linux主机上的主力工具。我们需要用它来让开发板进入Loader模式一种特殊的固件下载模式然后向eMMC写入新的引导程序和系统镜像。RKDevToolWindows图形化工具如果你坚持使用Windows主机那么需要安装这个工具以及对应的驱动程序。它的操作更可视化但有时驱动安装会比较麻烦。本文主要基于rkdeveloptool的Linux命令行流程因为它更透明、可脚本化也更能让你理解底层过程。磁盘与分区工具在开发板运行的Linux系统内我们需要对eMMC进行分区和格式化。主要使用fdisk或parted进行分区操作用mkfs.ext4等命令格式化分区。系统备份与同步工具我们需要把SD卡上运行良好的系统“克隆”到eMMC。这里用dd命令进行全盘拷贝是最彻底的但效率低且浪费空间。更推荐的方法是使用rsync进行文件级同步它只复制有效文件并且可以断点续传灵活高效。2.3 系统镜像的选择与处理你首先需要在SD卡上运行一个你满意的Raspbian系统。可以从树莓派官网下载适用于ARM64的Raspbian Lite或Desktop镜像。我选择的是Raspbian OS Lite (64-bit)因为作为服务器不需要图形界面。这里有一个关键点官方的Raspbian镜像是为树莓派的SD卡启动流程优化的。它的引导部分bootloader如bootcode.bin, start.elf是树莓派GPU固件这在RK3568上是不工作的。RK3568需要它自己的引导链U-Boot。因此我们的工作流核心就变成了利用SD卡上的Raspbian作为“临时系统”和“文件来源”但引导部分写入eMMC的必须替换为RK3568兼容的U-Boot。这意味着我们不是简单地把SD卡镜像dd到eMMC而是要进行一次“移植手术”。3. 核心操作从SD卡系统到eMMC的移植手术准备工作就绪现在开始核心操作。请确保你已通过SSH登录到由SD卡启动的reComputer R1000。3.1 步骤一识别存储设备与备份原始eMMC首先我们要搞清楚哪个设备是eMMC。在Linux中SD卡和eMMC都会显示为块设备如/dev/mmcblkX。lsblk -d -o NAME,SIZE,TYPE,TRAN你会看到类似输出NAME SIZE TYPE TRAN mmcblk0 14.9G disk mmc mmcblk1 29.7G disk mmc通常尺寸较小的那个比如14.9G是你的SD卡因为镜像只用了部分空间尺寸较大的比如29.7G是板载eMMC。务必再次确认一个更稳妥的方法是在插拔SD卡前后分别执行lsblk看哪个设备会消失/出现。重要提示在操作eMMC之前强烈建议先备份其原始内容尤其是原厂系统或数据。# 假设eMMC是 /dev/mmcblk1 sudo dd if/dev/mmcblk1 of~/emmc_backup.img bs4M statusprogress这会生成一个完整的磁盘镜像备份如果刷写失败你可以用它恢复。3.2 步骤二为eMMC创建新的分区表接下来我们要在eMMC上创建新的分区表。我们将采用一个简单实用的两分区方案Boot分区/dev/mmcblk1p1FAT32格式约256MB-512MB。用于存放U-Boot、内核Image、设备树dtb以及Raspbian的启动文件如cmdline.txt,config.txt。根文件系统分区/dev/mmcblk1p2ext4格式占用剩余所有空间。用于存放完整的Raspbian系统文件。使用fdisk进行操作sudo fdisk /dev/mmcblk1在fdisk交互界面中输入g创建新的GPT分区表如果原来是MBR会清空所有分区。输入n创建新分区分区号选1第一个扇区直接回车默认最后一个扇区输入512M创建一个512MB的分区。输入t更改分区类型分区1的类型代码输入1(FAT12) 或直接回车Linux默认我们稍后用mkfs来格式化。输入n创建第二个分区分区号选2第一个和最后一个扇区都直接回车使用所有剩余空间。输入w将分区表写入磁盘并退出。现在让内核重新读取分区表sudo partprobe /dev/mmcblk1再次使用lsblk你应该能看到/dev/mmcblk1p1和/dev/mmcblk1p2。3.3 步骤三格式化分区并准备Boot分区内容格式化Boot分区为FAT32sudo mkfs.vfat -F 32 -n BOOT /dev/mmcblk1p1格式化根文件系统分区为ext4sudo mkfs.ext4 -L rootfs /dev/mmcblk1p2现在将这两个分区挂载到临时目录sudo mkdir -p /mnt/emmc_boot /mnt/emmc_root sudo mount /dev/mmcblk1p1 /mnt/emmc_boot sudo mount /dev/mmcblk1p2 /mnt/emmc_root关键一步准备Boot分区内容。这里不能直接用SD卡Boot分区的内容。我们需要RK3568的U-Boot你需要获取针对reComputer R1000或通用RK3568编译好的U-Boot镜像。它通常是一个名为idbloader.img和u-boot.itb的文件。你可以从板卡供应商的SDK、GitHub仓库如ayufan的rockchip-bin仓库或社区论坛找到。假设你已下载并放在开发板用户目录下。内核与设备树SD卡系统里运行的内核/boot/Image和设备树文件/boot/dtbs/rockchip/rk3568-recomputer-r1000.dtb或类似是兼容的可以直接复制。Raspbian的启动配置复制SD卡Boot分区里的cmdline.txt和config.txt但需要修改cmdline.txt中的根设备参数。操作如下# 1. 写入U-Boot使用dd直接写入eMMC的起始位置而非分区 # 注意这个操作风险极高务必确认设备路径我们将在后续“深度烧录”环节进行此处先准备文件。 # 将idbloader.img和u-boot.itb复制到Boot分区备用 sudo cp ~/idbloader.img ~/u-boot.itb /mnt/emmc_boot/ # 2. 复制内核和设备树 sudo cp /boot/Image /mnt/emmc_boot/ sudo cp /boot/dtbs/rockchip/*.dtb /mnt/emmc_boot/ # 或者只复制你板子对应的dtb # 3. 复制并修改启动配置 sudo cp /boot/cmdline.txt /mnt/emmc_boot/ sudo cp /boot/config.txt /mnt/emmc_boot/ # 编辑cmdline.txt将根文件系统指向eMMC的第二个分区 sudo sed -i s|root/dev/mmcblk0p2|root/dev/mmcblk1p2|g /mnt/emmc_boot/cmdline.txt # 同时检查是否有其他指向SD卡的参数一并修改。3.4 步骤四使用rsync克隆根文件系统这是将SD卡系统“复制”到eMMC的核心步骤。使用rsync比dd更智能、更安全。sudo rsync -axHAWX --numeric-ids --infoprogress2 --exclude{/dev/,/proc/,/sys/,/tmp/,/run/,/mnt/,/media/,/lostfound,/boot/*} / /mnt/emmc_root/这个命令参数解释-axHAWX保留所有文件属性权限、时间、链接等并跨越文件系统边界。--numeric-ids使用数字形式的UID/GID避免因用户组名不同导致问题。--infoprogress2显示整体复制进度。--exclude排除不需要复制的虚拟文件系统目录和已经单独处理的boot分区内容。这个过程可能需要十几分钟到半小时取决于SD卡系统的大小和速度。3.5 步骤五更新fstab文件克隆完成后需要更新eMMC根分区上的/etc/fstab文件使其正确挂载自身的Boot分区和交换分区如果有。# 先进入eMMC的根分区环境 sudo chroot /mnt/emmc_root /bin/bash # 编辑fstab cat /etc/fstab EOF # file system mount point type options dump pass /dev/mmcblk1p1 /boot vfat defaults,noatime 0 2 /dev/mmcblk1p2 / ext4 defaults,noatime 0 1 # 如果有swap分区请在此添加 EOF # 退出chroot环境 exit4. 深度烧录使用rkdeveloptool写入引导程序前面的步骤在SD卡系统运行时完成了文件系统的复制。但要让eMMC能够独立引导最关键的一步是向eMMC的最前端扇区写入RK3568的引导程序idbloader和U-Boot。这必须在开发板进入特殊的Loader模式下通过USB连接主机电脑来完成。4.1 让reComputer R1000进入Loader模式RK3568芯片通常有两种方式进入Loader模式按键组合在开发板断电状态下按住**Recovery键或Maskrom键**不放然后上电保持按住几秒后松开。reComputer R1000上这个键可能标为“REC”或“MASKROM”。命令行触发在已经运行的系统我们当前的SD卡系统中可以尝试执行命令sudo reboot loader。但这需要内核支持并且U-Boot配置了相应功能不是所有系统都可行。最可靠的方法是第一种。操作后开发板屏幕可能无显示此时通过USB连接到主机。4.2 在主机上使用rkdeveloptool进行烧录在主机电脑Linux上操作安装rkdeveloptoolgit clone https://github.com/rockchip-linux/rkdeveloptool cd rkdeveloptool autoreconf -i ./configure make sudo make install连接并识别设备 将reComputer R1000通过USB Type-C线连接到主机并确保其处于Loader模式。运行sudo rkdeveloptool ld如果看到类似DevNo1 Vid0x2207,Pid0x350a,LocationID106 Maskrom的输出说明设备已被识别为Maskrom或Loader模式。烧写引导程序 我们需要将之前准备好的idbloader.img和u-boot.itb烧写到eMMC的起始位置。idbloader.img包含第一级引导程序u-boot.itb是U-Boot本体。# 假设镜像文件在当前目录 sudo rkdeveloptool db idbloader.img # 下载并执行初始引导程序 sudo rkdeveloptool ul u-boot.itb # 下载U-Boot # 接下来将U-Boot写入eMMC的特定位置通常是从0x40扇区开始 sudo rkdeveloptool wl 0x40 u-boot.itb注意扇区偏移量0x4064扇区即32KB偏移是RK3568 U-Boot的标准存放位置。务必确认你获取的U-Boot镜像要求的写入位置不同编译配置可能不同。错误的偏移量会导致无法引导。重启设备sudo rkdeveloptool rd此时开发板会重启。你应该拔掉SD卡让系统尝试从eMMC引导。4.3 串口终端观察引导过程将串口调试板连接到主机的USB口和开发板的UART引脚GND, TX, RX对应连接。在主机上使用串口终端工具如picocom连接sudo picocom -b 1500000 /dev/ttyUSB0波特率通常是1500000。上电后你将在终端里看到U-Boot的启动日志。如果一切顺利你会看到U-Boot初始化、加载设备树、找到内核、并最终启动Raspbian系统的过程。如果卡在某处串口日志是排查问题的唯一途径。5. 疑难排查与经验总结即使按照步骤操作你也可能会遇到问题。以下是我踩过的一些坑和解决方案5.1 坑一无法进入Loader/Maskrom模式现象按住Recovery键上电rkdeveloptool ld找不到设备。排查确认USB线换一条确认能传输数据的Type-C线。确认按键多试几次按住键上电后保持5-10秒再松开。检查主机驱动在Linux下通常无需额外驱动。在Windows下需要安装zadig工具替换驱动为WinUSB。短路测试点对于某些板子最彻底的方法是找到eMMC芯片旁的“Maskrom”测试点或CLK/GND短路在上电瞬间短接强制进入Maskrom模式。参考具体板子的原理图。5.2 坑二U-Boot启动后卡住无法加载内核现象串口看到U-Boot启动但提示“Bad Linux ARM64 Image magic!”或找不到Image。排查检查Boot分区内容确认/mnt/emmc_boot/目录下存在Image文件并且文件名大小写正确通常是Image。检查设备树确认U-Boot使用的设备树文件名与/mnt/emmc_boot/下的.dtb文件匹配。可以在U-Boot命令行中启动时按任意键中断用printenv fdtfile查看预设的设备树名或者用fatls mmc 1:1查看Boot分区文件列表。检查U-Boot环境变量在U-Boot命令行中检查bootcmd和bootargs。bootargs中的root参数必须指向eMMC的根分区如/dev/mmcblk1p2。可以使用setenv命令临时修改并saveenv保存。5.3 坑三内核Panic或无法挂载根文件系统现象内核开始启动但最后报错“VFS: Unable to mount root fs”。排查确认根分区格式确保eMMC的第二个分区格式化为ext4并且在/etc/fstab和内核参数bootargs中的root中指定正确。检查文件系统完整性在SD卡系统中尝试对eMMC根分区进行fsck检查sudo fsck.ext4 -f /dev/mmcblk1p2。内核驱动支持确保你使用的内核镜像包含了eMMC控制器dwmmc_rockchip和文件系统ext4的驱动。通常官方提供的或为RK3568编译的内核都包含。5.4 经验心得与优化建议备份备份备份操作eMMC前全盘备份是救命的稻草。dd备份虽然慢但最管用。善用串口调试这是嵌入式开发的“眼睛”。没有串口输出排查引导问题如同盲人摸象。分阶段验证不要试图一步到位。可以先在SD卡系统里完整地挂载、分区、格式化eMMC并rsync系统文件。验证文件复制无误后再单独进行Loader模式下的U-Boot烧录。这样能把问题隔离。保持U-Boot和内核版本匹配尽量使用同一套源码或同一供应商提供的U-Boot和内核镜像避免兼容性问题。考虑使用SPI Flash作为备用引导一些高级玩家会将U-Boot烧录到板载的SPI Flash中然后由SPI Flash的U-Boot来引导eMMC或SD卡上的系统。这样即使eMMC系统损坏也能通过SPI Flash恢复变砖风险更低。但这需要硬件支持板载SPI Flash和更复杂的操作。性能调优系统成功从eMMC启动后你可以进一步优化。例如在/etc/fstab中为根分区添加noatime,datawriteback等挂载选项以提升IO性能根据eMMC型号调整调度器如设置为mq-deadline或none。整个过程走下来虽然步骤不少但每一步都有其明确的目的。从在SD卡上准备系统到分区格式化eMMC再用rsync克隆文件最后通过底层工具烧录引导程序这套“组合拳”实现了将依赖SD卡特定引导流程的Raspbian完整地迁移到了依靠芯片原生U-Boot引导的eMMC上。现在你的reComputer R1000已经拥有了一个从高速、可靠板载存储启动的完整Linux系统可以放心地部署你的长期服务了。