跳转至

环境配置

前言

本课程推荐同学们采用如下的 Rust 编译和开发环境:

  1. 操作系统:Windows 中的 WSL2、Linux 或 macOS
  2. Rust 编译工具链:使用 rustup 工具自动下载和配置
  3. Rust 开发环境:VSCode 以及 rust-analyzer 插件

在配置环境前,建议保证你的系统盘有至少 10GB 的空间。

下面请按照你的操作系统,阅读相应的文档进行配置。

操作系统配置

Windows 操作系统配置

如果你使用的是 Windows 操作系统,请安装 WSL(Windows Subsystem for Linux),它可以在 Windows 上提供一个 Linux 环境,也就是说,你首先在 Windows 里安装了一个 Linux,然后在这个 Linux 中进行 Rust 的编译环境的配置。

如果你已经安装好了 WSL,并且在 WSL 中安装好了一个 Linux 发行版,可以跳过本节内容。

如果你已经采用了其他方案来配置 Rust 开发环境(例如基于 MSVC 或者 MinGW),请跳过本节内容。

安装 WSL

本章内容参考了官方文档 Install Linux on Windows with WSL中文版)。如果你已经安装好了 WSL,可以跳过本节内容。

首先请保证你的操作系统版本不低于 Windows 10 20H2(Build 19042)或者 Windows 11。如果你的 Windows 版本过老,请升级到最新版本;如果无法更新,建议重装系统。

如何查看 Windows 版本

如果要查看当前 Windows 版本,可以在开始菜单中,输入 winver 然后回车,你可以在弹出的窗口中找到你的操作系统版本,如:Microsoft Windows Version 21H2 (OS Build 19044.1826),这个版本是符合要求的。

确认好 Windows 版本满足要求后,请在开始菜单中,输入 PowerShell,右键点击 Windows PowerShell,点击 以管理员身份运行。如果弹出了用户帐户控制的窗口,请点击

此时,一个标题为 管理员: Windows PowerShell 的窗口会弹出,并且在下面显示:

PS C:\Windows\system32>

输入 wsl --install 并回车。它会自动安装 WSL 相关组件,安装完成后重启计算机。如果它显示的是 WSL 命令的帮助文档,说明你已经安装好了 WSL。如果显示 wsl 不是内部或外部命令的错误,请在管理员:Windows PowerShell窗口中运行以下两条命令:

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

运行完成后重启计算机。

安装失败,显示 WslRegisterDistribution failed with error 0x800701bc 错误

说明你的系统版本比较老,请升级 Windows 版本到最新,或者按照 Manual installation steps for older versions of WSL 的指示进行修复。

需要注意的是,如果在 Microsoft PowerShell 窗口里选中了一部分文字(有意或者无意),选中的时候窗口内容不会变化,此时看到的并不是实时输出,而是选中文字时的内容。解决办法就是在窗口中按一下回车。

到这一步,就完成了 WSL 的安装,进入下一节。

WSL 版本

目前 WSL 共有两个版本,分别是 WSL1 和 WSL2。其中 WSL2 是更好的选择。

设置默认 WSL 版本为 WSL2,请在Windows PowerShell窗口中执行 wsl --set-default-version 2

PS C:\Users\tsinghua> wsl --set-default-version 2
有关与 WSL 2 的主要区别的信息请访问 https://aka.ms/wsl2
操作成功完成

如果设置不成功,可能说明你的操作系统版本较老,仅支持 WSL1。建议升级 Windows 到较新的版本,再设置 WSL 版本为 WSL2。如果升级有困难,也可以使用 WSL1。设置 WSL 版本为 WSL1:wsl --set-default-version 1。如果升级了 Windows,但 WSL 还是停留在旧版本,可以尝试先禁用 WSL 以卸载旧版本,再启用 WSL 以安装新版本的 WSL。

设置 WSL 版本为 WSL2 以后,接下来你要在 WSL 中安装一个 Linux 发行版。

安装 Linux 发行版

