我知道这个错误信息困扰着许多试图格式化 USB 驱动器的人。但当我搜索它时,我得到的只是“说明”。但我真的想理解此事的技术背景。
我读了很多关于扇区、圆柱体、块等等的资料......我已经理解了这一切,所以我认为我现在有了扎实的背景知识。
在我读过的所有教程中,没有人提到“物理块大小”。但从我目前的理解来看,我会将其翻译为“设备上的扇区大小”。对吗?
我认为(我没有在任何地方找到对此的确认)“USB 设备描述符”存储在“控制器”的某个地方。它不是 NAND 闪存芯片的一部分。我想象它的工作原理是这样的:我的操作系统向 USB 的控制器芯片发送某种 GET 请求。控制器芯片返回“设备描述符”。该“设备描述符”包含供应商和扇区大小(=物理块大小??)等信息。
这就是我的操作系统知道物理块大小的方式。但是“Linux 声称它是 512”究竟是怎么回事呢?这些信息存储在哪里?Linux 是如何得出这个结论的?
答案1
快速概览(如果您真的想了解所有细节,您必须阅读所有可在线获取的标准):
存储设备的 USB 协议与用于小型计算机系统接口设备。因此,您有读取和写入块的命令,以及一堆其他命令。其中包括READ CAPACITY(16)
(16 表示命令长度为 16 个字节,早期版本只有 10 个字节长),它返回一些其他信息,包括逻辑块的大小以及每个物理块有多少个逻辑块。
这就是操作系统了解逻辑和物理块大小的方式。响应信息存储在控制器的固件中,而不是存储介质中。
现在,对于由 SATA 驱动器和 USB 转 SATA 桥接芯片组成的 USB 硬盘,可能会发生这种情况,即该桥接芯片存在错误,无法正确转发命令的答案READ CAPACITY
(我有一个带有这种芯片的驱动器,我确认通过 SATA 获得了同一磁盘的不同答案)。在这种情况下,即使硬盘正确地声称具有 2048 的物理块大小,桥接芯片也会破坏这个答案,以便操作系统获得相同的物理和逻辑块大小。所以这就是报告的块大小错误的情况的常见原因。
对于 USB 闪存棒,情况又有所不同:桥接器后面没有 SATA 驱动器,USB 棒的控制器和闪存 ROM 形成一个紧密的单元,如果控制器谎报物理块大小,那么它就是在谎报 - 没人能做到。实际上,您甚至不知道它在说谎,因为虽然闪存 ROM 确实有擦除块,可以证明“物理块大小”,但您不知道它们的大小。
从您的问题中无法明确看出您是在谈论 USB 硬盘还是 USB 闪存 ROM - 对于现代硬盘,可以假设它们的物理块大小为 2048,而对于闪存 ROM,则不能假设任何内容,因此在这种情况下您声称的“物理块大小为 2048”有点值得怀疑,除非您能解释您是如何知道的。
最后:“USB 设备描述符”是 USB 协议本身的一部分,是完全不同的东西。
答案2
我认为您将闪存芯片的物理特性与操作系统和文件系统的设置混淆了。
闪存芯片会具有一定的块或扇区大小,这是可以电擦除和写入的最小内存单位。2048 字节的块大小并不罕见。同样,这是闪存电路的物理特性……类似于旋转磁性硬盘的扇区。
文件系统块大小是操作系统用于存储文件或文件的一部分的最小内存单位。这通常在首次格式化介质(例如闪存驱动器)时指定,并且只能在重新格式化存储介质时更改。如果您选择较小的块大小(512 字节是较小的块大小),则存储文件时浪费的内存较少。另一方面,选择较大的块大小意味着存储大文件时碎片较少。通常,当卷具有较大容量时,使用较大的块大小(例如 4096 字节)。