首先注意WSL1 和 WSL2 是不同的产品:

  • WSL1 是在Windows之上加了一个转换层,用来支持基本的Linux环境;
  • WSL2 则是更完整的虚拟化,包括一个定制的Linux内核,支持更完整的Linux使用。

虽然WSL2在某些情境下因为虚拟化程度更高而导致效率比WSL1更低,例如跨系统的文件读写,但是这相比与WSL2的巨大优势可以忽略不计,目前只推荐安装和使用WSL2。

准备

首先确保CPU虚拟化开启,默认似乎就是开启的,查看CPU就可以看到,确认一下。 然后在搜索栏中搜索启用或关闭Windows功能,往下翻找到适用于Linux的Windows子系统虚拟机平台,单击确定,等待安装完成后重启。 顺便把Hyper-V也打开,据说不需要完整的Hyper-V,但是开了也没事。

下载安装

在应用商店直接下载Ubuntu22发行版,下载完成打开 Ubuntu 的时候,可能会报错,需要安装/升级内核。

设置默认版本为WSL2

1
wsl --set-default-version 2

下载/更新内核

1
wsl --update

之后 Ubuntu22 就可以顺利安装了,提示输入默认用户名fenglielie,提示NAT模式不支持local的网络代理,后面会修改一下。

打包迁移

默认的发行版Ubuntu22安装位置在C盘,这里选择迁移到D盘的D:\WSL2\目录下,过程如下:

关机

1
wsl --shutdown

将其打包导出到指定位置

1
wsl --export Ubuntu-22.04 D:/WSL2/export-ubuntu22.tar

卸载原有的发行版

1
wsl --unregister Ubuntu-22.04

将刚刚导出的发行版压缩包导入到指定位置

1
wsl --import Ubuntu-22.04 D:/WSL2/Ubuntu D:/WSL2/export-ubuntu22.tar --version 2

配置默认用户fenglielie

1
Ubuntu2204 config --default-user fenglielie

注意这里实际是Ubuntu-22.04,但是输入命令时必须把空格和点去掉,否则powershell解析会发生错误。

这里的打包实际上可以用于对整个子系统进行备份,tar文件可以在别的位置或别的电脑中使用。

.wslconfig 配置

windows用户主目录下的.wslconfig为WSL上运行的所有已安装的发行版配置全局设置。

加入如下设置

1
2
3
4
5
6
[experimental]
autoMemoryReclaim=gradual # gradual | dropcache | disabled
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true

基本使用

给Ubuntu系统添加root用户: 从默认用户fenglielie登录,先给root用户设置密码

1
sudo passwd root

这一步sudo需要fenglielie自己的密码授权,在root用户添加了密码之后,就可以su root切换到root用户了。

apt添加镜像源:在/etc/apt/sources.list开头加上如下内容

1
2
3
4
5
6
7
8
9
10
deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

然后执行命令把基本的软件更新一下

1
2
(sudo) apt-get update
(sudo) apt-get upgrade

一些必需的软件,直接root用户通过apt安装:

  • git(然后先复制文件去配置ssh,注意路径名称还有权限,再拉取dotfiles)
  • cmake
  • tmux
  • vim
  • g++(version:11)
  • gdb
  • fish
  • ninja-build

然后配置ssh,注意涉及私钥文件的路径要完整,注意大小写,注意私钥文件的权限改为400,否则私钥无法使用。 之后通过git拉取dotfiles仓库,并完成相应的配置。

clang,clang++ ,clangd这一套工具不采用apt安装,因为apt提供的版本不是最新的。 使用LLWM提供的安装脚本,在普通用户的家目录下执行

1
2
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh

安装完成之后,注意到默认安装的是含有版本号后缀的:clang-18,clang++-18以及clangd-18, 我们希望使用的是不含版本号的:clang,clang++以及clangd。 下面定义软链接并设置版本切换的优先级

1
2
3
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-18 100
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-18 100
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-18 100

注意这里只是下载了clang/clang++以及clangd等工具,但是并不包括libc++,在编译程序时还是采用系统默认的libstdc++。

后续在使用中发现,官方源提供的gcc11也是不够的,我希望使用最新的gcc13,因此需要进行额外的配置。 首先,添加源

1
sudo add-apt-repository ppa:ubuntu-toolchain-r/test

然后更新包列表

1
sudo apt update

下载gcc13和g++13

1
2
sudo apt install gcc-13
sudo apt install g++-13

默认情形下gcc指向了gcc-11,g++指向了g++-11,因此也需要切换

1
2
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100

然后就可以在本地使用gcc13了。

常用命令

我们可以安装多个发行版,下面的命令也是考虑到有多个发行版存在的,但是实践中只安装了一个Ubuntu22就足够了。

进入默认的发行版:

1
> wsl

进入之后的位置仍然是当前的位置,并不是发行版中的用户家目录,下面的命令则会自动进入家目录

1
> wsl ~

查看WSL2当前的状态(版本,默认发行版)

1
2
3
4
> wsl --status

Default Distribution: Ubuntu-22.04
Default Version: 2

列出已安装的所有发行版,并查看详细信息,包括它们的运行状态,非常常用。

1
2
3
4
5
6
> wsl --list --verbose
or
> wsl -l -v

NAME STATE VERSION
* Ubuntu-22.04 Stopped 2

关闭某个发行版

1
> wsl -t Ubuntu-22.04

关闭所有发行版

1
> wsl --shutdown