저는 임베디드 Linux를 처음 접했고 현재 Raspberry Pi 3B+를 사용하는 장치에서 작업하고 있습니다. 운영 체제는 Buildroot를 사용하여 구축되었으며 장치는 이중 복제 전략을 통해 U-Boot(v2019.01)를 사용하여 업그레이드할 수 있지만 swupdate
현재 u-boot 환경이 중복되지 않기 때문에 업그레이드 프로세스가 아직 완전히 안전하지 않습니다. FAT 파티션의 rpi 부팅에 단일 파일로 저장됩니다.
좀 더 보안을 강화하기 위해 u-boot 환경을 mmc 메모리(SD 카드)의 서로 다른 두 파티션에 직접 중복 저장해 보았습니다. 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
그런 것은 지원되지 않는 것 같습니다.
누구든지 올바른 방향으로 나를 가리킬 수 있습니까?