终于找到给 wsl2 分配固定 ip 的方法

2021-01-14 16:35:10 +08:00
 BeautifulSoap

泪流满面,每次重启电脑就会给 wsl2 分配一个随机的 ip 段,这导致了非常多问题

然后搜过之后,大部分方法全是清一色编辑 win10 的 hosts 文件自定义个域名(如 wsl.net 之类的),然后每次重启后更新这个域名的 ip 。但问题是我需要的固定 ip,而不是 DDNS,这类解决方法对于解决问题于事无补

这几天重翻 wsl 的 issue,终于找到了梦寐以求的解决办法。cmd/powershell 管理员权限执行这两行命令( ip 和 wsl 发行版名称根据自己的实际情况做出更改):

wsl -d Ubuntu -u root ip addr add 192.168.50.16/24 broadcast 192.168.50.255 dev eth0 label eth0:1

netsh interface ip add address "vEthernet (WSL)" 192.168.50.88 255.255.255.0

唯一不足是重启后会失效,所以把这两行命令保存为 bat 文件加入系统自启项,每次重启后让它自动设置就行了。这样你的 wsl2 终于有了个固定 ip 。泪流满面

出处: https://github.com/microsoft/WSL/issues/4210#issuecomment-648570493

18324 次点击
所在节点    分享发现
27 条回复
interim
2021-01-14 16:43:44 +08:00
我都不关机,没这个问题....
这里有个项目关于 wsl2 自动更新 host 的项目 https://github.com/shayne/go-wsl2-host
interim
2021-01-14 16:46:29 +08:00
我一直用 localhost 访问的 wsl2 下开放的端口,想了解使用固定 ip 的原因是什么?
我很久以前只遇到过一次 idea 用 localhost 连接 wsl2 docker 下的 mysql 连接失败的问题,改成 wsl2 的 ip 就好了
BeautifulSoap
2021-01-14 16:55:31 +08:00
@chnyuwen 就随便举个例子,我想把 wsl2 中的文件,通过 samba 共享给我的局域网,或者贡献给同一台电脑中另外的虚拟机,没有固定 ip 的话根本做不到
baobao1270
2021-01-14 18:01:35 +08:00
个人感觉这个方法十分 Dirty,因此放弃了 WSL2 转回了 WSL1+需要时用 VM……

搞不懂为啥每次重启 vEthernet (WSL) 和 vEthernet (Default) 都会重置……
BeautifulSoap
2021-01-14 18:41:29 +08:00
@baobao1270 可能微软不希望 wsl2 的 ip 过于固定,导致影响到同类业务的市场吧,只能这么想了。因为怎么想固定 ip 都不是个技术问题

至于 dirty 不 dirty,wsl 无法运行 docker,想跑 wsl backend 的 docker 也只能用 wsl2 了
Jisxu
2021-01-14 22:31:53 +08:00
有一个比较曲折的方法:
windows 端,用 nssm 将 frps 注册为服务并随开机启动
wsl 端,安装并启动 frpc,注册到 frps 上,然后 frpc 开机启动,我用的 archwsl,支持 stystemd,直接 enable 即可
这样一搞,无论 wsl 的 ip 怎么变,都和我无关,唯一需要固定是应该就是 windows 端网卡的 ip 了
BeautifulSoap
2021-01-15 00:40:21 +08:00
@Jisxu 额,不知道你有没有用过 wsl2,你说的这功能 wsl2 早就已经自带了,而且还根本不用配置 frp

win10 端想要访问 wsl2 的端口的话,直接通过 localhost:xxx 就能访问到 wsl2 中对应的 xxx 端口,会自动进行转发。
局域网的话则可以通过 win10 局域网 ip:xxx 的方式访问到 wsl2 中的端口。


你谈到的配置 frp 和 wsl2 自带的流量转发从功能上讲是一模一样的,对于需要固定 ip 的人来说依旧是没有解决根本问题
forbxy
2021-01-15 11:32:10 +08:00
最近用虚拟机完全替代了 wsl 了,主要是 systemd 用习惯了,还有子系统想迁移到另外一台机器太麻烦了
0 、虚拟机从路由器分配固定 ip
1 、windows terminal 新增一个 tab,内容为 ssh.exe 远程登录虚拟机
2 、虚拟机挂载所有磁盘到 /mnt/hgfs/{c,d,e,f}
3 、RaiDrive 将虚拟机磁盘映射为 windows 网络磁盘 I
4 、windows 上 pycharm 打开网络磁盘上的项目,设置虚拟机的 python 解释器。设置 deployment 文件映射,关闭自动上传

