Skip to main content

WSL 使用技巧

切换至 root 用户身份

前置条件:root 用户组有个管理员叫 admin。

有很多操作都要 root 用户身份才可以做, 然而我们不能在 WSL 中直接通过 su 切换到 root 身份,原因未排查。

admin@AMD-PC:~$ su root
Password:
su: Authentication failure

解决方法是重设一次 admin 的密码:

admin@AMD-PC:~$ sudo passwd
New password:
Retype new password:
passwd: password updated successfully

更换密码再次执行 su 可正常切换成 root 用户:

admin@AMD-PC:~$ su root
Password:
root@AMD-PC:/root#

解决 DNS 网络问题

最典型的例子是,同一句 curl https://nodejs.org,在 win 下能正常访问,但 WSL2 Ubuntu 里面却是无响应。

方法一(推荐)

最方便的是直接用新的镜像模式网络,所有网络行为都跟 windows 里面一致。

创建 .wslconfig 配置:

[wsl2]
networkingMode=mirrored

详见 https://learn.microsoft.com/zh-cn/windows/wsl/networking#mirrored-mode-networking

方法二

  1. 在 WSL 里面找到 Windows 主机的 IP 地址 ip route show | grep -i default | awk '{ print $3}'
  2. /etc/resolv.confnameserver 改成上一步所找到的 Windows 主机的 IP 地址

注意,以后每次启动 Ubuntu 子系统时都要重新配一次,因为每次分配的 win 主机 ip 都是不同的。

查看当前 WSL 安装的 Ubuntu 版本

wslfetch

开了 VPN 后自动端口转发会失效

前置条件:

  • expressvpn

就算在 expressvpn 中设置了允许 Local Network 也无法在主机中通过 http://localhost:prot/ 访问到 wsl 内的应用。原因未明。

解决方式:

  • 关 vpn。
  • 重新启动应用,例如 npm start 等等。

WSL 主机端口转发

Windows 主机端口转发,让局域网访内的设备访问我们主机时,转发到 WSL 内进行处理,方便预览和调试。

WSL 官方文档有讲如何操作: https://docs.microsoft.com/zh-cn/windows/wsl/networking#accessing-a-wsl-2-distribution-from-your-local-area-network-lan

以原样转发 5173 Vite 默认端口为示例:

  1. Vite 要监听 0.0.0.0 端口:

    vite.config.js
    export default defineConfig({
    server: {
    host: '0.0.0.0'
    }
    })
    npm run dev
  2. 配置 Windows 本机端口转发:

    netsh interface portproxy add v4tov4 listenport=5173 listenaddress=0.0.0.0 connectport=5173 connectaddress=localhost
    PS C:\Windows\system32> netsh interface portproxy show all

    侦听 ipv4: 连接到 ipv4:

    地址 端口 地址 端口
    --------------- ---------- --------------- ----------
    0.0.0.0 5173 localhost 5173
  3. 配防火墙:

    这时候在本机的浏览器输入本机的局域网 IP 加端口号已经能正常访问了,但局域网内其他机器无法访问,这是另外一个知识点:被防火墙阻隔了。

    解决方式是:Windows 安全中心 > 防火墙和网络保护 > 高级设置 > 添加入站规则

若配好后依然没有效果

可以按如下步骤重试一次:

  1. ctrl + c 停掉运行中的开发服务 (npm run dev)
  2. 删除端口转发:netsh interface portproxy delete v4tov4 listenport=5173 listenaddress=0.0.0.0
  3. 重开 npm run dev
  4. 重新 netsh interface portproxy add v4tov4 listenport=5173 listenaddress=0.0.0.0 connectport=5173 connectaddress=localhost

总结就是保证先启动本地开发服务,再配置端口转发,顺序不能错,错了要重来。