WSL中的远程开发
- 前言
- VSCode安装Remote-WSL扩展
- 安装wsl
- 安装Ubuntu子系统
- 在WSL中运行vsocde
- 结束WSL连接
- 更改wsl安装位置
- 总结
前言
一开始我的电脑之前安装过wsl和Ubuntu18.04子系统,在vscode上没弄成功,今天痛下决心重新尝试,关于vscode与wsl这里先放上原理框架图
VSCode安装Remote-WSL扩展
Remote - WSL 扩展使你能够在 Windows 子系统 Linux (WSL) 中运行 Visual Studio Code
安装 Remote - WSL 扩展后,您将在最左侧看到一个新的状态栏项目
远程状态栏项目可以快速显示 VS Code 正在运行的上下文(本地或远程),单击该项目将显示远程 - WSL 命令。
安装wsl
在 Windows 搜索栏中,键入“功能”以打开“打开和关闭 Windows 功能”对话框。向下滚动并检查适用于 Linux 的 Windows 子系统。
由于我之前安装过一次,这里不再安装。但是在cmd中运行wsl找不到指定路径,于是使用
wsl.exe --list --all
命令查看,这是我之前已经安装过wsl和Ubuntu子系统,但是在vscode中还是无法使用,接下来准备重新卸载子系统重装
使用
wls.exe --unregister Ubuntu-18.04
命令卸载ubuntu18.04,如下图
重新运行wsl
安装Ubuntu子系统
然后在Windows11(我的电脑跟更新到了11)自带的Microsoft Store里下载安装Ubuntu18.04后打开报错,如图二(非本主机,网图)
(图片来自网络,自己的忘记截屏)
不报错时应该如下图
造成该问题的原因是WSL版本由原来的WSL1升级到WSL2后,内核没有升级,前往微软WSL官网下载安装适用于 x64 计算机的最新 WSL2 Linux 内核更新包即可。
下载运行后又报错,如下
原因如下
我们需要先启用“适用于 Linux 的 Windows 子系统”可选功能,然后才能在 Windows 上安装 Linux 分发。
以管理员身份打开 PowerShell(“开始”菜单 >“PowerShell”> 单击右键 >“以管理员身份运行”),然后输入以下命令
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
然后启用虚拟机功能
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新启动计算机,以完成 WSL 安装并更新到 WSL 2,重启后再打开Ubuntu18.04即可正常运行
打开 PowerShell,然后在安装新的 Linux 发行版时运行以下命令,将 WSL 2 设置为默认版本:
wsl --set-default-version 2
注意在PowerShell里运行
关于其他报错
可以参考:排查适用于 Linux 的 Windows 子系统问题 安装步骤可以参考:旧版 WSL 的手动安装步骤
这时再次在cmd执行wsl
到此安装结束
在WSL中运行vsocde
在 WSL 终端中,新建helloWorld文件夹,然后输入命令
code .
以启动 Visual Studio Code。该’.'参数告诉 VS Code 打开当前文件夹(如果此命令不起作用,您可能需要重新启动终端,或者您在安装时可能没有将 VS Code 添加到您的路径中。)
您将看到的第一件事是关于“安装 VS Code 服务器”的消息(c7d83e57… 数字是与您刚刚安装的客户端工具匹配的 VS Code 服务器版本)。VS Code 正在 Linux 端安装一个小型服务器,然后桌面 VS Code 将与之对话。然后,该服务器将在 WSL 中安装和托管扩展,以便它们在 WSL 中安装的工具和框架的上下文中运行。换句话说,您的语言扩展将针对 WSL 中安装的工具和框架运行,而不是针对 Windows 端安装的工具和框架,因为它应该为正确的开发体验。接下来发生的是 VS Code 将启动并打开helloWorld文件夹。您可能会看到一条快速通知,告诉您 VS Code 正在连接到 WSL,并且可能会提示您允许访问基于 Node.js 的服务器。
连接完成后,在状态栏的左下角,可以看到已连接到WSL: Ubuntu
在目录下新建main.c测试文件
现在当我将鼠标悬停在文件main.c上时,将获得正确的 Linux 路径。
此时打开终端配置文件settings.json,发现系统自动帮我们添加了一行。此时默认终端为Ubuntu18.04子系统的bash
但是如果我还想使用wsl中的其他终端,我们可以修改settings.json文件,可以参考:配置VScode终端首先在wsl中查看bash的路径
修改settings.json文件,如下,保存后会发现箭头所指向的bash已经按照我们修改的变换图标和颜色
修改后的文件代码
{
"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 文件系统的最小文件和文件夹导航器。
如果您想切换回 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
如果想更换wsl的安装目录,首先需要下载一个工具:LxRunOffline,下载路径为:LxRunOffline下载链接,下载文件LxRunOffline-vxxxx.zip 然后解压到某个一个目录中,之后我们需要设置环境变量,使用这个东西去移动我们的子系统,所以不可以删除这个东西,注意不要下源代码,下载编译过后发布的
下载后右击”此电脑“->属性->高级系统设置,在高级面板中选择环境变量。选择系统变量中的Path变量,点击编辑按钮。点击新建,并把刚刚LxRunOffline的解压地址粘贴到新的项目中。切记这个目录里必须包含LxRunOffline.exe文件
然后重启电脑,打开命令行工具,输入LxRunOffline,如果显示下面的提示证明已经安装成功
打开命令行,输入LxRunOffline list 查看我们的子系统版本,我安装的是ubuntu18.04,例如显示这样的界面
记下我们的版本号,然后输入LxRunOffline move -n {version} -d {dir}。在这里{version}填写我们刚才查到的版本号,{dir}改为我们需要移动到的目录,例如我要把Ubuntu-18.04移动到我新建的文件夹E:\wsl\WinLinux下,那么我需要输入
LxRunOffline move -n Ubuntu-18.04 -d E:\wsl\WinLinux
执行完报错,普通用户管理员都不行
于是我不得不去下载另一版本,按照前面一样,设置环境变量,重启电脑还是不行
查了半天发现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
这样就实现了子系统的迁移 ,注意文件存放的路径一定不能错
迁移后如下图
此时再去之前默认C盘安装目录下查看已经为空
总结
注意:VM的版本低于VMware Workstation 15.5.5,在使用WSL2后,将无法继续使用虚拟机
若想继续使用虚拟机,需要禁用 Hyper-V,禁用后将不能再使用WSL2