이미지 사이즈 최적화는 임베디드 시스템에서 매우 중요하다. 이미지가 작을수록 부팅 시간은 빨라지고, 저장소와 메모리를 덜 소비하게 된다. 이 섹션에서는 이미지 사이즈를 최적화하기 위한 다양한 기술을 다룬다.

불필요한 패키지 제거

이미지를 생성하면서 꼭 필요한 패키지만 포함하는 것이 중요하다. 불필요한 패키지를 포함하면 이미지 크기가 불필요하게 커진다. 패키지를 제거하는 방법은 다음과 같다:

  1. 패키지 종속성 검사: 패키지를 제거할 때, 해당 패키지가 다른 필수적인 패키지의 종속성이 아닌지 확인해야 한다. 이에 대한 종속성 분석 도구들을 활용할 수 있다.

bitbake-layers 도구: 이 도구는 종속성 트리를 작성하고 특정 패키지의 종속성을 보여준다.

bitbake-layers show-recipes <패키지명>
  1. local.conf 수정: IMAGE_INSTALL 변수에서 불필요한 패키지를 제거한다.
IMAGE_INSTALL:append = " package1 package2"

=> 위 예제에서는 package1package2를 추가로 설치된다.

  1. 패키지 그룹 제거: 패키지 그룹은 종종 여러 개의 개별 패키지를 포함할 수 있다.
IMAGE_FEATURES_remove = "feature_group"

사용하지 않는 기능 비활성화

  1. local.conf 조정: 불필요한 기능을 비활성화하여 이미지 크기를 줄일 수 있다.

sh DISTRO_FEATURES_remove = "x11"

e.g., x11 기능을 제거하여 불필요한 X Window System 관련 패키지를 제외할 수 있다.

  1. busybox 사용: busybox를 사용하여 여러 명령어를 하나의 바이너리로 통합하여 공간 절약이 가능한다.

sh IMAGE_INSTALL_append = " busybox"

최소화 레시피 사용

최대한 작은 이미지를 만들기 위해 최소화 레시피 최소화 모드(minimal mode)를 사용하거나 자체적으로 최소화된 레시피를 구성할 수 있다.

DISTRO ?= "poky-tiny"

Poky-tiny와 같은 경량화 분포판을 활용하여 작은 이미지 생성이 가능한다.

로컬 패키지 관리

패키지 캐시를 최적화하면 이미지 크기를 줄이는 데 도움이 된다. 패키지 관리 캐시 설정을 통해 필요한 패키지만 저장하게 할 수 있다.

  1. opkg 설정 수정: bash INHERIT += "rm_work" => 작업이 완료된 후 임시 작업 디렉토리를 제거한다.

  2. 소스 패키지 캐시 설정: bash BB_NO_NETWORK = "1"

패키지 관리 최적화

필요한 패키지들을 packagegroup을 통해 그룹화하여 관리하고, 한 번의 정의로 쉽게 패키지를 추가/제거할 수 있다.

  1. packagegroup:

bb SUMMARY = "Custom package group" DESCRIPTION = "Custom package group containing essential tools" RDEPENDS_${PN} = "nano wget curl"

packagegroup-mygroup.bb 파일을 예시로 RDEPENDS 변수를 사용하여 종속 패키지를 정의할 수 있다.

  1. 인덱스 재구성: 이미지의 인덱스를 재구성하여 로딩 속도와 크기를 최적화할 수 있다.

sh bitbake package-index

압축 방법 변경

이미지 파일 시스템을 압축하여 저장 공간을 절약할 수 있다. Yocto에서는 다양한 파일 시스템 및 압축 옵션을 지원한다.

IMAGE_FSTYPES = "tar.xz"

=> xz 옵션은 일반적으로 더 높은 압축률을 제공한다.

IMAGE_FSTYPES = "tar.gz"
IMAGE_FSTYPES = "squashfs"
IMAGE_FSTYPES += "btrfs"

루트 파일 시스템의 파일 제거

이미지 내 불필요한 파일을 제거하는 것은 이미지 사이즈 최적화의 핵심이다. 불필요한 문서, 로그 파일, 빌드 아티팩트 등을 제거하라.

  1. 텍스트 파일 제거: bash ROOTFS_POSTPROCESS_COMMAND += "rm -rf ${D}/path/to/unnecessary_files;"

  2. 로그 파일 제거: bash ROOTFS_POSTPROCESS_COMMAND += "rm -rf ${D}/path/to/log_files;"

커널 모듈 최적화

