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