Linux/buildroot

Buildroot 기반의 시스템 OTA 업데이트 방법

임베디드 친구 2025. 4. 30. 19:39
728x90
반응형

Buildroot 기반의 시스템 OTA 업데이트 방법

Buildroot를 이용해 임베디드 시스템을 개발할 때, 원격에서 시스템을 업데이트할 수 있는 기능을 제공하는 것은 매우 중요한 요소입니다. Over-the-Air(OTA) 업데이트를 통해 새로운 기능을 추가하거나 보안 패치를 적용할 수 있으며, 물리적인 접근 없이도 유지보수가 가능합니다. 본 포스팅에서는 Buildroot를 활용하여 시스템의 OTA 업데이트를 구현하는 방법을 설명하겠습니다.

1. OTA 업데이트 개요

OTA 업데이트는 네트워크를 통해 시스템 소프트웨어를 원격으로 업데이트하는 방식입니다. 주로 다음과 같은 방식으로 구현됩니다.

  • A/B 파티션 업데이트: 두 개의 파티션(A, B)을 운영하며, 한쪽 파티션을 업데이트한 후 부팅을 전환하는 방식
  • 패키지 기반 업데이트: 개별 애플리케이션이나 라이브러리만 업데이트하는 방식
  • 전체 파일 시스템 업데이트: 파일 시스템 이미지를 다운로드하여 덮어쓰는 방식

이 글에서는 A/B 파티션 업데이트 방식과 전체 파일 시스템 업데이트 방식에 대해 다룹니다.

2. Buildroot에서 OTA 업데이트 환경 구축

2.1. Buildroot에서 필요 패키지 추가

Buildroot에서는 기본적으로 OTA 업데이트 기능을 제공하지 않지만, 필요한 패키지를 추가하여 구현할 수 있습니다. 주요 패키지는 다음과 같습니다.

make menuconfig
  • wget, curl: 업데이트된 이미지를 다운로드할 때 사용
  • mtd-utils: NAND 플래시 업데이트 시 필요
  • parted, e2fsprogs: 파티션 관리 및 파일 시스템 업데이트 지원

설정이 완료되면 make 명령을 실행하여 빌드를 진행합니다.

2.2. A/B 파티션 구조 설정

A/B 파티션 구조를 활용하려면 U-Boot에서 부팅 시 활성화할 파티션을 선택하는 기능이 필요합니다. 이를 위해 U-Boot의 환경 변수 설정을 수정해야 합니다.

U-Boot 환경 변수 설정

setenv bootcmd 'run boot_a; run boot_b'
setenv boot_a 'setenv rootfs /dev/mmcblk0p2; boot'
setenv boot_b 'setenv rootfs /dev/mmcblk0p3; boot'
saveenv

이렇게 설정하면, 기본적으로 A 파티션에서 부팅하며, 필요 시 B 파티션으로 전환할 수 있습니다.

3. OTA 업데이트 과정 구현

3.1. 업데이트 이미지 다운로드 및 검증

OTA 업데이트를 수행하려면 먼저 새로운 이미지를 다운로드해야 합니다. 이를 위해 wget이나 curl을 사용할 수 있습니다.

wget http://server.com/update.img -O /tmp/update.img
sha256sum -c update.img.sha256

다운로드된 이미지의 해시값을 검증하여 데이터 무결성을 확인합니다.

3.2. 새 파일 시스템을 파티션에 적용

업데이트할 파티션을 마운트 해제한 후 새로운 이미지를 적용합니다.

umount /dev/mmcblk0p3
dd if=/tmp/update.img of=/dev/mmcblk0p3 bs=4M
sync

파일 시스템을 복구한 후 확인합니다.

e2fsck -f /dev/mmcblk0p3
resize2fs /dev/mmcblk0p3

3.3. 부팅 파티션 전환

업데이트가 완료되면 U-Boot 환경 변수를 수정하여 다음 부팅 시 새로운 파티션에서 부팅하도록 설정합니다.

fw_setenv bootcmd 'run boot_b'
reboot

부팅 후 정상적으로 실행되는지 확인한 뒤, 문제가 없으면 새로운 파티션을 활성화 상태로 유지합니다.

4. 롤백 메커니즘 구현

OTA 업데이트 후 시스템이 정상적으로 동작하지 않을 경우, 이전 버전으로 롤백할 수 있도록 설계하는 것이 중요합니다. 이를 위해 watchdog을 활용하거나 부팅 후 특정 서비스가 정상적으로 실행되었는지 확인하는 스크립트를 작성할 수 있습니다.

예제 스크립트:

if ! systemctl is-active my_service; then
    echo "Boot failed, rolling back"
    fw_setenv bootcmd 'run boot_a'
    reboot
fi

이 스크립트는 my_service가 실행되지 않으면 자동으로 이전 버전으로 복구하는 역할을 합니다.

5. 결론

Buildroot에서 OTA 업데이트를 구현하는 방법을 살펴보았습니다. A/B 파티션 업데이트와 전체 파일 시스템 업데이트 방식 중 시스템 환경에 적절한 방법을 선택하여 구현할 수 있습니다. 또한, 업데이트 후 롤백 메커니즘을 설계하여 안정성을 보장해야 합니다. 앞으로 보다 자동화된 OTA 업데이트 프로세스를 구축하려면 업데이트 서버와 연계한 관리 시스템을 도입하는 것도 고려할 수 있습니다.

728x90
반응형