# 패키지 피드 구성 및 관리

Yocto 프로젝트에서는 패키지 피드(Package Feed)를 활용하여 다양한 패키지를 관리하고 배포할 수 있다. 패키지 피드란 빌드된 패키지를 호스팅하고 네트워크를 통해 배포할 수 있도록 하는 저장소를 의미한다. 패키지 피드는 보통 IPK, RPM, Deb 포맷을 지원하며, 패키지를 다운로드받고 설치하는 작업을 효율적으로 수행할 수 있다.

패키지 피드를 구성하고 관리하는 일은 Yocto 프로젝트에서 중요한 역할을 하며, 이를 통해 사용자들은 원하는 대상 장치에 필요한 패키지를 쉽게 추가하거나 업데이트할 수 있다. 이 섹션에서는 패키지 피드의 구성 및 관리 방법에 대해 자세히 설명한다.

**패키지 피드 구성**

1. **패키지 저장소 설정**:
   * 패키지 저장소는 보통 HTTP 서버, FTP 서버 또는 로컬 파일 시스템을 이용해 설정할 수 있다.
   * 서버 설정 예제:

     ```sh
     sudo apt-get install apache2
     sudo systemctl start apache2
     sudo systemctl enable apache2
     ```
   * Yocto 빌드 시스템에서 생성된 패키지를 저장소에 복사:

     ```sh
     rsync -avz ./build/tmp/deploy/ipk/ /var/www/html/ipk/
     ```
2. **패키지 인덱스 생성**:
   * 적절한 패키지 관리 도구를 사용해 패키지 인덱스를 생성해야 한다.
   * `opkg-make-index`는 IPK 패키지에 대해 인덱스를 생성하는 도구이다:

     ```sh
     opkg-make-index -r /var/www/html/ipk > /var/www/html/ipk/Packages
     ```

**패키지 피드 관리**

1. **패키지 업데이트**:
   * 주기적으로 빌드된 패키지를 패키지 피드로 복사하고 인덱스를 업데이트해야 한다.
   * 새 패키지를 빌드한 후 다음 명령어로 피드를 동기화할 수 있다:

     ```sh
     rsync -avz ./build/tmp/deploy/ipk/ /var/www/html/ipk/
     opkg-make-index -r /var/www/html/ipk > /var/www/html/ipk/Packages
     ```
2. **패키지 삭제**:
   * 더 이상 필요하지 않은 패키지를 삭제하고 인덱스를 갱신해야 한다.
   * 패키지를 삭제한 후 다음 명령어로 인덱스를 업데이트한다:

     ```sh
     rm /var/www/html/ipk/<package-name>.ipk
     opkg-make-index -r /var/www/html/ipk > /var/www/html/ipk/Packages
     ```

**패키지 피드를 통한 패키지 설치**

1. **피드 URL 설정**:
   * 대상 장치에서 패키지 관리 도구가 패키지 피드 URL을 참조할 수 있도록 설정해야 한다.
   * 예를 들어, `opkg`를 사용하는 경우 `/etc/opkg/opkg.conf` 파일에 패키지 피드 URL을 추가한다:

     ```sh
     src/gz all http://<your-server-ip>/ipk
     ```
2. **패키지 업데이트 및 설치**:
   * 패키지 데이터를 업데이트한 후, 원하는 패키지를 설치할 수 있다:

     ```sh
     opkg update
     opkg install <package-name>
     ```

#### 패키지 레시피 작성

Yocto 프로젝트에서 패키지 관리는 주요 기능 중 하나로, 특정 소프트웨어 패키지를 만들기 위한 레시피 재작성이 필수적이다. 패키지 레시피는 주로 `.bb` 파일로 작성되며, 소프트웨어 패키지의 소스 코드 다운로드부터 빌드, 설치, 패키지화까지의 과정을 정의한다.

**주요 레시피 변수**

1. **SRC\_URI**:
   * 소프트웨어의 소스 코드 위치를 지정한다.
   * 예:

     ```sh
     SRC_URI = "http://example.com/software-${PV}.tar.gz"
     ```
2. **DEPENDS**:
   * 현재 레시피가 빌드되기 전에 빌드되어야 하는 다른 레시피를 지정한다.
   * 예:

     ```sh
     DEPENDS = "libxyz"
     ```
3. **do\_compile** 함수:
   * 소스 코드를 컴파일하는 방법을 정의한다. 기본적으로 Yocto는 `autotools` 라든가 `cmake`를 사용하여 빌드하지만, 커스텀 빌드가 필요한 경우 직접 함수 내에 빌드 명령어를 작성할 수 있다.
   * 예:

     ```sh
     do_compile() {
         oe_runmake
     }
     ```
4. **do\_install** 함수:
   * 컴파일된 소프트웨어를 패키지화할 때 필요한 설치 과정 정의.
   * 예:

     ```sh
     do_install() {
         install -d ${D}${bindir}
         install -m 0755 software ${D}${bindir}/software
     }
     ```

**예제 레시피**

다음은 간단한 예제 패키지 레시피이다:

```sh
DESCRIPTION = "Example software"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=<checksum>"

SRC_URI = "http://example.com/software-${PV}.tar.gz"
SRC_URI[md5sum] = "<md5sum>"
SRC_URI[sha256sum] = "<sha256sum>"

S = "${WORKDIR}/software-${PV}"

inherit autotools

do_install() {
    install -d ${D}${bindir}
    install -m 0755 software ${D}${bindir}/software
}
```

#### 패키지 관리 도구

패키지 관리 도구는 Yocto 프로젝트에서 패키지를 설치, 삭제 및 업데이트하는 데 사용된다. 대표적인 도구로는 `opkg`, `rpm`, `dpkg`가 있으며, 각 도구는 각각의 패키지 형식을 지원한다.

**opkg**

* 임베디드 시스템에서 가장 많이 사용되는 경량 패키지 관리 도구.
* 주요 명령어:

  ```sh
  opkg update           # 패키지 목록 업데이트
  opkg install <name>   # 패키지 설치
  opkg remove <name>    # 패키지 삭제
  ```

**RPM**

* Red Hat 패키지 매니저로, 주로 대형 리눅스 시스템에서 사용된다.
* 주요 명령어:

  ```sh
  rpm -i <package.rpm>   # 패키지 설치
  rpm -e <package>       # 패키지 삭제
  rpm -U <package.rpm>   # 패키지 업데이트
  ```

**DPKG**

* Debian 패키지 매니저로, 주로 Debian 기반 시스템에서 사용된다.
* 주요 명령어:

  ```sh
  dpkg -i <package.deb>  # 패키지 설치
  dpkg -r <package>      # 패키지 삭제
  dpkg -P <package>      # 패키지와 설정 파일 삭제
  ```

패키지 피드의 구성 및 관리는 Yocto 프로젝트에서 효율적인 소프트웨어 배포를 가능하게 한다. 패키지 레시피의 작성부터 패키지 관리 도구를 통한 설치 및 업데이트까지의 전체 과정을 이해하면, 사용자는 보다 효율적으로 임베디드 시스템 환경을 관리할 수 있다.
