루트 파일 시스템 커스터마이징은 임베디드 시스템 개발에서 매우 중요한 작업 중 하나이다. 이 작업을 통해 특정 애플리케이션이나 하드웨어 요구사항에 맞춰 시스템을 최적화할 수 있다.

1. 루트 파일 시스템 커스터마이징의 필요성

루트 파일 시스템을 커스터마이징하는 이유는 다음과 같다:

2. Yocto 프로젝트를 사용한 커스터마이징

Yocto 프로젝트는 여러 레벨에서 루트 파일 시스템을 커스터마이징할 수 있는 강력한 도구를 제공한다. 주요 커스터마이징 방법에는 IMAGE_INSTALL, IMAGE_FEATURES, 사용자 정의 레시피 등이 있다.

3. IMAGE_INSTALL

IMAGE_INSTALL은 루트 파일 시스템에 패키지를 추가하기 위해 사용된다. local.conf 또는 특정 레시피 파일 내에서 설정할 수 있다.

IMAGE_INSTALL:append = " 패키지명"

예를 들어, vim 패키지를 추가하고 싶다면:

IMAGE_INSTALL:append = " vim"

4. IMAGE_FEATURES

IMAGE_FEATURES는 특정 기능을 파일 시스템 이미지에 포함시키기 위한 설정이다. common-pc, debug-tweaks 같은 기능을 포함시킬 수 있다.

IMAGE_FEATURES += "debug-tweaks"

5. 사용자 정의 레시피

specific.bb 파일을 작성하여 사용자 정의 레시피를 만들 수 있다. 새로운 패키지를 추가하거나 특정 파일을 복사하는 작업을 진행할 수 있다.

예시:

SUMMARY = "Custom application recipe"
LICENSE = "CLOSED"
SRC_URI = "file://myapp"

do_install() {
    install -d ${D}${bindir}
    install -m 0755 myapp ${D}${bindir}
}

FILES_${PN} += "${bindir}/myapp"

6. 패키지 그룹 사용

패키지 그룹은 여러 패키지를 하나의 그룹으로 묶어 관리하기 위한 방법이다. 이것을 통해 특정 기능 세트를 쉽게 포함시킬 수 있다.

예를 들어, multimedia 그룹을 포함시키기 위해:

IMAGE_INSTALL:append = " packagegroup-core-multimedia"

7. 루트 파일 시스템 이미지 타입 정의

Yocto 프로젝트는 여러 타입의 루트 파일 시스템 이미지를 생성할 수 있다. 가장 일반적인 타입으로는 ext3, ext4, tar, cpio 등이 있다. 이를 설정하기 위해서는 local.conf에 다음과 같이 정의할 수 있다.

IMAGE_FSTYPES = "ext4 tar.gz"

계속

8. 사용자의 커스터마이징 룰 추가

사용자는 특정 타스크나 커스터마이징 작업을 추가로 정의할 필요가 있다. Yocto 빌드 프로세스는 다단계로 이루어지므로, 사용자 정의 타스크를 어느 단계에서 수행할지를 명확히 정의해야 한다.

예를 들어, do_rootfs 타스크 전에 사용자 정의 스크립트를 실행하려는 경우:

do_rootfs_prepend () {
    echo "Custom preprocessing for do_rootfs"
    # 사용자 정의 명령어 추가
}

do_rootfs_append () {
    echo "Custom postprocessing for do_rootfs"
    # 사용자 정의 명령어 추가
}

9. 이미지 사이즈 최적화

이미지 사이즈를 최적화하는 방법 중 하나는 bitbake -c size-img image_name을 사용하여 이미지 내의 패키지 크기를 분석하는 것이다. 불필요한 패키지를 제거하거나 더 경량화된 대체 패키지를 사용할 수 있다.

또한 INHERIT += "rm_work"를 설정하여 빌드 과정에서 사용된 중간 파일을 삭제하고 디스크 공간을 절약할 수 있다.

10. 상태 검증 및 디버깅

루트 파일 시스템 이미지를 커스터마이징한 후, 시스템이 올바르게 부팅되고 필요한 모든 기능을 제공하는지 확인해야 한다. 이를 위해 QEMU와 같은 에뮬레이터를 사용하여 이미지를 테스트할 수 있다.

runqemu qemux86-64

또한, devshell 기능을 활용하여 빌드 환경에서 직접 쉘을 열고 문제를 디버깅 할 수 있다:

bitbake -c devshell <패키지명>

11. 사용자의 이미지 배포

루트 파일 시스템 이미지를 생성한 후, 해당 이미지를 실제 하드웨어에 배포하거나 SD 카드, eMMC 등 다양한 저장 매체에 플래시할 수 있다. 일반적으로는 dd 명령어나 bmaptool을 사용하여 이미지 파일을 특정 매체에 복사한다:

dd if=core-image-minimal.ext4 of=/dev/sdX bs=4M status=progress

또는, 더 빠르고 안전한 방법으로 bmaptool을 사용할 수 있다:

bmaptool copy core-image-minimal.bmap /dev/sdX