接下来,你需要在 WSL 中安装一个 Linux 发行版。为了有比较好的 Rust 开发体验,需要选择一个比较新的发行版,因此建议使用 Debian Linux 发行版。

如果你已经安装了一个 Linux 发行版,如果它不是 Debian 或者 Ubuntu 发行版,建议新安装一个 Debian 发行版;如果是 Ubuntu 发行版,请保证系统版本至少是 Ubuntu 20.04;如果是 Debian 发行版,请保证系统版本至少是 Debian Bullseye(Debian 11),推荐使用 Debian Bookworm(Debian 12)。

在 WSL 中安装 Debian 发行版,首先打开 Microsoft Store,搜索 Debian,点击进入 Debian 应用页面,点击获取(Get)。如果提示要通过 Microsoft 登录,点击 "不,谢谢"(No, thanks)。然后等待下载以及安装完成。

接着,在开始菜单中搜索 Debian,点击运行,会弹出窗口,提示你为 Linux 系统创建一个用户:

Enter new UNIX username: 

你可以自己定一个用户名(不能用中文),输入后回车,然后它会提示你设置初始密码:

Enter new UNIX username: tsinghua
New password:

输入密码时,不会显示在屏幕上,直接输入后回车,然后再次输入同样的密码,回车,这样用户就创建好了:

Enter new UNIX username: tsinghua
New password:
Retype new password:
passwd: password updated successfully
Installation successful!

进入系统以后,可以在 WSL 中运行 cat /etc/issue 命令来确认安装的系统版本:

$ cat /etc/issue
# Debian Bullseye (11):
Debian GNU/Linux 11 \n \l
# Ubuntu 20.04:
Ubuntu 20.04.4 LTS \n \l

我用命令 wsl --install -d Debian 安装得到的版本是 Debian 9,而不是 Debian 11

这是因为 Windows 自带了一份 WSL 版本列表,但它不是最新的,需要通过 Microsoft Store 更新。如果 Microsoft Store 不能正常工作,Windows 就会按照自带的旧的 WSL 版本列表安装 Debian 9;而如果 Microsoft Store 是正常的,Windows 就可以正确地找到最新的 Debian 版本并安装。

为了解决这个问题,有两个解决方法:一是直接升级 Debian 版本到 Bullseye(11),具体方法是用 root 权限替换 /etc/apt/sources.list 中的 stretchbullseye,然后运行 sudo apt updatesudo apt upgrade;二是 修复 Microsoft Store,在 Microsoft Store 中搜索并安装 Debian,把原来的 Debian 9 卸载掉:wsl --unregister Debian,再重新安装一次 Debian 11,注意 卸载的时候会删除 WSL 内所有数据,因此卸载前要备份好 WSL 内的数据。

从 stretch 更新到 bullseye 命令:

sudo apt update
sudo apt upgrade
sudo apt install -y sed
sudo sed -i 's/stretch/bullseye/g' /etc/apt/sources.list
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade

也可以升级到 Debian Bookworm。

WSL 环境

安装 WSL 以后,你已经在 Windows 中运行了一个 Linux 系统。为了进入 Linux 系统,首先打开 Microsoft PowerShell,然后输入 wsl 回车:

PS C:\Users\tsinghua> wsl
tsinghua@DESKTOP-TSINGHUA:/mnt/c/Users/tsinghua$

第一行的 wsl 命令表示进入 WSL 的 Linux 环境,而第二行就已经在 Linux 系统中了,后续的命令都在 Linux 环境下进行。

你也可以直接在启动菜单中搜索发行版的名字,例如 Debian,找到应用以后点击,就会弹出 WSL 的终端界面。

在本课程中,你可能会学习到一些命令,它们一般只能在 Windows 或者 Linux 二者其一的环境中运行。因此你需要学会区分当前打开的窗口是 Windows 环境还是 Linux 环境:

  1. Windows 的命令需要在 命令提示符 或者 Microsoft PowerShell 中运行
  2. Linux 的命令需要在 WSL 环境中运行

命令提示符中,看到的界面是这样的:

C:\Users\tsinghua>

Microsoft PowerShell 中,看到的界面是这样的:

PS C:\Users\tsinghua>

可以看到,Windows 的命令里看到的是完整的 Windows 路径,路径后是 >。PowerShell 的开头有 PS 字样。

WSL 中的 Linux 环境中,看到的界面是这样的:

tsinghua@DESKTOP-TSINGHUA:~$

它的默认格式是:用户名@主机名:当前路径$

一个简单的区分方法就是根据最后一个字符,如果是 > 就说明是 Windows;否则就是 Linux。

在本课程中,大部分命令都是在 WSL 内的 Linux 中运行。一个反例就是 wsl 命令,它需要在 Windows 环境下运行。

WSL 注意事项

在 WSL 中,为了方便和 Windows 互通数据,WSL 会自动把 Windows 的路径映射到 Linux 的 /mnt 目录下,例如 Windows 的 C:\Users\tsinghua 目录就会映射为 Linux 的 /mnt/c/Users/tsinghua。因此如果你想要在 WSL 环境中访问 Windows 的文件,可以在 /mnt 目录下去寻找对应的文件。

但是,这种映射是不完美的,由于 Linux 和 Windows 的文件系统在文件权限、大小写等细节上的差异,会导致共享目录的行为有很多地方比较特殊。因此建议,共享路径仅用于复制文件,而不要在共享路径下开发,而是复制到 HOME 目录中,也就是 /home/你的用户名

小结

至此,你应该已经配置好了 WSL 环境,并且在 WSL 中安装了一个 Linux 发行版,可以进入 Linux 发行版进行操作。

Linux 操作系统配置

本课程建议使用的 Linux 发行版是 Debian,并且版本不低于 Debian Bullseye(Debian 11),推荐使用 Debian Bookworm(Debian 12)。

如果你使用了其他的 Linux 发行版:

  • Ubuntu:建议升级到 24.04、22.04 或者 20.04
  • Arch Linux/NixOS/Gentoo:建议保持滚动更新到最新版
  • CentOS:建议重装成 Debian
  • Fedora/openSUSE:建议使用最新的稳定版本

简单来说,建议使用发行时间不晚于 2021 年的版本。

如何查看发行版版本?

尝试下面的命令:

  1. lsb_release -a
  2. cat /etc/issue

本教程中,涉及到使用系统包管理器的命令都以 Debian 和 Ubuntu 下的 apt 命令为例子,对于使用其他包管理器的发行版,其命令格式和包的名字可能有所不同,请你根据实际情况进行修改。

为什么要限制 Linux 发行版和发行版的版本?

上面几个推荐的 Linux 发行版使用的人数较多,通常来说文档比较全,容易找到解决方案,方便他人复现你的问题。并且在个人使用的场景下,用发行版最新的稳定版本是一个比较好的选择。

一些已知的兼容性问题:

  • Debian Stretch(Debian 9)和 Debian Buster(Debian 10)无法运行 rust-analyzer: 系统 glibc 版本低于 rust-analyzer 编译时使用的 glibc 版本,导致 VSCode 补全不能工作

macOS 操作系统配置

macOS 版本建议升级到不低于 Big Sur(macOS 11)。

接下来,你要安装 macOS 上的包管理器 Homebrew。这部分教程参考了 TUNA 镜像的文档

首先,打开 Launchpad(启动台),在搜索栏中输入 Terminal(中文系统则是终端),然后点击 Terminal(终端),打开终端。

这时候,你应该可以看到如下的提示:

tsinghua@MacBook-Pro ~ %

接下来,请在终端中按顺序执行下列的命令:

# 设置 Homebrew 镜像
export HOMEBREW_INSTALL_FROM_API=1
export HOMEBREW_API_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api"
export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles"
export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git"
export HOMEBREW_CORE_GIT_REMOTE="https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/homebrew-core.git"

# 从本镜像下载安装脚本并安装 Homebrew
git clone --depth=1 https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/install.git brew-install
/bin/bash brew-install/install.sh
rm -rf brew-install

# 更新 homebrew
brew update

中途可能会询问你的密码以使用 root 权限,并且会询问你是否继续安装操作,请按照它的指示进行操作。

为什么要安装 Homebrew 呢?

实际上,安装 Rust 开发环境只需要使用下面的 Rustup,并不需要 Homebrew。但是,Rust 有一些库会依赖一些外部的包,它们需要用 Homebrew 安装。

小结

至此,你应该已经配置好了一个 Linux/macOS 的环境,接下来,你就要在 Linux/macOS 下安装 Rust 编译工具链。

编译工具链配置

安装 rustup

接下来,你要用 rustup 工具来安装 Rust 编译工具链,首先,你需要进入命令行:

  • Windows:开始菜单搜索发行版的名字,比如 Debian,点击进入 WSL 环境
  • Linux:打开你的桌面环境对应的终端软件,如 Konsole/GNOME Terminal/Xfce Terminal 等等
  • macOS:点击 Launchpad(启动台),搜索 Terminal(中文系统是终端),点击终端图标

接着,请在 Linux 或者 macOS 的命令行环境下运行下面的命令安装 rustup:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

如果显示错误 Commmand 'curl' not found 的错误,并且运行的是 Debian 或者 Ubuntu 发行版,请运行下面的命令:

sudo apt update
sudo apt install -y curl

它可能会询问你设置的(WSL 中的)Linux 用户密码以提升权限来安装软件。安装完成后,重新运行上面的 rustup 安装命令。

如果网络正常,rustup 安装命令会提示下面的信息:

Current installation options:


   default host triple: aarch64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>

回车以后,它就会安装 Rust 所需要的编译器(rustc)、标准库(rust-std)等等。这个过程经过助教在校内测试,下载速度非常快,不需要配置镜像。

测试 rust 工具链

下载完成后,它会提示你安装到了 ~/.cargo/bin 目录下。这里的波浪线 ~ 表示的是你的 HOME 目录,类似于 Windows 下的 C:\Users\用户名,在 Linux 下通常是 /home/用户名,而 macOS 下通常是 /Users/用户名。你也可以找到一个名为 HOME 的环境变量指向这个路径。

当你输入命令并运行的时候,系统会在 PATH 环境变量的各个目录中寻找你想要执行的命令。比如你想要运行 Rust 语言编辑器 rustc,刚才你已经安装 rustc~/.cargo/bin 目录下了,接下来,你可以按照 rustup 提供的提示进行操作:

Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, run:
source $HOME/.cargo/env

它告诉你,已经写入了新的 shell 配置,当你重启终端的时候,PATH 环境变量就会包括 rustup 安装的目录。如果想要在当前的终端内尝试使用 rust 编译器,可以运行命令:

source $HOME/.cargo/env

这句话的意思是执行 $HOME/.cargo/env 文件的内容,上面已经讲到,HOME 环境变量是你的 HOME 目录的路径,前面加上一个 $ 符号表示展开,所以假如你的用户名是 iloverust,那么上面的这一句命令展开 HOME 环境变量后就变成了:

source /home/iloverust/.cargo/env

执行完这一步以后,在终端中就可以运行 rustc 了,你只需要运行下面的命令,如果可以正常输出 rustc 版本信息,就说明安装成功了:

rustc --version

到这里,你就可以完成环境配置作业了。

配置 TUNA 镜像

由于 cargo 下载第三方库的索引的时候需要访问 GitHub,建议为 cargo 配置 TUNA 镜像。本小节参考了 TUNA 镜像源的帮助文档

配置的方法,是新建(修改) ~/.cargo/config.toml 文件为以下内容:

[source.crates-io]
replace-with = 'mirror'

[source.mirror]
registry = "sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/"

