Skip to content

WSL指南

比起双系统或者完整虚拟机,WSL安装更加方便,并且能够方便地互相访问文件。

如果你是Windows 11的操作系统,WSL就已经内置在系统当中了。Windows 10 Build 19041 及以上版本也内置WSL。

如果你的系统比较老,那么可以参考微软的文档。其中也提及了启用虚拟化的方法。

wsl有1和2两个版本,这里建议使用wsl2的版本,打开powershell,使用如下命令可以将默认的wsl版本设置为2:

Terminal window
wsl --set-default-version 2

输入以下命令查看可用的Linux发行版:

Terminal window
wsl --list --online

输入以下命令安装Linux发行版:

Terminal window
wsl --install

默认情况下,安装的是最新版本的Ubuntu系统。

如果想要指定安装其他发行版,可以-d选项,使用--location设置安装发行版的路径,至于更多选项,可以使用以下命令查看:

Terminal window
wsl --help

作为示范,此处选择了安装Ubuntu 24.04 LTS,原因是学校大多数课程使用Ubuntu作为实验环境。

Terminal window
wsl --install -d Ubuntu-24.04 --location D:\WSL\Ubuntu\

在下载完毕后,你可以看到如下内容:

Ubuntu安装完成后的内容

你需要输入一个新的用户名和密码,之后就可以进入Linux系统了。

为了打开你刚才安装的Linux发行版,你需要重新启动PowerShell(准确来说是Windows Terminal),然后你就可以在下拉菜单上看见刚才安装的Linux发行版了。

在下拉菜单中找到刚才安装的发行版

在进入系统后,推荐给root设置密码:

Terminal window
sudo passwd root

wsl默认会将Windows的环境变量导入到Linux系统中,推荐关闭这个功能,因为WSL2对Windows文件系统的访问速度非常慢,导致bash在PATH中查询可执行文件时,速度会非常慢。你可以通过编辑/etc/wsl.conf文件来关闭这个功能,在文件中添加以下内容:

[interop]
appendWindowsPath = false

wsl会自动将windows的盘符挂载到/mnt目录下,例如C盘会挂载到/mnt/c目录下。如果你不想挂载(这样也不能访问windows中的文件了),可以在/etc/wsl.conf文件中添加以下内容:

[automount]
enabled = false

如果你希望在wsl能够使用你在Windows上的代理,你需要在Windows系统中的%USERPROFILE%\.wslconfig文件中添加以下内容:

[wsl2]
networkingMode = mirrored

注意[wsl2]如果已经存在,只需要在下面添加networkingMode = mirrored即可。

上述内容需要你重新启动wsl才能生效,使用如下命令关闭wsl:

Terminal window
wsl --shutdown

注意,关闭wsl也会关闭所有正在运行的wsl中的Linux发行版。此外,如果你更变Windows中的系统代理,也需要重新启动wsl才能生效。

你可能发现在Ubuntu中使用apt命令时下载速度极慢,这时你需要更换镜像源,你需要编辑/etc/apt/sources.list.d/ubuntu.sources文件。详细编辑内容,可以参考清华大学开源软件镜像站给出的Ubuntu镜像源配置,按照DEB822 格式配置。

配置完成后,使用以下命令更新apt缓存:

Terminal window
sudo apt update

这个命令不仅可以帮助你启用新的镜像源,还能够帮助你获取最新的软件包的列表。

对于其他的发行版,可以自行上网查询。

如果你一直使用wsl --shutdown命令关闭wsl,而不先关闭正在运行的Linux发行版,可能会导致某些系统进程反复启动但从不关闭的问题。这不会有太大影响,但最好还是先关闭Linux发行版再关闭wsl。

关闭系统可以使用sudo systemctl poweroff命令。关闭窗口不会关闭系统,原因是Windows Terminal只是使用ssh连接到wsl中的Linux发行版,关闭窗口相当于断开连接。

为了在wsl中使用图形化界面,你需要用到wslg,wslg一般是伴随着wsl一起安装的。如果没有安装,可以参考微软的文档

你需要手动设置启动图形化界面支持,在Windows系统中的%USERPROFILE%\.wslconfig文件中添加以下内容:

[wsl2]
guiApplications=true

这个图形化界面的bug还是非常多的,首先中文的显示问题比较大,而且有较大的性能问题,所以不建议过分依赖图形化界面。

