搭建基于WSL的开发环境

本文已过时

本文撰写于 2022 年 7 月 8 日,它已经过时。我当前 (2023-07-17) 的开发环境已经和本文中大为不同:

  • 不再使用 socks5 代理而是使用 TUN,这样就不需要对 WSL 进行额外的配置
  • Docker 现在有更好的安装方案,安装一个 Docker 就可以同时在 Windows 和 WSL 上使用,且可以使用开发容器

建议未来的读者在准备 WSL 开发环境时参考微软 WSL 文档的 Tutorials 部分。

更换硬盘并重装了电脑之后,我计划将所有开发环境都放在 Windows Subsystem for Linux (WSL) 上,以避免在 Windows 上遇到依赖地狱。这篇文章介绍了我对基于 WSL 的开发环境的搭建过程。

准备工作

在开始之前,建议安装以下两个软件:

  • VSCode:必须
  • Windows Terminal:强烈建议,可以极大地提高终端使用体验。可以在 Microsoft Store 下载

安装 WSL 和基本设置

您必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。

安装 WSL 非常简单,只需要在管理员权限下打开 PowerShell 或命令提示符(cmd)运行:

1
wsl --install

默认安装的是 Ubuntu。

然后重启电脑,在 PowerShell 或命令提示符(cmd)下运行命令 wsl 即可进入子系统,第一次进入需要进行初始化(比如设置密码)

下面的设置都在 WSL 的 Shell 内进行。建议先安装 ZSH

代理

如果你在 Windows 上设置有代理,你可以设置 WSL 使用 Windows 的代理。一个难点是获取 Windows 的 IP,因为每次重启时 WSL 所在的子网会变化。我们可以通过 WSL 的 DNS 服务器(自动设置)IP 来获取。

下面是一段脚本,设置了各类关于代理的环境变量和 APT 的代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
set_proxy(){
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export PROXY_SERVER="$host_ip:7890"

export ALL_PROXY="http://$PROXY_SERVER"
export HTTP_PROXY="http://$PROXY_SERVER"
export HTTPS_PROXY="http://$PROXY_SERVER"
export FTP_PROXY="http://$PROXY_SERVER"

export all_proxy="http://$PROXY_SERVER"
export http_proxy="http://$PROXY_SERVER"
export https_proxy="http://$PROXY_SERVER"
export ftp_proxy="http://$PROXY_SERVER"

# apt proxy setting
APT_FILE='/home/cmj/scripts/apt-proxy.conf'
echo "# This file is auto generated by ~/scripts/proxy.sh" > $APT_FILE
echo "Acquire::http::proxy \"http://$PROXY_SERVER/\";" >> $APT_FILE
echo "Acquire::https::proxy \"http://$PROXY_SERVER/\";" >> $APT_FILE

echo "Proxy server set to $PROXY_SERVER"
}

unset_proxy(){
unset ALL_PROXY
unset HTTP_PROXY
unset HTTPS_PROXY
unset FTP_PROXY

unset all_proxy
unset http_proxy
unset https_proxy
unset ftp_proxy

echo '' > ~/scripts/apt-proxy.conf

unset PROXY_SERVER

echo "Proxy unset."
}

你需要在你的 Shell 配置文件(如 ~/.zshrc)中 source 该脚本并执行 set_proxy

注意事项

  1. 由于 APT 配置文件是 root 持有的,我认为在 Shell 配置文件中运行 sudo 并不好,因此我在 ~/scripts/ 下新建了文件 apt-proxy.conf 并将 APT 配置文件软链接到它(sudo ln -s ~/scripts/apt-proxy.conf /etc/apt/apt.conf.d/proxy.conf)。
  2. 第 16 行使用了绝对路径,这是因为在 Shell 初始化时 ~ 可能还不能被正确解析。你需要更改为自己的文件位置。
  3. 第 3 行的 7890 是我的端口,你需要更改为自己的端口。

更新和安装软件包

安装的镜像中的很多软件可能已经有更新了,需要先进行更新。

此外镜像中没有 pipgdb ,建议先安装。

1
2
$ sudo apt update && sudo apt upgrade
$ sudo apt-get install pip gdb

生成 SSH 密钥和 GPG 密钥

