genkernel 3.4.10系でファイルシステムのUUIDのデバイス名への解決ができない件について(問題について)
genkernel 3.4.10が作成するbusyboxではfindfsが使えない
genkernelのバージョンを3.4.10に上げたところ、起動の初期段階で/init: line xxx: blkid: not found
のようになって先に進まなくなってしまった。
手元の環境では、ルートパーティションを(ファイルシステムに付いている)UUIDという識別子によって指定しているのだが、初期RAMディスクイメージ(initrd)のスクリプト(genkernel-3.4.10/generic/linuxrc)を見ると、このコマンドを呼んでいる少し前のところ(ルートファイルシステムのUUIDをデバイス名に解決する処理)でbusybox findfsに失敗していることが分かった。
blkidコマンド自体はinitrdの中にはなく、これが使われることはない(何故か書いてある)。genkernelのバージョン3.4.9で作成したinitrdでもこう書かれているのだが、上のほうでbusybox findfsが解決してくれるため、問題にはならなかった。
以下、該当部分の引用。
[引用]ファイル名: genkernel-3.4.10/generic/linuxrc
# Determine root device good_msg 'Determining root device...' while true do while [ "${got_good_root}" != '1' ] do case "${REAL_ROOT}" in LABEL\=*|UUID\=*) ROOT_DEV="" retval=1 if [ "${retval}" -ne '0' ]; then ROOT_DEV=`findfs "${REAL_ROOT}" 2>/dev/null` retval=$? fi if [ "$retval" -ne '0' ]; then ROOT_DEV=`busybox findfs "${REAL_ROOT}" 2>/dev/null` retval=$? fi if [ "${retval}" -ne '0' ]; then ROOT_DEV=`blkid -t "${REAL_ROOT}" | cut -d ":" -f 1 2>/dev/null` retval=$? fi
問題なのは、busyboxでfindfs*1が使えないこと。genkernelのバージョン3.4.10が生成したbusyboxで実験したところ、下のようになった。
$ [genkernel 3.4.10が生成したbusybox] findfs findfs: applet not found $ [genkernel 3.4.10が生成したbusybox] | head -n 1 BusyBox v1.7.4 (2008-xx-xx xx:xx:xx JST) multi-call binary
一方で、バージョン3.4.9で使用されていたものは
$ [genkernel 3.4.9が生成したbusybox] findfs BusyBox v1.1.3 (2008.xx.xx-xx:xx+0000) multi-call binary No help available.
となり、実際にUUIDからデバイス名への解決も正常に動作している。
この問題の解決策については別記事で扱う。
使用したバージョン:
- genkernel 3.4.9, 3.4.10-r1