起動パラメータrootについて

Bishop で USB ストレージや SD カードをルートファイルシステムにする際、起動パラメータ root を root=8:1 のようにメジャー番号とマイナー番号で指定します。

このドキュメントでは、なぜ /dev/sda1 のようなデバイスファイル名ではなくメジャー番号とマイナー番号で指定しなくてはならないかを説明します。

/dev/sda1 のようなデバイスファイル名は人間にとっての識別子です。カーネルはデバイスをメジャー番号とマイナー番号で管理します。root パラメータにデバイスファイル名が与えられた場合、カーネルはこれをメジャー番号とマイナー番号へ変換します。

Linux-2.4 では以下のような変換用のテーブルを持っていたので、デバイスやドライバの有無に関わらず変換できました。

static struct dev_name_struct {
	const char *name;
	const int num;
} root_dev_names[] __initdata = {
	{ "nfs",     MKDEV(NFS_MAJOR, NFS_MINOR) },
	{ "hda",     0x0300 },
		:
		:
	{ "ftld", 0x2c18 },
	{ "mtdblock", 0x1f00 },
	{ "nb", 0x2b00 },
	{ NULL, 0 }

一方、Linux-2.6 ではこの仕組みはなくなり、sysfs を使った変換になりました。

name_to_dev_t():

/* 変換のため、sysfs を一時的にマウント */
int mkdir_err = sys_mkdir("/sys", 0700);
if (sys_mount("sysfs", "/sys", "sysfs", 0, NULL) < 0)
	goto out;

try_name():

/* デバイスドライバが sysfs に登録したメジャー/マイナー番号を読む */
sprintf(path, "/sys/block/%s/dev", name);
fd = sys_open(path, 0, 0);
if (fd < 0)
	goto fail;
len = sys_read(fd, buf, 32);
sys_close(fd);

USB ストレージや SD カードの場合、変換が行われるタイミングではデバイスが検出されていないため、メジャー番号とマイナー番号が sysfs に登録されていません。結果として変換に失敗し、カーネルはルートファイルシステムをマウントできません。

USB ストレージや SD カードの場合にメジャー番号とマイナー番号を直接指定するのは、この問題を回避するためです。

cc