win10下使用WSL 2

阿伟死了

Posted by UlyC on November 25, 2019

win 10是最好的linux发行版!

​ —— 佚名

win10下使用WSL 2

准备工作

之前有介绍过使用wsl 1版本做开发的方法, win10配合Ubuntu子系统打造舒适Python开发环境

然后需要确认自己系统的版本是否高于18917。

这里的坑在于18917版本我使用的时候还未正式推送更新,导致试了许多办法都没能启用WSL2,后来我是加入了Windows 预览体验计划之后才获得高于此版本的更新。

win预览计划.png

安装wsl2

要安装并开始使用 WSL 2,请完成以下步骤:

  • 启用“ 虚拟机平台(Virtual Machine Platform)”可选组件
  • 使用命令行设置要由 WSL 2 支持的发行版
  • 验证你的发行版使用的 WSL 版本

请注意,你需要运行 Windows 10 build 18917 或更高版本才能使用 WSL 2,并且你需要安装 WSL(可以在此处找到相关说明)。

启用“虚拟机平台”可选组件

以管理员身份打开 PowerShell 并运行:

Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

启用这些更改后,你需要重新启动计算机。

使用命令行设置要由 WSL 2 支持的发行版

在 PowerShell 中运行:

wsl --set-version <Distro> 2

并确保将 <Distro> 替换为发行版的实际名称。 (你可以使用以下命令找到它们:wsl -l)。 你也可以通过运行与上面相同的命令随时更改回 WSL 1,但将“2”替换为“1”。

此外,如果你想使 WSL 2 成为默认架构,可以使用以下命令执行此操作:

wsl --set-default-version 2

这将使你安装的任何新发行版初始化为 WSL 2 发行版。

完成验证发行版使用的 WSL 版本

要验证每个发行版使用的 WSL 版本,请使用以下命令:

wsl --list --verbose
# 或者
wsl -l -v

你在上面选择的发行版现在应该在“version”列下显示“2”。 现在完成了,你随时可以开始使用你的 WSL 2 发行版了。

WSL 2 的体验变化

首次开始使用 WSL 时,你会注意到一些用户体验变化。以下是此预览中两个最重要的变化。

将 Linux 文件放在 Linux 根文件系统中

确保将 Linux 应用程序中经常访问的文件放在 Linux 根文件系统中,以享受文件性能优势。过去微软一直强调在使用 WSL 1 时将文件放入 C 盘,但 WSL 2 中的情况并非如此。要享受 WSL 2 中更快的文件系统访问权限,这些文件必须放在 Linux 根文件系统里面。而且现在 Windows 应用程序可以访问 Linux 根文件系统(如文件资源管理器!尝试在 Linux 发行版的主目录中运行:explorer.exe . 看看会发生什么),这将使这种转换变得更加容易。(之前文章说过在wsl 1中可以访问win中的文件,而在win中访问不到wsl中的文件。)

在初始构建中使用动态 IP 地址访问 Linux 网络应用程序

WSL 2 做了架构的巨大变更,使用了虚拟化技术,并仍在努力改进网络支持。由于 WSL 2 现在运行在虚拟机中,因此你从 Windows 访问 Linux 网络应用程序需要使用该 VM 的 IP 地址,反之亦然,你需要 Windows 主机的 IP 地址才能从 Linux 中访问 Windows 网络应用程序。 WSL 2 的目标是尽可能使用 localhost 访问网络应用程序!可以在文档中找到有关如何执行此操作的完整详细信息和步骤。

(此特性已更新,详见下面更新的章节)

新的 WSL 命令

WSL 添加了一些新命令选项来帮助控制和查看 WSL 版本和发行版。

除了上面提到的 --set-version--set-default-version 之外,还有:

  • wsl --shutdown 立即终止所有正在运行的发行版和 WSL 2 轻量级实用程序虚拟机。 一般来说,支持 WSL 2 发行版的虚拟机是由 WSL 来管理的,因此会在需要时将其打开并在不需要时将其关闭。但也可能存在你希望手动关闭它的情况,此命令允许你通过终止所有发行版并关闭 WSL 2 虚拟机来执行此操作。
  • wsl --list --quiet 仅列出发行版名称。此命令对于脚本编写很有用,因为它只会输出你已安装的发行版的名称,而不显示其他信息,如默认发行版、版本等。
  • wsl --list --verbose 显示有关所有发行版的详细信息。此命令列出每个发行版的名称,发行版所处的状态以及正在运行的版本。默认发行版标以星号。

