# 기본 이미지 생성

기본 이미지 생성은 Yocto 프로젝트의 핵심 기능 중 하나로, 사용자가 자신만의 맞춤형 운영체제 이미지를 생성할 수 있게 한다. 이 섹션에서는 Yocto 프로젝트를 사용하여 기본 이미지를 생성하는 방법을 단계별로 설명한다.

#### 빌드 환경 설정

이미지 생성을 시작하기 전에, Yocto 프로젝트의 빌드 환경을 설정해야 한다. 이를 위해 아래의 명령어 및 절차를 따른다.

1. **Yocto 프로젝트의 Poky 체크아웃**

   ```sh
   git clone git://git.yoctoproject.org/poky
   cd poky
   ```
2. **빌드 디렉토리 설정**

   ```sh
   source oe-init-build-env
   ```

   위 명령어를 실행하면 `build` 디렉토리가 생성되고 빌드 환경이 설정된다.

#### 빌드 구성 변경

Yocto 프로젝트는 높은 수준의 커스터마이즈가 가능한 설정 파일을 제공한다. 주요 설정 파일들은 `build/conf` 디렉토리에 위치해 있다.

1. **`local.conf` 파일 수정**

   `local.conf` 파일에서는 빌드 타겟, 머신 등의 설정을 할 수 있다. 기본적인 설정은 아래와 같다.

   ```sh
   nano conf/local.conf
   ```

   * **MACHINE 설정**: 빌드할 타겟 머신을 지정한다. 예를 들어, qemuarm을 설정하려면 다음과 같이 입력한다.

     ```
     MACHINE = "qemuarm"
     ```
   * **DL\_DIR 설정**: 소스 파일을 다운로드할 디렉토리를 지정한다.

     ```
     DL_DIR ?= "${TOPDIR}/downloads"
     ```
   * **SSTATE\_DIR 설정**: 공유 상태 캐시 디렉토리를 지정한다.

     ```
     SSTATE_DIR ?= "${TOPDIR}/sstate-cache"
     ```
2. **`bblayers.conf` 파일 수정**

   BBLayers 설정 파일을 통해 사용 가능한 레이어를 지정한다. Poky 디렉토리의 레이어를 기본으로 설정할 수 있다.

   ```sh
   nano conf/bblayers.conf
   ```

   기본 설정은 아래와 같이 한다.

   ```plaintext
   BBLAYERS ?= " \
     ${TOPDIR}/../meta \
     ${TOPDIR}/../meta-poky \
     ${TOPDIR}/../meta-yocto-bsp \
   "
   ```

#### 이미지 생성

빌드 환경이 설정되었으면, 본격적으로 이미지를 빌드한다. 일반적으로 사용되는 이미지는 `core-image-minimal`이다. 아래와 같은 명령어를 통해 이미지를 빌드할 수 있다.

```sh
bitbake core-image-minimal
```

이 명령어는 Yocto 빌드 시스템이 필요한 모든 소스 코드를 다운로드하고, 패키지를 생성하며, 최종적으로 이미지를 생성한다.

빌드 결과는 `build/tmp/deploy/images/<machine>` 디렉토리에 생성된다. 여기서 `<machine>`은 `local.conf` 파일에서 설정한 `MACHINE` 변수에 해당하는 값이다.

#### 생성된 이미지 확인

생성된 이미지는 아래와 같이 확인할 수 있다.

```sh
ls build/tmp/deploy/images/qemuarm/
```

이 디렉토리에는 생성된 커널 이미지, 파일 시스템 이미지, 디버깅 심볼 등의 파일이 포함되어 있다.

#### 이미지 커스터마이징

기본 이미지를 생성한 후, 사용자의 필요에 맞게 이미지를 커스터마이징할 수 있다. Yocto 프로젝트에서는 레시피와 레이어를 통해 이미지 구성 요소를 관리하고 변경할 수 있다.

**레시피 추가 및 수정**

