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