缘起
VSCode的Remote Development扩展正式发布也有两个月了。我正尝试将开发环境逐渐迁移到WSL,但在配置Flutter时,却发现WSL的一个先天硬伤:
——不能运行32位ELF程序。
怎么办呢,尝试升级到WSL2吧......
配置WSL2的系统环境
系统要求:
- Windows平台:build版本不低于18917;
- 启用[虚拟机平台可选组件];
- Hyper-V支持。
1. 升级到Windows Insider Preview
- 打开设置——更新和安全——Windoows预览体验计划:
这是已经设置完成的界面:
- 选择快速预览通道;
- Windows更新——检查更新,等待安装完成。
当前快速预览通道最新build版本为18945
2. 开启[虚拟机平台可选组件]
- 以管理员身份打开powershell并运行:
C:\> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
3. Hyper-V支持
家庭版并没有Hyper-V组件,需要通过外部安装开启;
——以下教程参考此处。
- 在文本编辑器里复制以下代码并以
*.cmd
后缀保存:pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"del hyper-v.txt Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
- 右键脚本——以管理员身份运行
安装WSL2
1. 安装WSL_ArchLinux
考虑到Ubuntu的系统环境过于冗杂,故选择重新安装ArchLinux(真香);ArchLinux并没有加入
Microsoft Store
,如果选择其它Linux发行版本,可直接在Microsoft Store
搜索wsl
。
——WSL_ArchLinux的安装教程参考此处
请忽略Surface Go的渣渣配置
2. 升级到WSL2
警告:当前版本如果想配置好Remote_WSL扩展,请先暂时跳过此部分流程。
- 在powershell中,运行以下命令:
等待数分钟后即可升级完成。# 验证WSL发行版版本 C:\> wsl.exe --list -v NAME STATE VERSION *Arch Running 1 # 将发行版版本更改为WSL2 C:\> wsl.exe --set-version <Disto> 2 # Distro指WSL发行版名称 正在进行转换,这可能需要几分钟时间... 有关与 WSL 2 的主要区别的信息,请访问 https://aka.ms/wsl2
2.1. ——踩到的坑
- 在执行转换wsl2的过程中提示:
转换失败。Exporting the distribution failed bsdtar: Write error
检查任务管理器,发现在转换过程中会运行bsdtar
程序,并在程序目录下进行写入操作。
如果你的ArchLinux是通过appx
包安装在C:\Program Files\WindowsApps
目录下,
bsdtar
自然会被Windows Defender
疯狂阻止......
(老实点,每次出问题都有你。) - 解决方法:
- 关掉WD的实时防护;
- 或者,别将ArchLinux安装在
Program Files\
目录下(Install zip package)。
在VSCode中配置Remote_WSL
1. 添加Remote_Development扩展
- 在扩展中搜索
remote_development
并安装:
@import "./assets/development.jpg"
会同时安装上Remote_SSH
、Remote_Containers
、Remote_WSL
远程工作原理:
architecture- 开启remote后,除了UI和主题插件,其它扩展都会安装在远程机中,并且扩展工具的环境配置完全依赖远程机的环境。
- 扩展工具会被安装在远程机的.vscode-server目录,
Remote_WSL
会将.vscode-server放在WSL的$HOME
目录下。
2. 连接WSL
- 使用快捷键
Ctrl+Shift+P
,或点击界面左下角的 remote 按钮,打开命令面板:
-
New Window
:使用WSL打开新的窗口; -
Reopen Folder in WSL
:将当前目录在WSL中打开; -
New Window Using Distro
:选择一个已安装的WSL发行版打开新窗口;
连接成功后,会在左下角看到按钮变成了
-
3. 为WSL安装扩展
- 连接WSL后,已安装在本地的开发工具列表会变成不可用,并提供
Install on WSL:
按钮,点击即可安装到WSL:
extensions - 在搜索到的扩展页中,安装的按钮也会变更为
Install on WSL:
3.1. ——踩到的坑
- 尽管远程连接操作和功能实现与WSL1没区别,但在当前预览版本的WSL2中,存在Remote_WSL向WSL2远程安装扩展不成功的(灾难性)bug。
- 解决方法:
既然Remote_WSL在WSL1中安装扩展没有问题,且发行版的WSL1和WSL2版本变更并不会影响WSL的主机身份识别,那解决WSL2安装扩展的问题就如同把大象装在冰箱里一样简单了。
1. 回滚到WSL1:
powershell C:\> wsl.exe --set-version <Distro> 1
2. 使用Remote_WSL在WSL1中安装好VSCode扩展;
3. 升级到WSL2:
powershell C:\> wsl.exe --set-version <Distro> 2
All done.
非重点的小坑
1. 环境变量
如果WSL安装了zsh
之类的shell并作为默认启动,那么在使用Remote_WSL时,VSCode的扩展依赖的依旧是bash
的环境变量配置,并不会启动zsh。
因此,在设置如ANDROID_HOME
、GOPATH
之类的环境变量时,不要将自定义变量设置保存在$HOME/.zshrc
里。
- 如果希望VSCode和zsh都使用同样的环境变量,解决办法:
- 将环境变量设置保存在
$HOME/.profile
中,并在$HOME/.zshrc
添加如下语句:source ~/.profile
- 或者,直接将变量设置添加在
/etc/profile
中。
- 将环境变量设置保存在
2. Flutter——android开发
在WSL中使用Flutter是我升级到WSL2的动因,WSL2确实解决了运行32bit程序的硬伤,但由于WSL2是完全的虚拟机环境,也产生了新的问题:
——android虚拟机就不能用了。
老老实实用adb接手机调试吧。
3. 运行Windows可执行程序
当前WSL2预览版本的bug,不能通过shell打开code
、explore
之类的windows程序,等待未来版本解决。
网友评论