Qt 5.7 for Device Creation 을 통해 우리는 전체 소프트웨어 스택에서  OTA 소프트웨어 업데이트를 위한 OSTree 기반의 새로운 기술을 선보였습니다. Boot to Qt 소프트웨어 스택의 새로운 구성 요소에 대한 자세한 내용은 블로그 게시물 시리즈의 Boot to Qt 시리즈를 참고하세요. 이 블로그 글은 Boot to Qt 장치에서 OTA 업데이트 기능을 추가하는 방법에 대한 단계별 가이드가 포함되어 있으며 Qt OTA API에 대해 설명하고 마지막으로 전송 된 장치에 대한 OTA 업데이트를 생성하는 방법을 보여줍니다.

 

장치의 선택.

이 튜토리얼에서는 Qt 5.7 for Device Creation 의 새로운 레퍼런스 보드인 Intel NUC 보드를 사용할 것입니다. Intel NUC는 OTA 업데이트 기능이 특히 필요한 Internet of Things를 비롯하여 다양한 분야에서 저렴한 비용으로 제공되는 파인트 크기의 강력한 솔루션입니다. 이 보드는 U-Boot 부트 로더를 사용하는 기존 ARM 기반 임베디드 Linux 보드가 아니기 때문에 이 보드를 선택했습니다. 대신 Intel NUC는 GRUB 2 부트 로더가 있는 x86-64 대상입니다. Technology Preview의 OTA 솔루션은 U-Boot 및 GRUB 2 부트 로더를 지원하며 추가 부트 로더에 대한 지원을 추가하는 것은 부트 로더를 외부 구성 파일에서 읽을 수 있는 한 간단한 작업입니다.

 

장치 통합 단계.

이전의 블로그에서 OTA 에 대해서 다뤘으므로 각 단계에서 자세하게 설명하지 않겠습니다. 이 튜토리얼의 목적은 장치에 OTA 기능을 추가하고 이러한 기능을 추가하는 데 수개월이 걸리지 않는다는 것을 입증하는 데 필요한 과정을 보여주는 것입니다. 오히려 장치 생성을위한 Qt의 OTA 솔루션을 사용하는 데는 단 몇 시간 만 걸립니다.

 

1. OSTree 부팅 호환 initramfs 이미지를 생성하십시오.

이 단계에서는 sysroot가 릴리스 된 상태에서 장치를 부팅해야 도구가 릴리스의 커널 버전과 일치하는 initramfs를 생성 할 수 있습니다. 이 장치는 generate-initramfs 도구를 실행할 시스템에 연결해야합니다.

 

 

2. 부트 로더 통합.

이 단계는 수동 작업이 필요한 유일한 단계입니다. OSTree 의 관리 구성을 사용하려면 장치에서 사용하는 부팅 스크립트를 변경해야 합니다. 이렇게 하여 OTA 업데이트 또는 롤백 후에 올바른 커널 버전 (및 해당 부팅 파일)이 부팅시 선택됩니다. U-Boot 시스템에서는 uEnv.txt를 소싱 한 다음 반입 된 환경을 부트 스크립트와 통합해야 합니다. GRUB 2 시스템에서는 부트 로더 구성 파일을 업데이트해야 할 때마다 OSTree가 ostree-grub-generator 쉘 스크립트를 실행하여 부트 로더가 독립적인 configuration 파일을 원시 grub.cfg 형식으로 변환합니다. 기본 ostree-grub-generator 스크립트는 다음 경로에서 찾을 수 있습니다. 

 

이 스크립트는 대부분의 유스 케이스에 대해 충분하면서도 자유롭게 수정할 수 있어야 합니다. ostree-grub-generator 파일에는 추가 세부 사항이 들어 있습니다. 스크립트 자체는 약 40 줄입니다.

 

3. sysroot를 OTA가 활성화 된 sysroot로 변환합니다.

변환은 qt-ostree 도구를 사용하여 수행됩니다.

 

이 스크립트는 sysroot를 OTA가 활성화 된 sysroot로 변환하는 데 필요한 모든 작업을 수행합니다. $ {OTA_METADATA}는 시스템 메타 데이터가 포함 된 JSON 파일입니다. 다음의 최상위 필드에는 Qt/QML OTA API의 편리한 메소드가 있습니다 : version 및 description. API는 파일을 수동으로 가져 와서 파싱하는 수단을 제공하므로 결과적으로 sysroot를 설명하는 임의의 메타 데이터가 포함될 수 있습니다.

 

 4. 생성 된 OTA 이미지를 SD 카드에 배포합니다.

 

 

5. 모든 것이 계획대로 되었는지 테스트 하십시오.

SD 카드에서 부팅하고 장치에서 다음 명령을 실행하십시오.

 


출력은 다음과 유사해야합니다:

 

 

