Najpierw tworzę poprawnie wyrównaną partycję w nowej tabeli GPT, używając parted, określając wartości procentowe dla początku i końca partycji:
# 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
Zauważ, że ten dysk używa formatu zaawansowanego, ale poprawnie zgłasza rozmiar sektora fizycznego 4096B
do Parted. Spójrzmy na to jeszcze raz, używając sektorów jako jednostki:
# 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
- Dlaczego uruchomił partycję,
2048s
a34s
który nie jest pierwszym możliwym sektorem ? 34s
nie jest odpowiednio wyrównanym sektorem początkowym, jeśli rozmiar sektora fizycznego wynosi,4096B
a logicznym (który określa się w częściowym podziale) jest rozmiar sektora512B
. Odpowiednio wyrównany sektor początkowy można podzielić przez8
(ponieważ rozmiar sektora fizycznego / rozmiar sektora logicznego =8
). Ale to oznacza, że40s
jest to pierwszy właściwie ustawiony sektor początkowy, ale nie jest używany. Dlaczego?
Jeśli spróbujemy utworzyć poprawnie wyrównaną partycję 100MiB
pojemności, zaczynając od 40s
nowej tabeli partycji 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)
- Mimo to otrzymujemy
Warning: The resulting partition is not properly aligned for best performance.
ostrzeżenie,40s
a 204840 (204839s
+ 1) są podzielne przez8
. Dlaczego?
źródło
optimal_io_size
podpowiedzi. Stąd też nie sposób odróżnić „Legacy” urządzeń ATA, które nie przewidująalignment_offset
ialignment_offset
domyślne 0 i te, które, które mająalignment_offset=0
. fdisk / parted używa wyrównania partycji 1 MB dla takich napędów.Dodam zapewne, że w Linuksie można spotkać się z sytuacją, w której
parted
może nigdy nie przejść jednocześnie optymalnej i minimalnej kontroli wyrównania.Powodem tego jest to, że
parted
(przynajmniej w wersji 3.2) opiera się nalibblkid
, co z kolei raportuje wartości od/sys/block/<disk>/queue/minimum_io_size
a/sys/block/<disk>/queue/optimal_io_size
(patrz IO-limits.txt ).Podczas gdy dla dysku w formacie zaawansowanym ten pierwszy może być czymś w rodzaju 4k, drugi może mieć szaloną wartość - np
65535 * 512 == 33553920
.Teraz, gdy spojrzymy na kod źródłowy - „właściwe” lub „wyrównanie najlepszej wydajności” jest zdefiniowane przez formułę w parted.c :: partition_align_check () :
gdzie
grain_size
pochodzi z powyższego rozmiaru bloku I / O,geom.start
to nasze przesunięcie partycji, a przesunięcie wyrównaniapa->offset
jest często zerowe.Domyślnie parted zakłada, że 1 MiB jest optymalny, a ~ 4k to minimalny (nie całkiem, to trochę uproszczenie) rozmiar bloku, więc te wartości byłyby skorelowane; jednak jeśli
libblkid
zdecyduje inaczej,parted
zwykle mu zaufa i zastąpi domyślną wartość 1 MiB wartością znalezioną w/sys/block/<disk>/queue/optimal_io_size
. (W tym samym czasie/sys/block/<disk>/queue/minimum_io_size
prawdopodobnie da ci to samo 4096 B.)W takim przypadku kontrola optymalna z podziałem nigdy nie przejdzie jednocześnie z kontrolą minimalną , co może być nieco mylące.
Mając to na uwadze - w razie wątpliwości, rzucić okiem na
queue/optimal_io_size
iqueue/minimum_io_size
, a jeśli były, nie jest podzielna przez tę ostatnią, zignoruj rozstaliśmy”ostrzeżenia i sam zdecydować, czy chcesz iść z optymalnym lub minimalnej odprawy .źródło