微軟推出的虛擬硬盤vhd同vmdk,qcow2等同樣,是一種磁盤鏡像格式。磁盤鏡像通常多用於虛擬化計算,但微軟支持將Win7/Win8/Win2012等直接安裝進vhd文件中,而且不經過任何虛擬機,讓bootmgr直接引導vhd文件啓動系統,就好像這個vhd是真的硬盤同樣。 html
除了方便封裝操做系統以外,也有很多工具和方法能夠在不一樣的操做系統下掛載vhd,就好像vhd文件就是移動硬盤同樣。所以,vhd也能夠是一個不錯的數據載體。我將個人程序、數據等歸類放到不一樣的vhd虛擬磁盤中,須要用時能夠像移動硬盤那樣掛載,須要帶走時,複製vhd文件就能夠了。 shell
在 Linux下,能夠經過QEMU來建立和管理vhd文件。我可使用 qemu-img 來建立和維護 vhd 文件,經過 qemu-nbd 來掛載 vhd 文件。固然,對 vhdx 格式的管理也不在話下。經過 qemu 能夠很方便地管理和維護許多格式的磁盤鏡像,並且這些操做均可以經過腳原本完成。事實上,在 Linux 下,對虛擬磁盤的管理要比在 Windows 下強大得多,vhd格式在這裏就不起眼了,好比,QEMU 推薦使用的格式是 qcow2。 編程
在 Linux 下,能夠編寫 shell 腳原本完成虛擬磁盤的掛載等管理工做,而且能夠控制這些腳本的執行時機。 windows
另外,若是一個vhd文件是固定大小的,不使用其它工具,僅使用 Linux 的 mount 命令也能夠掛載 vhd: 工具
mount [-t <fstype>] -o loop,offset=... <vhd file> <mount point>
offset是第一個分區的偏移量,個人vhd文件都是1M對齊分區的,所以offset是1M。 oop
在 Win8 下,在資源管理器中點擊vhd文件就能夠掛載,但在 Win7 上,就要本身寫腳本或註冊表或是藉助第三方工具才能實現這樣的操做了。不過,他們均可以在 計算機管理/存儲/磁盤管理 這個管理界面上,完成 vhd 的建立、掛載等操做。 ui
可是,雖然 Win7/Win8等能夠直接從 vhd 中原生啓動,可是他們可不會自動加載咱們後來所管理的那些 vhd。並且,問題的重點是,咱們須要一種可編程的方式來對 vhd 文件進行管理,而不僅是經過圖形界面來操做。 spa
Windows所帶的 diskpart 彷佛能夠完成這個工做,好比: 操作系統
C:\>diskpart create vdisk file="D:\test.vhd" maximum=2048 type=fixed ::建立一個固定大小爲2G的vhd select vdisk file="D:\test.vhd" attach vdisk ::加載 create partition primary offset=2048 align=4 ::建立分區 active assign letter=T format quick fs=ntfs label="TEST" exit
然而,上面是經過命令行進行交互的,若是是程式化的方式呢?好比,咱們須要在開機的時候自動加載幾個 vhd 文件,就要以寫腳本的方式來作了。 命令行
咱們能夠將一些 diskpart 的指令先寫到一個文本文件中,而後調用 diskpart /s <指令文件>,這樣,diskpart 就會讀取所輸入的文件並逐行執行。好比,咱們須要在開機時加載若干個vhd文件並指定掛載路徑,能夠先將相應的diskpart輸入指令寫到一個文本文件中,假設是C:\diskpart.input.txt,而後,寫一個批處理:
@echo off set LOG=C:\diskpart.log echo Execute diskpart script on %DATE% %TIME% > %LOG% diskpart /s C:\diskpart.input.txt 1>>%LOG%
有時須要在運行時才肯定要執行的 diskpart 指令,咱們能夠經過腳本動態生成指令文件:
@echo off set X=%TEMP%\diskpart.input 1>%X% ( echo select vdisk file="..." echo attach vdisk echo select partition 1 echo assign letter=... echo exit ) diskpart /s %X% del %X%
上面的「1>%X%」是輸出重定向。1是標準輸出,所以這段程序是將標準輸出寫入到%X%這個文件中,以後調用diskpart /s 來執行這個文件。
也能夠不使用臨時文件來調用diskpart,記得 Linux 下的管道操做吧?tar ... | gzip ...,經過管道,前面命令的輸出會做爲後面命令的輸入。咱們可使用管道操做來調用diskpart,好比:
echo select vdisk file="..." | diskpart
但問題是,一行echo輸出給diskpart後,diskpart執行完就退出了,和後面的指令鏈接不起來。因此,咱們須要將一批指令組合在一塊兒,而後一塊兒輸出給diskpart:
@echo off ( echo select vdisk file="..." echo attach vdisk echo online disk noerr echo select partition 1 echo assign letter=X echo exit ) | diskpart能夠經過組策略來控制這些腳本的執行,或是經過 windows 的計劃任務來管理它們。
在 WinXP/Win2003,系統自己沒有提供操做 vhd 的機制,不得不借助於第三方工具來實現。
對 vhd 的建立、分區等操做,交互方式的能夠經過 DiskGenius 等工具來完成。經過程式來控制的,可以使用 QEMU for windows 的 qemu-img。
對 vhd 的掛載操做則比較困難,你能夠安裝或提取 Virtual PC 中的 VHDMount,它應該能夠知足這方面的要求,不過我沒實際操做過。
若是 vhd 文件是固定大小(相對於動態擴展)的,那麼還有一些其它方法來掛載 vhd,好比經過 imdisk 或 winvblock 來掛載。
imdisk 是一個很小巧的工具,能夠建立內存盤,能夠掛載不少種硬盤鏡像,惋惜沒有好的圖形界面。你能夠在這兒下載 imdisk: http://www.ltr-data.se/opencode.html/
imdisk -a -f <vhd file> -m <掛載路徑> -v 1
上面的參數 -v 1 表示掛載第一個分區。
若是你知道 vhd 中第一個分區的偏移量,那麼也能夠指定這個偏移量來掛載。好比個人vhd文件都是按1M對齊來分區的,因此我能夠這樣掛載: imdisk -a -f <vhd file> -b 1m -m <掛載路徑>
若是你的系統中裝了winvblock 的話,也可使用它自帶的一個小工具來掛載固定大小的vhd:
winvblk -cmd attach -u <vhd file> -m <掛載盤符>