如果你已经配好了 VSCode,你可以用 VSCode 完成上面的修改:

  1. 点击菜单 File -> New Text File 新建空白文本文件
  2. 把上面的内容复制并粘贴到 VSCode 的空白文件中
  3. 点击菜单 File -> Save As,此时上面会出现一个保存路径的输入框
  4. 输入 ~/.cargo/config.toml,由于 ~ 表示的就是 HOME 目录,所以最终的结果可能是类似 /home/tsinghua/.cargo/config.toml 的路径
  5. 点击 OK,这样就完成了文件的写入

如果还没有配置 VSCode,你可以先看下一节的内容,安装并配置好 VSCode 后,再按照这里的方法操作。

如果你使用的是 Windows,请在 WSL 的 Linux 环境里操作(VSCode 则是远程控制到 WSL 中操作)。

如果你使用的是 Linux(或者 WSL 里的 Linux),请保证系统里安装了 ca-certificates 包,如 sudo apt install -y ca-certificates

小结

在这一章节中,你使用 Rustup 工具下载并安装好了 rust 工具链。

开发环境配置

有了编译环境以后,你还需要一个好用的 Rust 开发环境。目前比较好用的 Rust 开发环境是 VSCode。

安装 VSCode

对于 Windows 和 macOS 用户,请访问 VSCode 官网,点击网页左侧的下载按钮并安装。其安装过程与其他软件一样,这里就不再赘述了。对于 Linux 用户(不包括 WSL 用户),你可以选择从官网上下载对应发行版的安装包,也可以配置 vscode 软件源来安装,具体请参考官网的安装文档。

安装 WSL 插件

如果你是 Windows 用户,请阅读本节内容,其他操作系统的用户可以跳过本节。

由于我们在 WSL 的 Linux 环境中开发 Rust,而我们安装的 VSCode 是在 Windows 环境中运行,可以想象这是两个独立的系统。因此我们需要给 VSCode 安装插件,让它远程控制 WSL 中的 Linux 系统进行开发。

打开 VSCode,找到左侧边栏中的扩展按钮(Extensions)并点击,可以看到上面有一个搜索栏,输入 WSL 并回车,可以看到下面显示了名为 WSL 的插件,点击它旁边的蓝色 Install 按钮,等待一段时间,它就安装成功了。

安装好以后,左侧边栏会出现一个新的按钮(Remote Explorer),点击会列出你在 WSL 中安装的发行版。把鼠标挪到发行版名字附近,可以看到右侧会出现一个“连接到 WSL”的按钮,点击它,会出现一个新的窗口,在这个窗口中 VSCode 会通过远程控制访问 WSL,左下角可以看到 WSL: 发行版名称 的提示,那就说明配置正确。

安装 rust-analyzer 插件

接下来,你还需要安装插件来提供 Rust 支持。打开 VSCode,找到左侧边栏中的扩展按钮(默认是第五个)并点击,在上面的搜索栏中输入 rust-analyzer 并回车,可以看到下面显示了名为 rust-analyzer 的插件,点击它旁边的蓝色 Install 按钮。安装完以后,就完成了 Rust 的开发环境配置。

对于 Windows 用户,请先使用上一小节的方法连接到 WSL,然后再安装 rust-analyzer 插件。

体验 VSCode Rust 开发

接下来,为了体验 VSCode Rust 开发环境,请创建一个 Rust 项目,并用 VSCode 打开。在终端中,运行:

cargo new --bin test-rust
cd test-rust
code .

上面的命令,首先使用 cargo 创建了一个新的名为 test-rust 的项目,然后使用 cd 让当前路径进入到刚创建的项目中,最后使用 code . 用 VSCode 打开当前目录。

运行以后,你应该可以看到一个新的 VSCode 窗口,并且显示的正是刚刚打开的 test-rust 项目。你可以在这个项目中做一些尝试,来体验 VSCode Rust 的开发环境。

开发 Rust 项目的时候,记得用 VSCode 打开 Cargo.toml 所在的目录,如果打开了其他目录,rust-analyzer 插件将不会工作。

小结

至此,你安装了 VSCode 和 rust-analyzer 插件,完成了 Rust 的开发环境配置。

Rust Playground 使用

当你想要做一些简单的实验,或者想要把一小段代码片段共享给他人的时候,可以尝试使用 Rust Playground:

你可以用它编写一些简单的程序,在线运行和测试,并且生成分享链接用于共享给他人。但是,它也缺少许多 IDE 的功能,也无法编写比较复杂的软件。Playground 的使用应该和本地的开发环境互为补充。

WSL 图形化界面配置

如果想要在大作业中开发图形化界面,为了在 WSL 中进行开发,需要为 WSL 配置图形化界面。如果不准备开发图形化界面,就不需要进行本小节的配置。

安装 X Server

第一步是安装 X Server:

  • 如果你正在使用 Windows 10 版本 19044 及以上或者 Windows 11: WSL2 可能已经带有了一个 X Server 实现 (WSLg)。通过以下方法检查:
    • 启动终端进入 WSL2 发行版,执行 echo $DISPLAY,如果显示不为空,说明存在 WSLg。
    • 如果没有 WSLg,可以尝试升级一下 WSL:wsl --update,看看升级后的 WSL2 是否存在 WSLg。
  • 如果你没有在使用 Windows 11,或者 Windows 10 版本不够新,在更新 WSL 后 DISPLAY 环境变量为空: 需要自行安装 X Server,并手动设置 DISPLAY 环境变量。
    • 安装 VcXsrv。然后运行 XLaunch,会弹出一个配置窗口,一路前进,勾选 Disable access control,最后选择 Finish,然后应该可以在右下角的状态栏中找到它。这时 X Server 已经启动。第一次启动的时候可能会弹出窗口询问是否打开防火墙权限,此时要勾选所有的网络并同意。
    • 接着需要在 WSL 里面配置 DISPLAY 环境变量。这一步在不同的 WSL 版本中要用不同的办法。

环境变量是什么?

环境变量是一些键值对(Key-Value Pair),其键和值都是字符串,用来保存一些信息,例如这里所述的 DISPLAY 环境变量是为了让需要图形界面(X11)的程序可以找到 X Server。以后还会看到各种环境变量,例如 PATHHOME 等等。

在命令行环境里,可以用 env 命令查看当前命令行环境中的所有环境变量。如果要查看某一个环境变量当前的值,例如查看 DISPLAY 环境变量的值,可以用 echo $DISPLAY 命令。如果要设置(或者覆盖)某一个环境变量,例如设置 DISPLAYxxxx,那么就用 export DISPLAY=xxxx 命令。

环境变量的特点是,它默认具有继承性:当父进程启动子进程的时候,除非额外设置,否则默认情况下,子进程的环境变量会从父进程继承(复制)环境变量。

配置 DISPLAY 环境变量

需要图形界面的程序通过 DISPLAY 环境变量来寻找 X Server,因此第二步是配置 DISPLAY 环境变量。

WSLg

如果你使用的是 Windows 11,并且安装了 WSLg,那么 DISPLAY 环境变量应该已经自动配置好了。

WSL2

我们在 Windows 上运行了 X Server,那么此时 WSL2 是客户端,Windows 是服务端。我们需要获取 Windows 的 IP 地址,以让 WSL2 通过网络连接运行在 Windows 上的 X Server。

由于默认情况下,Windows 也是 WSL2 的默认网关,因此我们可以通过查询路由表来获取 Windows 的 IP 地址(形如 x.x.x.x):

# 以 # 开头的一行是注释,下面的才是命令
# ip route show default:显示当前的默认路由(网络原理课程知识)
# |:管道(Pipe),把出现在 | 前面的进程的标准输出和出现在 | 后面的进程的标准输入接起来
# cut -d' ' -f3:以空格为分隔符,打印第三列的内容
# 由于 ip route show default 的输出形如:
# default via x.x.x.x
# 所以 ip route show default | cut -d' ' -f3 实际上就把 x.x.x.x 提取了出来
# $(command) 是 shell 的语法,表示执行括号里面的命令,然后把整个 $(command) 替换为命令的输出结果
# 最后下面的指令相当于 export DISPLAY=x.x.x.x:0
export DISPLAY=$(ip route show default | cut -d' ' -f3):0