一些更新

win 18945: 支持通过localhost访问WSL2容器

windows 18945之前的WSL2版本,如果我们在其中运行了一个网络服务,例如启动一个WEB服务。想在 Win10 宿主机中访问这个WEB服务,我们先要通过 ip a 或 ifconfig 命令查看其IP地址才能访问,而且更崩溃的是每次重启后再运行WSL2容器,其IP地址和网关会重新分配。

image-20210118144355782

这确实是件很麻烦的事情,为此有开发者特意用golang开发了一个windows服务,让用户快捷的获取到WSL2的IP。

本次更新改进了这个问题,我们在WIN10中能够直接通过localhost 访问到WSL2中的服务,并且WLS2中的网络服务也能绑定到 0.0.0.0 上。

image-20210118144324427

例如:WSL2 容器内启动web服务器,使用python http.server模块启动一个WEB服务 python3 -m http.server,默认端口8000 然后在win10中的web浏览器中访问 http://localhost:8000/

image-20210118144259283

要了解有关用户体验更改的更多信息,请参阅文档:WSL 1 和 WSL 2 之间的用户体验变化

win 19028.1: 可在Pycharm2019.02版本使用 wsl2

在此版本之前,Pycharm2019.02中解释器选择wsl,若wsl版本为wsl2则程序会直接卡死。

现在则可以选择wsl2中的python作为解释器。

要解决卡死问题,又不想升级系统的话 ,可以使用Pycharm2019.03版本,此版本兼容了wsl2,虽然还未正式发行。

本人使用中发现 wsl存在的bug

image-20210118144242972

github也有用户反馈了这个问题,官方确认是BUG并正在修复中。

目前可以使用ssh隧道连接。

git status更新不及时

wsl2bug.png

这个问题从wsl 1就存在,github很多人提过这个issue,官方还未修复。

wsl其他技巧

ssh连接wsl

打开配置文件:

sudo vim /etc/ssh/sshd_config 写入:

Port 2222   				#设置ssh的端口号, 由于22在windows中有别的用处, 尽量不修改系统的端口号
PermitRootLogin yes  		 # 可以root远程登录
PasswordAuthentication yes     # 密码验证登录
AllowUsers sky 				# 远程登录时的用户名

重启服务:

sudo service ssh --full-restart 这个时候你自己电脑上就可以通过ssh连接wsl了, 但是想要在其他的计算机上访问, 就需要系统开放端口了。

防火墙->高级设置->入站规则->新建规则

img

端口->下一步

选择tcp 特定本地端口 2222

img

允许连接, 默认都选上, 下一步填个名字。

如果你使用的是wsl 1版本到这一步就可以在其他电脑ssh连接了。

因为wsl2 ip与宿主机ip并不相同,此时还需要在win中添加下端口转发的规则。

使用管理员权限打开Powershell,输入:

netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=2222 connectaddress=${wsl.ip}

wsl使用完整 桌面版kali

kalipng.png

升级为完整版

Microsoft Store中直接安装的wsl版kali是阉割版,基本上你想用的软件全都没有,所以需要安装完整版。

进入wsl 依次输入:

apt-get update
apt-get upgrade
apt-get install kali-linux-full

等待直至结束即可。

为wsl安装桌面

这一步是最骚的,wsl 1和2都支持开桌面版,比开个VM爽多了。

  1. 安装 xfce4 和中文支持

    apt-get install xfce4 fonts-noto-cjk
    
  2. Windows 上安装 VcXsrv 见这里

  3. 配置输出 在 ~/.zshrc(如果用的是原生 bash 就用~/.bashrc) 中添加

    export DISPLAY=:0.0
    
  4. 启动桌面

    startxfce4
    

启动后遇到问题, 可以用以下脚本解决

rm -rf ~/.config/xfce4rm -rf ~/.cache/sessions

参考链接

[1]. 官方文档:User Experience Changes Between WSL 1 and WSL 2

[2]. 在 Windows 中运行 Linux:WSL 2 使用入门

[3]. 设置WSL可远程连接

[4]. WSL2跟踪 - 18945: 通过localhost直接访问 WSL2 容器中的服务

[5]. WSL 下的 kali


知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。