虚拟硬盘VHD的程式化挂载方式
2019獨角獸企業重金招聘Python工程師標準>>>
微軟推出的虛擬硬盤vhd同vmdk,qcow2等一樣,是一種磁盤鏡像格式。磁盤鏡像一般多用于虛擬化計算,但微軟支持將Win7/Win8/Win2012等直接安裝進vhd文件中,并且不通過任何虛擬機,讓bootmgr直接引導vhd文件啟動系統,就好像這個vhd是真的硬盤一樣。
除了方便封裝操作系統之外,也有不少工具和方法可以在不同的操作系統下掛載vhd,就好像vhd文件就是移動硬盤一樣。因此,vhd也可以是一個不錯的數據載體。我將我的程序、數據等歸類放到不同的vhd虛擬磁盤中,需要用時可以像移動硬盤那樣掛載,需要帶走時,復制vhd文件就可以了。
### 使用場景1: Linux
在 Linux下,可以通過QEMU來創建和管理vhd文件。我可以使用 qemu-img 來創建和維護 vhd 文件,通過 qemu-nbd 來掛載 vhd 文件。當然,對 vhdx 格式的管理也不在話下。通過 qemu 可以很方便地管理和維護許多格式的磁盤鏡像,而且這些操作都可以通過腳本來完成。事實上,在 Linux 下,對虛擬磁盤的管理要比在 Windows 下強大得多,vhd格式在這里就不起眼了,比如,QEMU 推薦使用的格式是 qcow2。
在 Linux 下,可以編寫 shell 腳本來完成虛擬磁盤的掛載等管理工作,并且可以控制這些腳本的執行時機。
另外,如果一個vhd文件是固定大小的,不使用其它工具,僅使用 Linux 的 mount 命令也可以掛載 vhd:
mount [-t <fstype>] -o loop,offset=... <vhd file> <mount point>offset是第一個分區的偏移量,我的vhd文件都是1M對齊分區的,因此offset是1M。
### 使用場景2: Win7/Win8/Win2012...
在 Win8 下,在資源管理器中點擊vhd文件就可以掛載,但在 Win7 上,就要自己寫腳本或注冊表或是借助第三方工具才能實現這樣的操作了。不過,他們都可以在 計算機管理/存儲/磁盤管理 這個管理界面上,完成 vhd 的創建、掛載等操作。
但是,雖然 Win7/Win8等可以直接從 vhd 中原生啟動,但是他們可不會自動加載我們后來所管理的那些 vhd。而且,問題的重點是,我們需要一種可編程的方式來對 vhd 文件進行管理,而不只是通過圖形界面來操作。
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 vdiskecho select partition 1echo 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 vdiskecho online disk noerrecho select partition 1echo assign letter=Xecho exit ) | diskpart 可以通過組策略來控制這些腳本的執行,或是通過 windows 的計劃任務來管理它們。
### 使用場景3:WinXP/Win2003
在 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 <掛載盤符>
轉載于:https://my.oschina.net/chenzhiqiang/blog/201934
總結
以上是生活随笔為你收集整理的虚拟硬盘VHD的程式化挂载方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 回归测试——游戏版本发布前的最后关口
- 下一篇: PHP 免费视频教程