Hyper-V - Using differencial disks

现在我希望在Hyper-V中构建如下虚拟机:

- Hadoop-master
- Hadoop-slave1
- Hadoop-slave2
为了节约磁盘空间,我希望他们能共用基础的部分,比如 Ubuntu Linux 18.04 和 Hadoop 3.1.1,经过调研发现 Hyper-V 支持差分的方式建立虚拟磁盘。经过测试发现,我们可以这样做:

1. 创建 Ubuntu 18.04 的虚拟机

安装完成后删除所有的 Checkpoint,虚拟磁盘文件会自动合并为一个:ubuntu-18.04.1.vhdx

2. 新建 hadoop-3.1.1 的虚拟磁盘

New -> Hard Disk -> 选择 VHDX -> 选择 Differencing -> 输入文件名:hadoop-3.1.1 -> 选择父磁盘文件,也就是 ubuntu-18.04.1.vhdx,完成

3. 创建 hadoop-3.1.1 的虚拟机

New -> Virtual Machine -> … -> 选择已有磁盘:hadoop-3.1.1 -> 完成
启动虚拟机,安装 JDK 和 Hadoop 3.1.1
完成后删除所有的 Checkpoint,虚拟磁盘文件会自动合并为一个:hadoop-3.1.1.vhdx

4. 新建 hadoop-master 的虚拟磁盘

New -> Hard Disk -> 选择 VHDX -> 选择 Differencing -> 输入文件名:hadoop-master -> 选择父磁盘文件hadoop-3.1.1.vhdx,完成

5. 创建 hadoop-master 的虚拟机

New -> Virtual Machine -> … -> 选择已有磁盘:hadoop-master -> 完成
启动虚拟机,配置master

6. 创建 hadoop-slave[1..n] 的虚拟机

重复第4、5步骤即可

最终我们的磁盘文件如下:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018-12-28  07:10 PM     7319060480 ubuntu-18.04.1.vhdx
-a----       2018-12-28  07:22 PM     2099249152 hadoop-3.1.1.vhdx
-a----       2018-12-28  07:24 PM        4194304 hadoop-master.vhdx
-a----       2018-12-28  07:27 PM        4194304 hadoop-slave1.vhdx
-a----       2018-12-28  07:30 PM        4194304 hadoop-slave2.vhdx

其结构关系如下:
ubuntu-18.04.1.vhdx
    |
    `- hadoop-3.1.1.vhdx
        |
        |- hadoop-master.vhdx
        |- hadoop-slave1.vhdx
        `- hadoop-slave2.vhdx
需要注意的是,一旦建立了子磁盘,父磁盘文件就不应当再修改,否则所有其后续磁盘将不再可用,我们可以将父磁盘的属性设置为只读,并且删除 Write 权限。

除了用手工的方式创建之外,我们还可以通过Powershell脚本来创建虚拟机:

$vm_names = ( "master", "slave1", "slave2" )
 
foreach ($name in $vm_names) {
    New-VHD -ParentPath .base-images\ubuntu-18.04.1-jdk-8u191-hadoop-3.1.1.vhdx -Path .\hadoop-$name.vhdx -Differencing
    New-VM -Name "hadoop-$name" -MemoryStartupBytes 1GB -VHDPath .\hadoop-$name.vhdx
}