在嵌入式Linux开发中,SD卡双分区是常见的系统部署方案。简单来说,就是把一张SD卡分成两个独立区域:FAT32格式的BOOT分区和EXT4格式的rootfs分区。这种设计可不是为了看起来专业,而是有实实在在的好处。
我刚开始接触Petalinux时也不理解为什么要这么麻烦,直到有次更新应用程序时把整个系统搞崩了才明白。双分区最大的优势就是系统与数据分离:BOOT分区放启动文件(如BOOT.BIN、image.ub),rootfs分区放根文件系统。这样当需要更新应用程序时,只需要替换rootfs分区中的文件,完全不会影响启动流程。
另一个实际好处是兼容性。FAT32是通用文件系统,几乎所有硬件都能识别,确保uboot能顺利加载内核;而EXT4则是Linux原生文件系统,支持权限控制、符号链接等高级特性。我在一次项目中就遇到过单分区方案导致设备节点权限丢失的问题,改用双分区后迎刃而解。
特别提醒:操作前务必备份SD卡数据,分区操作会清空所有内容!我就曾因为忘记备份损失过重要资料。
分区工具推荐使用gparted,比fdisk更直观:
bash复制sudo apt update
sudo apt install gparted -y
如果使用虚拟机,记得在插入SD卡时选择连接到虚拟机。遇到过读卡器无法识别的情况,这时需要:
lsusb确认设备是否识别bash复制sudo vmware-usbarbitrator restart
打开gparted时会显示所有存储设备,务必确认选择的是SD卡(根据容量判断)。我有个同事误操作格式化了硬盘,血的教训!
操作步骤:
注意:有些SD卡会有隐藏的保留分区(尤其在Windows格式化过的),一定要全部删除。

常见坑点:
将Petalinux生成的启动文件复制到BOOT分区:
bash复制cp BOOT.BIN /media/$USER/BOOT/
cp image.ub /media/$USER/BOOT/
重要检查项:
解压根文件系统时需要root权限:
bash复制sudo tar xvf rootfs.tar.gz -C /media/$USER/rootfs
优化建议:
--keep-directory-symlink参数保留符号链接sync确保数据完全写入/dev目录是否生成设备节点遇到过解压后系统无法启动的情况,最后发现是SD卡速度跟不上导致文件损坏。解决方法:
bash复制sudo chmod -R 755 /media/$USER/rootfs # 确保权限正确
sudo find /media/$USER/rootfs -type d -exec chmod 755 {} \;
卡在"Waiting for root device":
/dev/mmcblk0p2是否正确(有些板子是mmcblk1p2)内核panic:
uboot无法加载镜像:
bash复制fatload mmc 0:1 0x10000000 image.ub
bootm 0x10000000
bash复制setenv bootargs 'console=ttyPS0,115200 root=/dev/mmcblk0p2 rw'
saveenv
通过实测给出推荐值:
| 分区类型 | 最小容量 | 推荐容量 | 存放内容 |
|---|---|---|---|
| BOOT | 256MB | 1GB | BOOT.BIN, image.ub |
| rootfs | 2GB | 剩余全部 | 系统文件、应用数据 |
创建部署脚本deploy_sd.sh:
bash复制#!/bin/bash
BOOT_PART="/media/$USER/BOOT"
ROOTFS_PART="/media/$USER/rootfs"
echo "=== 清空分区 ==="
rm -rf $BOOT_PART/*
sudo rm -rf $ROOTFS_PART/*
echo "=== 复制BOOT文件 ==="
cp BOOT.BIN image.ub $BOOT_PART/
echo "=== 解压rootfs ==="
sudo tar xvf rootfs.tar.gz -C $ROOTFS_PART
echo "=== 设置权限 ==="
sudo chown -R root:root $ROOTFS_PART
sudo chmod -R 755 $ROOTFS_PART
echo "=== 同步数据 ==="
sync
通过修改uboot实现双系统切换:
bash复制setenv bootargs_system1 'root=/dev/mmcblk0p2'
setenv bootargs_system2 'root=/dev/mmcblk0p3'
setenv bootcmd 'run bootcmd_system1' # 默认启动系统1
在工业控制器项目中,我们要求系统能回滚到上一个版本。最终方案是:
通过uboot脚本检测系统健康度,异常时自动切换分区。这个方案成功解决了现场升级失败导致设备变砖的问题。
另一个性能优化案例:通过调整ext4参数提升IO性能:
bash复制sudo mkfs.ext4 -O ^has_journal -E stride=4,stripe_width=512 -L rootfs /dev/mmcblk0p2
在频繁写操作的场景下,这样配置可以减少约30%的写放大效应。