起動パラメータ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 カードの場合にメジャー番号とマイナー番号を直接指定するのは、この問題を回避するためです。
著作権と免責
Copyright © 2012 Pylone, Inc.
この文書の著作権は株式会社パイロンが保有します。
この文書は「現状のまま(as is)」で提供され、明示的であるかどうかを問わず、内容についてなんら保証するものではありません。
この文書には、技術的な誤り、誤植、不適格な表現や未完成部分等を含む可能性があります。従って、この文書は予告無しに追加、変更、削除される可能性があります。
この文書は「クリエイティブ・コモンズ-表示-2.1-日本 以降」(CC-by-2.1 or later) の下で配布されています。