wslg的问题是非常多的,有时会不断地往/var/log/syslog中写入大量内容,间隔时间是毫秒级别的,这导致日志文件很容易就达到数GB的大小,虽然日志文件会定期清理,但这样还是会非常占据磁盘空间,而且影响日志查看。

笔者由于更换过系统,已经无法复现这个问题了,如果你遇到了这个情况,欢迎在此处写下具体日志内容与解决方案。

VSCode对wsl有特殊照顾,在正常情况下,可以使用code命令来让Windows中的VSCode远程连接到wsl中的Linux发行版,在连接前,你需要首先在Windows环境下下载VSCode(环境变量会自动设置),执行code命令后会自动给你下载插件,接着就可以使用了,无须依赖wslg。

不过需要注意的是,由于在之前你可能已经把Windows中的PATH从Linux的PATH中剔除了,所以code命令无法使用。解决方法很简单,所谓的code,其实是VSCode安装时,同时安装的一个bash脚本。如果你的VSCode下载在D:\path\to\VSCode目录下,那么code脚本就位于D:\path\to\VSCode\bin中,你只需要选择一个目录(一般是你的Linux环境中PATH中的某个目录),然后创建一个软链接指向code脚本即可。例如:

Terminal window
ln -s /mnt/d/path/to/VSCode/bin/code /usr/local/bin/code

无法在wsl中运行Windows的可执行文件

Section titled “无法在wsl中运行Windows的可执行文件”

wsl中的Linux发行版是允许运行Windows的可执行文件的,但往往会出现无法运行的情况。你可以参考这个issue中给出的解决方案

笔者也把要执行的bash命令放在这里:

Terminal window
sudo sh -c 'echo :WSLInterop:M::MZ::/init:PF > /usr/lib/binfmt.d/WSLInterop.conf'
sudo systemctl restart systemd-binfmt

为什么要运行Windows中的可执行文件?例如在neovim中,你可能会启用系统剪切板,为了让剪贴板的内容与Windows系统的剪贴板内容互通,你可能会使用clip.exe,这种情况下,你需要运行Windows中的可执行文件。

为什么要安装最新版本的clang?因为最新的语言特性需要你使用最新版本的编译器才能支持。如果你没有这个需求,你可以直接跳过这部分内容。

为什么不使用apt直接安装?如果你是依照上面的方法安装Ubuntu的话,你会发现源中的clang版本可能不是最新的。

例如,笔者在写这篇文章的时候,Ubuntu noble源中clang的最新版本是20,而最新的版本是21。

如果你觉得这个版本已经足够用了,那么你可以直接使用:

Terminal window
sudo apt install clang-20

接下来讲解如何安装最新版本的clang

笔者并不推荐通过源码编译的方式来安装最新版本的clang,原因如下:

  • 较长的编译时间。笔者在自己的电脑上要花费3个小时及以上才能编译完LLVM项目的clang以及其他大部分组件。
  • 编译可能会出错。在编译过程中,非常容易出现不明原因出现错误,在删除某些编译文件后重新编译,又成功的情况。
  • 需要较大的内存。编译这种大项目往往使用多线程编译,这会占用大量内存。
  • 卸载麻烦。如果你删除了LLVM项目源文件,在卸载时,需要重新下载源文件,用相同的参数运行./configure,接着再使用make uninstall。(注:你也可以提前管理安装路径来避免这种麻烦,例如这篇文章提到的方法)

LLVM官方已经为Debian/Ubuntu提供了预编译的二进制包,详见官方网站

安装方法如下:

首先下载安装脚本并赋予可执行权限:

Terminal window
wget https://apt.llvm.org/llvm.sh
chmod u+x llvm.sh

接下来下载你需要的版本,例如21

Terminal window
sudo ./llvm.sh 21

这个脚本会加入官方的apt源,更新缓存,并下载指定的clang版本到你的系统。

此时应该安装好了clang-21,你可以使用以下命令来查看:

Terminal window
apt list --installed | grep clang
clang-21 --version

这样,你就可以使用apt来方便地管理clang的安装、卸载和更新。

需要注意的是,该脚本使用的是老的安装方法,该方法已经由于安全原因被弃用了,你可以参考该网站来了解如何处理这个问题。

LLVM项目的其他工具,例如clang-tidy, clang-format,默认不会安装,但你可以通过apt来很方便的安装,例如:

Terminal window
sudo apt install clang-tidy-21 clang-format-21