V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  Windows

昨天因为临时需要,使用了 WSL2,发现这玩意很奇怪,现在使用 WSL2 的最佳实践有么?

  •  
  •   yazoox · 2023-07-21 09:04:49 +08:00 · 3663 次点击
    这是一个创建于 516 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天因为临时需要 linux 环境,使用了 WSL2 。第一次使用,感觉怪怪的。

    系统是 win11 enterprise 22h2, AMD 5945 128G 显卡亮机卡 4G
    wsl 我没动过,安装好系统后就没玩过这个。昨天打开使用,版本就是这个
    WSL version: 1.2.5.0
    Kernel version: 5.15.90.1

    项目是前端

    windows terminal 里面安装了一个 ubuntu 就跑起来了。

    碰到的问题,

    • 访问不了 github (或者说 google.com),因为要安装 nvm ,等等。google 搜索了一下,说设置 reslv.conf ,nameserver 8.8.8.8 。但是设置了这个,公司内部的 git 就访问不了。结果,我来回改这个 reslv.conf 文件,折腾死我了...... 这台公司的电脑(我是 microsoft remote desktop 上去的),是有 proxy 的,可以仅设置到浏览器,也能够设置到系统里,就是不知道怎么共享给 wsl 里面的系统。比如 wsl 直接使用 host's network?
    • 在 v2 搜索了 wsl2 ,看到有兄弟说可以设置网络,但是没有看到详细的解释。似乎要安装 hyper-v 。需要到 windows features turn on/off 里面,把 hyper-v management tool 安装上去么?我也希望能够把开发环境放到 sub linux 里面,然后外面通过 vscode 连接
    • 我使用 wsl --shutdown ,关闭了子系统。下次 开 terminal -> new tab 选择 ubuntu ,几秒钟就打开了,这个子系统这么快的么?看到兄弟们说其实就是 hyper-v 的虚拟机系统?另外,terminal 界面好丑,theme 里面可选也很少.
    • 看到有坛子里有兄弟说,可以 sub linux 里再使用 docker, 然后把开发环境安装到 docker 里面。这么绕来绕去,性能不得下降很多?以后还可以直接把这个 sub linux 的文件拷贝带走?这个是怎么回事?咋操作?\

    或者,现在 wsl2 使用,大家有什么最佳实践的建议么?

    p.s.公司的机器,杀毒软件和防火墙是必须打开的。

    clorischan
        1
    clorischan  
       2023-07-21 09:30:15 +08:00   ❤️ 1
    不要把 WSL2 当成虚拟机用,(虽然底层确实是基于 Hyper-V, 但是微软做了很多处理的)
    简单的说, 就是你这台电脑如果不是 Windows, 而是直接装的 Linux 的情况下
    你应该怎么设置代理, WSL2 里面就怎么设置
    mrpzx001
        2
    mrpzx001  
       2023-07-21 09:34:01 +08:00   ❤️ 1
    https://github.com/he426100/vscode-remote-containers
    解决你有关 wsl 的一切问题,包括你说的代理
    xwh
        3
    xwh  
       2023-07-21 09:44:06 +08:00
    [root@localhost ~]# export http_proxy=http://172.19.48.1:7890
    [root@localhost ~]# export https_proxy=http://172.19.48.1:7890
    [root@localhost ~]# curl google.com
    <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
    <TITLE>301 Moved</TITLE></HEAD><BODY>
    <H1>301 Moved</H1>
    The document has moved
    <A HREF="http://www.google.com/">here</A>.
    </BODY></HTML>



    DigitalG
        4
    DigitalG  
       2023-07-21 10:06:38 +08:00
    你自己内网的主机网关 nameserver 那些东西怎么配置的,可以一样设置 wsl 看看。

    终端可以考虑别的好看的 ssh 终端。

    wsl 可以导出导入 vhdx 文件 来转移(但不跨文件系统来用,很多数据放 wsl 的话,越来越大会不方便操作)。
    pangxiang
        5
    pangxiang  
       2023-07-21 10:09:13 +08:00
    在~/.bashrc 里添加 export http_proxy=http://主机 IP:代理端口
    villivateur
        6
    villivateur  
       2023-07-21 10:26:11 +08:00
    关于 terminal 界面,这个界面不是你选什么终端工具就是什么样子吗?可以自己装个好看的终端然后跑 wsl
    nirvam
        7
    nirvam  
       2023-07-21 10:50:18 +08:00
    WSL 有个比较讨厌的问题,是它的虚拟网卡的网段会变,导致无法通过固定的 IP 访问 Windows 宿主机。需要每次都 ip route 看一下,再改环境变量。

    我采用的方案:
    https://github.com/mike-barber/wsl-subnet-utility

    Windows 中设置一个在系统启动时触发的计划任务,执行这个工具,把 WSL 的虚拟网关设置为 192.168.100.1 ,这样 WSL 里就可以固定代理地址:
    export http_proxy=http://192.168.100.1:xxxx
    export https_proxy=$http_proxy

    记得 Windows 上的代理工具里,允许局域网内的访问。

    另一个方案是通过读取 WSL 自动生成的 resolv.conf ,获取宿主机 IP
    wdssmq
        8
    wdssmq  
       2023-07-21 10:52:45 +08:00
    HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
    export http_proxy="socks5://${HOST_IP}:10808"
    export https_proxy="socks5://${HOST_IP}:10808"

    # Git
    HOST_IP=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
    git config --global http.proxy "socks5://${HOST_IP}:10808"
    git config --global https.proxy "socks5://${HOST_IP}:10808"
    canbingzt
        9
    canbingzt  
       2023-07-21 15:15:57 +08:00
    ```bash
    hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
    port=7890
    PROXY_HTTP="http://${hostip}:${port}"

    export http_proxy="${PROXY_HTTP}"
    export https_proxy="${PROXY_HTTP}"

    git config --global http.proxy "${PROXY_HTTP}"
    git config --global https.proxy "${PROXY_HTTP}"
    ```

    取消的话
    ```bash
    unset http_proxy
    unset https_proxy

    git config --global --unset http.proxy
    git config --global --unset https.proxy
    ```

    同时需要在宿主机添加防火墙规则
    ```powershell
    Remove-NetFirewallRule -DisplayName "WSL"
    New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2840 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:50 · PVG 22:50 · LAX 06:50 · JFK 09:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.