Сначала я создаю правильно выровненный раздел в новой таблице 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
. Почему?
источник
optimal_io_size
подсказки. Следовательно, нет никакого способа различить «устаревшие» устройства ATA, которые не предоставляютalignment_offset
и поalignment_offset
умолчанию равны 0, и те, которые имеютalignment_offset=0
. Для таких дисков fdisk / parted использует выравнивание разделов размером 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 () :
откуда
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 и решите для себя, хотите ли вы пройти с оптимальной или минимальной проверкой ,источник