Top
本节学习目标是将win10安装到VHDX虚拟磁盘上,而不是安装到实体硬盘上。
这样做的好处是: 目前看到的缺陷:

目录

制作PE镜像

Windows PE全称为 Windows Preinstallation Environment(预安装环境)。
首先在旧电脑上下载并依次安装Windows ADKWindows ADK的Windows PE加载项

安装完成后以管理员身份打开开始菜单的Windows kits-->部署和映像工具环境
在控制台中输入以下命令:
copype amd64 c:\WinPE_amd64
dism /mount-image /imagefile:"c:\WinPE_amd64\media\sources\boot.wim /index:1 /mountdir:"c:\winpe_amd64\mount"
makewinpemedia /iso c:\winpe_amd64 c:\winpe_amd\WinPE_amd64.iso
以上三条命令:

创建VHDX

在命令提示符下运行以下命令:
diskpart 进入diskpart程序
create vdisk file=c:\windows.vhdx maximum=25600 type=fixed 创建一个25GB固定类型的虚拟机磁盘
attach vdisk 将虚拟机磁盘附加到主机上的磁盘控制器
create partition primary 创建分区
fromat quick label=vhdx 快速格式化并将卷标设置为vhdx
assign letter=v 为此分区设置驱动器号(即盘符)为v
exit 退出diskpart

将Windows映像应用到VHDX

使用以下命令:
dism /apply-image /imagefile:e:\sources\install.esd /index:1 /applydir:v:\
以上命令是将win10安装光盘中的install.esd应用到前面创建的硬盘主分区上。(注意,前面创建时为虚拟盘的主分区分配的盘符是v)

分离VHDX,将其复制到网络共享

在旧电脑上运行以下命令将虚拟磁盘分离:
diskpart 进入diskpart程序
select vdisk file=c:\windows.vhdx 选择上面建立的虚拟磁盘
detach vdisk 分离该虚拟磁盘
exit 退出diskpart
将VHDX复制到网络共享或可移动存储器。以下命令将驱动器号N映射到网络共享,为VHDX创建目录,然后将VHDX复制过去:
net use n: \\server\share\ 将网络共享\\server\share映射到本地N盘
md N:\VHDs 为虚拟机磁盘创建目录
copy c:\windows.vhdx n:\vhds\ 将虚拟磁盘复制到网络共享中

准备新电脑

用PE启动新电脑,启动后直接打开了命令行窗口,在其中运行以下命令:
diskpart 进入diskpart程序
select disk 0 选择0号磁盘
convert gpt 将磁盘转换为gpt格式
create partition efi size=100 创建一个100MB的efi分区
format quick fs=fat32 label="efi" 以FAT32格式快速格式化并将卷标设置为efi
assign letter="S" 为其分配盘符S
create partition msr size=128 创建一个128MB的Microsoft Reserved(MSR)分区,不用格式化,不用给它卷标
create partition primary 将剩余空间创建成一个主分区
format quick fs=ntfs label="main" 以NTFS格式快速格式化此分区,并设卷标为main
assign letter="M" 为此分区设置驱动器号为M
exit 退出diskpart
完成以上动作之后,应该可以进入s:盘和m:盘,只是此时这两个盘里面什么都没有。
连接到网络驱动器或存储位置:
net use n: \\server\share
将前面步骤中复制到网络驱动器的VHDX文件复制到新电脑的主分区:
copy N:\VHDs\windows.vhdx m:

附加VHDX

现在仍然还在WinPE,将VHDX附加到新电脑:
diskpart 进入diskpart程序
select vdisk file=M:\windows.vhdx 选中虚拟磁盘
attach vdisk 将虚拟磁盘附加到系统中
list volume 查看卷列表
select volume 3 选择第三个卷
assign letter=v 为该卷设置盘符v
exit 退出diskpart程序

添加启动项

经过以上操作,VHDX的盘符为V,物理硬盘的efi分区盘符为S。在命令行窗口执行以下命令:
v:\ 进入V盘,即VHDX虚拟盘
cd v:\windows\system32 进入虚拟盘的windows\system32目录
bcdboot v:\windows /s S: /f UEFI 使用启动文件创建和修复工具,将UEFI固件写到S盘
拔掉WinPE盘,重启电脑,应该会进入新系统安装过程。

2022/1/15

按以下步骤实作: 完成后能进入系统。

