본문 바로가기
임베디드 컴퓨팅/Raspberry Pi

RAUC 를 이용한 RaspberryPi 업데이트

by makepluscode 2021. 10. 23.
반응형

RAUC 를 이용한 RaspberryPi 업데이트

RAUC 를 이용한 RaspberryPi 업데이트

리눅스 업데이트 프레임워크, RAUC

RAUC 란 무엇인가?

RAUC (Robust Auto-Update Controller) 는 Embedded 디바이스의 Linux firmare (image) 업데이트를 위한 경량 프레임워크이다. RAUC 프레임워크에는 클라이언트를 위한 업데이트 프로그램, 업데이트 아티팩트 생성, 검사, 관리, 수정할 수 있는 도구를 포함한다. Yocto Project/OpenEmbedded, Buildroot 및 PTXdist 등과 호환되며, Embedded 디바이스의 USB update, OTA (Over-the-air programming) 등에 적용될 수 있다.

RaspberryPi RAUC Test

RAUC 테스트환경

  • Raspberry Pi4 (4GB) with yocto linux (Dunfell 3.1)
  • Ubuntu 20.04 Host Machine 

Yocto 테스트 이미지 빌드하기

Yocto 를 이용하여 OpenEmbedded, RAUC 가 포함된 RaspberryPi 용 최소 이미지를 빌드한다.

git clone -b dunfell git://git.yoctoproject.org/poky poky-rpi-rauc 
cd poky-rpi-rauc
git clone -b dunfell git://git.openembedded.org/meta-openembedded
git clone -b dunfell git://git.yoctoproject.org/meta-raspberrypi
git clone -b dunfell https://github.com/rauc/meta-rauc.git
git clone -b dunfell https://github.com/leon-anavi/meta-rauc-community.git

각 저장소에서 git 를 복제하고 빌드를 위해 환경설정을 위한 스크립트를 실행한다.

source oe-init-build-env

환경설정을 위한 스크립트를 실행하면 build 디렉토리가 생성되고, build 하위 conf 디렉토리에 bblayers.conf 와 local.conf 파일이 생성 된다.

bblayers.conf 에 다음 layer 들을 추가한다.

bitbake-layers add-layer ../meta-openembedded/meta-oe/
bitbake-layers add-layer ../meta-openembedded/meta-python/
bitbake-layers add-layer ../meta-openembedded/meta-networking/
bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
bitbake-layers add-layer ../meta-raspberrypi/
bitbake-layers add-layer ../meta-rauc
bitbake-layers add-layer ../meta-rauc-community/meta-rauc-raspberrypi/

local.conf 파일에 다음 내용을 추가한다.

MACHINE = "raspberrypi4"

DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

IMAGE_INSTALL_append = " rauc"

IMAGE_FSTYPES="tar.bz2 ext4 wic.bz2 wic.bmap"
SDIMG_ROOTFS_TYPE="ext4"
ENABLE_UART = "1"
RPI_USE_U_BOOT = "1"
PREFERRED_PROVIDER_virtual/bootloader = "u-boot"

WKS_FILE = "sdimage-dual-raspberrypi.wks.in"

EXTRA_IMAGE_FEATURES = "debug-tweaks ssh-server-openssh"

Yocto 빌드를 위한 설정파일들을 모두 작성했고, 아래 명령어로 빌드를 수행한다.

bitbake core-image-minimal
Yocto build task 는 약 6000 여개 정도 되고, Dell XPS15 (i9 + 32G RAM) 에서 약 5시간 정도 걸림.

Yocto 테스트 이미지 플래싱하기

빌드가 완료되면 아래 명령어로 Micro SD 카드에 이미지를 update 한다.

sudo umount /dev/sdX* (optional)
bzcat tmp/deploy/images/raspberrypi4/core-image-minimal-raspberrypi4.wic.bz2 | sudo dd of=/dev/sdX
sync

Micro SD 카드를 라즈베리파이에 넣고 부팅이 되는지 확인한다. (login id : root)

RAUC Bundle 이미지 생성하기

bitbake 명령어를 사용하여 bundle image 를 생성한다.

bitbake update-bundle

RAUC 테스트 하기

빌드 PC 에서 RAUC 테스트를 위해 http server 를 실행한다.

python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.31.228 - - [23/Oct/2021 09:05:38] "GET /update-bundle-raspberrypi4.raucb HTTP/1.1" 200 -

라즈베리파이에서 http server 를 통해 bundle image 을 받고 업데이트를 시작한다.

root@raspberrypi4:~# wget http://192.168.31.150:8000/update-bundle-raspberrypi4.raucb -P /tmp
Connecting to 192.168.31.150:8000 (192.168.31.150:8000)
saving to '/tmp/update-bundle-raspberrypi4.raucb'
update-bundle-raspbe 100% |*****************************************************************************************| 19.9M  0:00:00 ETA
'/tmp/update-bundle-raspberrypi4.raucb' saved

root@raspberrypi4:~# rauc install /tmp/update-bundle-raspberrypi4.raucb 
installing
  0% Installing
  0% Determining slot states
 20% Determining slot states done.
 20% Checking bundle
 20% Verifying signature
 40% Verifying signature done.
 40% Checking bundle done.
 40% Checking manifest contents
 60% Checking manifest contents done.
 60% Determining target install group
 80% Determining target install group done.
 80% Updating slots
 80% Checking slot rootfs.1
 90% Checking slot rootfs.1 done.
 90% Copying image to rootfs.1
100% Copying image to rootfs.1 done.
100% Updating slots done.
100% Installing done.
Installing `/tmp/update-bundle-raspberrypi4.raucb` succeeded

bundle image 업데이트가 완료되면 reboot 명령으로 라즈베리파이를 재시작한다.

RAUC 확인하기

rauc status 명령어를 이용하여 업데이트가 정상적으로 수행되었는지 확인할 수 있다.

root@raspberrypi4:~# rauc status
=== System Info ===
Compatible:  RaspberryPi4
Variant:     
Booted from: rootfs.1 (B)

=== Bootloader ===
Activated: rootfs.1 (B)

=== Slot States ===
x [rootfs.1] (/dev/mmcblk0p3, ext4, booted)
	bootname: B
	mounted: /
	boot status: good

o [rootfs.0] (/dev/mmcblk0p2, ext4, inactive)
	bootname: A
	boot status: good

참고자료

https://rauc.readthedocs.io/en/latest/

 

Welcome to the RAUC documentation! — RAUC 1.5.1.131-1564 documentation

© Copyright 2016-2020, Jan Luebbe, Enrico Joerns, Juergen Borleis Revision 1564c3a0.

rauc.readthedocs.io

https://www.konsulko.com/getting-started-with-rauc-on-raspberry-pi-2/

 

Getting Started with RAUC on Raspberry Pi

RAUC is secure, robust, flexible open source software for A/B updates of Embedded Linux devices, compatible with Yocto Project/OpenEmbedded, Buildroot, PTXdist.

www.konsulko.com

반응형