同理,Windows 也是 WSL2 的默认 DNS 服务器。因此,也可以从 DNS 配置中找到 Windows 的 IP 地址:

# awk 是一个文本处理程序,它对输入文件的每一行执行给定的操作
# awk '/nameserver / {print $2; exit}' /etc/resolv.conf 表示:
# 1. 读取 /etc/resolv.conf 文件的每一行内容
# 2. 执行 `/nameserver / {print $2; exit}` 的操作:
#    a. 这个操作的意思是,找到所有出现 `nameserver ` 的行
#    b. 对这些行,打印它的以空格分隔的第二列
# /etc/resolv.conf 保存了系统的 DNS 配置,例如:
# nameserver x.x.x.x 表示系统的 DNS 服务器的 IP 地址是 x.x.x.x
# 通过上述命令,就可以把 x.x.x.x 这一部分提取出来
# 2>/dev/null 表示把标准错误流转发给 /dev/null,实际上就是丢弃了标准错误流的内容
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

运行上述命令没有任何输出,这是不是代表程序执行失败了?

否,Linux 下很多程序正常执行结束时,不打印任何内容。此时可以根据命令的 exit code(0 表示成功,非 0 表示失败)并结合命令的文档来判断。

通常情况下,使用上面两种方法得到的 Windows 的 IP 地址是相同的。如果使用了代理等修改网络配置的软件,可能出现结果不一致或者错误的问题,此时需要根据实际情况判断 IP 地址。

WSL1

WSL1 与 Windows 是同一个网络设备,因此连接 Windows 上的 X Server 实际上就是访问本机。因此只需要设置 DISPLAY 环境变量为 :0

export DISPLAY=:0

测试图形化界面

可以在 Linux 中安装 x11-apps 软件包并执行 xclock,如果 X Server 运转正常,可以显示出一个钟表。

sudo apt update
sudo apt upgrade
sudo apt install -y x11-apps
xclock

注意,上面是 x 十一,不是 x 两个 L。

注:如果你在使用 WSLg,初次启动图形程序会有一定延迟,大约 10-20 秒,是正常现象。

问题排查

如果测试 X Server 时无法正常显示,按照以下的方式排查:

  1. 检查 DISPLAY 环境变量是否配置了:echo $DISPLAY
  2. 确认你用的是 WSL1 还是 WSL2:在 命令提示符 里运行 wsl -l -v 可以看到版本
  3. 确认你在上面运行的命令和你的 WSL 版本是一致的
  4. 检查 VcXsrv 是否启动:桌面右下角应该可以找到它的图标
  5. 确认 VcXsrv 启动的时候勾选了 Disable access control:如果不记得了,退出 VcXsrv 再重新开一次
  6. 在桌面右下角图标里右键,选择 Applications -> xcalc,确认 VcXsrv 本身可以显示窗口
  7. 修改防火墙规则:设置,找到防火墙,选择高级设置,左侧找到入站规则,在中间找到所有 VcXsrv 相关的条目,如果左边显示的不是绿色的勾,则双击对应的属性,选择允许连接。保证所有 VcXsrv 相关的规则都是绿色的
  8. 如果还是不行,尝试关闭杀毒软件
  9. 如果还是不行,尝试用管理员权限启动 VcXsrv
  10. 如果还是不行,尝试禁用整个防火墙

配置持久化

上面设置的 DISPLAY 环境变量是暂时的,仅对当前运行的终端生效。为了持久化配置,你需要把上面能够正确配置 DISPLAY 环境变量的命令写入到 ~/.bashrc 文件中。

在路径里出现的波浪线是什么?

