Linux/yocto

Yocto 프로젝트: 이미지 커스터마이징

임베디드 친구 2025. 5. 18. 12:43
728x90
반응형

Yocto 프로젝트: 이미지 커스터마이징

이번 포스팅에서는 Yocto 프로젝트를 활용하여 Rockchip RK3399 보드에서 동작하는 맞춤형 이미지를 구성하는 방법에 대해 자세히 설명하겠습니다. 이 과정에서는 기본적인 이미지 구성 외에도 시스템 최적화, 시스템D 설정, 네트워크 구성 등을 포함하여 실제로 활용 가능한 최적화된 임베디드 리눅스 환경을 구축하는 방법을 다룹니다.

1. Yocto 이미지 커스터마이징 개요

Yocto 프로젝트에서 이미지는 다양한 패키지와 설정을 결합하여 생성됩니다. 이미지 커스터마이징은 특정 하드웨어 및 요구 사항에 맞춰 불필요한 기능을 제거하고, 필요한 기능과 애플리케이션을 포함하는 과정을 의미합니다. 이를 통해 부팅 시간을 단축하고 시스템 리소스를 효율적으로 사용할 수 있습니다.

이미지 커스터마이징은 다음과 같은 작업을 포함합니다.

  • 사용자 정의 레이어 및 레시피 작성
  • 시스템D와 네트워크 설정 최적화
  • 불필요한 패키지 제거
  • 추가 애플리케이션과 설정 포함

이제 각 과정에 대해 자세히 살펴보겠습니다.


2. 커스텀 이미지 생성하기

2.1 새로운 이미지 레시피 작성

Yocto에서 이미지는 meta 디렉터리 내의 레이어에 정의된 레시피를 기반으로 구성됩니다. 새로운 이미지를 생성하려면 사용자 정의 레이어 내에 이미지 레시피를 작성해야 합니다.

아래는 사용자 정의 이미지를 생성하는 예제입니다. meta-mycustom 레이어에 recipes-core/images/custom-image.bb 파일을 생성합니다.

# meta-mycustom/recipes-core/images/custom-image.bb
DESCRIPTION = "Custom Yocto image for RK3399"
LICENSE = "MIT"

IMAGE_INSTALL = "\
    base-files \
    packagegroup-core-boot \
    packagegroup-core-ssh-dropbear \
    systemd \
    iproute2 \
    iputils \
    nano \
    vim \
    ethtool \
    curl \
    wget \
    openssh \
    "

IMAGE_FEATURES += "ssh-server-openssh"

inherit core-image

위 레시피에서는 다음과 같은 사항을 정의했습니다.

  • IMAGE_INSTALL 변수에 필요한 패키지 목록을 작성
  • IMAGE_FEATURES 변수로 SSH 서버 활성화
  • inherit core-image를 통해 기본 이미지 구조를 상속

해당 이미지는 부팅 시 기본적인 시스템 유틸리티와 SSH 서버를 사용할 수 있는 환경을 구성합니다.

2.2 이미지 빌드

이미지를 빌드하기 위해 Yocto 빌드 환경에서 다음 명령어를 실행합니다.

source oe-init-build-env
bitbake custom-image

이미지 생성이 완료되면 build/tmp/deploy/images/rk3399/custom-image-<버전>.wic 파일 형태로 이미지가 생성됩니다.


3. 시스템D 설정 최적화

Yocto에서 기본적으로 sysvinit을 사용하지만, 시스템 최적화를 위해 systemd를 사용하는 것이 권장됩니다. 이미 작성한 이미지 레시피에서 systemd를 포함했으므로, 부팅 시 시스템D가 기본으로 사용되도록 설정하겠습니다.

3.1 systemd 활성화

local.conf 파일에 다음과 같이 추가합니다.

# conf/local.conf
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"

이제 빌드된 이미지는 시스템D를 기본 init 시스템으로 사용하게 됩니다.

3.2 사용자 정의 서비스 작성

예를 들어, 시스템 부팅 시 특정 스크립트를 실행하는 서비스를 작성해보겠습니다. 아래는 hello.service 예제입니다.

# meta-mycustom/recipes-support/hello-service/files/hello.service
[Unit]
Description=Hello World Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/hello.sh
Restart=always

[Install]
WantedBy=multi-user.target

