使用 parted 创建对齐的分区

Mar*_*arc 86 partition gpt

我正在使用parted对非 SSD 硬盘进行分区,因为我想要一个 GPT 分区表。

parted /dev/sda mklabel gpt
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试创建正确对齐的分区,因此我使用以下命令来了解第一个扇区的开始位置:

parted /dev/sda unit s p free

Disk /dev/sda: 488397168s
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End         Size        File system  Name      Flags
        34s    488397134s  488397101s  Free Space
Run Code Online (Sandbox Code Playgroud)

我们可以看到它从扇区 34 开始(这是使用此分区表时的默认值)。

因此,要创建我尝试的第一个分区:

parted /dev/sda mkpart primary 63s 127s
Run Code Online (Sandbox Code Playgroud)

将它对齐到第 64 扇区,因为它是 8 的倍数,但它显示:

警告:生成的分区没有正确对齐以获得最佳性能。

我硬盘中的逻辑和物理扇区大小均为 512 字节:

cat /sys/block/sda/queue/physical_block_size
512

cat /sys/block/sda/queue/logical_block_size 
512
Run Code Online (Sandbox Code Playgroud)

如何创建正确对齐的分区?我究竟做错了什么?

lik*_*lik 90

为了对齐分区,parted您可以使用--align选项。有效的对齐类型是:

  • none - 使用磁盘类型允许的最小对齐方式。
  • 圆柱体- 将分区与圆柱体对齐。
  • 最小- 使用磁盘拓扑信息给出的最小对齐方式。这和 opt 值将使用磁盘提供的布局信息来将逻辑分区表地址与磁盘上的实际物理块对齐。min 值是将分区正确对齐到物理块所需的最小对齐,这可以避免性能下降。
  • 最佳使用磁盘拓扑信息给出的最佳对齐方式。这以保证最佳性能的方式与物理块大小的倍数对齐。

另一个有用的提示是,您可以使用百分比设置大小以使其对齐。从 0% 开始到 100% 结束。例如:

parted -a optimal /dev/sda mkpart primary 0% 4096MB

  • 命令不应该以“0% 100%”结尾吗?“4096MB”从何而来? (8认同)
  • 此处使用值 4096MB 只是一个示例,以显示混合百分比和特定大小数字的能力 (6认同)
  • 请注意,我必须将“0%”括在引号中,以便我的 shell 正确执行命令。 (6认同)
  • 别介意上面的内容,我只是注意到分开的 `print` 使用 kB 作为 1000 字节...... (3认同)

Mat*_*man 12

通过@lik接受的答案显示了如何指定首选对齐。但是,parted 总是使用该对齐来检查生成的分区,但并不总是使用该对齐创建分区。

TL;DR:当 1MiB 是最佳对齐时,指定 0% 将适用于 200MiB 和更大的磁盘。对于较小的磁盘或较大的对齐,指定 0G 可以在 0% 不起作用的情况下工作。原因见下文。

Parted 在创建分区时确实会尝试满足对齐约束,但它也不会偏离您请求的值太多。什么算作“太多”取决于您如何指定位置。

当您为 mkpart 命令指定开始(或结束)位置时,它会在内部生成一系列可接受的值。这个范围以您指定的值为中心,并在两侧均等地扩展为您使用的单位大小的一半(这是我从代码中读取的内容注释说两端都是一个完整的单位大小)。

例如,当您指定“10M”时,它会尝试使用 9.5M 和 10.5M 之间的任何位置。百分比也是如此,因此如果您指定 0%,它将使用 0% 到 0.5% 之间的任何值(显然它不会变成负数)。

一个例外是,当使用两个单位的幂(例如 1024 的 KiB,而不是 1000 的 K)时,parted 假定您正在尝试指定一个确切的位置,并且只考虑您指定的确切值。

由于最佳对齐通常似乎是 1MiB 对齐,因此 K 和 M 单元通常没有足够的空间来达到最佳对齐。在 G 中指定位置应该有足够的空间,但 % 通常也可以。

