使用WSL搭建开发环境
文章目录
前言
这几年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➜ ~ wsl.exe -l -v
2 NAME STATE VERSION
3* Debian Running 2
4 Ubuntu-20.04 Stopped 2
转换WSL版本
1wsl.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备份后直接替换为以下内容即可使用。
1deb https://mirrors.aliyun.com/debian/ buster main non-free contrib
2#deb-src https://mirrors.aliyun.com/debian/ buster main non-free contrib
3deb https://mirrors.aliyun.com/debian-security buster/updates main
4#deb-src https://mirrors.aliyun.com/debian-security buster/updates main
5deb https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
6#deb-src https://mirrors.aliyun.com/debian/ buster-updates main non-free contrib
7deb https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
8#deb-src https://mirrors.aliyun.com/debian/ buster-backports main non-free contrib
镜像源同时支持http和https,使用https可以规避一些运营商劫持导致的问题。
Debian 10必备软件
1apt 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# proxy
2export no_proxy=".aliyun.com,.aliyuncs.com"
3PROXYHOST='http://$(ip route|sed -n 1p|awk '{print $3}'):8118'
4alias proxyenable="export http_proxy=$PROXYHOST https_proxy=$PROXYHOST"
5alias proxydisable="unset http_proxy https_proxy"
6proxyenable
在.bashrc或.zshrc中添加上述命令,通过默认路由地址设置代理服务器地址,默认启用代理,并忽略no_proxy环境变量中指定的域名或IP。
oh-my-zsh与vimrc
解决了软件安装和代理设置后,这时可以使用oh-my-zsh和vimrc的一键安装命令了
1sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
2git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime && sh ~/.vim_runtime/install_awesome_vimrc.sh
ssh配置
编辑.ssh/config文件
1# ssh心跳设置
2
3HOST *
4ServerAliveInterval 60
5ServerAliveCountMax 5
6
7# 使用自定义Host代替IP或域名
8
9Host jump1
10HostName 10.40.1.2
11Port 22
12User faker
13
14# 解决跳板机登录问题
15
16Host official
17HostName 10.99.3.2
18Port 22
19User root
20IdentityFile ~/.ssh/id_rsa_official
21ProxyCommand nc -x 127.0.0.1:2080 %h %p
一般公司环境下都有跳板机,每次登录需要密码验证,假设上述的jump1为跳板机,可以先使用ssh搭建隧道,再通过netcat转发流量实现登录,如下
1# 在一个窗口中执行命令,登录跳板机
2ssh -D 2080 jump1
3# 新开一个窗口,通过跳板机登录其他机器
4ssh 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配置好代理后,可以自动使用代理下载插件及相关程序。