我正在尝试在闪存设备上创建一个 256KB 的分区。我首先输入分区号 (1) 和第一个扇区 (2048) 的默认值。但是,当我为最后一个扇区输入“+256K”时,它会创建一个大小为 512 B 的分区。您能帮我理解为什么会发生这种情况吗?我相信根据文档和教程,我为 256KB 分区输入了正确的输入。

以下是控制台命令和输出:

Command (m for help): n
Partition number (1-128, default 1): 
First sector (34-31116254, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-31116254, default 31115263): +256K

Created a new partition 1 of type 'Linux filesystem' and of size 512 B.

Command (m for help): p
Disk /dev/sdc: 14.84 GiB, 15931539456 bytes, 31116288 sectors
Disk model: STORAGE DEVICE  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5112D407-F33A-446F-B778-3DE3AB57B804

Device     Start   End Sectors  Size Type
/dev/sdc1   2048  2048       1  512B Linux filesystem


最佳答案
3

默认情况下,fdisk 将所有分区与最近的粒度对齐,在这种情况下,不幸的是,这意味着分区末端向下对齐,并导致 1 个扇区长的分区:

8673: libfdisk:      CXT: [0x55f20b20d4c0]: 2048 in range <2048..200704> aligned to 2048
8673: libfdisk:      GPT: new partition: partno=0, start=2048, end=2048, size=1

(fdisk 输出LIBFDISK_DEBUG=all)。遗憾的是,非常小的分区的分区对齐并不总是按预期工作,您可以在中阅读有关此对齐的更多信息。

如果您想阻止 libfdisk 执行此操作,您需要指定所需的扇区精确大小,在您的情况下为 512(+511获得 512 个扇区):

Command (m for help): n
Partition number (1-128, default 1): 
First sector (2048-204766, default 2048): 
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-204766, default 202751): +511

Created a new partition 1 of type 'Linux filesystem' and of size 256 KiB.
Command (m for help): p
Disk /dev/loop0: 100 MiB, 104857600 bytes, 204800 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 5B936EAF-D33A-4526-9BBC-DD5E8B88E705

Device       Start   End Sectors  Size Type
/dev/loop0p1  2048  2559     512  256K Linux filesyste

5

  • 不错的发现。仅从源代码来看,我也没有想到 +512 可以工作,所以我甚至没有尝试。


    – 

  • 感谢 Voljtech 的帮助。请问您说的“最近谷物”是什么意思?


    – 

  • 3
    “粒度通常为 1MiB(对于最佳 I/O 大于 1MiB 的设备,粒度更大)。”(来自我在答案中链接的 libfdisk 文档)因此,在您的情况下,它意味着向下舍入到 1 MiB(2048 个扇区),这也是分区的开始。


    – 

  • 1
    (+511 to get 512 sectors)我鄙视的另一个原因fdiskutil-linux:虽然它可以而且应该被视为+num扇区的大小,但维护者坚持认为将其视为“结束减开始”是“有意义的”。


    – 


  • @VojtechTrefnywhere optimal I/O is greater than 1MiB顺便说一句,市场上几乎所有用于 (S)ATA 驱动器的 UAS 桥接器都出于某种原因在其固件中宣传硬编码的最佳 I/O 大小为 65535 (0xffff),因此当 fdisk 试图变得“聪明”时,情况会很糟糕。(更不用说它以如此隐含的方式进行所有这些“更正”,以至于您最终可能只有在为时已晚时才意识到事情做错了。)


    – 


我不确定这是错误还是故意的,但似乎fdisk在使用 GPT 分区表和相对值 (+,-) 时会强制对齐。

当您使用调试选项运行时,您可以看到发生的情况fdisk(产生大量噪音):

# FDISK_DEBUG=all LIBFDISK_DEBUG=all fdisk /dev/loop0
[…]
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-20446, default 18431): +256K
142514: fdisk:      ASK: user's reply: >>>+256K<<< [rc=0]
142514: fdisk:      ASK: parsed size: 262144
142514: fdisk:      ASK: final offset: 2560 [sig: +, power: 1, relative]
142514: libfdisk:      ASK: [0x57622c6db250]: do_ask done [rc=0]
142514: libfdisk:      CXT: [0x57622c698460]: 2048 in range <2048..16384> aligned to 2048
142514: libfdisk:      GPT: new type: af3dc60f-8384-7247-8e79-3d69d8477de4
142514: libfdisk:      GPT: new partition: partno=0, start=2048, end=2048, size=1
[…]

如果是 2048 +256K,它首先会正确地显示为 2560,但随后会将其恢复为 2048,从而产生单个扇区分区。强制它使用 2560 作为最小值,它会跳转到 4096,从而产生 1 MiB 分区。

从技术上讲,上述输出中的 CXT: 调试消息是错误的,它在修改之后才打印 lba。它应该显示2560 in range <2048..16394> aligned to 2048

