平台
客户端 - 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
说明
本文是名为“512 字节仿真 (512e) 磁盘兼容性更新”的文章的更新版本,该更新版本针对 Windows 7 SP1 和 Windows Server 2008 R2 SP1 发布。 此更新包含许多新信息,其中一些信息仅适用于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 对具有仿真 (512e) 的 4K 磁盘的支持,并为具有 4K 扇区大小的磁盘提供完整的收件箱支持,而无需仿真 (4K 本机) 。 一些受支持的应用和方案包括:
- 无需模拟 (4K 本机磁盘) ,即可从 4K 扇区磁盘安装 Windows 和从 4K 扇区启动
- VHD 和新的 VHDX 文件格式
- 完全 HyperV 支持
- Windows 备份
- NT 文件系统中的完全支持 (NTFS)
- (SSP) 支持新的存储空间和池
- 对Windows Defender的完全支持
提供用于查询物理扇区大小的新 API (FileFsSectorSizeInformation) :
- 可用于网络卷
- 可以颁发给任何文件句柄
- 适用于非特权应用
- 更友好的使用模型
包括增强的“fsutil”命令行实用工具,用于查询卷的逻辑扇区大小和物理扇区大小,其中对齐信息 (基本版本的实用工具,而没有对齐信息的 Windows 7 与 Microsoft KB 982018和 Windows Server 2008 R2 与 Microsoft KB 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 8 Windows Server 2012 Windows 7 w/ MS KB 982018 Windows 7 SP1 Windows Server 2008 R2 w/ MS KB 982018 Windows Server 2008 R2 SP1 Windows Vista w/ MS KB 2553708 Windows Server 2008 w/ MS KB 2553708 |
高级格式,AF,4K 本机,4Kn | 4 KB | 4 KB | Windows 8 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 字节扇区写入 --Read-Modify-Write 周期所需的内容。 让我们看看,如果媒体上覆盖上一个物理扇区的过程被中断,会发生什么情况。 后果是什么?
- 由于大多数硬盘驱动器已就位,因此物理扇区(即物理扇区所在的媒体部分)由于部分覆盖而损坏,信息不完整。 另一种方法是,可以将它视为可能丢失所有 8 个逻辑扇区, (物理扇区在逻辑上包含) 。
- 虽然大多数具有数据存储的应用都设计有从媒体错误中恢复的功能,但 8 个扇区丢失或另一种方法是丢失 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 不会使用指定的对齐参数,而是使用操作系统的对齐值默认值, (预 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 支持。 此新 API 支持的方案数量甚至比下面讨论的 Windows Vista 和 Windows 7 的旧方法要多。 此 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 的存储控制器的附加存储设备的物理扇区大小。 从 SP1 (或 Microsoft 知识库982018) 开始,Windows 7 和 Windows Server 2008 R2 支持扩展到基于 Storport 的存储控制器。 Microsoft 在 MSDN 上提供了 一个代码示例 ,详细介绍了应用如何查询卷的物理扇区大小。
虽然上面的代码示例允许获取卷的物理扇区大小,但应先对报告的物理扇区大小进行一些基本理智检查,因为观察到某些驱动程序可能无法返回格式正确的数据:
- 确保报告的物理扇区大小 = 报告的逻辑扇区大小 >;如果不是,应用应使用等于报告的逻辑扇区大小的物理扇区大小
- 确保报告的物理扇区大小为 2 的幂;如果不是,应用应使用等于报告的逻辑扇区大小的物理扇区大小
- 如果物理扇区大小是介于 512 字节和 4 KB 之间的两个幂值,则应考虑使用物理扇区大小向下舍入到报告的逻辑扇区大小
- 如果物理扇区大小是大于 4 KB 的两个幂值,则应在使用该值之前评估应用处理此方案的能力;否则,应考虑使用舍入到 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 与 Microsoft KB 2553708
若要获取扇区大小信息,请根据提升的命令提示符调用该实用工具:
fsutil fsinfo ntfsinfo <drive letter>
具有 512 字节仿真的 4K 扇区磁盘将“每个扇区字节数”字段设置为 512,“每个物理扇区字节数”字段设置为 4096,如下所示:
4K 本机磁盘的“每个扇区字节数”和“每个物理扇区字节数”字段均设置为 4096,如下所示:
![注意]如果“字节每物理扇区”字段显示“不支持”,则存储驱动程序不支持IOCTL_STORAGE_QUERY_PROPERTY,或者检索信息时出错。
资源
- Windows 常规支持声明
- Microsoft KB 982018
- Microsoft KB 2553708
- Windows 7 和 Windows Server 2008 R2 修补程序
- Windows Vista 和 Windows Server 2008 修补程序
- HyperV 支持语句
- 有关IOCTL_STORAGE_QUERY_PROPERTY控件代码的常规信息
- IOCTL_STORAGE_QUERY_PROPERTY控制代码
- 有关STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR结构的常规信息
- 用于描述 Microsoft 软件更新的标准术语的说明
- WDK 示例代码,其中包含有关如何在调用IOCTL_STORAGE_QUERY_PROPERTY控制代码时从STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR结构中提取报告存储访问对齐信息的详细信息
- 有关 ImageX Command-Line 选项的常规信息
- 支持 4 KB 扇区驱动器的 Intel 芯片集驱动程序要求