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를 진행하는데, 이 부분은 아래의 소스를 참조
- /var/log/messages (latest)
- /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 말고 별도의 Logrotate Package를 사용하고자 하면 CONFIG_FEATURE_ROTATE_LOGFILE 부분을 막자
ENABLE_FEATURE_ROTATE_LOGFILE 관련소스확인
https://git.busybox.net/busybox/tree/sysklogd/syslogd.c
/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 말고 별도의 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 추가 (중요)
대부분 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)
ALTERNATIVE_PRIORITY
2.2 util-linux recipe 소스 분석 (intel)
먼저 IMAGE_INSTALL 에 util_linux가 추가되어있어야 동작가능하며, busybox 설치되어있는 경우, 각 설정을 ALTERNATIVE로 설정
- util-linux 기본분석 (Intel Yocto)
- SRC_URI를 이용하여 util-linux 소스 download
- PACKAGES 에 사용하고자하는 util-linux-xxx PACKAGE들을 추가
- FILE_util-linux-xxxx 사용할 PACKAGE들의 저장장소 설정
- ALTERNATIVE_PRIORITY 전체 대체될 Package들 우선순위 busybox 조율
- ALTERNATIVE_${PN} 안에 대체가 될 Package 들 기술
- ALTERNATIVE_util-linux-hwclock 상위와 동일하지만, PN 직접기술
- ALTERNATIVE_LINK_NAME busybox 의 것들을 기술
- 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 부분 분석
- SRC_URI를 이용하여 BP 즉 Base Recipe 이름과 동일하게 Download
- PACKAGES =+ "${PN}-swaponoff" , 이 util-linux-swaponoff는 나중에 추가
- PACKAGES += "${@bb.utils.contains('PACKAGECONFIG', 'pylibmount', '${PN}-pylibmount', '', d)}" 는 util-linux-pylibmount 미리 추가
- PACKAGE_PREPROCESS_FUNCS =+ "util_linux_binpackages " python 함수 사용
- PACKAGESPLITFUNCS =+ "util_linux_libpackages" python 함수 사용
- python 함수를 분석을 해봐도 PACKAGE는 두개만 사용함
- util_linux_binpackages 의 pkg_hook 함수 분석
- PACKAGE들을 읽어서 RRECOMMENDS_ 추가 (PACKAGE의 종속성문제)
- ALTERNATIVE_PN 가 존재하면 return 종료
- 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='')
.......
- do_split_packages 함수 이용하여 PACKAGE관리하며, 매번 pkg_hook 호출
- 중략
- 결론적으로 ALTERNATIVE를 비롯하여 FILE을 자동관리
추가시 busybox 대신 util-linux 용 package가 변경됨