修正 wsl2 IP不固定的问题

一、修改win10的hosts文件权限

  1. 打开C:\Windows\System32\drivers\etc文件夹找到hosts文件,右键选择属性,找到安全选项卡
  2. 点击编辑找到当前用户组,为其添加完全控制权限;

image.png
image.png

  1. 点击确定,在弹出的提示框中选择是;
  2. 此时当前用户应该可以直接修改 hosts 文件了。

解决方案:

在编写脚本之前做两件事:

  • 更换 wsl 默认的 dashbash
  • 安装 net-tools 用于获取内部 ip
  1. 更换 dash

    1. sudo dpkg-reconfigure dash
  2. 安装 net-tools

    1. sudo apt install net-tools

解决脚本:

  1. #!/usr/bin/bash
  2. # 为 win 设置 wsl host
  3. # win hosts 文件路径
  4. win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
  5. # 为 wsl2 设置的域名
  6. wsl_name="ubuntu.test"
  7. # 获取 wsl 的 ip
  8. wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
  9. # 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加
  10. wsl_host=$(cat ${win_hosts_path} | grep -wn ${wsl_name})
  11. if [ -n "${wsl_host}" ]
  12. then
  13. # 找到 wsl2 域名所在的行
  14. wsl_host_line=$(echo ${wsl_host} | awk -F: 'NR==1{print $1}')
  15. # 此处因为权限问题没有直接用 sed 修改 hosts 文件
  16. win_hosts=$(cat ${win_hosts_path} | sed "${wsl_host_line}c ${wsl_ip} ${wsl_name}")
  17. #将修改后的文件cat下来,保留格式覆盖原文件
  18. echo "${win_hosts}" > ${win_hosts_path}
  19. else
  20. echo "${wsl_ip} ${wsl_name}" >> ${win_hosts_path}
  21. fi
  22. # 以下代码可以会造成: sudo: unable to resolve host ubuntu: Name or service not known 的错误
  23. # 为 wsl 设置 win host
  24. wsl_hosts_path="/etc/hosts"
  25. win_name="win"
  26. win_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -d " " -f 2)
  27. win_host=$(cat ${wsl_hosts_path} | grep -wn ${win_name})
  28. if [ -n "${win_host}" ]
  29. then
  30. win_host_line=$(echo ${win_host} | awk -F: 'NR==1{print $1}')
  31. wsl_hosts=$(cat ${wsl_hosts_path} | sed "${win_host_line}c ${win_ip} ${win_name}")
  32. echo "${wsl_hosts}" > ${wsl_hosts_path}
  33. else
  34. echo "${win_ip} ${win_name}" >> ${wsl_hosts_path}
  35. fi

/etc/init.d 目录创建用于映射 wsl 的脚本,并复制以上代码,保存为以任意域名为开头的 .sh 文件

wsl_name 值必须和 nginx 配置的域名相同

最后创建一个main.sh用于执行并管理所有的自启动脚本,所有脚本放在同一目录:

示例代码:

  1. #!/bin/bash
  2. #自启动服务
  3. service nginx start
  4. service php8.0-fpm start
  5. service mysql start
  6. #需要执行的子脚本
  7. source /etc/init.d/ubuntu.sh
  8. source /etc/init.d/laravel.sh

给所以自定义的 .sh 文件赋予权限

  1. sudo chmod +x ./main.sh

也可以通过:sudo ./main.sh执行脚本

让它随win10启动

  • 快捷键WIN+R打开运行窗口
  • 输入shell:startup
  • 在这个目录下新建linux-start.vbs
  • 内容如下:
    1. Set ws = WScript.CreateObject("WScript.Shell")
    2. ws.run "wsl -d Ubuntu-20.04 -u root /etc/init.d/main.sh"