上一篇文章當中有提到一個名詞-FBL (Future Build Labs,未來組建實驗室),也有網友詢問這個東西到底是什麼,一方面站長也早就有打算撰文說說關於 Windows 版本字串命名規則的故事,所以就有了這篇文章。

我們一般描述一個 Windows 版本時,我們會用類似 Build 10586 的方式說明,也就是組建號碼為 10586 的版本,但其實組建號碼只是「版本字串」(Version String) 中的一小部分而已。

Windows 版本字串解讀

以最近釋出的 Windows 10 版本 1511 的正式發行版為例,實際上完整的版本字串是這樣的:

10.0.10586.0.th2_release.151029-1700

我們可以將其拆解成這幾個部分來看:

MajorVersion 主要版本號

這部分是 Windows NT 核心的「大版號」,通常很久才會變動一次,所以最近一次大改版其實是 Windows Vista。
以 Windows 10 來說就是 10,Windows Vista、Windows 7、Windows 8、Windows 8.1 則是 6,Windows XP 與 Windows 2000 則是 5。

MinorVersion 次要版本號

這部分是 Windows NT 核心的「小版號」,每次 Windows 有重大改版時都會改變,以往大約是三年改一次,大版號變動時會歸零。
同屬 Windows NT 6 系列的 Vista、7、8 與 8.1 的 MinorVersion 就依序為 0 ~3。

BuildNumber 組建版本號

這個號碼其實是流水號,不過有可能會因為特定重大事件一次跳過許多號碼,一般來說微軟會選一個「漂亮一點」的組建編號給最終版本。
由於 Windows Vista 與 Windows 7 同時可以使用此部分來表示安裝的 Service Pack 版次,這部分有一些特殊的規則,等一下會提到。

Delta 修訂版次

這部分會隨著安裝的修正檔而產生變化,實際上就是當 Build 完工之後,如果對特定檔案有修正,為了做出區分,就會改變 Delta 的數值。
這部分也有特殊規則,稍後同樣會提及。

FBL (Future Build Labs / Feature Build Labs) 未來組建實驗室 / 功能組建實驗室

如果你本身有玩過版本管理系統的話,其實這個有點類似 git 等 VCS 的「Branch (分支)」的概念,FBL 原本稱為 VBL (虛擬組建實驗室),是從 Vista 才開始有的特性,在 Windows 7 中被改為 FBL。

以其中一個叫做「winmain」的 FBL 為主幹,由於 Windows 開發團隊規模很大,每個團隊負責的功能都不同,因此開發過程中,各個團隊會根據自己的需要建立不同的 FBL,將 winmain 中的基礎程式碼中相關的部分修改之後編譯納入 FBL 分支中成為特定的 FBL 版本,當 FBL 版本的開發告一段落,如果沒有太過嚴重的問題 (至少要可以正常開機跟執行基本操作吧),就會被整合 (Migrate) 回 winmain 主幹,而這些剛被開發出來的新特性就會在下一個 winmain 組建中出現。

FBL 的特殊情形:版本釋出

當微軟要釋出新的 Windows 版本時 (不論是正式發行、公眾預覽,或是以往的 Beta、RC、發行 Service Pack),通常會從已經整合所有新特色,並且測試後確認穩定的 winmain 主幹分支出特殊的 FBL (特殊的地方是這類 FBL 通常只會被使用一次,也就是只有一個 Build 從中產出),再從這類特殊 FBL 釋出對外發行版本,例如 Windows 7 的正式發行版實際上出自於 win7_rtm。

但 Windows 10 以後已無此特性,正式發行版可能使用與公眾預覽版本相同的 FBL 釋出,也就是 xx_release 這個 FBL (xx 是發行版本的分別,如 TH1、TH2、RS1、RS2)。

Timestamp 時間戳記

這部分的意義很簡單,就是組建完成的時間而已,151029-1700 就是 2015 年 10 月 29 日下午五點完成的意思。

組建號碼 (BuildNumber) 解析

Windows Vista 至 Windows 8.1 的命名習慣

首先,以下是 Windows Vista 到 Windows 8.1 之間各個正式發行版的版本號碼:

  • Windows Vista RTM (6000)
  • Windows 7 RTM (7600)
  • Windows 8 RTM (9200)
  • Windows 8.1 RTM (9600)

我們可以從中觀察到兩個規則:

  • 都可以被 100 整除
    據說沒什麼特殊原因,是某主管來到 Windows 部門之後建立的習慣,似乎是認為這樣比較好看。
  • 都可以被 16 整除
    因為從 Vista 開始,BuildNumber 也身兼辨識 Service Pack 等級的功能 (最後四個 bit 被用來表示已安裝的 Service Pack 版次),而被 16 整除的目的就在於確保第一個正式發行版的 BuildNumber 的最後四個 bit 是從 0000 開始算起,因此最多可以做 15 個 Service Pack,實際上 Windows 8.x 以後根本沒做過 Service Pack

至於每個版本之間要跳躍多少則不一定,前面有說過 BuildNumber 實際上只是流水號,因此其實是每次主幹版本編譯都會加 1,然而到了正式版本要發行時,就會為了迎合前面兩個規則而進行跳號。

Windows 10 的命名習慣 (Threshold R1)

而到了 Windows 10 開始,命名方式有一先改變,首先是第一項規則-被 100 整除的慣例被取消,因此我們可以看到 Windows 10 的第一個發行版的組建號碼是 10240。

實際上在 Windows 10 Threshold Wave 1 開發到了尾聲時,有許多個版本被視為正式發行版的候選:

  • 10176.16384
  • 10192.16384
  • 10208.16384
  • 10224.16384
  • 10240.16384

