WSL2 Ubuntu 快速配置清单

写于 2020-06-17
本文原本是一系列文档的一部分,这里先做精简整理,提前发出来。后续可能不会更新,请注意日期。

启用 WSL2

条件:

  • Windows 10 20H1 (2004) 或更高版本,不限专业版或家庭版;

  • 在 BIOS/UEFI 中开启虚拟化相关功能(Intel VT-x、AMD SVM 等)。

使用管理员权限打开 Windows PowerShell
# 开启 WSL
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
# 开启虚拟机平台
# 相当于开启 Hyper-V,会影响 VMware、VBox
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

重启 Windows。

使用管理员权限打开 Windows PowerShell
# 设置 WSL 默认版本为 2
wsl --set-default-version 2

安装 WSL2 Ubuntu

安装好后运行该“App”,并配置:

  • 用户名

  • 密码

  • 确认密码

使用 Windows Terminal

没用过 Windows Terminal?直接在应用商店中下载即可:

https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701

WT 会自动添加 WSL Ubuntu 相关项,你只需要配置一下默认启动目录即可:

按 【Ctrl + 逗号】 打开 WT 设置文件
// 为 Ubuntu 项添加启动目录配置
// 别忘了给上一行尾添加逗号
"startingDirectory": "//wsl$/Ubuntu/home/【你的Ubuntu用户名】/"

你也可以配置 WT 默认启动 WSL,而不是 PowerShell:

按 【Ctrl + 逗号】 打开 WT 设置文件
"defaultProfile": "【你刚改的Ubuntu Profile的GUID】",

保存即可,立即生效。

WSL2 Ubuntu 基础配置

以下命令在 WSL2 Ubuntu (Bash) 中执行。

配置代理

希望你在 Windows 下已经配置好代理,一个流畅的代理能让你省去太多无谓的烦恼。

目前版本的 WSL2 尚未打通双向端口映射,只打通了虚拟机→物理机的映射,因此配置代理 http://127.0.0.1:1080 无效。

这里用到了一个取巧的办法,需要安装 Docker Desktop for Windows。 此外,你的代理软件也需要允许局域网连入。

配置代理(全局环境变量)
# 写入到全局环境变量(会覆盖原文件)
sudo tee /etc/profile.d/proxy.sh >/dev/null <<'EOF'
export HTTP_PROXY=http://host.docker.internal:1080
export HTTPS_PROXY=$HTTP_PROXY
export http_proxy=$HTTP_PROXY
export https_proxy=$HTTP_PROXY
export NO_PROXY="localhost,*.local,*.internal,[::1],fd00::/7,
10.0.0.0/8,127.0.0.0/8,169.254.0.0/16,172.16.0.0/12,192.168.0.0/16,
10.*,127.*,169.254.*,172.16.*,172.17.*,172.18.*,172.19.*,172.20.*,
172.21.*,172.22.*,172.23.*,172.24.*,172.25.*,172.26.*,172.27.*,
172.28.*,172.29.*,172.30.*,172.31.*,172.32.*,192.168.*,
*.cn,*.aliyun.com,*.aliyuncs.com,*.alibabacloud.com,
mirrors.aliyun.com,*.taobao.org,npm.taobao.org,
*.163.com,mirrors.163.com,hub-mirror.c.163.com,
*.daocloud.io,daocloud.io,hub.daocloud.io,
*.ruby-china.com"
export no_proxy=$NO_PROXY
EOF

配置国内软件源

这可以说是 Ubuntu 的固定仪式了。

配置镜像源(阿里云),该命令与 Ubuntu 版本无关。
sudo sed -i.bak "s#archive.ubuntu.com#mirrors.aliyun.com#g;s#security.ubuntu.com#mirrors.aliyun.com#g" /etc/apt/sources.list
更新软件包
sudo apt update && sudo apt upgrade -y && sudo apt autoremove

如果更新过程中有提示(是否重启服务),选 Yes 就行。

完成后按 Ctrl + D 退出 WSL Bash。 这样下次启动终端时会重新执行启动脚本,使新环境变量即生效。

WSL2 第二次启动非常快,因此下文中均不含更新环境变量的命令,全部退出重进完事。

安装最低限度的基本工具(可略过)

sudo apt install -y \
    zip unzip \
    binutils bison build-essential gcc make \
    zlib1g-dev

不建议用 Linuxbrew 管理软件包,把简单的事情变复杂了。如果你的环境真有那么复杂,建议用多个 WSL 实例,或者 Docker。

WSL Java 开发环境配置

如果你裸连 GitHub 非常慢,那么前面配置的代理就有用了。

安装 SDKMAN!

# 安装 SDKMAN!
curl -s "https://get.sdkman.io" | bash

完成后开个新的命令行终端(使环境变量生效)。

使用 SDKMAN! 安装 AdoptOpenJDK

其他 OpenJDK 同理。

# 列出当前可用 JDK/JRE
sdk list java

# 安装指定版本
# 此处选用 AdoptOpenJDK-OpenJ9
sdk install java 11.0.7.j9-adpt
切换不同 SDK
# 查看已安装版本
sdk list java | grep installed

