yocto - meta-raspberrypi, meta-qt5, systemd, VIRTUAL-RUNTIME, DISTRO_FEATURES, Qt 적용

markyang92·2022년 7월 5일
0

yocto

목록 보기
36/53
post-thumbnail

yocto build system 추가

현재 yocto build system($BUILDDIR)/conf/bblayers.conf

# your yocto build system
# poky/build/conf/bblayers.conf
BBLAYERS ?= " \
  ...
  <poky path>/meta-raspberrypi \
  "

docs


Compressed deployed files


VC4

  • 기본적으로 각 machine은 vc4를 사용한다.
    • 이 값이 set 되면, mesagl라이브러리의 PROVIDER 로 사용한다.
    • 이 값을 Disable 시키려면, DISABLE_VC4GRAPHCS = "1"로 할 것
      • 이 경우 그래픽스 라이브러리를 userland를 사용한다.
      • userland는 64-bit arch를 지원하지 않는다.

Add purchased License codes

  • Too add your own licenses use variabels KEY_DECODE_MPG2, KEY_DECODE_WVC1 in local.conf
KEY_DECODE_MPG2 = "12345678"
KEY_DECODE_WVC1 = "123456789"
  • You can supply more licenses separated by comma.
KEY_DECODE_WVC1 = "0x12345678,0xabcdabcd,0x87654321"

GPU_MEM

GPU_MEM VariableDescription
GPU_MEMGPU memory in MB. Sets the memory split between the ARM and GPU. ARM gets the remaining memory.
MIN: 16. Default: 64
GPU_MEM_128GPU memory in MG for the 256MB Rpi. Ignored by the 512MG RP. Overrides gpu_mem.
MAX: 192. Default not set.
GPU_MEM_512GPU memory in MG for the 512MB Rpi. Ignored by the 256MG RP. Overrides gpu_mem.
MAX: 448. Default not set.
GPU_MEM_1028GPU memory in MG for the 1024MB Rpi. Ignored by the 256/512MG RP. Overrides gpu_mem.
MAX: 944. Default not set.

for more details: https://www.raspberrypi.com/documentation/computers/configuration.html


Disable overscan

  • By default the GPU adds a black border around the video output to compensate for TVs which cut off part of the image.
DISABLE_OVERSCAN = "1"

Enable offline compositing support

  • Set this variable to enable support for dispmanx offline compositing:
DISPMANX_OFFLINE = "1"
  • This will enable the firmware to fall back to off-line compositing of Dispmanx elements. Normally the compositing is done on-line, during scanout, but cannot handle too many elements.
  • With off-line enabled, an off-screen buffer is allocated for compositing, When scene complexity (number and sizes of elements) is high, compositing will happen off-line into the buffer.
  • Heavily recommended for Wayland/Weston.

    For more details: http://wayland.freedesktop.org/raspberrypi.html


Boot delay


use u-boot

  • file: meta-raspberrypi/conf/machine/include/rpi-base.inc
  • u-boot를 사용하려면, local.conf
RPI_USE_U_BOOT = "1"

로 set할 것


use UART

  • local.conf
ENABLE_UART = "1"

로 set할 것


use ramfs

  • file: meta-raspberrypi/recipes-kernel/linux/linux-raspberrypi.inc
  • local.conf
INITRAMFS_IMAGE_BUNDLE = "1"

BSP

  • meta-raspberrypi/conf/machine

raspberrypi4-64.conf


local.conf MACHINE 하드코딩

  • 현재 yocto build system/conf/local.conf
# === local.conf === #
MACHINE = "raspberrypi4-64"

image

  • meta-raspberrypi에서 제공하는 image
    • meta-raspberrypi/recipe-core/images

rpi-basic-image.bb

  • core-image-minimal을 기반으로함

build

$ bitbake rpi-basic-image

image sdcard dd

$ sudo dd if=./<>.rpi-sdimg of=/dev/sd<x> bs=4M && sync

UART, I2C 사용

  • rpi 에서, 기본적으로 UARTdisable 되어 있음
  1. image file에 적용
  2. local.conf에 적용
ENABLE_UART = "1"
ENABLE_I2C = "1"
IMAGE_INSTALL += "i2c-tools vim"
  • i2c-tools, vim 레시피가 없다면, meta-openembedded/meta-oe를 추가하자.

  • IMAGE_INSTALL: package
    • e.g, IMAGE_INSTALL += "kernel-modules i2c-tools nodejs"
  • IMAGE_FSTYPES, IMAGE_FEATURES: filesystem 관련

