以下の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2025/10/25/130227より取得しました。


Yocto Project システムログの不揮発化(Scarthgap以前)

はじめに

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_DIRStyheadで削除されており切り替え方法が変わっているので注意が必要。




以上の内容はhttps://mickey-happygolucky.hatenablog.com/entry/2025/10/25/130227より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14