使用 WSL 在 /mnt/d 上安装 Ubuntu

Eas*_*Dev 3 windows-subsystem-for-linux wsl2

OS: Windows 11
Run Code Online (Sandbox Code Playgroud)

我在 Windows 11 Pro 上安装了 WSL 并加载了 Ubuntu 20.04,如下所示(从以管理员身份运行的命令提示符中):

wsl --install Ubuntu-20.04
Run Code Online (Sandbox Code Playgroud)

安装完成,没有任何错误。然后我退出 Ubuntu 会话,并登陆:

c:\windows\system32
Run Code Online (Sandbox Code Playgroud)

然后我输入:

wsl
Run Code Online (Sandbox Code Playgroud)

最后进入 Ubuntu 终端会话:

john@john-x5700: /mnt/c/Windows/system32
Run Code Online (Sandbox Code Playgroud)

我有两个磁盘:C 和 D。在 Ubuntu 终端中显示为:

/mnt/c 
Run Code Online (Sandbox Code Playgroud)

/mnt/d
Run Code Online (Sandbox Code Playgroud)

看起来好像 Ubuntu 安装在 /mnt/c 上。我想做的是将 Ubuntu 安装在 /mnt/d 中。这可能吗?

Not*_*1ds 9

在了解如何在另一个驱动器上移动/安装 WSL 发行版之前,了解一些事情很重要。

首先,当您wsl从 PowerShell 或 CMD(或任何地方,实际上)运行(不带任何选项)时,它会告诉 WSL 在父进程传递给它的任何目录中启动。如果您在C:\Windows\System32CMD 中,那么这就是它开始的地方。

因此,您的 WSL起始目录与 WSL 实例的安装位置无关。

您可以通过以下几种方式之一覆盖起始目录:

  • wsl ~:将在 WSL 文件系统中默认用户的主目录中启动。对于 WSL2,该目录位于虚拟磁盘中。
  • wsl --cd /:将从该虚拟文件系统的根目录启动。
  • wsl --cd C:\:将在 Windows 驱动器的根目录中启动,正如您已经发现的那样,该驱动器默认C:安装在该根目录中。/mnt/c这是虚拟文件系统中到真实(可能的)物理驱动器的挂载点,该驱动器实际上通过内部 WSL 网络公开。

无论您的实际 Ubuntu 发行版安装在何处,所有这些命令都将发挥相同的作用。

所以说真的,你不想把它移到/mnt/d; 您想将其移动到 上的某个位置D:

那么Ubuntu安装在哪里呢?

我提到的虚拟磁盘实际上是 WSL 中 Ubuntu 安装的大部分。它包含整个 Linux(技术上称为“ext4”)文件系统, WSL中的所有文件都存储在其中。

虚拟磁盘自动安装到:

%userprofile%\AppData\Local\Packages\Canonical<...>\LocalState\ext4.vhdx
Run Code Online (Sandbox Code Playgroud)

那应该是这样的:

C:\Users\<your_windows_user>\AppData\Local\Packages\Canonical<...>\LocalState\ext4.vhdx
Run Code Online (Sandbox Code Playgroud)

警告 - 不要尝试手动移动它。

那么我该如何移动它或更改它的安装位置呢?

从技术上讲,您不能“移动它”或“更改它的安装位置”,但作为完全可以接受的解决方法,您可以:

  • 备份现有的 Ubuntu 安装
  • 将其恢复到您想要的任何目录(D:\在本例中是在驱动器上)
  • 删除原来的

要做到这一点:

  • 首先,在 PowerShell 中,在驱动器上的某个位置创建以下目录结构D:

    mkdir D:\WSL\instances\Ubuntu2004
    mkdir D:\WSL\images
    cd D:\WSL\images
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后,当仍在images目录中时:

    wsl --export Ubuntu-20.04 ubuntu.tar
    wsl --import Ubuntu2004 D:\WSL\instances\Ubuntu2004 ubuntu.tar --version 2
    
    Run Code Online (Sandbox Code Playgroud)

    第一行创建备份,第二行在驱动器上创建一个名为Ubuntu2004(而不是默认值)的新 WSL 实例。Ubuntu-20.04D:

  • 通过以下方式启动您的新实例:

    wsl ~ -d Ubuntu2004
    
    Run Code Online (Sandbox Code Playgroud)
  • WSL 不会“记住” d 实例的默认用户,因此您现在--import应该记住。root您需要根据此答案为此实例设置默认用户名。即:

    sudo -e /etc/wsl.conf
    
    Run Code Online (Sandbox Code Playgroud)

    并添加以下内容:

    [user]
    default=<your_username>
    
    Run Code Online (Sandbox Code Playgroud)
  • 保存,退出,退出Ubuntu。

  • wsl --terminate Ubuntu2004

  • wsl ~ -d Ubuntu2004

  • 如果一切正常,则将该实例设置为默认实例。再次回到 PowerShell:

    wsl --set-default Ubuntu2004
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在,当您键入时,您将在该实例中启动,您可以通过运行(再次从 PowerShell)和/或(从 Ubuntu 内部)wsl ~来确认。wsl -l -vecho $WSL_DISTRO_NAME

  • 一旦确认一切正常,您可以使用以下命令删除原始版本:

    wsl --unregister Ubuntu-20.04
    
    Run Code Online (Sandbox Code Playgroud)

    请记住,这是一个破坏性操作,将删除该虚拟文件系统中的所有文件。

当然,即使它现在安装在该D:\WSL目录下,除非您在启动时指定目录(通过类似的方法wsl ~或提到的其他方法之一),您仍然会在父进程传入的任何目录中启动(例如C:\Windows\System32) 。

这项技术的一优点是,一旦您学会了它,您就可以安装多个发行版。您可以轻松地创建现有 Ubuntu 安装的副本,在其中尝试一些内容,然后删除“临时”副本。


归档时间:

查看次数:

2691 次

最近记录:

4 年 前