使用VHDX虚拟磁盘实现Windows安装

5.2k words

我们安装系统的时候,一般都是安装到本地磁盘,这样做的好处是方便快捷,但后期想要备份、还原、管理系统的时候就会比较麻烦。这时候,虚拟磁盘系统就体现出它的优势了。这篇教程就是关于创建虚拟磁盘系统及后续使用方法的。

视频版教程:在VHDX虚拟磁盘中安装Windows系统并启动

1. 创建VHDX系统

(1) 创建并初始化虚拟磁盘

这里提供两种方法,一种是通过系统自带的磁盘管理,另一种是使用命令行。

a. 磁盘管理(GUI)

按下 Win + R 输入 diskmgmt.msc 或在开始菜单图标上右键以打开磁盘管理

任意选中一块磁盘,点击菜单栏的 操作 菜单,然后点击 创建 VHD

然后会弹出一个创建窗口

位置 输入框选择要存放虚拟磁盘的位置

虚拟磁盘大小 输入框填入最大虚拟磁盘容量(可以先设置小一点,后续不够的话可以再扩容

虚拟硬盘格式 建议选择VHDX,对新系统的支持会更好一点,同时也更稳定

虚拟磁盘类型 建议选择系统推荐的类型

动态拓展 就是虚拟磁盘文件会随着内容的增多而逐渐增大,更节约空间,但在使用时要确保主机上剩余空间充足

固定大小 就是虚拟磁盘在创建时就占用掉分配的空间

设置完毕,点击 确定 即可进行创建

创建完成后,将磁盘管理下方的磁盘列表拉到底部,可以看到我们刚刚创建的未初始化的虚拟磁盘,右键选择 初始化磁盘 ,对于新系统,建议使用默认的GPT分区形式,单击 确定 完成初始化

在未分配的空间上右键,选择 新建简单卷 ,一直下一步,在中间可以进行一些设定,如卷标、分区大小、盘符等信息

b. Diskpart 命令行

按下 Win + R 输入 cmd 或在开始菜单图标上右键以打开终端(命令提示符)

打开 diskpart
1
diskpart
创建虚拟磁盘
1
create vdisk file=<虚拟磁盘路径> maximum=<最大容量(MB)> type=<fixed|expandable>

其中, fixed 代表固定大小,也是默认选项; expandable 代表动态分配

挂载虚拟磁盘
1
attach vdisk
转换为GPT分区表(默认为MBR分区类型)
1
convert gpt
创建分区
1
create partition primary
格式化
1
format quick label=<自定义卷标>
分配盘符
1
assign letter=<自定义盘符>
退出
1
exit

至此,创建并初始化虚拟磁盘结束

注意:即使设置为动态分配,在系统启动时虚拟磁盘占用空间也会达到设置的最大容量,所以请保证本地磁盘一定要有充足的空间

(2) 向虚拟磁盘中安装系统

需要准备一份Windows安装镜像或install.wim文件

如果使用Windows安装镜像,请先双击挂载

使用管理员身份打开终端(命令提示符)

查看镜像中的系统列表,记下索引
1
Dism /Get-ImageInfo /ImageFile:<安装镜像盘符>:\sources\install.wim

1
Dism /Get-ImageInfo /ImageFile:<install.wim路径>

示例:

1
Dism /Get-ImageInfo /ImageFile:G:\sources\install.wim
1
Dism /Get-ImageInfo /ImageFile:install.wim

如果文件路径中有空格,记得加上双引号

记下想要安装版本的 索引

把对应映像部署到虚拟磁盘
1
Dism /Apply-Image /ImageFile:<同上install.wim路径> /index:要安装的卷的索引号 /ApplyDir:<虚拟磁盘盘符>:\

示例:

1
Dism /Apply-Image /ImageFile:G:\sources\install.wim /index:4 /ApplyDir:V:\
1
Dism /Apply-Image /ImageFile:install.wim /index:3 /ApplyDir:M:\

取消挂载虚拟磁盘
1
2
3
4
diskpart
select vdisk file="<虚拟磁盘路径>"
detach vdisk
exit

至此,系统镜像部署完成

2. 安装VHDX系统

(1) 初始化本地磁盘(安装双系统的可以跳过这步)

在目标电脑上进行这个步骤,无系统的可以使用Windows PE

以管理员身份运行终端(命令提示符),并打开diskpart
1
diskpart
查看磁盘编号
1
list disk

记下目标磁盘编号

选择磁盘
1
select disk 目标磁盘号

示例:

1
select disk 2
格式化磁盘
1
clean
UEFI
转换为GPT分区表
1
convert gpt
创建并初始化引导分区
1
2
3
create partition efi size=200
format quick fs=fat32 label="System"
assign letter="S"
创建MSR分区
1
create partition msr size=128
创建并初始化主分区
1
2
3
create partition primary
format quick fs=ntfs label="<自定义卷标>"
assign letter=<自定义盘符>

示例:

1
2
3
create partition primary
format quick fs=ntfs label="Main"
assign letter=M
退出
1
exit
Legacy BIOS
创建并初始化引导分区
1
2
3
4
create partition primary size=100
format quick fs=ntfs label="System"
assign letter="S"
active
创建并初始化主分区
1
2
3
create partition primary
format quick fs=ntfs label="<自定义卷标>"
assign letter=<自定义盘符>

示例:

1
2
3
create partition primary
format quick fs=ntfs label="Main"
assign letter=M
退出
1
exit

(2) 将制作好的虚拟磁盘文件复制到目标电脑

一定要放在能启动的磁盘(双系统方案)或者主分区(上一步创建的),并且不要有中文路径

(3) 添加启动项

以管理员身份运行终端(命令提示符),并打开diskpart
1
diskpart
在目标电脑上挂载虚拟磁盘文件
1
2
select vdisk file="<虚拟磁盘路径>"
attach vdisk
确定虚拟磁盘卷号和引导分区卷号
1
list volume

记下你的虚拟磁盘卷号以及引导分区卷号(UEFI的引导分区为FAT32格式,较好区分;Legacy的话可以通过大小或卷标进行区分)

为虚拟磁盘分区分配盘符
1
2
select volume <虚拟磁盘卷号>
assign letter=<自定义盘符>

示例:

1
2
select volume 5
assign letter=V
为系统引导分区分配盘符
1
2
select volume <引导分区卷号>
assign letter=<自定义盘符>

示例:

1
2
select volume 3
assign letter=S
退出 Diskpart
1
exit
UEFI

添加启动项

1
bcdboot <虚拟磁盘盘符>:\windows /s <引导分区盘符>: /f UEFI

示例:

1
bcdboot V:\windows /s S: /f UEFI
Legacy BIOS

添加启动项

1
bcdboot <虚拟磁盘盘符>:\windows /s <引导分区盘符>: /f BIOS

示例:

1
bcdboot V:\windows /s S: /f BIOS

至此,系统安装完毕,重启后将会进入系统或显示多系统选择页面

3. 扩容VHDX虚拟磁盘

有时候,随着使用时间增加,可能预先设置的最大磁盘大小已经不够,这时候就需要进行扩容操作

关闭虚拟磁盘系统并重启到其他系统或者 Windows PE
以管理员身份打开终端(命令提示符),并运行 Diskpart
选择虚拟磁盘文件
1
select vdisk file=<虚拟磁盘完整路径,有空格的需加上双引号>
扩容磁盘
1
expand vdisk maximum=<扩容后的总容量(MB)>

挂载虚拟磁盘
1
attach vdisk
退出
1
exit
添加或扩容分区

打开磁盘管理,会发现在虚拟磁盘的后面多出一块未分配的空间

如果要扩容当前分区,就在已经建立好的分区上面右键,选择 扩展卷 ,然后一路下一步即可

如果要建立一个新的分区,就在未分配部分点击右键,选择 新建简单卷 ,一路下一步即可,具体操作可参考上文

4. 差分VHDX虚拟磁盘

有时候,我们想更轻松的备份或者还原系统,这时候,VHDX差分虚拟磁盘就能派上用场了

差分就是指创建一个新的虚拟磁盘文件,引用原始虚拟磁盘的内容,把更改的内容存放在新的这个文件里面,这样备份的时候只需要备份一次原始虚拟磁盘文件,后面的备份都只用备份差分虚拟磁盘文件,这样能大大降低备份的难度,还原也只需要重新创建一个差分虚拟磁盘

同时,利用这个特点,还可以基于同一个原始虚拟磁盘,创建多个系统,用于不同场景,占用的空间也比较小

注意:前文提到,虚拟磁盘在启动时会占用到最大空间,所以差分虚拟磁盘启动时也会占用到设置的最大大小,同时原始虚拟磁盘也占用一定的空间,所以本地磁盘剩余空间应大于设置的最大容量+原始虚拟磁盘实际占用空间

关闭虚拟磁盘系统并重启到其他系统或者 Windows PE
将原始虚拟磁盘改名

例如 windows.original.vhdxwindows.base.vhdx 等,名称随意

以管理员身份打开终端(命令提示符),并运行 Diskpart
1
create vdisk file=<差分虚拟磁盘路径(原始虚拟磁盘原来的名字).vhdx> parent=<原始虚拟磁盘现在的名字.vhdx>

例如

1
create vdisk file=windows.vhdx parent=windows.original.vhdx

创建完成的原始文件和差分文件

差分虚拟磁盘也可以自定义名称,只是要重新设置一遍启动项

理论上来说,可以创建许多同样的差分虚拟磁盘,这样就可以实现多个系统共用一个原始虚拟磁盘了,大大减小文件体积

注意:若原始虚拟磁盘发生变化,则所有差分虚拟磁盘全部失效,所以建议将原始虚拟磁盘文件设置为只读

备份

只需重启到 Windows PE 或者其它系统,第一次备份原始虚拟磁盘文件,后续仅需备份差分虚拟磁盘文件

还原

如需还原到原始状态,只需按照上文重新创建一个差分虚拟磁盘即可

如需还原到其他备份的状态,只需复制-替换即可

合并

如需将差分磁盘与父虚拟磁盘合并,可以进入 Diskpart

1
2
select vdisk file=<差分虚拟磁盘路径.vhdx>
merge vdisk depth=1

此操作将会把差分虚拟磁盘中的内容合并到父虚拟磁盘中,修改的是父虚拟磁盘

在合并之前,如果对父虚拟磁盘设置了只读,需要取消

depth 参数为合并的层数,如果设置了多层差分磁盘的可以自行修改,本教程只创建了一层差分磁盘,故仅合并一层

5. 释放虚拟磁盘占用空间

随着虚拟磁盘的使用,其所占物理磁盘的空间会逐渐增大

如果是动态分配类型的虚拟磁盘,即使删除了磁盘中的一些内容,虚拟磁盘所占物理磁盘的空间并不会减小

可进行以下步骤释放空间:

打开 控制面板 / 程序 / 程序和功能 / 启用或关闭 Windows 功能

启用 Hyper-V / Hyper-V 管理工具 / Windows PowerShell 的 Hyper-V 模块 以及 Hyper-V / Hyper-V 平台 / Hyper-V 服务 并根据提示重启电脑

以管理员身份打开 PowerShell
1
optimize-vhd -path [<path/to/file.vhdx>] -mode full

其中,<path/to/file.vhdx>为虚拟磁盘路径,可以使用绝对路径,也可以使用相对路径,如果是差分磁盘则输入差分磁盘路径即可

6. 参考资料

启动到虚拟硬盘:将 VHDX 或 VHD 添加到启动菜单 | Microsoft Learn

Create vdisk | Microsoft Learn

DISM 映像管理命令行选项 | Microsoft Learn

VHDX磁盘文件如何扩容_vhdx扩容-CSDN博客

VHD进阶:差分VHD备份系统 - mahocon - 博客园

merge vdisk | Microsoft Learn

在win10下释放vhdx占用的多余空间 - 闲一集