WSL2 安装配置

自从把老旧的 MBP 处理掉后一直都在 Linux 上写代码,但是最近觉得 Windows/Ubuntu 双系统之间来回切换太麻烦了,同时在虚拟机中运行 Linux 又有些慢,所以想尝试一下 WSL2。

主要记录一下 WSL2 相关的安装与配置,Linux 相关的如镜像、各种环境设置就省略了。

安装

作为一个有点 “精神怪癖” 的人,我基本不把任何软件装在 C 盘,而 WSL2 的默认安装虽然很方便,但是会把系统装在 C:\Users\<name>\AppData\Packages\xxx.UbuntuonWindows.xxx 下(Windows 糟糕的路径设置真让人痛苦),因此我选择使用手动安装。

  1. 启用 WSL:以管理员身份运行 PowerShell,并输入以下命令

    1
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
  2. 启用虚拟机功能:以管理员身份运行 PowerShell,并运行以下命令后重启计算机

    1
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
  3. 下载安装 Linux 内核更新包

  4. 将 WSL2 设置为默认版本

    1
    wsl --set-default-version 2
  5. 下载适用于 WSL 的发行版,各个发行版的链接微软官方手册有说明,这里我使用 Ubuntu 20.04

  6. 下载得到的 Linux 发行版都是以 .appx 格式结尾。首先把文件移动到你想要的位置,如 F:\WSL2\,之后将该文件重命名为 .zip 并解压。解压后你能找到一个名为 xxx_x64.appx 的文件,再次重命名为 .zip 并解压。解压之后能找到名为 ubuntu.exe 的文件,双击安装后根据提示设置用户名和密码即可完成。

WSL2 2.0 解决网络问题

Win11 23H2 之后,WSL2 2.0 版本带来了一些更新:

  • 支持自动回收内存
  • 支持自动释放 WSL2 虚拟硬盘空间
  • 支持和 Windows 使用相同的网络(镜像网络)
  • 支持 DNS Tunneling
  • 支持同步 Windows 代理
  • 支持 Windows 防火墙
  • 支持 Multicast

所需要做的配置为:在 C:\Users\<UserName>\ 目录下创建 .wslconfig 文件,并写入内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
# Settings apply across all Linux distros running on WSL 2
[wsl2]

# Enable experimental features
[experimental]
# 镜像网络模式
networkingMode=mirrored
# 强制 WSL 使用 Windows 的 HTTP 代理信息
autoProxy=true
# 慢速自动回收内存
autoMemoryReclaim=gradual # 开启自动回收内存,可在 gradual, dropcache, disabled 之间选择
# 开启自动释放 WSL2 虚拟硬盘空间
sparseVhd=true

WSL2 内设置代理

我是选择使用 proxychains-ng 而不是设置 export http_proxy... 之类的方式。

  1. 首先是 Windows 在 WSL2 中的 IP 是动态变化的,要获得该 IP 地址可以通过以下命令

    1
    cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
  2. 安装 proxychains-ng:sudo apt install proxychains4

  3. 创建配置文件

    1
    2
    3
    4
    mkdir ~/.proxychains
    sudo cp /etc/proxychains4.conf ~/.proxychains/proxychains.conf
    sudo chown $(whoami) ~/.proxychains/proxychains.conf
    sudo chgrp $(whoami) ~/.proxychains/proxychains.conf
  4. 确保运行在 Windows 上的代理软件允许局域网访问,同时记录 socks5 的端口,准备下一步使用

  5. ~/.proxychains 下创建 proxy.sh 文件,记得填写上一步得到的端口号

    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/env bash

    # Get the IP of Windows
    WIN_IP=$(< /etc/resolv.conf grep "nameserver" | awk '{print $2}')
    # Delete the old configuration of socks5
    sed -i '/socks5/d' ~/.proxychains/proxychains.conf
    # Add new configuration of socks5
    sed -i '$a socks5 '"${WIN_IP}"' <port>' ~/.proxychains/proxychains.conf
  6. 修改 .zshrc.bash_profile 文件,添加以下内容

    1
    2
    # proxychains-ng settings for WSL2
    source ~/.proxychains/proxy.sh
  7. 测试

    1
    proxychains curl -I https://www.google.com

其他

  • 拷贝 Windows 中的文件到 WSL2:Windows 中的硬盘挂载在 /mnt/ 下,直接使用 cp 命令即可。