불필요한 커널 모듈을 제거하거나, 커널 설정을 최적화함으로써 이미지를 슬림하게 만들 수 있다.

  1. defconfig 파일 편집하기: bash CONFIG_MODULE_ENABLE = "y" CONFIG_FEATURE_TO_REMOVE = "n"

  2. menuconfig 사용: bash bitbake virtual/kernel -c menuconfig

패키지 압축 최적화

패키지를 생성하는 단계에서 압축을 최적화하여 이미지를 더 작게 만들 수 있다.

  1. 패키지 압축 수준 설정: bash PACKAGE_CLASSES = "package_rpm" RPM_OPT_FLAGS = "-O2 -g"

  2. 스트립핑: bash INHERIT += "rm_work"

다중 아키텍처 지원

경우에 따라 다중 아키텍처를 지원해야 할 수 있다. 이를 설정하면 이미지 크기를 키울 수 있으므로 필요한 아키텍처만 포함하는 것이 좋다.

  1. 다중 아키텍처 설정: bash TARGET_ARCH = "arm"

  2. 추가 아키텍처 제거: bash IMAGE_INSTALL_remove = "package_x86 package_mips"

이미지 유형 변경

특정 유형의 이미지가 다른 유형보다 작을 수 있다. 예를 들어, 최소한의 기본 시스템만 포함하는 경량 이미지 타입을 선택하는 것이 유리할 수 있다.

  1. minimal 이미지 사용: bash DISTRO_FEATURES_remove = "X11 wayland" IMAGE_FSTYPES = "ext4 bcm2835"

  2. full 이미지 사용: bash IMAGE_FSTYPES = "tar.bz2 ext3"

권한 최적화

권한 설정이 적절하지 않으면 불필요하게 큰 이미지가 생성될 수 있다.

  1. 파일 권한 설정: bash chmod 755 /path/to/file

  2. 권한 최적화 스크립트: bash ROOTFS_POSTPROCESS_COMMAND += "path/to/permission_optimization_script;"

개발 도구 및 라이브러리 제거

개발 도구와 라이브러리가 이미지에 포함되지 않도록 하여 크기를 줄일 수 있다.

  1. local.conf 수정: bash TOOLS_PROFILE_remove = "tools-debug" TOOLS_SDK_remove = "tools-sdk"

  2. 라이브러리 제거: bash IMAGE_INSTALL_remove = "libgcc libstdc++"

디버그 정보 제거

디버그 정보를 제거하여 이미지 크기를 줄일 수 있다. 최종 이미지에서는 디버그 심벌을 제거하고 불필요한 파일을 삭제해야 한다.

INHIBIT_PACKAGE_DEBUG_SPLIT = "1"

이 옵션을 사용하면 디버그 정보가 포함된 패키지 형태로 분리되지 않으며, 최종 이미지에서 디버그 정보가 제거 된다.

이미지 빌드 결과 검토

이미지를 빌드한 후, 빌드 결과를 검토하여 추가적인 최적화 가능성을 찾을 수 있다.

  1. 이미지 크기 확인: bash du -sh path/to/image

  2. 패키지 내용 검토: bash bitbake -e image_name | grep ^PACKAGE_INSTALL

이러한 방법들을 통해 Yocto 프로젝트의 이미지 사이즈를 최적화할 수 있다. 각 프로젝트의 요구사항과 목표에 맞게 여러 방법을 조합하여 사용하면 최상의 결과를 얻을 수 있다.

결과 검토

이미지를 생성한 후에는 다음과 같은 방법으로 검토할 수 있다.

  1. 이미지 검사: 생성된 이미지를 실제 하드웨어나 가상 머신에 배포하여 확인한다.

  2. 패키지 목록 확인:

sh oe-pkgdata-util list-pkgs -r <이미지 이름>

패키지 종속성 및 충돌 확인: Yocto의 빌드 로그와 출력 패키지 데이터를 통해 종속성 문제와 충돌 여부를 확인한다.

배포

최종 이미지를 검토한 후에는 각 타겟 디바이스에 배포한다. 일반적으로 다음과 같은 방법을 사용한다:

  1. SD 카드 플래싱: SD 카드나 기타 저장 매체에 이미지를 플래시하여 디바이스에 삽입한다.
  2. 네트워크 배포: TFTP 또는 NFS를 통해 네트워크로 이미지를 디바이스에 배포한다.
  3. OTG USB 플래싱: USB OTG를 활용하여 디바이스에 직접 이미지를 전송한다.