WSL中的远程开发

  • 前言
  • VSCode安装Remote-WSL扩展
  • 安装wsl
  • 安装Ubuntu子系统
  • 在WSL中运行vsocde
  • 结束WSL连接
  • 更改wsl安装位置
  • 总结


前言

一开始我的电脑之前安装过wsl和Ubuntu18.04子系统,在vscode上没弄成功,今天痛下决心重新尝试,关于vscode与wsl这里先放上原理框架图

WireMock如何运行_linux

VSCode安装Remote-WSL扩展

Remote - WSL 扩展使你能够在 Windows 子系统 Linux (WSL) 中运行 Visual Studio Code

WireMock如何运行_vscode_02


安装 Remote - WSL 扩展后,您将在最左侧看到一个新的状态栏项目

WireMock如何运行_vscode_03


远程状态栏项目可以快速显示 VS Code 正在运行的上下文(本地或远程),单击该项目将显示远程 - WSL 命令。

WireMock如何运行_WireMock如何运行_04

安装wsl

在 Windows 搜索栏中,键入“功能”以打开“打开和关闭 Windows 功能”对话框。向下滚动并检查适用于 Linux 的 Windows 子系统。

WireMock如何运行_linux_05


由于我之前安装过一次,这里不再安装。但是在cmd中运行wsl找不到指定路径,于是使用

wsl.exe --list --all

命令查看,这是我之前已经安装过wsl和Ubuntu子系统,但是在vscode中还是无法使用,接下来准备重新卸载子系统重装

使用

wls.exe --unregister Ubuntu-18.04

命令卸载ubuntu18.04,如下图

WireMock如何运行_linux_06


重新运行wsl

WireMock如何运行_Ubuntu_07

安装Ubuntu子系统

然后在Windows11(我的电脑跟更新到了11)自带的Microsoft Store里下载安装Ubuntu18.04后打开报错,如图二(非本主机,网图)

WireMock如何运行_Ubuntu_08


(图片来自网络,自己的忘记截屏)

WireMock如何运行_Windows_09


不报错时应该如下图

WireMock如何运行_Ubuntu_10


造成该问题的原因是WSL版本由原来的WSL1升级到WSL2后,内核没有升级,前往微软WSL官网下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更新包即可。

适用于 x64 计算机的 WSL2 Linux 内核更新包

WireMock如何运行_linux_11


下载运行后又报错,如下

WireMock如何运行_WireMock如何运行_12


原因如下

WireMock如何运行_WireMock如何运行_13


我们需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。

以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell”> 单击右键 >“以管理员身份运行”),然后输入以下命令

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

WireMock如何运行_linux_14


然后启用虚拟机功能

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

WireMock如何运行_Ubuntu_15


重新启动计算机,以完成 WSL 安装并更新到 WSL 2,重启后再打开Ubuntu18.04即可正常运行

WireMock如何运行_WireMock如何运行_16


打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:

wsl --set-default-version 2

注意在PowerShell里运行

WireMock如何运行_Ubuntu_17


关于其他报错

可以参考:排查适用于 Linux 的 Windows 子系统问题 安装步骤可以参考:旧版 WSL 的手动安装步骤

这时再次在cmd执行wsl

WireMock如何运行_Windows_18


到此安装结束

在WSL中运行vsocde

在 WSL 终端中,新建helloWorld文件夹,然后输入命令

code .

以启动 Visual Studio Code。该’.'参数告诉 VS Code 打开当前文件夹(如果此命令不起作用,您可能需要重新启动终端,或者您在安装时可能没有将 VS Code 添加到您的路径中。)

WireMock如何运行_linux_19


您将看到的第一件事是关于“安装 VS Code 服务器”的消息(c7d83e57… 数字是与您刚刚安装的客户端工具匹配的 VS Code 服务器版本)。VS Code 正在 Linux 端安装一个小型服务器,然后桌面 VS Code 将与之对话。然后,该服务器将在 WSL 中安装和托管扩展,以便它们在 WSL 中安装的工具和框架的上下文中运行。换句话说,您的语言扩展将针对 WSL 中安装的工具和框架运行,而不是针对 Windows 端安装的工具和框架,因为它应该为正确的开发体验。接下来发生的是 VS Code 将启动并打开helloWorld文件夹。您可能会看到一条快速通知,告诉您 VS Code 正在连接到 WSL,并且可能会提示您允许访问基于 Node.js 的服务器。

WireMock如何运行_vscode_20


连接完成后,在状态栏的左下角,可以看到已连接到WSL: Ubuntu

WireMock如何运行_Ubuntu_21


在目录下新建main.c测试文件

WireMock如何运行_Windows_22


现在当我将鼠标悬停在文件main.c上时,将获得正确的 Linux 路径。

WireMock如何运行_Ubuntu_23


此时打开终端配置文件settings.json,发现系统自动帮我们添加了一行。此时默认终端为Ubuntu18.04子系统的bash

WireMock如何运行_linux_24


但是如果我还想使用wsl中的其他终端,我们可以修改settings.json文件,可以参考:配置VScode终端首先在wsl中查看bash的路径

WireMock如何运行_WireMock如何运行_25


修改settings.json文件,如下,保存后会发现箭头所指向的bash已经按照我们修改的变换图标和颜色

WireMock如何运行_Windows_26


修改后的文件代码

