基于 RawDisk,将双系统挂载为虚拟机

 

不知不觉就高考完一个多月了啊。

最近在配置新电脑,打算和往常一样用Arch Linux,但又担心有的商业软件只有Windows能用。刚好之前网上冲浪的时候看到Kiri的一篇教程,硬件配置又足够,于是就去折腾了。

总之,这篇教程的目的是:在Arch Linux上,使用VirtualBox,把同一硬盘上的Windows系统作为虚拟机启动。

据说使用KVM的话,直接映射整个硬盘可以得到更好的性能,但我现在暂时没有这个需求。感兴趣的可以搜索kvm disk pass-through

先大概讲下最终效果:剪贴板共享正常,剪贴板文件共享仅Linux到Windows正常,拖放传输文件不正常,声音延迟1秒左右。

准备

首先先装一堆包:sudo pacman -S pipewire pipewire-pulse virtualbox virtualbox-guest-iso

创建RawDisk

(官方文档并没有出现RawDisk的规范写法,你写成rawdisk一类的也没问题)

注意,继续阅读本文前请先浏览官方文档!过时的命令可能导致问题!本文最后更新时间为2025年7月20日。

以下内容基本只用于记录与补充,如果不明白可以去看开头提到的那篇教程

首先看看你的分区结构(不重要的信息略去)(sd{x}nvme{x}类似):

niko-mech-arch% sudo fdisk -l
Disk /dev/nvme0n1: 953.87 GiB, 1024209543168 bytes, 2000409264 sectors
Disklabel type: gpt

Device              Start        End    Sectors   Size Type
/dev/nvme0n1p1       2048    1050623    1048576   512M EFI System
/dev/nvme0n1p2    1050624 1511000063 1509949440   720G Linux filesystem
/dev/nvme0n1p4 1578108928 1578141695      32768    16M Microsoft reserved
/dev/nvme0n1p5 1578141696 1998243839  420102144 200.3G Microsoft basic data
/dev/nvme0n1p7 1998858240 2000406527    1548288   756M Windows recovery environment

我在nvme0n1p1这个分区已经安装了systemd-boot,可以正常识别Windows。

接下来把这两个分区做成RawDisk:

// 临时给用户 niko 赋予直接访问磁盘权限,用于创建RawDisk
$ sudo setfacl -m u:niko:rw /dev/nvme0n1{,p1,p5}
// 生成 RawDisk
$ VBoxManage createmedium disk --filename win11-rawdisk-rootless.vmdk --format=VMDK --variant RawDisk --property RawDrive=/dev/nvme0n1 --property Partitions=1,5 --property Relative=1
// 将临时授予的权限取消
$ sudo setfacl -b /dev/nvme0n1{,p1,p5}

顺带一提,如果要移除已经创建的RawDisk,可以使用VBoxManage closemedium disk win11-rawdisk-rootless.vmdk --delete

这里我遇到了如下问题:

niko-mech-arch% VBoxManage createmedium disk --filename win11-rawdisk-rootless.vmdk --format=VMDK --variant RawDisk --property RawDrive=/dev/nvme0n1 --property Partitions=1,5 --property Relative=1

0%...VBOX_E_FILE_ERROR
VBoxManage: error: Failed to create medium
VBoxManage: error: Could not create the medium storage unit '/home/niko/win11-rawdisk-rootless.vmdk'.
VBoxManage: error: VMDK: Image path: '/home/niko/win11-rawdisk-rootless.vmdk'. Failed to open the raw drive '/dev/nvme0n1' for reading (VERR_ACCESS_DENIED) (VERR_ACCESS_DENIED).
VBoxManage: error: VMDK: could not create raw descriptor for '/home/niko/win11-rawdisk-rootless.vmdk' (VERR_ACCESS_DENIED)
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component MediumWrap, interface IMedium
VBoxManage: error: Context: "RTEXITCODE handleCreateMedium(HandlerArg*)" at line 630 of file VBoxManageDisk.cpp

怀疑是因为ESP已经被挂载到了/boot,于是umount后重试,报错内容相似。于是换了下文的方法。

找个空闲空间创建一个新的ESP(300MB就够),进入Windows,为这个分区指定一个盘符(比如H:),进入cmd执行bcdboot C:\Windows /s H:,随后可以移除盘符。以下假设该分区在Linux中表示为nvme0n1p6

修改上面的命令重新运行。成功后,得到win11-rawdisk-rootless-pt.vmdkwin11-rawdisk-rootless.vmdk两个文件。

挂载磁盘

以普通用户身份打开VirtualBox,创建一个Windows 11虚拟机,不分配硬盘。创建完成后,进入设置,执行以下更改:

  • General -> Extended Features 中,启用EFI,禁用Secure Boot
  • Storage -> Devices 中,添加上一步创建的RawDisk
  • Audio -> Host Audio Driver 由Default改为PulseAudio

启动虚拟机

可能会提示“未激活”,原因可能是Windows检测到的硬件改变了,可以用某个工具一次性永久激活。

一些优化

安装Guest Additions就不用我说了吧。

为了获取USB设备列表,VirtualBox提示要用这条命令把用户加入对应组:sudo groupmems -g vboxusers -a niko

使用setfacl -m临时授予的权限会在重启后失效,我让DeepSeek老师给了个解决方案:

$ cat << EOF | sudo tee /etc/udev/rules.d/99-persistent-acl-for-virtualbox-windows.rules
ACTION=="add", KERNEL=="nvme0n1p5", SUBSYSTEM=="block", RUN+="/bin/sh -c '/usr/bin/setfacl -m u:niko:rw /dev/nvme0n1p5'"
ACTION=="add", KERNEL=="nvme0n1p6", SUBSYSTEM=="block", RUN+="/bin/sh -c '/usr/bin/setfacl -m u:niko:rw /dev/nvme0n1p6'"
EOF
$ sudo udevadm control --reload-rules
// 下两行用于立即触发规则
$ sudo udevadm trigger --action=add --sysname-match=nvme0n1p5
$ sudo udevadm trigger --action=add --sysname-match=nvme0n1p6

另外的话

上海交通大学招生组的话一个字都别信。