WSL2(预览版)体验笔记

WSL2安装

WSL2在今年5月份Microsoft Build大会上发布了,但至今Windows10一直没收到更新推送,我想这么久过去就算没进入正式,至少也到了RC版了吧,因而开始折腾准备体验一把。redis

WSL2须要Windows10的18917或以上版本的支持,截止至2019-08-22,这个版本仍然处于内部预览的状态,如须要,得把系统设置的“Windows预览体验计划”做相应的修改,加入这个预览体验计划,而后就能够接收到Windows预览版的更新内容了。——具体过程略,特别要注意的就是这个更新过程比较漫长,找个空闲时间来作吧。shell

在“启用或关闭Windows功能”里打开这两个功能架构

  1. 执行Linux程序的Windows子系统 (这个就是WSL了)
  2. 虚拟机平台 (WSL2须要这个,WSL1是不须要的,记得打开BIOS设置里的CPU虚拟化技术)

或者以管理员身份运行Powershell,而后执行:app

>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
>Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatformssh

在Windows10的应用商店里装个Ubuntu,或Ubuntu 18.04 LTS,或者别的发行版也行(咋没有我熟悉的CentOS呢?)。而后在开始菜单上点击运行,第一次运行会很慢,由于有个安装的过程,耐心等待,完成后提示你输入用户名密码,这个用户名密码和Windows的是无关的。优化

WSL2使用

打开命令行界面(cmd.exe),如今来熟悉几条WSL2相关的配置命令:ui

>wsl -l --verbosespa

这条命令能列出当前安装的的Linux发行版的名称、状态及其使用的WSL的版本,如:命令行

NAME         STATE      VERSION
*Ubuntu      Running    1
Ubuntu-18.04 Running    2

前面的*表示wsl的默认发行版,从这还能看出Ubuntu使用的WSL为初版,要将Ubuntu转为使用WSL2可使用这个命令:code

>wsl --set-version Ubuntu 2

设置未来安装的发行版都使用WSL2

>wsl --set-default-version 2

另外有wslconfig命令也能够控制发行版的运行,具体直接敲这个命令就能看到帮助信息。

WSL2和WSL的一个很大的不一样点就是使用了虚拟磁盘,并非像WSL那样直接把文件存在Windows的文件系统中,WSL的磁盘的默认存放地方在:

%localappdata%\Packages\CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgsc\LocalState

这个目录下有个扩展名为vhdx的大文件,这就是虚拟磁盘镜像文件了。

以前的WSL,要在Windows访问Linux是有些问题的,虽然使用的是同一个文件系统,但直接往Linux的文件目录里扔文件彷佛没用,可能跟刷新有关,而且也不建议这么作,而如今方便了,在WSL里敲explorer.exe .,便可用Windows的资源管理器打开当前WSL的目录,注意这个功能只能在WSL的窗口里执行,若是是SSH终端,那会提示explorer.exe找不到命令。

在部署完WSL以后,我发觉VMWare Workstation Pro已经不能用了,提示“VMware Workstation 与 Device/Credential Guard 不兼容”,搜索解决方案,在Windows组策略中关闭了“Device/Credential Guard”以后问题依旧。通过查阅资料,了解到WSL2的架构发生了较大的变化,它使用了一些虚拟化技术(但又不彻底等同于VM,它启动速度要比VM快得多,具体等我有了更多了解后再作分享),因此不难理解为何WSL需得开启“虚拟化平台”这个功能方可以使用,WSL2也所以支持了Docker,这都说明了它已是一套纯正的Linux了,然而Windows的虚拟化技术跟VMWare所使用的虚拟化技术有很大不一样,互不兼容,若是你以前使用过Hyper-V的话必定知道这事情。如今怎么办呢?个人解决方案就是放弃VMWare,把原先的VMWare磁盘镜像文件转为Hyper-V磁盘镜像的格式,使用Hyper-V虚拟机……呃,其实也算不上解决方案,VMWare的爽,谁用谁知道,因此我以为这是WSL2最大的一个坑。

这里又引出一个问题了:WSL2还能称得上WSL么?我以为它更接近于一个运行在Windows环境下的通过了特殊优化的Linux虚拟机,而再也不是一个Subsystem了。

现在的WSL2能够看作是一个独立的虚拟机了(虽然技术上仍有些区别),它具备本身独立的IP地址,经过虚拟路由器与Windows链接,虽然你在WSL2中部署的服务在Windows中也能用localhost访问,可是我猜这是用了一些特殊的内部链路技术来实现的,不信你能够作这么一个简单试验:假如你在WSL2中部署并运行了redis,若是配置文件中仅仅bind到了127.0.0.1的话,Windows是没法用localhost或127.0.0.1来访问WSL2中的redis服务的。要查看WSL2的ip地址,能够在WSL2中用ip addr命令或者ifconfig命令。另外我在使用中还发现用localhost这个地址没法访问WSL2的ssh服务,我尝试过关闭Windows防火墙,用netstat检查过端口打开及绑定状态,都是没问题的,且只要把localhost换成WSL2的IP地址(一般是172.x.x.x)就能够了,与此同时,利用localhost地址访问WSL2中的redis服务及PostgreSQL服务都是没问题的,感受挺奇怪。

还有值得注意的一点是:WSL2的IP地址是动态的,每次启动后都会不同,因此也很差直接用指定IP地址的方式来访问WSL2的ssh服务。

我还发现WSL1中的没法自动启动sshd等问题现在仍然存在,虽然我能够经过一些小手段来解决,网上也有人给出了一些workaround,但总归以为不够工整。

总结

如今其实一切都还没最终发布,若是精力有限,我以为仍是先不要入这坑的好,我这么一番折腾下来,感受不太值得……

2019-08-26更新:早上Windows更新至18965.1005,发觉WSL2联网都成问题了,暂时没空找解决方案,因而将WSL2降回WSL1继续用,想一想仍是等它正式上线了再用比较好,太坑了。

相关文章
相关标签/搜索