SWUpdate
SWUpdate는 임베디드 리눅스 시스템에서 안전하고 신뢰할 수 있는 소프트웨어 업데이트를 제공하기 위해 설계된 오픈 소스 프로젝트입니다.
안정적이고 유연한 업데이트 메커니즘을 제공하며, 다양한 임베디드 환경에서 사용할 수 있도록 설계되었습니다.
https://github.com/sbabic/swupdate
주요 특징
- 다양한 업데이트 방식 지원:
- OTA(Over-The-Air) 업데이트
- USB 또는 로컬 파일 시스템을 통한 업데이트
- 네트워크 프로토콜 (HTTP, HTTPS, FTP 등)을 통한 업데이트
- 멀티 이미지 업데이트:
- 단일 업데이트 패키지 내에서 여러 이미지를 동시에 처리 가능.
- 부트로더, 커널, 파일 시스템 등 다양한 파티션에 업데이트 가능.
- 고신뢰성 업데이트:
- A/B 파티셔닝: 시스템 이미지의 두 복사본을 유지하여 실패 시 복구 가능.
- 롤백 메커니즘: 업데이트 실패 시 이전 상태로 복구.
- 확장성:
- Lua 스크립트 또는 커스텀 플러그인을 사용하여 사용자 정의 작업 추가 가능.
- 다양한 SoC(System on Chip) 및 파일 시스템 지원.
- 보안 업데이트:
- GPG 서명을 통한 패키지 무결성 검증.
- HTTPS를 통한 암호화된 전송.
- 호환성:
- Yocto 프로젝트 및 Buildroot와 통합 가능.
- U-Boot와 같은 부트로더와 호환.
구성 요소
- SWU 파일:
- 업데이트 패키지를 정의하는 파일로, 내부에 여러 바이너리 및 설정을 포함.
- 파일 형식은
.swu
.
- Handler:
- 특정 유형의 파일이나 파티션을 처리하는 모듈.
- 예: Raw Flash, eMMC, UBIFS 등.
- Update Agent:
- SWUpdate 프로세스를 관리하며, 네트워크 또는 로컬 소스에서 업데이트를 수행.
- Web Interface:
- 사용자가 웹 브라우저를 통해 업데이트를 제어할 수 있는 옵션 제공.
사용 사례
- 자동차: 자동차 ECU 소프트웨어 업데이트를 안전하게 수행.
- IoT 장치: 소형 디바이스에서의 OTA 업데이트 관리.
- 산업용 장비: 필드에 배치된 장비의 안정적인 원격 업데이트.
- 커넥티드 장치: 스마트홈, 웨어러블 디바이스에서의 지속적인 소프트웨어 배포.
SWUpdate의 내부 구조
이 소프트웨어는 업데이트 과정을 제어하고, 시스템 무결성을 유지하며, 다양한 임베디드 시스템의 요구 사항을 충족할 수 있도록 고도로 구성 가능한 구조를 가지고 있습니다.
SWUpdate 엔진
- 업데이트 프로세스를 관리하는 코어 구성 요소입니다.
- 주요 기능:
- 업데이트 패키지(
.swu
)를 읽고, 각 이미지에 적합한 핸들러를 호출. - 업데이트 도중 상태를 로깅하고, 실패 시 롤백을 수행.
- A/B 업데이트 모델과 같은 고신뢰성 기능 지원.
- 업데이트 패키지(
SWU 파일 포맷
.swu
는 업데이트 패키지를 위한 컨테이너 파일로, 일반적으로CramFS
또는SquashFS
와 같은 읽기 전용 파일 시스템을 사용합니다.- 포함 항목:
- 이미지: 커널, 루트 파일 시스템, 부트로더 등.
- 메타데이터: 버전 정보, 서명, 체크섬.
- Lua 스크립트: 업데이트 과정에서 실행되는 사용자 정의 작업.
핸들러 (Handlers)
- 핸들러는 특정 유형의 파티션 또는 데이터 저장소를 처리하는 모듈입니다.
- 예: Raw NAND Flash, eMMC, NOR Flash, UBIFS, EXT4 등.
- 핸들러는
플러그인
구조로 설계되어 필요에 따라 확장 가능. - Handlers
A/B 파티셔닝 모델
- 시스템은 두 개의 동일한 파티션 세트를 가집니다(A와 B).
- 업데이트는 비활성 파티션에 적용되고, 성공적으로 적용된 후 부팅을 전환.
- 실패 시 이전 파티션(A 또는 B)로 롤백 가능.
- 이 모델은 안정성을 보장하며, 임베디드 장치에서 널리 사용됩니다.
보안
- 업데이트 패키지 무결성과 신뢰성을 보장하기 위해 GPG 서명을 지원합니다.
- 패키지를 설치하기 전에 서명을 검증하여 변조 여부를 확인.
- HTTPS를 통한 암호화된 전송으로 OTA 업데이트를 보호.
- SHA256 등 해시 알고리즘을 통해 데이터 손상 여부 확인.
- Update images from verified source
- Symmetrically Encrypted Update Images
Lua 스크립트
- 업데이트 과정 중 특정 작업을 정의할 수 있도록 Lua 스크립트를 지원합니다.
- 예: 업데이트 전/후의 초기화 작업, 데이터 마이그레이션 등.
- SWUpdate는 Lua 인터프리터를 통합하여 유연한 업데이트 작업을 수행.
SWUpdate 작동 과정
- 업데이트 패키지 준비:
.swu
파일을 생성.- 필요한 이미지와 Lua 스크립트를 패키지에 포함.
- 패키지 전달:
- OTA, USB, 로컬 파일 시스템 등 다양한 방법으로 장치에 전달.
- 패키지 검증:
- GPG 서명과 해시 체크를 통해 무결성 및 인증 확인.
- 업데이트 수행:
- 비활성 파티션 또는 특정 대상에 업데이트.
- Lua 스크립트를 실행하여 추가 작업 수행.
- 부팅 전환:
- 업데이트 완료 후 부트로더(U-Boot 등)를 통해 새 이미지를 부팅.
- 성공적으로 부팅하지 못하면 롤백 수행.
플랫폼별 통합
- Yocto 프로젝트
meta-swupdate
레이어를 통해 SWUpdate를 Yocto 빌드 시스템에 통합.- SWUpdate 설정 파일 및 핸들러를 사용자 정의 가능.
- https://github.com/sbabic/meta-swupdate
- meta-swupdate: building with Yocto
- Buildroot
- Buildroot 설정에서
swupdate
를 활성화하여 빌드. - 컴파일된 바이너리에 포함된 기본 핸들러 사용 가능.
- Buildroot 설정에서
- U-Boot와의 통합
- U-Boot 환경에서 SWUpdate와 함께 업데이트를 관리:
bootcmd
를 통해 A/B 파티셔닝 및 부팅 로직 구현.- Bootloader Interface
- Bootloader Interfaces source
SWUpdate와 A/B 업데이트 간의 상호작용
- U-Boot 환경변수 사용:
- U-Boot는 활성 파티션을 추적하는 환경변수(
boot_partition
,upgrade_available
등)를 관리. - SWUpdate는 업데이트 후 U-Boot 환경변수를 수정하여 새 파티션으로 부팅을 전환.
- U-Boot는 활성 파티션을 추적하는 환경변수(
- 플래그 관리:
- SWUpdate는 부팅이 성공했는지 확인하기 위해 플래그를 설정.
- 새 이미지로 부팅 실패 시, 부트로더는 플래그를 확인하고 롤백을 수행.
Update strategy examples
Single copy - running as standalone image
Combine double-copy with rescue system
Split system update with application update