平台
用戶端– 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中傳遞的新功能,以協助改善大型磁區磁片的客戶和開發人員體驗。 每個專案的詳細描述如下。
以具有模擬 (512e) 之 4K 磁片的 Windows 7 SP1 支援為基礎,並提供具有 4K 磁區大小的磁片完整收件匣支援,而不需要模擬 (4K 原生) 。 某些支援的應用程式和案例包括:
- 在沒有模擬 (4K 原生磁片的情況下,從 4K 磁區磁片安裝 Windows 和開機的能力)
- 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 對齊實體磁區大小,這可能會導致非預期的 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 位元組磁區寫入所需的專案 – 讀取修改寫入週期。 讓我們看看當媒體上覆寫先前實體磁區的程式中斷時,會發生什麼情況。 結果為何?
- 因為大部分硬碟都已就地更新,實體磁區也就是實體磁區所在的媒體部分,可能會因為部分覆寫而不完整的資訊損毀。 另一種方式是,您可以將它視為遺失所有 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,針對需要建立資料分割的應用程式使用指定的對齊參數。
協助確保對齊方式正確,是在一開始建立資料分割時正確執行。 否則,當執行寫入或初始化時,您的應用程式必須納入考慮,這可以是非常複雜的程式。
問題 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 位元組。 因此,更新和寫入此檔案會導致裝置上的「讀取-修改-寫入」週期,這可能會導致客戶的效能和復原問題。 不過,有一些方法可讓應用程式支援在這種類型的媒體上運作,例如:
- 使用緩衝處理來確保寫入是以實體磁區大小的單位執行
- 實作內部 Read-Modify-Write,有助於確保更新會以回報實體磁區大小的單位執行
- 可能的話,填補會記錄到實體磁區,如此一來,填補就會解譯為空白空間
- 請考慮重新設計應用程式資料結構的版本,以支援較大的磁區
問題 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 with 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 的 Hotfix
- 適用于 Windows Vista 和 Windows Server 2008 的 Hotfix
- 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 晶片組驅動程式需求