SDCardから起動した組み込みボードを実行しています。 rootfsの位置は、カーネルパラメータを介してカーネルに渡されます。
Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
mmcblk1
別のカーネルバージョンに変更すると、インデックスが変更され、デバイスを起動できなくなる可能性があります。
カーネルはinitramfsなしで構築されました。
udevadm
両方のバージョンの出力:
メモリブロック1
$ 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==""
メモリブロック0
~# 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を使用して異なるデバイスツリーを変更すると、異なるインデックスが作成されます。
質問
インデックス設定を担当する人は誰ですか?これを別の開始インデックスに設定する設定はありますか?
答え1
これカーネルコードが理解を担当しているようです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;
}
参照元は次のとおりです。議論するデバイスツリーの順序によって名前が変更される可能性があることを指摘してください。
DTファイルにエントリが表示される順序とカーネルがホストのSDインタフェースを検索する順序によって、デバイスの順序が変わる可能性があります。
答え2
カーネル内のデバイスの順序はもはや保証されません。このため、ほとんどのディストリビューションは、ルートファイルシステムが何であるかを判断する別の方法に切り替えました。次のいずれかを実行できます。
ラベル付きファイルシステムを使用してください。
tune2fs -L / /dev/mmcblkXpY
(ファイルシステムのマウント中にこれを行うのは安全です。)今すぐ始めてください
root=LABEL=/
UUIDの使用:
blkid /dev/mmcblkXpY
...ファイルシステムのUUIDが何であるかを教えてくれます。起動時に使用
root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx