WSL 和 WSL2 简单对比

2019-07-30 20:30:30 +08:00
 goreliu

原文地址: http://www.mocihan.ml/archives/267/

昨天我升级系统到 Windows 10 Insider Preview Build 18945,折腾了一天多 WSL2,目前基本可用了,以一个普通用户的角度总结下 WSL 和 WSL2 的区别。

主要从功能性能两个方面简单说下 WSL2 和 WSL 相比的优势和劣势。本来想单独列下易用性,但发现都可以在功能和性能上体现出来。

功能

WSL2 的优势

因为 WSL2 是跑在虚拟机中的完整 Linux,所以功能方面要比 WSL 强大一些。从目前的版本看,至少能做到如下这些 WSL 做不到的事情(并没有全部核实,可能有出入):

  1. 网卡管理、网络抓包、查看网络连接状态、防火墙等较底层的网络相关功能。
  2. 挂载文件(如 ext4 文件、squashfs 文件)和网络资源(如 nfs、ssh )到本地。
  3. tmpfs (在 /run/shm 或者 /dev/shm,/tmp 不是)。
  4. 完整的 cgroups,因此可以运行 Docker 等容器。
  5. 完整的 IPC ( WSL 缺失一部分,比如运行不了 fakeroot )。
  6. 可修改内核参数、添加内核模块,以及替换内核。因此可以支持很多更底层的应用。
  7. 因为之上的这些原因,WSL2 可以更好地享受完整 Linux 系统带来的方便,不需要因为 WSL 的功能缺失而使用各种迂回方法。

WSL2 的劣势

功能方面的劣势,主要是和本机系统(即 Windows 宿主机)整合相关的。

  1. 进程不再会显示在任务管理器里,也无法在 WSL2 外操作,包括不再支持本机系统的防火墙规则。
  2. 无法通过 localhost ( 127.0.0.1 )访问本机系统监听的端口(也许以后会支持。目前用 localhost 是可以从本机系统访问 WSL2 的),只能通过其他 IP。
  3. 默认无法从其他机器访问到 WSL2 中监听的端口,需要在本机系统设置端口转发(如 netsh interface portproxy add )。

其中 2 和 3 后续都可能优化,技术上没有难题。

WSL2 的功能缺失,相对于原生的(包括虚拟机中的) Linux

  1. 没有声音、显示系统,和 WSL 一致。但有迂回办法(不包括显卡计算)。
  2. 不能访问本机系统的 USB 设备(但可以访问已经在本机系统挂载的硬盘、U 盘、光盘等)、串口设备(这个 WSL 已经支持,WSL2 之后也会支持)、PCI 设备等等。
  3. 网卡管理相关功能不全,比如不能设置静态 IP、不能桥接、不能访问网卡硬件等等。

但 WSL2 的文件系统镜像可以直接使用 Hyper-V 挂载(可以一个镜像两用,不能同时运行),这样功能比 WSL2 要强一些(比如有显示系统、网卡管理、串口设备支持、受限的本机硬盘直通等等),但还是有一些功能缺失。

性能

性能方面,WSL 和 WSL2 各有优势。如果不和本机系统交互,WSL2 的性能非常不错,但访问本机系统的文件会下降很多。

