SW 개발

yocto 환경에서 sdcard 용 이미지 만들기 (dump image)

. . . 2022. 9. 16. 14:04
반응형

-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 명령어를 간략하게 설명하면 .. 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 를 작성하자.

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

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 를 이용해 발행되었습니다.
반응형