# Yocto에서 패키지 관리 기본 개념

Yocto 프로젝트는 임베디드 장치용 맞춤형 리눅스 배포판을 빌드하기 위해 사용되는 강력한 도구이다. 이 프로젝트는 패키지 관리 시스템을 통해 소프트웨어 패키지의 빌드, 배포, 유지 관리를 제어한다.

#### BitBake와 레시피

BitBake는 Yocto 프로젝트의 핵심 빌드 도구로, "레시피"라는 스크립트를 사용하여 개별 패키지를 빌드한다. 레시피 파일은 .bb 확장자를 가지며, 패키지를 빌드하기 위한 메타데이터와 지침을 포함한다.

```plaintext
hello-world.bb
```

레시피 예제:

```bash
SUMMARY = "An example application"
LICENSE = "MIT"
SRC_URI = "http://example.com/hello-world-1.0.tar.gz"

do_compile() {
    echo "Compiling..."
}

do_install() {
    echo "Installing..."
}
```

위 레시피는 패키지의 소스 파일을 어디서 가져올지(SRC\_URI), 패키지를 빌드하고 설치하는 방법(do\_compile, do\_install) 등을 정의한다.

#### Tasks와 Events

각 레시피는 여러 세부 작업으로 나뉜다. 예를 들어:

* do\_fetch: 소스 파일을 다운로드한다.
* do\_unpack: 다운로드한 소스 파일을 압축 해제한다.
* do\_patch: 소스 파일에 패치를 적용한다.
* do\_configure: 빌드 구성을 설정한다.
* do\_compile: 소스를 컴파일한다.
* do\_install: 빌드된 파일을 설치한다.
* do\_package: 패키지를 만든다.

BitBake는 이러한 작업을 순서대로 실행하여 패키지를 빌드한다.

#### 패키지 형식

Yocto 프로젝트는 여러 패키지 형식을 지원한다. 가장 일반적인 패키지 형식은 다음과 같다:

* IPK: Opkg 패키지 매니저와 함께 사용되는 작은 패키지 형식.
* DEB: Debian 기반 시스템에서 사용되는 패키지 형식.
* RPM: Red Hat 기반 시스템에서 사용되는 패키지 형식.

```bash
PACKAGE_CLASSES ?= "package_ipk"
```

위와 같이, local.conf 파일에서 사용할 패키지 형식을 설정할 수 있다.

#### 패키지 피드

패키지 피드는 빌드된 패키지를 저장하고 배포하는 위치를 의미한다. 패키지 피드는 단말기에서 패키지를 설치하거나 업데이트할 때 사용된다.

```bash
SRC_URI = "http://your-feed-server.com/feeds/package_name"
```

#### 디스트로 설정과 이미지

패키지를 관리하는 최종 목표는 특정 요구를 충족하는 전체 이미지를 만드는 것이다. 이 이미지는 시스템의 모든 구성 요소를 포함하는 최종 산출물이다. 디스트로 설정은 이미지의 전체 설정을 정의하며, 이는 패키지 선택, 커널 옵션, 기본 파일 시스템 등 다양한 설정을 포함할 수 있다.

#### 패키지 그룹과 이미지 레시피

이미지 레시피는 최종 이미지에 포함될 패키지를 나타내는 핵심 파일이다. 이는 종종 비슷한 기능을 갖는 패키지를 그룹화하여 혼합하고 최종 이미지를 생성하는 데 사용된다.

```bash
IMAGE_INSTALL += "packagegroup-core-boot"
```

위와 같은 방식으로 이미지 레시피에서 설치할 패키지를 정의할 수 있다.

***

패키지 관리 시스템은 Yocto 프로젝트의 핵심 기능 중 하나로, 다양한 패키지 형식을 지원하고, 패키지의 빌드 및 배포 프로세스를 자동화한다. BitBake와 레시피 파일을 사용하여 패키지를 정의하고, 여러 작업을 통해 패키지를 빌드, 설치, 배포할 수 있다.

### Layer와 Metadata

Yocto 프로젝트의 또 다른 중요한 개념은 레이어(layer)와 메타데이터(metadata)이다. 레이어는 특정 기능이나 패키지를 독립적으로 관리하고, 프로젝트의 유연성과 재사용성을 높이는 기본 단위이다.

#### 레이어 구조

레이어는 일반적으로 아래와 같은 디렉토리 구조를 갖는다:

```plaintext
meta-example/
├── conf/
│   ├── layer.conf
├── recipes-example/
│   ├── example/
│   │   ├── example_1.0.bb
```

* `conf/layer.conf`: 레이어의 기본적인 설정 파일로, 이 레이어가 포함하는 메타데이터의 위치를 지정한다.
* `recipes-example/`: 패키지 레시피를 포함하는 디렉토리로, 특정 소프트웨어 패키지를 빌드하는 데 필요한 정보를 포함한다.

#### Layer Configuration

`conf/layer.conf` 파일은 레이어의 메타데이터 경로와 우선순위를 설정한다.

```bash
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb"
LAYERSERIES_COMPAT_meta-example = "yocto-series"
```

#### 주요 레이어

Yocto 프로젝트는 여러 기본 레이어를 제공한다:

1. **meta**: 기본적인 빌드 환경을 제공하는 핵심 레이어.
2. **meta-openembedded**: 다양한 오픈 소스 소프트웨어 패키지를 포함하는 부가 레이어.
3. **meta-yocto-bsp**: 다양한 보드 지원 패키지를 포함하는 레이어.

#### 사용자 정의 레이어 추가

사용자 정의 레이어를 추가하려면, 아래와 같은 명령어를 사용하여 레이어를 설정한다:

```bash
bitbake-layers create-layer meta-my-layer
bitbake-layers add-layer meta-my-layer
```

`add-layer` 명령어는 `bblayers.conf` 파일에 새로운 레이어를 추가하여 Yocto 빌드 시스템이 이를 인식하게 한다.

#### Layer Dependencies

한 레이어가 다른 레이어에 의존하는 경우 `conf/layer.conf` 파일에서 이를 명시할 수 있다:

```bash
LAYERDEPENDS_meta-example = "core"
```

이 설정은 `meta-example` 레이어가 `core` 레이어에 의존함을 의미한다.

#### Layer 우선순위

레이어의 우선순위를 지정하여 충돌을 방지할 수 있다:

```bash
BBFILE_PRIORITY_meta-example = "6"
```

더 높은 우선순위를 가진 레이어가 동일한 파일에 대해 더 우선순위를 갖게 된다.

***

래이어와 메타데이터는 Yocto 프로젝트에서 모듈성과 재사용성을 극대화하는 데 중요한 역할을 한다. 레이어를 사용하면 다양한 기능을 독립적으로 관리하고, 복잡한 시스템을 보다 쉽게 구성할 수 있다. 레시피, 태스크, 이벤트와 함께 레이어를 활용하여 더욱 강력하고 유연한 임베디드 리눅스 배포판을 만들 수 있다.
