패키징 형식

패키징은 Yocto 프로젝트의 핵심 작업 중 하나로, 완성된 빌드 산출물들을 효율적으로 배포 및 설치할 수 있도록 한다. Yocto 프로젝트에서는 기본적으로 RPM, DEB, IPK 형식의 패키지를 지원한다. 패키지 형식은 conf/local.conf 파일의 PACKAGE_CLASSES 변수에서 설정할 수 있다.

PACKAGE_CLASSES ?= "package_rpm package_deb package_ipk"

위 설정은 RPM, DEB, IPK 형식의 패키지를 모두 생성하도록 Yocto 빌드 시스템에 지시한다. 특정 형식의 패키지만 필요하다면, 해당 형식만 지정하면 된다:

PACKAGE_CLASSES ?= "package_rpm"

레시피 패키지 설치

각 레시피는 특정한 디렉토리 구조를 가지고 있으며, 보통 files, patches, recipes 디렉토리를 포함한다. 레시피 파일(.bb 파일)은 패키지를 빌드하고 설치하는 과정에서 어떤 작업을 수행할지 명시하고 있다.

주요 디렉토리 및 파일

레시피 파일은 특정 디렉토리 구조를 가지며, 일반적으로 다음과 같은 구조로 구성된다:

helloworld/
  └── helloworld_1.0.bb

예제: helloworld 레시피

helloworld 라는 예제 레시피가 있다고 가정해보겠다. 이 레시피는 간단한 'Hello, World!' 프로그램을 빌드하고 패키징하는 방법을 설명한다.

DESCRIPTION = "Simple helloworld application"
SECTION = "examples"
LICENSE = "MIT"

SRC_URI = "file://helloworld.c"

S = "${WORKDIR}"

do_compile() {
  ${CC} helloworld.c -o helloworld
}

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

FILES_${PN} = "${bindir}/helloworld"

레시피 구성 설명

RDEPENDS 및 DEPENDS

패키지가 다른 패키지에 의존하는 경우, 이를 명시해야 한다. 두 가지 주요 의존성 변수는 DEPENDSRDEPENDS이다:

예제: 의존성 설정

DEPENDS = "zlib"
RDEPENDS_${PN} = "bash"

위 예제에서는 zlib 패키지가 빌드 시 필요하고, bash 패키지가 실행 시 필요하다는 것을 의미한다.

필수 의존 패키지

의존 패키지를 지정할 때, 기본적으로 사용할 수 있는 다양한 패키지들이 기본 이미지에 포함될 수 있다. 예를 들어, busybox와 같은 패키지는 많은 임베디드 환경에서 기본적인 유틸리티들을 제공하기 때문에 종종 필요하다.

예제: 기본 환경과 busybox 포함

IMAGE_INSTALL = "busybox"

위 설정은 core-image-minimal 과 같은 기본 이미지에 busybox 패키지를 포함한다. 추가적으로 다른 패키지가 필요하다면 IMAGE_INSTALL 변수에 해당 패키지들을 포함시키면 된다.

IMAGE_INSTALL = "busybox dropbear"

위 설정은 SSH 서버 패키지인 dropbear를 기본 이미지에 포함시킨다.

패키지 그룹

여러 패키지를 그룹화하여 사용하는 것도 가능한다. 이는 설치 및 유지 관리를 단순화하는 데 유용하다. 패키지 그룹은 meta/meta-Yocto 디렉토리의 layer.conf에서 정의된다.

예제: 패키지 그룹 정의

PACKAGES = "${PN}-base${PN}-extras"

FILES_${PN}-base = "${bindir}/helloworld"
FILES_${PN}-extras = "${bindir}/extra-binary"

위 설정에서 패키지 helloworld의 기본 바이너리는 -${PN}-base 그룹에 포함되고, 추가 바이너리는 -${PN}-extras 그룹에 포함된다.

패키지 배포 및 설치

Yocto 프로젝트에서는 여러 가지 방법으로 패키지를 배포 및 설치할 수 있다.

RPM 기반 배포

RPM 기반 패키지 시스템은 패키지를 쉽게 관리할 수 있도록 해준다. rpm 명령어를 사용하여 패키지를 설치, 제거 및 업데이트 할 수 있다.

rpm -ivh helloworld-1.0-r0.armv7a.rpm

위 명령어는 컴파일된 helloworld 패키지를 설치한다.

DEB 기반 배포

DEB 기반 패키지 시스템은 주로 Debian 및 Ubuntu 같은 배포판에서 사용된다. dpkg 명령어를 사용하여 DEB 패키지를 설치 할 수 있다.

dpkg -i helloworld_1.0-r0_armv7a.deb

IPK 기반 배포

IPK 패키지 시스템은 오픈소스 임베디드 장치에서 많이 사용된다. opkg 명령어를 사용하여 IPK 패키지를 설치할 수 있다.

opkg install helloworld_1.0-r0_armv7a.ipk

패키지 피드 구성

패키지 피드(Package Feed)를 설정하여, 네트워크를 통해 패키지를 다운로드하고 설치할 수 있게 할 수 있다. 이를 위해서는 패키지 서버를 구성하고, local.conf 파일에서 패키지 피드 URL을 설정해야 한다.

예제: 패키지 피드 설정

FEED_URIS = "http://myserver.com/packages/"

위 설정으로, Yocto 빌드 시스템은 myserver.com에 있는 패키지 피드를 참조하여 패키지를 다운로드한다.


지금까지 Yocto 프로젝트를 사용하여 패키지를 빌드, 구성 및 설치하는 방법에 대해 다루었다. 패키지 형식, 레시피 작성, 의존성 정의, 배포 및 설치 방법 등을 설명하였다. 이 과정은 대부분의 임베디드 시스템 빌드와 배포에서 중요한 역할을 한다.

이 외에도 Yocto 프로젝트는 다양한 커스터마이징 옵션과 확장성을 제공한다. 각각의 프로젝트 요구사항에 맞는 적절한 설정과 구성 방법을 탐색하고 적용하는 것이 중요하다.