레이블이 Yocto인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Yocto인 게시물을 표시합니다. 모든 게시물 표시

11/08/2020

Yocto 의 Licence 정보확인 와 Build Space 구조

1. Yocto의 Licence 정보 와 Build 구조 


Yocto Recipe 작성방법 (반드시 확인 및 이해)

1.1  Yocto Source의 License 설정 

Yocto의 기본인 poky에서 모든 LICENSE를 설정하는 곳이 별도로 존재하며, 
이 기반으로 Recipe에서 선언을 하면 쉽게 License 관리가 된다. 

  • Yocto의 licenses.conf 설정확인 
Yocto의  Source에서 Licenses 관리 부분 SPDXLICENSEMAP 기반으로 Recipe에서 LICENSE로 관리되어짐 

$ vi ./poky/meta/conf/licenses.conf

SRC_DISTRIBUTE_LICENSES += "AAL Adobe AFL-1.2 AFL-2.0 AFL-2.1 AFL-3.0"
SRC_DISTRIBUTE_LICENSES += "AGPL-3.0 ANTLR-PD Apache-1.0 Apache-1.1 Apache-2.0"
SRC_DISTRIBUTE_LICENSES += "APL-1.0 APSL-1.0 APSL-1.1 APSL-1.2 APSL-2.0"
SRC_DISTRIBUTE_LICENSES += "Artistic-1.0 Artistic-2.0 BitstreamVera BSD"
SRC_DISTRIBUTE_LICENSES += "BSD-2-Clause BSD-3-Clause BSD-4-Clause BSL-1.0"
SRC_DISTRIBUTE_LICENSES += "CATOSL-1.1 CC0-1.0 CC-BY-1.0 CC-BY-2.0 CC-BY-2.5"
SRC_DISTRIBUTE_LICENSES += "CC-BY-3.0 CC-BY-NC-1.0 CC-BY-NC-2.0 CC-BY-NC-2.5"
SRC_DISTRIBUTE_LICENSES += "CC-BY-NC-3.0 CC-BY-NC-ND-1.0 CC-BY-NC-ND-2.0"
SRC_DISTRIBUTE_LICENSES += "CC-BY-NC-ND-2.5 CC-BY-NC-ND-3.0 CC-BY-NC-SA-1.0"
SRC_DISTRIBUTE_LICENSES += "CC-BY-NC-SA-2.0 CC-BY-NC-SA-2.5 CC-BY-NC-SA-3.0"
SRC_DISTRIBUTE_LICENSES += "CC-BY-ND-1.0 CC-BY-ND-2.0 CC-BY-ND-2.5 CC-BY-ND-3.0"
SRC_DISTRIBUTE_LICENSES += "CC-BY-SA-1.0 CC-BY-SA-2.0 CC-BY-SA-2.5 CC-BY-SA-3.0 CC-BY-SA-4.0"
..........
# AGPL variations
SPDXLICENSEMAP[AGPL-3] = "AGPL-3.0"
SPDXLICENSEMAP[AGPLv3] = "AGPL-3.0"
SPDXLICENSEMAP[AGPLv3.0] = "AGPL-3.0"

# GPL variations
SPDXLICENSEMAP[GPL-1] = "GPL-1.0"
SPDXLICENSEMAP[GPLv1] = "GPL-1.0"
SPDXLICENSEMAP[GPLv1.0] = "GPL-1.0"
SPDXLICENSEMAP[GPL-2] = "GPL-2.0"
SPDXLICENSEMAP[GPLv2] = "GPL-2.0"
SPDXLICENSEMAP[GPLv2.0] = "GPL-2.0"
SPDXLICENSEMAP[GPL-3] = "GPL-3.0"
SPDXLICENSEMAP[GPLv3] = "GPL-3.0"
SPDXLICENSEMAP[GPLv3.0] = "GPL-3.0"

#LGPL variations
SPDXLICENSEMAP[LGPLv2] = "LGPL-2.0"
SPDXLICENSEMAP[LGPLv2.0] = "LGPL-2.0"
SPDXLICENSEMAP[LGPL2.1] = "LGPL-2.1"
SPDXLICENSEMAP[LGPLv2.1] = "LGPL-2.1"
SPDXLICENSEMAP[LGPLv3] = "LGPL-3.0"

#MPL variations
SPDXLICENSEMAP[MPL-1] = "MPL-1.0"
SPDXLICENSEMAP[MPLv1] = "MPL-1.0"
SPDXLICENSEMAP[MPLv1.1] = "MPL-1.1"
SPDXLICENSEMAP[MPLv2] = "MPL-2.0"
.........

Yocto의 License 관리하는 곳 
  https://git.yoctoproject.org/cgit.cgi/poky/plain/meta/conf/licenses.conf

상위 SRC_DISTRIBUTE_LICENSES는 최신 Version에서는 사라짐 
  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#var-AVAILABLE_LICENSES
  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#var-COMMON_LICENSE_DIR


1.2 Yocto Source의 Receipe 사용방법 

  • 상위 Config 기반으로 Recipe 적용하여 설정 
Recipe 안에서 LICENSE LIC_FILES_CHKSUM로 개별관리가 되므로 주의

Yocto의 Recipe 작성법 혹은 Config 설정확인
  https://ahyuo79.blogspot.com/2020/02/yocto-recipe.html

Openembedded의 Recipe 부분 참조 
  https://www.openembedded.org/wiki/Recipe_License_Fields


2.  Build Space 의 기본구조 확인 

  • Build Space 기본구조 분석 
Build Space 전체 기분구조 확인 
$ tree -t -L 1 --charset unicode
or
$ tree -t -L 1 --charset utf8
.
|-- conf
|-- tmp
|-- sstate-cache
|-- cache
`-- bitbake-cookerdaemon.log

  • Build Space 의 User Config 확인 
Build Space의 User Config 관련사항 

Source의 일반적인 Layer Config

$ tree -t -L 2 --charset unicode conf/   // Build Space의 User Config 
conf/
|-- local.conf.sample
|-- templateconf.cfg
|-- bblayers.conf.org
|-- local.conf
|-- local.conf.org
|-- bblayers.conf
`-- sanity_info 

  • Build Space의 tmp 부분 구조

