커널은 SD 카드 명명 인덱스를 어디에서 정의합니까?

커널은 SD 카드 명명 인덱스를 어디에서 정의합니까?

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

관련 정보