はじめに
Yocto ProjectでビルドしたPokyのデフォルトではシステムログを保存する/var/logがtmpfs上に作成されるようになっているため、
ターゲットの電源をOFFすると揮発して(削除されて)しまう。
システムログを保持したい場合は不揮発化(non-volatilize)する必要がある。そのやり方を調べる。 今回はYP5.0(Scarthgap)を使用する。
ターゲットの状態
ターゲットにはQEMU(qemuarmy64)を使用する。
マウント情報
/var/logは/var/volatile/logのシンボリックリンクとなっている。
# ls /var/log -lha lrwxrwxrwx 1 root root 12 Mar 9 2018 /var/log -> volatile/log
/var/volatileがtmpfsでマウントされている。
# mount | grep volatile tmpfs on /var/volatile type tmpfs (rw,relatime)
tmpfsはメモリ上に存在するファイルシステムでストレージには保存されないので、 電源をOFFにすると揮発することがわかる。
メカニズム
IMAGE_ROOTFS
BitBakeでルートFSがどの様になっているかを確認する。
$ bitbake -e core-image-minimal | grep '^IMAGE_ROOTFS=' IMAGE_ROOTFS="/home/mickey/yocto/scarthgap/build/tmp/work/qemuarm64-poky-linux/core-image-minimal/1.0/rootfs"
/var/logの状態を確認する。この時点でシンボリックリンクが作成されている。
$ pushd /home/mickey/yocto/scarthgap/build/tmp/work/qemuarm64-poky-linux/core-image-minimal/1.0/rootfs $ ls -lha var/log lrwxrwxrwx 1 mickey mickey 12 3月 9 2018 var/log -> volatile/log
base-filesレシピ
/var/logはbase-filesのdo_installタスクによって作成される。ここでは、VOLATILE_LOG_DIRが"yes"の場合はシンボリックリンクが作成され、"no"の場合はディレクトリが作成される様になっている。
... (snip) ... dirs755 = "/boot /dev ${base_bindir} ${base_sbindir} ${base_libdir} \ ${sysconfdir} ${sysconfdir}/default \ ${sysconfdir}/skel ${nonarch_base_libdir} /mnt ${ROOT_HOME} /run \ ${prefix} ${bindir} ${docdir} /usr/games ${includedir} \ ${libdir} ${sbindir} ${datadir} \ ${datadir}/common-licenses ${datadir}/dict ${infodir} \ ${mandir} ${datadir}/misc ${localstatedir} \ ${localstatedir}/backups ${localstatedir}/lib \ ${localstatedir}/lib/misc ${localstatedir}/spool \ ${localstatedir}/volatile \ ${localstatedir}/${@'volatile/' if oe.types.boolean('${VOLATILE_LOG_DIR}') else ''}log \ /home ${prefix}/src ${localstatedir}/local \ /media" ... (snip) ... volatiles = "${@'log' if oe.types.boolean('${VOLATILE_LOG_DIR}') else ''} tmp" ... (snip) ... do_install () { ... (snip) ... for d in ${dirs755}; do install -m 0755 -d ${D}$d done ... (snip) ... for d in ${volatiles}; do ln -sf volatile/$d ${D}${localstatedir}/$d done ... (snip) ...
不揮発化
設定及びビルド
local.confに以下を追加する。
VOLATILE_LOG_DIR = "no"
bitbakeをし直す。
$ bitbake core-image-minimal
IMAGE_ROOTFSの内容を確認する。
$ ls -lha var | grep log drwxr-xr-x 2 mickey mickey 4.0K 3月 9 2018 log
ディレクトリが作成されている。
動作確認
/var/log/messagesにログを書き込む。
# logger -t TEST "Test log" # cat /var/log/messages | grep TEST Oct 25 02:43:26 qemuarm64 user.notice TEST: Test log
再起動してログが残っているか確認
# cat /var/log/messages | grep TEST Oct 25 02:43:26 qemuarm64 user.notice TEST: Test log
残っている。
initscriptsとsystemd
/var/logについてレシピをgrepすると、initscriptとsystemdのレシピも検索で引っかかる。
これはどちらもinitプログラムとなるもので、どちらを使用するかINIT_MANAGERで選択する。
これらのレシピでは、ターゲット上の/var/logが何らかの理由で削除された場合に復旧するための仕掛けが入っている。
これらもVOLATILE_LOG_DIRの値によってシンボリックリンクか実ディレクトリかを適切に処理するようになっている。
initscripts
/etc/defaults/volatiles/00_coreを作成するようになっている。その作成の処理はdo_installタスク。
do_install() { ...(snip)... if [ ${@ oe.types.boolean('${VOLATILE_LOG_DIR}') } = True ]; then sed -i -e '\@^d root root 0755 /var/volatile/log none$@ a\l root root 0755 /var/log /var/volatile/log' \ ${D}${sysconfdir}/default/volatiles/00_core fi if [ "${VOLATILE_TMP_DIR}" != "yes" ]; then sed -i -e "/\<tmp\>/d" ${D}${sysconfdir}/default/volatiles/00_core fi ...(snip)... }
00_core
VOLATILE_LOG_DIR="yes"の場合
...(snip)... d root root 0755 /var/volatile/log none l root root 0755 /var/log /var/volatile/log d root root 1777 /var/volatile/tmp none ...(snip)...
VOLATILE_LOG_DIR="no"の場合
...(snip)... d root root 0755 /var/volatile/log none d root root 1777 /var/volatile/tmp none ...(snip)...
こちらは/var/logは救えない。
systemd
/usr/lib/tmpfiles.d/00-create-volatile.confを作成するようになっている。こちらも該当の処理はdo_installタスク。
do_install() { ...(snip)... if "${@'true' if oe.types.boolean(d.getVar('VOLATILE_LOG_DIR')) else 'false'}"; then # base-files recipe provides /var/log which is a symlink to /var/volatile/log rm -rf ${D}${localstatedir}/log printf 'L\t\t%s/log\t\t-\t-\t-\t-\t%s/volatile/log\n' "${localstatedir}" \ "${localstatedir}" >>${D}${nonarch_libdir}/tmpfiles.d/00-create-volatile.conf ...(snip)...
00-create-volatile.conf
VOLATILE_LOG_DIR="yes"の場合
d /run/lock 1777 - - - d /var/volatile/log - - - - d /var/volatile/tmp 1777 - - L /var/tmp - - - - /var/volatile/tmp L /var/log - - - - /var/volatile/log
VOLATILE_LOG_DIR="no"の場合
d /run/lock 1777 - - - d /var/volatile/log - - - - d /var/volatile/tmp 1777 - - L /var/tmp - - - - /var/volatile/tmp
まとめ
- Pokyのデフォルトではシステムログは電源OFFで揮発するようになっている。
- 揮発するかしないかは
VOLATILE_LOG_DIRで選択できる。 /var/logを削除した際には、systemdもしくはinitscriptsで自動的に復旧されるようになっている。(initramfsはVOLATILE_LOG_DIR="no"だと復旧できない)
VOLATILE_LOG_DIRはStyheadで削除されており切り替え方法が変わっているので注意が必要。