$ tree -t -d -L 2 --charset unicode tmp/
tmp/
|-- hosttools
|-- log
|   `-- cooker
|-- cache
|   `-- default-glibc
|-- stamps
|   |-- all-poky-linux
|   |-- cortexa9hf-neon-mx6sx-poky-linux-gnueabi
|   |-- cortexa9hf-neon-poky-linux-gnueabi
|   |-- imx6sxsabresd-poky-linux-gnueabi
|   |-- x86_64-linux
|   `-- work-shared
|-- work-shared
|   |-- gcc-8.3.0-r0
|   `-- imx6sxsabresd
|-- work
|   |-- cortexa9hf-neon-mx6sx-poky-linux-gnueabi
|   |-- all-poky-linux
|   |-- imx6sxsabresd-poky-linux-gnueabi
|   |-- cortexa9hf-neon-poky-linux-gnueabi
|   `-- x86_64-linux
|-- pkgdata
|   `-- imx6sxsabresd
|-- deploy
|   |-- images
|   |-- rpm
|   `-- licenses
|-- sysroots-components
|   |-- all
|   |-- x86_64
|   |-- cortexa9hf-neon-mx6sx
|   |-- imx6sxsabresd
|   |-- cortexa9hf-neon
|   `-- manifests
|-- buildstats
|   |-- 20201027081937
|   |-- 20201028005722
|   |-- 20201028012636
|   |-- 20201028015306
|   |-- 20201028015422
|   |-- 20201028015551
|   |-- 20201028020411
|   |-- 20201028022652
|   |-- 20201028023144
|   |-- 20201028023437
|   |-- 20201028033851
|   |-- 20201028041736
|   |-- 20201028060743
|   |-- 20201028071633
|   |-- 20201028071841
|   |-- 20201028073336
|   |-- 20201028073710
|   |-- 20201028073849
|   |-- 20201028075408
|   |-- 20201028080901
|   |-- 20201028081657
|   |-- 20201028085730
|   |-- 20201029082105
|   |-- 20201029085354
|   |-- 20201029085549
|   |-- 20201029085755
|   |-- 20201030043736
|   |-- 20201030080459
|   |-- 20201103084648
|   |-- 20201104015257
|   `-- 20201105060918
|-- sysroots
|   `-- imx6sxsabresd
`-- sstate-control




2.1 Build Space에서 License 정보확인 


  • 사용된 Package들의 License 조사

아래와 같이 찾아보면, tmp/deploy/licenses 에 기본적으로 Yocto에서 사용되어지는 Package들 License를 쉽게 찾을 수 있다. 

그 아래를 보면 GCC License가 두 종료로 분리되어 나오

$ find . -name licenses
./tmp/deploy/licenses
./tmp/work/imx6sxsabresd-poky-linux-gnueabi/base-files/3.0.14-r89/licenses
./tmp/work/cortexa9hf-neon-poky-linux-gnueabi/util-linux/2.32.1-r0/util-linux-2.32.1/Documentation/licenses
./tmp/work/cortexa9hf-neon-poky-linux-gnueabi/gnutls/3.6.7-r0/gnutls-3.6.7/lib/extras/licenses
./tmp/work/x86_64-linux/util-linux-native/2.32.1-r0/util-linux-2.32.1/Documentation/license


  • 사용되어지는 Package들의 License 정보확인

Build Space에서 실제 빌드된 Package 정보들이 확인 가능하며, deploy에 배포된 licenses 정보들이 별도로 관리가 되어진다.

이곳에서 관련 licenses 정보들을 확인

$ pwd                 // Yocto의 Build Space 위치 확인 

$ bitbake -h        // Yocto의 Build Space 설정상태확인 

$ ls tmp/deploy/licenses/             // Licenses 에서 사용된 Package 정보들 
acl                                           db                            kmod-native                m4                              qemu-native
alsa-lib                                      db-native                     m4-native                  qemuwrapper-cross
alsa-state                                    dbus                          ldconfig-native            make                            quilt-native
alsa-utils                                    dbus-glib                     libarchive-native          makedevs-native                 quota
attr                                          dbus-glib-native              libassuan-native           make-native                     re2c-native
attr-native                                   dbus-native                   libcap                     mdadm                           readline
autoconf-archive                              dbus-test                     libcheck                   meson-native                    readline-native
autoconf-archive-native                       debianutils-native            libcheck-native            minicom                         rng-tools
autoconf-native                               depmodwrapper-cross           libcomps-native            mklibs-native                   rpcbind
automake-native                               diffutils                     libdaemon                  mobile-broadband-provider-info  rpm-native
avahi                                         dnf-native                    libdnf-native              mpfr-native                     run-postinsts
base-files                                    dosfstools                    libffi                     mtools-native                   sed
base-passwd                                   dosfstools-native             libffi-native              ncurses                         shadow
bash                                          dtc-native                    libgcc                     ncurses-native                  shadow-native
bash-completion                               dwarfsrcfiles-native          libgcc-initial             neard                           shadow-securetty
bc                                            e2fsprogs                     libgcrypt                  netbase                         shadow-sysroot
bc-native                                     e2fsprogs-native              libgpg-error               nettle                          shared-mime-info
binutils                                      elfutils                      libgpg-error-native        ninja-native                    shared-mime-info-native
binutils-cross-arm                            elfutils-native               libical                    nspr-native                     socat
binutils-native                               expat                         libidn2                    nss-native                      sqlite3
bison                                         expat-native                  libjitterentropy           ofono                           sqlite3-native
bison-native                                  file-native                   libmnl                     openssh                         sudo
bluez5                                        firmware-imx                  libmodulemd-native         openssl                         swig-native
bmap-tools-native                             flac                          libmpc-native              openssl-native                  sysfsutils
btrfs-tools                                   flex                          libnl                      opkg-native                     systemd
busybox                                       flex-native                   libnsl2                    opkg-utils                      systemd-compat-units
bzip2                                         gawk                          libnsl2-native             opkg-utils-native               systemd-conf
bzip2-native                                  gcc-cross-arm                 libnss-mdns                optee-client-imx                systemd-serialgetty
ca-certificates                               gcc-runtime                   libogg                     optee-os-imx                    systemd-systemctl-native
chrpath-native                                gdbm                          libpcap                    optee-test-imx                  tcpdump
cmake-native                                  gdbm-native                   libpcre                    os-release                      tcp-wrappers
core-image-base                               gettext-minimal-native        libpcre-native             packagegroup-base               tele-set
core-image-base-imx6sxsabresd-20201027081937 gettext-native                librepo-native             packagegroup-core-boot          texinfo-dummy-native
........

$ ls tmp/deploy/licenses/u-boot-imx/
generic_GPLv2  gpl-2.0.txt  recipeinfo

$ ls tmp/deploy/licenses/gcc-cross-arm/
COPYING  COPYING3  COPYING3.LIB  COPYING.LIB  COPYING.RUNTIME  generic_GPL-3.0-with-GCC-exception  generic_GPLv3  recipeinfo

  • Image에서 사용되어진 License 확인 
사용되어진 Image의 Package들의 License 정보를 알파벳순서로  확인가능하지만, 
주의해야할 것은 모두 나오지는 않으며, 안나오는 것은 상위 Package에서 직접보자.

안나오는 경우는 LICENSECLOSE해버리면 당연히 나오지 않게된다.

나의 경우 간단히 Uboot와 Yocto에서 사용되어지는 Python의 License들은 나오지 않았다.

$ bitbake -e | grep ^MACHINE_ARCH
MACHINE_ARCH="imx6sxsabresd"
MACHINE_ARCH_FILTER="virtual/kernel"

$ bitbake -e | grep ^TUNE_PKGARCH
TUNE_PKGARCH="cortexa9hf-neon"

$ bitbake -e | grep ^IMAGE

$ cat tmp/deploy/licenses/core-image-base-imx6sxsabresd-20201027081937/image_license.manifest
RECIPE NAME: linux-imx
VERSION: 4.19.35
LICENSE: GPLv2
FILES: imx6sx-sdb-ldo--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-mqs--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-btwifi--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-reva-ldo--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-reva--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-lcdif1--4.19.35-r0-imx6sxsabresd-20201028015422.dtb zImage--4.19.35-r0-imx6sxsabresd-20201028015422.bin imx6sx-sdb--4.19.35-r0-imx6sxsabresd-20201028015422.dtb modules--4.19.35-r0-imx6sxsabresd-20201028015422.tgz imx6sx-sdb-sai--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-emmc--4.19.35-r0-imx6sxsabresd-20201028015422.dtb imx6sx-sdb-m4--4.19.35-r0-imx6sxsabresd-20201028015422.dtb

RECIPE NAME: optee-os-imx
VERSION: git
LICENSE: BSD
FILES: uTee-6sxsdb tee.mx6sxsabresd.bin

RECIPE NAME: u-boot-imx
VERSION: 2019.04
LICENSE: GPLv2+
FILES: u-boot-emmc-2019.04-r0.imx


$ cat tmp/deploy/licenses/core-image-base-imx6sxsabresd-20201105060918/package.manifest
alsa-conf
alsa-state
alsa-states
alsa-utils-alsactl
alsa-utils-alsamixer
avahi-daemon
avahi-locale-en-gb
base-files
base-passwd
bash
binutils
bluez5
busybox
busybox-syslog
busybox-udhcpc
db
dbus-1
e2fsprogs-e2fsck
firmware-imx-sdma
glibc-locale-en-gb
imx-alsa-plugins
iptables
iptables-module-ebt-802-3
iptables-module-ebt-ip
iptables-module-ebt-log
iptables-module-ebt-mark-m
iptables-module-ip6t-ah
iptables-module-ip6t-dnat
iptables-module-ip6t-dnpt
iptables-module-ip6t-dst
iptables-module-ip6t-eui64
iptables-module-ip6t-frag
iptables-module-ip6t-hbh
iptables-module-ip6t-hl
iptables-module-ip6t-icmp6
iptables-module-ip6t-ipv6header
iptables-module-ip6t-log
iptables-module-ip6t-masquerade
......

$ cat tmp/deploy/licenses/core-lora-image-imx6sxsabresd-20201027081937/license.manifest
PACKAGE NAME: alsa-conf
PACKAGE VERSION: 1.1.8
RECIPE NAME: alsa-lib
LICENSE: LGPLv2.1 & GPLv2+

PACKAGE NAME: alsa-lib
PACKAGE VERSION: 1.1.8
RECIPE NAME: alsa-lib
LICENSE: LGPLv2.1 & GPLv2+

PACKAGE NAME: alsa-state
PACKAGE VERSION: 0.2.0
RECIPE NAME: alsa-state
LICENSE: MIT

PACKAGE NAME: alsa-states
PACKAGE VERSION: 0.2.0
RECIPE NAME: alsa-state
LICENSE: MIT

PACKAGE NAME: alsa-utils-alsactl
PACKAGE VERSION: 1.1.8
RECIPE NAME: alsa-utils
LICENSE: GPLv2+

PACKAGE NAME: alsa-utils-alsamixer
PACKAGE VERSION: 1.1.8
RECIPE NAME: alsa-utils
LICENSE: GPLv2+

PACKAGE NAME: avahi-daemon
PACKAGE VERSION: 0.7
RECIPE NAME: avahi
LICENSE: GPLv2+ & LGPLv2.1+

PACKAGE NAME: avahi-locale-en-gb
PACKAGE VERSION: 0.7
RECIPE NAME: avahi
LICENSE: GPLv2+ & LGPLv2.1+

PACKAGE NAME: base-files
PACKAGE VERSION: 3.0.14
RECIPE NAME: base-files
LICENSE: GPLv2

PACKAGE NAME: base-passwd
PACKAGE VERSION: 3.5.29
RECIPE NAME: base-passwd
LICENSE: GPLv2+
......


4/22/2020

Yocto User Config 의 Profiling and Tracing

1. Yocto 의 Profile 기능 추가 및 사용

Yocto 기반으로 Profile 기능과 Trace Debug기능을 추가하여 사용하는 방법을 알아보기 위해서 아래와 같이 설정변경 후,
이를 기반으로 Profile 과 Tracing 사용을 해본다.

Yocto에서 Profile 과 Tracing은 소스를 세부적으로 분석하는 Debug 기술이자, 성능측정도 가능하므로 중요한 기술이다. 
이를 제대로 사용하려면 각 IDE Tool 도 알아두어야 한다
대부분 Ecplise 기반으로 제공되어지며, 각 Chip 제조사 Application들도 보면 기반을 다 Ecplise 기반으로 되어있다. 


TI CCS (TI사 제공) 이외 각 제조사 IDE 참조 


1.1 Yocto 의 기본문법 및 User Config 이해 

Yocto의 기본적인 이해


Yocto Recipe 작성방법 (반드시 확인 및 이해)

Yocto User Configuration 수정방법
  https://ahyuo79.blogspot.com/2020/02/yocto-user-configuration.html

기본 Yocto Recipe 및 Kernel Recipe 수정방법
  https://ahyuo79.blogspot.com/2020/02/yocto-recipe.html

Yocto sysLog 구성 
  https://ahyuo79.blogspot.com/2020/04/yocto-syslogd.html


1.2  Yocto User Configuration 설정변경 

  • Yocto 의 User Configuration 수정 
$ cat conf/local.conf  //일반적인 설정

## Yocto Version에따라 설정변경될 수 있음 아래 Manual 참조
## 일반적인 EXTRA_IMAGE_FEATURES 설정으로 debug 기본정보포함 (기본 /sys/kernel/debug는 동작됨)
EXTRA_IMAGE_FEATURES ?= "debug-tweaks"

별도로 추가하여 설정
## Profile 과 Tracing 을 위해 별도로 추가되는 명령들 
## IMAGE의 Profile Tool을 추가 
EXTRA_IMAGE_FEATURES += "tools-profile"

## Package들에 Debug 정보를 추가 (bitbake를 이용하여 xxx-dbg Manual로 해도됨)
EXTRA_IMAGE_FEATURES += "dbg-pkgs"

## Yocto는 default로 strip을 하여 debug정보 및 삭제하므로 이를 방지 
INHIBIT_PACKAGE_STRIP = "1"

##  *-dbg packages 만들 때 Bin 와 Debug 정보를 어떻게 분리할지를 결정 (bin 에 .debug 생성) 
PACKAGE_DEBUG_SPLIT_STYLE = 'debug-file-directory'

** EXTRA_IMAGE_FEATURES 는 항상 Yocto Version에 따라 반드시 참조 

gdb 와 같이 사용하고자 하면 아래와 같이 설정 
EXTRA_IMAGE_FEATURES += "dbg-pkgs"
EXTRA_IMAGE_FEATURES += "tools-debug"

Yocto에서 deb 방식으로 package 관리할 경우 (apt-get)
  https://imxdev.gitlab.io/tutorial/How_to_apt-get_to_the_Yocto_Project_image/
 
EXTRA_IMAGE_FEATURES 
  https://www.yoctoproject.org/docs/current/ref-manual/ref-manual.html#ref-features-image


1.3 Yocto 의 Kernel Config 수정 

  • WORKDIR 에서 현재 Kernel Config 확인
Yocto의 Build space에서 직접 빌드된 Kernel Source의 Config 확인

$ vi ./tmp/work/imx6sxsabresd-poky-linux-gnueabi/linux-imx/4.19.35-r0/build/.config  //직접 찾아서 확인 
CONFIG_BUILD_LTTNG       //확인했으나 없음
CONFIG_FUNCTION_TRACER   //확인했으나 없음 

$ vi ../sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/linux-imx_4.19.35.bbappend // Kernel Recipe가 문제가 있음 
# 부분 막음 
do_preconfigure_append()   

  https://en.wikipedia.org/wiki/Ftrace


  • Kernel 의 CONFIG 설정변경 

$ bitbake linux-imx  -c configme    // patch 후 *cfg를 적용을 한다고하는데, 동작안됨
$ bitbake linux-imx  -c menuconfig    // 설정변경
//각 메뉴 선택 후 HELP에서 CONFIG 확인가능

//이미 설정되어있음 
> Kernel hacking > Compile-time checks and compiler options > Debug Filesystem (CONFIG_DEBUG_FS)

//새로설정 
> Kernel hacking > Tracers                                            // (CONFIG_FTRACE)
> Kernel hacking > Tracers > Kernel Function Tracer                  // (CONFIG_FUNCTION_TRACER)
> Kernel hacking > Tracers > Kernel Function Graph Tracer            // (CONFIG_FUNCTION_GRAPH_TRACER)
> Kernel hacking > Tracers > Interrupts-off Latency Tracer           // (CONFIG_IRQSOFF_TRACER)
> Kernel hacking > Tracers > Preemption-off Latency Tracer           // (CONFIG_PREEMPT_TRACER)
> Kernel hacking > Tracers > Scheduling Latency Tracer               // (CONFIG_SCHED_TRACER)
> Kernel hacking > Tracers > Trace max stack                         // (CONFIG_STACK_TRACER)
> Kernel hacking > Tracers > Support for tracing block IO actions    // (CONFIG_BLK_DEV_IO_TRACE)
> Kernel hacking > Tracers > Kernel function profiler                // (CONFIG_FUNCTION_PROFILER)
CONFIG_DYNAMIC_FTRACE="y"                                              // 찾지못함 (상위 설정시 자동설정됨)
CONFIG_FTRACE_MCOUNT_RECORD="y"                                        // 찾지못함 (상위 설정시 자동설정됨)


//추후 별도로 추가 
> Kernel hacking > Tracers > Trace syscalls                          // (CONFIG_FTRACE_SYSCALLS) 


fragment가 생성되었으나 이전 .config 의 나의 설정과 다름 (주의)
추후 필요한 것만 직접 적용하여 넣도록하자

$ bitbake linux-imx  -c diffconfig    //*.cfg 생성 후 이를 Kernel Recipe에 추가 
....
......../fragment.cfg

$ cat fragment.cfg  // 상위와 다르게 나옴 자세히 보면 선택한 것도 미선택으로 됨 
CONFIG_TRACEPOINTS=y
CONFIG_UPROBES=y
# CONFIG_NET_DROP_MONITOR is not set
# CONFIG_ATH6KL_TRACING is not set
# CONFIG_MXC_GPU_VIV is not set
CONFIG_BINARY_PRINTF=y
# CONFIG_DEBUG_PAGE_REF is not set
CONFIG_TRACE_IRQFLAGS=y
CONFIG_STACKTRACE=y
CONFIG_NOP_TRACER=y
CONFIG_TRACER_MAX_TRACE=y
CONFIG_TRACE_CLOCK=y
CONFIG_RING_BUFFER=y
CONFIG_EVENT_TRACING=y
CONFIG_CONTEXT_SWITCH_TRACER=y
CONFIG_RING_BUFFER_ALLOW_SWAP=y
CONFIG_PREEMPTIRQ_TRACEPOINTS=y
CONFIG_TRACING=y
CONFIG_GENERIC_TRACER=y
CONFIG_FTRACE=y
CONFIG_FUNCTION_TRACER=y
# CONFIG_FUNCTION_GRAPH_TRACER is not set
CONFIG_TRACE_PREEMPT_TOGGLE=y
# CONFIG_PREEMPTIRQ_EVENTS is not set
CONFIG_IRQSOFF_TRACER=y
CONFIG_PREEMPT_TRACER=y
CONFIG_SCHED_TRACER=y
# CONFIG_HWLAT_TRACER is not set
# CONFIG_FTRACE_SYSCALLS is not set
CONFIG_TRACER_SNAPSHOT=y
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
CONFIG_BRANCH_PROFILE_NONE=y
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
# CONFIG_PROFILE_ALL_BRANCHES is not set
CONFIG_STACK_TRACER=y
CONFIG_BLK_DEV_IO_TRACE=y
CONFIG_UPROBE_EVENTS=y
CONFIG_PROBE_EVENTS=y
CONFIG_DYNAMIC_FTRACE=y
CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
CONFIG_FUNCTION_PROFILER=y
CONFIG_FTRACE_MCOUNT_RECORD=y
# CONFIG_FTRACE_STARTUP_TEST is not set
# CONFIG_TRACEPOINT_BENCHMARK is not set
# CONFIG_RING_BUFFER_BENCHMARK is not set
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
# CONFIG_PREEMPTIRQ_DELAY_TEST is not set
# CONFIG_TRACE_EVAL_MAP_FILE is not set
CONFIG_TRACING_EVENTS_GPIO=y

$ cp ./build/tmp/work/imx6sxsabresd-poky-linux-gnueabi/linux-imx/4.19.35-r0/fragment.cfg ../sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-kernel/linux/files/kernel_ftrace.cfg
//적용 Kernel Recipe 수정 

ftrace 의 Kernel config 설정
  https://stackoverflow.com/questions/41238386/how-to-enable-or-configure-ftrace-module
  https://docs.google.com/presentation/d/13zIFUTTdChr7JNpZnb1K56aUsv_E1cOWausjQpsqcGc/htmlpresent
  https://docs.windriver.com/bundle/Wind_River_Linux_Tutorial_Dynamic_Kernel_Debugging_with_ftrace_and_kprobes_LTS_1/page/zjd1552591139310.html

  • Kernel 만 다시빌드 및 배포

$ bitbake linux-imx  -c compile -f    // -f force로 강제로 빌드 후 .config 설정확인 
$ bitbake linux-imx  -c deploy        // 이를 적용 

$ bitbake linux-imx  -c clean        // 전체삭제 
$ bitbake linux-imx          // 전체동작 (오동작) 
$ bitbake linux-imx  -c configure         // 전체동작 (오동작) 


  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#var-KBUILD_DEFCONFIG
  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#kernel-related-tasks

  • bitbake로 image 생성
$ bitbake core-image-base 


Yocto Profile manual
Zeus(3.0)
  https://yoctoproject.org/docs/3.0/profile-manual/profile-manual.html
Warrior(2.7)
  https://yoctoproject.org/docs/2.7/profile-manual/profile-manual.html
Fido(1.8)
  https://yoctoproject.org/docs/1.8/profile-manual/profile-manual.html


1.4  Yocto 설정 변경 시 문제사항 

  • 처음 발생하는 문제
Parition을 고정 크기를 했을 경우, Debug 정보가 들어가기 때문에 나의 경우는 약 4배 좀 더 용량이 더 커져서 문제발생
이 문제는 아래의 WIC 부분 참조

  • 두번째 발생하는 문제
빌드가 잘 된 후 아래와 같이 Image를 적용 후 Booting 하며 문제발생
아래문제도 역시 /var/log 와 kernel size 문제를 제거후 해결됨
.......
         Starting Flush Journal to Persistent Storage...
systemd-journald[164]: Received request to flush runtime journal from PID 1
[  OK  ] Started Flush Journal to Persistent Storage.
[    **] A start job is running for dev-mmcblk3p5.device (24s / 1min 30s)random: crng init done
random: 7 urandom warning(s) missed due to ratelimiting
[ TIME ] Timed out waiting for device dev-mmcblk3p5.device.

  https://www.linode.com/community/questions/17915/why-did-my-server-miss-urandom-warnings-due-to-rate-limiting


Yocto 의 WIC Partition (해결방법)
  1. Partition Size도 가변사이즈로 변경(고정사이즈일 경우) 
  2. Partition 도 삭제했다면 sources에서도 fstab도 같이 수정 
  3. /var/log 부분기능삭제
  https://ahyuo79.blogspot.com/2020/02/yocto-partition.html


2. Yocto의 Profile 및 Trace 확인 및 사용


  • 현재 설정된 기본기능확인 (EXTRA_IMAGE_FEATURES 확인)

$ cat /etc/fstab    // /sys/debug/kernel 별도로 없으며, 상위 debug-tweaks 참조  

$ ls /sys/kernel/debug  // 상위 (EXTRA_IMAGE_FEATURES ?= "debug-tweaks") 적용 부터 동작 
2100000.caam/       extfrag/            pm_genpd/
bdi/                fault_around_bytes  pm_qos/
block/              gpio                pwm
ci_hdrc.0/          hid/                regmap/
ci_hdrc.1/          iio/                regulator/
clear_warn_once     memblock/           sleep_time
clk/                mmc2/               suspend_stats
device_component/   mmc3/               ubi/
devices_deferred    mtd/                ubifs/
dma_buf/            opp/                usb/
dri/                pinctrl/            wakeup_sources

$ cat /sys/kernel/debug/gpio  // GPIO Debug   (sysfs도 이용하지만, device tree에서 직접 모듈로 연결가능) 
....
 gpio-112 (                    |peri_3v3            ) out hi  // sys file이 아닌 device tree에서 gpio 연결 
 ...
 gpio-114 (                    |sysfs               ) out lo         
 ...
 gpio-160 (                    |sysfs               ) out hi  // sys file에서 export 한 다음 direction 설정 후 값 설정
 gpio-161 (                    |sysfs               ) out hi
 gpio-170 (                    |spi_imx             ) out hi

// PinCtrl 관련설정값을 쉽게 확인 (device tree의 설정값과 비교) 
$ cat /sys/kernel/debug/pinctrl/pinctrl-handles 

// PinCtrl 관련설정값을 세부적으로 확인 (device tree의 설정값과 비교) 
$ cat /sys/kernel/debug/pinctrl/pinctrl-maps 

// USB 정보 lsusb 
$ cat /sys/kernel/debug/usb/devices

T:  Bus=01 Lev=00 Prnt=00 Port=00 Cnt=00 Dev#=  1 Spd=480  MxCh= 1
B:  Alloc=  0/800 us ( 0%), #Int=  1, #Iso=  0
D:  Ver= 2.00 Cls=09(hub  ) Sub=00 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=1d6b ProdID=0002 Rev= 4.19
S:  Manufacturer=Linux 4.19.35-1.1.0+g0f9917c ehci_hcd
S:  Product=EHCI Host Controller
S:  SerialNumber=ci_hdrc.1
C:* #Ifs= 1 Cfg#= 1 Atr=e0 MxPwr=  0mA
I:* If#= 0 Alt= 0 #EPs= 1 Cls=09(hub  ) Sub=00 Prot=00 Driver=hub
E:  Ad=81(I) Atr=03(Int.) MxPS=   4 Ivl=256ms 
......

// PMIC Regulator 정보 
$ ls /sys/kernel/debug/regulator/   
0-0008-COIN
0-0008-SW1AB
0-0008-SW2
0-0008-SW3A
0-0008-SW3B
0-0008-SWBST
0-0008-VGEN1
0-0008-VGEN2
0-0008-VGEN3
0-0008-VGEN4
0-0008-VGEN5
0-0008-VGEN6
0-0008-VREFDDR
0-0008-VSNVS
.......


$ perf  // EXTRA_IMAGE_FEATURES 추가설정 후 존재확인

$ lttng           // lttng          확인
$ lttng-crash     // lttng-crash    확인
$ lttng-relayd    // lttng-relayd   확인
$ lttng-sessiond  // lttng-sessiond 확인

$ babeltrace      // babeltrace 확인
$ babeltrace-log  // babeltrace-log

$ blktrace  //blktrace  존재확인  (Block Device Trace) 
$ blkparse  //blkparse  존재확인   
$ iowatcher  //blktrace  visual tool   

$ dtrace  //dtrace  

$ ls /sys/kernel/debug/tracing  // 미존재하면 Kernel Config 수정 필요 
README                      set_ftrace_filter
available_events            set_ftrace_notrace
available_filter_functions  set_ftrace_pid
available_tracers           snapshot
buffer_size_kb              stack_max_size
buffer_total_size_kb        stack_trace
current_tracer              stack_trace_filter
dyn_ftrace_total_info       timestamp_mode
enabled_functions           trace
events                      trace_clock
free_buffer                 trace_marker
function_profile_enabled    trace_marker_raw
instances                   trace_options
options                     trace_pipe
per_cpu                     trace_stat
printk_formats              tracing_cpumask
saved_cmdlines              tracing_max_latency
saved_cmdlines_size         tracing_on
saved_tgids                 tracing_thresh
set_event                   uprobe_events
set_event_pid               uprobe_profile


2.1 Ftrace의 기본동작 확인 


$ mount -t debugfs nodev /sys/kernel/debug

$ echo 1 > /sys/kernel/debug/tracing/events/sched/sched_wakeup/enable
$ echo 1 > /sys/kernel/debug/tracing/events/sched/sched_switch/enable
$ echo 1 > /sys/kernel/debug/tracing/events/syscalls/enable

## Start Recording 
$ echo 1 > /sys/kernel/debug/tracing/tracing_on

$ cat /sys/kernel/debug/tracing/trace > myFtraceFile.txt


$ cat myFtraceFile.txt  | head -n 20
# tracer: nop
#
# entries-in-buffer/entries-written: 6606/6606   #P:1
#
#                              _-----=> irqs-off
#                             / _----=> need-resched
#                            | / _---=> hardirq/softirq
#                            || / _--=> preempt-depth
#                            ||| /     delay
#           TASK-PID   CPU#  ||||    TIMESTAMP  FUNCTION
#              | |       |   ||||       |         |
          <idle>-0     [000] dns4  2163.718052: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.718080: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.728019: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dnH5  2163.728046: sched_wakeup: comm=kworker/0:0 pid=342 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.728068: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.738009: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.738035: sched_wakeup: comm=rcu_sched pid=11 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.758001: sched_wakeup: comm=kworker/0:0 pid=342 prio=120 target_cpu=000
          <idle>-0     [000] dns4  2163.768017: sched_wakeup: comm=rcu_preempt pid=10 prio=120 target_cpu=000



  https://archive.eclipse.org/tracecompass.incubator/doc/org.eclipse.tracecompass.incubator.ftrace.doc.user/User-Guide.html
  https://archive.eclipse.org/tracecompass/doc/stable/org.eclipse.tracecompass.doc.user/Trace-Compass-Main-Features.html
  https://archive.eclipse.org/tracecompass.incubator/doc/org.eclipse.tracecompass.incubator.kernel.doc.user/User-Guide.html


2.2 LTTng 사용방법

아래와 같이 Ecplise를 이용하여 LTTng와 함께 쉽게 디버깅가능  

  • LTTng Command 사용법 및 Trace Compass or Ecplise에서 분석

$ lttng create mySession  // Trace Compass or Ecplise 의 LTTng의 Control의 SSH로 접속가능 

$ lttng enable-event sched_switch -k   // Trace Compass의 Control의 Provider의 Kernel에서도 설정가능 

$ lttng start // Trace Compass의 Control의 Session의 mySession에서 Start 가능 

$ lttng stop // Trace Compass의 Control의 Session의 mySession에서 Stop 가능 

$ lttng view // Consol에서 정보보기 

$ lttng destroy mySession  // 본인이 필요 없다면 삭제 , 분석을 한다면 미삭제 

$ tar cvzf lttngtest.tar.gz lttng-traces   // 이안에 상위에서 만든 각각의 Session들이 존재 



  • Ecplise 에서 LTTng 분석 
  1. LTTng->Control에서는 SSH로 Target에 연결하여 Control로 가능 
  2. lttng create Session만 진행 후 모든 것을 Remote로 진행가능 
  3. 상위에서 저장된 lttngtest.tar.gz 정보를 Trace Project에서 import하여 분석가능도 가능 


관련참조자료 
  https://www.nxp.com/docs/en/application-note/AN5172.pdf


3. EXTRA_IMAGE_FEATURE의 확장 설정 

User Config의 local config 부분에 확장추가 
$ cat conf/local.conf
## Yocto Profile Manual 부분의 참고 (미테스트)
## Profile Tool (perf, systemtap, and LTTng ) 설치  (Warrior 사용가능)
EXTRA_IMAGE_FEATURES += "perf"

## Debugging Tool 설치 ( strace and gdb)  (Warrior 사용가능)
EXTRA_IMAGE_FEATURES += "tools-debug"


  https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#General_Setup
  https://wiki.yoctoproject.org/wiki/Tracing_and_Profiling#Collecting_and_viewing_a_trace_in_Eclipse



  • IMAGE_FEATURE  기능의 변화
사용되는 Yocto의 Version에 따라 IMAGE FEATURE의 기능이 다르므로 주의

Zeus(3.0)
  https://www.yoctoproject.org/docs/3.0/ref-manual/ref-manual.html#ref-features-image
Warrior(2.7)
  https://www.yoctoproject.org/docs/2.7/ref-manual/ref-manual.html#ref-features-image
Fido(1.8)
  https://www.yoctoproject.org/docs/1.8/ref-manual/ref-manual.html#ref-features-image


Yocto SDK Manual
  https://www.yoctoproject.org/docs/2.7/sdk-manual/sdk-manual.html


Intel Vtune
  https://software.intel.com/content/www/us/en/develop/documentation/vtune-help/top/set-up-analysis-target/embedded-linux-targets/configure-yocto-project-with-linux-target-package.html
  https://software.intel.com/content/www/us/en/develop/documentation/vtune-help/top.html

4/05/2020

Yocto 에서 syslogd/logrotate 와 Package 중복사용

1. syslogd 와 logrotate 관련 사항 

syslogd 관련이해
Yocto에 추가하기 전에 syslog를 먼저 이해하도록하자 


Yocto Recipe 작성방법 


Yocto에서 syslogd를 사용할 경우 일반적으로 busybox에 포함된 package로 많이 사용할 것이며, 그 기준으로 설명한다.

기본적으로 syslogd 와 logrotate 는 busybox에서 제공해주지만, 완벽한 기능이 아니라서 별도로 각가 설치를 해주면 된다. 

  • logrotate package 지원
busybox에서도 logrotate를 지원해주지만, logrotate package를 설치하는 것이 더 좋다 

IMAGE_INSTALL += "logrotate" 

  • rsyslogd or syslog-ng package 지원 
busybox의 syslogd가 기본지원이지만 확장하고자 하면 설정하며, ubuntu가 rsyslogd 사용하여 나중에 이것으로 사용
IMAGE_INSTALL += "rsyslog" 

1.1. busybox의 사용할 경우 한계


busybox의 syslogd의 경우 좀 특별하게 설정이 되며, 설정에 따라 rotate의 기능이 기본제공이 되며 아래와 같이 동작된다.
예를들면, 200K 기준으로 2개의 Message들을 보관하고 2개로 Rotate를 진행하는데, 이 부분은 아래의 소스를 참조
  1. /var/log/messages    (latest)
  2. /var/log/messages.0  (200k까지 보관)

busybox 소스에서 200K로 1번의 rotate가 가능하며, 이부분은 소스에서 직접수정가능

이 busybox의 rotate 기능은  logrotate기능과는 너무 부족하므로 , logrotate를 별도로 사용할 경우 사용중지하는 것이 맞을 것 같다. 

/var/log/messages.0 관련내용 
  https://www.unix.com/unix-for-dummies-questions-and-answers/183205-why-there-var-adm-messages-0-messages-1-messages-2-messages-3-a.html


  • busybox-syslogd 와 rotate 기능 소스분석 
busybox의 syslogd 소스를 분석을 해보면 아래와 같이 200K 저장되는 Logrotate기능이 내부에 별도로 존재한다.
busybox 말고 별도의 Logrotate Package를 사용하고자 하면 CONFIG_FEATURE_ROTATE_LOGFILE 부분을 막자

.........
//config:config SYSLOGD
//config:	bool "syslogd (13 kb)"
//config:	default y
//config:	help
//config:	The syslogd utility is used to record logs of all the
//config:	significant events that occur on a system. Every
//config:	message that is logged records the date and time of the
//config:	event, and will generally also record the name of the
//config:	application that generated the message. When used in
//config:	conjunction with klogd, messages from the Linux kernel
//config:	can also be recorded. This is terribly useful,
//config:	especially for finding what happened when something goes
//config:	wrong. And something almost always will go wrong if
//config:	you wait long enough....
//config:config FEATURE_ROTATE_LOGFILE
//config:	bool "Rotate message files"
//config:	default y
//config:	depends on SYSLOGD
//config:	help
//config:	This enables syslogd to rotate the message files
//config:	on his own. No need to use an external rotate script.
.........
typedef struct logFile_t {
	const char *path;
	int fd;
	time_t last_log_time;
#if ENABLE_FEATURE_ROTATE_LOGFILE
	unsigned size;
	uint8_t isRegular;
#endif
} logFile_t;
.....

#if ENABLE_FEATURE_ROTATE_LOGFILE      // LOG 사이즈 200K 확인 
 .logFileSize = 200 * 1024,
 .logFileRotate = 1,
#endif

......

ENABLE_FEATURE_ROTATE_LOGFILE 관련소스확인
  https://git.busybox.net/busybox/tree/sysklogd/syslogd.c

  • Yocto 의 Busybox 관련 Recipe 분석

$ find . -name busybox*bb*  // Yocto의 busybox recipe 모두 확인하며, 중복되면 Version 높은것만 확인  
./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend  // 3. 최종 bbappend 확인  
./poky/meta/recipes-core/busybox/busybox_1.30.1.bb        // 1. Main busybox recipe 
./poky/meta/recipes-core/busybox/busybox-inittab_1.30.1.bb       // SysVinit 일 경우 /etc/inittab 사용, 미사용
./poky/meta-skeleton/recipes-core/busybox/busybox_%.bbappend
./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend  // 2. Main busybox recipe의 bbappend 반드시 확인  

// 1.Main busybox recipe 기반으로 분석 및 관련 cfg 와 patch 확인
$ cat ./poky/meta/recipes-core/busybox/busybox_1.30.1.bb  
require busybox.inc

SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
           file://busybox-udhcpc-no_deconfig.patch \
           file://find-touchscreen.sh \
           file://busybox-cron \
           file://busybox-httpd \
           file://busybox-udhcpd \
           file://default.script \
           file://simple.script \
           file://hwclock.sh \
           file://mount.busybox \
           file://syslog \
           file://syslog-startup.conf \
           file://syslog.conf \
           file://busybox-syslog.default \
           file://mdev \
           file://mdev.conf \
           file://mdev-mount.sh \
           file://umount.busybox \
           file://defconfig \
           file://busybox-syslog.service.in \
           file://busybox-klogd.service.in \
           file://fail_on_no_media.patch \
           file://run-ptest \
           file://inetd.conf \
           file://inetd \
           file://login-utilities.cfg \
           file://recognize_connmand.patch \
           file://busybox-cross-menuconfig.patch \
           file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \
           file://mount-via-label.cfg \
           file://sha1sum.cfg \
           file://sha256sum.cfg \
           file://getopts.cfg \
           file://resize.cfg \
           ${@["", "file://init.cfg"][(d.getVar('VIRTUAL-RUNTIME_init_manager') == 'busybox')]} \
           ${@["", "file://mdev.cfg"][(d.getVar('VIRTUAL-RUNTIME_dev_manager') == 'busybox-mdev')]} \
           file://syslog.cfg \
           file://inittab \
           file://rcS \
           file://rcK \
           file://makefile-libbb-race.patch \
           file://0001-testsuite-check-uudecode-before-using-it.patch \
           file://0001-testsuite-use-www.example.org-for-wget-test-cases.patch \
           file://0001-du-l-works-fix-to-use-145-instead-of-144.patch \
           file://0001-dc.tests-fix-two-test-case-to-also-depend-on-DC_BIG.patch \
"
SRC_URI_append_libc-musl = " file://musl.cfg "

SRC_URI[tarball.md5sum] = "4f72fc6abd736d5f4741fc4a2485547a"
SRC_URI[tarball.sha256sum] = "3d1d04a4dbd34048f4794815a5c48ebb9eb53c5277e09ffffc060323b95dfbdc"

$ cat ./poky/meta-poky/recipes-core/busybox/busybox_%.bbappend // 2. Main busybox recipe의 bbappend 반드시 확인  
FILESEXTRAPATHS_prepend := "${THISDIR}/${BPN}:"
///BPN 은 일반적으로 PN Package Name 의 Version 이라고 하는데 다만 prefix 와 suffix가 제거된상태 

$ ls ./poky/meta-poky/recipes-core/busybox/  // bbappend 에 적용되는 busybox directory 확인  
busybox  busybox_%.bbappend

// 3. 최종 bbappend 과 관련파일 반드시 확인  
$ cat ./meta-fsl-bsp-release/imx/meta-bsp/recipes-core/busybox/busybox_%.bbappend 

# look for files in the layer first
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://ftpget.cfg"

// Yocto의 경우 다른 *.cfg / *.patch 
$ ls ./poky/meta/recipes-core/busybox/busybox/


1.2. busybox의 logrotate 제거 

  • Busybox의 Config 설정변경 (Yocto)
기본 config에서 CONFIG_FEATURE_ROTATE_LOGFILE 설정제거(*.cfg 이용)
이미 IMAGE_INSTALL에 logrotate 추가했다면 상위 CONFIG를 제거

$ cat ./poky/meta-poky/recipes-core/busybox/busybox/poky-tiny/defconfig  // 기본 busybox Config
...
#
# System Logging Utilities
#
CONFIG_SYSLOGD=y
CONFIG_FEATURE_ROTATE_LOGFILE=y
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=16
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_KLOGD=y
CONFIG_FEATURE_KLOGD_KLOGCTL=y
CONFIG_LOGGER=y

// Recipe의 *.cfg의 추가 config가 존재한다면, 이 값에 따라 변경 (주의)
$ cat ./poky/meta/recipes-core/busybox/busybox/syslog.cfg 
CONFIG_SYSLOGD=y
# CONFIG_FEATURE_ROTATE_LOGFILE is not set
CONFIG_FEATURE_REMOTE_LOG=y
CONFIG_FEATURE_SYSLOGD_DUP=y
CONFIG_FEATURE_SYSLOGD_CFG=y
CONFIG_FEATURE_SYSLOGD_READ_BUFFER_SIZE=256
CONFIG_FEATURE_IPC_SYSLOG=y
CONFIG_FEATURE_IPC_SYSLOG_BUFFER_SIZE=64
CONFIG_LOGREAD=y
CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING=y
CONFIG_FEATURE_KMSG_SYSLOG=y 

설정참고
  https://stackoverflow.com/questions/41868231/how-to-setup-syslog-in-yocto

  • syslog.conf 관련설정 부분 확인

$ find . -name syslog.conf
$ cat ./poky/meta/recipes-core/busybox/files/syslog.conf     // 이곳에서 /etc/syslog.conf 수정하면 적용됨
$ cat ./poky/meta/recipes-extended/sysklogd/files/syslog.conf  // /etc/syslog.conf 확장이라고 추정 

// sysVinit 일 경우, systemd만 사용할 경우는 제외(추후 확인)
$ cat ./poky/meta/recipes-core/busybox/files/syslog-startup.conf   
# This configuration file is used by the busybox syslog init script,
# /etc/init.d/syslog[.busybox] to set syslog configuration at start time.

DESTINATION=file  # log destinations (buffer file remote)
LOGFILE=/var/log/messages # where to log (file)
REMOTE=loghost:514  # where to log (syslog remote)
REDUCE=no   # reduce-size logging
DROPDUPLICATES=no  # whether to drop duplicate log entries
#ROTATESIZE=0   # rotate log if grown beyond X [kByte]
#ROTATEGENS=3   # keep X generations of rotated logs
BUFFERSIZE=64   # size of circular buffer [kByte]
FOREGROUND=no   # run in foreground (don't use!)
#LOGLEVEL=5   # local log level (between 1 and 8)


yocto 사용시 busybox syslogd 설정
  https://stackoverrun.com/ko/q/11519947


2. busybox 이외 Package 사용시 문제사항


Linux에서 필요한 기본 Util들을 다루며, Embedded에서는 대부분 BusyBox를 사용하지만, 좀 더 나은 binary를 사용하고자 하면, 
util-linux 와 각 Package들이 겹치고 다른 Package들과 겹치는 문제가 자주 생긴다. 


2.1 util-linux 와 busybox package 중복될 경우 

Yocto 내부에서 Package가 중복이 될 때 사용하는 class로 update-alternatives.class를 사용하며, 이 부분을 이해하자.

  • util-linux 의 Package List
Util Linux의 Package 관련사항 
  https://en.wikipedia.org/wiki/Util-linux


  • util-linux Package 추가 (중요)
대부분 Yocto에서 core-Image-base로 build 할 경우 util-linux를 미사용을 하는데, busybox대신 혹은 같이 사용할 경우 반드시 추가

IMAGE_INSTALL += "util-linux"


  • update-alternatives 관련사항
util-linux을 보면 동일한 프로그램이 여러 Package에서 중복 설치가 발생할 수 있으므로, 각각의 중복이 될 경우 대체(ALTERNATIVE)를 사용하여, 이를 해결하도록 한다.  

특히 busybox 와 binutils 와 util-linux 부분이 될 것 같으며, 이런 Package가 설치가 되어 중복이 되는 것을 피하기 위해서 이 class를 사용한다.
피하는 방법은 rename 방식으로 이를 link를 만들어 사용하는 것이므로 기본 사용법은 알아두자.
   
  ALTERNATIVE : 중복이 될 경우 대체가 될 command들을 기술 
  ALTERNATIVE_LINK_NAME: 중복이 되면 실제 위치들을 각 기술 
  ALTERNATIVE_PRIORITY: 중복이 되면, 이값을 각 기술하여 설치 우선순위 결정  
  ALTERNATIVE_TARGET: 기본으로 ALTERNATIVE_LINK_NAME값과 동일하며, 링크생성

Warrior(2.7)
Fido(1.8)



2.2 util-linux recipe 소스 분석 (intel)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작가능하며,  busybox 설치되어있는 경우, 각 설정을 ALTERNATIVE로 설정  

  • util-linux 기본분석 (Intel Yocto)
  1. SRC_URI를 이용하여 util-linux 소스 download
  2. PACKAGES 에 사용하고자하는 util-linux-xxx PACKAGE들을 추가 
  3. FILE_util-linux-xxxx 사용할 PACKAGE들의 저장장소 설정 
  4. ALTERNATIVE_PRIORITY 전체 대체될 Package들 우선순위 busybox 조율 
  5. ALTERNATIVE_${PN} 안에 대체가 될 Package 들 기술
  6. ALTERNATIVE_util-linux-hwclock 상위와 동일하지만, PN 직접기술 
  7. ALTERNATIVE_LINK_NAME busybox 의 것들을 기술
  8. ALTERNATIVE_TARGET  default link를 생성하여 실제 사용결정   
Intel의 Yocto는 busybox 와 겹치는 경우 util-linux 실제 설정 


2.3 util-linux recipe 소스 분석 (poky)

먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작하며, 기본소스를 보면 대체적으로, 이미 busybox 설치될 경우 util-linux로 대체됨 

  • Poky에서 util-linux 부분 분석
  1. SRC_URI를 이용하여 BP 즉 Base Recipe 이름과 동일하게 Download
  2. PACKAGES =+ "${PN}-swaponoff"  , 이 util-linux-swaponoff는 나중에 추가
  3. PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', '${PN}-pylibmount', '', d)}"  는 util-linux-pylibmount  미리 추가 
  4. PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages "   python 함수 사용
  5. PACKAGESPLITFUNCS =+ "util_linux_libpackages"  python 함수 사용
  6. python 함수를 분석을 해봐도 PACKAGE는 두개만 사용함 

  • util_linux_binpackages 의 pkg_hook 함수 분석
  1. PACKAGE들을 읽어서 RRECOMMENDS_ 추가 (PACKAGE의 종속성문제)
  2. ALTERNATIVE_PN 가 존재하면 return 종료
  3. ALTERNATIVE_LINK_NAME 이 module 과 동일하면 ALTERNATIVE_PN 설정
    
  • util_linux_binpackages (말그대로 util-linux package 관리)
이상한 것은 PACKAGES do_split_packages로 구분관리하는것이 조금 이상하지만, 일단 이해만 하도록하자. 
.....
// 아래부터 시작되며, PACKAGES 대신 직접 함수로 Package 관리 
    bindirs = sorted(list(set(d.expand("${base_sbindir} ${base_bindir} ${sbindir} ${bindir}").split())))
    for dir in bindirs:
        do_split_packages(d, root=dir,
                          file_regex=r'(.*)', output_pattern='${PN}-%s',
                          description='${PN} %s',
                          hook=pkg_hook, extra_depends='')
    .......

  1. do_split_packages 함수 이용하여 PACKAGE관리하며, 매번 pkg_hook 호출 
  2. 중략
  3. 결론적으로 ALTERNATIVE를 비롯하여 FILE을 자동관리


추가시 busybox 대신 util-linux 용 package가 변경됨

3/15/2020

Raspberry Pi3 에 Yocto 와 Qt 적용한 Image (정리못함)

1. Raspberry Pi 와 Qt5 관련정보사항 


Yocto Recipe 작성방법 


기본적으로 Raspberry Pi 기반으로 나만의 Qt를 이용하여 나만의 Yocto로 구성하고자하는 마음으로 이것을 시작했다. 

  • Raspberry Pi용 Image 생성 (Yocto 기반)
Raspberry Pi에 적용할 Yocto 기반으로 구성된 Qt를 포함 Image를 생성하는 방법 
  1. 이미 구성된 Yocto Layer들과 Recipe들을 직접 Download 
  2. Yocto의 각 Layer들 별로 Download 후 별도의 Image Recipe를 구성하여 빌드 

간단하게만 Build 테스트 만 했지만, 실제로 Image를 Write해서 다 확인하지는 않았으며, 틀린부분은 추후 시간이 있을 때 수정하여 보완하도록 하자.

  • 상위 진행결과   
완벽히는 구성을 못했지만, Qt기반으로 실행가능한 정도로만 구성하여 동작확인을 하였다. 
아래와 같이 Laptop이 아래와 같이 Ubuntu Laptop 지워져서 정리 포기함  

상위 부분은 앞으로 진행못할 거 같으며, 추후 기회가 있다면 그때 다시 하도록 하자. 
그리고, 아래의 내용은 이전에 정리해둔 것이므로 나중에 참조만 하도록하자.
이후 변경된 내용은 백업을 못한 내 잘못이 더 크다. 

그리고, 칩제조사 TI/NXP에서 제공하는 Yocto가 아닌 Poky 와 OpenEmbedded 기반으로 간단하게 구성하여 누구나 할 수 있다. 


1.1  이미 구성된 Yocto 기반으로 Image 생성 

Yocto를 별도로 구성할 필요 없이 repo를 이용하여 Yocto를 전체 Layer들을 직접 Download 한 후 Manual 대로 설정 한 후 bitbake로 실행하여 Image 생성 


QT 관련설치
  https://doc.qt.io/QtForDeviceCreation/qtee-custom-embedded-linux-image.html
  https://code.qt.io/cgit/yocto/boot2qt-manifest.git/tree/

  • 기존에 존재하는 Yocto (QT 테스트)
아래와 같이 처음 Qt 테스트 진행 
$ sudo apt-get install gawk curl git-core git-lfs diffstat unzip texinfo build-essential \
chrpath libsdl1.2-dev xterm gperf bison gcc-multilib g++-multilib repo

$ cd rasp-qt

$ repo init -u git://code.qt.io/yocto/boot2qt-manifest -m warrior.xml  // ok

$ repo init -u git://code.qt.io/yocto/boot2qt-manifest -m zeus.xml // not work 

$ repo sync

$ MACHINE=raspberrypi3 source ./setup-environment.sh

$ bitbake b2qt-embedded-qt5-image

$ bitbake meta-toolchain-b2qt-embedded-qt5-sdk


2. Yocto 의 Layer를 직접 구성 후 Image 생성 

본인이 Yocto의 Main인 Poky 부터 필요한 Layer들을 각 모아서 구성한 후, 필요한 Image recipe 역시 직접 만들어서 구성한 후, 
이 기반으로 최종 Raspberry Pi Image 생성 

  • 이전에 구성한 Raspberry Pi Yocto 

  • Yocto에서 먼저확인 해봐야할 것
Yocto의 Version 정보와 Dependencies 이 될 것 같다. 
항상 최신버전만을 받았지만, 이번에는 다양한 Version을 받아보기 위해서 일단 아래에서 branch 정보를 파악해서 원하는 것으로 받기로 했다.

  • QT 설치방법 
현재 Image가 안되며, layer를 추가한 후 아래 medium을 똑같이 해보자
  https://makersweb.net/embedded/12540
  https://medium.com/@shigmas/yocto-pi-and-qt-e9f2df38a610
  https://jumpnowtek.com/rpi/Raspberry-Pi-Systems-with-Yocto.html

  • Yocto Version(Branch) 정보확인 
Yocto에 Version에 부여된 이름이 각각 존재 (zeus로 version(branch) 결정)

  • 본인 설치할 Layer 선택
  1. ref -> Branch 및 Tag  확인 
  2. about->Dependencies 확인 
  http://git.yoctoproject.org/cgit.cgi/
  https://www.yoctoproject.org/software-overview/layers/
  http://layers.openembedded.org/layerindex/branch/master/layers/


  • meta-raspberrypi 의 branch 파악
Yocto version: zeus 파악
  http://git.yoctoproject.org/cgit.cgi/meta-raspberrypi/refs/
  https://js94.tistory.com/entry/Yocto-Project-Reference-manual-chap3-35

  • Yocto 의 Layer를 각 구성 방법  
  1. 상위와는 다르게 각각의 Layer들을 별도로 다운받아 본인 직접구성 (poky, openembedded)
  2. 별도의 Layer들을 추가하는 방식으로 구성
  3. 추후 더 필요하다면 확장하는 방식으로 구성 
$ mkdir -p works/raspberrypi/sources

$ cd works/raspberrypi/source

$ pwd
/home/jhlee/works/raspberrypi/sources

$ git clone -b zeus  git://git.yoctoproject.org/poky
$ git clone -b zeus  git://git.openembedded.org/meta-openembedded
$ git clone -b zeus  https://github.com/agherzan/meta-raspberrypi
$ git clone -b zeus  git://github.com/meta-qt5/meta-qt5.git       // 처음에 못찾다가 상위 Layer에서 찾음 


  • 기본구성 후 conf/machine 확인 
우선 machine Layer 의 설정을 알기 위해서 검색 
물론 QEMU도 확인가능 
$ find . -name machine | xargs ls   // conf/machine 관련된 부분 전부 검색 
./meta-raspberrypi/conf/machine:
include     raspberrypi0-wifi.conf  raspberrypi3-64.conf  raspberrypi4-64.conf  raspberrypi-cm3.conf  raspberrypi.conf
raspberrypi0.conf  raspberrypi2.conf    raspberrypi3.conf  raspberrypi4.conf     raspberrypi-cm.conf

./poky/meta/conf/machine:
include  qemuarm.conf qemumips64.conf  qemuppc.conf    qemux86-64.conf
qemuarm64.conf qemuarmv5.conf qemumips.conf  qemuriscv64.conf  qemux86.conf

./poky/meta-selftest/conf/machine:
qemux86copy.conf

./poky/meta-yocto-bsp/conf/machine:
beaglebone-yocto.conf  edgerouter.conf genericx86-64.conf  genericx86.conf  include  mpc8315e-rdb.conf 

MACHINE 설정부터 BBLAYERS 확인  
$ find . -name local.conf*  // conf/local.conf 부분 검색 
./poky/meta-poky/conf/local.conf.sample
./poky/meta-poky/conf/local.conf.sample.extended


$ vi ./poky/meta-poky/conf/local.conf.sample  // 추후 build에 이 파일 기준으로 적용됨 
....
MACHINE ?= "raspberrypi3-64"
# This sets the default machine to be qemux86-64 if no other machine is selected:
#MACHINE ??= "qemux86-64"


$ vi ./poky/meta-poky/conf/bblayers.conf.sample // 추후 build에 이 파일 기준으로 적용됨, Build 설정 이후로 수정하기로 결정  

BBLAYERS ?= " \
  ##OEROOT##/meta \
  ##OEROOT##/meta-poky \
  ##OEROOT##/meta-yocto-bsp \
  "

  • 현재 구성된 Yocto 구성도 

$ pwd
/home/jhlee/works/raspberrypi/sources

$ tree -t -L 2   // Yocto 전체 Layer와 각 구성확인 
.
├── meta-openembedded
│   ├── contrib
│   ├── COPYING.MIT
│   ├── meta-filesystems
│   ├── meta-gnome
│   ├── meta-initramfs
│   ├── meta-multimedia
│   ├── meta-networking
│   ├── meta-oe
│   ├── meta-perl
│   ├── meta-python
│   ├── meta-webserver
│   ├── meta-xfce
│   └── README
├── meta-raspberrypi
│   ├── classes
│   ├── conf
│   ├── COPYING.MIT
│   ├── docs
│   ├── dynamic-layers
│   ├── files
│   ├── README.md
│   ├── recipes-bsp
│   ├── recipes-connectivity
│   ├── recipes-core
│   ├── recipes-devtools
│   ├── recipes-graphics
│   ├── recipes-kernel
│   ├── recipes-multimedia
│   └── wic
├── poky
│   ├── bitbake
│   ├── contrib
│   ├── documentation
│   ├── LICENSE
│   ├── LICENSE.GPL-2.0-only
│   ├── LICENSE.MIT
│   ├── meta
│   ├── meta-poky
│   ├── meta-selftest
│   ├── meta-skeleton
│   ├── meta-yocto-bsp
│   ├── oe-init-build-env
│   ├── README.hardware -> meta-yocto-bsp/README.hardware
│   ├── README.OE-Core
│   ├── README.poky -> meta-poky/README.poky
│   ├── README.qemu
│   └── scripts
└── meta-qt5
    ├── classes
    ├── conf
    ├── COPYING.MIT
    ├── files
    ├── lib
    ├── licenses
    ├── README.md
    ├── recipes-connectivity
    ├── recipes-devtools
    ├── recipes-multimedia
    ├── recipes-python
    └── recipes-qt

  • Build 환경구성 
기본 Build 환경구성 확인 과 Build 
$ cd ..

$ pwd
/home/jhlee/works/raspberrypi

$ source sources/poky/oe-init-build-env rpi-build  // Yocto Poky 기반으로 Build 환경설정 
or
$ . sources/poky/oe-init-build-env rpi-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 task

$ pwd
/home/jhlee/works/raspberrypi/rpi-build

  • Build 환경구성 확장  
BBLAYERS에 추가된 Layer들을 추가하여 확장하여 이를 확장 
$ cd .. 

$ pwd
/home/jhlee/works/raspberrypi

$ tree -t -L 2  // Yocto 전체 Layer 와 Build 관련부분 파악 
.
├── sources
│   ├── meta-openembedded
│   ├── meta-raspberrypi
│   ├── meta-qt5
│   └── poky
└── rpi-build
    └── conf

$ cd ./rpi-build  // Build 환경으로 다시  

$ JHLEE=$HOME/works/raspberrypi/sources

$ echo $JHLEE
/home/jhlee/raspberrypi/sources

$ cat conf/bblayers.conf 
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/jhlee/works/raspberrypi/sources/poky/meta \
  /home/jhlee/works/raspberrypi/sources/poky/meta-poky \
  /home/jhlee/works/raspberrypi/sources/poky/meta-yocto-bsp \
  "

//meta-raspberrypi 필요한 Layer들 별도로 추가 (dependecies)
$ echo "BBLAYERS += \"$JHLEE/meta-openembedded/meta-oe\"" >> conf/bblayers.conf
$ echo "BBLAYERS += \"$JHLEE/meta-openembedded/meta-multimedia\"" >> conf/bblayers.conf
$ echo "BBLAYERS += \"$JHLEE/meta-openembedded/meta-networking\"" >> conf/bblayers.conf
$ echo "BBLAYERS += \"$JHLEE/meta-openembedded/meta-python\"" >> conf/bblayers.conf

$ echo "BBLAYERS += \"$JHLEE/meta-raspberrypi\"" >> conf/bblayers.conf
$ echo "BBLAYERS += \"$JHLEE/meta-qt5\"" >> conf/bblayers.conf

$ cat conf/bblayers.conf    // 최종 bitbake Layer 관련설정 확인  
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
  /home/jhlee/works/raspberrypi/sources/poky/meta \
  /home/jhlee/works/raspberrypi/sources/poky/meta-poky \
  /home/jhlee/works/raspberrypi/sources/poky/meta-yocto-bsp \
  "
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-oe"
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-multimedia"
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-networking"
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-python"
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-raspberrypi"
BBLAYERS += "/home/jhlee/works/raspberrypi/sources/meta-qt5"

// priority 의 경우 어떻게 측정되는 지 추후 더 파악 (만약 Package가 제대로 설치되어있지 않으면 실행이 안됨) 
$ bitbake-layers show-layers  
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/jhlee/works/raspberrypi/sources/poky/meta  5
meta-poky             /home/jhlee/works/raspberrypi/sources/poky/meta-poky  5
meta-yocto-bsp        /home/jhlee/works/raspberrypi/sources/poky/meta-yocto-bsp  5
meta-oe               /home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-oe  6
meta-multimedia       /home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-multimedia  6
meta-networking       /home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-networking  5
meta-python           /home/jhlee/works/raspberrypi/sources/meta-openembedded/meta-python  7
meta-raspberrypi      /home/jhlee/works/raspberrypi/sources/meta-raspberrypi  9
meta-qt5              /home/jhlee/works/raspberrypi/sources/meta-qt5  7


  • 전체 Image Recipe 찾기 
현재 사용중인 Image Recipe를 찾아 역으로 분석하여 기본구조를 파악하자 
$ find ../sources -name *image*.bb   // bitbake 의 image bb recipe 파일 전부 검색  
../sources/meta-openembedded/meta-filesystems/recipes-filesystems/images/meta-filesystems-image-base.bb
../sources/meta-openembedded/meta-filesystems/recipes-filesystems/images/meta-filesystems-image.bb
../sources/meta-openembedded/meta-webserver/recipes-core/images/meta-webserver-image-base.bb
../sources/meta-openembedded/meta-webserver/recipes-core/images/meta-webserver-image.bb
../sources/meta-openembedded/meta-multimedia/recipes-multimedia/images/meta-multimedia-image-base.bb
../sources/meta-openembedded/meta-multimedia/recipes-multimedia/images/meta-multimedia-image.bb
../sources/meta-openembedded/meta-initramfs/recipes-bsp/images/initramfs-debug-image.bb
../sources/meta-openembedded/meta-initramfs/recipes-bsp/images/initramfs-kexecboot-klibc-image.bb
../sources/meta-openembedded/meta-initramfs/recipes-bsp/images/initramfs-kexecboot-image.bb
../sources/meta-openembedded/meta-initramfs/recipes-core/images/meta-initramfs-image.bb
../sources/meta-openembedded/meta-networking/recipes-core/images/meta-networking-image.bb
../sources/meta-openembedded/meta-networking/recipes-core/images/meta-networking-image-base.bb
../sources/meta-openembedded/meta-xfce/recipes-core/images/core-image-minimal-xfce.bb
../sources/meta-openembedded/meta-python/recipes-core/images/meta-python-image-base.bb
../sources/meta-openembedded/meta-python/recipes-core/images/meta-python-ptest-image.bb
../sources/meta-openembedded/meta-python/recipes-core/images/meta-python-image.bb
../sources/meta-openembedded/meta-oe/recipes-core/images/meta-oe-image-base.bb
../sources/meta-openembedded/meta-oe/recipes-core/images/meta-oe-ptest-image.bb
../sources/meta-openembedded/meta-oe/recipes-core/images/meta-oe-image.bb
../sources/meta-openembedded/meta-oe/recipes-graphics/libsdl/libsdl-image_1.2.12.bb
../sources/meta-openembedded/meta-oe/recipes-graphics/libsdl/libsdl2-image_2.0.3.bb
../sources/meta-openembedded/meta-oe/recipes-support/imagemagick/imagemagick_7.0.8.bb
../sources/meta-openembedded/meta-perl/recipes-perl/images/meta-perl-ptest-image.bb
../sources/meta-openembedded/meta-perl/recipes-perl/images/meta-perl-image.bb
../sources/meta-raspberrypi/recipes-core/images/rpi-hwup-image.bb
../sources/meta-raspberrypi/recipes-core/images/rpi-basic-image.bb
../sources/meta-raspberrypi/recipes-core/images/rpi-test-image.bb
../sources/poky/meta-skeleton/recipes-multilib/images/core-image-multilib-example.bb
../sources/poky/meta-selftest/recipes-test/container-image/container-image-testpkg.bb
../sources/poky/meta-selftest/recipes-test/container-image/container-test-image.bb
../sources/poky/meta-selftest/recipes-test/images/wic-image-minimal.bb
../sources/poky/meta-selftest/recipes-test/images/test-empty-image.bb
../sources/poky/meta-selftest/recipes-test/images/error-image.bb
../sources/poky/meta-selftest/recipes-test/images/oe-selftest-image.bb
../sources/poky/meta-selftest/recipes-test/multiconfig/multiconfig-image-packager_0.1.bb
../sources/poky/meta/recipes-extended/images/core-image-kernel-dev.bb
../sources/poky/meta/recipes-extended/images/core-image-testmaster.bb
../sources/poky/meta/recipes-extended/images/core-image-full-cmdline.bb
../sources/poky/meta/recipes-extended/images/core-image-testmaster-initramfs.bb
../sources/poky/meta/recipes-rt/images/core-image-rt.bb
../sources/poky/meta/recipes-rt/images/core-image-rt-sdk.bb
../sources/poky/meta/recipes-core/images/core-image-minimal.bb
../sources/poky/meta/recipes-core/images/core-image-tiny-initramfs.bb
../sources/poky/meta/recipes-core/images/core-image-minimal-dev.bb
../sources/poky/meta/recipes-core/images/build-appliance-image_15.0.0.bb
../sources/poky/meta/recipes-core/images/core-image-minimal-mtdutils.bb
../sources/poky/meta/recipes-core/images/core-image-minimal-initramfs.bb
../sources/poky/meta/recipes-core/images/core-image-base.bb
../sources/poky/meta/recipes-core/ovmf/ovmf-shell-image.bb
../sources/poky/meta/recipes-sato/images/core-image-sato-dev.bb
../sources/poky/meta/recipes-sato/images/core-image-sato-ptest-fast.bb
../sources/poky/meta/recipes-sato/images/core-image-sato-sdk.bb
../sources/poky/meta/recipes-sato/images/core-image-sato-sdk-ptest.bb
../sources/poky/meta/recipes-sato/images/core-image-sato.bb
../sources/poky/meta/recipes-graphics/images/core-image-weston.bb
../sources/poky/meta/recipes-graphics/images/core-image-clutter.bb
../sources/poky/meta/recipes-graphics/images/core-image-x11.bb
../sources/poky/meta/recipes-graphics/xorg-lib/xcb-util-image_0.4.0.bb
../sources/meta-qt5/recipes-qt/qt5/qtimageformats_git.bb

$ cd ../sources/meta-qt5
$ mkdir -p recipes-core/images
$ cd recipes-core/images

$ vi core-image-qt5.bb     // Qt기반으로 Image Recipe 파일 직접구성 (기본은 core-image-base) 
$ cat core-image-qt5.bb 
SUMMARY = "Qt5 image that fully supports the target device hardware."
LICENSE="MIT"

include recipe-core/images/core-image-base.bb

QT_BASE = " \
    qtbase \
    qtbase-dev \
    qtbase-mkspecs \
    qtbase-plugins \
    qtbase-tools \
"
 
QT_PKGS = " \
    qt3d \
    qt3d-dev \
    qt3d-mkspecs \
    qtcharts \
    qtcharts-dev \
    qtcharts-mkspecs \
    qtconnectivity-dev \
    qtconnectivity-mkspecs \
    qtquickcontrols2 \
    qtquickcontrols2-dev \
    qtquickcontrols2-mkspecs \
    qtdeclarative \
    qtdeclarative-dev \
    qtdeclarative-mkspecs \
    qtgraphicaleffects \
    qtgraphicaleffects-dev \
"

IMAGE_INSTALL += " \
    ${QT_BASE} \
    ${QT_PKGS} \
"

export IMAGE_BASENAME = "core-image-qt5"

$ bitbake core-image-qt5

$ devtool build core-image-qt5 source 

$ bitbake -e |grep IMAGE_FSTYPE

$ find .. -name bitbake.conf
../sources/poky/bitbake/lib/bb/tests/runqueue-tests/conf/bitbake.conf
../sources/poky/meta/conf/bitbake.conf

Build는 되지만, Image가 생성이 안되었으며,  간단하게 따라한 것이니, 추후에 시간이 있을 경우, QT Package 와 함께 
그때 세부적 분석한 후 관련 Recipe들을 수정하여 구성하자. 
너무 대충 구성한 것 같음. 


  • 아래는 Image Recipe를 만들때, 너무 좋은 예제인 것 같아, 추후에 참조 
LoRa 작업을 하면서 아래 Recipe를 각각 다 만들었는데,  괜찮게 만든 것 같아 추후에 다시 참조하며, Raspberry Pi3에 넣도록 하자 
Raspberry Pi3 와 LoRa Gateway 검색해보면 관련자료는 많이 나온다. 

LoRa Gateway 와 Packet Forwarder 

더불어 QT에도 추후에 추가도 가능하며, 이 부분은 Background로 돌리수도 있다. 

$ vi ../sources/meta-lora-net/recipes-core/images/core-lora-image.bb
SUMMARY = "Lora Gateway Image dev image"

include recipes-core/images/core-image-base.bb

IMAGE_INSTALL += "lora-gateway lora-pkt-fwd"

export IMAGE_BASENAME = "core-lora-image"

my_postprocess_function() {
   echo "hello" > ${IMAGE_ROOTFS}/hello.txt
}

ROOTFS_POSTPROCESS_COMMAND += "my_postprocess_function; "


$ sample ROOTFS_POSTPROCESS_COMMAND
#
# Copyright (C) 2010 Intel Corporation.
#
require recipes-core/images/poky-image-minimal.bb

SRC_URI = "file://interfaces"

IMAGE_INSTALL += "dropbear mediatomb task-poky-nfs-server"

LICENSE = "MIT"

ROOTFS_POSTPROCESS_COMMAND += "setup_target_image ; "

# Manual workaround for lack of auto eth0 (see bug #875)
setup_target_image() {
       install -m 0644 ${WORKDIR}/interfaces ${IMAGE_ROOTFS}/etc/network/interfaces
}

$ gateway.bb

SUMMARY = "LoRa Gateway project"
SECTION = "libs/network"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=a2bdef95625509f821ba00460e3ae0eb"

SRC_URI = "https://github.com/Lora-net/lora_gateway/archive/v${PV}.tar.gz"

SRC_URI[md5sum] = "5d07f8471e1a67920787e3879afe0cb6"
SRC_URI[sha256sum] = "1a0447d5e8183d08e6dce5f739f6872b9c57824b98f4078830d5ee21b15782c1"

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

CFLAGS_append = "-I ${S}/libloragw/inc -I ${S}/libloragw -I ${S}/util_pkt_logger/inc "

do_install() {
 bbplain "--------    Lora Gateway Install -----------------"
 install -d ${D}${bindir}
 install -d ${D}${docdir}
 install -d ${D}${libdir}/libloragw/inc
 install -d ${D}${includedir}/libloragw
 
 install -D -m 0644 ${B}/libloragw/inc/* ${D}${includedir}/libloragw
 
 install -D -m 0644 ${B}/libloragw/inc/* ${D}${libdir}/libloragw/inc
 install -D -m 0644 ${B}/libloragw/libloragw.a ${D}${libdir}/libloragw/libloragw.a
 install -D -m 0644 ${S}/libloragw/library.cfg ${D}${libdir}/libloragw/library.cfg
 
 install ${B}/libloragw/test_* ${D}${bindir}
 install ${B}/util_*/util_* ${D}${bindir}
 install ${S}/*.sh ${D}${bindir}
 
 install -D -m 0644 ${S}/readme.md ${D}${docdir}/libloragw/changelog.md
 install -D -m 0644 ${S}/libloragw/readme.md ${D}${docdir}/libloragw/README.md
 install -D -m 0644 ${S}/util_lbt_test/readme.md ${D}${docdir}/libloragw/util_lbt_test.md
 install -D -m 0644 ${S}/util_pkt_logger/readme.md ${D}${docdir}/libloragw/util_pkt_logger.md
 install -D -m 0644 ${S}/util_spectral_scan/readme.md ${D}${docdir}/libloragw/util_spectral_scan.md
 install -D -m 0644 ${S}/util_spi_stress/readme.md ${D}${docdir}/libloragw/util_spi_stress.md
 install -D -m 0644 ${S}/util_tx_continuous/readme.md ${D}${docdir}/libloragw/util_tx_continuous.md
 install -D -m 0644 ${S}/util_tx_test/readme.md ${D}${docdir}/libloragw/util_tx_test.md
 
 install -D -m 0644 ${S}/util_pkt_logger/global_conf.json ${D}${docdir}/libloragw/global_conf.json
 install -D -m 0644 ${S}/util_pkt_logger/local_conf.json ${D}${docdir}/libloragw/local_conf.json
}

PACKAGE_DEBUG_SPLIT_STYLE = "debug-without-src"

PACKAGES = "${PN}-dbg ${PN} ${PN}-doc ${PN}-dev ${PN}-staticdev"

# Avoid QA Issue: No GNU_HASH in the elf binary
INSANE_SKIP_${PN} = "ldflags"

FILES_${PN}-dbg = " \
 ${bindir}/.debug \
 ${libdir}/libloragw/.debug \
"
FILES_${PN} = " \
 ${bindir}/* \
 ${docdir}/* \
"
FILES_${PN}-dev = " \
 ${includedir}/libloragw/* \
"
FILES_${PN}-staticdev = " \
 ${libdir}/libloragw/inc/*.h \
 ${libdir}/libloragw/*.a \
 ${libdir}/libloragw/*.cfg \
"
FILES_${PN}-doc = " \
 ${docdir} \
"




$ packet.bb
SUMMARY = "LoRa network packet forwarder project"
SECTION = "libs/network"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=22af7693d7b76ef0fc76161c4be76c45"

SRC_URI = "https://github.com/Lora-net/packet_forwarder/archive/v${PV}.tar.gz"

SRC_URI[md5sum] = "a1f942e0cc7b02d604b11c8cb5f2a029"
SRC_URI[sha256sum] = "e68fadf6f1d2e5e7b601e504d5efb48b0a8f374c2c29c0476ab2fe9db68d33ae"

DEPENDS += "lora-gateway" 

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

CFLAGS_append = "-I ${includedir}/libloragw -I ${S}/lora_pkt_fwd/inc -I ${S}/util_tx_test/inc "

do_configure_prepend() {
 export LGW_PATH="${STAGING_LIBDIR}/libloragw"
}

do_compile_prepend() {
 export LGW_PATH="${STAGING_LIBDIR}/libloragw"
}

do_install() {
        bbplain "--------    Lora Packet Forward Install -----------------"
 install -d ${D}${bindir}
 install -d ${D}${docdir}/lora-pkt-fwd/conf
 
 install ${B}/lora_pkt_fwd/lora_pkt_fwd ${D}${bindir}
 install ${B}/util_*/util_* ${D}${bindir}
 
 install -D -m 0644 ${S}/PROTOCOL.TXT ${D}${docdir}/lora-pkt-fwd/PROTOCOL.TXT
 install -D -m 0644 ${S}/lora_pkt_fwd/readme.md ${D}${docdir}/lora-pkt-fwd/readme.md
 install -D -m 0644 ${S}/lora_pkt_fwd/global_conf.json ${D}${docdir}/lora-pkt-fwd/global_conf.json
 install -D -m 0644 ${S}/lora_pkt_fwd/local_conf.json ${D}${docdir}/lora-pkt-fwd/local_conf.json
 install -D -m 0755 ${S}/lora_pkt_fwd/update_gwid.sh ${D}${docdir}/lora-pkt-fwd
 install -D -m 0644 ${S}/lora_pkt_fwd/cfg/*.json.* ${D}${docdir}/lora-pkt-fwd/conf
 
 rm -f ${D}${bindir}/util_tx_test
 rm -f ${D}${bindir}/.debug/util_tx_test
}

PACKAGE_DEBUG_SPLIT_STYLE = "debug-without-src"

PACKAGES = "${PN}-dbg ${PN} ${PN}-doc"

# 상위에서 설명한 QA관련에러 
# Avoid QA Issue: No GNU_HASH in the elf binary
INSANE_SKIP_${PN} = "ldflags"

FILES_${PN}-dbg = " \
 ${bindir}/.debug \
"
FILES_${PN} = " \
 ${bindir}/* \
 ${docdir}/* \
"
FILES_${PN}-doc = " \
 ${docdir} \
"

$ packet.bbappend

## files로 만들경우, 기본 FILEPATH에 포함이 되어있으므로, 간단히 관리되며, Package 와 Version 별로 관리시 다음과 같이 관리  
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}-${PV}:"
#FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}"
SRC_URI += "file://001_packet_forwarder_lora_pkt_fwd.c.patch"
SRC_URI += "file://002_packet_forwarder_global_conf.json.patch"



ROOTFS_PREPROCESS_COMMAND
ROOTFS_POSTPROCESS_COMMAND
SDK_POSTPROCESS_COMMAND
POPULATE_SDK_POST_TARGET_COMMAND
POPULATE_SDK_POST_HOST_COMMAND
IMAGE_POSTPROCESS_COMMAND
IMAGE_PREPROCESS_COMMAND

ROOTFS_POSTINSTALL_COMMAND
           
  https://www.yoctoproject.org/docs/latest/ref-manual/ref-manual.html#migration-1.6-variable-changes-variable-entry-behavior

Yocto PTEST
  https://wiki.yoctoproject.org/wiki/Ptest
  https://www.yoctoproject.org/docs/current/dev-manual/dev-manual.html#testing-packages-with-ptest


Image BB File 예제
  https://github.com/openembedded/openembedded-core/blob/master/meta/recipes-core/images/build-appliance-image_15.0.0.bb

Image BB File 예제와 PATCH
  https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842475/PetaLinux+Yocto+Tips

MD5 Checksum
  https://docs.windriver.com/bundle/Wind_River_Linux_Toolchain_and_Build_System_Users_Guide_8.0_1/page/tan1478821620236.html

  http://variwiki.com/index.php?title=Yocto_Build_Release