使用 Parted 对高级格式硬盘上的分区进行正确对齐

使用 Parted 对高级格式硬盘上的分区进行正确对齐

首先,我使用 parted 在新的 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

请注意,此磁盘使用的是高级格式,但向 Parted 正确报告了物理扇区大小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和 204840(204839s+ 1)都可以被 整除,但我们仍然会收到警告8。为什么?

答案1

Parted 只是过于保守了。如今通常的做法是将分区对齐到 1MiB(2048 个扇区)边界,因为这适用于高级格式磁盘、需要对齐的某些类型的 RAID 设置以及大多数 SSD。对于高级格式磁盘,只要对齐是 8 的倍数,就没问题,而 2048 是 8 的倍数。丢失的磁盘空间微不足道——如果我的计算正确并且没有输入任何错误的话,它只占总磁盘空间的 0.0000336%。所以不用担心;只需使用 1MiB 对齐即可。

答案2

我可能要补充一点,在 Linux 上,可能会遇到parted永远无法通过最佳的和一个最小同时进行对准检查。

原因是parted(至少从 3.2 版开始)依赖于libblkid,而后者又报告来自/sys/block/<disk>/queue/minimum_io_size和的值/sys/block/<disk>/queue/optimal_io_size(参见io-限制.txt)。

因此,虽然对于高级格式磁盘,前者可能类似于 4k,但后者可能具有一些疯狂的值 - 例如65535 * 512 == 33553920

现在,如果我们查看源代码,“正确”或“最佳性能”对齐由以下公式定义:parted.c::partition_align_check()

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

其中,grain_size来自上面的 I/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很可能会给你相同的 4096 B。)

那么,分开最佳的检查意愿绝不同时通过最小检查一下,可能会有点令人困惑。

考虑到这一点——如果有疑问,看看queue/optimal_io_sizequeue/minimum_io_size,如果前者不能被后者整除,那就忽略parted的警告,自己决定是否要使用最佳的最小查看。

相关内容