在 WSL 2 中装载 Linux 磁盘

如果要访问 Windows 不支持的 Linux 磁盘格式,可以使用 WSL 2 装载磁盘并访问其内容。 本教程将介绍标识要附加到 WSL2 的磁盘和分区的步骤、如何装载它们以及如何对其进行访问。

如果你正在连接外部驱动器且使用这些装载说明操作失败,则可能需要尝试连接 USB 设备的说明。 wsl --mount 命令目前不支持 USB/闪存驱动器/SD 读卡器(详细了解此问题)。

备注

将磁盘附加到 WSL 2 需要管理员访问权限。 WSL 2 mount 命令不支持装载当前正在使用的磁盘(或属于该磁盘的分区)。 即使只请求一个分区,wsl --mount 也始终会附加整个磁盘。 无法装载 Windows 安装磁盘。

先决条件

你需要使用 Windows 11 内部版本 22000 或更高版本,或者运行 WSL 的 Microsoft Store 版本。 若要检查 WSL 和 Windows 版本,请使用以下命令:wsl.exe --version

使用 Windows 格式设置与 Linux 格式设置装载外部驱动器之间的差异

为 Windows 设置格式的外部驱动器通常使用 NTFS 文件系统格式。 为 Linux 设置格式的外部驱动器通常使用 Ext4 文件系统格式。

如果在 Windows 文件系统上装载了 NTFS 格式的驱动器,则可以使用 WSL 从 Linux 分发版访问该驱动器,方法是创建装载的目录(sudo mkdir /mnt/d,将“d”替换为要使用的驱动器号),然后使用 drvfs 文件系统互操作插件并使用以下命令:

sudo mount -t drvfs D: /mnt/d

详细了解装载场景

如果你有 Ext4 格式的驱动器,则无法将其装载到 Windows 文件系统上。 若要使用 WSL 在 Linux 分发版中装载 Ext4 格式的驱动器,可以按照下面的说明使用 wsl --mount 命令。

装载未分区的磁盘

如果磁盘没有任何分区,则可以使用 wsl --mount 命令直接装载该磁盘。 首先需要标识磁盘。

  1. 标识磁盘 - 要列出 Windows 中的可用磁盘,请运行:

    GET-CimInstance -query "SELECT * from Win32_DiskDrive"
    

    磁盘路径位于“DeviceID”列下。 通常采用 \\.\PHYSICALDRIVE* 格式。

  2. 装载磁盘 - 使用 PowerShell,可以使用上面发现的磁盘路径装载磁盘,请运行:

    wsl --mount <DiskPath>
    

    在 WSL 中装载驱动器

装载分区磁盘

