本文撰写于 2022 年 7 月 8 日,它已经过时。我当前 (2023-07-17) 的开发环境已经和本文中大为不同:
- 不再使用 socks5 代理而是使用 TUN,这样就不需要对 WSL 进行额外的配置
- Docker 现在有更好的安装方案,安装一个 Docker 就可以同时在 Windows 和 WSL 上使用,且可以使用开发容器
建议未来的读者在准备 WSL 开发环境时参考微软 WSL 文档的 Tutorials 部分。
在更换硬盘并重装了电脑之后,我计划将所有开发环境都放在 Windows Subsystem for Linux (WSL) 上,以避免在 Windows 上遇到依赖地狱。这篇文章介绍了我对基于 WSL 的开发环境的搭建过程。
准备工作
在开始之前,建议安装以下两个软件:
安装 WSL 和基本设置
您必须运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。
安装 WSL 非常简单,只需要在管理员权限下打开 PowerShell 或命令提示符(cmd)运行:
默认安装的是 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_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
注意事项
- 由于 APT 配置文件是
root
持有的,我认为在 Shell 配置文件中运行 sudo
并不好,因此我在 ~/scripts/
下新建了文件 apt-proxy.conf
并将 APT 配置文件软链接到它(sudo ln -s ~/scripts/apt-proxy.conf /etc/apt/apt.conf.d/proxy.conf
)。
- 第 16 行使用了绝对路径,这是因为在 Shell 初始化时
~
可能还不能被正确解析。你需要更改为自己的文件位置。
- 第 3 行的
7890
是我的端口,你需要更改为自己的端口。
更新和安装软件包
安装的镜像中的很多软件可能已经有更新了,需要先进行更新。
此外镜像中没有 pip
和 gdb
,建议先安装。
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
|
一些推荐的开发工具
最后推荐一些可以提升开发体验的工具:
如果安装了 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 下,你可能需要额外的注册表更改来使得选项出现在右键菜单中。你需要在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\ShellNew
下找到 Classes
, 并在其中加入 .md
, 如图所示:
References
- WSL 安装
- 设置 APT 代理
- 在 Ubuntu 上安装 Docker
- 以非 root 用户运行 Docker
- 在 WSL 中启动 Docker
- WSL 配置文件