由于网络问题无法在 WSL 上安装 nvm

Unable to install nvm on WSL due to network issues

我正在尝试在 WSL2 上使用 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 安装 nvm,但出现了不同的错误。最初,curl 命令会 return 以下内容:

> $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash                                        
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:09 --:--:--     0curl: (6) Could not resolve host: raw.githubusercontent.com

在 Windows 中的 运行 netsh int ip reset 之后,在 another question 中建议,相同的命令开始计时:

> $ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash                                        
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:04:59 --:--:--     0
curl: (28) Connection timed out after 300000 milliseconds

我也试过手动将 install.sh 保存到我的机器上,然后 运行 在本地保存(在使用 chmod +x install.sh 设置其权限后),但是 return 是一个类似错误:

> $ ./install.sh                                                                                                           
=> Downloading nvm from git to '/home/mparra/.nvm'
=> Cloning into '/home/mparra/.nvm'...
fatal: unable to access 'https://github.com/nvm-sh/nvm.git/': Failed to connect to github.com port 443: Connection timed out
Failed to clone nvm repo. Please report this!

我可以成功 ping github.com。 ping -c 100 github.com return 如下:

--- github.com ping statistics ---
100 packets transmitted, 100 received, 0% packet loss, time 99156ms
rtt min/avg/max/mdev = 15.280/20.739/85.205/9.141 ms

This issue 建议 Windows 更新解决了这个问题,但这对我来说不是一个选择,因为它是一台工作机器,我无法更新到 build 18363.2039 之后。我还检查了我的 VPN 是否未启用,并将我的 DNS 设置为 8.8.8.88.8.4.4,但没有任何效果。

我觉得你可能是对的,这与 Github 中提到的问题相同,已在 Windows 更新中得到解决。

如果情况确实如此,即使在安装 nvm 之后,您也可能会继续 运行 解决问题。例如,nvm 可能会在下载 Node 版本时遇到问题。

我可以提出的最简单的解决方案(如果适合您的话)就是简单地转换为 WSL1 而不是 WSL2。 WSL1 将处理大多数(但不是全部)节点 use-cases,就像 WSL2 一样。 WSL1 处理网络的方式与 WSL2 非常不同。如果 Windows 网络堆栈适合您,那么 WSL1 也应该如此。

如 Github 问题所述,这似乎是仅在 Hyper-V 实例中发生的问题。 WSL2 运行s 在 Hyper-V,但 WSL1 没有。

如果你走这条路,你可以:

  • 创建现有 WSL2 发行版的副本并将该副本转换为 WSL1。来自 PowerShell:

    wsl --shutdown
    wsl -l -v # Confirm <distroname>
    wsl --export <distroname> path\to\backup.tar
    mkdir .\path\for\new\instance
    wsl --import WSL1 .\path\for\new\instance path\to\backup.tar --version 1 # WSL1 can be whatever name you choose
    wsl -d WSL1
    

    请注意,默认情况下您将成为 root 用户。要更改默认用户,请遵循 this answer.

  • 或者,只需将 WSL2 实例转换为 WSL1:

    wsl --shutdown
    wsl -l -v # Confirm <distroname>
    wsl --export <distroname> path\to\backup.tar # Just in case
    wsl --set-version <distroname> 1
    

如果 WSL1 不适合您(至少在您的公司推送该更新之前的短期内),那么可能还有另一个选项类似于 in this comment 在 [=46= 上提到的选项] 问题。如果您需要走那条路,请告诉我,我会看看我是否可以简单一点。