配置VScode进行远程开发

现在的Ubuntu就是一个精简的系统,里面几乎什么都没有,也没有GUI,用控制台进行后续操作十分麻烦,所以应该趁早用上VScode的远程开发
微软的官方教程非常详细开始通过 WSL 使用 VS Code | Microsoft Learn

  • 直接打开VScode,搜索插件Remote Development
    • 这个插件包包含4个插件,即装即用,十分方便
  • 这时有两种启动服务的方法
    • 一种是在Ubuntu控制台使用命令code .,这将会以当前目录为根目录打开一个VScode工作区
      • 但是这有一个很大的问题就是跨平台网络代理还没实现,大概率卡住且毫无办法
    • 另一种是在VScode的侧边栏或下面找到连接到远程的选项
      • 点击WSL对象,应该就能看到自己安装的Ubuntu,点击连接即可
      • VScode会把sever文件写入Ubuntu中,所以使用的是主机的网络,不会卡
  • 现在就可以使用VScode管理和编写文件了,当然现在还会有诸多权限问题

处理网络问题

Ubuntu的软件包自然都是在国外的,国内只有镜像而已

  • 你可以选择简单地将下载源切换成镜像来完成基本的apt包下载(但也不保证一定不出错)
    只需要依次输入命令
    1
    2
    3
    4
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  # 给旧源做一个备份
    # 通过字符替换切换成中科大的镜像源,也可以去找别的源
    sudo sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
    sudo apt update # 更新状态,让源生效
  • 这样做可以实现大部分apt包的正常下载
  • 但是如果要使用git,浏览器访问外网之类的就毫无办法了

在ICS课程里我就是只换了源,但显然这不是长久之计,所以这次得把网络代理处理好

WSL1 和 WSL2 网络的区别

在 WSL1 时代,由于 Linux 子系统和 Windows 共享了网络端口,所以访问 Windows 的代理非常简单。例如 Windows 的代理客户端监听了 8000 端口,那么只需要在 Linux 子系统中执行如下命令,就可以让当前 session 中的请求通过代理访问互联网。

1
export ALL_PROXY="http://127.0.0.1:8000"

但是 WSL2 基于 Hyper-V 运行,导致 Linux 子系统和 Windows 在网络上是两台各自独立的机器,从 Linux 子系统访问 Windows 首先需要找到 Windows 的 IP。

配置 WSL2 访问 Windows 上的代理

有两个关键步骤:

  1. WSL2 中配置的代理要指向 Windows 的 IP;
  2. Windows 上的代理客户端需要允许来自本地局域网的请求; 由于 Linux 子系统也是通过 Windows 访问网络,所以 Linux 子系统中的网关指向的是 Windows,DNS 服务器指向的也是 Windows,基于这两个特性,我们可以将 Windows 的 IP 读取出来。 例如,在 Ubuntu 子系统中,通过 cat /etc/resolv.conf 查看 DNS 服务器 IP。
1
2
3
4
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.25.144.1

可以看到 DNS 服务器是 172.19.80.1,通过环境变量 ALL_PROXY 配置代理:

1
export ALL_PROXY="http://172.25.144.1:7890"

7890 是 Windows 上运行的代理客户端的端口,记得要在 Windows 代理客户端上配置允许本地局域网请求。

一键配置

在最新版本的WSL和Ubuntu下系统会自动配置代理
将上面的过程写入用户文件夹下的.bashrc文件,就可以轻松的实现在启动bash时一键配置代理:

1
2
3
4
5
# for clash 
hostip=$(cat /etc/resolv.conf |grep -oP '(?%3C=nameserver\ ).*')
export https_proxy="http://${hostip}:7890"
export http_proxy="http://${hostip}:7890"
export all_proxy="socks5://${hostip}:7890"

代码通过 cat /etc/resolv.conf 来获取 DNS 服务器,也就是 Windows 的 IP,再将其中的 IP 部分截取出来,加上代理客户端的端口(我的是 7890,可以根据自己实际情况修改),使用 export 写入环境变量中。

每次启动WSL前都开启代理即可实现对WSL的全局代理(国内网络几乎没有价值)
可以看到使用官方源速率也非常可观
image.png