我正在尝试在 Beaglebone Black 上对 eMMC 进行分区。这是我对 /dev/mmcblk1 进行分区的方式:
root@beaglebone:~# fdisk -l /dev/mmcblk1
Disk /dev/mmcblk1: 3.6 GiB, 3825205248 bytes, 7471104 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x9ccd5613
Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 * 2048 206847 204800 100M c W95 FAT32 (LBA)
/dev/mmcblk1p2 206848 7112703 6905856 3.3G 5 Extended
/dev/mmcblk1p5 208896 823295 614400 300M 83 Linux
/dev/mmcblk1p6 825344 1849343 1024000 500M 83 Linux
/dev/mmcblk1p7 1851392 2875391 1024000 500M 83 Linux
/dev/mmcblk1p8 2877440 3901439 1024000 500M 83 Linux
/dev/mmcblk1p9 3903488 4927487 1024000 500M 83 Linux
/dev/mmcblk1p10 4929536 7026687 2097152 1G 83 Linux
这正是它应该看起来的样子。分区 1 是主分区,分区 2 是扩展分区,其余是逻辑分区。但是,当我列出设备时,我只看到分区 1、2、5、6 和 7。
root@beaglebone:~# ls -l /dev/mmcblk1p*
brw-rw---- 1 root disk 179, 9 Mar 2 23:53 /dev/mmcblk1p1
brw-rw---- 1 root disk 179, 10 Mar 2 23:53 /dev/mmcblk1p2
brw-rw---- 1 root disk 179, 13 Mar 2 23:53 /dev/mmcblk1p5
brw-rw---- 1 root disk 179, 14 Mar 2 23:53 /dev/mmcblk1p6
brw-rw---- 1 root disk 179, 15 Mar 2 23:53 /dev/mmcblk1p7
lsblk 显示相同:
root@beaglebone:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
mmcblk0 179:0 0 7.2G 0 disk
└─mmcblk0p1 179:1 0 3.3G 0 part /
mmcblk1 179:8 0 3.6G 0 disk
├─mmcblk1p1 179:9 0 100M 0 part
├─mmcblk1p2 179:10 0 1K 0 part
├─mmcblk1p5 179:13 0 300M 0 part
├─mmcblk1p6 179:14 0 500M 0 part
└─mmcblk1p7 179:15 0 500M 0 part
mmcblk1boot0 179:16 0 4M 1 disk
mmcblk1boot1 179:24 0 4M 1 disk
即使在重新启动后也是如此。我正在尝试从运行 debian 9(Linux beaglebone 4.4.84-ti-r120)的 SD 卡启动。
有人知道这里可能会发生什么吗?我是否达到了某种极限?
资源
所以,传递
mmcblk.perdev_minors=16
内核引导行。至少在内核开发人员似乎假设 MMC 有四个分区的固定限制。 https://elixir.bootlin.com/linux/v3.3/source/drivers/mmc/card/block.c#L1587
编辑:
超级用户已经问过这个问题,并在 Beaglebone Black 内核维护者 Robert C Nelson 的帮助下回答了这个问题。答案与已发布的 Ignacio Vazquez-Abrams基本相同,但缺少有关启动参数的信息。
mmcblk: using 16 minors per device
阅读源代码,如果mmcblk.perdev_minors=16
引导参数正常工作 ,内核应该会打印出来。https://elixir.bootlin.com/linux/v4.4.84/source/drivers/mmc/card/block.c#L2694就像 Dave 一样,传递内核参数 mmcblk.perdev_minors=16 对我没有帮助(是的,我的内核配置了 CONFIG_MMC_BLOCK=y)。使用脚本 extract-vmlinux 并在未压缩的二进制文件中搜索字符串,结果发现我的内核需要以下参数:
mmc_block.perdev_minors=16
用 mmc_block 替换 mmcblk 让我可以看到我所有的分区。我正在使用内核 4.4.75,文档仍然在该源树中显示 mmcblk 而不是 mmc_block。
我发现这个问题及其答案对于开始调试我的问题非常有用,并希望我的回答能帮助其他人使用较新的内核。