如何实现 emmc 分区的最佳对齐?

ART*_*ART 2 linux parted gpt uefi

我们有包含 eMMC 的基于 bbb 的定制板。
我们创建了如下分区,

parted --script -a minimal /dev/mmcblk0 \
  mklabel gpt \
  mkpart primary 131072B 262143B \
  mkpart primary 262144B 393215B \
  mkpart primary 393216B 524287B \
  mkpart primary 524288B 1572863B \
  mkpart primary 1572864B 2621439B \ 
  mkpart primary 2621440B 3145727B \
  mkpart primary 3145728B 3276799B \ 
  mkpart primary 3276800B 8519679B \
  mkpart primary 8519680B 13762559B \
  mkpart primary 13762560B 19005439B \
  mkpart primary 19005440B 19267583B \
  mkpart primary 19267584B 19529727B \
  mkpart primary 19529728B 19791871B \
  mkpart primary 20MiB 31MiB \
  mkpart primary ext4 32MiB 232MiB \
  mkpart primary ext4 232MiB 432MiB \
  mkpart primary ext4 432MiB 532MiB \
  mkpart primary ext4 532MiB 592MiB \
  mkpart primary ext4 592MiB 792MiB \
  mkpart primary ext4 792MiB 827MiB \
  mkpart primary ext4 827MiB 3650MiB \
Run Code Online (Sandbox Code Playgroud)

使用上述命令,我们可以对 eMMC 进行分区,但对齐设置为最小。我们想检查如何实现最佳对齐?实现最佳对齐有什么优势吗?我提到了这个链接,但parted -a opt /dev/sdb mkpart primary 0% 100%不能使用类似的解决方案,因为我们需要以下结构。

# parted --list
Model: MMC MMC04G (sd/mmc)
Disk /dev/mmcblk0: 3842MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name        Flags
 1      131kB   262kB   131kB                
 2      262kB   393kB   131kB                
 3      393kB   524kB   131kB                
 4      524kB   1573kB  1049kB               
 5      1573kB  2621kB  1049kB               
 6      2621kB  3146kB  524kB                
 7      3146kB  3277kB  131kB                
 8      3277kB  8520kB  5243kB               
 9      8520kB  13.8MB  5243kB               
10      13.8MB  19.0MB  5243kB               
11      19.0MB  19.3MB  262kB                
12      19.3MB  19.5MB  262kB                
13      19.5MB  19.8MB  262kB                
14      21.0MB  32.5MB  11.5MB               
15      33.6MB  243MB   210MB   ext4         
16      243MB   453MB   210MB   ext4         
17      453MB   558MB   105MB   ext4         
18      558MB   621MB   62.9MB  ext4         
19      621MB   830MB   210MB   ext4         
20      830MB   867MB   36.7MB  ext4         
21      867MB   3827MB  2960MB  ext4         
Run Code Online (Sandbox Code Playgroud)

使用当前命令,如果我们替换为minimaloptimal我们会看到来自 parted 的以下消息,

Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Run Code Online (Sandbox Code Playgroud)

实现最佳对齐的任何指针/建议/更正?

如此链接中的建议,我提取了以下值,

# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/optimal_io_size
0
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/minimum_io_size
512
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/alignment_offset
0
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/physical_block_siz
e
512
Run Code Online (Sandbox Code Playgroud)

mmc utils 给出以下输出,

# ./mmc extcsd read /dev/mmcblk0
=============================================
  Extended CSD rev 1.5 (MMC 4.41)
=============================================

Card Supported Command sets [S_CMD_SET: 0x01]
HPI Features [HPI_FEATURE: 0x03]: implementation based on CMD12
Background operations support [BKOPS_SUPPORT: 0x01]
Background operations status [BKOPS_STATUS: 0x02]
1st Initialisation Time after programmed sector [INI_TIMEOUT_AP: 0x7a]
Power class for 52MHz, DDR at 3.6V [PWR_CL_DDR_52_360: 0x00]
Power class for 52MHz, DDR at 1.95V [PWR_CL_DDR_52_195: 0x00]
Minimum Performance for 8bit at 52MHz in DDR mode:
 [MIN_PERF_DDR_W_8_52: 0x00]
 [MIN_PERF_DDR_R_8_52: 0x00]
