高级格式 (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 扇区大小磁盘提供完整的收件箱支持。 一些受支持的应用和方案包括:
    • 无需模拟 4K 本机磁盘 (4K 本机磁盘) 即可将 Windows 安装到 4K 扇区磁盘并从中启动
    • VHD 和新的 VHDX 文件格式
    • 完全 HyperV 支持
    • Windows 备份
    • NT 文件系统中的完全支持 (NTFS)
    • 对新存储空间和池的完全支持 (SSP)
    • Windows Defender的完全支持
  • 提供一个新的 API,用于 (FileFsSectorSizeInformation) 查询物理扇区大小:
    • 可用于网络卷
    • 可以颁发给任何文件句柄
    • 适用于无特权应用
    • 更友好的使用模型
  • 包括增强的 fsutil 命令行实用工具,用于查询具有对齐信息的卷的逻辑和物理扇区大小 (基本版本的实用工具,而无需对齐信息,适用于具有 Microsoft KB 982018的 Windows Server 2008 R2 和具有 Microsoft KB 的 Windows Server 2008 R2 982018)

(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 Windows Vista(带 MS KB 2553708)
Windows Server 2008* ,带 MS KB 2553708
Windows 7,带 MS KB 982018
Windows Server 2008 R2* ,带 MS KB 982018
Windows 7 SP1 及更高版本的所有 Windows 版本。
服务器 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 开始,对于 4GB 或更大的磁盘,第一个分区放置在磁盘 (的前 1024 KB 处,否则对齐为 64 KB) ,与 4 KB 物理扇区边界对齐。 但是,鉴于 Windows XP 中的默认分区、第三方分区实用工具或 Windows API 的不正确用法,创建的分区可能与物理扇区边界不一致。 开发人员需要确保使用正确的 API 来帮助确保一致性。 下面概述了有助于确保分区对齐的建议 API。

创建新卷时,IVdsPack::CreateVolume 和 IVdsPack2::CreateVolume2 API 不使用指定的对齐参数,而是使用操作系统的对齐值默认值, (Pre-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,使开发人员能够轻松地在其应用中集成 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 的存储控制器。 Microsoft 在 MSDN 上提供了一个 代码示例 ,详细介绍了应用如何查询卷的物理扇区大小。

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

  • 确保报告的物理扇区大小 >= 报告的逻辑扇区大小;如果不是,应用应使用等于报告的逻辑扇区大小的物理扇区大小
  • 确保报告的物理扇区大小为 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
  • Windows 7 SP1 与 Microsoft KB 982018
  • Windows 7 与 Microsoft KB 982018
  • Windows Server 2008 R2 SP1 与 Microsoft KB 982018 (v3)
  • Windows Server 2008 R2 与 Microsoft KB 982018 (v3)
  • Windows Vista 与 Microsoft KB 2553708
  • Windows Server 2008 with Microsoft KB 2553708

若要获取扇区大小信息,请从提升的命令提示符调用实用工具,如下所示:

fsutil fsinfo ntfsinfo <drive letter>

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

具有 512 字节仿真的 4k 扇区磁盘的每个扇区和每个物理扇区字节

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

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

注意

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

资源