web-dev-qa-db-ja.com

カーネルはSDカードの命名イン​​デックスをどこで定義しますか?

SDカードから起動する組み込みボードを実行しています。 rootfsの場所は、カーネルパラメータを介してカーネルに渡されます。

Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10

別のカーネルバージョンに変更すると、インデックスがmmcblk1に変更され、デバイスが起動しないことに気付きました。

カーネルはinitramfsなしで構築されています。

2つのバージョンのudevadmの出力:

mmcblk1

$ 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==""

mmcblk0

~# 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で起動します

1
Wouter Verhelst