I'm running an embedded board that is booted from an SDCard. The location of the rootfs gets passed to the kernel via kernel parameters:
Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait panic=10
I've noticed that changing to a different kernel version changes the index to mmcblk1
which causes the device to not boot.
The kernel is built without a initramfs.
The output of udevadm
for the two versions:
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
Looking at /etc/udev
I found no explicit rules that are addressing the naming for the mmcblk
.
# tree /etc/udev
/etc/udev
├── hwdb.bin
├── hwdb.d
├── rules.d
└── udev.conf
The naming does seem to be related to the device tree. Changing different device trees with the same zImage results in different indexes.
Question
What is responsible for setting the index and is there a config to set it to a different starting index?
Best Answer
This seems to be the kernel code responsible for making sense of
root=/dev/mmcblk0p2
.Given that no
initramfs
is present, there is no udev daemon running to name the devices and/dev/mmcblk1
doesn't really exist yet anywhere.The kernel then somehow converts that name into the responsible driver with the function
dev_t name_to_dev_t(const char *name)
:A reference from a lkml discussion points that the changes in the naming could be caused by the ordering in the device tree: