将 WSL(Windows 上的 Bash)根文件系统移动到另一个硬盘驱动器?

Move WSL (Bash on Windows) root filesystem to another hard drive?

我刚刚将笔记本电脑中的 Windows 10 升级到 Redstone 1。所以我测试了 Linux 子系统(又名 WSL、LXSS 或 Bash Windows)。基本上一切正常,但是有一个问题是WSL的RootFS位于%LocalAppData%路径(例如C:\Users\xyz\AppData\Local),这也是我的Windows[=50]所在的地方=]位于。它在我的笔记本电脑中消耗了大量 SSD 硬盘驱动器 space,我希望我可以将它移动到我的外部硬盘驱动器上。

还有一个问题。由于其他硬盘驱动器分区安装为 DriveFS,它不支持某些 Linux 文件系统功能,如 chmod,并且我的一些 Linux 项目构建脚本仅适用于 VoIFS,它仅位于在 //home.

所以我尝试将整个WSL RootFS移动到另一个硬盘上。首先,我尝试为 C:\Users\xyz\AppData\Local\lxss 创建一个 NTFS 连接(硬 link)。我已经完全卸载了 WSL,运行 mklink 将 RootFS 卸载到另一个硬盘,当我再次重新安装 WSL 时, 它无法创建新用户,而且它报告错误代码 0x80070003。

然后我四处寻找,得到了这个:moving Linux filesystem - issue #449WSL RootFS 的移动和制作link 似乎只在Windows 10 Build 14388 之前有效,在Windows 10 Build 14393 RTM 中无效。 唯一的方法是将整个 %LocalAppData% 移动到外部硬盘驱动器,但我不能这样做,因为我是笔记本电脑用户,我不能随身携带外部硬盘驱动器!

所以我想问一下,有没有其他方法可以将 WSL 移出我的系统分区?如果我做不到,我可以在其他地方创建一个额外的 VoIFS 工作目录并编译我的东西吗?

感谢和问候, 杰克逊

WSL(目前)不支持将发行版移动或安装到非系统驱动器。但是,这是我们正在为未来 Windows 版本探索的场景。

请注意,从 Fall Creators Update (FCU) 开始,发行版现在通过 Windows 商店安装,并下载并扩展到不同的文件夹(即不在 %localappdata%\lxss 下)。

注意:虽然我们正在努力在未来的 Windows 版本中改进这种情况,但请不要 从 Windows 或 spelunk 进入发行版文件夹Windows 个应用仍然存在:https://blogs.msdn.microsoft.com/commandline/2016/11/17/do-not-change-linux-files-using-windows-apps-and-tools/

看看https://github.com/DDoSolitary/LxRunOffline

scoop install lxrunoffline
choco install lxrunoffline
  • 安装时无需访问互联网。
  • 将任何 Linux 发行版安装到磁盘上的任何位置。
  • 将现有安装移动到其他位置。
  • 正在复制现有安装。 (创建备份。)
  • 注册现有的安装目录。 (对于便携式使用。)

如果您使用的是 Windows10 版本 1903(2019 年 4 月更新)或更高版本,您可以尝试使用 the export and import options. If you are using an older Windows 10 version, you can move the distribution to another drive using lxRunOffline.

的 WSL 命令行工具

使用 WSL 命令行工具

在Windows10版本1903(2019年4月更新)或更新版本中,您可以使用wsl.exe命令行工具。

1.导出分布。 使用 wsl.exe --export

创建一个包含要移动的分布的 .tar 文件
wsl.exe --export <DistributionName> <Tar-FileName>

例如,要导出 Ubuntu 分布,您可以使用

C:\> wsl.exe --export Ubuntu c:\data\ubuntu.tar

2。将分发导入目标文件夹。然后,您可以将导出的分发导入另一个文件夹

wsl.exe --import <DistributionName> <Folder-To-Install> <Tar-FileName>

例如,要将导出的 Ubuntu 导入新的 UbuntuCustom 发行版,您可以使用

C:\> wsl.exe --import UbuntuCustom d:\wsl\UbuntuCustom c:\data\ubuntu.tar

注意: 您可以在 https://github.com/pxlrbt/move-wsl

检查用于移动使用这些命令的 WSL 发行版的脚本

使用 Lx运行离线

在任何 Windows 10 版本中,您可以使用 lxRunOffline.

将分发版移动到另一个驱动器

1.设置目标文件夹的权限。 首先,我认为你必须设置一些权限到分发将移动到的文件夹。您可以使用 icacls <dir> /grant "<user>:(OI)(CI)(F)" 设置适当的权限。

C:\> whoami
test\jaime

C:\> icacls D:\wsl /grant "jaime:(OI)(CI)(F)"

注意:除了上述权限外,我还激活了long path names in Windows

2。移动分配。 使用 lxrunoffline move

C:\wsl> lxrunoffline move -n Ubuntu-18.04 -d d:\wsl\installed\Ubuntu-18.04

您可以使用

检查安装文件夹
C:\wsl> lxrunoffline get-dir -n Ubuntu-18.04
d:\wsl\installed\Ubuntu-18.04

3。 运行 分配。 移动分配后,您可以 运行 使用 wsl 或相同的 lxrunoffline

分配
C:\wsl> lxrunoffline run -n Ubuntu-18.04 -w
user@test:~$ exit
logout

C:\wsl> wsl
user@test:/mnt/c/wsl$ exit
logout

我在 Windows 主页

中安装了 WSL2 Ubuntu20.04

来自@pixelarbeit 的评论

The wsl command solution works fine. I wrote a little script to automate these steps: github.com/pxlrbt/move-wsl

我做的步骤:

  1. 为 windows 安装 gitbash 到 运行 来自 github
  2. 的命令
  3. 打开发行版,添加文件

/etc/wsl.conf

[user]
default=<yourAccount>
  1. 在 CMD 中“wsl.exe --shutdown”
  2. 下次我打开发行版时,我的用户是默认用户,一切看起来都像以前一样,太棒了!

谢谢@pixelarbeit!

更新: 我使用 windows 商店的“windows 终端”程序,但设置 /etc/wsl.conf 并不总是有效。但我发现,尝试转到设置并设置为起始目录
\wsl$\Ubuntu-20.04\home\<your-username>。对于高山:
\wsl$\Alpine\home\<your-username>