我使用磁盘管理器创建了一个新的 VHDX,并尝试将其挂载到 WSL2(版本 1.0.3),运行以下命令:
wsl -d Ubuntu-22.04 --mount --vhd D:\wsl2\wsl2-drive.vhdx --bare
它失败了:
Failed to attach disk '\\?\D:\wsl2\wsl2-drive.vhdx' to WSL2: Access is denied.
Error code: Wsl/Service/AttachDisk/MountVhd/E_ACCESSDENIED
我尝试过但没有什么效果的事情:
- 从提升的 PowerShell 运行它
- 创建 VHD 而不是 VHDX
- 离开了
--bare
- 离开了
-d Ubuntu-22.04
- VHDX 有多种不同的状态:
- “未初始化/未分配”:磁盘管理器中创建后的状态
- 在磁盘管理器中选择“初始化磁盘”
- 创建一个分区(但感觉不对,因为它不应该是 Linux 的 NTFS?)
- 在磁盘管理器中将其完全分离
答案1
通过评论解决,因此将信息移至答案(附带一些附加信息)。
在这种情况下,(相对较)新的 WSL 错误消息很有用。Wsl/Service/AttachDisk/MountVhd/E_ACCESSDENIED
指示权限问题一些种类。
通常,据我所知,.vhdx
通过磁盘管理创建的文件将归本地管理员组所有。在大多数情况下,安装并运行 WSL 的本地用户是该组的成员,因此存在权限问题。
然而,在这种情况下,似乎事实并非如此,因为改变所有者.vhdx
最终解决了ACCESSDENIED
错误。
一些附加项目:
虚拟磁盘做需要从磁盘管理中分离(右键单击 ->分离 VHD),否则会出现以下错误:
Failed to attach disk '<path_to>\wsl2-drive.vhdx' to WSL2: The process cannot access the file because it is being used by another process. Error code: Wsl/Service/AttachDisk/MountVhd/0x80070020
我个人建议
.vhdx
使用以下方法从管理 PowerShell 帐户创建:new-vhd -Dynamic -SizeBytes 100gb -BlockSizeBytes 1mb -path <path_to>/<name>.vhdx
块大小对于动态磁盘的增长速度非常重要。WSL 为其内置虚拟磁盘使用了 1 mb 的块大小。
此外,
--bare
只要驱动器上没有 WSL 可以处理的文件系统,则需要。下一步是在该虚拟驱动器上创建文件系统之内WSL。正如在WSL 文档,用于lsblk
识别新挂载的磁盘。完全确定您正在格式化正确的设备,方法是卸载,
lsblk
然后重新安装,然后lsblk
再次执行。在这种情况下,新设备将很明显。当然,唯一的驱动器大小也是识别它的有效方法。一旦识别了设备,你将使用类似以下内容:
sudo mkfs.ext4 /dev/<device> # e.g. sde
在设备上创建文件系统后,只要该文件系统是 WSL2 可以识别的(
ext4
、,btrfs
可能还有其他一些),您就可以--bare
在以后的挂载时跳过该选项。此时,最好切换到使用
--name <name>
,以便分区/文件系统将挂载到已知位置。默认情况下,这将是/mnt/wsl/<name>
。在这种情况下,这
-d Ubuntu-22.04
是一个无操作。我有点惊讶它没有产生错误,但设备始终被安装到全部发行版,无论您是否指定使用发行版wsl -d
。
答案2
不管怎样,我在尝试从另一台 PC 安装 wsl 磁盘备份时遇到了同样的问题。我通过制作本地副本解决了这个问题。
因此,不要直接从外部驱动器安装,而是进行复制,然后使用以下命令安装驱动器:
wsl -d Ubuntu --mount -vhd ext4.vhdx --name backup
注意:由于备份已格式化,请勿--bare
在这种情况下使用。驱动器将出现在/mnt/wsl/backup/