高级格式 (4K) 磁盘兼容性更新

平台

客户端 Windows XP、Windows Vista、Windows 7、Windows 7 SP1、Windows 8
服务器 Windows Server 2003、Windows Server 2008、Windows Server 2008 R2、Windows Server 2008 R2 SP1、Windows Server 2012、Windows Server 2012 R2、Windows Server 2016

说明

本文是针对 Windows 7 SP1 和 Windows Server 2008 R2 SP1 发布的 512 字节仿真 (512e) 磁盘兼容性更新一文的更新版本。 该更新包含许多新信息,其中一些信息仅适用于 Windows 8 和 Windows Server 2012。

面密度每年都在增加,随着最近 3 TB 磁盘的出现,用于处理信噪比 (SNR) 降低的纠错机制变得空间效率低下;也就是说,需要增加开销量来确保介质可用。 用于改进此错误纠正机制的存储行业解决方案之一是引入包含更大物理扇区大小的不同物理介质格式。 此新的物理介质格式称为高级格式。 因此,对现代存储设备的扇区大小所做出任何假设不再安全,开发人员将需要研究其代码背后的假设以确定是否有影响。

本主题介绍高级格式存储设备对软件的影响,讨论应用可以执行的操作来帮助支持这种类型的介质,并讨论 Microsoft 通过 Windows Vista、Windows 7 和 Windows 8 引入的基础结构,使开发人员能够支持这些类型的设备。 虽然本主题中提供的材料提供了关于提高与高级格式磁盘的兼容性的指南,但这些信息通常适用于运行 Windows Vista、Windows 7 和 Windows 8 的所有具有高级格式磁盘的系统。

新大型扇区相关功能的摘要

以下列表总结了 Windows 8 和 Windows Server 2012 中提供的新功能,以帮助改善客户和开发人员的大扇区磁盘体验。 每个项的更详细说明如下。

  • 在 Windows 7 SP1 对对具有仿真功能的 4K 磁盘 (512e) 的支持而构建,并为不具有仿真功能的 4K 扇区大小的磁盘(4K 本机)提供完整的收件箱支持。 一些受支持的应用和方案包括:
    • 无需仿真即可安装 Windows 并从 4K 扇区磁盘中启动(4K 本机磁盘)
    • VHD 和新 VHDX 文件格式
    • 完全 HyperV 支持
    • Windows 备份
    • 完全支持 NT 文件系统 (NTFS)
    • 对新的存储空间和池 (SSP) 的完全支持
    • 对 Windows Defender 的完全支持
  • 提供一个新的 API 来查询物理扇区大小 (FileFsSectorSizeInformation):
    • 可用于网络卷
    • 可以发给任何文件句柄
    • 适用于非特权应用
    • 更友好的使用模型
  • 包括增强型 fsutil 命令行实用程序,用于使用对齐信息查询卷的逻辑和物理扇区大小(没有对齐信息的基本版本的实用程序适用于具有 Microsoft KB 982018 的 Windows 7 和具有 Microsoft KB 982018 的 Windows Server 2008 R2)

高级格式 (4K) 磁盘简介

在介质格式中引入此更改的问题之一是可能会引入与现有软件和硬件的兼容性问题。 作为一种临时的兼容性解决方案,存储行业最初引入了仿真常规 512 字节扇区磁盘的磁盘,但通过标准 ATA 和 SCSI 命令提供有关真实扇区大小的信息。 由于进行了这种仿真,实质上会有两种扇区大小:

逻辑扇区:用于介质逻辑块寻址的单元。 我们还可以将它视为存储可以接受的最小写入单元。 这是仿真操作。
物理扇区:在一次操作中完成对设备的读写操作的单元。 这是原子写入的单元。
大多数当前的 Windows API(例如 IOCTL_DISK_GET_DRIVE_GEOMETRY)将返回逻辑扇区大小,但可以通过 IOCTL_STORAGE_QUERY_PROPERTY 控制代码检索物理扇区大小,相关信息包含在 STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR 结构内的 BytesPerPhysicalSector 字段中。 本文稍后将更详细地讨论这一点。