hello.sh 스크립트는 다음과 같이 작성합니다.

#!/bin/bash
echo "Hello, Yocto!" > /var/log/hello.log

이제 해당 서비스와 스크립트를 패키징하는 레시피를 작성합니다.

# meta-mycustom/recipes-support/hello-service/hello-service.bb
DESCRIPTION = "Hello World systemd service"
LICENSE = "MIT"
SRC_URI = "file://hello.service file://hello.sh"

inherit systemd

FILES:${PN} += "/lib/systemd/system/hello.service /usr/bin/hello.sh"

do_install() {
    install -d ${D}/usr/bin
    install -m 0755 ${WORKDIR}/hello.sh ${D}/usr/bin/hello.sh

    install -d ${D}/lib/systemd/system
    install -m 0644 ${WORKDIR}/hello.service ${D}/lib/systemd/system/hello.service
}

SYSTEMD_SERVICE:${PN} = "hello.service"

이제 bitbake hello-service 명령어로 패키지를 빌드하고 이미지에 포함시킵니다.


4. 네트워크 설정 최적화

임베디드 시스템에서는 유선과 무선 네트워크를 효율적으로 설정하는 것이 중요합니다. RK3399 보드에서는 이더넷과 Wi-Fi를 지원하므로, Yocto 이미지에 기본 네트워크 설정을 추가해보겠습니다.

4.1 정적 IP 설정

유선 네트워크에 정적 IP를 할당하는 방법은 다음과 같이 구성합니다.

# /etc/systemd/network/eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=8.8.8.8

이 설정을 Yocto 레시피에 포함하는 방법은 다음과 같습니다.

# meta-mycustom/recipes-core/base-files/base-files_%.bbappend
dofile_append() {
    install -d ${D}/etc/systemd/network
    install -m 0644 ${WORKDIR}/eth0.network ${D}/etc/systemd/network/eth0.network
}

4.2 Wi-Fi 설정

Wi-Fi는 wpa_supplicant를 사용해 설정합니다.

# /etc/wpa_supplicant.conf
network={
    ssid="MyWiFi"
    psk="mypassword"
}

이미지에 포함하기 위해 다음과 같이 작성합니다.

# meta-mycustom/recipes-connectivity/wpa-supplicant/wpa-supplicant_%.bbappend
dofile_append() {
    install -d ${D}/etc
    install -m 0600 ${WORKDIR}/wpa_supplicant.conf ${D}/etc/wpa_supplicant.conf
}

5. 최적화 및 디버그 설정

Yocto에서 생성된 이미지는 기본적으로 디버그 정보가 포함될 수 있습니다. 최종 배포용 이미지를 경량화하기 위해 디버그 정보를 제거하는 방법은 다음과 같습니다.

5.1 불필요한 패키지 제거

local.conf 파일에 다음을 추가합니다.

EXTRA_IMAGE_FEATURES = ""  # 디버그 기능 제거
IMAGE_INSTALL:remove = "packagegroup-core-debug"

5.2 최적화 빌드 옵션 설정

conf/local.conf에 최적화 플래그를 설정합니다.

# 최적화 빌드 플래그
TARGET_CFLAGS = "-O2 -pipe"
TARGET_LDFLAGS = "-Wl,-O1"

6. 이미지 테스트 및 배포

이미지를 빌드한 후, SD 카드에 이미지를 기록하고 RK3399 보드에서 부팅하여 테스트합니다.

# SD 카드에 이미지 기록
sudo dd if=build/tmp/deploy/images/rk3399/custom-image.wic of=/dev/sdX bs=4M status=progress
sync

보드를 부팅한 후, 다음과 같이 시스템과 네트워크 상태를 확인합니다.

# 부팅 후 SSH 접속
ssh root@192.168.1.100

# 서비스 상태 확인
systemctl status hello.service

# 네트워크 상태 확인
ip addr show eth0

7. 결론

이번 포스팅에서는 Yocto 프로젝트를 사용하여 RK3399 보드에서 동작하는 맞춤형 이미지를 구성하는 방법에 대해 살펴보았습니다. 시스템D를 활성화하고 사용자 정의 서비스를 추가했으며, 네트워크 설정과 최적화 작업을 통해 실제 환경에서 활용 가능한 이미지를 구축했습니다.

728x90
반응형