使用Parted在Advanced Format HDD上正确对齐分区


15

首先,我通过在分区的开始和结束位置指定百分比来在新的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) 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 -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是第一个正确对齐的起始扇区,但尚未使用。为什么?

如果我们尝试从新的GPT分区表100MiB开始创建正确对齐的容量40s分区:

# 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和204840s(204839s+ 1)都可被除以,我们仍然会收到警告8。为什么?

Answers:


23

分手只是过于保守。如今,通常的做法是在1MiB(2048扇区)边界上对齐分区,因为它适用于Advanced Format磁盘,某些需要对齐的RAID设置类型以及大多数SSD。对于高级格式磁盘,只要对齐方式是8的倍数,就可以了,而2048是8的倍数。丢失的磁盘空间是微不足道的-占总磁盘空间的0.0000336%(如果我这样做了)数学正确,没有输入任何错误。因此,不必担心。只需使用1MiB对齐方式即可。


是的,丢失的磁盘空间对我来说并不重要。我只是想知道我正确地理解了事情。我目前正在检查Parted的源代码,但是所需时间比我有时间长。因此,我将继续使用1MiB对齐。感谢您再次提供帮助!
删除了2012年

1
值得一提的是,这不仅是分开的保守性,而且是Linux块层的局限性。ATA驱动器不提供optimal_io_size提示。因此,无法区分没有提供默认默认值为0的“传统” ATA设备alignment_offset和具有alignment_offset默认设置的ATA设备alignment_offset=0。fdisk / parted 使用此类驱动器的1MB分区对齐方式
roolebo '19

1
数字本身-1MB分区对齐似乎来自Windows Vista行为,如部分提交中所述
roolebo

1

我可能会补充说,在Linux上可能会遇到parted无法同时通过最佳最小对齐检查的情况。

这样做的原因是parted(至少从3.2版开始)依赖libblkid,而依次报告/sys/block/<disk>/queue/minimum_io_size和的值/sys/block/<disk>/queue/optimal_io_size(请参阅io-limits.txt)。

因此,对于Advanced Format磁盘,前者可能类似于4k,而后者可能具有一些疯狂的价值-例如65535 * 512 == 33553920

现在,如果我们看一下源代码-“适当”或“最佳性能”对齐方式是由parted.c :: partition_align_check()中的公式定义的:

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

其中grain_size从上面我/ O块大小达到,geom.start是我们的分割区的偏移,和对准偏移pa->offset是相当频繁为零。

默认情况下,parted会假设1 MiB是最佳块大小,〜4k是最小块大小(并非如此,这有点简化),因此这些值将相互关联;但是,如果libblkid另有决定,则parted倾向于信任它,并将默认值1 MiB替换为中的值/sys/block/<disk>/queue/optimal_io_size。(同时,/sys/block/<disk>/queue/minimum_io_size很可能会给您相同的4096B。)

在这种情况下,部分最优检查将永远不会最小检查同时通过,这可能会有些混乱。

考虑到这一点-如有疑问,请查看queue/optimal_io_sizequeue/minimum_io_size,如果前者不能被后者整除,请忽略分手的警告,并自己决定要进行最佳检查还是最小检查。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.