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

Jac*_* Hu 20 windows windows-subsystem-for-linux

我刚刚将笔记本电脑中的Windows 10升级到Redstone 1.所以我测试了Linux子系统(Windows上的WSL,LXSS或Bash).基本上,一切都很好,但是存在一个问题,即WSL的RootFS位于%LocalAppData%路径(例如C:\Users\xyz\AppData\Local)中,这也是我的Windows操作系统所在的位置.它在我的笔记本电脑中消耗了大量的SSD硬盘空间,我希望我可以将它移动到我的外置硬盘.

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

所以我试图将整个WSL RootFS移动到另一个硬盘驱动器.首先,我试图制作一个NTFS Junction(硬链接)C:\Users\xyz\AppData\Local\lxss.我已经完全卸载了WSL并将mklinkRootFS 运行到另一个硬盘驱动器,当我再次重新安装WSL时,它无法创建新用户,并且它报告错误代码为0x80070003.

然后我四处搜索,我得到了这个:移动Linux文件系统 - 问题#449.似乎移动和制作WSL RootFS的硬链接仅在Windows 10 Build 14388之前有效,它在Windows 10 Build 14393 RTM中不起作用.唯一的办法是将整个移动%LocalAppData%到外部硬盘驱动器,但我不能这样做,因为我是一个笔记本电脑用户,我无法到处携带外置硬盘!

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

谢谢和问候,杰克逊

Jai*_*ime 29

您可以使用lxRunOffline将分发移动到另一个驱动器.

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

C:\> whoami
test\jaime

C:\> icacls D:\wsl /grant "jaime:(OI)(CI)(F)"
Run Code Online (Sandbox Code Playgroud)

注意:除了上述权限之外,我还在Windows中激活了长路径名.

2.移动分发.lxrunoffline move.

C:\wsl> lxrunoffline move -n Ubuntu-18.04 -d d:\wsl\installed\Ubuntu-18.04
Run Code Online (Sandbox Code Playgroud)

您可以使用检查安装文件夹

C:\wsl> lxrunoffline get-dir -n Ubuntu-18.04
d:\wsl\installed\Ubuntu-18.04
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • wsl 命令解决方案工作正常。我编写了一个小脚本来自动执行这些步骤:https://github.com/pxlrbt/move-wsl (8认同)
  • 这里“移动”一词缺少的是删除原始的 WSL 发行版。可以通过cmd: wsl --unregister Ubuntu 来完成删除 (5认同)
  • 这是迄今为止我认为的最佳选择 (3认同)
  • 我能够成功运行上述命令,但是%APPDATA%文件夹中仍存在Linux发行版,可以安全删除吗? (3认同)
  • 在我的情况下,命令是lxrunoffline move -n Ubuntu -d E:\ prog \ WSL \ Ubuntu (3认同)
  • 迁移后,WSL2 VM 的默认用户始终是 root。要修复它,我必须编辑“/etc/wsl.conf”并添加以下内容:“[user] default = &lt;您的用户名&gt;”。完成后,终止并重新启动虚拟机以使更改生效。 (3认同)

Ric*_*ner 9

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

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

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


gav*_*koa 8

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

scoop install lxrunoffline
choco install lxrunoffline
Run Code Online (Sandbox Code Playgroud)
  • 安装时无需访问 Internet。
  • 将任何 Linux 发行版安装到磁盘上的任何位置。
  • 将现有装置移至其他位置。
  • 复制现有安装。(创建备份。)
  • 注册现有的安装目录。(用于便携式使用。)


Dan*_*atz 5

我在Windows Home中有WSL2 Ubuntu20.04

来自@pixelarbeit 的评论

wsl 命令解决方案工作正常。我编写了一个小脚本来自动执行这些步骤:github.com/pxlrbt/move-wsl

我所做的步骤:

  1. 安装适用于 Windows 的 gitbash 以从github运行命令
  2. 打开发行版,添加文件

/etc/wsl.conf

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

谢谢@pixelarbeit!

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