将 WSL(Windows 上的 Bash)根文件系统移动到另一个硬盘驱动器?
Posted
技术标签:
【中文标题】将 WSL(Windows 上的 Bash)根文件系统移动到另一个硬盘驱动器?【英文标题】:Move WSL (Bash on Windows) root filesystem to another hard drive? 【发布时间】:2016-12-11 07:29:53 【问题描述】:我刚刚将笔记本电脑中的 Windows 10 升级到 Redstone 1。所以我对 Linux 子系统(又名 WSL、LXSS 或 Windows 上的 Bash)进行了测试。基本上一切都很好,但是有一个问题是WSL的RootFS位于%LocalAppData%
路径(例如C:\Users\xyz\AppData\Local
),这也是我的Windows OS所在的地方。它在我的笔记本电脑中占用了大量的 SSD 硬盘空间,我希望我可以将它移到我的外部硬盘驱动器上。
还有一个问题。由于其他硬盘分区挂载为DriveFS,它不支持chmod
等一些Linux文件系统功能,而且我的一些Linux项目构建脚本只能在VoIFS中工作,它只位于/
和/home
。
所以我尝试将整个 WSL RootFS 移动到另一个硬盘驱动器。首先,我尝试为C:\Users\xyz\AppData\Local\lxss
创建一个 NTFS 连接(硬链接)。我已经完全卸载了 WSL 并将 RootFS 的 mklink
运行到另一个硬盘驱动器,当我再次重新安装 WSL 时,它无法创建新用户,并报告错误代码 0x80070003。强>
然后我四处搜索,我得到了这个:moving Linux filesystem - issue #449。 似乎为 WSL RootFS 移动和制作硬链接仅适用于 Windows 10 Build 14388 之前,它不适用于 Windows 10 Build 14393 RTM。 唯一的方法是将整个 %LocalAppData%
移动到外置硬盘,但我不能这样做,因为我是笔记本电脑用户,我不能随身携带外置硬盘!
所以我想问一下,还有其他方法可以将 WSL 移出我的系统分区吗?如果我不能这样做,我可以在其他地方创建一个额外的 VoIFS 工作目录并编译我的东西吗?
感谢和问候, 杰克逊
【问题讨论】:
这听起来像是Super User的问题 @DanielA.White 也许,但这个问题也与工作(编译)环境有关。 查看此线程以了解此功能的进展:github.com/Microsoft/BashOnWindows/issues/449 【参考方案1】:我在 Windows Home 中有 WSL2 Ubuntu20.04
来自@pixelarbeit 的评论
wsl 命令解决方案工作正常。我写了一个小脚本 自动化这些步骤:github.com/pxlrbt/move-wsl
我做的步骤:
-
为 windows 安装 gitbash 以运行来自github 的命令
打开发行版,添加文件
/etc/wsl.conf
[user]
default=<yourAccount>
-
在 CMD 中“wsl.exe --shutdown”
下次我打开发行版时,我的用户是默认用户,一切看起来都和以前一样,太棒了!
谢谢@pixelarbeit!
更新:我使用 Windows 商店中的“Windows 终端”程序,并且以某种方式设置 /etc/wsl.conf 并不总是有效。但我发现,尝试进入设置并设置为起始目录\\wsl$\Ubuntu-20.04\home\<your-username>
。高山:\\wsl$\Alpine\home\<your-username>
【讨论】:
【参考方案2】:看看https://github.com/DDoSolitary/LxRunOffline
scoop install lxrunoffline
choco install lxrunoffline
安装时无需访问 Internet。
将任何 Linux 发行版安装到磁盘上的任何位置。
将现有安装移动到其他位置。
复制现有安装。 (创建备份。)
注册现有的安装目录。 (适合便携式使用。)
【讨论】:
【参考方案3】:如果您使用的是 Windows 10 版本 1903(2019 年 4 月更新)或更高版本,您可以使用 the export
and import
options 尝试 WSL 命令行工具。如果您使用的是较旧的 Windows 10 版本,则可以使用 lxRunOffline 将分发版移动到另一个驱动器。
使用 WSL 命令行工具
在 Windows 10 版本 1903(2019 年 4 月更新)或更高版本中,您可以使用 wsl.exe
命令行工具。
1.导出分发版。 创建一个 .tar
文件,其中包含要使用 wsl.exe --export
移动的分发版
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 发行版的脚本使用 LxRunOffline
在任何 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
【讨论】:
这是迄今为止我认为最好的选择 我能够成功运行上述命令,但是 linux 发行版仍然存在于 %APPDATA% 文件夹中,可以安全删除吗? 在我的例子中,命令是 lxrunoffline move -n Ubuntu -d E:\prog\WSL\Ubuntu wsl 命令解决方案工作正常。我写了一个小脚本来自动化这些步骤:github.com/pxlrbt/move-wsl “move”这个词中缺少的是删除原始的 WSL 分布。删除可以通过cmd来完成:wsl --unregister Ubuntu【参考方案4】: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/
【讨论】:
WSL GH Issue #449 跟踪询问 - 那里有一些可能对您有用的建议,但将发行版移动到非系统驱动器的功能尚未完全构建。以上是关于将 WSL(Windows 上的 Bash)根文件系统移动到另一个硬盘驱动器?的主要内容,如果未能解决你的问题,请参考以下文章
Windows XP上的VS Code + WSL应用程序上的CMake扩展
Windows 10 和 WSL - 在文件资源管理器中创建的目录未出现在 Bash 中