Alineación adecuada de particiones en un HDD de formato avanzado usando Parted


15

Primero creo una partición correctamente alineada en una nueva tabla GPT usando parted especificando porcentajes para el inicio y el final de la partición:

# parted -a optimal /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mktable gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Y
(parted) mkpart primary 0% 1%
(parted) p
Model: ATA WDC WD30EZRX-00M (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start   End     Size    File system  Name     Flags
 1      1049kB  2097kB  1049kB               primary

(parted) quit

Tenga en cuenta que este disco está usando el formato avanzado, pero informa correctamente el tamaño del sector físico 4096Ba Parted. Miremos de nuevo, usando sectores como la unidad:

# parted -a optimal /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) p
Model: ATA WDC WD30EZRX-00M (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start  End    Size   File system  Name     Flags
 1      2048s  4095s  2048s               primary

(parted) quit
  • ¿Por qué comenzó la partición 2048sy no 34scuál es el primer sector posible ?
  • 34sno es un sector de inicio correctamente alineado si el tamaño del sector físico es 4096By el tamaño del sector lógico (que es el que especifique en Parted) es 512B. Un sector de inicio correctamente alineado es divisible por 8(desde el tamaño del sector físico / tamaño del sector lógico = 8). Pero eso significa que 40ses el primer sector de inicio correctamente alineado, pero no se usa. ¿Por qué?

Si intentamos crear una partición de 100MiBcapacidad correctamente alineada comenzando 40sen una nueva tabla de partición GPT:

# parted -a optimal /dev/sdb
GNU Parted 2.3
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Y
(parted) mkpart primary 40s 204839s
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? I
(parted) unit MiB
(parted) p
Model: ATA WDC WD30EZRX-00M (scsi)
Disk /dev/sdb: 2861588MiB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start    End     Size    File system  Name     Flags
 1      0.02MiB  100MiB  100MiB  fat32        primary

(parted)
(parted) unit s
(parted) p
Model: ATA WDC WD30EZRX-00M (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start  End      Size     File system  Name     Flags
 1      40s    204839s  204800s  fat32        primary

(parted)
  • Todavía recibimos la Warning: The resulting partition is not properly aligned for best performance.advertencia, aunque 40s204840 ( 204839s+ 1) son divisibles por 8. ¿Por qué?

Respuestas:


23

Parted es ser demasiado conservador. La práctica habitual en estos días es alinear particiones en los límites de 1MiB (sector 2048) porque esto funciona en discos de formato avanzado, en cierto tipo de configuraciones RAID que requieren alineación y en la mayoría de los SSD. Para un disco de formato avanzado, siempre y cuando la alineación sea un múltiplo de 8, está bien, y 2048 es un múltiplo de 8. El espacio de disco perdido es insignificante - 0.0000336% de su espacio total de disco, si lo hice las matemáticas eran correctas y no escribieron nada mal. Así que no te preocupes por eso; solo use la alineación de 1MiB.


Sí, el espacio en disco perdido no me importa. Solo quería saber que entendía las cosas correctamente. Estoy revisando el código fuente de Parted en este momento, pero lleva un poco más de tiempo que el que tengo. Así que seguiré adelante y usaré la alineación 1MiB. ¡Gracias por ayudar una vez más!
Borrado el

1
Vale la pena mencionar que esto no es meramente conservador de parted sino más bien una limitación de la capa de bloques de Linux. Las unidades ATA no proporcionan optimal_io_sizepistas. Por lo tanto, no hay forma de distinguir entre los dispositivos ATA "heredados" que no proporcionan alignment_offsety el valor alignment_offsetpredeterminado es 0 y los que tienen alignment_offset=0. fdisk / parted usa una alineación de partición de 1 MB para tales unidades.
roolebo

1
Y el número en sí mismo: la alineación de la partición de 1 MB parece provenir del comportamiento de Windows Vista , como se menciona en el commit dividido .
roolebo

1

Probablemente agregaré que en Linux uno puede encontrarse en una situación en la partedque nunca puede pasar una verificación de alineación óptima y mínima al mismo tiempo.

La razón de esto es que parted(al menos a partir de la versión 3.2) se basa libblkid, lo que a su vez informa los valores de /sys/block/<disk>/queue/minimum_io_sizey /sys/block/<disk>/queue/optimal_io_size(ver io-limits.txt ).

Entonces, mientras que para un disco de formato avanzado, el primero probablemente sea algo así como 4k, el último puede tener algún valor loco, por ejemplo 65535 * 512 == 33553920.

Ahora, si miramos el código fuente, la alineación "adecuada" o de "mejor rendimiento" está definida por la fórmula en parted.c :: division_align_check () :

part->geom.start % pa->grain_size == pa->offset, 

donde grain_sizeproviene del tamaño de bloque de E / S anterior, geom.startes nuestro desplazamiento de partición, y el desplazamiento de alineación pa->offsetes con frecuencia cero.

Por defecto, parted supondría que 1 MiB es óptimo, y ~ 4k es el tamaño de bloque mínimo (no es una simplificación), por lo que estos valores se correlacionarían; sin embargo, si libblkiddecide lo contrario, partedtiende a confiar en él y reemplaza ese valor predeterminado de 1 MiB con el valor que se encuentra en /sys/block/<disk>/queue/optimal_io_size. (Al mismo tiempo, /sys/block/<disk>/queue/minimum_io_sizees muy probable que le dé el mismo 4096 B.)

En ese caso, la verificación óptima separada nunca pasará simultáneamente con la verificación mínima , lo que posiblemente podría ser un poco confuso.

Con eso en mente: si tiene dudas, eche un vistazo queue/optimal_io_sizey queue/minimum_io_size, y si el primero no es divisible por el segundo, simplemente ignore la advertencia de 'separación' y decida usted mismo si desea realizar una verificación óptima o mínima. .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.