私のカーネルコマンドラインは次のようになります。
root=31:0 ro noinitrd console=ttyS0,115200 root=/dev/mtdblock2 rootfstype=squashfs
最初のroot
エントリは、メジャーデバイス番号とマイナーデバイス番号でディスクを識別し、2番目のエントリは名前でディスクを識別していると思います。 rootfs
が実際に/dev/mtdblock2
にあることは確認できますが、31:0
の解釈方法がわかりません。
同じオプションを複数回指定すると、モジュールごとに動作が異なります。 _console=
_を複数回言うことができ、複数のコンソールを取得できることを私は知っています(フレームバッファーとシリアルポートの両方にメインコンソールがあるマシンに使用します)。
ただし、ルートパーティションは1つしか持てないため、_root=
_は、ほぼ確実に、左から右に、以前に表示された値を上書きします。これはカーネルソースによって裏付けられており、_init/do_mounts.c
_では、関数root_dev_setup()
が_root=
_オプションの操作を担当し、パラメータキーを変数に格納するだけです。 bootparam _root=31:0
_は_root=/dev/mtdblock2
_によってオーバーライドされます。少なくとも、チェックした2.6.25ソースツリーの場合はそうです。
ちなみに、Cに精通している場合は、同じファイル内の関数name_to_dev_t()
が_root=
_の値の解析を担当し、非常に啓発的です。
_x:y
_表記は、メジャー:マイナーの標準的なUnixismであり、Unicesがデバイスを識別する方法です。従来、メジャーはハードウェアのドライバーを識別する8ビットの数値であり、マイナーはデバイス自体を識別する8ビットの数値でした。 major
番号には、文字デバイスとブロックデバイスの2つの名前空間があります。 _cat /proc/devices
_と入力すると両方が表示され、_ls -la /dev
_と入力すると現在アクティブなものが表示されます。次に例を示します。
_ls -la /dev/zero /dev/sda
brw-rw---- 1 root disk 8, 0 Jan 12 22:01 /dev/sda
crw-rw-rw- 1 root root 1, 5 Jan 12 22:01 /dev/zero
_
最初の列はドライバータイプを識別します(ブロックの場合はb
、文字の場合はc
)。 Jan
の左側の2つの列は、_major, minor
_形式のメジャー番号とマイナー番号です。
Major:minor表記を使用して、名前に関係なく任意のブロックデバイスを_root=
_に指定できます。
デバイス番号の完全なリストは、カーネルソースツリーの_Documentation/devices.txt
_の下にあります。 31:0は、システムの最初のROMカードである/ dev/rom0を参照しているようです。
ラベルを使用する(root=LABEL=...
)デバイス名の代わりにラベルを使用してファイルシステムをマウントします。
http://www.ibm.com/developerworks/linux/library/l-boot-rootfs/index.html