{
    "KeilAssistant.MDK.Uv4Path": "E:\\keil\\??\\UV4\\UV4.exe",
    "C_Cpp.updateChannel": "Insiders",
    "files.autoGuessEncoding": true,
    "http.proxySupport": "off",
    "workbench.iconTheme": "material-icon-theme",
    "cmake.configureOnOpen": true,
    "workbench.editorAssociations": {
        "*.ipynb": "jupyter-notebook"
    },
    "notebook.cellToolbarLocation": {
        "default": "right",
        "jupyter-notebook": "left"
    },
    //"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\cmd.exe",
    //"terminal.integrated.defaultProfile.windows": "Command Prompt",
    //"terminal.integrated.defaultProfile.windows": "PowerShell",

        "terminal.integrated.profiles.windows": {
            "PowerShell": {
              "source": "PowerShell",
              //"path": "C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
              "color": "terminal.ansiBlue"
            },

            "gitBash": {
                "path": "E:\\Git\\Git\\bin\\bash.exe",
                "color": "terminal.ansiYellow"
            },

            "cmd": {
                "path": "C:\\WINDOWS\\System32\\cmd.exe",
                "color": "terminal.ansiRed",
                "icon": "account",
                //"workbench.action.terminal.changeColor":"terminal.ansiYellow"
            }
          },

        "terminal.integrated.profiles.linux": {
            "Ubuntu-bash": {
                "path": "/bin/bash",
                "color": "terminal.ansiGreen",
                "icon": "thumbsup",
                //"workbench.action.terminal.changeColor":"terminal.ansiYellow"
            }  
          },

        "terminal.integrated.defaultProfile.windows": "PowerShell",
        "terminal.integrated.tabs.location": "right",
        "terminal.integrated.defaultProfile.linux": "Ubuntu-bash"
        
}

如果要在 WSL 中打开另一个文件夹,请打开“文件”菜单并选择“打开文件夹”。您将获得适用于 Linux 文件系统而非 Windows 文件系统的最小文件和文件夹导航器。

WireMock如何运行_vscode_27


如果您想切换回 Windows,请选择Show Local选项,您将获得标准的 Windows File Open 对话框

结束WSL连接

可以在 WSL 中结束会话,然后使用File > Close Remote Connection返回到本地运行 VS Code

更改wsl安装位置

因为wsl默认是安装在C盘下,我这里目录为

C:\Users\xuyuan\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState

WireMock如何运行_vscode_28


如果想更换wsl的安装目录,首先需要下载一个工具:LxRunOffline,下载路径为:LxRunOffline下载链接,下载文件LxRunOffline-vxxxx.zip 然后解压到某个一个目录中,之后我们需要设置环境变量,使用这个东西去移动我们的子系统,所以不可以删除这个东西,注意不要下源代码,下载编译过后发布的

WireMock如何运行_linux_29


WireMock如何运行_linux_30


下载后右击”此电脑“->属性->高级系统设置,在高级面板中选择环境变量。选择系统变量中的Path变量,点击编辑按钮。点击新建,并把刚刚LxRunOffline的解压地址粘贴到新的项目中。切记这个目录里必须包含LxRunOffline.exe文件

WireMock如何运行_WireMock如何运行_31


然后重启电脑,打开命令行工具,输入LxRunOffline,如果显示下面的提示证明已经安装成功

WireMock如何运行_WireMock如何运行_32


打开命令行,输入LxRunOffline list 查看我们的子系统版本,我安装的是ubuntu18.04,例如显示这样的界面

WireMock如何运行_Ubuntu_33


记下我们的版本号,然后输入LxRunOffline move -n {version} -d {dir}。在这里{version}填写我们刚才查到的版本号,{dir}改为我们需要移动到的目录,例如我要把Ubuntu-18.04移动到我新建的文件夹E:\wsl\WinLinux下,那么我需要输入

LxRunOffline move -n Ubuntu-18.04 -d E:\wsl\WinLinux

执行完报错,普通用户管理员都不行

WireMock如何运行_Ubuntu_34


于是我不得不去下载另一版本,按照前面一样,设置环境变量,重启电脑还是不行

WireMock如何运行_WireMock如何运行_35


查了半天发现wsl本身就有备份还原的功能,这里我们使用到export 、unregister和import几个选项就可以实现迁移

1、终止正在运行的分发或虚拟机

wsl --shutdown

2、对需要迁移的分发或虚拟机导出(我安装的版本是Ubuntu-18.04)

wsl --export Ubuntu-18.04 E:\wsl\wsl-Ubuntu-18.04

3、卸载分发版或虚拟机(如果是要重装系统或换机器安装,这一步可以省略,但是要将上一步导出的文件保存好)

wsl --unregister Ubuntu-18.04

4、导入新的分发版或虚拟机,最后的选项“–version 2”可以省略,则采用默认版本导入。如果导出的是WSL2,而这里设置的是“–version 1”,还可以将其版本降为WSL1

wsl --import Ubuntu-18.04 E:\wsl\WinLinux E:\wsl\wsl-Ubuntu-18.04 --version 2

这样就实现了子系统的迁移 ,注意文件存放的路径一定不能错

WireMock如何运行_linux_36


迁移后如下图

WireMock如何运行_vscode_37


WireMock如何运行_Ubuntu_38


此时再去之前默认C盘安装目录下查看已经为空

WireMock如何运行_WireMock如何运行_39

总结

注意:VM的版本低于VMware Workstation 15.5.5,在使用WSL2后,将无法继续使用虚拟机

WireMock如何运行_WireMock如何运行_40


WireMock如何运行_Windows_41


若想继续使用虚拟机,需要禁用 Hyper-V,禁用后将不能再使用WSL2

WireMock如何运行_linux_42