大型扇区介质的初始类型

存储行业正在迅速加大力度针对物理扇区大小为 4 KB 的介质向这种新的高级格式存储类型过渡。 两种类型的介质将投放到市场:

4 KB 本机:此介质没有仿真层,并且会直接公开 4 KB 作为其逻辑和物理扇区大小。 这种新型介质的总体问题是,大多数应用和操作系统不会查询 I/O 并将其与物理扇区大小保持一致,这可能会导致意外的 I/O 失败。
512 字节仿真 (512e):此介质具有上一部分中所述的仿真层,并将公开 512 字节作为其逻辑扇区大小(类似于当前常规磁盘),但会提供其物理扇区大小信息 (4 KB)。 这种新型介质的总体问题是,大多数应用和操作系统不知道存在的物理扇区大小,这可能会导致许多问题,如下所述。
对大型扇区介质的总体 Windows 支持

该表记录了 Microsoft 对各种介质的官方支持政策及其导致的报告扇区大小。 有关详细信息,请参阅此知识库文章

公用名 报告的逻辑扇区大小 报告的物理扇区大小 支持的 Windows 版本
512 字节本机,512n 512 字节 512 字节 所有 Windows 版本
高级格式,512e,AF,512 字节仿真 512 字节 4 KB 带有 MS KB 2553708 的 Windows Vista
带有 MS KB 2553708 的 Windows Server 2008*
带有 MS KB 982018 的 Windows 7
带有 MS KB 982018 的 Windows Server 2008 R2*
Windows 7 SP1 及更高版本之后的所有 Windows 版本。
Server 2008 R2 SP1 及更高版本之后的所有服务器版本。

*Hyper-V 除外。 请参阅“大型扇区驱动器的应用程序支持要求”部分。
高级格式、AF、4K 本机、4Kn 4 KB 4 KB Windows 8 及更高版本之后的所有 Windows 版本
Windows Server 2012 及更高版本之后的所有服务器版本
其他 不是 4 KB 或 512 字节 不是 4 KB 或 512 字节 不支持

注意

虽然上表中没有强调,但 Windows XP、Windows Server 2003 和 Windows Server 2003 R2 并不支持 512e 或 4Kn 介质。 虽然系统可能会启动并且能够进行最低限度的运行,但可能会出现功能问题、数据丢失或性能不佳等未知的情况。 因此,Microsoft 强烈警告不要将 512e 介质与 Windows XP 或其他基于 Windows XP 代码库的产品(例如 Windows Home Server 1.0、Windows Server 2003、Windows Server 2003 R2、Windows XP 64 位版本、Windows XP Embedded、Windows Small Business Server 2003 和 Windows Small Business Server 2003 R2)配合使用。

仿真的工作原理:读取-修改-写入 (RMW)

存储介质具有可在其中修改物理介质的特定单元。 也就是说,只能以物理扇区大小的单位编写或重写介质。 因此,未在此单元级别执行的写入将需要执行额外的步骤,我们将通过下面的示例介绍这些步骤。

在这种情况下,应用需要更新位于 512 字节逻辑扇区内的 Datastor 记录的内容。 此图表说明了存储设备完成写入所需的步骤:

存储设备完成写入的步骤

如上所示,此过程涉及存储设备的一些工作,这可能会导致性能损失。 为了避免此额外工作,必须更新应用以:

  • 查询物理扇区大小
  • 确保写入与报告的物理扇区大小保持一致

虽然这最初看起来可能只是一个性能问题,但可能会存在更严重的问题。 我们将在下一节讨论这个问题。

复原能力:读取-修改-写入的隐藏成本

