不知不觉就高考完一个多月了啊。
最近在配置新电脑,打算和往常一样用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.vmdk
与win11-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
另外的话
上海交通大学招生组的话一个字都别信。