회사에서 Yocto 공부 한 것을 정리한 글입니다.
1.What is Yocto
1.1 Yocto란
- 임베디드 제품(보드)에 호환하는 커스텀 리눅스 OS를 만들기 위해 탄생한 오픈소스 프로젝트
1.2 Yocto를 사용하는 이유
- 처음 하드웨어 보드 구입 =⇒ 운영체제가 설치 X
1.3 리눅스 OS 설치
1.3-1 커스텀 리눅스 OS 설치 과정(기존)
- 관련 소프트웨어, 의존성 고려
- CPU 아키텍처(ARM, X86등)
- 과정이 까다롭고 복잡함
- 많은 시간이 소요
1.3-2 커스텀 리눅스 OS 설치 과정( Yocto 사용 )
1. 이미지 빌드(리눅스 OS 이미지 생성)
2. 이미지 하드웨어 저장 장치에 저장 (플래싱)
3.보드 전원 ON ⇒ 부트로더 실행
4.부트로더 =⇒ 저장장치 이미지 실행
1.4 Yocto의 장점 정리
1. 커스텀 리눅스 OS 구축 및 빌드 가능
- 하드웨어 아키텍처
- 관련 소트프웨어, 의존성
2. 재사용 가능한 구성 요소
- Yocto 빌드에 필요한 레이어, 레시피 등을 재사용 및 공유 가능
3. 표준화된 개발 환경
- 일관된 개발 환경을 제공합니다. 이는 협업하기 용이합니다.
2. bitbake, Metadata, layer
2.1 bitbake란
Yocto 공식 문서에서의 설명
1) 쉘 및 Python 코드를 병렬 방식으로 실행하는 툴
2) 이미지 빌드를 하는데 필요한 메타 데이터를 해석 및 실행
2.2 메타 데이터란
1) bitbake로 이미지 빌드를 수행하기 위해 사용
2) 소프트웨어를 어떻게 빌드하고 빌드 순서를 어떻게 정할지?
3) 빌드하려는 소프트웨어들 간의 의존성이 있는지 기술
2.3 메타 데이터 파일의 특징
- 환경 설정 파일만 함수 선언 불가, 나머지는 함수, 변수, 태스크 선언 가능
1) 레시피 파일(.bb)
- 빌드에 필요한 소프트웨어 다운 경로, 라이센스, 빌드 방법, 빌드 산출물의 경로 등을 기술합니다.
- bitbake가 실행 할 수 있는 함수 및 태스크가 정의 될 수 있습니다.
레시피 파일 예시
### hello.bb
//설명
DESCRIPTION = "간단한 Hello World 프로그램"
//라이센스
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"
//다운로드 경로
SRC_URI = "file://example.com/hello-1.0.tar.gz"
//빌드 경로
S = "${WORKDIR}/hello-1.0"
//컴파일
do_compile() {
${CC} hello.c ${LDFLAGS} -o hello
}
//결과물이 저장되는 장소
do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}
//파일 경로 설정
FILESEXTRAPAHTS_prepend := ${THISDIR}/source:"
- 라이센스 설정
- 다운로드 경로
- 빌드 경로
- 결과물이 저장되는 위치
- 파일 PATH 경로
*태스크: 함수와 비슷한 개념이라고 생각!(추후 더 자세히 설명)
2) 클래스 파일(.bbclass)
-빌드를 위해 레시피 파일에서 공통적으로 사용되는 함수 및 태스크들을 정의합니다.
예시) base.bbclass
# mycommon.bbclass - Common BBClass for Recipes
# A common function that can be reused by recipes
python myfunc() {
echo "This is a common function for recipes."
}
- 레시피 혹은 레이어간의 공통적으로 사용할 함수들을 위와 같이 정의해서 사용할 수 있습니다.
SUMMARY = "Simple Hello World Example"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/LICENSE;md5=3f40d7994397109285ec7b81fdeb3b58"
**inherit base**
# Export the variable and function so that recipes can use them
addtask myfunc before do_build = "r0"
SRC_URI = ""
- 사용 시 에는 inherit 키워드를 사용해서 쓸 수 있습니다.
3) 환경 설정 파일(.conf)
-함수 및 태스크 X
-선언된 변수는 전역 변수의 특징을 갖습니다.
-주로 레시피 파일, 레이어의 경로 등을 변수로 갖고 있습니다. (환경 변수 같은 느낌….)
예시) bblayers.conf 파일
# bblayers.conf sample file
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \\
/path/to/yocto/meta \\
/path/to/yocto/meta-poky \\
/path/to/yocto/meta-yocto-bsp \\
/path/to/other/layer/meta-custom \\
4) 레시피 확장 파일(.bbappend)
-레시피 파일에서 선언된 변수, 함수, 태스크를 재정의 해서 확장 시킬 수 있도록 해줍니다.
-기존의 작성된 레시피 파일을 수정하는 것이 부담스러울 때 주로 사용됩니다.
5)인클루드 파일(.inc)
-클래스 파일과 동일하게 동작합니다. 하지만 include는 상속을 지원하지 않습니다.
-레시피 안에서 공통적으로 사용되는 변수들을 정의할 때 유용합니다.
2.4 레이어란
Yocto 공식문서에서의 설명
https://www.yoctoproject.org/development/yocto-project-compatible-layers/
- 이미지 빌드에 필요한 작업을 알려주는 지침 세트가 포함된 저장소
- 표준화를 제공, 강력한 생태계에 기여 ⇒ 공유 가능
2.5 레이어 계층 구조
1)주로 meta-xxx 형식의 이름으로 되어있음
2) layer 디렉토리 안에는 각각의 메타 데이터 파일들이 들어있습니다.
3) 독립적이며 의존하지 않는 모듈 형식
-각각의 레이어는 독립적이며 의존하지 않는 모듈 형식으로 되어있습니다.
-자신만의 커스텀 레이어를 만들어서 공유 할 수 있습니다.
3. bitbake가 실행되는 과정
3.1 메타 데이터 파일 분석
레시피 파일 경로 파악 과정
1) BBPATH(환경변수)
-bblayers.conf 파일에 경로를 저장한 변수가 있습니다.
2) bblayers.conf 파일
-사용할 layer들의 경로를 저장한 변수가 있습니다.
예시
# bblayers.conf sample file
LCONF_VERSION = "6"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \\
/path/to/yocto/meta \\
/path/to/yocto/meta-poky \\
/path/to/yocto/meta-yocto-bsp \\
/path/to/other/layer/meta-custom \\
"
- ‘?=’ 는 조건부 할당 연산자로 기본 값 설정 시 이전에 값이 설정된 경우 무시합니다.
- ‘.-=’ 덧붙이는 연산자로 기존에 있는 값 뒤에 변수에 할당된 값을 추가하는 연산자입니다
3) meta_layer(DIR) 접근
4) conf → layer.conf 파일
-bitbake가 실행할 레시피 파일의 경로를 저장한 변수가 있습니다.
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"
# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \\
${LAYERDIR}/recipes-*/*/*.bbappend"
...
5) hello.bb 레시피 파일 경로 파악 완료
!!환경 설정 파일(.conf)의 주된 용도!!
-환경 설정 파일 안에는 레시피 파일 경로, 사용하는 레이어들의 경로를 전역 변수로 갖고 있습니다.
3.2 이미지 빌드
1) do_fetch (소스 다운로드)
-소스 코드를 원격 저장소로부터 가져옵니다.
2) do_unpack (압축 해제)
-소스 코드 압축을 해제합니다.
3) do_patch ()
-기존 소스 코드의 변경 사항을 적용하는 작업입니다.
4) do_configure
-빌드 환경을 설정합니다(예: ./configure 스크립트 실행).
5) do_compile
-소스 코드를 컴파일하여 실행 가능한 파일을 생성합니다.
6) do_install
-컴파일된 파일을 임시 설치 경로에 복사합니다.
7) do_package
-설치된 파일들을 패키지 형태로 만듭니다.
8) do_populate_sysroot
-빌드된 패키지를 시스템 루트 디렉토리에 복사합니다.
9) do_roofs
-시스템 루트에 저장된 모든 필요한 파일들을 기반으로 최종 이미지의 루트 파일 시스템을
구축합니다.
10) do_image
-패키지들을 사용해서 최종적인 이미지 파일을 생성합니다
3.3 추가설명
1) Task
1)이미지 빌드 과정에서 실행되는 기본 함수
2) addtask에 정의한 함수
-Meta데이터 파일에서 addtask를 사용해서 별도로 정의한 함수
-별도로 실행시킬 함수를 호출하기 위해 사용
3) 어느 파일에서든 정의 가능( 환경 설정 파일 제외….)
-환경 설정 파일을 제외하고 어느 파일에서든 선언 가능
4) 작업 순서 지정 가능
예시
task.bbfile
addtask mycustomtask before do_compile
python do_mycustomtask() {
# 작업의 내용
}
- 위와 같이 정의하면 이미지 빌드 시 mycustomtask 함수가 compile 이전에 실행됩니다.
2) bitbake 문법 및 Tip
### hello.bb
DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"
SRC_URI = "file://example.com/hello-1.0.tar.gz"
S = "${WORKDIR}/hello-1.0"
do_compile() {
${CC} hello.c ${LDFLAGS} -o hello
}
do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}
FILESEXTRAPAHTS_prepend := ${THISDIR}/source:"
1) Bitbake는 변수 타입이 없습니다.
DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"
2) 모든 변수는 문자열로 인식됩니다.
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"
3)메타데이터 설정
DESCRIPTION = "간단한 Hello World 프로그램"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=xxxxxx"
- DESCRIPTION: 레시피의 간단한 설명입니다.
- LICENSE: 사용된 라이선스를 나타냅니다.
- LIC_FILES_CHKSUM: 라이선스 파일의 체크섬 입니다.
4)소스 코드 설정:
SRC_URI = "<http://example.com/hello-1.0.tar.gz>"
S = "${WORKDIR}/hello-1.0"
- SRC_URI: bitbake가 소스 코드를 다운 받을 경로를 지정
- S: bitbake가 소스 코드 빌드 시 제일 처음 참조하는 경로
4-1) S 경로 확인 명령어
**bitbake-getvar -r 레시피이름 변수이름**
4-2) 추가된 레이어 목록 확인 명령어
- bblayes.conf 파일에 추가한 레이어들을 확인할 수 있습니다.
**bitbake-layers show-layers**
5) 결과물 저장 장소 설정
do_compile() {
${CC} hello.c ${LDFLAGS} -o hello
}
do_install() {
install -d ${D}${bindir}
install -m 0755 ${B}/hello ${D}${bindir}/hello
}
5-1) bindir
- usr/bin을 의미합니다
5-2) install -d 디렉토리이름
- 디렉토리 생성 명령어
5-3) D
- Target의 루트 파일 시스템 경로
5-4) install -m 권한번호 실행파일이름 복사경로
- 권한 설정 ⇒ 원하는 파일 생성 ⇒ 특정 디렉토리 경로에 복사
6) 파일경로
SRC_URI = "file://example.com/hello-1.0.tar.gz"
?=
FILESEXTRAPAHTS_prepend ?= ${THISDIR}/source:"
- ‘file://’의 경로를 지정할 수 있습니다.
- $THISDIR : 현재 파일이 위치한 경로
4. Poky와 OpenEmbedded
4.1 Poky
1) Poky의 유래
- 정말 Pocky라는 과자에서 유래되었습니다. 하지만 이름 그대로 사용하면 저작권에 위배되어서 Poky라고 지었다고 합니다
2) Poky란
1) Yocto의 참조 배포판
2) 커스텀 OS 구축 및 빌드에 필요한 도구 모음
-Poky는 이러한 커스텀 OS 구축 및 빌드에 필요한 도구들을 갖고 있습니다
-내부에는 bitbake, OpenEmbedded-core, meta-yocto, meta-yocto-bsp
3) Poky의 내부 디렉토리 구조
4.2 오픈 임베디드 & 오픈 임베디드 코어
1) OpenEmbedded
1-1)빌드 자동화 프레임워크
1-2)크로스 컴파일 지원
1-3)Bitbake를 사용합니다.
2) OpenEmbedded-core
2-1) OpenEmbedded 내부의 핵심 구성 요소
- Open-Embedded 안에서 이미지 빌드에 필요한 최소한의 핵심 구성 요소를 제공한다.
- 플랫폼 독립적이고 배포 독립적인 메타 데이터를 포함하는 레이어이다.
2-2) OpenEmbedded를 Core로 나눈 이유
유지 및 관리를 쉽게 하기 위해서!!
-프로젝트가 커져감에 따라 OpenEmbeded에 너무 많은 메타 데이터들이 생겼습니다.
-유지 및 관리를 쉽게하기 위해 핵심적인 메타데이터들만 따로 분리했습니다
결론
bitbake는 Openembeded의 메타데이터를 기반으로 크로스 컴파일 및 이미지 빌드 작업을 수행합니다.
3) 전체적인 빌드 과정
5. 실습 예제 설명
5.1 실습 하기 전 설명 할 개념
1) Core-image-minimal
-커스텀 리눅스 OS를 구축 및 빌드 할 수 있는 최소한의 핵심 구성요소를 담은 이미지
- 부트로더, 루트 파일 시스템, 리눅스 커널 등이 이미지 안에 있습니다.
- 초기 빌드 시 3시간 정도 소요 (38번 서버는 5시간 걸림….)
2) QEMU 가상 머신
임베디드 보드를 대신해서 테스트 가능
- 하드웨어 보드 환경을 테스트 할 수 있는 가상에뮬레이터입니다.
5.2 레시피 확장 파일을 이용한 레시피 추가
1) 실습 목표
-Core-image-minimal의 루트 파일 시스템 안에 hello.c 실행 파일을 추가
-.bbappend 사용
-“Hello World” 출력
2) 레시피 확장 파일의 장점(Remind)
- Core-image-minimal의 레시피 파일에 영향을 끼치지 않게 레시피 추가 가능
3) 레시피 확장 파일 사용 방법
- Layer 디렉토리 & 레시피 파일 & 레시피 확장 파일 추가
Poky 내부 디렉토리 구조
- Layer 디렉토리 & 레시피 파일 & 레시피 확장 파일 추가
1) Layer 디렉토리 (meta-hello) 추가
1-1) meta-hello 디렉토리의 구조
1-2) 소스파일(hello.c 파일) 추가
1-3) 레시피 파일(hello.bb 파일) 추가
tmp 디렉토리 구조를 통한 결과물 저장 장소 설명
SRC_URI
- bitbake는 파일을 외부나 내부에서 다운 시 사용하는 파일의 경로
THISDIR
- 현재 디렉토리 경로
WORKDIR
- 작업 결과물 디렉토리 경로
S
- bitbake가 소스 코드 빌드 시 제일 처음 참조하는 경로
bindir
- usr/bin을 의미합니다
install -d 디렉토리이름
- 디렉토리 생성 명령어
D
- Target의 루트 파일 시스템 경로
install -m 권한번호 실행파일이름 복사경로
- 권한 설정 ⇒ 원하는 파일 생성 ⇒ 특정 디렉토리 경로에 복사
FILESEXTRAPATHS
- ‘file://’의 경로를 지정할 수 있습니다.
2) 레시피 확장 파일(.bbappend) 추가
예시) core-image-minimal.bbappend 파일
bbappend 파일 이름 작성 시 주의사항 !
-확장하려는 레시피 파일의 이름과 동일해야 합니다.
2. 레시피 & 레시피 확장 파일 경로 지정
1)layer.conf 파일에서 경로 지정
예시) layer.conf 파일
2)bblayers.conf 파일에서 경로 지정
예시) bblayers.conf 파일
3. 빌드 및 가상 머신 실행
1)bitbake 빌드(레시피 이름)
bitbake hello
2)루트 파일 시스템에 추가한 파일 적용
bitbake core-image-minimal -C rootfs
3)가상 머신 실행
runqemu core-image-minimal nographic
4. 출력 결과 확인
댓글