yoncho`s blog
3. Poky | bitbake + oe-core 본문
Poky는 Yocto를 다루는데 도움이 될 수 있는 재료로 쓰이기 위해 배포되었다.
궁극적으로 커스텀 리눅스를 구축하고 빌드하기 위해 Poky를 사용한다.
Poky내에는 커스텀 리눅스를 쉽게 빌드 할 수 있는 여러 메타데이터(.conf, .bb, .class, .inc)가 존재한다.
Poky => 기본적인 리눅스 스택 빌드가 되도록 Yocto가 배포한 참조 배포
서로 다른 H/W 환경을 구성하려면 리눅스 구성 S/W Stak도 달라야한다 따라서
우리는 Poky를 참고해 우리가 원하는 타깃 System에 맞는 커스텀 리눅스를 빌드할 수 있게 해야한다!
여담으로 Poky라는 말은 '매우 작은' 뜻을 가지지만 Yocto가 프로젝트 이름들을 음식과 관련된 것으로 짓는데.
우리가 흔히 아는 Pocky(빼빼로) 과자에서 유래된 것이고 이름 그대로 사용하면 법적으로 문제가 될 테니
c를 빼서 Poky(포키)가 되었다. 발음은 똑같다 ㅋㅋㅋ
#목차
1. Poky 구조
2. Open-Embedded
3. Poky 다운로드 및 빌드
4. QEMU Emulator
5. bitbake 변수값 추적 명령어
6. Open-Embedded System`s build process
7. 정리
[1] Poky 구조
아래 그림은 Poky Layer Architecture이다.
meta (oe-core) : 리눅스 배포판 생성을 위한 도구, metadata로 이루어진 빌드 프레임워크, Open-Embedded Core Layer라고 부름.
meta-poky : Yocto가 제공하는 Poky 참조 배포에 대한 metadata 존재.
meta-yocto-bsp : Yocto가 제공하는 참조 bsp metadata가 존재.
others : 필요에 따라 추가, 개발자가 타깃 시스템에 맞게 추가.
Poky를 빌드 시스템 관점에서 볼 때, "Open-Embedded Build Systme"이라고 부를 것이다.
Open-Embedded Build System은 정확히는 bitbake와 Open-Embedded Core를 뜻하는 것이다.
[2] Open-Embedded
Poky의 핵심 layer는 당연 맨 아래 기반이되어있는 meta (oe-core) layer이다. "Open-Embedded Core Layer"라고도 부른다.
*Open-Embedded : Embedded 장치용 리눅스 배포판을 만드는데 사용되는 Build 자동화 프레임워크 및 Cross Compiler 환경
*Layer : oe-build system에서 대상을 빌드하는 방법이 명시되어있는 metadata들이 포함된 repository
Open-Embedded의 권장 build system은 bitbake이다. 앞서 포스트한 bitbake 내용을 보면 대충 어떤 툴인지 알 수 있다.
즉, oe는 레시피를 사용해 소스를 repository에서 가져오고, 필요에 따라 패치, 코드 컴파일, 링크, 패키지(ipk, deb, rpm) 및 부팅 가능한 이미지를 생성한다.
*Open-Embedded Core : oe current version을 위한 core metadata를 포함한 layer
+ 플랫폼 독립적/ 배포 독립적 metadata 포함
+ glibc, gcc compiler, system, bsp 일부, tool, service 를 가지고 있다
결국 Poky가 제공하는 metadata들은 bitbake 기능을 확장하기 위해 사용된다.
**정리하면, oe-build system은 리눅스 빌드를 위해 metadata들을 가지고 bitbake가 빌드해 결과물을 생성하는 것이다.
[3] Poky 다운로드 및 빌드
I. git으로부터 poky 소스 다운로드
git clone git://git.yoctoproject.org/poky
위 명령어를 실행하면 최신 브랜치를 가져오기 때문에
우리가 작업할 때 bitbake는 dunfell을 사용할 것이다. 그래서 dunfell로 체크아웃 해줘야한다.
II. dunfell checkout
git checkout dunfell
#결과
Switched to branch 'dunfell'
Your branch is up to date with 'origin/dunfell'.
dunfell 브랜치로 체크아웃 해주면 위와 같이 결과가 표시된다.
디렉터리 구조를 살펴보면 아래와 같다.
poky
├── bitbake
├── contrib
├── documentation
├── meta
├── meta-poky
├── meta-selftest
├── meta-skeleton
├── meta-yocto-bsp
└── scripts
meta : oe-core layer
meto-poky : yocto 배포 참조 layer
meta-selftest : oe-selftest 스크립트가 사용하는 bitbake 테스트 layer
meta-skeleton : custom layer를 생성하는데 사용되는 템플릿 layer
meta-yocto-bsp : yocto project의 bsp layer
**전반적인 Poky 구성은 아래와 같다.
III. init build env.
빌드를 위해 기본적으로 빌드 환경 초기화 작업을 해야한다.
source poky/oe-init-build-env
위 명령어가 빌드 환경 초기화 스크립트이다.
여기서 source를 사용하는 이유는 셸 환경에서 스크립트 내 선언된 변수를 빌드할 때 사용할 수 있기 때문이다.
**source 를 붙여 실행하면 스크립트 내 변수가 선언되고 셸 환경에서 해당 변수를 사용할 수 있다.
위 명령어를 실행하면 현재 작업 디렉터리가 build/ 로 변경됨을 확인할 수 있다.
#결과
### Shell environment set up for builds. ###
You can now run 'bitbake <target>'
Common targets are:
core-image-minimal
core-image-sato
meta-toolchain
meta-ide-support
You can also run generated qemu images with a command like 'runqemu qemux86'
Other commonly useful commands are:
- 'devtool' and 'recipetool' handle common recipe tasks
- 'bitbake-layers' handles common layer tasks
- 'oe-pkgdata-util' handles common target package tasks
yoncho@Desktop_yoncho:~/yocto_project/poky_src/build$
여기서 build/ 디렉터리를 확인해보면
conf/ 디렉터리가 존재한다. conf/ 디렉터리 구조는 아래와 같다.
conf/
├── bblayers.conf
├── local.conf
└── templateconf.cfg
bblayers.conf : 생성된 layer 정보를 bitbake에게 알려주는 역할, 레이어 경로는 BBLAYERS 변수에 할당, 기본적으로 meta, meta-poky, meto-yocto-bsp 3개 기본 layer 포함하는 conf 파일이다.
local.conf : bitbake.conf가 인클루드해 사용하는 환경 설정 파일, 타깃 머신 지정/ 툴체인 지정/ 전역변수 및 변수처리 역할을 수행
templateconf.cfg : 프로젝트 생성 시 사용되는 템플릿 환경 설정 파일 포함하는 디렉터리 정보, 기본값 'meta-poky/conf'
빌드를 위한 초기화 작업도 완료 했으니 이제 빌드를 해보자.
IV. build 명령어
기본적인 커스텀 리눅스 이미지 빌드 명령어 수행
bitbake core-image-minimal -k
#수행
Loading cache: 100% |####################################################################################| Time: 0:00:00
Loaded 1332 entries from dependency cache.
Parsing recipes: 100% |##################################################################################| Time: 0:00:10
Parsing of 776 .bb files complete (5 cached, 771 parsed). 1332 targets, 40 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Build Configuration:
BB_VERSION = "1.46.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "universal"
TARGET_SYS = "x86_64-poky-linux"
MACHINE = "qemux86-64"
DISTRO = "poky"
DISTRO_VERSION = "3.1.33"
TUNE_FEATURES = "m64 core2"
TARGET_FPU = ""
meta
meta-poky
meta-yocto-bsp = "dunfell:63d05fc061006bf1a88630d6d91cdc76ea33fbf2"
Initialising tasks: 100% |###############################################################################| Time: 0:00:02
core-image-minimal은 레시피 파일 이름이다. Poky에서 배포된 것으로 타깃 시스템이 부팅되도록 지원하는 이미지를 얻을 수 있다. core-image-minimal이 가장 기본적인 이미지를 생성한다.
생성된 결과물은 다음 단계에서 실행해볼 것이다.
[4] QEMU Emulator
앞 단계를 통해 만들어진 결과를 Emulator로 실행해볼 건데.
본 과정에서는 QEMU - qemux86-64 머신으로 진행할 것이다.
I. 초기 작업
#빌드 환경 초기화
source oe-init-build-env
#runqemu 활성화
bitbake runqemu
II. QEMU 실행 명령어
runqemu
기본적으로 poky/scripts/runqemu 에 script 파일로 위치한다.
recipe 명령어 형식은 아래와 같다.
runqemu <recipe name>
앞 단계 결과물 실행 명령어
runqemu core-image-minimal nographic
위 명령어를 실행하면 우리가 만든 이미지로 커스텀 리눅스가 실행된다.
QEMU상 Linux 종료 명령어는 아래와 같다.
poweroff
[5] bitbake 변수값 추적 명령어
bitbake 환경 변수 옵션을 통한 변수값 추적은 중요하다.
oe-build system에서 정의한 변수 확인이 필요하다.
일단, inherit이라는 지시어로 oe-build system에서 클래스 파일을 상속하는데
추상화가 잘되어있어서 변수 확인을 수작업으론 하기 어렵다.
I. bitbake '-e' 옵션으로 변수 확인
bitbake core-image-minimal -e > env.txt
bitbake metadata 분석 후 결과로 변수, 함수를 env.txt에 저장한다.
II. 특정 변수 확인
bitbake core-image-minimal -e | grep ^DL_DIR
bitbake metadata 분석 후 결과로 변수, 함수들 중 'DL_DIR'로 시작하는 모든 것들을 출력한다.
III. bitbake 'bitbake-getvar' 명령어로 변수 확인
bitbake-getvar -r core-image-minimal DL_DIR
DL_DIR 변수의 변화 내용 부터 최종 값까지 상세 정보를 출력한다.
[6]. Open-Embedded System`s build process
기본적인 Linux host를 위한 S/W 빌드 과정과 비슷하다.
#Linux S/W build process for host - basic
I. Fetch : 소스 코드 다운 및 경로 설정
II. unpack : 압축 파일 시 압축 해제
III. patch : 업데이트(기능추가, 버그수정)가 있을 시 패치 적용
IV. configure : 환경(host architecture)에 맞는 빌드 절차 준비
V. compile : 코드 컴파일
VI. install : 빌드 산출물을 경로에 저장
하지만 Open-Embedded System은 호스트pc가 아닌 타깃pc에 설치해야하며 대부분 Linux(x86)에 설치하게 될 것이다.
그래서 기본적인 Linux host를 위한 S/W 빌드 과정과 비슷하지만 크게 다른 점은
빌드 산출물을 호스트에서 빌드하고 타깃에 설치해야한다.
결국, 호스트에서 빌드하기 위해선 *크로스 툴체인이 필요하고
빌드 결과물을 타깃 시스템에 설치하기 위해선 *패키지 관리 시스템을 사용해야한다.
Yocto의 타깃 빌드 용 컴파일러는 기본적으로 호스트 pc 환경의 빌드 패키지를 사용해 타깃 빌드 시 사용될 컴파일러를 빌드한다. => 호스트에 항상 빌드 패키지가 있어야한다.
[7] 정리
Poky는 커스텀 리눅스 빌드를 할 수 있는 참조 자료이자 base가 될 수 있다.
위 [4] 의 'bitbake core-image-minimal -k' 명령어를 수행하면 아래 순서로 동작한다.
I. bitbake가 metadata를 분석해 작업 내용을 파악한다.
II. 파악한 내용을 토대로 커스텀리눅스 빌드에 필요한 외부 소스를 다운받아온다.
III. 받아온 외부 소스를 컴파일하고 결과물로 패키지를 만든다.
IV. 최종적으로 루트 파일 시스템 이미지 만들어진다.
*루트파일 시스템 : 시스템 부트를 위한 장치 디렉토리와 프로그램을 포함하여 시스템 운영에 반드시 필요한 파일과 디렉토리가 포함한다.
위 과정을 그림으로 그리면 아래와 같다.
본 글을 요약하면 다음과 같다.
Poky는 oe-build system인 bitbake와 oe-core 및 여러 metadata & scripts로 이루어져있다.
Poky는 커스텀 리눅스 빌드를 위해 많은 metadata를 가지고 있으며, bitbake는 이 metadata를 이용해 커스텀 리눅스를 빌드한다.
metadata가 모여있는 핵심 디렉터리 meta는 Open-Embedded Core라 부르며, 플랫폼 독립적/ 배포 독립적 metadata를 포함한다. 추가로 compiler, system, 일부 타깃 bsp, tool, service들이 있다.
빌드해 나온 최종 이미지들은 패키지로 만들어 루트 파일 시스템에 설치한다. 최종 루트 파일 시스템 이미지는 커널, 부트로더, 이미지와 함께 타깃 시스템에 프로그래밍돼 타깃을 실행한다.
'기술, 나의 공부를 공유합니다. > [Vehicle] Yocto' 카테고리의 다른 글
5. Custom Layer | 레이어 생성을 위해 필요한 과정 (1) | 2024.06.23 |
---|---|
4. Premirrors & Shared State Cache | for 빌드 속도 개선 (0) | 2024.06.20 |
2. Bitbake | build tool (0) | 2024.06.16 |
1. Yocto | ? (0) | 2024.06.16 |
0. Yocto | start (0) | 2024.06.16 |