試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

genkernel 3.4.10系でファイルシステムのUUIDのデバイス名への解決ができない件について(問題について)

  1. genkernel 3.4.10が作成するbusyboxではfindfsが使えない

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

問題なのは、busyboxfindfs*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

*1:busybox findfs UUID=[UUID]」(UUIDの代わりに「LABEL=[ラベル文字列]」も使える)で「/dev/xxx」の形のデバイス名が得られるコマンド