custom-image

  • 위를 기반으로 custom-image를 만듦
# meta-markyang-raspberrypi/recipes-core/images/example-image.bb
include recipes-core/images/rpi-basic-image.bb

# "rpi"로 시작하는 machine만 유효하다.
# Only allow for machines which start with "rpi"
COMPATIBLE_MACHINE = "^rpi$"
  • 다시 rpi-basic-image.bb를 보자.
    • IMAGE_INSTALL += "kernel-modules"를 사용해, rootfs에 커널모듈을 사용할 수 있게끔 한다.

적용 확인

$ bitbake-layers show-recipes "example-*"

  • MACHINEmeta-raspberrypi/conf/machine/raspberrypi4-64.conf가 있기 때문에,
    local.confMACHINE = "raspberrypi4-64"로 하고 빌드해보자.
# ==== local.conf ==== #
MACHINE = "raspberrypi4-64"
$ bitbake example-image

custom-machine

MACHINEOVERRIDES

  • meta-raspberrypi에서 지원하는, original MACHINE 'raspberrypi4-64'.conf
    -> 그대로 우선 raspberrypi4-64-custom.inc로 가져오자.
    -> 아내면 raspberryi4-64-custom.inc내용이 require conf/machine/raspberrypi4-64.conf로 해도 된다.
  • raspberrypi4-64-custom.conf도 하나 만들어 raspberrypi4-64-custom.increquire|include 하게하자.
  • local.conf
    • MACHINE = "raspberrypi4-64-custom"

systemd 사용

systemdDISTRO_FEATURES에서 추가 가능하다. 따라서, DISTRO 전반에 영향을 주는 것 이기 때문에,
자신의 layer/conf/distro/<DISTRO>.conf에 설정한다.

  • 예제로, poky에 그냥 쓰겠다.
# poky/meta-poky/conf/distro/poky.conf
DISTRO_FEATURES:append = " systemd" # DISTRO_FEATURES에 systemd 추가
DISTRO_FEATURES:remove = "sysvinit" # DISTRO_FEATURES에 sysvinit 제거
VIRTUAL-RUNTIME_init_manger = "systemd" # VIRTUAL-RUNTIME_init_manager에 위에서 추가한 DISTRO_FEATURES의 systemd
DISTRO_FEATURES_BACKFILL:remove = "sysvinit" # sysvinit 자동으로 DISTRO_FEATURES에 추가되는 것 제거
VIRTUAL-RUNTIME_initscripts = "systemd-compat-units"


VIRTUAL-RUNTIME_syslog = ""
VIRTUAL-RUNTIME_base-utils-syslog = ""


tz: timezone 사용

54635ee01c90 at ~/workspace/poky ±(dunfell) ✗ ❯ bitbake-layers show-recipes "tz*"                 
NOTE: Starting bitbake server...
Loading cache: 100% |######################################| Time: 0:00:00
Loaded 1361 entries from dependency cache.
=== Matching recipes: ===
tzcode-native:
  meta                 2022a
tzdata:
  meta                 2022a
  • tzdata: meta/recipes-extended/timezone/tzdata.bb
  • example-image.bb에 해당 IMAGE_INSTALL 추가
IMAGE_INSTALL += "tzdata tzdata-misc"
DEFAULT_TIMEZONE = "Cuba"

root pw

https://docs.yoctoproject.org/ref-manual/classes.html#extrausers-bbclass

  • openssl로 해시 비밀번호를 만들어 보자
    $ openssl passwd -1 toor
  • example-image.bb에 아래를 추가한다.
  • 하지만 해시값을 넣진 않겠다....

networkmanager 추가

  • http://layers.openembedded.org/layerindex/recipe/72479/
  • meta-networking 레이어 내 networkmanager 레시피가 있다.
    • meta-networking 를 다운 받아야한다.
      • meta-networking 레이어는 meta-openembedded내 있다.
      • clone openembedded git://git.openembedded.org/meta-openembedded
      • meta-networking의 depends layer는 아래와 같다.
      • meta-python, meta-oemeta-openembedded내 있다.
      • 내 yocto build system에 각 레이어를 추가하자.
  • meta-openembedded/meta-networking/recipes-connectivity/networkmanager/networkmanager_1.22.10.bb
  • example-image.bb