丝滑体验
BeautifulSoap
2021-01-15 11:43:31 +08:00
@forbxy wsl 不太清楚(似乎需要把整个系统打包成 tar ),但是 wsl2 迁移的话倒是真的简单,直接把 vhdx 文件复制到别的电脑里改下设置就行了(和虚拟机的迁移一样)

以前我也是跑完整的 linux 虚拟机的,但是 wsl2 backend 的 docker 体验太好了,之后就直接全迁移到 wsl2 了
baobao1270
2021-01-15 13:34:48 +08:00
@BeautifulSoap 算半个技术问题,因为 Hyper-V 的交换机是在系统启动后才初始化的,为了防止 IP 冲突就得每次自动随机出一个 IP 来。但是手动创建的虚拟交换机不受影响
BeautifulSoap
2021-01-15 13:46:47 +08:00
@baobao1270 这不是技术问题,wsl2 初始化的时候随机一个未使用 ip 段确保不出现冲突然后不变就行了。为了不出现 ip 冲突就每次重启都删了 wsl 的虚拟交换机然后重新创建实在太因噎废食了
fengwn
2021-01-24 17:55:03 +08:00
都用了 192.168 私有网段,那还不如上虚拟机或者直接用 Docker for window(虽然挺操蛋的).一劳永逸的话,直接 Linux 平台走起.
BeautifulSoap
2021-01-24 19:38:43 +08:00
@fengwn 都说了根据自己情况更改配置,不想用 192.168 那就用其他 ip 段,没人限制你用其他 ip 段

我就是为了更好体验地使用 Docker for windows 才从虚拟机迁移到 wsl2 的,你竟然说干嘛不用回虚拟机或用 Docker for Windows

至于直接用 Linux,明显就是一逸永劳
petshop
2021-01-25 19:43:17 +08:00
请问如何讲 bat 设置开机启动 我吧 bat 放到了 \Start Menu\Programs\Startup 文件夹下但好像不会自己运行 还有自动启动的脚本要如何设置管理员运行
EdwinHui
2021-02-26 23:54:58 +08:00
@forbxy 请问你这样做的话,开发用的文件是放在宿主机上,虚拟机通过 /mnt 访问,还是直接放在虚拟机内部?
xiecanmy
2021-03-12 10:33:12 +08:00
@petshop 计划任务, 记得设置为最高权限
bearboss
2021-04-16 14:58:26 +08:00
里面的 ip 之类的得根据现有的 ip 替换吗 比如现有的是 172 开头的 子网段也不一样
BeautifulSoap
2021-04-16 15:12:12 +08:00
@bearboss 有点没理解,如果是想固定 ip 的话,两行命令中的 ip 只要和现有 ip 段之类的冲突,是可以随意设置的
bearboss
2021-04-16 16:30:13 +08:00
@BeautifulSoap 这样设置后局域网内其他电脑用这个 ip 能远程访问到 wsl 吗 如果不设置成同个网段的话 计网不好请见谅
BeautifulSoap
2021-04-16 19:27:37 +08:00
@bearboss 只要这个 ip 的流量被转发到运行 wsl2 的宿主机就能访问到 wsl2

这时候分两种情况:
1. 同一台电脑上的多个局域网(比如不同虚拟机),一般不需要特别设置就能直接访问到(因为虚拟机一般都默认把宿主机设置为网络的网关,如果没有设置的话设置下网关就行了)

2. 同一个物理局域网中的其他电脑的话,需要简单设置下路由表(因为你 wsl2 的独立 ip 其他电脑是不可能知道这 ip 是拿来干嘛的)把 wsl2 的 ip 路由到你运行 wsl2 的宿主机上。或者觉得麻烦,可以在路由器里设置下路由规则,这样所有接入局域网的设备都能访问到你的 wsl2 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/744955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX