使用WSL快速搭建开发环境

September 06, 2021

WSL 是什么?

Windows Subsystem of Linux, 属于在Windows内加载的旁系统。WSL1与WSL2的实现不一致,WSL2更像是一个系统内的虚拟机,而WSL1是通过兼容层实现了类似与Linux的运行环境,如果涉及底层的一些操作或者命令则不存在。

更详细的对比请参阅: Comparing WSL 1 and WSL 2

对于前端同学的选择

我的需要最基本的有:可接受的文件io,Node.js,npm/yarn,容器(运行本地Debug环境)。

那么如上的需求,可以考虑WSL1+WSL2的搭配方案,即需要容器的环境使用WSL2挂载项目文件夹进行执行,否则则在WSL1内正常使用Node开发。

如果你能接受 【挂载盘】较慢的io速度 以及 每次需要现查的主机/WSL2 IP地址 ,那么可以只使用一个WSL2环境。

WSL快速配置

官方旧版安装指南 Windows Subsystem for Linux Installation Guide for Windows 10

2021-12-01 官方文档更新了,这个步骤不是很清晰,补充几个关键命令……

wsl --install -d Debian # -d <DistributeName>
# 安装完毕后关闭WSL窗口,直接开始导出
wsl --export Debian C:\Debian.tar
wsl --import Debian-WSL1 <SomePathToDir> C:\Debian.tar
wsl --import Debian-WSL2 <SomePathToDir2> C:\Debian.tar
wsl --unregister Debian # 删除原来安装的默认版本
wsl --set-default Debian-WSL1 # 设置WSL1为默认版本
wsl --set-version Debian-WSL2 2 # 将其中一个版本转换为WSL2

这里我使用 Manual Installation,同时开启WSL2所需的Features,并安装Linux kernel update package。截止至Step4。

我选择不将所有WSL版本都设置为2,即不设置默认使用版本2。

这时安装的WSL即为一代,选择你希望安装的distribution,我这里选择的Debian。

正常安装并在内部配置好所需的开发工具后,将WSL1导出一份用来生成WSL2。

配置Node.js环境

前文赘述了不少关于npm的问题,其实根治的方案就是选择一个node版本控制工具,比如nvm,它会将不同版本的包管理在一个有权限的子目录内,“根本上”避免了权限问题。

这里我选择的nvm,官方Guide Readme

安装好nvm并使用nvm安装Node.js以及其他工具如yarn等工具后,我们就可以开启“平行宇宙”,将环境一分为二了。

Yarn (classic) 目前推荐的安装方案:npm install -g yarn

“开启“平行宇宙”,将环境一分为二”的梗来自于Marvel的”What If…” 04,古一将Doctor Strange一分为二,使得同一时间线内有了两个Doctor Strange。

切分环境

打开PowerShell,确保容器目前处于关闭状态。

手工关闭,wsl --shutdown

首先需要把已有的导出为一个档案文件,

wsl --export <DistributionName> <FileName>

导出后,再使用import进行导入,这里可以指定安装位置,因此 也可以用来移动WSL安装位置 :

wsl --import <AnotherDistributionName> <InstallLocation> <FileName>

验证可以使用wsl --list -v,这时我们已经有了两个WSL1。接下来我们转换其中一个为WSL2

wsl --set-version <AnotherDistributionName> 2

再执行wsl --list -v就可以得到两个版本的WSL共存了。

使用同一个环境切分,可以比较方便的处理同一个文件夹下的文件,避免了由于不同用户导致的权限问题。

WSL2容器解决方案

Docker Desktop v4开始,对于商业公司使用作出了明确限制,如果涉及商用,就需要使用付费plan,因此本文介绍的都是使用Podman 进行容器管理的方案。

Podman安装

其它WSL底层系统请参考Podman Installation Instructions

sudo apt-get -y install podman

Podman登录Docker注册表

podman login your.registry.com

Podman拉取镜像并运行

podman pull <image>
podman run <custom-args> <image>

由于缺失systemd和journal,可能会启动时遇到报错,可以在执行时增加参数--cgroup-manager=cgroupfs --events-backend=file,或者直接在配置文件里进行全局设置:

vim /etc/containers/containers.conf
[engine]
events_logger="file"
cgroup_manager="cgroupfs"

Podman停止、列出镜像

podman ps -a
podman stop <container> && podman rm <container>

WSL2实用命令

如何获取主机IP

ipconfig.exe | grep 'vEthernet (WSL)' -A4 | cut -d":" -f 2 | tail -n1 | sed -e 's/\s*//g'

Copyright © Arcto 2022, Built with Gatsby