将 WSL2 文件系统移动到另一个驱动器

Tom*_*han 14 windows-subsystem-for-linux wsl2

与 WSL1 不同,WSL2 的官方文档明确指出我应该将我经常从 Linux 访问的文件放在 Linux 文件系统下。但是,我还没有找到任何关于 Linux 文件系统在 Windows 文件系统中的位置设置的文档。

当然,%LOCALAPPDATA%如果您像我一样将机器配置为具有最小C:\驱动器和更大的驱动器,则默认位置(位于 下的某个位置)不是最佳位置D:\-我更愿意将 Linux 文件系统放在那里,以利用所有这些空间.

我可以以某种方式控制 Linux 文件系统的放置位置吗?

小智 24

如果您想从 C: 驱动器 D: 移动 WSL2 Linux 发行版 (Ubuntu),请执行以下步骤。

导出 Ubuntu

  • mkdir D:\备份
  • wsl --export Ubuntu D:\backup\ubuntu.tar

取消注册相同的发行版以将其从 C: 驱动器中删除:

  • wsl --unregister Ubuntu

导入 Ubuntu

  • mkdir D:\wsl
  • wsl --import Ubuntu D:\wsl\ D:\backup\ubuntu.tar

默认情况下 Ubuntu 将使用 root 作为默认用户,切换回以前的用户

转到 Ubuntu 应用程序文件夹运行命令以设置默认用户

  • cd %userprofile%\AppData\Local\Microsoft\WindowsApps
  • ubuntu 配置 --default-user <用户名>

  • 我确认它在 2021 年仍然有效。也许您系统上的 ubuntu 可执行文件略有不同,例如我的例子中的“ubuntu2004”。另一个小细节是,如果你安装了 docker,可能还安装了一些其他镜像。使用命令 wsl --set-default Ubuntu-20.04 再次设置默认值。 (5认同)
  • 只是想提一下,我最初尝试将 LocalState 文件夹移动到另一个驱动器并使用连接。显然它有效,但任何来自 Windows 应用商店的发行版更新都会对它构成威胁。所以我最终这样做了。这是长期可持续的解决方案。 (3认同)
  • 我到达这里是因为我的 WSL2 来宾系统填满了我的小 C 驱动器,所以我需要将其移动到更大的 D 驱动器。如果您遇到这种情况,请确保在尝试 wsl --export 之前将 Powershell 工作目录切换到 D:命令。如果尝试将临时文件写入完整的 C 驱动器,它将继续失败。首先更改为目标驱动器,您更有可能成功。 (3认同)

小智 20

这是 ubuntu18.04 的示例。
上面有几个地方不够详细。希望这会有所帮助。

wsl --list --verbose
mkdir d:\backuplinux
wsl --export Ubuntu-18.04 d:\backuplinux\ubuntu.tar
wsl --unregister Ubuntu-18.04
mkdir d:\wsl
wsl --import Ubuntu-18.04 d:\wsl\ d:\backuplinux\ubuntu.tar
cd %userprofile%\AppData\Local\Microsoft\WindowsApps            **(this is not needed if in path)**
ubuntu1804.exe config --default-user yourloginname
Run Code Online (Sandbox Code Playgroud)


小智 12

本着同样的精神,这是 Windows 10 上的 ubuntu20.04 的示例。
它在我的桌面上进行了测试。它在我的 C 盘上节省了 30GB。

Ubuntu 磁盘位于 %userprofile%\AppData\Local\Packages
CanonicalGroupLimited.Ubuntu20.04onWindows_...\LocalState\ext4。

首先,关闭 wsl 并确认名称。

wsl --shutdown
wsl --list --verbose

  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
Run Code Online (Sandbox Code Playgroud)

然后就可以导出tar文件并将其导入到D盘:

mkdir d:\backuplinux
wsl --export Ubuntu-20.04 d:\backuplinux\ubuntu.tar
wsl --unregister Ubuntu-20.04
mkdir d:\wsl
wsl --import Ubuntu-20.04 d:\wsl\ d:\backuplinux\ubuntu.tar
ubuntu2004.exe config --default-user yourloginname
Run Code Online (Sandbox Code Playgroud)

检查d:\wsl,ext4文件移到这里了。还要检查 C 盘上的可用空间。你应该看到很大的不同。


Not*_*1ds 9

WSL2 的最新版本包括一个新wsl --import --vhd选项,可将现有 VHD(WSL2 发行版的虚拟 SDD 驱动器)直接复制到另一个位置。请注意,这仅适用于 WSL2 发行版,不适用于 WSL1。

另请注意,为复制的发行版选择一个新的、不同的名称很重要。例如,如果您的发行版是“Ubuntu”,则新名称可能是“my_Ubuntu”(我称我的为“ntd_Ubuntu”)。

退出 WSL(如果您使用它,请关闭 Docker Desktop),然后从 PowerShell(常规的非管理终端):

wsl --shutdown

# Find the location of the existing distribution:

Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss\ | 
    ForEach-Object { 
        (Get-ItemProperty $_.PSPATH) | Select-Object DistributionName,BasePath 
    }

# Copy the <BasePath> of the distribution you want to copy 
# to the clipboard so that you can paste it into the --import command
# below.

# Create a directory on the other drive for the distro
mkdir d:\WSL\distros\<new_distro_name>

wsl --import <new_distro_name> d:\WSL\distros\<new_distro_name> <BasePath>\ext4.vhdx --vhd
Run Code Online (Sandbox Code Playgroud)

<new_distro_name>WSL 将在目录中创建一个名为 的新发行版D:

您可以通过以下方式启动此发行版:

wsl ~ -d <new_distro_name>
Run Code Online (Sandbox Code Playgroud)

由于它是一个新发行版,因此需要告知 WSL 默认用户名是什么。同时,它将以 root 用户身份启动。使用此答案创建一个/etc/wsl.conf文件来指定默认用户。

当您对新发行版与旧发行版的工作方式感到满意时,您可以使用以下命令删除旧发行版:

# Warning: This is a destructive and unrecoverable operation
# Please ensure the correct distribution name
wsl --unregister <old_distro_name>
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令将新发行版设置为默认发行版:

wsl --set-default <new_distro_name>
Run Code Online (Sandbox Code Playgroud)


Dan*_*l B 7

(我没有 WSL 2 可以尝试。)

WSL 支持导出和导入发行版,如下所示:

wsl --export Debian C:\temp\Debian.tar
wsl --import MovedDebian C:\WSL\Debian C:\temp\Debian.tar --version 2
Run Code Online (Sandbox Code Playgroud)

请注意我如何指定一个名为InstallLocation( C:\WSL\Debian)的参数。请记住,在我的示例中,“Debian”发行版仍然存在,因此我在导入时选择了不同的名称。您可以使用该wsl实用程序来管理您的 WSL 环境。