我对嵌入式 Linux 相当陌生,目前正在使用 Raspberry Pi 3B+ 的设备上工作。操作系统是使用 Buildroot 构建的,并且可以使用 U-Boot (v2019.01) 通过双复制策略升级设备,swupdate
但目前升级过程尚未完全安全,因为 u-boot 环境是不是多余的,它作为单个文件存储在 rpi 启动 FAT 分区中。
为了让事情更安全,我尝试将 u-boot 环境直接冗余地存储在两个不同分区的 mmc 内存(SD 卡)中。要创建我使用的 SD 卡映像genimage
和 cfg 文件,如下所示:
image boot.vfat {
vfat {
files = {
"bcm2710-rpi-3-b.dtb",
"bcm2710-rpi-3-b-plus.dtb",
"bcm2710-rpi-cm3.dtb",
"rpi-firmware/bootcode.bin",
"rpi-firmware/cmdline.txt",
"rpi-firmware/config.txt",
"rpi-firmware/fixup.dat",
"rpi-firmware/start.elf",
"rpi-firmware/overlays",
"zImage",
"u-boot.bin",
}
}
size = 16777216
}
image user-data.ext4 {
ext4 {
}
size = 64M
mountpoint = "user-data"
}
image sdcard.img {
hdimage {
}
partition boot {
partition-type = 0xC
bootable = "true"
image = "boot.vfat"
}
partition UbootEnvA {
partition-type = 0xA3
image = "uboot-env.bin"
size = 16384
}
partition UbootEnvB {
partition-type = 0xA3
image = "uboot-env.bin"
size = 16384
}
partition rootfsA {
partition-type = 0x83
image = "rootfs.ext4"
}
partition rootfsB {
partition-type = 0x83
image = "rootfs.ext4"
}
partition film-dev-data {
partition-type = 0x83
image = "user-data.ext4"
}
}
分区UbootEnvA
并UbootEnvB
使用使用创建的环境映像mkenvimage
。
当设备启动时,我会收到通常的Loading Environment from MMC... *** Warning - bad CRC, using default environment
消息,如果我mmc part
在 uboot shell 中使用该命令,我会收到以下列表:
Partition Map for MMC device 0 -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
1 1 32768 00000000-01 0c Boot
2 32769 32 00000000-02 a3
3 32801 32 00000000-03 a3
4 32833 950275 00000000-04 0f Extd
5 32834 409600 00000000-05 83
6 442435 409600 00000000-06 83
7 852036 131072 00000000-07 83
分区 2 和 3 对应于UbootEnvA
和UbootEnvB
,扇区长度为 512 字节,因此我认为 U-Boot 源代码中使用的环境的偏移量可以计算为:
32769 * 512 = 16777728 (for the primary one)
32801 * 512 = 16794112 (for the redundant one)
于是我通过打补丁的方式在U-boot源代码中添加了如下定义uboot-2019.01/include/configs/rpi.h
,然后重新编译:
#define CONFIG_SYS_MMC_ENV_DEV 0
#define CONFIG_ENV_OFFSET 16777728
#define CONFIG_ENV_OFFSET_REDUND 16794112
但此后,当 U-Boot 尝试加载环境时,我仍然遇到相同的“Bad CRC”错误。
我显然在这里遗漏了一些东西,因为我不是嵌入式 Linux 专家。我不确定它是否在genimage
cfg 文件中、在 U-Boot 环境偏移中或在我计算偏移的方式中。
我真的希望我可以在 FAT 启动分区中使用冗余环境,但在查看该uboot-2019.01/env/fat.c
文件后,似乎不支持这样的事情。
有人能指出我正确的方向吗?