由于在 Wsl2 中没有权限操作 Win10 的 hosts 文件,所以我们需要先解决该问题。
打开C:\Windows\System32\drivers\etc
文件夹找到hosts
文件,
右键->属性->安全->编辑->组或用户名中选中Users->完全控制打钩->应用->确定
权限开启后,我们就可以修改hosts
文件了。
cmd
命令行下,设置默认root登录,ubuntu+tab键就会出来ubuntuxxx.exe
ubuntuxxx.exe config --default-user root
cmd
中输入bash
进入 wsl
,进入用户目录 cd ~
,编辑init.sh
文件 vim init.sh
。
#/bin/bash
echo "开启wsl及其相关启动项:bt、nginx、mysqld、redis、memcached、php、ftp、docker"
echo "bt 启动:"
/etc/init.d/bt start
echo "nginx 启动:"
/etc/init.d/nginx start
echo "mysqld 启动:"
/etc/init.d/mysqld start
echo "redis 启动:"
/etc/init.d/redis start
echo "memcached 启动:"
/etc/init.d/memcached start
echo "php 启动:"
/etc/init.d/php-fpm-72 start
echo "ftp 启动:"
/etc/init.d/pure-ftpd start
echo "docker 启动:"
service docker start
echo "启动完成!"
echo ""
# 为 win 设置 wsl host
echo "为 win 设置 wsl host"
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
echo "为 wsl2 设置的域名:dev.wsl.net"
wsl_domain="dev.wsl.net"
# 获取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
echo "wsl2的ip:$wsl_ip"
# 判断是否已存在 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="dev.win.net"
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
给权限
chmod +x init.sh
执行
sh init.sh
wsl
的 ip
ip addr | grep eth0
或者 ip addr
查看 ip
wsl
访问主机的服务在wsl
里面执行如下命令:
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
win
下的host
进行绑定域名,例如:# host 文件添加
192.168.0.104 dev.host.net
ln -s 源文件 目标文件
# 移除软连接
rm -rf 目标文件
我们把wsl
中的/www/wwwroot
目录印射到本地的d/wwwroot
,在wsl
中,/mnt/d/wwwroot
指的是本地d
盘下的wwwroot
,
建立连接之前先把目标文件(/www/wwwroot)的wwwroot文件删除,要不就会在他里面创建,
ln -s /mnt/d/wwwroot /www/wwwroot
https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=65196&highlight=wsl
其实就是一键启动的步骤,给win
的 host
文件权限,然后设置域名,init.sh
文件的简版wsl.sh
:
#!/bin/bash
# 为 win 设置 wsl host
echo "为 win 设置 wsl host"
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
echo "为 wsl2 设置的域名:dev.wsl.net"
wsl_domain="dev.wsl.net"
# 获取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
echo "wsl2的ip:$wsl_ip"
# 判断是否已存在 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="dev.win.net"
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
当然,如果是像php项目,需要在host文件做域名和ip的绑定,当wsl系统的ip变化时,我们可以把常用的域名绑定的ip一一替换,可以在上面脚本的基础上做个升级:
wsl.sh文件
#!/bin/bash
# 为 win 设置 wsl host
echo "为 win 设置 wsl host"
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
echo "为 wsl2 设置的域名:dev.wsl.net"
wsl_domain="dev.wsl.net"
# 获取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
echo "wsl2的ip:$wsl_ip"
# 判断是否已存在 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
#-----------------
# 需要替换的数组域名
domainArr=(dev.host.net dev.guo.net xm.guo.net bs.guo.net xm.yougou.net bs.yougou.net api.yougou.net dev.blog.net)
# 循环
for domain in ${domainArr[@]};
do
# 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加
if grep -wq "$domain" $win_hosts_path
then
# 此处因为权限问题没有直接用 sed 修改 hosts 文件
win_hosts=$(sed -s "s/.* $domain/$wsl_ip $domain/g" $win_hosts_path)
echo "$win_hosts" > $win_hosts_path
else
echo "$wsl_ip $domain" >> $win_hosts_path
fi
done
#-----------------
# 为 wsl 设置 win host
wsl_hosts_path="/etc/hosts"
win_domain="dev.win.net"
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
宝塔 mysql 外网 root 无法连接
在wsl子系统中,使用以下命令,获取wsl的ip
ip addr | grep eth0
在windows中,用管理员方式打开powershell,输入命令,这里我的wsl的ip为172.23.186.3,要启动服务的端口为30000,因此命令如下
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=30000 connectaddress=172.23.186.3 connectport=30000
记得在使用的时候,替换 connectaddress 和 listenport、connectport 为你需要的值。
connectaddress:wsl的ip
connectport:wsl的端口
listenport:win端口
找到 nginx.conf
,配置如下:
http {
fastcgi_buffering off;
// 其他代码
}