前言

这几年Windows下的开发体验已经慢慢超过macOS了,自己的开发环境也是一直变动:

  • macOS+Iterm2+Xcode:iOS开发,每天的主要时间都是在Xcode中
  • macOS+Iterm2+VSCode+Linux虚拟机+树莓派:Golang项目开发,Go插件在macOS下的运行bug多多,折腾一段时间后还是开虚拟机用Linux
  • Windows+Cmder+VSCode+Linux虚拟机:还是Golang项目开发,需要经常用到串口工具,交叉编译,另外Go插件在Windows下的bug更多,但恰逢VSCode的Remote插件发布,后来都是远程到Linux虚拟机上写代码

现在日常依旧是Golang项目开发,但工具换成了 WSL+Windows Terminal+VSCode+Linux物理机

  • WSL和Windows Terminal提供了接近Iterm2的使用习惯
  • Linux物理机上用libvirtd、VLAN和VXLAN模拟机房网络环境,如果需要干净的OS环境,直接用镜像起一个虚拟机接入已有网络
  • Linux物理机带双网口,一个接入公司内网,一个外接交换机,Windows电脑连交换机接入网络
  • Linux物理机内网网口配置了网桥,让交换机上的设备和虚拟机处于一个网段,利用NAT提供外网访问

这个月底公司电脑将会迎来一波升级,这里记录下Windows办公机上的WSL需要做的一些配置。

WSL文档

WSL正式文档:Windows Subsystem for Linux Documentation

WSL与WSL2

WSL一代是通过实现系统调用来兼容Linux,只需要在控制面板启用Linux子系统,不影响原有的VMM。

WSL二代使用虚拟机平台和定制的内核来提供完整的Linux,虚拟机平台是hyper-v功能的一个子集,使用hyper-v的用户可以不需要关心,但其他VMM软件的用户还是会受到一定程度影响。

WSL二代除了文件系统共享使用9p导致性能有一定缺失外,其他各项均优于WSL一代,未使用其他VMM的情况下,推荐WSL2。

WSL2需要安装微软提供的定制内核:WSL2 Linux kernel update package for x64 machines

版本设置

wsl.exe命令可用于管理Linux子系统,最常用的还是两条命令:

列出所有子系统及WSL版本

1
2
3
4
➜  ~ wsl.exe -l -v
  NAME            STATE           VERSION
* Debian          Running         2
  Ubuntu-20.04    Stopped         2

转换WSL版本

1
wsl.exe --set-version Ubuntu-20.04 2

其他命令说明参见帮助文档。

系统选择

Windows应用商店中的Ubuntu、Debian、Kali Linux和SUSE Linux都是对应的官方账号发布的免费应用,寻求稳定的话还是使用Debian,该应用版本为Debian 10 Buster。

Debian 10镜像源

阿里开源镜像站已经提供了Debian 10源,但文档上没有说明。

将/etc/apt/soource.list备份后直接替换为以下内容即可使用。

1
2
3
4
5
6
7
8
deb https://mirrors.aliyun.com/debian/ buster main non-free contrib
#deb-src https://mirrors.aliyun.com/debian/ buster main non-free contrib
deb https://mirrors.aliyun.com/debian-security buster/updates main
#deb-src https://mirrors.aliyun.com/debian-security buster/updates main
deb https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
#deb-src https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
deb https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
#deb-src https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib

镜像源同时支持http和https,使用https可以规避一些运营商劫持导致的问题。

Debian 10必备软件

1
apt install git zsh vim htop netcat-openbsd telnet net-tools curl screen build-essential libvirt-dev

代理设置

启用WSL2时,Windows会自动创建一个内网供子系统使用,且该子网重启后会发生变动,因此代理程序最好运行在宿主机上,监听所有地址。

假设宿主机上运行的http代理程序监听 0.0.0.0:8118 端口:

1
2
3
4
5
6
# proxy
export no_proxy=".aliyun.com,.aliyuncs.com"
PROXYHOST='http://$(ip route|sed -n 1p|awk '{print $3}'):8118'
alias proxyenable="export http_proxy=$PROXYHOST https_proxy=$PROXYHOST"
alias proxydisable="unset http_proxy https_proxy"
proxyenable

在.bashrc或.zshrc中添加上述命令,通过默认路由地址设置代理服务器地址,默认启用代理,并忽略no_proxy环境变量中指定的域名或IP。

oh-my-zsh与vimrc

解决了软件安装和代理设置后,这时可以使用oh-my-zsh和vimrc的一键安装命令了

1
2
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime && sh ~/.vim_runtime/install_awesome_vimrc.sh

ssh配置

编辑.ssh/config文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# ssh心跳设置

HOST *
ServerAliveInterval 60
ServerAliveCountMax 5

# 使用自定义Host代替IP或域名

Host jump1
HostName 10.40.1.2
Port 22
User faker

# 解决跳板机登录问题

Host official
HostName 10.99.3.2
Port 22
User root
IdentityFile ~/.ssh/id_rsa_official
ProxyCommand nc -x 127.0.0.1:2080 %h %p

一般公司环境下都有跳板机,每次登录需要密码验证,假设上述的jump1为跳板机,可以先使用ssh搭建隧道,再通过netcat转发流量实现登录,如下

1
2
3
4
# 在一个窗口中执行命令,登录跳板机
ssh -D 2080 jump1
# 新开一个窗口,通过跳板机登录其他机器
ssh official

也可以为root用户配置.ssh/config文件设置跳板机,然后使用执行 screen ssh -D 2080 jump1,让ssh隧道常驻后台运行。

虚拟化

虽然WSL提供了相对方便的开发体验,但应用商店提供的Linux系统发行版数量有限,遇到需要特定OS编译动态链接一些依赖时,还是需要使用虚拟机。

WSL钉子户可以直接使用hyper-v,如果需要测试较多的系统,可以在hyper-v或其他VMM中启用嵌套虚拟化,许多OS厂家都提供了预安装配置好的qcow2镜像文件,相比直接使用hyper-v或其他VMM更方便。

当然,也可以申请或自带一台Linux物理机,性能和稳定性会更好一些。

Windows Terminal

Windows Terminal无需配置即可使用,可以修改设置,配置默认使用Debian子系统和Solarized Dark主题。

VSCode

安装 Remote - WSL 插件即可使用WSL,未设置代理时,VSCode会自动读取远程系统的环境变量,WSL配置好代理后,可以自动使用代理下载插件及相关程序。