IMAGE_INSTALL += "networkmanager networkmanager-nmtui networkmanager-bash-completion"
  • rpi 부팅해서, nmtui systemctl status NetworkManager 실행 해보자.

IMAGE_FSTYPE

  • example-image.bb
IMAGE_FSTYPES = "rpi-sdimg"

QT


meta-qt5


QPA

  • QPA를 설정해야한다.
  • QPA Backends의 대표적인 예제는 아래와 같다.
QPADescription
DirectFP(FrameBuffer)-
elgfsopengl사용. HW 가속 (컴포지터 X 가능)
LinuxFB(FrameBuffer)완전 SW
VNC
Mir Client

qtbase: qpa를 내 이미지에서 어떻게 적용할 것인가?

  • meta-qt5/recipes-qt/qt5/qtbase_git.bb에 qtbase를 위한 레시피가 있다.


qtbase_%.bbappend

  • qtbase기반으로 나는 무슨 QPA를 사용할 것인지 설정할 수 있다.
  • qtbase_%.bbappend를 하나 만들자.
    • poky/meta/recipes-core/qt5/qtbase_%.bbappend
    • files 디렉토리도 만듦
poky/meta/recipes-core/qt5 ±(dunfell) ✗ ❯ tree .
.
├── files
└── qtbase_%.bbappend
# ===== qtbase_%.bbappend ===== #
# === qtbase_%.bbappend === #
PACKAGECONFIG_append = " gl directfb eglfs gles2 journald"

# set QPA
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
SRC_URI += " \
  file://qt-qpa.sh \
"

do_install_append() {
  install -d "${D}${sysconfdir}/profile.d"
  install -m 0644 "${WORKDIR}/qt-qpa.sh" "${D}${sysconfdir}/profile.d"
}

files/qt-qpa.sh

export QT_QPA_PLATFORM=eglfs
  • systemd 가 시작 시, profile.d 내 파일을 실행하여 전역 환경변수가 먹힌다.

qtbase/qtdelarative는 config.summary를 출력으로 내놓음

  • aarch64-poky-linux/qtbaseconfig.summary

qt 예제 사용

  • 사용할 예제: meta-qt5/recipes-qt/examples/cinematicexperience_1.0.bb
  • example-image.bb
IMAGE_INSTALL += "cinematicexperience"

oe-pkgdata-util list-pkg-files: 뭔파일이 설치됬니?

  • IMAGE_INSTALL += "cinematicexperience"로 대체 뭔 파일들이 설치되었나?
$ oe-pkgdata-util list-pkg-files cinematicexperience
cinematicexperience:
        /lib/systemd/system-preset/98-cinematicexperience.preset
        ...주르륵
  • /usr/share/cinetmaticexperience-1.0/QT5_CinematicExperience 경로로 설치 되었구만,
    • 이미지를 부트해서 들어가서 실행해보자.

systemd unit으로 추가


systemd 구성

systemd 구성설명
systemdinit 데몬
systemd-journald다른 데몬(프로세스)들의 출력(syslog, 표준, 에러 출력), 로그 저장 데몬
systemd-logind사용자 로그인, 세션 등 관리 데몬
systemd-udevd장치 관리자 데몬
systemd-networkd네트워크 관리 데몬. DHCP 뿐만 아니라 Virtual Lan 설정까지 가능
systemd-resolvedDNS 해석 데몬
systemd-timesyncdNTP로 컴퓨터 시간 동기화 데몬
systemd-bootUEFI 부트로더

DISTRO_FEATURES

