尝试在 Windows 11 上将 VHDX 安装到 wsl 时访问被拒绝

Dav*_*bbo 4 windows-subsystem-for-linux wsl2 windows-11

我使用磁盘管理器创建了一个新的 VHDX,并尝试将其安装到 WSL2(版本 1.0.3),运行以下命令:

wsl -d Ubuntu-22.04 --mount --vhd D:\wsl2\wsl2-drive.vhdx --bare
Run Code Online (Sandbox Code Playgroud)

它失败了:

Failed to attach disk '\\?\D:\wsl2\wsl2-drive.vhdx' to WSL2: Access is denied.
Error code: Wsl/Service/AttachDisk/MountVhd/E_ACCESSDENIED
Run Code Online (Sandbox Code Playgroud)

我尝试过的事情没有什么区别:

  • 从提升的 PowerShell 运行它
  • 创建 VHD 而不是 VHDX
  • 离开了--bare
  • 离开了-d Ubuntu-22.04
  • 拥有VHDX有多种不同的状态:
    • “未初始化/未分配”:在磁盘管理器中创建后的状态
    • 在磁盘管理器中选择“初始化磁盘”
    • 创建一个分区(但这感觉不对,因为它不应该是 Linux 的 NTFS?)
    • 在磁盘管理器中将其完全分离

Not*_*1ds 6

通过评论解决,因此将信息移至答案(带有一些附加信息)。

(相对)新的 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
    
    Run Code Online (Sandbox Code Playgroud)
  • .vhdx我个人建议使用以下命令从管理 PowerShell 帐户创建:

    new-vhd -Dynamic -SizeBytes 100gb -BlockSizeBytes 1mb -path <path_to>/<name>.vhdx
    
    Run Code Online (Sandbox Code Playgroud)

    事实证明,块大小对于动态磁盘增长的速度非常重要。WSL 将 1 mb 块大小用于其内置虚拟磁盘。

  • 此外,--bare只要驱动器上没有 WSL 可以处理的文件系统,就需要这样做。下一步是从WSL在该虚拟驱动器上创建文件系统。如WSL 文档中所述,用于lsblk识别新安装的磁盘。

    lsblk通过卸载、然后重新安装并再次来完全确定您正在格式化正确的设备并不是一个坏主意lsblk。在这种情况下,新设备将是显而易见的。当然,唯一的驱动器大小也是识别它的有效方法。

    识别设备后,您将使用以下命令:

    sudo mkfs.ext4 /dev/<device> # e.g. sde
    
    Run Code Online (Sandbox Code Playgroud)
  • 在设备上创建文件系统后,只要该文件系统是 WSL2 能够识别的文件系统(ext4btrfs,可能还有其他一些),您就可以--bare在将来安装时跳过该选项。

    此时,最好切换到 using --name <name>,以便将分区/文件系统安装在已知位置。默认情况下,这将是/mnt/wsl/<name>.

  • 在这种情况-d Ubuntu-22.04下是一个空操作。令我有点惊讶的是,它没有生成错误,但该设备始终安装到所有发行版中,无论您wsl -d是否指定使用的发行版。