WSL2 的优势

  1. 进程启动开销大大减少,需要频繁启动进程的场景性能大幅提升。
  2. 本地磁盘(不包括挂载的 /mnt/*)读写性能大幅提升。

WSL2 的劣势

  1. 通过 9p 挂载的本机系统文件(/mnt/*)和 WSL 中的 drvfs 相比,读写性能大幅下降,主要体现在读取大量小文件场景(比如文件数上百后,ls -l、file *、head -n1 *、git status/diff/... 等等命令会有明显卡顿,耗时为 WSL 中的几倍甚至十几倍)。但仅仅列文件名( ls 要比 ls -l 快几个数量级)或者操作大文件(比如用 dd 读写大文件感觉不到慢)基本没影响。
  2. 内存占用比 WSL 高很多。基本运行起来后就要占 300M 以上(要看 Vmmem 进程,而不是终端模拟器)。而且读写大量本地系统文件(/mnt/*)后内存会飙升,至少有些情况不会回落,即使其他软件将内存快耗尽了 Vmmem 内存占用也不会下降。
  3. 首次启动比 WSL 慢,但平时不需要退出( wsl --shutdown,可以用它来释放内存),可以认为没影响。

其中 1 也许可以大幅优化,2 之后很可能会优化。

总结

总体说功能上变得更强大了,但和本机系统交互的相关功能有所减弱,用起来没有之前方便了。性能上如果不需要和本机系统交互,提升很显著,但如果需要读写本机系统硬盘的文件,性能下降很明显。

我会继续更新原文。

40227 次点击
所在节点    Linux
49 条回复
LokiSharp
2019-07-31 07:22:10 +08:00
告辞诉还不如直接用 vmware
ericgui
2019-07-31 07:26:39 +08:00
@goreliu 好的,谢谢大佬
Qzier
2019-07-31 08:20:34 +08:00
还有个问题,装了 wsl2 后就没法用 vmware 了。
dk7952638
2019-07-31 08:43:36 +08:00
WSL2 根本就是一次倒退和妥协
nullboy
2019-07-31 08:44:10 +08:00
这玩意真的有用?
anguiao
2019-07-31 08:44:11 +08:00
@Qzier 这个是可以解决的,需要 VMware
anguiao
2019-07-31 08:44:53 +08:00
@Qzier 这个是可以解决的,需要 VMware 那边适配。
sky101001
2019-07-31 08:49:37 +08:00
真希望 wsl 能支持 cuda
yjfuk
2019-07-31 08:54:18 +08:00
to run vmware vm:

bcdedit /set hypervisorlaunchtype off

Restart

To run hyper-v vm:

bcdedit /set hypervisorlaunchtype auto

Restart
uleh
2019-07-31 08:54:20 +08:00
因为公司统一用麦咖啡,而麦咖啡和 WSL 犯冲,所以一直用的 hyper-v + vagrant,发现也挺好用的
fcten
2019-07-31 10:05:56 +08:00
对于我来说,WSL 满足大部分日常需求了,为了那剩下一小部分需求切换到 WSL2 不值得,有需要的时候开个虚拟机就行了。
ungrown
2019-07-31 10:37:10 +08:00
归根到底,WSL 不是刚需,以我的经验,直接上虚拟机,vbox 就挺好用的,发行版随便选,我现在用个 openwrt-x86 就能满足我的全部需求了,如果有更多需求,上 alpine,再不行直接上 ubuntu-mini。
虚拟机看似臃肿,实际上跑个小体积的 linux 根本不会对系统产生什么压力,那点负载和占用还不到 windows 的零头。而如此小的代价换来的是近乎实机的应用体验,根本没有 WSL 里面那些莫名其妙的破事。而且我还可以随时快照/复原/迁移。而本地本地网络上的 SSH / VNC 体验流畅无比,还要啥自( W )行( S )车( L )?
testcaoy7
2019-07-31 10:39:07 +08:00
WSL2 会不会和 VMware 等虚拟机发生冲突?
yinjy
2019-07-31 10:41:57 +08:00
wsl2 是否像 wsl 那样要一直开着一个 wsl 终端才能用吗?
wly19960911
2019-07-31 10:43:59 +08:00
@yinjy #34 wsl 早就不用开着终端了. 你更新下系统就可以了
photon006
2019-07-31 10:44:16 +08:00
GPU 呢,WSL2 能用宿主机显卡做 machine learning ?
userdhf
2019-07-31 11:01:14 +08:00
安全问题呢?会不会有被黑的可能,然后通过 wsl 在宿主上各种搞?
goreliu
2019-07-31 11:08:44 +08:00
@ungrown 看个人需求吧。
goreliu
2019-07-31 11:09:32 +08:00
@photon006 现在不行。
goreliu
2019-07-31 11:11:26 +08:00
@userdhf 把 /etc/wsl.conf 里的 automount 和 interop 关掉就和普通虚拟机差不多了,不再能访问宿主机。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587642

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX