resumo
Estou tentando entender como calcular o alinhamento das partições subseqüentes de um% 32MiB
alinhado ideal ( 65535
sector) em vez do usual 1MiB
( 2048 sector
).
plano de fundo
Adquiri recentemente um SAMSUNG SSD 850 EVO (M.2 1TB)
# cat /sys/block/sdx/queue/optimal_io_size
> 33553920
# cat /sys/block/sdx/queue/minimum_io_size
> 512
# cat /sys/block/sdx/alignment_offset
> 0
# cat /sys/block/sdx/queue/physical_block_size
> 512
# cat /sys/block/sdx/queue/logical_block_size
> 512
# cat /sys/block/sdx/queue/hw_sector_size
> 512
# fdisk -l
> Disk /dev/sdx: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 33553920 bytes
> Disklabel type: gpt
Calcular o primeiro setor não é difícil.
permite que o GNU parted calcule automaticamente o alinhamento
(parted) mkpart primary 0% 100%
O resultado é um alinhamento que começa no setor 65535
( 32MiB
).
calcule manualmente o alinhamento
(optimal_io_size + alignment_offset) / physical_block_size
Usando os dados de SAMSUNG SSD 850 EVO (M.2 1TB)
e aplicando os resultados da fórmula em
(33553920 + 0) / 512 = 65 535
o problema
Normalmente, ao criar uma partição, simplesmente adiciono o offset + length
das partições anteriores como o início da próxima partição, por exemplo,
(parted) mkpart primary 1MiB 2MiB
(parted) mkpart primary 2MiB 514MiB
(parted) mkpart primary 514MiB 1538MiB
...
Tentativa de algo semelhante para SAMSUNG SSD 850 EVO (M.2 1TB)
(parted) mkpart primary 65535s 67582s # OK ~32MiB 33MiB
(parted) mkpart primary 67583s 100%
or
(parted) mkpart primary 33MiB 100%
resulta no seguinte aviso:
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?
remédio
O drive é bastante exigente, e minha melhor tentativa tem sido calcular setores exatos. Infelizmente, isso resultou em cálculos complicados, nos quais não consigo explicar por que as partições foram alinhadas de forma ideal ( align-check optimal <partition number>
).
(parted) unit s
(parted) print free
Number Start End Size File system Name Flags
34s 65534s 65501s Free Space
1 65535s 67582s 2048s
67583s 131069s 63487s Free Space
2 131070s 1179645s 1048576s
1179646s 1245164s 65519s Free Space
3 1245165s 9633772s 8388608s
9633773s 9699179s 65407s Free Space
4 9699180s 1953467279s 1943768100s
1953467280s 1953525134s 57855s Free Space
Até onde eu posso dizer, cada setor tem que começar com um 65535
interval, que corresponde a ~ 32MiB (ou 65535+1 = 32MiB
). Eu suponho que o deslocamento de bytes é 0
e não 1
. Dado 1MiB = 2048s
.
O primeiro tamanho da partição deve ser 1MiB
, portanto, a parada é 65535 + 2048 - 1 = 67582
.
(parted) mkpart primary 65535s 67582s
Se a partição anterior estiver abaixo de 32MiB
, a próxima partição começará em previous partition offset + 32MiB
. Para a partição 2
no exemplo acima dividido, começa em ~64MiB
( 65535s * 2 = 131070s
). O tamanho deve ser 512MiB
( 512 * 2048 = 1048576
), portanto, a parada é 131070 + 1048576 - 1 = 1179645
.
(parted) mkpart primary 131070s 1179645s
Até aí tudo bem, mas qual seria o começo ideal para a partição 3
? Qual offset é o primeiro intervalo 32MiB disponível?
1179645 / 65535 ~= 18,000223
Atualmente usando 18 intervalos e transbordando no dia 19; a próxima partição deve, portanto, começar no 19º intervalo?
19 * 65535 = 1245165
O tamanho deve ser 4096MiB
( 4096 * 2048 = 8388608
), portanto, a parada é 1245165 + 8388608 - 1 = 9633772
.
(parted) mkpart primary 1245165s 9633772
Para a próxima partição, portanto
9633772 / 65535 ~= 147,0019
148 * 65535 = 9699180
E assim por diante e assim por diante.
Eu não encontrei nenhuma discussão sobre isso antes, e parece que estou complicando demais o particionamento.