DISTRO_FEATURES                      description
alsaInclude ALSA support (OSS compatibility kernel modules installed if available).
api-documentationEnables generation of API documentation during recipe builds. The resulting documentation is added to SDK tarballs when the bitbake -c populate_sdk command is used. See the “Adding API Documentation to the Standard SDK” section in the Yocto Project Application Development and the Extensible Software Development Kit (eSDK) manual.
bluetoothInclude bluetooth support (integrated BT only).
cramfsInclude CramFS support.
directfbInclude DirectFB support.
ext2Include tools for supporting for devices with internal HDD/Microdrive for storing files (instead of Flash only devices).
ipsecInclude IPSec support.
ipv6Include IPv6 support.
keyboardInclude keyboard support (e.g. keymaps will be loaded during boot).
ldconfigInclude support for ldconfig and ld.so.conf on the target.
nfsInclude NFS client support (for mounting NFS exports on device).
openglInclude the Open Graphics Library, which is a cross-language, multi-platform application programming interface used for rendering two and three-dimensional graphics.
pciInclude PCI bus support.
pcmciaInclude PCMCIA/CompactFlash support.
pppInclude PPP dialup support.
ptestEnables building the package tests where supported by individual recipes. For more information on package tests, see the “Testing Packages With ptest” section in the Yocto Project Development Tasks Manual.
smbfsInclude SMB networks client support (for mounting Samba/Microsoft Windows shares on device).
systemdInclude support for this init manager, which is a full replacement of for init with parallel starting of services, reduced shell overhead, and other features. This init manager is used by many distributions.
usbgadgetInclude USB Gadget Device support (for USB networking/serial/storage).
usbhostInclude USB Host support (allows to connect external keyboard, mouse, storage, network etc).
usrmergeMerges the /bin, /sbin, /lib, and /lib64 directories into their respective counterparts in the /usr directory to provide better package and application compatibility.
/bin -> /usr/bin
/lib -> /usr/lib
로 심볼릭링크 시킨다.
waylandInclude the Wayland display server protocol and the library that supports it.
wifiInclude WiFi support (integrated only).
x11Include the X server and libraries.

Init Manager 선택

  • 기본적으로 Yocto Project는 SysVinit을 initialization manager로 사용한다.
    • 물론 systemd 또한 지원한다.
  • SysVinit에서, 컴포넌트를 service으로 다룬다. 이 service들은 shell script로서 /etc/init.d/ 디렉토리에 저장된다.
    • service들은 각자 다른 run level로 구성되어 있다.
      • run level은 /etc/rc<N>.d/ 디렉토리에 나뉘어 구성되어 있고 <N>은 런레벨에 따라, S, 0, 1, .. 6
      • 각 run level은 이전 run level에 depends
    • service들은 시퀀셜하게 로드된다. (one-by-one)
  • systemd는 컴포넌트를 unit으로 다룬다.
    • systemd에서 runlevel은 target 이라는 컨셉으로 다뤄지며, target 또한 지원되는 unit의 한 타입이다.
    • systemd에서 service들은 parallel start한다.
  • yocto 에서 SysVinit 사용을 원하면 아무 것도 하지 않아도 자동 지원된다.
  • yocto 에서 systemd를 사용하고 싶다면 다음의 step를 하자.
  1. distribution configuration file을 아래와 같이한다.
DISTRO_FEATURES:append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"

  1. 기존에 sysvinit으로 build된 distro를 사용하면, DISTRO_FEATURE에 sysvinit이 자동으로 지원되기 때문에, DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"을 추가하면 이를 방지할 수 있다.
  1. kbd compile 단계에서, 에러가 생길 수 있다.
    이는, 해당 distro/include/security_flags.inc에서, -Werror=format-security가 set 되어 있기 때문이다.
    distro나 local.conf 에서, SECURITY_STRINGFORMAT = ""으로 하자.

Feature Backfilling?

  • MACHINE_FEATURES, DISTRO_FEATURES에서 기존에 한번 enable된 구성요소는 전역적 구성요소가 되기 때문에, 이를 사용하는 어떤 이미지나 레시피가 해당 구성요소를 disable 하더라도, 다른 이미지/레시피에서 사용될 수 있기 때문에 해당 구성요소를 meta/conf/bitbake.confMACHINE_FEATURES_BACKFILL, DISTRO_FEATURES_BACKFILL에 추가되어 자동으로 채워준다.
  • DISTRO_FEATURES_BACKFILL의 예
    • pulseaudioDISTRO_FEATURES의 기본 구성인데, 이전에 PulseAudio support가 QT, GStreamer framework에 의해 enable되었다면, 이 구성이 모든 distro에 'DISTRO_FEATURES_BACKFILL' variable in meta/conf/bitbake.conf파일에 의해 다시 채워진다.
    • 지금 내가 사용할 distro에 pulseaudio feature를 disable하고 싶다면, 다른 기존의 distro conf가 필요로하는 PulseAudio support by adding "pulseaudio"에 영향을 끼치지 않게,
      distro.conf파일에 DISTRO_FEATURES_BACKFILL_CONSIDEREDpulseaudio를 추가하자.
      • 기존의 DISTRO_FEATURES_BACKFILL 변수에게서 내 빌드시스템에 DISTRO_FEATURES에 추가되는 것을 보호할 수 있다.
  • MACHINE_FEATURES_BACKFILL의 예
    • rtcMACHINE_FEATURES이다. realtime clock(RTC)는 모든 타겟 디바이스에 enable 되어 있다면, 모든 머신들이 MACHINE_FEATURES_BACKFILL (meta/conf/bitbake.conf)변수에 의해 다시 backfill된다.
    • 지금 내가 사용할 타겟 디바이스가 이 것을 지원할 여력이 되지않다면 내 machine.conf에, MACHINE_FEATURES_BACKFILL_CONSIDEREDrtc를 추가하자.