축하합니다! 이제 장치가 무선 네트워크를 통해 전체 시스템 업데이트를 수행 할 수 있게 되었습니다. 업데이트 및 롤백은 Atomic 하고 업데이트 프로세스는 시스템을 일관성 없는 상태로 두지 않고도 안전하게 중단 될 수 있습니다. 예를 들어 정전으로 인해 업데이트가 완전히 완료되지 않은 경우 장치는 수정되지 않은 시스템으로 정상적으로 부팅됩니다. OTA 문서에서 업데이트 시스템의 다른 기능에 대해 읽어보십시오.

 

사용자 공간의 통합.

OTA가 가능한 장치로, 우리는 장치의 장점을 활용 할 수 있습니다. 우리는 OTA 업데이트 기능을 Qt 기반 응용 프로그램과 쉽게 통합 할 수 있도록 C ++ / QML API 를 제공합니다. 오프라인 작업에는 부팅 및 롤백 시스템 버전 정보를 쿼리하고 Atomic 하게 롤백을 수행하는 작업이 포함됩니다. 온라인 작업에는 원격 서버에서 새 시스템 버전을 가져 와서 Atomic 하게 시스템 업데이트를 수행하는 작업이 포함됩니다. API를 보여주는 기본 예제는 다음과 같습니다.

위의 샘플은 부팅 및 롤백 시스템에 대한 버전 정보와 원격 서버에서 사용할 수 있는 시스템 버전을 나타냅니다. 샘플 프로그램에는 OTA 작업을 시작하는 버튼도 포함되어 있습니다.
아래 코드는 OTA 이벤트 로깅에 사용됩니다. API는 아직 Technology Preview 단계이므로 최종 버전에서는 약간의 변경이 있을 수 있습니다.

 

이 API는 버전 정보를 서버에 전달하는 데몬을 작성하는 데 쉽게 사용할 수 있으며 데몬은 업데이트가 가능 해지면 사용자에게 알림을 보낼 수 있습니다. 서버는 일괄 적으로 업데이트를 전송할 수 있습니다. 먼저 필드 테스트를 위해 장치의 작은 하위 집합을 업데이트하고 데몬에서 업데이트 상태를 가져오고 문제가 없는 경우 나머지 장치를 업데이트 할 수 있습니다. 이러한 유형의 작업을 위한 일부 도구는 Boot to Qt 스택을위한 OTA 솔루션의 로드맵에 있습니다.  

 

우리가 조심해야 할 치명적인 버그

우리가 OTA 기능을 갖춘 임베디드 장치를 구축하고 업데이트를 처리하기 위한 Qt 응용 프로그램을 만들 때 우선 조심해야 할 문제를 해결하기 위해서 몇가지 간단한 단계가 있습니다.  

1. 버그를 수정하십시오.

항상 다음 단계에서 업데이트 된 sysroot를 사용합니다.  

 

2. 업데이트를 생성하십시오. 이것은 qt-ostree 도구를 사용하여 수행됩니다. OTA 업데이트 생성은 완전히 자동화 된 작업입니다. 

위 명령은 WORKDIR / ostree-repo /에있는 OSTree 저장소에 새로운 커밋을 만들거나 존재하지 않는 경우 새로운 저장소를 만듭니다. 이 저장소는 OTA 업데이트이며 언제든지 프로덕션 서버로 내보낼 수 있습니다. 정적 인 HTTP 서버를 통해 OSTree 리포지토리를 제공 할 수 있습니다 (자세한 내용은 다음 블로그 포스트에서 확인하십시오).

 

3. Qt OTA API를 사용하여 장치를 업데이트하십시오.

업데이트 전략을 선택하는 것은 시스템 빌더에게 달려 있습니다.

 

유효성

Boot to Qt 프로젝트는 Yocto Project를 활용하여 meta-boot2qt 라는 자체 배포 계층을 구축했습니다. Boot to Qt 배포판은 공급 업체별 BSP 계층과 meta-qt5를 하나의 패키지로 결합합니다. 이 배포는 OTA 툴링과의 통합을 가능한 간단하게 하기 위해 최적화 되었습니다. 모든 소스 코드는 상용 및 GPL 라이센스로 제공됩니다.

 

결론

Qt 장치로 부팅 할 때 OTA 업데이트 기능을 사용하는 것은 빠르고 쉽습니다. OTA 지원 장치를 사용하면 제품을 조기에 출시하고 나중에 더 많은 기능을 제공 할 수 있습니다. 다음 블로그 포스트에서는 OSTree (OTA 업데이트) 저장소 처리, 원격 구성 및 보안에 대해 작성합니다.

 

 

본 문서는 qt.io 의 “Over-the-Air Updates, Part 2: Device Integration, API and Creating Updates” 을 번역한 블로그로 의역 및 오역 이 있을 수 있습니다.