一、背景
1. 简介
微软的WSL(Windows Subsystem for Linux)是近几年我觉得对开发者最友好的功能之一,已经有了WSL1和WSL2两个不同的版本
WSL1:
用模拟Linux内核API的方式实现一个Linux环境
优点:和Windows宿主系统之间之间网络共享更加无缝,包括共享端口,共享文件系统等
缺点:底层内核并不是原生Linux内核,所以在一些更底层的开发上有区别,并且可能无法随着Linux内核更新而更新
WSL2:
使用Windows自己的Hyper-V虚拟技术虚拟化了一个Linux环境,类似于使用VirtualBox等虚拟机
优点:原生Linux,完全和Linux一致
缺点:和宿主机天然隔离,通过网络访问相互文件,跨文件系统的IO低
2. 个人选择
个人偏向使用WSL2,更加原生的Linux,并且利用虚拟机天然的隔离机制,把开发和娱乐环境分离,互不干扰
3. 现阶段问题
WSL2现阶段使用最大的一个问题是每次重启电脑,会分配新的IP,因为默认使用的是Hyper-V的NAT模式,请求会通过Hyper-V的交换机,由宿主系统转发出去。
因为这个IP会变,想访问WSL2中的服务,就需要每次关注IP的变化,之前是通过github上一个小工具,在每次WSL2启动时,获取WSL2的IP,向Windows宿主机的hosts写入一个域名。但是不够方便,而且随着版本Windows的版本更新,时不时会出现bug。
二、解决方案
通过网上查阅资料,发现可以通过给Hyper-V增加一个交换机让WSL2使用,走桥接模式,设置一个固定的IP,这样就能满足自己的需要了。
原理就相当于,对家里的路由器来说,把WSL2变成和宿主机Windows一个级别的设备,不再走NAT模式。
1. 在Windows宿主机增加Hyper-V交换机
系统: Windows 11 Pro
打开Hyper-V管理器,选择右侧的虚拟交换机管理器,新建虚拟网络交换机,选择外部网络。添加完成如下图:
2. 在Windows宿主机上增加WSL的config
在当前用户目录(C:\Users\xxx)下增加.wslconfig,内容:
1 | [wsl2] |
3. 在WSL2中增加网络相关的配置
系统: Debian
修改下WSL2下/etc/wsl.conf
,修改内容:
1 | # wsl bridged |
4. 在WSL2中设置静态IP
修改WSL2下的/etc/network/interfaces
,修改内容:
1 | # The primary network interface |
5. 重新启动WSL2
在powershell中输入:
1 | wsl --shutdown |
再次打开WSL2,使用ip addr
命令查看IP地址:
1 | 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 |
已经成功设置完成。
三、方案不足
设置的IP和网络环境相关,如果更换一个网络环境,例如,从家里到公司,就需要重新配置了。
所以,这个方案更适合台式机这种不怎么移动的场景。