레이어를 통해 패키지 레시피를 관리하고, 이미지 레시피에 추가할 수 있다. 예를 들어, 새로운 애플리케이션을 포함하고자 한다면 관련 레시피를 작성하고 이미지에 포함시켜야 한다.

1. **새로운 레시피 생성**

   예를 들어, `meta-custom`이라는 새로운 레이어를 생성하고, 그 안에 사용자 정의 애플리케이션 레시피를 추가하는 방법이다. 먼저 `meta-custom` 레이어를 추가한다.

   ```sh
   bitbake-layers create-layer meta-custom
   ```
2. **레이어 디렉토리 구조**

   생성된 `meta-custom` 레이어의 디렉토리 구조는 아래와 같다.

   ```plaintext
   meta-custom/
   ├── conf
   │   └── layer.conf
   ├── recipes-example
   │   └── example
   │       └── example_1.0.bb
   ```
3. **레시피 작성**

   `recipes-example/example/example_1.0.bb` 파일을 작성한다. 가장 기본적인 형태는 아래와 같다.

   ```plaintext
   SUMMARY = "Example recipe"
   LICENSE = "MIT"

   SRC_URI = "file://example-1.0.tar.gz"

   S = "${WORKDIR}/example-1.0"

   do_install() {
       install -d ${D}${bindir}
       install -m 0755 example ${D}${bindir}
   }
   ```
4. **레시피 추가**

   생성된 레이어를 `bblayers.conf` 파일에 추가한다.

   ```plaintext
   BBLAYERS ?= " \
       ${TOPDIR}/../meta \
       ${TOPDIR}/../meta-poky \
       ${TOPDIR}/../meta-yocto-bsp \
       ${TOPDIR}/../meta-custom \
   "
   ```
5. **이미지 레시피 수정**

   커스터마이즈된 이미지를 만들기 위해 `core-image-minimal.bb` 파일을 수정하거나 새로운 이미지 레시피를 작성한다.

   ```sh
   nano meta-custom/recipes-core/images/core-image-custom.bb
   ```

   ```plaintext
   require recipes-core/images/core-image-minimal.bb

   IMAGE_INSTALL += "example"
   ```
6. **이미지 빌드**

   이미지를 다시 빌드한다.

   ```sh
   bitbake core-image-custom
   ```

   이 명령어는 새로운 레시피를 포함한 커스터마이즈된 이미지를 생성한다.

#### 빌드 최적화

Yocto 빌드 시스템은 다양한 최적화 옵션을 제공한다. 빌드를 가속화하고, 출력 이미지를 최적화하려면 `local.conf`에서 몇 가지 설정을 변경할 수 있다.

* **PARALLEL\_MAKE**: 빌드 중 사용할 CPU 코어 수를 지정한다.

  ```plaintext
  PARALLEL_MAKE = "-j4"
  ```
* **BB\_NUMBER\_THREADS**: BitBake가 동시에 실행할 수 있는 작업 수를 설정한다.

  ```plaintext
  BB_NUMBER_THREADS = "4"
  ```
* **INHERIT += "rm\_work"**: 빌드 완료 후 워크 디렉토리의 불필요한 파일을 제거하여 디스크 공간을 절약한다.

  ```plaintext
  INHERIT += "rm_work"
  ```

#### 이미지 디버깅 및 테스트

이미지 생성 후, 디버깅과 테스트는 안정적이고 기능적인 OS 이미지를 보장하는 데 필수적인 과정이다.

1. **QEMU를 사용한 테스트**

   빌드된 이미지를 QEMU를 사용하여 에뮬레이션할 수 있다. 예를 들어, qemuarm 이미지를 테스트하려면 아래의 명령어를 사용한다.

   ```sh
   runqemu qemuarm
   ```
2. **디버깅 툴 사용**

   Yocto 프로젝트는 다양한 디버깅 툴을 제공한다. 예를 들어, GDB를 사용하여 에러를 추적할 수 있다.
3. **로그 파일 분석**

   빌드 과정에서 생성된 로그 파일을 분석하여 문제점을 파악할 수 있다. 로그 파일은 `build/tmp/log` 디렉토리에 저장된다.
