WSL (Windows Subsystem for Linux) wsl1+wsl2+对比+在线安装+离线安装+版本转换+右键菜单+外网访问
WSL (Windows Subsystem for Linux),是微软在Windows10中增加的Linux子系统,可以方便的在Windows中使用Linux系统进行开发、测试及其他便捷功能
当前有两个不同实现版本
一、两者比较
以下表格为官方提供的两者功能对比
简单归纳两者区别
WSL 1 由于与 Windows 共用 NTFS 文件系统,所以两个系统间跨系统文件交互性能更强 但正是由于这一点,无法使用很多功能,如完整的 docker,另外IO性能也不如正经 Linux WSL 2 使用了虚拟化技术,相当于在 Windows 中打开了一个虚拟机,所以可用功能是要远远多于 WSL 1 的,IO 性能也明显上来了 使用了微软自家的 Hyper-v 虚拟化技术,其他虚拟机类产品的兼容版本 VMware 15.5.5+ 和 VirtualBox 6+WSL 2 仅适用于 Windows 10 版本 1903、内部版本 18362 或更高版本
不需要纠结,没啥特殊要求就上WSL2吧,而且两者可以相互转换
重要
重要
重要
WSL 2 现在有一项问题,如果使用了诸如WeGame
的网络加速、Proxifier
等会改变网络设置的软件,会导致 WSL 2 无法启动
错误如下参考的对象类型不支持尝试的操作。
使用管理员身份执行以下命令重置网络设置即可,无需重启计算机
netsh winsock reset
重要
重要
重要
二、安装
1.启用适用于 Linux 的 Windows 子系统
以管理员身份在 CMD 或 PowerShell 中运行以下命令
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
或以管理员身份在 PowerShell 运行
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
该步骤是必须的,如果想使用 WSL 2 继续第2步,如果想使用 WSL 1重启计算机
,然后直接跳到第5步。
2.开启虚拟机功能
WSL 2 使用了虚拟机技术,所以使用管管理员身份在 CMD 或 PowerShell 中运行以下命令
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
然后重启计算机
3.安装 Linux 内核更新包
在 适用于 x64 计算机的 WSL2 Linux 内核更新包 中下载安装更新包
4.将 WSL 2 设置为默认版本
以管理员身份在 CMD 或 PowerShell 中运行下面的命令
wsl --set-default-version 2
将默认版本改为 WSL 2,以后安装wsl时将默认安装为 WSL 2,该版本可以随时转换
5.安装所需的分发版
5.1.在线安装
打开 Microsoft Store 选择自己喜欢的分发版进行安装
5.2.离线安装
首先下载离线安装包
Ubuntu 20.04
Ubuntu 20.04 ARM
Ubuntu 18.04
Ubuntu 18.04 ARM
Ubuntu 16.04
Debian GNU/Linux
Kali Linux
OpenSUSE Leap 42
SUSE Linux Enterprise Server 12
Fedora Remix for WSL
安装
有两种安装方式
直接安装,在 powershell 中进入安装包所在目录,运行下面的命令(app_name.appx是安装包名)
Add-AppxPackage .\app_name.appx
解压安装,可以自定义安装位置
将下载的安装包解压到想要安装的位置,然后将该目录添加到环境变量的PATH
中
5.3.初始化
对于在线安装的或者下载安装包使用命令安装的,直接打开对应图标即可
对于手动解压的,需要进入解压目录打开对应的可执行文件,如分发版为 Debian 的打开debian.exe
即可
等待一会儿待初始化完成后按照说明分别设置用户名
、密码
即可使用
三、版本转换
如果你的系统是 Windows 内部版本 18362 或更高版本,可以无损转换已经安装的 WSL 版本
查询已安装的 WSL 分发版
wsl --list --verbose
命令输出中展示了
name: 已安装分发版名字
state: 已安装分发版状态,可以简单理解为开机还是关机状态
version: 已安装分发版版本,即 WSL 版本
使用第一条命令中找到的name
(假如名字是Debian
) 执行以下命令
WSL 1 -> WSL 2
wsl --set-version Debian 2
WSL 2 -> WSL 1
wsl --set-version Debian 1
四、添加右键菜单
将下面代码复制保存到xxx.js
文件中,双击即可添加/删除右键菜单
添加菜单 只安装了一个分发版
var WshShell = new ActiveXObject("WScript.Shell");WshShell.CurrentDirectory = "..";WshShell.RegWrite("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\", "WSL Here", "REG_SZ");WshShell.RegWrite("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\command\\", "C:\\Windows\\System32\\wsl.exe", "REG_SZ");
指定一个分发版 将代码中的分发版的名字
几个字改为 查询已安装的 WSL 分发版 中获取到的name
,想要添加哪个分发版就改为哪一个
var WshShell = new ActiveXObject("WScript.Shell");WshShell.CurrentDirectory = "..";WshShell.RegWrite("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\", "WSL Here", "REG_SZ");WshShell.RegWrite("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\command\\", "C:\\Windows\\System32\\wsl.exe -d 分发版的名字", "REG_SZ");
删除菜单
var WshShell = new ActiveXObject("WScript.Shell");WshShell.RegDelete("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\command\\");WshShell.RegDelete("HKCU\\Software\\Classes\\Directory\\Background\\shell\\wsl_here\\");
五、在 Windows Terminal 中使用 WSL
使用了Windows Terminal?
参考我的另一篇文章 Windows Terminal 配置+右键菜单+管理员权限
六、设置网络访问
当前时间 -11-27 官方文档中显示尚未支持纯 IPV6 的访问
0.获取WSL的ip
WSL 1 直接与 Windows 共用网络,只需要开放相应端口即可
WSL 2 使用了虚拟机,所以需要将端口映射到物理机上
查找 WSL 2 的ip地址,以下命令在 WSL 2 中运行,输出中查找inet
处的ip地址
ip addr | grep eth0 | grep inet
1.Windows访问WSL
WSL 1 直接使用 127.0.0.1 或者 localhost 即可访问
WSL 2 当前版本使用命令找到的 ip 或者 localhost 均可访问
2.WSL访问Windows
官方文档中提供的方法为从/etc/resolv.conf
文件中寻找nameserver
即为Windows的ip
可以在 WSL 中使用如下命令
cat /etc/resolv.conf | grep nameserver
3.局域网/广域网访问WSL
3.1.手动方法
需要将 WSL 的端口与 Windows 端口绑定,并且 WSL 2 每次分配到的地址可能不固定,所以需要多次设置
以管理员身份运行
netsh interface portproxy add v4tov4 listenport=[Windows端口] listenaddress=0.0.0.0 connectport=[WSL端口] connectaddress=[WSL的IP]
查看端口转发状态
netsh interface portproxy show all
删除端口转发
netsh interface portproxy delete v4tov4 listenport=4000 listenaddress=0.0.0.0
3.2.自动脚本
为了方便使用,提供如下脚本进行添加、删除、查看Windows与WSL2的端口转发,复制另存为xxx.bat
双击打开使用
只有安装了 WSL 的系统下可用
@echo off@title WSL2端口转发:isAdmin::判断当前是否有管理员权限REG QUERY "HKU\S-1-5-19">NUL 2>&1||(powershell -Command "Start-Process '%~sdpnx0' -Verb RunAs"&&exit):startclsecho.echo. ************************************************echo. * 自动获取 WSL 2 的ip地址,绑定指定端口号echo. * 方便局域网/广域网访问 WSL 2 内部应用echo. *echo. * 0. 退出echo. * 1. 绑定端口号echo. * 2. 查看已绑定端口号echo. * 3. 删除已绑定端口号echo. ************************************************echo.goto loopChoice:loopChoiceset "choice=notChoice"set /p choice="输入序号后回车: "if "%choice%"=="0" goto exitif "%choice%"=="1" set "nextStep=addForward" & goto loopPortif "%choice%"=="2" goto showForwardif "%choice%"=="3" set "nextStep=delForward" & goto loopPortecho. & echo 选择错误 & goto loopChoice:loopPortecho.set "choice=notPort"set /p choice="输入监听的端口号后回车: "if "%choice%"=="0" goto exitecho %choice%| findstr /v "[^0-9]">nul&& set "wsl2Port=%choice%" || set "choice=notPort"if %wsl2Port% GTR 65535 set "choice=notPort"if %wsl2Port% LSS 1 set "choice=notPort"if "%choice%"=="notPort" echo. & echo 端口号输入错误 & echo. & goto loopgoto %nextStep%:addForward:: 添加新的端口转发for /f "tokens=2" %%i in ('wsl -e ip addr ^| findstr eth0 ^| findstr inet') do (set wsl2ip=%%i)for /f "tokens=1 delims=/" %%i in ('echo %wsl2ip%') do (set wsl2ip=%%i)netsh interface portproxy add v4tov4 listenport=%wsl2Port% listenaddress=0.0.0.0 connectport=%wsl2Port% connectaddress=%wsl2ip% && echo 添加成功 || echo 添加失败goto end:delForward:: 删除已经存在的端口转发netsh interface portproxy delete v4tov4 listenport=%wsl2Port% listenaddress=0.0.0.0 && echo 删除成功 || echo 删除失败goto end:showForward:: 显示已经绑定的端口转发netsh interface portproxy show allgoto end:endecho. & echo 按任意键返回主菜单... & pause >NULgoto start:exitexit