按以下步骤实作,在一个硬盘上手动安装freebsd和win10,利用uefi实现单机单盘双系统。

首先安装win10:
	diskpart				进入diskpart程序
	select disk 1				选择目标磁盘,磁盘编号从0开始,本次实验所用电脑有三块硬盘,此次仅在第二块硬盘做两个系统;
						可以使用list disk命令查看磁盘列表
	clean					清除此硬盘分区,此例中类似在FreeBSD下执行gpart destroy -F ada1命令
	convert gpt				相当于在FreeBSD下执行gpart create -s gpt ada1命令
	create partition efi size=100		创建一个100M的efi分区
	format quick fs=fat32 label=winefi	将efi分区格式化成FAT32格式
	assign letter=v				给efi分区分配一个盘符v
	create partition msr size=128		创建一个128M分区用于系统恢复
	create partition primary size=50000	创建一个50G分区,用于安装win10,size的值以M为单位,但不接受G、T这样的后缀
	format quick fs=ntfs label="win10"	将其格式化为ntfs格式,并指定卷标为win10
	assign letter=w				给此分区分配一个盘符w
	exit					退出diskpart
	
	下面一行将安装映像文件解压至w:盘,即上面划出来的50G那个分区
	dism /apply-image /imagefile:d:\install.wim /index:1 /applydir:w:\
		
	以下是用win10的bcdboot工具将uefi启动代码传递到v:盘,即上面创建的efi分区
	w:\					
	cd w:\windows\system32
	bcdboot w:\windows /s v: /f uefi
	exit					退出PE,系统会重启
重启后BIOS还找不到UEFI,所以要先进入BIOS,手动指定。
待win10安装完毕后,用FreeBSD安装盘启动电脑,进入shell模式。
	gpart add -t efi -s 260m -a 4k ada1		创建一个260M的efi分区,用来保存FreeBSD的efi文件
	gpart add -t freebsd-swap -s 2g -a 4k ada1	创建一个2g的交换分区
	gpart add -t freebsd-zfs -s 50g-a 4k da1	创建一个5g的zfs分区
	newfs_msdos -F 32 -c 1 /dev/ada1p4		将efi分区格式化为FAT32格式
	mount -t msdosfs /dev/ada1p4 /mnt		将efi分区挂载到/mnt目录下
	mkdir -p /mnt/efi/boot				创建用于保存efi文件的目录
	cp /boot/loader.efi /mnt/efi/boot/bootx64.efi	将安装盘上的efi文件复制到硬盘的efi分区指定的目录
	umount /mnt					卸载掉efi分区
	mkdir /tmp/zfs					创建一个用于挂载zfs池的目录,网上有文章说建到/mnt,但实测使用/mnt会遇到只读问题
	zpool create -o altroot=/tmp/zfs zmain /dev/ada1p6 创建存储池
	
	以下将系统文件解压到存储池
	cd /usr/freebsd-dist
	tar xvzfp base.txz -C /tmp/zfs/zmain/
	tar xvzfp kernel.txz -C /tmp/zfs/zmain/
	tar xvzfp kernel-dbg.txz -C /tmp/zfs/zmain/
	tar xvzfp lib32.txz -C /tmp/zfs/zmain/
	tar xvzfp src.txz -C /tmp/zfs/zmain/
	
	以下创建/修改一些关键文件
	vi /tmp/zfs/zmain/etc/fstab
	/dev/ada1p4 /boot/efi msdosfs rw 2 2
	/dev/ada1p5 none swap sw 0 0
	
	vi /tmp/zfs/zmain/etc/rc.conf
	zfs_enable="YES"
	
	vi /tmp/zfs/zmain/boot/loader.conf
	zfs_load="YES"
	
	zfs umount -a			卸载掉所有挂载的zfs文件系统
	zfs set mountpoint=/ zmain	指定zmain文件系统挂载到根
	reboot				重启
重启后进入BIOS,修改UEFI启动列表即可。

以上仅仅是实验这种操作的可行性,实际使用中严重不推荐这样做双系统。

经测试,以上步骤中可以不用给FreeBSD单独划分EFI分区,将FreeBSD的efi文件放到Win10的EFI分区中也可以。
需要注意的是,win10的efi文件也是bootx64.efi,可以将两个efi文件分别重命名为win10.efi和fb13.efi,这样在BISO中设置启动顺序的时候可以更方便地选择对应的efi文件。

回主站