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/
https://www.konsulko.com/getting-started-with-rauc-on-raspberry-pi-2/
'임베디드 컴퓨팅 > Raspberry Pi' 카테고리의 다른 글
라즈베리파이4 에 라즈비안 64비트 설치하기 (1) | 2023.12.02 |
---|---|
라즈베리파이 라즈비안 userland 어플리케이션 빌드하기 (0) | 2022.03.13 |
라즈비안 한글깨짐 해결방법 (0) | 2022.03.13 |
라즈베리파이에 USB 시리얼 연결하기 (0) | 2021.10.23 |
라즈베리파이에 최신 라즈비안 OS 설치하기 (0) | 2021.10.02 |