所以,这就是为什么 0% 通常有效的原因,尽管即使这样也有限制。

  • 实际上,这方面的文档似乎有点草率,因为它[仅指定例如“kB”作为千字节的允许单位](https://www.gnu.org/software/parted/manual/parted.html#unit ) ([此处](https://www.gnu.org/software/parted/manual/parted.html#Running-Parted) 它记录了数字后缀使用与单位 commnad 相同的单位)。然而,[代码](https://git.savannah.gnu.org/cgit/parted.git/tree/libparted/unit.c?h=v3.2&id=1677dbbb#n452)实际上似乎只看前两个字符,但也是小写,这就是为什么“kB”、“k”和“K”(甚至“kFOO”)都有效。 (2认同)

Mar*_*arc 11

我的解决方案是使用gdisk,它可以默认在 2048 个扇区 (1024KiB) 上自动执行分区对齐,尽管它可以在专家菜单中更改。


小智 11

来自Arch 维基

创建分区时,parted 可能会警告不正确的分区对齐,但不会提示正确对齐。例如:

(parted) mkpart primary fat16 0 32M
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?                                                     
Run Code Online (Sandbox Code Playgroud)

警告表示分区start未对齐。

Ignore无论如何输入继续,打印扇区中的分区表以查看它的开始位置,并删除/重新创建分区,并将起始扇区四舍五入到增加的 2 次幂,直到警告停止。例如,在具有 512B 扇区的闪存驱动器上,Parted 希望分区从 2048 的倍数的扇区开始,即 1MB 对齐。

此外,在这一部分的正上方,他们声明更精确的 IEC 二进制单位 KiB、MiB、GiB 等,以及不太精确的 KB、MB、GB 等单位都可以接受。

就个人而言,我解决这个问题的确切命令是:

mkpart hd ext4 1024KiB 8470MB
Run Code Online (Sandbox Code Playgroud)

它没有抱怨,我猜它想要 1MB 对齐。


小智 9

一个小的更正。据我了解,GPT 磁盘不再有分区类型,它们都是“主要”磁盘。命令“mkpart primary”不会像在 msdos 磁盘上那样创建主分区,它只是创建一个称为主分区。您也可以使用命令

(parted) mkpart Parted-FUN! 21476MB 4000787MB
(parted) print
Model: ATA ST4000DM000-1F21 (scsi)
Disk /dev/sdf: 4000787MB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start    End        Size       File system  Name         Flags
 1      1.05MB   17181MB    17180MB    ext4         raid-var
 2      17181MB  21476MB    4295MB                  raid-swap
 3      21476MB  4000786MB  3979310MB               Parted-FUN!
Run Code Online (Sandbox Code Playgroud)

如果您尝试创建逻辑分区,这可能会引起混淆,我知道这对我有用。

(parted) mkpart extended 21476MB 4000787MB
(parted) mkpart logical 21476MB 1000787MB
Warning: You requested a partition from 21476MB to 1000787MB.
The closest location we can manage is 4000786MB to 4000786MB.
Is this still acceptable to you?
Yes/No? Yes
(parted) print
Model: ATA ST4000DM000-1F21 (scsi)
Disk /dev/sdf: 4000787MB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start      End        Size       File system  Name       Flags
 1      1.05MB     17181MB    17180MB    ext4         raid-var
 2      17181MB    21476MB    4295MB                  raid-swap
 3      21476MB    4000786MB  3979310MB               extended
 4      4000786MB  4000786MB  0.00MB                  logical
Run Code Online (Sandbox Code Playgroud)

您不能在名为“扩展”的分区内创建名为“逻辑”的分区。


sim*_*nes 6

这有效,对我来说是最简单的解决方案:

parted /dev/sda
(parted) mklabel gpt
(parted) unit s
(parted) mkpart primary ext4 0% 100%
Run Code Online (Sandbox Code Playgroud)

我从hqcodeshop.fi的“尝试 4”中发现了这一点