2048、4096、2560 都太大了 1,这个多余的扇区在对齐步骤后被减去。

总结:改用绝对值。目前看来,这些值仍然有效。或者,即使您不需要整个 MiB,也可以考虑制作 MiB 对齐的分区。

3

  • 这很有见地,感谢您调查此问题!下次我一定会使用调试选项。


    – 

  • 1
    I'm not sure if this is a bug or intentional这纯粹是愚蠢的。没有正当理由“对齐”大小——它可以像 g(ptf)disk 一样,在每个新分区命令提示符中完全对齐默认的开始。


    – 

  • @TomYan 微软曾声称,当偏移量为奇数(例如旧系统中的 63)时,许多“高级格式”磁盘都会出现性能问题。鉴于他们对兼容性的承诺,这种说法可能有些道理。Fdisk 可能只是遵循了 Vista 处理这些问题的方式。


    – 

为什么您只想对齐分区的开头,而不将末尾的空间用于下一个可能的分区?返回分区末尾的剩余扇区以供使用可以为文件系统提供更多自由。但是,将它们保留给 SSD 可能更有意义,其中保留的空间仅在内部用于“回收”重写的旧扇区并允许修剪(或 I/O 故障自动更正),以提高存储的可靠性和修剪操作的效率(为了获得更好的性能,避免在有太多扇区需要回收并且修剪没有时间在后台回收所有扇区时出现延迟,当 SSD 固件本身不太忙而无法处理其他 I/O 时:为修剪提供额外的空间允许固件更好地安排修剪操作,在某些情况下,修剪操作可以与在其他物理空间范围上运行的其他 I/O 并行进行)。

通常在 SSD 上,我从不分配任何分区,并保留约 10% 的未分配空间;这可能比避免在主动写入期间锁定的实际需要要多得多,但它可能仍然有助于更好地分配物理扇区上的写入,并避免物理扇区的过早结束使用寿命。然而,现代 SSD 通过将其隐藏在广告的可用空间之外来保留此空间,因此 1 TiB(二进制)物理 SSD 可能显示为 1TB(十进制)可用空间,其中“隐藏”的保留空间(约 10%,即这里约 100GB)非常大,用于非常有效地调度修剪操作,并在物理扇区出现无法修复的写入缺陷时为扇区重新映射保留大量可用空间,或用于保存逻辑到物理扇区映射的安全镜像(和自动更正数据)。

因此,也许我们不再需要保留这些额外的空间(早期的 SSD 建议如此)。因此,让我们将它们提供给我们的逻辑分区以及在其上使用的文件系统,以提供额外的可用空间,从而避免重写逻辑扇区并避免 SSD 固件安排的大多数修剪操作。我认为没有必要不使用分区末尾的额外扇区(小于 1MB),因为这不会给文件系统的元数据增加任何重大开销。


现代的SSD固件最终已调整为保留正确数量的物理空间,以实现长期可靠性和性能,并且对修剪的影响非常小(并且操作系统中的现代文件系统驱动程序可以控制如何为特定范围的逻辑扇区安排修剪,从而允许SSD固件更好地安排这些操作与更多范围的物理扇区的正常I / O并行静默运行):事实上,现在SSD的使用寿命比任何HDD都要好得多(但对于大多数USB闪存驱动器或SD卡来说情况并非如此,它们仍然会频繁“冻结”并阻止设备上的所有进一步写入,因为可用的回收空间不足:闪存驱动器中嵌入的固件或SD卡控制器的固件仍然非常愚蠢,使得这些设备不可靠,无法进行长期存储或操作;它们会在没有“SMART”监控事先通知的情况下停止工作,它们不能用于静态存储以外的其他用途,甚至可能无法在以后读取被动档案和备份!

然而,如今 SSD 上的长期存档/备份非常可靠,远比硬盘或磁带可靠得多,而且由于密度更高、体积和重量更小、抗冲击性更强、抗氧化、防水、防火等性能更佳,因此每 GB 的初始购买成本和存档成本现在甚至更低。在这种情况下,没有必要在用于这些备份/存档的分区末尾保留额外的未使用空间(因为几乎不需要任何修剪,除非当我们不再需要旧备份映像时“重新格式化”这些设备,修剪将在非常大的范围内进行,这些范围可以在 SSD 固件中高效并行运行,而不会因几乎立即重新使用该空间而产生过多的延迟)。

那么,当当今使用的所有存储设备都提供远大于 1MB 的容量时,为什么您希望任何逻辑分区大小都小于 1MB?如果您想模拟旧软盘,只需在文件系统中创建一个软盘映像文件,然后您就可以在该分区中存储许多这样的映像。

1

  • 长篇大论地讨论了为什么人们可能不想创建一个小的分区,但没有回答实际的问题:为什么会发生这种情况


    –