我买了一个 Seagate ST3000DM001 3TB 硬盘。它是装在机箱里出售的。我将其格式化为 ext4,复制了一些数据,然后将其从机箱中取出并直接连接到主板。我的数据对操作系统不可见(它看到一个未知的 ~300GiB 分区,其余部分为可用空间),所以我开始阅读有关高级格式化和 >2TB 驱动器的信息。
我再次用 USB 连接磁盘,复制所有数据,然后再次插入 sata。我使用 gparted 创建 GPT 分区表(ubuntu 磁盘实用程序不允许我这样做Error synchronizing after initial wipe: Timed out waiting for object (udisks-error-quark, 0
),创建一个大的 3Tb Ext4 分区,保留默认Align to
值MiB
并格式化。
驱动器被正确识别,并正确安装。文件可以成功地从驱动器复制或复制到驱动器。
然而:
Gparted 显示磁盘有 512k 个扇区,但我知道这不是真的1
虽然cat /sys/block/sdb/queue/physical_block_size
报告4096
我发现一些报告libparted
存在非 512k 扇区的问题2和别的3说明与 MiB 对齐就足够了。
当我选择最小时,Parted 报告驱动器已对齐:
(parted) align-check
alignment type(min/opt) [optimal]/minimal? min
Partition number? 1
1 aligned
(parted)
我的配置正确吗?由于磁盘格式化为 512k 个扇区,我的性能是否会受到影响,gParted 是否报告了错误值,或者我理解错了整个事情?
答案1
首先,大多数高级格式驱动器都具有逻辑扇区大小为 512 字节,尽管身体的扇区大小为 4096 字节 (4KiB)。这是通过调整驱动器固件中的数据来实现的,这可能会导致性能问题如果分区没有正确对齐。但这可能不是问题的根源,你对分区对齐的关注是错误的。(可以肯定的是,分区对齐是重要;但这并非问题的根源。)
我的直觉(而且它是(可能只是一种预感)是您的问题是在 USB 外壳和磁盘直接连接之间切换导致的。一些外壳将磁盘上的 512 字节逻辑扇区转换为呈现给计算机的 4096 字节逻辑扇区 - 即与高级格式磁盘中的固件所做的相反。我不确定,但我怀疑某些外壳仅在超过 2TiB 的磁盘上执行此操作。MBR 和 GPT 分区方案都按扇区号引用数据,因此更改扇区大小会使分区数据无效。因此,如果您在以这种方式转换的 USB 外壳中准备磁盘,然后尝试直接使用磁盘(反之亦然),您会看到错误,因为分区(甚至 GPT 备份数据)不会在计算机期望的位置。这就像告诉一个蒙着眼睛的人“向前走 2 英尺”,你的意思是 2 英尺,但这个人认为你的意思是 2 米,所以走进一堵墙。
解决此问题的方法是准备并使用磁盘一方式 - 任何一个使用 USB 外壳或者使用直接连接,而不是两者兼而有之。如果出于某种原因两者都是必需的,则需要找到一个无需应用此类转换即可工作的外壳。
为了验证我的假设,你可以使用一个工具(如parted
)来报告逻辑扇区大小。例如:
sudo parted /dev/sda print
Model: ATA Hitachi HDP72505 (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
我从此输出中省略了大量信息。重要的细节在此处显示的最后一行中:逻辑扇区和物理扇区大小均为 512 字节。如果您运行此测试,然后以另一种方式重新连接磁盘并再次运行,则可以比较结果。如果逻辑扇区大小根据您连接磁盘的方式而变化,则我的假设是正确的,并且它是问题的根源。或者至少,这是一个问题;也可能还有其他问题。特别是,Error synchronizing after initial wipe
您提到的错误可能表明存在另一个问题。另一方面,这可能是尝试从磁盘末尾以外读取备份 GPT 数据的副作用parted
。无论哪种方式,如果您看到逻辑扇区大小发生变化,则应在处理其他任何事情之前解决该问题。如果您想对磁盘重新分区但因错误而出现问题Error synchronizing
,请尝试使用gdisk
或cgdisk
(在gdisk
包中)而不是parted
或 GParted;该gdisk
系列比该系列更能抵御错误parted
。
答案2
它报告 512 字节,因为这是与旧操作系统(Windows)向后兼容的逻辑扇区大小。 (g)parted 将分区对齐到 1 MiB,这足以与使用 4k 物理扇区的驱动器正常工作,所以这样就没问题了。
答案3
Linux 内核和实用程序均已进行更改以支持高级格式驱动器。这些更改可确保高级格式驱动器上的所有分区在 4K 扇区边界上正确对齐。内核版本 2.6.31 及更高版本提供对高级格式驱动器的内核支持。以下 Linux 实用程序支持对高级格式驱动器进行分区和格式化:
Fdisk:GNU Fdisk 是一个用于对硬盘进行分区的命令行实用程序。1.2.3 及以上版本支持高级格式化驱动器。
Parted:GNU Parted 是一款用于对硬盘进行分区的图形化实用程序。2.1 及以上版本支持高级格式化硬盘。
4K 原生 (4Kn) 磁盘具有 4 KB 逻辑扇区大小。现代操作系统可以在这些磁盘上存储数据,但通常无法从这些磁盘启动。这些磁盘通常是具有 USB 连接的外部驱动器。
要创建用作媒体存储设备的分区,只需按键盘上的Ctrl+ Alt+T打开终端。打开后,运行以下命令:
sudo mkfs.ext4 -m 0 /dev/sdb1
大多数 4k 磁盘的物理扇区大小为 4096 字节,因此 3TB 可以装在磁盘上,但它们仍具有 512B 逻辑扇区大小,以兼容期望一个扇区为 512B 的操作系统。这就是为什么当您使用 parted 中的打印命令打印详细信息时,会显示扇区大小逻辑/物理 512B/4096B。这是正常的。
这种“转换”是由磁盘本身的智能完成的,这是很正常的。它应该就是这样运作的。
如果您看不到整个 3TB,请首先检查 BIOS 中是否没有限制磁盘大小。也许您需要更新 bios 来支持磁盘。
另外,使用 parted 从 0 开始创建分区也是一个错误。您需要从扇区 2048(相当于 1MiB)开始第一个分区,以便磁盘上的分区对齐,从而实现最佳性能。
因此,将单位更改为 MiB,打印磁盘详细信息,同时还将打印 MiB 中的磁盘大小,并创建从 1MiB 开始到最后一个 MiB(或倒数第二个 MiB)结束的分区(如果您只想要单个分区)。
例如,3TB 磁盘实际上应该有 2,861,022 MiB。因此,在名为 /dev/sdX 的磁盘设备上创建一个跨整个磁盘的分区将如下所示(将 X 替换为正确的字母):
sudo parted /dev/sdX
unit MiB
mklabel gpt
print (to see the total size in MiB)
mkpart primary 1 2861022
quit
如果磁盘大小比 2861022 多或少几个 MiB,则调整结束位置。
就这样。之后在分区上创建所需的文件系统。
资料来源和额外阅读材料
答案4
只要您将分区对齐为 4KB 的倍数,就没问题。否则,您无需对具有 4KB 物理扇区的驱动器执行任何特殊操作。
旧的分区软件将分区对齐到 63x512B 扇区的倍数,如果驱动器具有 4KB 物理扇区,这将导致性能不佳,因为这是 31.5 千字节,而不是 4KB 的倍数。
实际上,Ubuntu 中现在没有可用的分区软件可以做到这一点(除非您以某种方式特别请求它这样做)。大多数默认会对齐到 1MiB 的倍数(2048x512B 扇区,也就是 256x4KB 扇区)。
如果不对齐,会发生什么情况?
如果您不将分区对齐为 4KB 的倍数,最糟糕的情况是性能损失(对于小文件来说,损失相当大)。具有 4KB 扇区的驱动器往往会模拟 512B 扇区以兼容现有系统。因此,如果您将它们视为 512B 扇区驱动器,它们可以完美运行。但是当您写入单个 512B 区域时,它将重写整个 4KB 扇区。
因此,出于性能原因,重要的是确保文件系统中使用的 4KB 簇与驱动器上的 4KB 扇区对齐,这样单个簇写入不会导致需要在驱动器上写入两个 4KB 扇区。