虚拟硬盘VHD的程式化挂载方式

微软推出的虚拟硬盘vhd同vmdk,qcow2等同样,是一种磁盘镜像格式。磁盘镜像通常多用于虚拟化计算,但微软支持将Win7/Win8/Win2012等直接安装进vhd文件中,而且不经过任何虚拟机,让bootmgr直接引导vhd文件启动系统,就好像这个vhd是真的硬盘同样。 html

除了方便封装操做系统以外,也有很多工具和方法能够在不一样的操做系统下挂载vhd,就好像vhd文件就是移动硬盘同样。所以,vhd也能够是一个不错的数据载体。我将个人程序、数据等归类放到不一样的vhd虚拟磁盘中,须要用时能够像移动硬盘那样挂载,须要带走时,复制vhd文件就能够了。 shell

### 使用场景1: Linux

在 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

### 使用场景2: Win7/Win8/Win2012...

在 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 的计划任务来管理它们。


### 使用场景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 <挂载盘符>
相关文章
相关标签/搜索