Yocto를 이용해 나만의 rasberrypi image를 만들어보기 (1)

Sun, Jan 24, 2021 2-minute read

이전 포스트에서

나만의 rasberrypi image를 만들어보기 - 환경

Docker 이미지를 이용해 보겠다. Docker 이미지를 사용하면 호스트 시스템에 Yocto Project의 의존성을 설치하지 않고도 Yocto 빌드 환경을 쉽게 설정할 수 있다. Raspberrypi 재단에서 관리하는 https://github.com/agherzan/meta-raspberrypi에는 해당 저장소를 관리하기 위한 github action 설정이 존재하는데, 이들 github action들은 Docker환경에서 수행된다. 그리고 이 Docker환경을 구성하고 관리하기 위한 Dockerfile이 존재한다. 아쉽게도 One-step은 아니지만 해당 항목을 분석하면 좀 더 용이하게 rasberrypi image를 만들기 위한 Yocto 빌드 환경을 만들 수 있을 것이다.

yocto-dockerfiles 저장소를 클론하고

$ git clone https://github.com/agherzan/meta-raspberrypi.git
$ cd meta-raspberrypi/.github/workflows/docker-images

.github/workflows/docker-images/yocto-builder/Dockerfile를 살펴보면 ubuntu:20.04에 Yocto에 필요한 패키지를 다운받는 걸 확인할 수 있다. 하지만 이 스크립트에서 Poky 저장소를 가져오진 않는다. 좀 더 살펴볼 필요가 있다.

FROM ubuntu:20.04
...
RUN eatmydata apt-get install -qq -y \
    gawk wget git diffstat unzip texinfo gcc build-essential chrpath \
    socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \
    iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
    pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool

이 Dockerfile마지막에 .github/workflows/docker-images/yocto-builder/entrypoint-build.sh을 복사해두는데, 여기에서 poky를 가져온다. entrypoint-build.sh를 잘 살펴보며 스크립트 전반에 많은 매개변수를 필요로 하는데

REPOS=" \
    git://git.yoctoproject.org/poky.git \
"
for repo in $REPOS; do
    log "Cloning $repo on branch $BASE_REF..."
    git clone --depth 1 --branch "$BASE_REF" "$repo"
done

# shellcheck disable=SC1091,SC2240
. ./poky/oe-init-build-env build

.github/workflows/yocto-builds.yml에 볼 수 있듯이 workflow를 수행할 때 매개변수와 함께 entrypoint-build.sh를 수행해 주는 것을 볼 수 있다.

          docker run --rm \
            -v "$GITHUB_WORKSPACE:/work:ro" \
            -v "$DL_DIR:$DL_DIR:rw" \
            -v "$SSTATE_DIR:$SSTATE_DIR:rw" \
            --env "BASE_REF=$GITHUB_BASE_REF" \
            --env "MACHINE=${{ matrix.machine }}" \
            --env "DISTRO=${{ matrix.distro }}" \
            --env "IMAGE=${{ matrix.image }}" \
            --env "DL_DIR=$DL_DIR" \
            --env "SSTATE_DIR=$SSTATE_DIR" \
            "yocto-builder-${{ github.event.number }}" \
            /entrypoint-build.sh

다시 한 번 entrypoint-build.sh을 보니까 meta layer추가와 bitbake까지 모두 수행해준다.

# Add the BSP layer
bitbake-layers add-layer "$META_RASPBERRYPI_PATH"
...
# Fire!
MACHINE="$MACHINE" bitbake "$IMAGE"

그럼 나는 clone해두었던 meta-raspberrypi 저장소에서 entrypoint-build.sh의 마지막 두 줄만 삭제해 entrypoint-build.sh에서 bitbake build가 시작되는 걸 막고, 이 상태에서 docker image를 빌드한 후에 matrix.machine, matrix.distro, matrix.image을 적당하게 채워주고 docker run entrypoint-build.sh을 수행한 후에 다시 bash 쉘로 접근해 보려고 한다.