TRIM Multiplier [TRIM_MULT: 0x06]
Secure Feature support [SEC_FEATURE_SUPPORT: 0x15]
Secure Erase Multiplier [SEC_ERASE_MULT: 0x02]
Secure TRIM Multiplier [SEC_TRIM_MULT: 0x03]
Boot Information [BOOT_INFO: 0x07]
 Device supports alternative boot method
 Device supports dual data rate during boot
 Device supports high speed timing during boot
Boot partition size [BOOT_SIZE_MULTI: 0x10]
Access size [ACC_SIZE: 0x06]
High-capacity erase unit size [HC_ERASE_GRP_SIZE: 0x08]
 i.e. 4096 KiB
High-capacity erase timeout [ERASE_TIMEOUT_MULT: 0x01]
Reliable write sector count [REL_WR_SEC_C: 0x01]
High-capacity W protect group size [HC_WP_GRP_SIZE: 0x01]
 i.e. 4096 KiB
Sleep current (VCC) [S_C_VCC: 0x08]
Sleep current (VCCQ) [S_C_VCCQ: 0x08]
Sleep/awake timeout [S_A_TIMEOUT: 0x10]
Sector Count [SEC_COUNT: 0x00728000]
 Device is block-addressed
Minimum Write Performance for 8bit:
 [MIN_PERF_W_8_52: 0x08]
 [MIN_PERF_R_8_52: 0x08]
 [MIN_PERF_W_8_26_4_52: 0x08]
 [MIN_PERF_R_8_26_4_52: 0x08]
Minimum Write Performance for 4bit:
 [MIN_PERF_W_4_26: 0x08]
 [MIN_PERF_R_4_26: 0x08]
Power classes registers:
 [PWR_CL_26_360: 0x00]
 [PWR_CL_52_360: 0x00]
 [PWR_CL_26_195: 0x00]
 [PWR_CL_52_195: 0x00]
Partition switching timing [PARTITION_SWITCH_TIME: 0x01]
Out-of-interrupt busy timing [OUT_OF_INTERRUPT_TIME: 0x02]
Card Type [CARD_TYPE: 0x07]
 HS Dual Data Rate eMMC @52MHz 1.8V or 3VI/O
 HS eMMC @52MHz - at rated device voltage(s)
 HS eMMC @26MHz - at rated device voltage(s)
CSD structure version [CSD_STRUCTURE: 0x02]
Command set [CMD_SET: 0x00]
Command set revision [CMD_SET_REV: 0x00]
Power class [POWER_CLASS: 0x00]
High-speed interface timing [HS_TIMING: 0x01]
Erased memory content [ERASED_MEM_CONT: 0x00]
Boot configuration bytes [PARTITION_CONFIG: 0x00]
 Not boot enable
 No access to boot partition
Boot config protection [BOOT_CONFIG_PROT: 0x00]
Boot bus Conditions [BOOT_BUS_CONDITIONS: 0x00]
High-density erase group definition [ERASE_GROUP_DEF: 0x01]
Boot write protection status registers [BOOT_WP_STATUS]: 0x00
Boot Area Write protection [BOOT_WP]: 0x00
 Power ro locking: possible
 Permanent ro locking: possible
 ro lock status: not locked
User area write protection register [USER_WP]: 0x00
FW configuration [FW_CONFIG]: 0x00
RPMB Size [RPMB_SIZE_MULT]: 0x01
Write reliability setting register [WR_REL_SET]: 0x00
 user area: existing data is at risk if a power failure occurs during a write operation
 partition 1: existing data is at risk if a power failure occurs during a write operation
 partition 2: existing data is at risk if a power failure occurs during a write operation
 partition 3: existing data is at risk if a power failure occurs during a write operation
 partition 4: existing data is at risk if a power failure occurs during a write operation
Write reliability parameter register [WR_REL_PARAM]: 0x05
 Device supports writing EXT_CSD_WR_REL_SET
 Device supports the enhanced def. of reliable write
Enable background operations handshake [BKOPS_EN]: 0x00
H/W reset function [RST_N_FUNCTION]: 0x00
HPI management [HPI_MGMT]: 0x01
Partitioning Support [PARTITIONING_SUPPORT]: 0x03
 Device support partitioning feature
 Device can have enhanced tech.
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x0001ca
 i.e. 1875968 KiB
Partitions attribute [PARTITIONS_ATTRIBUTE]: 0x00
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x00
 Device partition setting NOT complete
General Purpose Partition Size
 [GP_SIZE_MULT_4]: 0x000000
 [GP_SIZE_MULT_3]: 0x000000
 [GP_SIZE_MULT_2]: 0x000000
 [GP_SIZE_MULT_1]: 0x000000
Enhanced User Data Area Size [ENH_SIZE_MULT]: 0x000000
 i.e. 0 KiB
Enhanced User Data Start Address [ENH_START_ADDR]: 0x000000
 i.e. 0 bytes offset
Bad Block Management mode [SEC_BAD_BLK_MGMNT]: 0x00
Run Code Online (Sandbox Code Playgroud)

编辑:按照“???? ???????”的建议实现了最佳对齐,除了前 3 个分区(我无法更改)其他小分区更改为最小 1MiB 大小。除了 3 个分区,所有其他分区似乎都对齐了。这是我用于 eMMC 的最新分区脚本。(请注意:在下面的脚本中,我在脚本上面更改了分区大小)

parted --script -a optimal /dev/mmcblk0 \
  mklabel gpt \
  mkpart primary 128KiB 255KiB \
  mkpart primary 256KiB 383KiB \
  mkpart primary 384KiB 511KiB \
  mkpart primary 1MiB 2MiB \
  mkpart primary 2MiB 3MiB \ 
  mkpart primary 3MiB 4MiB \
  mkpart primary 4MiB 5MiB \ 
  mkpart primary 5MiB 10MiB \
  mkpart primary 10MiB 15MiB \
  mkpart primary 15MiB 20MiB \
  mkpart primary 20MiB 21MiB \
  mkpart primary 21MiB 22MiB \
  mkpart primary 22MiB 23MiB \
  mkpart primary 23MiB 30MiB \
  mkpart primary ext4 30MiB 530MiB \
  mkpart primary ext4 530MiB 1030MiB \
  mkpart primary ext4 1030MiB 1130MiB \
  mkpart primary ext4 1130MiB 1190MiB \
  mkpart primary ext4 1190MiB 1720MiB \
  mkpart primary ext4 1720MiB 1755MiB \
  mkpart primary ext4 1755MiB 100%
Run Code Online (Sandbox Code Playgroud)

小智 6

尝试与 eMMC 擦除块大小对齐。根据 eMMC 数据表,它通常等于 0.5、1、2、4、8 MiB。如果你发现块大小对齐浪费了太多内存,那么坚持页面大小,一般在 4..16 KiB 范围内找到。

尽量让分区大小和边界是擦除块大小的倍数,这样当文件系统写入第一个或最后一个FS块时,存储卡不必擦除和重写下一个/上一个分区的开头/结尾。

不要依赖parted的功能来对齐,只需拿一个计算器、笔和一张纸,并以扇区或字节为单位计算正确的边界。

就个人而言,我更喜欢对齐到 8 MiB 边界,因为它不会浪费太多内存,并且任何分区都在擦除块边界上开始和结束,而不管特定的擦除块大小,因此我不需要搜索存储卡文档。

最佳对齐降低了写入放大系数,因此您的内存可以持续更长时间。