V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
探索世界的好奇心万岁
BeautifulSoap
V2EX  ›  分享发现

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

  •  1
     
  •   BeautifulSoap · 323 天前 · 7592 次点击
    这是一个创建于 323 天前的主题,其中的信息可能已经有所发展或是发生改变。

    泪流满面,每次重启电脑就会给 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

    第 1 条附言  ·  231 天前
    补充一下:
    上面第一行命令中的 ip 192.168.50.16 是分配给 wsl2 的固定 ip

    第二行的 ip 192.168.50.88 是分配给宿主机的固定 ip,用来在 wsl2 中访问宿主机,这样不光 wsl2 有固定 ip,连从 wsl2 中访问宿主机也都用固定 ip 了

    如果没有 wsl2 访问宿主机的需要的话,第二行命令可以不用
    第 2 条附言  ·  225 天前
    不好意思,搞错了一点,第二行命令也是必须的,没有第二行命令给宿主机分配一个 ip 的话,宿主机就无法在指定的 ip 段与 wsl2 交互
    21 条回复    2021-04-30 18:05:59 +08:00
    chnyuwen
        1
    chnyuwen  
       323 天前
    我都不关机,没这个问题....
    这里有个项目关于 wsl2 自动更新 host 的项目 https://github.com/shayne/go-wsl2-host
    chnyuwen
        2
    chnyuwen  
       323 天前
    我一直用 localhost 访问的 wsl2 下开放的端口,想了解使用固定 ip 的原因是什么?
    我很久以前只遇到过一次 idea 用 localhost 连接 wsl2 docker 下的 mysql 连接失败的问题,改成 wsl2 的 ip 就好了
    BeautifulSoap
        3
    BeautifulSoap  
    OP
       323 天前
    @chnyuwen 就随便举个例子,我想把 wsl2 中的文件,通过 samba 共享给我的局域网,或者贡献给同一台电脑中另外的虚拟机,没有固定 ip 的话根本做不到
    baobao1270
        4
    baobao1270  
       323 天前
    个人感觉这个方法十分 Dirty,因此放弃了 WSL2 转回了 WSL1+需要时用 VM……

    搞不懂为啥每次重启 vEthernet (WSL) 和 vEthernet (Default) 都会重置……
    BeautifulSoap
        5
    BeautifulSoap  
    OP
       323 天前 via Android
    @baobao1270 可能微软不希望 wsl2 的 ip 过于固定,导致影响到同类业务的市场吧,只能这么想了。因为怎么想固定 ip 都不是个技术问题

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

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


    你谈到的配置 frp 和 wsl2 自带的流量转发从功能上讲是一模一样的,对于需要固定 ip 的人来说依旧是没有解决根本问题
    forbxy
        8
    forbxy  
       322 天前
    最近用虚拟机完全替代了 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
        9
    BeautifulSoap  
    OP
       322 天前
    @forbxy wsl 不太清楚(似乎需要把整个系统打包成 tar ),但是 wsl2 迁移的话倒是真的简单,直接把 vhdx 文件复制到别的电脑里改下设置就行了(和虚拟机的迁移一样)

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

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

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

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

    2. 同一个物理局域网中的其他电脑的话,需要简单设置下路由表(因为你 wsl2 的独立 ip 其他电脑是不可能知道这 ip 是拿来干嘛的)把 wsl2 的 ip 路由到你运行 wsl2 的宿主机上。或者觉得麻烦,可以在路由器里设置下路由规则,这样所有接入局域网的设备都能访问到你的 wsl2 了
    smallthing
        21
    smallthing  
       217 天前
    其实微软完全可以做一个 GUI,喜欢现有设定的选 default,希望固定 ip 的自己定一个.
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1065 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    ♥ Do have faith in what you're doing.