复原能力指的是应用在会话之间恢复状态的能力。 我们已经了解了 512e 存储设备执行 512 字节扇区写入的必要条件 - 读取-修改-写入循环。 我们来看一看如果覆盖介质上以前的物理扇区的过程被中断会发生什么情况。 后果是什么?

  • 由于大多数硬盘驱动器都会进行就地更新,因此物理扇区(即物理扇区所在的介质部分)可能由于部分覆盖而损坏,导致信息不完整。 换句话说,你可以认为它可能丢失了所有 8 个逻辑扇区(物理扇区逻辑上包含这些扇区)。
  • 虽然大多数具有数据存储的应用都设计为具有从介质错误中恢复的能力,但八个扇区的丢失,或者换句话说,八个提交记录的丢失,可能会导致数据存储无法正常恢复。 管理员可能需要从备份中手动还原数据库,甚至可能需要执行漫长的重建。
  • 另一个重要的影响是,即使应用未运行,导致读取-修改-写入循环的另一个应用的行为也可能会导致数据丢失! 这只是因为你的数据和其他应用的数据可能位于同一个物理扇区内。

考虑到这一点,应用软件必须重新评估代码中做出的任何假设,并注意逻辑和物理扇区大小的区别,以及本文后面讨论的一些有趣的客户场景。

执行正确的操作(避免读取-修改-写入)

虽然一些存储供应商可能会在某些 512e 存储设备中引入某些级别的缓解,以尝试缓解读取-修改-写入循环的性能和复原能力问题,但就工作负荷而言,任何缓解措施能够处理的问题也只有这么多。 因此,应用不应依赖这种缓解措施作为长期解决方案。 此外,无法保证所有类别的磁盘都具有这种缓解措施,也无法保证该缓解措施设计完善。

解决这一问题的办法不是驱动器内缓解,而是设计应用来做正确的事情,从而帮助支持这种类型的介质。 本节讨论应用可能遇到大型扇区磁盘问题的常见情况,并建议了一种调查途径来尝试解决每个问题。

问题 1:分区与物理扇区边界不一致

当管理员/用户对磁盘进行分区时,可能没有在对齐的边界上创建第一个分区。 这可能会导致所有后续写入与物理扇区边界不对齐。 从 Windows Vista SP1 和 Windows Server 2008 开始,第一个分区位于与 4 KB 物理扇区边界对齐的磁盘(对于 4GB 或更大的磁盘,则是与 64 KB 物理扇区边界对齐)的前 1024 KB。 但是,由于 Windows XP 中的默认分区、第三方分区实用程序或 Windows API 的错误使用的缘故,创建的分区可能无法与物理扇区边界对齐。 开发人员将需要确保使用正确的 API 来帮助确保一致性。 下面概述了用于帮助确保分区对齐的推荐 API。

IVdsPack::CreateVolume 和 IVdsPack2::CreateVolume2 API 在创建新卷时不使用指定的对齐参数,而是使用操作系统的对齐值默认值(Windows Vista SP1 之前的版本将使用 63 个字节,而 Windows Vista SP1 之后的版本将使用上述默认值)。 请改用 IVdsCreatePartitionEx::CreatePartitionEx 或 IVdsAdvancedDisk::CreatePartition API,这些 API 对需要创建分区的应用使用指定的对齐参数。

帮助确保对齐正确的最佳方式是在最初创建分区时正确执行对齐。 否则,您的应用将需要在执行写入或初始化时考虑对齐,这可能是一个非常复杂的过程。

问题 2:无缓冲写入与物理扇区大小不一致

最简单的问题是无缓冲写入与存储介质报告的物理扇区大小不一致。 另一方面,缓冲写入与页面大小 4 KB 一致,此值恰好是第一代大型扇区介质的物理扇区大小。 但是,大多数具有数据存储的应用都执行无缓冲写入,因此需要确保这些写入的执行以物理扇区大小为单位。

生成的应用 I/O 不一致的一些场景示例:

提交记录填充到 512 字节扇区:具有数据存储的应用通常具有某种形式的提交记录,该记录要么维护有关元数据更改的信息,要么维护数据存储的结构。 为了确保扇区丢失不会影响多个记录,此提交记录通常会填充为扇区大小。 如果磁盘的物理扇区大小较大,则应用将需要查询物理扇区大小(如上一节所示),并确保每条提交记录都填充到该大小。 对于 4K 磁盘,这可确保 I/O 不会失败。 对于 512e 磁盘,这不仅可以避免读取-修改-写入循环,还有助于确保物理扇区丢失时只丢失一条提交记录。
日志文件写入未对齐的区块:更新或附加日志文件时,通常会使用无缓冲 I/O。 应用可以切换到缓冲的 I/O,或者在内部将日志更新缓冲到物理扇区大小的单位,以避免 I/O 失败或触发读取-修改-写入。
为了帮助确定你的应用是否会发出无缓冲 I/O,请确保在调用 CreateFile 函数时在 dwFlagsAndAttributes 参数中包含 FILE_FLAG_NO_BUFFERING 标志。

此外,如果您当前要将写入与扇区大小保持一致,则该扇区大小很可能只是逻辑扇区大小,因为大多数查询介质扇区大小的现有 API 仅查询寻址单位,即逻辑扇区大小。 此处,感兴趣的扇区大小是物理扇区大小,它是原子性的真正单位。 检索逻辑扇区大小的一些 API 示例包括:

  • GetDiskFreeSpace、GetDiskFreeSpaceEx
  • FileFsVolumeInformation
  • IOCTL_DISK_GET_DRIVE_GEOMETRY、IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
  • IVdsDisk::GetProperties、IVdsDisk3::GetProperties2

下面介绍如何查询物理扇区大小:

适用于 Windows 8 的首选方法

对于 Windows 8,Microsoft 引入了一个新的 API,此 API 使开发人员能够在其应用中轻松集成 4K 支持功能。 与下面讨论的 Windows Vista 和 Windows 7 的传统方法相比,此新 API 支持的场景数量更多。 此 API 支持以下调用方案:

  • 从非特权应用中调用
  • 调用任何有效的文件句柄
  • 通过 SMB2 调用远程卷上的文件句柄
  • 简化的编程模型

该 API 采用新信息类 FileFsSectorSizeInformation 的形式,具有相关结构 FILE_FS_SECTOR_SIZE_INFORMATION,定义如下:

typedef struct _FILE_FS_SECTOR_SIZE_INFORMATION {  
    ULONG LogicalBytesPerSector;  
    ULONG PhysicalBytesPerSectorForAtomicity;  
    ULONG PhysicalBytesPerSectorForPerformance;  
    ULONG FileSystemEffectivePhysicalBytesPerSectorForAtomicity;  
    ULONG Flags;  
    ULONG ByteOffsetForSectorAlignment;  
    ULONG ByteOffsetForPartitionAlignment;  
} FILE_FS_SECTOR_SIZE_INFORMATION, *PFILE_FS_SECTOR_SIZE_INFORMATION;

适用于 Windows 7 和 Windows Vista 的旧方法

Windows Vista 和 Windows Server 2008 引入了 API,以查询基于 AHCI 的存储控制器的附加存储设备的物理扇区大小。 对于 Windows 7 和 Windows Server 2008 R2,从 SP1(或 Microsoft 知识库 982018)开始,此支持扩展到了基于 Storport 的存储控制器。 有关演示应用如何查询卷的物理扇区大小的代码示例,请参阅 STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR 结构

虽然上述代码示例允许你获取卷的物理扇区大小,但在使用之前,你应该对报告的物理扇区大小进行一些基本的健全性检查,因为据观察,某些驱动程序可能无法返回正确格式的数据:

  • 确保报告的物理扇区大小 >= 报告的逻辑扇区大小;如果不是,那么你的应用应使用等于报告的逻辑扇区大小的物理扇区大小
  • 确保报告的物理扇区大小是 2 的幂;如果不是,您的应用应使用等于报告的逻辑扇区大小的物理扇区大小
  • 如果物理扇区大小是 512 字节到 4 KB 之间的 2 的幂值,则应考虑使用向下舍入到报告的逻辑扇区大小的物理扇区大小
  • 如果物理扇区大小是大于 4 KB 的 2 的幂值,则在使用该值之前,应评估应用处理这种情况的能力;否则,应考虑使用向下舍入为 4 KB 的物理扇区大小

使用此 IOCTL 获取物理扇区大小确实存在一些限制。 该方法:

  • 需要提升的特权;如果你的应用未以特权运行,则可能需要编写如上所述的 Windows 服务应用程序
  • 不支持 SMB 卷;你可能还需要编写 Windows 服务应用程序来支持对这些卷进行物理扇区大小查询
  • 无法向任何文件句柄发出(必须向卷句柄发出 IOCTL)

问题 3:文件格式依赖于 512 字节扇区

一些具有标准文件格式(例如 VHD 1.0)的应用可能会将这些文件硬编码为假定扇区大小为 512 字节。 因此,对此文件的更新和写入将导致设备上出现读取-修改-写入循环,这可能会给您的客户带来性能和复原能力问题。 但是,应用可以通过其他方式支持此类介质的操作,例如:

  • 使用缓冲来确保写入的执行以物理扇区大小为单位
  • 实现内部读取-修改-写入,这有助于确保以报告的物理扇区大小为单位执行更新
  • 如果可能的话,将记录填充到物理扇区,使填充的内容将被解释为空白空间
  • 考虑重新设计应用数据结构的版本以支持更大的扇区

问题 4:报告的物理扇区大小可能会在会话之间发生变化

在许多情况下,托管 Datastor 的底层存储的报告物理扇区大小可能会发生变化。 最常见的情况是将 Datastor 迁移到另一个卷,甚至是跨网络迁移。 报告的物理扇区大小的变化对于许多应用来说可能是意外事件,并且可能会导致某些应用无法重新初始化。

这不是最容易支持的场景,在此仅作为建议提及。 您应该考虑客户的移动性要求并相应地调整你的支持,以帮助确保客户不会因使用 4K 本机或 512e 介质而受到负面影响。

用户如何检索卷的逻辑扇区大小和物理扇区大小

Windows 内置有一个实用程序,用于显示卷的扇区大小信息。 受支持的 fsutil 的 Windows 版本包括:

  • Windows 8
  • Windows Server 2012
  • 附带 Microsoft KB 982018 的 Windows 7 SP1
  • 附带 Microsoft KB 982018 的 Windows 7
  • 附带 Microsoft KB 982018 (v3) 的 Windows Server 2008 R2 SP1
  • 附带 Microsoft KB 982018 (v3) 的 Windows Server 2008 R2
  • 附带 Microsoft KB 2553708 的 Windows Vista
  • 附带 Microsoft KB 2553708 的 Windows Server 2008

若要获取扇区大小信息,请从提升的命令提示符下按如下方式调用该实用程序:

fsutil fsinfo ntfsinfo <drive letter>

具有 512 字节仿真的 4K 扇区磁盘将“每扇区字节数”字段设置为 512,将“每物理扇区字节数”字段设置为 4096,如下所示:

具有 512 字节模拟的 4k 扇区磁盘的每扇区字节数和每物理扇区字节数

4K 本机磁盘将“每扇区字节数”和“每物理扇区字节数”字段均设置为 4096,如下所示:

4k 本机磁盘的每扇区字节数和每物理扇区字节数

注意

如果“每物理扇区字节数”字段显示“不支持”,则存储驱动程序不支持 IOCTL_STORAGE_QUERY_PROPERTY,或者检索信息时出错。

资源