WSL 配置指南

本节贡献者

赵志远(作者)、 姚家园(审稿)、 田冬冬(审稿)

最近更新日期

2021-01-21

预计花费时间

120 分钟


警告

本文尚未经过除作者外的其他 Windows 用户测试,欢迎阅读并给与反馈。

注解

本节大部分命令是在命令行中执行的。

使用 Windows 系统时,可以通过 CMD 或 PowerShell 执行命令:同时按下 win + R 键,在打开的运行对话框中输入 “cmd” 以启动 CMD;在搜索栏中键入 “PowerShell” 并点击搜索到的图标以启动 PowerShell。在 CMD 或 PowerShell 中输入命令并按下 Enter 键即可执行相应的命令。

使用 Linux 系统时,在桌面或菜单栏中找到并点击 “Terminal” 图标以启动终端,然后在终端中输入命令并按下 Enter 键即可执行相应的命令。

简介

WSL (Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)是一个在 Windows 10/11 上运行原生 Linux 二进制可执行文件的兼容层。WSL 有 WSL1 和 WSL2 两个发行版本,二者底层原理不同。大多数情况下,建议使用 WSL2,因为它提供更快的性能和 100% 的系统调用兼容性。涉及到跨系统的文件互访时(Linux 访问 Windows 里的文件,或 Windows 访问 Linux 里的文件),使用 WSL1 具有更快的性能。WSL1 和 WSL2 的详细对比见官方文档

官方目前没有弃用 WSL1 的计划,并且支持将任何一个已经安装的 Linux 发行版转换为 WSL1 或者 WSL2。

WSL2 与 VMware/VirtualBox 兼容性警告

由于 Hyper-V 兼容性问题,开启 WSL2 功能后,虚拟机软件 VMware/VirtualBox 的老版本将无法正常使用。WSL1 和 VMware/VirtualBox 不存在兼容性问题,可同时运行。因此,已开启 WSL2 功能的用户若需要使用 VMware/VirtualBox,可以先把 Linux 发行版改为 WSL1,然后执行以下操作。

使用管理员模式打开 CMD 或 PowerShell,使用以下命令关闭 Hyper-V(重启后方能生效)。此时,Hyper-V 功能关闭,VMware/VirtualBox 可用,WSL2 不可用:

$ bcdedit /set hypervisorlaunchtype off

使用管理员模式打开 CMD 或 PowerShell,使用以下命令开启 Hyper-V(重启后方能生效)。此时,Hyper-V 功能开启,WSL2 可用,VMware/VirtualBox 不可用:

$ bcdedit /set hypervisorlaunchtype auto

新版本 VMware (≥15.5.5) 和 VirtualBox (≥6.0) 在最新 Windows 系统上(build number ≥19041)可以正常使用,无兼容性问题。

安装

WSL 的安装可以参考官方安装指南。其对 WSL 安装配置中可能遇到的常见问题都给出了详细的解决方案,请认真阅读。

WSL 可以安装不同的 Linux 发行版,但目前官方并未提供 Fedora 发行版的安装。推荐使用 WSL 安装 Ubuntu 20.04 LTS。

注解

想在 WSL 上安装 Fedora 的读者可以参考英文指南中文指南。指南中的 Fedora rootfs 下载地址可能已失效。请访问 Fedora 官方仓库下载 Fedora 33(安装指南中使用的版本)或 Fedora 35(Fedora 最新版本)镜像文件。

Fedora 只支持 WSL2。

常用命令

打开 CMD 或 PowerShell,可以运行如下命令来使用 WSL。以下示例命令假定已安装 WSL2 版本的 Ubuntu 20.04 LTS,且其名称为 Ubuntu。

wsl 命令用法:

# 查看 wsl 命令帮助
$ wsl -h

# 列出所有已安装的 Linux 发行版的状态,并显示是 WSL1 还是 WSL2
$ wsl -l -v

# 停止正在运行的 Linux 发行版
$ wsl -t Ubuntu

# 将 Ubuntu 由 WSL2 更改为 WSL1
$ wsl --set-version Ubuntu 1

# 将 Ubuntu 由 WSL1 改回 WSL2
$ wsl --set-version Ubuntu 2

# 设置默认发行版
$ wsl -s Ubuntu20.04

# 删除某个发行版(如名为 Ubuntu)
$ wsl --unregister Ubuntu

启动、进入和退出 Linux 环境:

# 启动并进入 Linux 环境(进入默认发行版)
$ bash

# 退出 Linux 环境(并不会改变 WSL 的运行状态)
$ exit

开启 WSL 后,Linux 发行版的默认安装位置是 C 盘。为了避免占用 C 盘的大量空间,可以将已安装的 Linux 发行版导出备份,再导入还原到其它盘,最后删除 C 盘上的发行版。这样做的另一个好处是导入时用户就能得到 WSL 的真实路径。

打开 CMD 或 PowerShell,执行如下命令:

# 导出 Linux 发行版,可做为备份
# 在 D 盘中新建备份目录,命名为 WSLBAK
$ mkdir D:\WSLBAK
# 导出到备份目录下,命名为 20210117bak.tar
$ wsl --export Ubuntu D:\WSLBAK\20210117bak.tar

# 导入并还原之前备份的 Linux 发行版
# 此例中选择在 D 盘中新建还原目录,命名为 Ubuntu20.04
$ mkdir D:\WSLDIR\Ubuntu20.04
# 导入并还原之前的备份,将此发行版命名为 Ubuntu20.04
$ wsl --import Ubuntu20.04 D:\WSLDIR\Ubuntu20.04 D:\WSLBAK\20210117bak.tar

# 删除 C 盘里名为 Ubuntu 的发行版,以释放 C 盘空间
$ wsl --unregister Ubuntu

配置 Linux

安装 WSL 后,还需要对 Linux 系统进行配置。Ubuntu 和 Fedora 用户可以分别参考《Ubuntu 配置指南》和《Fedora 配置指南》对系统进行配置,以满足科研工作的需求。

安装 X Server

WSL 本身不支持图形界面,需要在 Windows 中安装 X Server 来接收和显示 Linux 中的图形界面。

注解

X Window System(常称为 X11 或 X)是 UNIX 系统下常用的一种视窗系统,主要由 X Server 和 X Client 两部分组成。其中 X Server 负责接收对图形输出的请求并反馈用户输入,而 X Client 则是使用图形界面的应用程序。

注解

Windows 11 用户或 Windows 10 内测版本号大于 21362 的用户,可以跳过以下内容,直接试用 Windows 官方正在开发的 WSL 图形界面软件 WSLg

Windows 下常见的 X Server 有 VcXsrvXmingXmanager 等。其中,VcXsrv 是开源免费软件;Xming 和 Xmanager 是收费软件。Xming 在 2007 年发布了最后一个免费版本(6.9.0.31)。VcXsrv 的使用方式和界面与 Xming 极为相近。推荐使用 VcXsrv,本文以此软件为例进行介绍。

  1. 下载 VcXsrv,默认安装即可

  2. 运行 XLaunch,在 Extra settings 界面勾选 Disable access control,其他选项无需更改

  3. Windows 每次重启后,WSL2 nameserver 的 IP 可能发生变化。需要修改 Linux 的环境变量以保证始终能连接到 X Server:

    $ echo "export DISPLAY=\$(awk '/nameserver / {print \$2; exit}' /etc/resolv.conf 2>/dev/null):0" >> ~/.bashrc
    $ echo "export LIBGL_ALWAYS_INDIRECT=1" >> ~/.bashrc
    $ source ~/.bashrc
    
  4. 打开图形界面进行测试:

    # x11-apps 中包含了很多小程序如 xclock、xeyes
    
    # Ubuntu 用户使用如下命令安装
    $ sudo apt install x11-apps
    # Fedora 用户使用如下命令安装
    $ sudo dnf install xorg-x11-apps
    
    # 运行 xclock。若能看到一个时钟窗口,则表示图形界面设置成功
    $ xclock
    

注解

安装并配置好 X Server 之后,切记先运行 XLaunch 再进入 Linux 环境打开图形界面。

跨系统文件互访

WSL1 和 WSL2 都可以和 Windows 系统互相访问文件,但是无论从 WSL 访问 Windows,还是从 Windows 访问 WSL,WSL1 的速度都要远远快于 WSL2。因此,需要经常跨系统操作文件时,建议将 Linux 发行版设置为 WSL1。

WSL 访问 Windows

Windows 系统的硬盘挂载在 WSL 的 /mnt 路径下,用户可以在 WSL 终端中输入 cd /mnt/d 命令进入 Windows 系统的 D 盘,然后便可编辑和运行目录中的文件。

Windows 访问 WSL

在 Windows 下搜索、打开和编辑 WSL 下的文件和目录的方式有以下两种:

  1. 在 Windows 资源管理器的地址栏中输入 \\wsl$,会显示所有已安装的 WSL 目录,然后根据需要找到文件进行操作

  2. 进入 WSL,在终端输入 cd ~ && explorer.exe .,会在 Windows 下打开家目录,根据需要找到文件进行操作

在 Windows 下访问 WSL 文件系统时,文件和目录的路径有以下两种表示方式:

  1. 真实路径

  2. UNC 路径(指类似 \\wsl$ 这种格式的路径)

WSL1 支持真实路径访问,但 WSL2 不支持真实路径访问,这是因为 WSL2 使用 VHD 虚拟磁盘文件作为 Linux 发行版的根目录。

Windows 的 CMD 和 PowerShell 不支持 UNC 路径,所以使用 CMD 和 PowerShell 时,只能用真实路径访问 WSL1 文件系统,无法用 UNC 路径访问 WSL1 文件系统,也无法用真实路径和 UNC 路径访问 WSL2 文件系统。

Windows 的应用程序可以使用真实路径访问 WSL1 文件系统,某些支持 UNC 路径的软件(如 MATLAB)还可以通过 UNC 路径访问 WSL1 或 WSL2 文件系统。

因此,如果想使用 Windows 的 CMD、PowerShell 以及应用程序编译或运行 WSL 中的文件,需要先把 Linux 发行版切换到 WSL1 版本,进入 WSL 后新建一个名字独特的文件夹,然后在 Windows 中对该文件夹进行定位,从而确定其真实的路径。

注解

推荐在 Windows 中安装 Everything 实现文件夹和文件的快速定位。

推荐使用 Windows Terminal,可直接在 Microsoft Store 中安装。界面美观、操作方便,支持同时开启多个 CMD、PowerShell 以及 WSL,随意切换无卡顿。可完全替代 CMD 和 PowerShell。

推荐使用 Visual Studio Code,并安装插件 Remote - WSL。使用 VSCode 可以直接编辑和运行 WSL 里的文件,且不会因为跨文件系统工作使性能下降。