# 在当前环境(终端)中使用某个版本
sdk use java 11.0.7.j9-adpt

# 设置默认版本
sdk default java 11.0.7.j9-adpt

使用 SDKMAN! 安装 GraalVM

# 安装 GraalVM “基本款”
sdk install java 20.1.0.r11-grl

# 查看 GraalVM 所有可用组件
gu available

# 安装原生镜像工具
gu install native-image

# 安装 LLVM 工具
gu install llvm-toolchain
# LLVM 工具的临时环境变量
export LLVM_TOOLCHAIN=$(lli --print-toolchain-path)

完成后按 Ctrl + D 退出 WSL Bash,再开个新的命令行终端。

映射 Maven 与 Gradle 目录

我们完全可以让 Windows 与 WSL 下共用一套 jar 包缓存,通过一个软链接解决:

ln -sf /mnt/c/Users/【你的Windows用户名】/.m2  ~/.m2
ln -sf /mnt/c/Users/【你的Windows用户名】/.gradle  ~/.gradle

注意修改 【你的Windows用户名】

配置 Maven 镜像源

如果你在 Windows 下没有配置 Maven 镜像源,那么在 Linux 下配置一次即可。

Maven 镜像源配置(执行脚本即可)
cat > ~/.m2/settings.xml <<'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置 Maven 使用阿里云的镜像 -->
<!-- 请将本文件置于: ~/.m2/settings.xml -->
<settings>
  <mirrors>
    <mirror>
      <id>aliyun-public</id>
      <name>Aliyun Maven Central and JCenter</name>
      <url>https://maven.aliyun.com/repository/public</url>
      <mirrorOf>central,jcenter</mirrorOf>
    </mirror>
  </mirrors>
</settings>
EOF

配置 Gradle 镜像源

如果你在 Windows 下没有配置 Gradle 镜像源,那么在 Linux 下配置一次即可。

Gradle 镜像源配置(执行脚本即可)
cat > ~/.gradle/init.d/mirrors.init.gradle.kts <<'EOF'
// 配置本地 Gradle 全局使用 Maven 镜像源
// 请将本文件置于: ~/.gradle/init.d/mirrors.init.gradle.kts
settingsEvaluated {
    allprojects {
        repositories {
            maven("https://maven.aliyun.com/repository/public/")
            maven("https://maven.aliyun.com/repository/spring")
            maven("https://maven.aliyun.com/repository/google")
            // 关于 mavenLocal()
            // 如果你在别的地方看见过 mavenLocal() 作为“缓存”仓库项,这里要明确纠正
            // Gradle 不推荐启用本地 Maven 源,更不推荐将其置于第一位
            // 1. 本地 Maven 本质上是 Maven 自己专用的 Cache,Gradle 无法对其溯源(无法得知是否完整、是否被篡改)
            // 2. 因此 Gradle 不会对本地 Maven 进行缓存操作,这将会降低构建速度
            // 3. 只有在真正需要本地制品仓库(即:发布到本地)的情况下,才启用 mavenLocal()
            // 信息来源: https://docs.gradle.org/current/userguide/declaring_repositories.html#sec:case-for-maven-local
        }
    }
    pluginManagement {
        repositories {
            maven("https://maven.aliyun.com/repository/gradle-plugin")
            maven("https://maven.aliyun.com/repository/spring-plugin")
        }
    }
}
EOF

WSL NodeJS 开发环境配置

Node.js 和 npm 在 WSL 下用起来爽过 macOS/Linux(用崩了就重装呗,反正快),这也是 WSL 的一大出发点(争取前端开发者)。

而且 JetBrains 系的 IDE 支持远程调用 WSL 中的 Node 和 npm。 VSCode 就更不用说了。

安装 NVM

# 安装 NVM
# 更新 NVM 也使用相同命令
wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
# 退出登录
exit

安装时会添加环境变量,我们也不跑命令了,直接开个新的 WSL 窗口,保证新的环境变量已生效。

安装 NodeJS

# Ubuntu 默认有 python3 但出于兼容性没有关联 python 命令……
alias python=python3

# 从淘宝 node 源安装最新 LTS 版 NodeJS
# 更新 NodeJS LTS 也使用相同命令
NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mirrors/node nvm install --lts

# 配置 NPM 镜像(可省略,现在官方也挺快)
# 用淘宝源会无法使用 npm search 功能
npm config set registry https://registry.npm.taobao.org/

# 全局更新 npm
npm update -g

WSL Go 开发环境配置

gvm 就行,别整 homebrew。

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

# 直接开个新终端

# 列出当前可用版本
gvm listall

# 选一个当前最新版本,这里以 1.14 为例
gvm install go1.14.4 --prefer-binary
gvm use go1.14.4 [--default]

结语

WSL 有个好处,可以快速复现一个自己习惯的环境。 用着不爽?搞崩了?懒得一个一个更新?直接重做就是。

也正如此,不建议把 WSL 整得太复杂,最好有一份自己的脚本/文档(比如参考本文),便于随时能重新部署一个全新、干净的环境。

什么?你还想安装 MySQL?别闹,用 Docker