Правильное выравнивание разделов на жестком диске расширенного формата с помощью Parted

15

Сначала я создаю правильно выровненный раздел в новой таблице GPT, используя parted, указав проценты для начала и конца раздела:

# 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

Обратите внимание, что этот диск использует расширенный формат, но правильно сообщает размер физического сектора 4096Bв Parted. Давайте посмотрим на это снова, используя секторы как единицу:

# 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
  • Почему он начал раздел с, 2048sа не 34sс первого возможного сектора ?
  • 34sне является правильно выровненным начальным сектором, если размер физического сектора равен 4096Bлогическому (который вы указываете в Parted) размеру сектора 512B. Правильно выровненный начальный сектор делится на один 8(поскольку размер физического сектора / размер логического сектора = 8). Но это означает, что 40sэто первый правильно выровненный начальный сектор, но он не используется. Почему?

Если мы попытаемся создать правильно выровненный раздел 100MiBемкости, начиная 40sс новой таблицы разделов 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)
  • Мы все еще получаем Warning: The resulting partition is not properly aligned for best performance.предупреждение, хотя 40sи 204840 ( 204839s+ 1) делятся на 8. Почему?
Исключен
источник

Ответы:

23

Расстались, просто чрезмерно консервативны. В настоящее время обычной практикой является выравнивание разделов на границах 1 МБ (2048 секторов), поскольку это работает на дисках Advanced Format, на определенных типах настроек RAID, которые требуют выравнивания, и на большинстве твердотельных накопителей. Для диска расширенного формата, если выравнивание кратно 8, у вас все в порядке, а 2048 - кратно 8. Потерянное дисковое пространство - ничтожно - 0,0000336% от общего дискового пространства, если бы я это сделал математика права и ничего не опечатка. Так что не беспокойся об этом; просто используйте выравнивание 1MiB.

Род Смит
источник
Да, потерянное дисковое пространство не имеет значения для меня. Я просто хотел знать, что я все правильно понял. Я сейчас проверяю исходный код Parted, но это занимает немного больше времени, чем у меня есть время. Поэтому я просто буду использовать выравнивание 1MiB. Спасибо за помощь еще раз!
удалено
1
Стоит отметить, что это не просто консервативность разделения, а скорее ограничение блочного уровня Linux. Диски ATA не дают optimal_io_sizeподсказки. Следовательно, нет никакого способа различить «устаревшие» устройства ATA, которые не предоставляют alignment_offsetи по alignment_offsetумолчанию равны 0, и те, которые имеют alignment_offset=0. Для таких дисков fdisk / parted использует выравнивание разделов размером 1 МБ .
roolebo
1
И само число - выравнивание разделов в 1 МБ происходит из-за поведения Windows Vista , как указано в разделенном коммите .
roolebo
1

Я, вероятно, добавлю, что в Linux можно столкнуться с ситуацией, когда partedникогда не удастся пройти оптимальную и минимальную проверку выравнивания одновременно.

Причина этого заключается в том, что parted(по крайней мере, libblkidначиная с версии 3.2) используется метод , который, в свою очередь, сообщает значения из /sys/block/<disk>/queue/minimum_io_sizeи /sys/block/<disk>/queue/optimal_io_size(см. Io-limit.txt ).

Таким образом, в то время как для диска Advanced Format первый, вероятно, будет чем-то вроде 4k, последний может иметь какое-то безумное значение - например 65535 * 512 == 33553920.

Теперь, если мы посмотрим на исходный код - выравнивание «правильное» или «наилучшее исполнение» определяется по формуле в parted.c :: partition_align_check () :

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

откуда grain_sizeберется размер блока ввода-вывода, указанный выше, geom.startэто смещение нашего раздела, а смещение выравнивания pa->offsetдовольно часто равно нулю.

По умолчанию parted предполагает, что 1 MiB будет оптимальным, а ~ 4k будет минимальным (не совсем так, это немного упрощенно) размером блока, поэтому эти значения будут коррелировать; однако, если libblkidрешит иначе, partedсклонен доверять ему, и заменить это значение по умолчанию 1 МБ на значение, найденное в /sys/block/<disk>/queue/optimal_io_size. (В то же время, /sys/block/<disk>/queue/minimum_io_sizeвполне вероятно, даст вам те же 4096 B.)

В этом случае разделенная оптимальная проверка никогда не пройдет одновременно с минимальной проверкой, что может немного смущать.

Имея это в виду - если сомневаетесь, посмотрите на queue/optimal_io_sizeи queue/minimum_io_size, и если первое не делится на второе, просто проигнорируйте предупреждение parted и решите для себя, хотите ли вы пройти с оптимальной или минимальной проверкой ,

ジ ョ ー ジ
источник