如果不确定磁盘的文件格式或其中的分区,可以按照以下步骤进行装载。

  1. 标识磁盘 - 要列出 Windows 中的可用磁盘,请运行:

    GET-CimInstance -query "SELECT * from Win32_DiskDrive"
    

    磁盘路径列在“DeviceID”之​​后,通常采用 \\.\PHYSICALDRIVE* 格式。

  2. 列出并选择要在 WSL 2 中装载的分区 - 确定磁盘后,运行:

    wsl --mount <DiskPath> --bare
    

    这将使磁盘在 WSL 2 中可用。 (在我们的示例中,<DiskPath>\\.\PHYSICALDRIVE*

  3. 附加后,可以通过在 WSL 2 中运行以下命令来列出分区:

    lsblk
    

    这会显示可用的块设备及其分区。

在 Linux 中,块设备被标识为 /dev/<Device><Partition>。 例如,/dev/sdb3 是磁盘 sdb 的分区号 ​​3。

示例输出:

NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0    1G  0 disk
├─sdb2   8:18   0   50M  0 part
├─sdb3   8:19   0  873M  0 part
└─sdb1   8:17   0  100M  0 part
sdc      8:32   0  256G  0 disk /
sda      8:0    0  256G  0 disk

标识文件系统类型

如果不知道磁盘或分区的文件系统类型,可以使用以下命令:

blkid <BlockDevice>

这将输出检测到的文件系统类型(采用 TYPE="<Filesystem>" 格式)。

装载所选分区

确定要装载的分区后,请在每个分区上运行以下命令:

wsl --mount <DiskPath> --partition <PartitionNumber> --type <Filesystem>

备注

如果希望将整个磁盘装载为单个卷(即如果磁盘未分区),则可以省略 --partition

如果省略,则默认文件系统类型为“ext4”。

访问磁盘内容

装载后,可以通过配置值指向的路径访问磁盘:automount.root。 默认值为 /mnt/wsl

在 Windows 中,可以通过导航到以下位置从文件资源管理器访问磁盘:\\wsl$\<Distro>\<Mountpoint>(选择任何 Linux 发行版)。

卸载磁盘

如果要从 WSL 2 卸载和分离磁盘,请运行:

wsl --unmount <DiskPath>

在 WSL 中装载 VHD

备注

Microsoft Store 中的 WSL 引入了直接装载 VHD 的新参数:wsl --mount --vhd <pathToVHD>

还可以使用 wsl --mount 将虚拟硬盘文件 (VHD) 装载到 WSL。 为此,首先需要使用 Windows 中的 Mount-VHD 命令将 VHD 装载到 Windows 中。 请确保以管理员权限运行此命令。 下面是一个示例,我们使用此命令并输出磁盘路径。 请务必将 <pathToVHD> 替换为实际 VHD 路径。

Write-Output "\\.\PhysicalDrive$((Mount-VHD -Path <pathToVHD> -PassThru | Get-Disk).Number)"

可以使用上面的输出获取此 VHD 的磁盘路径,然后按照上一部分中的说明将其装载到 WSL 中。

还可以使用此技术装载其他 WSL 发行版的虚拟硬盘并与之交互,因为每个 WSL 2 发行版都通过名为 ext4.vhdx 的虚拟硬盘文件进行存储。 默认情况下,WSL 2 发行版的 VHD 存储在以下路径中:C:\Users\[user]\AppData\Local\Packages\[distro]\LocalState\[distroPackageName],请谨慎访问这些系统文件,这是一个高级用户工作流。 确保在与该磁盘交互之前运行 wsl --shutdown 以确保该磁盘未被使用。

装载 WSL VHD

命令行参考

装载特定文件系统

默认情况下,WSL 2 将尝试将设备装载为 ext4。 若要指定其他文件系统,请运行:

wsl --mount <DiskPath> -t <FileSystem>

例如,若要以 fat 形式装载磁盘,请运行:

wsl --mount <Diskpath> -t vfat

备注

若要列出 WSL2 中的可用文件系统,请运行:cat /proc/filesystems
如果磁盘已通过 WSL2(Linux 文件系统)进行装载,则无法再通过 Windows 文件系统上的 ext4 驱动程序进行装载。

装载特定的分区

默认情况下,WSL 2 将尝试装载整个磁盘。 若要装载特定分区,请运行:

wsl --mount <Diskpath> -p <PartitionIndex>

仅当磁盘是 MBR(主启动记录)或 GPT(GUID 分区表)时,此操作才有效。 了解分区样式 - MBR 和 GPT

指定装载选项

若要指定装载选项,请运行:

wsl --mount <DiskPath> -o <MountOptions>

示例:

wsl --mount <DiskPath> -o "data=ordered"

备注

目前仅支持特定于文件系统的选项。 不支持诸如 ro, rw, noatime, ... 之类的通用选项。

附加磁盘而不装载它

如果上述任何选项都不支持磁盘方案,则可以通过运行以下内容将磁盘附加到 WSL 2 而不对其进行装载:

wsl --mount <DiskPath> --bare

这将使块设备在 WSL 2 内可用,以便可以从那里手动装载。 使用 lsblk 列出 WSL 2 中可用的块设备。

指定装载名称

备注

此选项仅适用于 Microsoft Store 中的 WSL

默认情况下,装入点名称是根据物理磁盘或 VHD 名称生成的。 这可以用 --name 覆盖此项。 示例:

wsl --mount <DiskPath> --name myDisk

分离磁盘

若要从 WSL 2 分离磁盘,请运行:

wsl --unmount [DiskPath]

如果省略 Diskpath,则将卸载和分离所有附加的磁盘。

备注

如果无法卸载某个磁盘,可以通过运行 wsl --shutdown 强制退出 WSL 2,这将分离磁盘。

限制

  • 目前,只能将整个磁盘附加到 WSL 2,这意味着不可能只附加一个分区。 具体而言,这意味着无法使用 wsl --mount 读取启动设备上的分区,因为该设备无法与 Windows 分离。

  • wsl --mount 只能装载内核中原生支持的文件系统。 这意味着无法通过调用 wsl --mount 来使用已安装的文件系统驱动程序(例如 ntfs-3g)。

  • 内核不直接支持的文件系统可以通过 --bare 附加然后调用相关的 FUSE 驱动程序来装载。