很明顯的可以發現全部都能被 16 整除,結尾的 Delta 也都是 16384,這是以往我們判斷一個 Windows 組建是不是正式發行版的候選版本的主要關鍵。

Windows 10 的命名習慣 (Threshold R2 之後)

Threshold R2 的開發實際上在 Threshold R1 完工之前就已經開始,因此 Threshold R2 的組建號碼有經過一次跳號,是從 10500 開始的,然而在 Threshold Wave 2 之後,似乎是因為微軟已經確定不會再製作 Service Pack,因此組建號碼也就不必堅持要被 16 整除了,因此 Threshold R2 的正式版本實際上是 10586,沒有任何跳號,確實就只是 10500 開始起算經過 86 個版本後達成正式發行。

從 Threshold R2 之後,由於正式版本與開發版本的命名規則已經沒有什麼不同,因此我們很難單純從版本號碼來判斷這個版本是不是發行候選,或許是微軟意識到現有的 BuildNumber 機制最高只能到 16383,為了避免太早用完所以開始節約了吧。

更早期的命名習慣

至於 Windows Vista 之前的命名習慣則是單純許多,基本上就是流水號,而到正式發行前微軟通常會來個大跳號 (沒什麼目的,通常只是想選個有趣或是漂亮的數字,例如 Windows 95 最後跳到 Build 950、Windows 98 第一版最後跳到 1998、Windows 98 第二版最後跳到 2222、Windows XP 最後從 2542 跳到 2600)。

Delta 解析

Delta 顧名思義其實是變化量的意思,當一個 Windows Build 完成之後,經常會有需要小幅修改以解決 bug 或是漏洞的情形,此時微軟就會發行 Hotfix 或是 Update (更新),此時要怎麼分辨這個檔案到底有沒有經過修正、修正了幾次呢?答案就是靠 Delta 編號的變化 (Delta 號碼其實別名就是 Patch Level)。

從 Windows Vista 開始,微軟對於正式發行版都會賦予 16384 的 Delta,之後如果有更新或是 Hotfix 就會逐漸往上加,一般來說 Delta 編號不會經常顯示,通常只有特別調用的情況下才會出現,但進入 Threshold Wave 2 之後,又有了改變:TH2 開始的版本 Delta 可以不用跳到 16384 開始,而是允許從 0 開始起算,因此 TH2 的正式發行版版號才會是 10586.0。

Windows 7 的最終版本原本應該是 7600.16384,不過後來在壓製光碟期間發現有會影響安裝或升級的重大問題因此又撤下來,更新之後以 7600.16385 版本重壓。

附錄:Windows 版本歷史

註 1:Windows Vista、Windows 7、Windows 8、Windows 8.1 都有對應的 Windows Server 版本 (2008、2008 R2、2012、2012 R2),版本字串相同因此以下不列出。
註 2:Windows Server 2003 與 Windows XP 64 位元版本相通,以下只列出較有名 Windows Server 2003。

發行版本名稱版本字串完工日期發佈日期
Windows 10 (版本 1511)10.0.10586.0.th2_release.151029-17002015/10/29 17:002015/11/12
Windows 10 (初次發行)10.0.10240.16384.th1.150709-17002015/07/09 17:002015/07/29
Windows 8.1 Update6.3.9600.17031.winblue_gdr.140221-19522014/02/21 19:522014/04/08
Windows 8.16.3.9600.16384.winblue_rtm.130821-16232013/08/21 16:232013/10/17
Windows 86.2.9200.16384.win8_rtm.120725-12472012/07/25 12:472012/10/26
Windows 7 Service Pack 16.1.7601.17514.win7sp1_rtm.101119-18502010/11/19 18:502011/02/22
Windows 76.1.7600.16385.win7_rtm.090713-1255
6.1.7600.16384.win7_rtm.090710-1945
2009/07/13 12:55
2009/07/10 19:45
2009/07/22
Windows Vista Service Pack 26.0.6002.18005.lh_sp2rtm.090410-18302009/04/10 18:302009/04/28
Windows Vista Service Pack 16.0.6001.18000.longhorn_rtm.080118-18402008/01/18 18:402008/02/04
Windows Vista6.0.6000.16386.vista_rtm.061101-2205
6.0.6000.16385.vista_rtm.061030-1720
2006/11/01 22:05
2006/10/30 17:20
2007/01/30
Windows Server 2003 R25.2.3790.2075.dnsrv_r2.051122-23502005/11/22 23:502005/12/06
Windows Server 2003 SP25.2.3790.3959.srv03_sp2_rtm.070216-17102007/02/16 17:102007/03/13
Windows Server 2003 SP15.2.3790.1830.srv03_sp1_rtm.050324-14472005/03/24 14:472005/03/30
Windows Server 20035.2.3790.0.srv03_rtm.030324-20482003/03/24 20:482003/03/24
Windows XP SP35.1.2600.5512.xpsp.080413-21112008/04/13 21:112008/04/21
Windows XP SP25.1.2600.2180.xpsp_sp2_rtm.040803-21582004/08/03 21:582004/08/25
Windows XP SP15.1.2600.1106.xpsp1.020828-19202002/08/28 19:202002/09/09
Windows XP5.1.2600.0.xpclient.010817-11482001/08/17 11:482001/10/25
Windows 20005.0.2195.11999/12/072000/02/17
Windows Me4.90.30002000/06/082000/09/14
Windows 98 第二版4.10.2222 A1999/04/231999/05/05
Windows 984.10.19981998/05/121998/06/25
Windows NT 4.04.0.1381.11996/07/311996/08/24
Windows 954.00.9501995/07/111995/08/24
Windows NT 3.513.51.1057.119951995/05/30
Windows NT 3.53.5.807.119941994/09/21
Windows NT 3.13.1.511.119931993/07/27