修正 wsl2
IP不固定的问题
一、修改win10的hosts文件权限
- 打开C:\Windows\System32\drivers\etc文件夹找到hosts文件,右键选择属性,找到安全选项卡
- 点击编辑找到当前用户组,为其添加完全控制权限;
- 点击确定,在弹出的提示框中选择是;
- 此时当前用户应该可以直接修改 hosts 文件了。
解决方案:
在编写脚本之前做两件事:
- 更换
wsl
默认的dash
为bash
- 安装
net-tools
用于获取内部ip
更换 dash
sudo dpkg-reconfigure dash
安装 net-tools
sudo apt install net-tools
解决脚本:
#!/usr/bin/bash
# 为 win 设置 wsl host
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
wsl_name="ubuntu.test"
# 获取 wsl 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
# 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加
wsl_host=$(cat ${win_hosts_path} | grep -wn ${wsl_name})
if [ -n "${wsl_host}" ]
then
# 找到 wsl2 域名所在的行
wsl_host_line=$(echo ${wsl_host} | awk -F: 'NR==1{print $1}')
# 此处因为权限问题没有直接用 sed 修改 hosts 文件
win_hosts=$(cat ${win_hosts_path} | sed "${wsl_host_line}c ${wsl_ip} ${wsl_name}")
#将修改后的文件cat下来,保留格式覆盖原文件
echo "${win_hosts}" > ${win_hosts_path}
else
echo "${wsl_ip} ${wsl_name}" >> ${win_hosts_path}
fi
# 以下代码可以会造成: sudo: unable to resolve host ubuntu: Name or service not known 的错误
# 为 wsl 设置 win host
wsl_hosts_path="/etc/hosts"
win_name="win"
win_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -d " " -f 2)
win_host=$(cat ${wsl_hosts_path} | grep -wn ${win_name})
if [ -n "${win_host}" ]
then
win_host_line=$(echo ${win_host} | awk -F: 'NR==1{print $1}')
wsl_hosts=$(cat ${wsl_hosts_path} | sed "${win_host_line}c ${win_ip} ${win_name}")
echo "${wsl_hosts}" > ${wsl_hosts_path}
else
echo "${win_ip} ${win_name}" >> ${wsl_hosts_path}
fi
在 /etc/init.d
目录创建用于映射 wsl
的脚本,并复制以上代码,保存为以任意域名为开头的 .sh
文件
wsl_name
值必须和 nginx
配置的域名相同
最后创建一个main.sh
用于执行并管理所有的自启动脚本,所有脚本放在同一目录:
示例代码:
#!/bin/bash
#自启动服务
service nginx start
service php8.0-fpm start
service mysql start
#需要执行的子脚本
source /etc/init.d/ubuntu.sh
source /etc/init.d/laravel.sh
给所以自定义的 .sh
文件赋予权限
sudo chmod +x ./main.sh
也可以通过:sudo ./main.sh
执行脚本
让它随win10启动
- 快捷键WIN+R打开运行窗口
- 输入
shell:startup
- 在这个目录下新建
linux-start.vbs
- 内容如下:
Set ws = WScript.CreateObject("WScript.Shell")
ws.run "wsl -d Ubuntu-20.04 -u root /etc/init.d/main.sh"