systemd-jornald 사용 (기존 syslog damon해제)

  • systemd-jornaldsyslog runtime or provider가 아니다.
  • systemd-jornald를 유일한 로깅 매커니즘으로 사용하려면, distro conf에 아래 변수를 사용해, syslog를 비활성화 해야한다.
VIRTUAL-RUNTIME_syslog = ""
VIRTUAL-RUNTIME_base-tuils-syslog = ""

이를 이용해, rsyslog/busybox-syslog가 사용되는 것을 막을 수 있다.


wayland

  • Wayland: Protocol
  • Weston: Compositor
  • DISTRO_FEATURESwayland가 있어야함
    • 자동으로 mesawayland-egl platform으로 빌드됨
  • weston compositor는
    • DISTRO_FEATURESwayland 있다면, weston compositor는 KMS support로 빌드된다.
    • DISTRO_FEATURESx11 있다면, weston compositor는 X11 support로 빌드된다.
    • DISTRO_FEATURES:append = " wayland x11" 로 가능하다.
  • IMAGE recipe/ local.conf에서 아래의 명령으로 추가가능
    • CORE_IMAGE_EXTRA_INSTALL += " wayland x11"

core-image-weston

$ bitbake core-image-weston

으로 이미지 빌드 후, 라즈베리파이에 write하고, 띄워보자.


XDG_RUNTIME_DIR이 설정되어 있지않아, 에러가 날 수 있다.

root $ mkdir -p /tmp/$USER-weston
root $ chmod 0700 /tmp/$USER-weston
root $ export XDG_RUNTIME_DIR=/tmp/$USER-weston
  • environment setup
    • export XDG_RUNTIME_DIR:
      • mkdir -p /tmp/$USER-weston
      • chmod 0700 /tmp/$USER-weston
      • export XDG_RUNTIME_DIR=/tmp/$USER-weston
  • launch
    • weston

  • DISTRO_FEATURE
  • local.conf
  • bitbake build
$ bitbake core-image-weston
  • 결과

weston@.service

  • weston-init/lib/systemd/system/weston@.service

Current working status
QEMU
Weston 1.0.3 will not run directly on the emulated QEMU hardware, due to lack of EGL support.

Weston will run under X emulation without issues.

Physical Machines
There is no embedded-class physical machine yet verified to run Weston to top of hardware. Current efforts focus on enabling FRI2.

Plan
Upgrade Weston to a version that can run only on framebuffer (e.g. pixman)
Image that boots Weston on KMS
Enable GTK+ 3 Wayland support
Enable Qt Wayland support
Enable Clutter Wayland support


qt사용하기

  1. meta-qt5 받기: https://github.com/meta-qt5/meta-qt5.git
  2. branch를 현재 사용 중인 yocto build system으로 checkout

meta-raspberrypi/qtbase_bbappend

  • meta-raspberrypi/dynamic-layer/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend
PACKAGECONFIGDescription
PACKAGECONFIG_GL:rpi
  • DISTRO_FEATURESx11 opengl
    • 有: gl
    • 無: DISTRO_FEATURESopengl
      • 有: eglfs gles2
      • 無: ''
PACKAGECONFIG_GL:append:rpi
  • MACHINE_FEATURESvc4graphics
    • 有: " kms"
    • 無: ''
  • " gbm"
PACKAGECONFIG_FONTS_rpi"fontconfig"
PACKAGECONFIG:append:rpi" libinput examples tslib xkb xkbcommon"
PACKAGECONFIG:remove:rpi" tests"

ROOTFS 용량 늘리기: IMAGE_ROOTFS_EXTRA_SPACE


qt+wayland

  • qtbase_%.bbappend 사용 처럼 qtwayland_%.bbappend를 사용하자!







https://prographics.tistory.com/1


  1. distro = poky-custom.conf
  • DISTRO_FEATURES:remove = "sysvinit x11"
  1. DISTRO_FEATURES
    example-image.bb
profile
pllpokko@alumni.kaist.ac.kr

0개의 댓글