这一步可以参考 GitHub 文档:

在使用 GPG 签名前,你需要 export GPG_TTY=$(tty) 。建议把它写进 Shell 配置文件。

Git 初始化

首先设置名字和邮箱:

1
2
$ git config --global user.name "Your name"
$ git config --global user.email "Your email"

然后你需要告诉 Git 在提交时自动使用你的 GPG 密钥进行签名:

1
2
$ git config --global user.signingkey <KeyID>
$ git config --global commit.gpgsign true

KeyID 是通过 gpg --list-secret-keys --keyid-format=long 获得的。

安装 Docker 环境

我很喜欢在 Docker 中运行和开发程序,这样可以以比较低的成本实现环境的隔离。

安装 Docker:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

将当前用户加入 docker 组以获取权限:

1
$ sudo usermod -aG docker $USER

由于 WSL 与 Linux 有一些不同,你可能需要运行下面的命令来启动 Docker Engine:

1
$ sudo service docker start

你可以把这个命令写入 Shell 配置文件以避免在每次重启后的重复工作:

1
wsl.exe -u root -e sh -c "service docker status || service docker start"

这个命令利用了 WSL 中的用户可以运行 Windows 上的程序。这其实暴露了 WSL 的一个非常危险的现实:通过运行 wsl.exe ,WSL 的用户可以轻松地绕过 Linux 的权限机制以任何用户的身份执行命令。微软可能认为恶意软件即使获取了 WSL 的最高权限也干不了什么(大不了重装 WSL),但是如果你认为 WSL 对你比较重要,你可以在 WSL 配置文件中关闭这一功能

一种替代方案是将这条命令作为 Windows 启动时的命令

如果你是 Win11 用户,你可以使用另一种方式实现 Docker 的开机启动:wsl.conf 中设置在 WSL 启动时运行的命令

Docker 的安装到这里就完成了,可以试试看我们是否成功:

1
$ docker run hello-world

一些推荐的开发工具

最后推荐一些可以提升开发体验的工具:

  • Snipaste:可以方便地进行截图并将截图悬浮在屏幕上,分免费版和付费版,免费版完全够用。可以在 Microsoft Store 下载。
  • Typora:Markdown 编辑器,本文发表时 89 元永久激活,可以在 3 台机器上使用。
  • Fiddler Classic:网络抓包工具,免费。
  • draw.io:开源且免费的画图软件。
  • PicGo:快速上传图片并获取图片 URL 链接。开源免费,写博客用。
  • Obsidian:免费笔记软件,所有数据都以 Markdown 格式存储在本地。
  • MongoDB Compass:MongoDB 的 GUI,免费。
  • httping:测试 HTTP 请求的延迟。在 WSL 中通过 APT 安装即可。
  • SwitchHosts:方便地查看、修改、切换 Hosts 文件。开源免费。
  • sysinternals:微软的免费软件,用于管理、排查和诊断Windows系统和应用程序。
  • NetSpeedMonitor:在任务栏上显示当前网络速度。免费但不开源。

如果安装了 Typora,你还可以在右键新建菜单中加入 Markdown File 选项 ,只需将下面的文本存入一个 .reg 文件并双击运行即可(需要根据你的 Typora 安装位置调整第七行的图标路径)

1
2
3
4
5
6
7
8
9
10
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.md]
@="Typora.md"
"Content Type"="text/markdown"
"PerceivedType"="text"
"Icon"="C:\\Users\\CMJ\\AppData\\Local\\Programs\\Typora\\resources\\assets\\file.ico"

[HKEY_CLASSES_ROOT\.md\ShellNew]
"NullFile"=""

Windows 11 下的额外注册表更改

在 Windows 11 下,你可能需要额外的注册表更改来使得选项出现在右键菜单中。你需要在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew 下找到 Classes, 并在其中加入 .md, 如图所示:

References

  1. WSL 安装
  2. 设置 APT 代理
  3. 在 Ubuntu 上安装 Docker
  4. 以非 root 用户运行 Docker
  5. 在 WSL 中启动 Docker
  6. WSL 配置文件
作者

Cao Mingjun

发布于

2022-07-08

更新于

2024-10-15

许可协议

评论