解决 Win10 Wsl2 IP 变化问题(2021.2.10)

Win10 Wsl2 的 IP 地址每次重启后都会变化,如果经常需要在 Win10 访问 Wsl2 内的服务的话会比较麻烦,因此笔者寻找一种解决方案并在此记录。

1. 产生环境

  • WSL2;
  • Ubuntu 20.04 focal(on the Windows Subsystem for Linux);

2. 问题描述

Win10 WSL2 每次重启后 IP 都会发生变化,经常在 Win10 和 WSL2 之间访问网络的话比较麻烦。

3. 解决思路

方法一:固定 IP 地址,每次重启后保持 IP 地址不变;

方法二:每次重启后更新 hosts 文件,通过域名来互相访问;

经过调研,方法一实现起来比较复杂且不优雅,因此笔者选择了采用方法二;目前网络上方法二大多数是通过 go-wsl2-host 项目来实现的,其原理是在 Win10 中添加服务自动更新 hosts 文件,但因为笔者对 Win10 服务的编写不太了解,所以受其启发想到了另一种实现方法:编写 Shell 脚本在 Wsl2 启动时自动更新 Win10 和 Wsl2 的 hosts 文件。

4. 实现过程

4.1 准备工作

由于在 Wsl2 中没有权限操作 Win10 的 hosts 文件,所以我们需要先解决该问题。

方法一:以管理员身份启动 Wsl2;

方法二:为当前 Win10 用户添加修改 hosts 文件的权限;

因为笔者打算将 Shell 脚本设置成随 Wsl2 启动自动执行,方法一每次以管理员身份启动不方便也不安全,所以笔者选择了方法二。

  1. 打开C:WindowsSystem32driversetc文件夹找到hosts文件,右键选择属性,找到安全选项卡;

  2. 点击编辑找到当前用户组,为其添加完全控制权限;

  3. 点击确定,在弹出的提示框中选择

  4. 此时当前用户应该可以直接修改 hosts 文件了。

4.2 编写脚本

笔者对于 Shell 脚本并不是很了解,因此脚本还有待优化,如果你有更好的方法也欢迎评论留言。

#!/usr/bin/bash
# 为 win 设置 wsl host
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
wsl_domain="ubuntu"
# 获取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
# 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加
if grep -wq "$wsl_domain" $win_hosts_path
then
    # 此处因为权限问题没有直接用 sed 修改 hosts 文件
    win_hosts=$(sed -s "s/.* $wsl_domain/$wsl_ip $wsl_domain/g" $win_hosts_path)
    echo "$win_hosts" > $win_hosts_path
else
    echo "$wsl_ip $wsl_domain" >> $win_hosts_path
fi

# 为 wsl 设置 win host
wsl_hosts_path="/etc/hosts"
win_domain="win"
win_ip=$(cat /etc/resolv.conf | grep "nameserver" | awk '{print $2}')
if grep -wq "$win_domain" $wsl_hosts_path
then
    wsl_hosts=$(sed -s "s/.* $win_domain/$win_ip $win_domain/g" $wsl_hosts_path)
    echo $wsl_hosts > $wsl_hosts_path
else
    echo "$win_ip $win_domain" >> $wsl_hosts_path
fi

4.3 设置自启

Linux 下设置脚本自启的方式有很多,此处不再详细赘述,笔者选择的是将脚本内容添加到 Shell 的配置文件中(较为简单)。

4.4 测试域名

重启 Wsl2 后域名应该就可以使用了,此处我们利用 Python 起一个简单的 http 服务进行测试。

  1. 在 Wsl2 中启动服务;

    $ python -m http.server 8888
    Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:8888/) ...
    
  2. 在 Win10 下访问ubuntu:8888

同理我们在 Win10 下启用服务,在 Wsl2 内也可以通过win:port进行访问(port表示服务端口)。

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/xiaoQQya/p/16305264.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!