自定义根文件系统打包烧录与板端启动测试

发布时间:2026/7/22 1:22:00
自定义根文件系统打包烧录与板端启动测试 自定义根文件系统打包烧录与板端启动测试辛辛苦苦做好的根文件系统就像包好的饺子——不下锅煮永远不知道馅儿好不好吃。今天就来把 rootfs 下锅打包成镜像、烧录到板子、上电启动验证。引言前面几篇文章完成了根文件系统的制作和完善现在到了最激动人心的环节——把做好的 rootfs 部署到真实硬件上运行。本文将涵盖 rootfs 镜像打包、多种烧录方式、以及板端启动测试和故障排查的全流程。一、根文件系统打包1.1 常见打包格式根据目标存储介质的不同根文件系统需要打包成不同格式的镜像打包格式适用介质制作工具使用场景ext4 镜像SD/eMMCmkfs.ext4最常用JFFS2 镜像NOR/NANDmkfs.jffs2Flash设备UBIFS 镜像NANDmkfs.ubifs ubinize大容量NANDSquashFS 镜像任意mksquashfs只读系统cpio.gz内存find cpio gzipinitramfstar 归档NFStar网络挂载调试1.2 制作 ext4 镜像# 方法一创建空镜像后填充IMG_SIZE256# 单位MB# 创建空文件ddif/dev/zeroofrootfs.ext4bs1Mcount$IMG_SIZE# 格式化为ext4mkfs.ext4-Lrootfs rootfs.ext4# 挂载并填充内容sudomkdir-p/mnt/rootfssudomount-oloop rootfs.ext4 /mnt/rootfssudocp-arootfs/* /mnt/rootfs/sudoumount/mnt/rootfs# 验证镜像filerootfs.ext4# 输出: rootfs.ext4: Linux rev 1.0 ext4 filesystem data, volume name rootfs# 方法二使用 mkfs.ext4 直接从目录创建更简洁mkfs.ext4-drootfs/-Lrootfs rootfs.ext4 256M1.3 制作 cpio 镜像initramfs# 进入根文件系统目录cdrootfs/# 生成 cpio 镜像并压缩find.|cpio-Hnewc-o|gzip../rootfs.cpio.gz# 查看大小ls-lh../rootfs.cpio.gz# 输出示例: -rw-r--r-- 1 user user 1.2M rootfs.cpio.gz1.4 制作 tar 镜像NFS 调试用# 打包根文件系统保留权限和软链接tar-czfrootfs.tar.gz-Crootfs/.# NFS挂载时直接解压到NFS共享目录sudotar-xzfrootfs.tar.gz-C/nfs/rootfs/二、烧录方法2.1 SD 卡烧录ext4方式一dd 直接烧录分区镜像# 查看SD卡设备名lsblk# 假设SD卡为 /dev/sdb# 烧录到第二个分区sudoddifrootfs.ext4of/dev/sdb2bs4Mstatusprogresssync# 扩展文件系统到分区实际大小可选sudoe2fsck-f/dev/sdb2sudoresize2fs /dev/sdb2方式二手动创建分区并拷贝# 使用 fdisk 分区sudofdisk/dev/sdb# 创建两个分区:# p1: 256MB FAT32 (存放内核和设备树)# p2: 剩余空间 ext4 (存放根文件系统)# 格式化分区sudomkfs.vfat /dev/sdb1sudomkfs.ext4 /dev/sdb2# 挂载并拷贝sudomkdir-p/mnt/boot /mnt/rootfssudomount/dev/sdb1 /mnt/bootsudomount/dev/sdb2 /mnt/rootfs# 拷贝内核和设备树到boot分区sudocpzImage /mnt/boot/sudocpsun8i-h3-orangepi.dtb /mnt/boot/# 拷贝根文件系统sudocp-arootfs/* /mnt/rootfs/syncsudoumount/mnt/boot /mnt/rootfs2.2 NAND Flash 烧录JFFS2/UBIFSNAND Flash 烧录通常通过 U-Boot 或内核的 MTD 工具完成方式一U-Boot 下烧录# U-Boot 命令行中操作# 1. 通过TFTP下载镜像到内存tftp 0x42000000 rootfs.jffs2# 2. 擦除NAND对应分区nand erase.part rootfs# 3. 写入NANDnandwrite0x42000000 rootfs${filesize}# 4. 设置启动参数setenv bootargsconsolettyS0,115200 root/dev/mtdblock2 rootfstypejffs2 rwsaveenv# 5. 重启boot方式二Linux 运行时通过 MTD 工具烧录# 先将镜像传到板子上通过tftp/scp/nfstftp-g-rrootfs.ubi192.168.1.100# 使用 nandwrite 烧录UBI镜像用 ubiformatflash_erase /dev/mtd200ubiformat /dev/mtd2-frootfs.ubi-y# 挂载ubiattach /dev/ubi_ctrl-m2mount-tubifs ubi0:rootfs /mnt2.3 eMMC 烧录eMMC 烧录方式与 SD 卡类似因为 eMMC 对上层暴露为块设备# eMMC 通常显示为 /dev/mmcblk1SD卡为mmcblk0# 直接dd烧录sudoddifrootfs.ext4of/dev/mmcblk1p2bs4Mstatusprogresssync2.4 使用 SD 卡完整镜像一键烧录使用genimage或 Buildroot 生成的sdcard.img可以一键烧录所有分区# 一键烧录完整SD卡镜像含bootloaderkernelrootfssudoddifsdcard.imgof/dev/sdbbs4Mstatusprogresssync也可以用Etcher或Raspberry Pi Imager等图形化工具烧录。三、板端启动测试3.1 串口连接启动测试必须通过串口观察启动日志# 连接USB转串口查看设备名ls/dev/ttyUSB*# 使用 minicom 连接minicom-D/dev/ttyUSB0-b115200# 或使用 screenscreen/dev/ttyUSB0115200# 或使用 picocom推荐picocom-b115200/dev/ttyUSB03.2 正常启动日志上电后串口应依次输出# 1. Bootloader 阶段 U-Boot 2023.04 (Jan 01 2026) DRAM: 512 MiB MMC: mmc1c0f000: 0 Loading Environment from FAT... OK # 2. 内核启动阶段 Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 5.15.0 [ 0.325768] mmcblk0: p1 p2 [ 1.234567] VFS: Mounted root (ext4 filesystem) on device 179:2. # 3. 根文件系统挂载init执行 [ 1.567890] Run /sbin/init as init process Starting mdev... Configuring network: ifconfig eth0 192.168.1.100 MyBoard Linux System Ready Kernel: 5.15.0 Date: Fri Jan 1 00:01:23 UTC 2026 [rootmyboard /]#3.3 启动后验证清单进入 Shell 后逐项验证系统功能# 1. 检查文件系统挂载情况cat/proc/mounts# 确认 / 、/proc、/sys、/dev 都已挂载# 2. 检查设备节点ls/dev/# 确认 console、null、ttyS0 等存在# 3. 测试命令执行busyboxls-la/cat/proc/cpuinfofreedf-h# 4. 测试网络ifconfigping-c3192.168.1.1# 5. 测试文件读写echohello/tmp/test.txtcat/tmp/test.txt# 6. 检查内核日志dmesg|tail-20# 7. 测试重启reboot3.4 验证结果记录表测试项预期结果实际结果是否通过串口输出正常显示启动日志—□根文件系统挂载VFS: Mounted root—□init 执行进入 Shell—□/proc 挂载cat /proc/mounts 有内容—□设备节点/dev 下有 console 等—□网络通信ping 成功—□文件读写/tmp 可写入—□重启系统正常重启—□四、常见启动故障排查4.1 内核 panic找不到根文件系统VFS: Unable to mount root fs on unknown-block(0,0) Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)排查步骤# 1. 检查 bootargs 中 root 参数是否正确# 在 U-Boot 中查看:printenvbootargs# 2. 检查内核是否支持该文件系统# 在内核配置中确认:# CONFIG_EXT4_FSy# CONFIG_JFFS2_FSy# CONFIG_UBIFS_FSy# 3. 检查分区是否正确# 在 U-Boot 中:mtdparts# 或在 Linux 中:cat/proc/mtd4.2 内核 panic找不到 initKernel panic - not syncing: No working init found. Try passing init option to kernel.原因和解决原因解决方案/sbin/init 不存在确认 busybox 已安装软链接正确动态库缺失检查 /lib 下动态链接器和库文件架构不匹配确认 busybox 编译架构与 CPU 匹配init 没有执行权限chmod x /sbin/init4.3 启动卡在 “Starting kernel…”内核没有输出任何信息可能原因串口参数不匹配检查 consolettyS0,115200 与实际串口和波特率内核镜像损坏重新烧录 zImage设备树不匹配确认 dtb 文件与开发板型号一致内核未使能串口驱动检查内核配置 CONFIG_SERIAL_xxx4.4 JFFS2 挂载报错jffs2: Too few erase blocks (3) to be a JFFS2 filesystem原因分区太小或擦除块大小配置不对。检查mkfs.jffs2的-e参数与 Flash 实际擦除块大小是否一致。4.5 UBIFS 挂载报错UBIFS error (ubi0:0): bad geometry: min. I/O size mismatch原因mkfs.ubifs的-m参数与 NAND 页大小不一致。通过以下命令确认页大小# 在板子上查看cat/sys/class/mtd/mtd2/oobsizecat/sys/class/mtd/mtd2/writesize总结根文件系统从制作完成到板端运行核心经过三个环节打包选择正确格式、烧录匹配存储介质、验证逐项功能测试。烧录方式取决于存储介质——SD/eMMC 用 ddNAND 用 nandwrite/ubiformat。启动测试最重要的是看串口日志80% 的启动问题都能从日志中定位。遇到 panic 不要慌按照root参数→文件系统驱动→init程序→动态库的顺序逐级排查问题一定能找到。