cd ~
wsl -l -v
# Confirm the name of the distro
wsl --export <distroname> wsl_backup.tar
mkdir <new_disk_location> # C:\lhome perhaps
# New distro name can be whatever you want,
# but not Ubuntu, Ubuntu-20.04, etc.
wsl --import Ubuntu_WSL2 <new_disk_location> wsl_backup.tar
wsl ~ -d Ubuntu_WSL2
mkdir /lhome/username
# Assuming your default uid/gid is 1000, which it should be under WSL
chown 1000:1000 /lhome/username
usermod -d /lhome/username yourusername
如评论中所述,不建议将 WSL2 主目录放在 Windows 驱动器上,原因如下:
您的 Linux 主目录应位于符合 POSIX 的驱动器上。Linux 应用程序预计会出现这种情况。虽然大多数应用程序都可以,但最终您会遇到无法按预期工作的情况。我们可以(并且将)通过下面的 WSL 设置来缓解这种情况,但我们无法更改某些 Windows 行为。
与虚拟 ext4 文件系统相比,从 WSL2 访问 Windows 驱动器非常慢。正如我在那个链接的答案中提到的那样,在 WSL2 下的 Windows 驱动器上签出 WSL2 存储库大约需要 8 分钟,但在“本机”WSL2 文件系统上只需要几秒钟。
考虑到这一点,默认的 WSL2 文件系统位于虚拟 SDD(Windows
ext4.vhdx
文件)中。默认情况下,该文件的位置位于:(至少)有三种方法可以“更改”主目录,使其不在该位置。
选项 1:将整个 WSL 虚拟驱动器移动到新位置/发行版
我个人的偏好(无论如何我现在总是这样做)是将发行版本身复制到新位置。
退出 WSL
启动 PowerShell 并运行以下命令:
您将以 root 用户身份启动。您需要更改默认用户名。有关如何创建或修改
/etc/wsl.conf
.确认新实例正常工作后,您可以删除旧实例:
像这样手动配置的发行版不会受到卸载 Ubuntu 应用程序本身的影响。
这种方法可能会也可能不会满足您对此用例的特定需求,但同样,这是我个人的选择。
选项 2:为您的主目录创建并挂载新的 vhdx(仅限 Windows 11)
注意:我没有在生产系统中广泛测试过这种技术(也没有下一种)。
由于您拥有 Windows 11,因此您可以为您的主目录创建和挂载一个单独的 vhdx 文件。如果你有可以在 Windows 11 下从 Microsoft Store 安装的 WSL 预览版,那就更容易了。
我将在这里介绍预览方法,如果您需要使用更复杂的路线,请参阅 Microsoft 文档,了解如何在 WSL 中挂载 VHD 文件。
然而,这种技术有一个很大的缺点。此时,您必须在启动 WSL 之前手动将虚拟磁盘挂载到 WSL。我希望最终会有一个“自动挂载”选项
.wslconfig
,但它还没有,或者至少没有记录。因此,如果 WSL 关闭或重新启动,您需要
wsl --mount
在重新启动之前手动发出命令,否则将找不到您的主目录。考虑到这一点,现在要在新的虚拟磁盘上设置主目录:
一次性配置:
在管理员PowerShell 中,运行:
在您的常规 PowerShell 会话中:
WSL 内部:
退出 WSL,然后再次从 PowerShell(作为普通用户):
在 WSL 中(您现在应该是 root,基于前面的内容
-u root
),确认您/mnt/wsl/lhome
现在已经安装了一个。编辑
fstab
:在底部添加以下行(用于分隔字段的选项卡):
编辑
wsl.conf
:添加以下内容:
这基本上试图解决一个时间问题(希望如此),即在处理完之后
wsl --mount
才对实例可用。它会关闭自动处理,然后将其作为启动命令手动运行。这是一个hacky解决方法,但它对我有用。/etc/fstab
在挂载的 vhdx 中创建新的主目录:
退出 WSL。在 PowerShell 中,发出:
您的主目录现在应该是
/lhome/username
. 您可以使用 确认这一点cd ~; pwd
。同样,此方法将要求您在
wsl --mount
每次 WSL 本身重新启动时发出命令(通过计算机重新启动wsl --shutdown
或其他方式)。选项 3:绑定挂载到 Windows 文件夹
同样,由于本文开头列出的原因,确实不建议使用此方法,但这里可以。
假设您希望
C:\lhome
在 Windows 中成为/lhome
WSL:如果您尝试了上面的第二个选项,请还原任何更改。
wsl --shutdown
如果您确实尝试了选项 2,并且您想切换到选项 3,那么请在继续之前确保您也是如此。在管理 PowerShell 中:
这将打开区分大小写的功能,以便
abc
和ABC
是不同的文件。这至少让我们更接近 POSIX 兼容性。在文件资源管理器中,右键单击
C:\lhome
,选择属性->安全性并编辑“Authenticated Users”以添加“完全权限”。回到 WSL:
...并在底部添加以下行:
这会将 Windows 安装
C:\lhome
到/lhome
并启用metadata
和case=dir
改进 POSIX 兼容性。这(再次)假设您的用户是 UID/GID 1000。如果不是,请调整它。退出 WSL,终止它(从 PowerShell --
wsl --terminate <distro_name>
)并重新启动。检查驱动器是否安装了mount | grep lhome
.创建用户主目录:
确认
C:\lhome\username
现在存在。退出 WSL,然后使用
wsl ~ -u root
and 重新启动:当然,这模仿了上面第二个选项的步骤。
退出 WSL。在 PowerShell 中,发出:
您的主目录现在应该是
/lhome/username
. 您可以使用 确认这一点cd ~; pwd
。如果你touch ~/abc
,你应该找到在你的C:\lhome\username
目录中创建的文件。