在 Linux 下,访问 HOME 目录下的文件是很常用的,因此为了简写,shell 支持用 ~ 来表示当前用户的 HOME 目录,用 ~xxx 来表示 xxx 用户的 HOME 目录。

~/.bashrc 文件的作用是什么?

前面提到过环境变量的特性,它具有继承性,子进程的环境变量默认继承(复制)自它的父进程,那么我们在 shell 里面运行程序的时候,自然也就继承了 shell 的环境变量。我们前面运行的 export 命令,实际上并没有新开一个子进程,而是由 shell 自己解析并修改自己的环境变量,但是如果重新开一个 shell(例如 Windows 下重新开一个命令行提示符,再进入 WSL;或者 Linux/macOS 下重开一个 Terminal),shell 的父进程是没有我们之前用 export 命令临时配置的环境变量的,自然新开的 shell 也没有这些环境变量。此时想要用图形界面,可能又要跑一遍上面的命令。

为了避免每开一个 shell 都要手动运行一系列的 export 命令,shell 通常会在启动的时候执行一些配置文件,例如常见的 shell 是用 bash 提供的,那么它启动过程中会去执行 ~/.bashrc 里的命令,如果在 ~/.bashrc 里写下 export 命令,那么每次开一个新的 shell 的时候,都会自动跑这些命令,不再需要手动跑。

常见问题

我已经用其他方式配置好了 Rust 编译和开发环境,例如在 Windows 上装好了 MinGW/MSVC 和 rustup,我还需要按照这个教程安装一遍 WSL 吗?

不需要,但如果你采用了本教程以外的环境来开发 Rust,并且环境出现了问题,助教将无法给你提供帮助。

我在 Windows 里面装了一个 Linux 虚拟机,我应该按照教程的哪部分做,还需要安装 WSL 吗?

直接按照 Linux 部分教程做,不需要安装 WSL,因为 WSL 本质上也是在虚拟机里安装 Linux。关于 VSCode,你既可以在 Linux 中安装 VSCode 进行开发,也可以尝试在 Windows 上安装 VSCode,然后通过 Remote - SSH 插件来远程访问虚拟机中的 Linux。

我的电脑坏了,或者安装 Rust 编译和开发环境一直失败,怎么办?

如果你在校内,可以到东主楼指定机房(9-225)使用机房电脑进行开发。机房电脑安装了 VSCode,在 WSL2 中的 Ubuntu 22.04,并已经用 rustup 安装了 Rust 编译环境,处理器是 Intel i7-13700K。

运行 cargo build 的时候出现报错 linker cc not found,怎么办?

这说明你的环境里缺少一个编译器,如果是 Linux 系统,请安装 gcc: sudo apt install -y gcc

使用 Rust Analyzer 插件的时候报错,显示无法启动 rust-analyzer 程序,错误信息出现了 GLIBC_2.25 not found 的字样

这是因为你的发行版版本过老(如 Debian 9),请升级到文档中标明的推荐发行版版本。

在 WSL 内无法访问网络,错误信息中出现 127.0.0.1 Connection Refused 的信息

可能性有:

  1. 要访问的网站的 IP 地址确实是 127.0.0.1,可能是服务端没有启动
  2. 要访问的网站的 IP 地址不是 127.0.0.1,可能是因为打开了代理,关闭后再试

在 WSL 内无法访问网络,错误信息中出现 Timed Out 的信息,且 IP 地址不是 127.0.0.1

尝试重置 Windows 的网络,在管理员权限的 PowerShell 中运行:

PS C:\Windows\system32> wsl --shutdown
PS C:\Windows\system32> netsh winsock reset
PS C:\Windows\system32> netsh int ip reset all
PS C:\Windows\system32> netsh winhttp reset proxy
PS C:\Windows\system32> ipconfig /flushdns

然后重启计算机。

参考:No internet connection on WSL Ubuntu (Windows Subsystem for Linux)

致谢

以下同学为本文档做出了贡献,在此表达感谢:

  • 未央 - 软件 11 鲁睿
  • 计 12 李飞翰