前言
为了更好的性能,当初装系统时选择了双系统的方式,又为了满足我对于几款win平台软件的需求,安装了一台 Win 7 虚拟机(前不久换成了 Win 8.1)。近来发现,Windows 10虽然作为我的必备系统,但我打开她的频率不是太高,而且Windows虚拟机由于需求越来越多,磁盘剩余逐渐变小。于是我想到把我“闲置”的Win 10系统利用起来,一方面,经过我几年的使用和配置,肯定比虚拟机用得顺手,同时也免去了开机切换系统的麻烦;另一方面,当初装系统时给 Win 10 分配的空间比Arch Linux多很多,如果利用起来的话,我Arch上的一些替代软件就可以删除了,这样可以给我腾出不少空间。
PS: 本文所用的这种方式启动的Windows肯定是存在问题的,最明显的就是驱动的问题了,建议三思后再尝试!
从 Arch Linux 启动 Windows 10
查看分区情况
首先,看看我的分区情况
~ sudo fdisk -l
...
设备 起点 末尾 扇区 大小 类型
/dev/nvme0n1p1 2048 206847 204800 100M EFI 系统
/dev/nvme0n1p2 206848 468991 262144 128M Microsoft 保留
/dev/nvme0n1p3 468992 395255172 394786181 188.3G Microsoft 基本数据
/dev/nvme0n1p4 395257856 500118158 104860303 50G Linux 文件系统
/dev/sda1 * 2048 488394751 488392704 232.9G 7 HPFS/NTFS/exFAT
...
前3个就是我所需的的分区了,其中我电脑的Win 10系统就在/dev/nvme0n1p3
分区
获取读写分区的权限
为了避免使用 root 运行 VirtualBox,所以需要给自己访问磁盘的权限,因为我的Win 10使用UEFI 启动,所以 UEFI 分区的权限也是需要的
## 为当前用户获取硬盘分区读写权限
~ sudo setfacl -m u:${USER}:rw /dev/nvme0n1p{1,2,3}
## 为当前用户获取硬盘读写权限
~ sudo setfacl -m "u:${USER}:rw" /dev/nvme0n1
创建 VirtualBox 的硬盘映射文件
创建之前需要先获取整块硬盘的读写权限,要注意的是nvme SSD的设备名称是nvme0n1
## 创建磁盘映射文件 windows.vmdk
~ VBoxManage internalcommands createrawvmdk -filename windows.vmdk -rawdisk /dev/nvme0n1 -partitions 1,2,3 -relative
## 创建完成后可以撤销对 nvme0n1 的权限
~ sudo setfacl -b /dev/nvme0n1
使用-partitions 1,2,3
选项的话,只有这三个分区能在虚拟机里访问,别的分区读的时候是全零,写入操作会被忽略。-relative
选择使用分区设备名(nvme0n1p1、nvme0n1p2、nvme0n1p3),这样创建好之后 VirtualBox 不再需要对整块硬盘 nvme0n1 的权限了。另外会附带创建一个名字以 -pt.vmdk
结尾的文件。它是单独的分区表。
配置bios dmi(可选
这一步主要是为了配置一些主板额外的信息,参考Configuring the BIOS DMI Information。注意:如果你和我一样是使用UEFI启动的话,代码语句里面的pcbios
应换为efi
。示例如下:
## 可能需要
~ sudo pacman -S dmidecode
## 获取dmi type0的信息
~ sudo dmidecode -t0
## Windows 10 即为虚拟机名字,10/23/2018就在刚获取的dmi信息中
~ VBoxManage setextradata "Windows 10" "VBoxInternal/Devices/efi/0/Config/DmiBIOSReleaseDate" "10/23/2018"
使用虚拟机
打开 VirtualBox,按照常规步骤创建虚拟机,硬盘就选刚创建的磁盘映射文件,创建完成后记得在设置-系统-主板里勾选 启用EFI
,然后就可以开机了。注意:重启后必须重新为当前用户获取硬盘分区读写权限!sudo setfacl -m u:${USER}:rw /dev/nvme0n1p{1,2,3}
话不多说,先上图
美中不足的是打开发现数字许可证失效了orz,而且指纹和pin解锁不能使用,经过一番Google,应该是TPM失效的缘故,而 VirtualBox 不支持vTPM......看来我只能将就用了。值得一提的是,如果你是通过主板硬件来激活 Windows 的话,那么可以尝试下下面这个方法(虽然我也没试过,不过理论上来讲没问题~~
## 查看key
~ sudo cat /sys/firmware/acpi/tables/MSDM
## 如果没有的话就放弃吧~_~
## 把key导出
~ sudo dd if=/sys/firmware/acpi/tables/MSDM of=/home/spirit/VirtualBox VMs/msdm.bin
## 导入虚拟机
~ VBoxManage setextradata "Windows 10" "VBoxInternal/Devices/acpi/0/Config/CustomTable" "/home/spirit/VirtualBox VMs/msdm.bin"
后记
既然可以从Linux启动Win,那能不能从Win启动Linux呢,我试着创建了一个磁盘映射,答案是可以的,不过需要注意的是操作均需在管理员权限下执行。Win+x
,点击磁盘管理,查看硬盘序号,我的系统盘是磁盘1
,所以硬盘选择了\\.\PhysicalDrive1
## 列出磁盘分区
C:\Users\spirit\Documents> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands listpartitions -rawdisk "\\.\PhysicalDrive1"
Number Type StartCHS EndCHS Size (MiB) Start (Sect)
1 0x00 0 /0 /0 0 /0 /0 100 2048
2 0x00 0 /0 /0 0 /0 /0 128 206848
3 0x00 0 /0 /0 0 /0 /0 192766 468992
4 0x00 0 /0 /0 0 /0 /0 51201 395257856
## 创建磁盘映射linux.vmdk
C:\Users\spirit\Documents> "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" internalcommands createrawvmdk -filename linux.vmdk -rawdisk "\\.\PhysicalDrive1" -partitions 1,4
之后和前面一样,创建虚拟机,注册虚拟磁盘,不过需要注意的是以管理员身份运行 VirtualBox。
参考文章:
Comments | 5 条评论
我是打算从windows启动manjaro,但是提示cant’t find uuid=xxxxx,请假如何解决?
居然真的能成功!之前折腾过好久了,启动一直没反应。准备下次按照这篇再整整,这样又能泡回linux了
@FSpark
我以前试过公司的 LTSC 版本和我自己的 OEM 版本,都没有遇到许可失效的情况呢。不过我跑 OEM 版本的时候时间很短(它在机械硬盘上所以卡到不能用)所以也可能是它没来得及检查许可。
@依云 我的 Win 10 在虚拟机里不能激活,但重启进主系统能激活,只不过这样的话每次都需要重新激活,我现在担心我的数字许可证激活次数会不会耗光了