-tags : #yocto
특정 보드에서 sdcard 용 dump image 를 만드는 레시피가 제공되지 않아서 강제로 sdcard 용 dump image를 만드는 방법을 정리한다.
1 dump image
일종의 dump 용 이미지를 뜻한다.
예를들면, sdcard boot 를 지원하는 임베디드 보드에서 boot 가능한 sd card 를 만들어야하는데... 친절한 칩 제조사라면 BSP내에 해당 sdcard boot 용 이미지를 따로 만드는 레시피를 함께 준다. (풀 빌드과정에서 SD card 용 이미지파일을 만들어준다.) 이렇게 생성된 이미지 파일은 dd
명령어나, balenaEtcher
같은 툴로 해당 이미지를 그냥 한번에 sd card 에 write 하여 사용한다.
하지만.. sdcard boot 이미지를 제공하지 않는 BSP 가 있다.
- 최악의 경우... 물리 sd카드에
dd
,fdisk
,part
명령어들로 파티션레이아웃을 잡고, 직접 mount 해서 rootfs 파일들을 잡아야한다.
매번 sd 카드에 여러가지 명령어를 치면서 부팅용 sd card 를 만드는건 너무 번거롭다. sdcard boot image 를 직접 만들어 사용하는것이 훨씬 간편하다. (결국은 yocto 레시피에 직접 sdcard boot image 를 만드는 레시피를 만들어야하지만... 정식 레시피 만들기전에 검증하기위한 해당 방법이 유용하다. )
해당 방법을 쓸경우 gang 장비용 dump 이미지로도 활용 할수있다. 하나의 파일에 파티션테이블, 파일시스템생성, offset 된 raw data 들이 모두 묶여 들어있기 때문
2 yocto 의 wic 명령어
yocto 에서는 하나의 이미지를 만드는 wic 라는 커맨드쉘 명령어를 제공해준다.
- wic 공식 매뉴얼 : https://docs.yoctoproject.org/2.4.2/dev-manual/dev-manual.html#creating-partitioned-images-using-wic
wic 명령어를 간략하게 설명하면 .. sdcard 와 같은 물리 장치에 write 할수있는 dump 파일을 생성해주는 툴이다.
하나의 파일안에 파티션테이블, 파일시스템등을 모두포함하고있다. 특히 block offset 으로 write 가 가능하여 부팅용이미지로도 활용가능.
2.1 wic 명령어 사용환경
yocto 빌드르 위해서 기본적인 환경설정 source ./setup-env -m XXX
와 같이 대부분 할것이다.
환경설정을 한후에는 bitbake 명령어를 사용할수있는데, 이때 wic 명령어도 사용할 수있다. (wic 파일은 /sources/poky/scripts/wic
경로에있다.)
yocto 환경설정이 끝난후에 wic --help
를 치면 다음과 같이 옵션등을 확인할 수 있다.
$ wic --help
Creates a customized OpenEmbedded image.
Usage: wic [--version]
wic help [COMMAND or TOPIC]
wic COMMAND [ARGS]
usage 1: Returns the current version of Wic
usage 2: Returns detailed help for a COMMAND or TOPIC
usage 3: Executes COMMAND
COMMAND:
list - List available canned images and source plugins
ls - List contents of partitioned image or partition
rm - Remove files or directories from the vfat or ext* partitions
help - Show help for a wic COMMAND or TOPIC
write - Write an image to a device
cp - Copy files and directories to the vfat or ext* partitions
create - Create a new OpenEmbedded image
TOPIC:
overview - Presents an overall overview of Wic
plugins - Presents an overview and API for Wic plugins
kickstart - Presents a Wic kicstart file reference
2.2 wic 를 이용한 이미지 파일만들기
wic 로 이미지를 만들기위해서는 먼저 wks 파일을 명세해야한다.
- wks 파일은 어떠한 내용으로 이미지를 만들지 설정파일 같은 역할을 한다.
- wks 공식 매뉴얼 : https://docs.yoctoproject.org/ref-manual/kickstart.html
- wks 에 대한 대략적인 활용은 mender 코드를 참고한다 : https://github.com/mendersoftware/meta-mender/blob/66530eb7290eaad8d837666cde650c2e6b14501b/meta-mender-core/classes/mender-part-images.bbclass
해당 플랫폼에 맞게 wks 를 작성하자.
2.2.1 wks 의 예제
boot data - raw data write
특정 block 에 파티션없이 raw 데이터를 쓰려면 다음의 예제를 참고한다.
# bl2 boot setctor = 0x8
# -> 0x8 * 512 / 1024 = 4kb
part --source rawcopy --sourceparams="file=atf/bl2_sd.pbl" --align 4 --no-table
# bl2 boot setctor = 0x800
# -> 0x800 * 512 / 1024 = 1024kb
part --source rawcopy --sourceparams="file=atf/fip_uboot.bin" --align 1024 --no-table
# kernel fit image = 0x8000
# -> 0x8000 * 512 / 1024 = 16384kb
part --source rawcopy --sourceparams="file=fitImage" --align 16384 --no-table
- 코드설명
- 0x8 번째 블럭에
atf/bl2_sd.pbl
를 write -> 해당 데이터는 파티션으로 안잡고, raw data 로 write - 0x800 번째 블럭에
atf/fip_uboot.bin
를 write -> 해당 데이터는 파티션으로 안잡고, raw data 로 write - 0x8000 번째 블럭에
fitImage
를 write -> 해당 데이터는 파티션으로 안잡고, raw data 로 write
- 0x8 번째 블럭에
rootfs - filesystem write
특정 block 에 파티션을 만들면서, 데이터 채우기
# empty filesystem start 0x20000
# -> 0x20000 * 512 / 1024 = 65536kb
part --fstype=ext4 --align 65536 --fixed-size 32M
# filesystem start = 0x20000 (+ 32M = 32768)
# -> 0x20000 * 512 / 1024 = 65536kb + 32768 = 98304
part --source rootfs --fstype ext4 --align 98304 --fixed-size 3G
# part --source rootfs --sourceparams="file=fsl-image-networking-ls1028ardb.ext4" --fstype ext4 --align 98304 --fixed-size 3G
- 코드설명
- 0x20000 번째 블럭에 32M ext4 파티션 만들기
- 0x20000 + 32M 위치에
rootfs
파티션을 3G 사이즈로만들기
2.3 wic 실행
wks 를 적당하게 만들었다면 다음의 명령어로 이미지를 든다.
wic create [wks_file_path] -o [output_dir] -e [image_name]
- wks_file_path : wks 파일의 경로를 작성한다.
- output_dir : 이미지 파일이 만들어질 경로
- image_name : image recipes
bitbake image-name
에서 image-name 부분을 작성해준다.
wic create 명령어는
BOOTIMG_DIR
,KERNEL_DIR
,NATIVE_SYSROOT
에 대한 정보를 함께넘겨야 한다. 하지만-e [image_name]
옵션을 주면 이미 yocto 에 설정 되어있는 환경을 그대로 갖다쓰기때문에 따로 각 경로들을 신경쓰지 않아도 된다.
...
지금 개발하고있는 nxp landscape 에서는 다음과 같이 명령을 입력하였다.
wic create wks/sd-img.wks -o img.bin -e fsl-image-networking
정상적으로 이미지 파일이 만들어지면 원하는경로에 다음과 같은 파일이 생성된다.
- xxx.p0 ~ xxx.pX : 각 파티션에 대한 이미지파일들
- xxx.direct : 하나로 합쳐진 이미지
xxx.direct 을 balenaEtcher 툴을 이용하여 sd card 에 구우면 넣으면 된다.
이렇게 wic 를 이용하여 이미지 생성이 성공, 부팅검증이 되면.. 해당 wks 파일을 참고하여
do_image_sdcard
와 같은 이미지 생성용 레시피를 생성하여 자동으로 이미지를 만들도록한다.
...
- 본 포스팅은 obsidian 으로 작성하였으며, tistory-posting-cli 를 이용해 발행되었습니다.