虚拟硬盘VHD的程式化挂载方式
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
微軟推出的虛擬硬盤vhd同vmdk,qcow2等一樣,是一種磁盤鏡像格式。磁盤鏡像一般多用于虛擬化計(jì)算,但微軟支持將Win7/Win8/Win2012等直接安裝進(jìn)vhd文件中,并且不通過(guò)任何虛擬機(jī),讓bootmgr直接引導(dǎo)vhd文件啟動(dòng)系統(tǒng),就好像這個(gè)vhd是真的硬盤一樣。
除了方便封裝操作系統(tǒng)之外,也有不少工具和方法可以在不同的操作系統(tǒng)下掛載vhd,就好像vhd文件就是移動(dòng)硬盤一樣。因此,vhd也可以是一個(gè)不錯(cuò)的數(shù)據(jù)載體。我將我的程序、數(shù)據(jù)等歸類放到不同的vhd虛擬磁盤中,需要用時(shí)可以像移動(dòng)硬盤那樣掛載,需要帶走時(shí),復(fù)制vhd文件就可以了。
### 使用場(chǎng)景1: Linux
在 Linux下,可以通過(guò)QEMU來(lái)創(chuàng)建和管理vhd文件。我可以使用 qemu-img 來(lái)創(chuàng)建和維護(hù) vhd 文件,通過(guò) qemu-nbd 來(lái)掛載 vhd 文件。當(dāng)然,對(duì) vhdx 格式的管理也不在話下。通過(guò) qemu 可以很方便地管理和維護(hù)許多格式的磁盤鏡像,而且這些操作都可以通過(guò)腳本來(lái)完成。事實(shí)上,在 Linux 下,對(duì)虛擬磁盤的管理要比在 Windows 下強(qiáng)大得多,vhd格式在這里就不起眼了,比如,QEMU 推薦使用的格式是 qcow2。
在 Linux 下,可以編寫(xiě) shell 腳本來(lái)完成虛擬磁盤的掛載等管理工作,并且可以控制這些腳本的執(zhí)行時(shí)機(jī)。
另外,如果一個(gè)vhd文件是固定大小的,不使用其它工具,僅使用 Linux 的 mount 命令也可以掛載 vhd:
mount [-t <fstype>] -o loop,offset=... <vhd file> <mount point>offset是第一個(gè)分區(qū)的偏移量,我的vhd文件都是1M對(duì)齊分區(qū)的,因此offset是1M。
### 使用場(chǎng)景2: Win7/Win8/Win2012...
在 Win8 下,在資源管理器中點(diǎn)擊vhd文件就可以掛載,但在 Win7 上,就要自己寫(xiě)腳本或注冊(cè)表或是借助第三方工具才能實(shí)現(xiàn)這樣的操作了。不過(guò),他們都可以在 計(jì)算機(jī)管理/存儲(chǔ)/磁盤管理 這個(gè)管理界面上,完成 vhd 的創(chuàng)建、掛載等操作。
但是,雖然 Win7/Win8等可以直接從 vhd 中原生啟動(dòng),但是他們可不會(huì)自動(dòng)加載我們后來(lái)所管理的那些 vhd。而且,問(wèn)題的重點(diǎn)是,我們需要一種可編程的方式來(lái)對(duì) vhd 文件進(jìn)行管理,而不只是通過(guò)圖形界面來(lái)操作。
Windows所帶的 diskpart 似乎可以完成這個(gè)工作,比如:
C:\>diskpart create vdisk file="D:\test.vhd" maximum=2048 type=fixed ::創(chuàng)建一個(gè)固定大小為2G的vhd select vdisk file="D:\test.vhd" attach vdisk ::加載 create partition primary offset=2048 align=4 ::創(chuàng)建分區(qū) active assign letter=T format quick fs=ntfs label="TEST" exit然而,上面是通過(guò)命令行進(jìn)行交互的,如果是程式化的方式呢?比如,我們需要在開(kāi)機(jī)的時(shí)候自動(dòng)加載幾個(gè) vhd 文件,就要以寫(xiě)腳本的方式來(lái)做了。
我們可以將一些 diskpart 的指令先寫(xiě)到一個(gè)文本文件中,然后調(diào)用 diskpart /s <指令文件>,這樣,diskpart 就會(huì)讀取所輸入的文件并逐行執(zhí)行。比如,我們需要在開(kāi)機(jī)時(shí)加載若干個(gè)vhd文件并指定掛載路徑,可以先將相應(yīng)的diskpart輸入指令寫(xiě)到一個(gè)文本文件中,假設(shè)是C:\diskpart.input.txt,然后,寫(xiě)一個(gè)批處理:
@echo off set LOG=C:\diskpart.log echo Execute diskpart script on %DATE% %TIME% > %LOG% diskpart /s C:\diskpart.input.txt 1>>%LOG%有時(shí)需要在運(yùn)行時(shí)才確定要執(zhí)行的 diskpart 指令,我們可以通過(guò)腳本動(dòng)態(tài)生成指令文件:
@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是標(biāo)準(zhǔn)輸出,因此這段程序是將標(biāo)準(zhǔn)輸出寫(xiě)入到%X%這個(gè)文件中,之后調(diào)用diskpart /s 來(lái)執(zhí)行這個(gè)文件。
也可以不使用臨時(shí)文件來(lái)調(diào)用diskpart,記得 Linux 下的管道操作吧?tar ... | gzip ...,通過(guò)管道,前面命令的輸出會(huì)作為后面命令的輸入。我們可以使用管道操作來(lái)調(diào)用diskpart,比如:
echo select vdisk file="..." | diskpart
但問(wèn)題是,一行echo輸出給diskpart后,diskpart執(zhí)行完就退出了,和后面的指令連接不起來(lái)。所以,我們需要將一批指令組合在一起,然后一起輸出給diskpart:
@echo off (echo select vdisk file="..."echo attach vdiskecho online disk noerrecho select partition 1echo assign letter=Xecho exit ) | diskpart 可以通過(guò)組策略來(lái)控制這些腳本的執(zhí)行,或是通過(guò) windows 的計(jì)劃任務(wù)來(lái)管理它們。
### 使用場(chǎng)景3:WinXP/Win2003
在 WinXP/Win2003,系統(tǒng)本身沒(méi)有提供操作 vhd 的機(jī)制,不得不借助于第三方工具來(lái)實(shí)現(xiàn)。
對(duì) vhd 的創(chuàng)建、分區(qū)等操作,交互方式的可以通過(guò) DiskGenius 等工具來(lái)完成。通過(guò)程式來(lái)控制的,可使用 QEMU for windows 的 qemu-img。
對(duì) vhd 的掛載操作則比較困難,你可以安裝或提取 Virtual PC 中的 VHDMount,它應(yīng)該可以滿足這方面的要求,不過(guò)我沒(méi)實(shí)際操作過(guò)。
如果 vhd 文件是固定大小(相對(duì)于動(dòng)態(tài)擴(kuò)展)的,那么還有一些其它方法來(lái)掛載 vhd,比如通過(guò) imdisk 或 winvblock 來(lái)掛載。
imdisk 是一個(gè)很小巧的工具,可以創(chuàng)建內(nèi)存盤,可以掛載很多種硬盤鏡像,可惜沒(méi)有好的圖形界面。你可以在這兒下載 imdisk:?http://www.ltr-data.se/opencode.html/
imdisk -a -f <vhd file> -m <掛載路徑> -v 1上面的參數(shù) -v 1 表示掛載第一個(gè)分區(qū)。
如果你知道 vhd 中第一個(gè)分區(qū)的偏移量,那么也可以指定這個(gè)偏移量來(lái)掛載。比如我的vhd文件都是按1M對(duì)齊來(lái)分區(qū)的,所以我可以這樣掛載: imdisk -a -f <vhd file> -b 1m -m <掛載路徑>
如果你的系統(tǒng)中裝了winvblock 的話,也可以使用它自帶的一個(gè)小工具來(lái)掛載固定大小的vhd:
winvblk -cmd attach -u <vhd file> -m <掛載盤符>
轉(zhuǎn)載于:https://my.oschina.net/chenzhiqiang/blog/201934
總結(jié)
以上是生活随笔為你收集整理的虚拟硬盘VHD的程式化挂载方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 回归测试——游戏版本发布前的最后关口
- 下一篇: photoshop script