私は組み込みLinuxに初めてアクセスし、現在Raspberry Pi 3B+を使用するデバイスで作業しています。オペレーティングシステムはBuildrootを使用して構築され、デバイスはデュアルレプリケーション戦略を介してU-Boot(v2019.01)を使用してアップグレードできますが、swupdate
現在u-boot環境が重複していないため、アップグレードプロセスはまだ完全に安全ではありません。 FATパーティションのrpiブートに単一のファイルとして保存されます。
セキュリティを強化するために、u-boot環境をmmcメモリ(SDカード)の2つの異なるパーティションに直接重複して保存しました。 SDカードイメージとcfgファイルを作成するには、genimage
次のように使用しました。
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
メッセージが表示され、uboot シェルでコマンドを使用すると次のリストがmmc part
表示されます。
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
そのようなものはサポートされていないようです。
誰もが正しい方向に私を指すことができますか?