SDカードから起動する組み込みボードを実行しています。 rootfsの場所は、カーネルパラメータを介してカーネルに渡されます。
Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
別のカーネルバージョンに変更すると、インデックスがmmcblk1
に変更され、デバイスが起動しないことに気付きました。
カーネルはinitramfsなしで構築されています。
2つのバージョンのudevadm
の出力:
$ udevadm info --name=/dev/mmcblk1 --attribute-walk
looking at device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc1/mmc1:0001/block/mmcblk1':
KERNEL=="mmcblk1"
SUBSYSTEM=="block"
DRIVER==""
ATTR{alignment_offset}=="0"
ATTR{capability}=="50"
ATTR{discard_alignment}=="0"
ATTR{ext_range}=="256"
ATTR{force_ro}=="0"
ATTR{inflight}==" 0 0"
ATTR{range}=="8"
ATTR{removable}=="0"
ATTR{ro}=="0"
ATTR{size}=="7716864"
ATTR{stat}==" 2203 1698 122077 22625 654 554 26088 8770 0 12855 31530"
looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc1/mmc1:0001':
KERNELS=="mmc1:0001"
SUBSYSTEMS=="mmc"
DRIVERS=="mmcblk"
ATTRS{cid}=="9f544930303030300000000201011a3b"
ATTRS{csd}=="400e00325b5900001d6f7f800a4000a1"
ATTRS{date}=="10/2017"
ATTRS{dsr}=="0x404"
ATTRS{erase_size}=="512"
ATTRS{fwrev}=="0x0"
ATTRS{hwrev}=="0x0"
ATTRS{manfid}=="0x00009f"
ATTRS{name}=="00000"
ATTRS{ocr}=="00200000"
ATTRS{oemid}=="0x5449"
ATTRS{preferred_erase_size}=="4194304"
ATTRS{scr}=="02b5800000000000"
ATTRS{serial}=="0x00000201"
ATTRS{ssr}=="000000000200000004049000080a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
ATTRS{type}=="SD"
looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc1':
KERNELS=="mmc1"
SUBSYSTEMS=="mmc_Host"
DRIVERS==""
~# udevadm info --name=/dev/mmcblk0 --attribute-walk
looking at device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc0/mmc0:0001/block/mmcblk0':
KERNEL=="mmcblk0"
SUBSYSTEM=="block"
DRIVER==""
ATTR{alignment_offset}=="0"
ATTR{capability}=="50"
ATTR{discard_alignment}=="0"
ATTR{ext_range}=="256"
ATTR{force_ro}=="0"
ATTR{inflight}==" 0 0"
ATTR{range}=="8"
ATTR{removable}=="0"
ATTR{ro}=="0"
ATTR{size}=="7716864"
ATTR{stat}==" 2156 1248 105313 35020 85 263 952 1530 0 8180 36530"
looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc0/mmc0:0001':
KERNELS=="mmc0:0001"
SUBSYSTEMS=="mmc"
DRIVERS=="mmcblk"
ATTRS{cid}=="9f5449303030303000000003ba011a5d"
ATTRS{csd}=="400e00325b5900001d6f7f800a4000a1"
ATTRS{date}=="10/2017"
ATTRS{dsr}=="0x404"
ATTRS{erase_size}=="512"
ATTRS{fwrev}=="0x0"
ATTRS{hwrev}=="0x0"
ATTRS{manfid}=="0x00009f"
ATTRS{name}=="00000"
ATTRS{ocr}=="00200000"
ATTRS{oemid}=="0x5449"
ATTRS{preferred_erase_size}=="4194304"
ATTRS{scr}=="02b5800000000000"
ATTRS{serial}=="0x000003ba"
ATTRS{ssr}=="000000000200000004049000080a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
ATTRS{type}=="SD"
looking at parent device '/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc0':
KERNELS=="mmc0"
SUBSYSTEMS=="mmc_Host"
DRIVERS==""
~# udevadm info --query=property --name=/dev/mmcblk0
DEVLINKS=/dev/disk/by-id/mmc-00000_0x000003ba /dev/disk/by-path/platform-1c0f000.mmc
DEVNAME=/dev/mmcblk0
DEVPATH=/devices/platform/soc/1c0f000.mmc/mmc_Host/mmc0/mmc0:0001/block/mmcblk0
DEVTYPE=disk
ID_NAME=00000
ID_PART_TABLE_TYPE=dos
ID_PART_TABLE_UUID=27e953fe
ID_PATH=platform-1c0f000.mmc
ID_PATH_TAG=platform-1c0f000_mmc
ID_SERIAL=0x000003ba
MAJOR=179
MINOR=0
SUBSYSTEM=block
TAGS=:systemd:
USEC_INITIALIZED=4723799
/etc/udev
を見ると、mmcblk
の命名に対処している明示的なルールは見つかりませんでした。
# tree /etc/udev
/etc/udev
├── hwdb.bin
├── hwdb.d
├── rules.d
└── udev.conf
命名はデバイスツリーに関連しているようです。同じzImageで異なるデバイスツリーを変更すると、異なるインデックスになります。
インデックスの設定には何が責任があり、別の開始インデックスに設定するための構成はありますか?
This は、_root=/dev/mmcblk0p2
_の意味を理解するためのカーネルコードのようです。
initramfs
が存在しない場合、デバイスに名前を付けるために実行されているudevデーモンはなく、_/dev/mmcblk1
_は実際にはまだどこにも存在しません。
次に、カーネルはその名前を関数dev_t name_to_dev_t(const char *name)
を使用して責任のあるドライバーに変換します。
_ ...
if (strncmp(name, "/dev/", 5) != 0) {
unsigned maj, min, offset;
char dummy;
if ((sscanf(name, "%u:%u%c", &maj, &min, &dummy) == 2) ||
(sscanf(name, "%u:%u:%u:%c", &maj, &min, &offset, &dummy) == 3)) {
res = MKDEV(maj, min);
if (maj != MAJOR(res) || min != MINOR(res))
goto fail;
} else {
res = new_decode_dev(simple_strtoul(name, &p, 16));
if (*p)
goto fail;
}
goto done;
}
_
lkmlディスカッション からの参照は、名前の変更がデバイスツリーの順序によって引き起こされる可能性があることを示しています。
デバイスの順序の変更は、DTファイルのエントリが表示される順序、つまり、ホストSDインターフェイスがカーネルによってプローブされる順序によって引き起こされる可能性があります。
カーネル内のデバイスの順序は保証されなくなりました。ほとんどのディストリビューションが、ルートファイルシステムが何であるかを理解する他の方法に切り替えたのはこのためです。次のいずれかを実行できます。
ラベル付きファイルシステムを使用します。
tune2fs -L / /dev/mmcblkXpY
(ファイルシステムがマウントされている間にこれを行うのは安全です)。 root=LABEL=/
で起動します
UUIDを使用します:
blkid /dev/mmcblkXpY
...ファイルシステムのUUIDが何であるかを教えてくれます。 root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
で起動します