Win7/R2 原生VHD 啓動 詳解

 

  以前,雖然聽説過這個特性,但一直沒有嘗試過。
  最近有機會嘗試了一下,本以為是很難的東西,但實際操作起來,還是很簡單的。首先,先解釋一下什麼是原生 VHD 啓動(Native VHD Boot)?
  實際上,Win7 可以啓動 VHD 裏面的系統,並且裏面的系統知道運行在 VHD 磁盤上。
  那麼 VHD 是什麼?VHD 是 MS 的虛擬硬盤文件,實際上,如果用過 VPC,Virtual Server,Hyper-V,Windows Virtual PC。那麼你應該也會知道了。
  現在大家應該知道這個啓動是怎麼回事了,如果還沒有理解,可以這麼想想一下,在 Win7 內核以及啓動引導中,增加了對 VHD 文件的磁盤控制器的虛擬硬件。

  好的,接下來,説説要求和限制
要求
  VHD 啓動需要依賴一下幾點:
  1. 磁盤上至少有 2 個分區:一個值作為啓動的,另一個是用來存放文件的。(注意不要加密)
  2. 包含 VHD 文件的分區必須擁有足夠大的可用空間。(稍後説明)

限制
  1. 原生 VHD 有一下限制:
  2. 原生 VHD 啓動 只支持下列版本:
    Windows 7 Enterprise
    Windows 7 Ultimate
    Windows Server 2008 R2
  3. 原生 VHD 磁盤最大附加 VHD 文件並行數量約為 512 個。
  4. 原生 VHD 啓動不支持系統休眠,但睡眠還是支持的。(不知道什麼是休眠,睡眠的看這裏 http://www.hackline.net/a/school/xtrm/2009/0823/227.html)
  5. VHD 文件不能嵌套。即不能 VHD 下的 VHD 文件。
  6. 原生 VHD 啓動不支持服務器消息塊 (SMB) 共享。(説實話,這個我也不是太清楚,雖説 Windows 的共享就是這個。)
  7. 不能在 VHD 文件捲上使用 Bitlocker 加密,並且在 VHD 內部的卷也不能使用 bitlocker 。
  8. VHD 的父文件不能是卷快照的一部分。
  9. 附加 VHD 磁盤不能被配置成動態磁盤。
  10. VHD 的父文件不能被配置成動態磁盤。

  要強調的是,
  VHD 啓動不僅需要 Win7 的啓動引導,還需要 Win7 系統,即 VHD 裏面的安裝的是 WIn7 或者 WIn2008 R2。想安裝 XP 是不可能的了。
  那麼,接下來説説製作步驟。
  整個過程大概分成 2 部分。
  1、準備 VHD 鏡像
  2、部署 VHD 鏡像

1、準備 VHD鏡像文件

  這個部分又分成 2 中方式,一是從 安裝鏡像中,直接提取系統文件。二是在虛機中安裝系統,然後使用 sysprep 進行封裝。

1.1 從安裝鏡像提取文件  這個需要用到 Windows(R) 7 的 Windows(R) 自動安裝工具包 (AIK) 中的 ImageX 工具。
  在開始之前,先説一下,我的實驗環境是 Win2008 R2 虛擬機 ,並且已經安裝了 Win7 的 AIK。
  為了以後的方便,(為了以後),先把安裝光盤中的文件複製到硬盤上, 例如 D:/Sources


  首先是建立 VHD 磁盤,步驟如下:
  1: 在單擊開始,輸入 "Diskmgmt.msc”,啓動磁盤管理。


  2: 單擊 “顯示/隱藏控制枱樹”(位於“磁盤管理”中)按鈕。


  3: 在“磁盤管理 (框線項目)”上右鍵單擊。


  4: 單擊“創建 VHD (菜單項目)”。


  5: 單擊“瀏覽(B)... ” ,並選擇一個虛擬磁盤的保存位置, 並起一個文件名,這裏是 "Test.vhd”,然後單擊保存。


  6: 選擇一個磁盤類型,這裏選擇“動態擴展 (D) ”。(注:選擇哪個都可以,只不過,選擇固定的創建起來有點費時,另外,後期可以通過虛擬機的磁盤管理器進行轉換。)


  7: 在“虛擬硬盤大小(S): ”  輸入要創建的虛擬硬盤大小,這裏輸入 "60” 單位選擇 "GB”,然後單擊確定。 (注:有關這個大小的注意,請看後面)


  8: 在“磁盤管理”中,右鍵單擊新建的磁盤 行頭,選擇“初始化磁盤(I) ”。


  9: 在彈出的“初始化磁盤”對話框中,選擇需要初始化的磁盤,並單擊“確定”。


  10: 右鍵單擊 虛擬磁盤的空白區域,選擇“新建簡單卷(I)... ”。


  11: 按照“新建簡單卷嚮導”中的提示操作,創建一個新的分區。


  再來就是提取安裝鏡像文件

  1: 單擊“開始”,“所有程序”, "Microsoft Windows AIK” ,單擊“部署工具命令提示 ”,打開 PE 環境控制枱。(如果不這麼做的話,會提示 ImageX 文件無法找到,當然,你也可以指定完整路徑)


  2: 在“管理員: 部署工具命令提示”中輸入 "imagex /apply "D:/Sources/Win7 X64/sources/install.wim" "Windows 7 ULTIMATE" g:/”,展開鏡像
  (解釋一下,Imagex 是 WIM 的編輯的工具,/apply 是解壓,"D:/Sources/Win7 X64/sources/install.wim" 是 Win7X64 安裝盤所在位置(install.wim 是固定的), "Windows 7 ULTIMATE" 是 Win7 版本,這個是必須是影響中已經存在的,可以通過 "imagex /info 安裝鏡像 WIM 文件 "D:/Sources/Win7 X64/sources/install.wim" ”來查看 g:/  要解壓到的位置)


  好,到此為止就算解壓完鏡像文件了。
  如果你想放入自動應答,讓安裝程序自動完成一部分。可以現在就做,否則,跳過。

  1、定位到虛擬磁盤上的 Windows 目錄下,然後新建一個文件夾,名字是 "Panther”(注:一定要是這個名字)
  2、然後將應答文件複製到這個目錄中,並重命名為 "unattend.xml”。(注:一定要是這個名字)
  3、如果應答文件中,使用了其他工具或者批處理文件,請將這些文件複製到對應的路徑中。

  那麼接下來,就是卸載 VHD 虛擬磁盤文件了

  1: 打開“磁盤管理”,在虛擬磁盤的行標頭上右鍵單擊,選擇“分離 VHD ”。


  2: 在“分離虛擬硬盤”對話框中單擊“確定”,即可分離磁盤了。


1.2 使用虛機制作 VHD 文件  其實,使用虛機制作,就是用虛機去來安裝系統,然後把 VHD 文件拿出來的過程。
  這裏我以 Hyper-V 虛機為例,進行演示。

  1、打開“Hyper-V 管理器”,在操作中選擇“新建”,“虛擬機”。


  2、在打開的“新建虛擬機嚮導”對話框,單擊下一步,輸入虛機的名字,然後單擊下一步。


  3、設置分配給虛機的內存,這裏輸入1024,即 1G,然後單擊下一步。(注:內存最少可以是 512M,最大是物理內存大小,請根據具體情況選擇合適大小)


  4、配置網絡,選擇一個可用的網絡,如果想配置乾淨的虛機,可以不設置或者選擇一個不能上網的測試網絡,免得安裝補丁,單擊下一步繼續。


  5、創建虛擬磁盤,可以創建一個新的虛擬磁盤,也可以選擇一個現有的,單擊下一步繼續。(關於虛擬磁盤的大小問題,稍後會有説明)


  6、設置安裝光盤鏡像的位置,單擊下一步繼續。


  7、單擊 “完成”,開始創建虛機。


  8、在“Hyper-V 管理器”中,選中新建的虛機,單擊操作中的連接。


  9、啓動虛機,並安裝系統。


  10、(可選)如果希望減少以後安裝的麻煩,可以現在先安裝上必要的工具。(如:VS,輸入法,什麼的)(注:虛機插件可以不用安裝,Win7 自帶了對 Hyper-V 的驅動)

  11、封裝系統,用管理員權限打開命令行, 執行如下命令:(如果怕出問題,可以先做個備份或者快照)



  當封裝完畢後,虛機系統會自動關閉。
  然後,我們可以在優化一下 VHD 文件的大小。

  1、參考上一部分的內容,將 VHD 文件附加到計算機上。
  2、然後 清理一下 VHD 的虛擬磁盤上的東西,比如可以刪除頁面文件(pagefile.sys),還有者臨時文件夾的內容。
  3、清理完後,卸載 VHD 鏡像。
  4、在“Hyper-V 管理器”中,選中對應的虛機,然後單擊 右邊的“設置”。
  5、選中“硬盤驅動器”,確認磁盤文件所在位置。
  6、在“Hyper-V 管理器”中選擇,“編輯器磁盤”。


  7、在“編輯虛擬磁盤嚮導”對話框中單擊下一步繼續。


  8、選擇剛才確定文件位置,然後單擊下一步繼續。


  9、選擇“壓縮”,然後單擊下一步。


  10、單擊確定,開始壓縮 VHD。


  好,這樣就獲得了 VHD 系統文件。
  VHD 的準備就到此結束了。
  然後就是系統部署了。
  (壓縮之後,一般可以大幅度的減少大小,我這成功的將 40G 清理到 30G,這樣在部署下載時候,能提高速度。)

2、部署 VHD 文件

  部署 VHD 也分成 2 個部分,一個是裸機部署,一個是在已有系統上進行部署。
  那麼先從裸機部署開始。
  在開始之前,請先把要部署的 VHD 文件放到 共享中,或者 FTP 中。
2.1 裸機部署 VHD 文件
  所謂的裸機,是指硬盤上沒有系統,或者要把原有硬盤內的東西清理掉,從而,機器中沒有啓動引導的一種狀態。

  1、使用 Win7 或者 Win2008 R2 的安裝光盤,U 盤也可以,啓動機器。(注:在啓動之前,可以往 U 盤中複製一些 FTP 工具等,方便操作。至於使用是 X64 位還是 X86 安裝盤,請根據 VHD 文件內的系統類型選擇。還有 X64 的安裝盤啓動的 PE 裏面也是 X64 的,精簡掉了 32 位運行子系統,所以工具需要是 64 位版的)
  2、進入安裝界面後,選擇好正確的語言,單擊“下一步”。


  3、選擇“修復計算機”,稍等一會,之後出來系統恢復選項,單擊下一步,然後選擇“命令提示符”。


  4、可以先輸入 "start” 命令,打開一個新的命令行窗口, 然後在輸入 "startnet” 開啓網絡支持。


  5、切換到另一個窗口,輸入 "Diskpart”,對系統進行分區。

  6、(可選)清除硬盤上的分區,在命令提示窗口中輸入:

  List Disk 查看系統上磁盤

  Select disk 1 選擇一個系統硬盤,根據上面返回的索引信息。

  Clean 清除磁盤上的所有內容。


  7、創建系統分區(用於啓動引導)。例如,這裏建立一個 100MB 的系統分區。在命令提示窗口中輸入:
  create partition primary size=100
  format quick fs=ntfs
  assign letter=s
  active
  創建分區
  格式化
  分配盤符
  激活(非常重要)

  8、接下來在創建一個主分區。例如,可以用剩餘空間。在命令提示窗口中輸入:
  create partition primary
  format quick fs=ntfs
  assign

  9、接下來,將 VHD 複製到計算機上,切換到另一個命令窗口。

  如果使用 Windows 共享,請按一下步驟操作

  先用 Net use 連接網絡共享文件夾,如果提示要用户名話,建議輸入“機器名/用户名”的形式

  net

  use y: //network_share/


  然後複製 VHD 文件到本地磁盤

copy y:/Windows7.vhd c:


  如果使用 FTP 的話,建議使用第三方工具,系統內部的 FTP 因為一些問題無法正常工作。

  10、下載完成後,就可以附加 VHD 文件到系統了,切換回原來的窗口。這裏假設 VHD 文件名字是 "Windows7.vhd”,在命令提示窗口中輸入:

select vdisk file=c:/windows7.vhd

attach vdisk

  11、當附加完 VHD 文件之後,系統會自動分配一個盤符。可以通過卷列表查看盤符。在命令提示窗口中輸入:
list volume

  12、使用 BCDboot 工具(位於 VHD內的Windows/System32 或者 Windows PE 媒體中),來將啓動環境文件從 VHD 中的 /Windows 文件夾複製到系統分區。BCDboot 工具會自動創建 BCD 配置文件來啓動 VHD。有關 BCDboot 的更多信息,請看本文最後的參考。
  cd v:/windows/system32
  bcdboot v:/windows /s s:
(v 是附加VHD文件的卷的盤符)

  13、這完成後就可以分離VHD文件了。在命令提示窗口中輸入:
  select vdisk file=c:/windows7.vhd
  detach vdisk
  Exit

  14、重啓計算機。

2.2 在已有系統的機器上 部署原生VHD啓動

  其實,這個部分,可以換一個説法。就是將 VHD 文件添加到啓動菜單中。
  1、先將 VHD 文件複製到本地機器。
  2、使用管理員模式打開命令行。
  3、複製已有的啓動引導,然後使用 VHD 信息來修改啓動數據。

/copy {current} /d "vhd boot (locate)"

  (注:/d 後面的是顯示的啓動名字,可以自定義,中文也可以,但如果你的系統不是中文的,會亂碼。)
  當成功執行完這個命令後,會返回一個 {GUID} 字符串。
  4、複製上一個命令輸出的 {GUID} 字符串,以便之後使用。
  5、設置 VHD 啓動項目的 device 和 osdevice 選項。
  bcdedit /set {guid} device vhd=[locate]/windows7.vhd
  bcdedit /set {guid} osdevice vhd=[locate]/windows7.vhd

  (將 {GUID} 替換成 之前複製的內容, [locate] 內容換成本地盤符)
  6、在某些 x86 系統中需要在啓動配置中設置一個選項,來探測硬件信息。


bcdedit /set {guid} detecthal on

  7、重啓計算機

  重啓玩之後,Windows 啓動管理器將會啓動 VHD 文件中包含的系統。
  之後就可以隨意使用了,和正常的使用沒有多少區別。

大家可能會有一些疑問,那麼接下來,我來做一些回答。
  1、從 VHD 啓動之後的系統,到底是運行在虛擬機上?還是直接運行在物理硬件之上?
答:是運行在物理硬件上。在 Win7 以及 WIn2008 R2 中的引導程序和系統本身都包含了對 VHD 文件的讀寫(虛擬)驅動程序,以及虛擬的 VHD 磁盤控制器。不要被這個虛擬所誤導,這裏指的是模擬硬件,比如最常見的虛擬光驅。因此我們可以在啓動計算機的時候,訪問 VHD 並且從其上啓動;也可以在 Windows 7 中直接創建、加載和卸載 VHD 文件。不過行為有些不同,這些驅動是在系統內核中的,系統本身也會知道自己運行在 VHD 文件上。因此,會把虛擬內存文件放到非 VHD 磁盤的物理磁盤上,也不會寫入到 VHD 內部。


  2、從 VHD 啓動,還需要哪些必備的條件?
  答:對於 VHD 啓動本身,對硬件並沒有多少要求,只能能運行系統即可。不過對於軟件方面來説,系統必須是以下版本,
  Windows® 7 Enterprise
  Windows® 7 Ultimate
  Windows Server 2008 R2

  XP 和 Vista 是不行的,因為驅動問題。而 Win7 的版本必須是企業版之上,這個策略限制,如果版本不對的話,會提示不支持,然後關機的。

  3、是否會有性能的損失?
  答:會有一些損失,但很小可以忽略。主要原因是對文件系統讀寫訪問的時候,需要經過額外的一層 VHD 讀寫驅動的解析,這裏面有一些微量的 I/O 性能開銷,但是跟虛擬化的情況相比,性能基本上接近了真機。下圖是在網上找到的測試資料,有一組直接讀取硬盤和讀寫 VHD 的比較,性能差別微乎其微。


  4、VHD 文件格式如何選擇?
  答:VHD 文件分為 固定,動態擴展 還有差異 三種格式(其實,還有一種 連接到物理磁盤的格式,不過這裏用不上)
  首先是固定,固定是固定大小,在建立完磁盤後,用空數據填充,使其達到設置的磁盤大小。
  動態是根據寫入信息的多少,動態的增加磁盤大小。(當然,這種情況下,容易產生磁盤碎片)
  差異是一種父子關係,新建立的磁盤會保存和源盤不相同的內容。
  這3種類型選擇哪個都可以,不過對於性能來説,應該選擇 固定的。但 固定的建立需要填充文件,所以非常佔用時間。
  不過,這裏要説的是,經過我的測試發現,不管選擇什麼類型的 VHD,在使用它啓動系統後,都會變成固定的。
  也就是説,如果你設置 VHD 文件有 127G,那麼通過它進入系統後,你會看到 VHD 文件變成 127G。
  因此,如果 VHD文 件所在的磁盤空間不夠的話,將會無法啓動系統。
  (如果是動態磁盤的話,在關機之後,文件會變回實際大小)
  但這個有個例外,就是差異文件。使用差異的話, 父盤的大小是不會變動的。
  個人比較推薦 差異,可以使用這個來建立多個系統。
  差異文件的建立方法是在 Diskpart 中,輸入以下命令
  create vdisk file="D:/pathToVhd.vhd" parent="D:/pathtoparent.vhd"
  (就是用 Parent 來指定父文件)

  下圖就是一個事例,Win7Base.vhd 是父盤,Win7Disk.VHD 是當前正在使用的系統文件。 可以看到 它的大小 已經變成了設置的最大大小(127G)


  另外,也可以看到頁面文件 ,因為 VHD 文件本身會有一點性能損失,加上一些其他問題等,所以 頁面文件不會放到 VHD 文件內部。

  5、在裸機部署完之後,重啓後,看到菜單是英文的?
  答:是的。即使你用的是中文版的安裝盤在第一次啓動的時候,也是英文的,但不要緊,進入系統之後,下次重啓時就會變成中文的了。主要原因是,在設置啓動引導項目的時候,默認的語言是 en-us,而不是 zh-cn。

  6、是否可以掛接 X64 和 X86 系統?
  答:可以。在啓動引導中添加相應的條目即可。如果使用的是 PE 環境部署的,建議使用 PE 裏面的 bcdboot 來設置啓動項。
(有待補充)

參考
Understanding Virtual Hard Disks with Native Boot  http://technet.microsoft.com/en-us/library/dd799282(WS.10).aspx   Walkthrough: Deploy a Virtual Hard Disk for Native Boot
  http://technet.microsoft.com/en-us/library/dd744338(WS.10).aspx   Add a Native-Boot Virtual Hard Disk to the Boot Menu
  http://technet.microsoft.com/en-us/library/dd799299(WS.10).aspx   Windows 7對VHD文件的內建支持
  http://blogs.technet.com/fyu/archive/2009/01/19/windows-7-vhd.aspx   從VHD文件啓動計算機
  http://blogs.technet.com/fyu/archive/2009/01/19/vhd.aspx   深入研究Windows 7中的Virtual Hard Disk (VHD) 技術
  http://blogs.technet.com/fyu/archive/2009/01/21/windows-7-virtual-hard-disk-vhd.aspx   再談從虛擬磁盤文件啓動計算機
  http://blogs.technet.com/fyu/archive/2009/02/01/3195439.aspx   BCDboot 命令行選項
  http://technet.microsoft.com/zh-cn/library/dd744347(WS.10).aspx   BCDEdit 命令行選項
  http://technet.microsoft.com/zh-cn/library/cc709667(WS.10).aspx>

使用工具
  Windows(R) 7 的 Windows(R) 自動安裝工具包 (AIK)
  http://www.microsoft.com/DOWNLOADS/details.aspx?familyid=696DD665-9F76-4177-A811-39C26D3B3B34&displaylang=zh-cn

 

  最後附上一個自動應答文件,也可以使用 “Windows 系統映像管理器”創建一個。
  請自行替換XML中【】內容



 

  如果,你安裝的系統是 WIn7,請先執行這個,否則封裝將會出錯。Win2008R2 沒有這個問題。

  "Net stop WMPNetworkSvc”

  (關閉 "Windows Media Player Network Sharing Service” 服務)

  "cd %windir%/system32/sysprep”

  "sysprep.exe /oobe /shutdown /unattend:win7.xml”

  (/unattend 是 設置自動應答文件的,如果不需要可以不指定)