wsl 是否已经足够完善?

2020-04-05 12:33:15 +08:00
 windyland

很早以前就听说了微软家的 WSL 技术,但是因为对新技术的稳定性抱怀疑态度,所以昨天才用上了基于 WSL 的 Ubnutu,谷歌找了一圈发现很少地方有谈到二代 WSL 的各种坑,由于体验过于愉快(相较于 vmware ),所以萌生了转移开发环境的想法,于是过来问一问大伙 2020 年的 WSL 是否已经足够成熟?还有哪些使用时会遇到的坑?

6974 次点击
所在节点    问与答
39 条回复
windyland
2020-04-05 21:36:38 +08:00
@Remember 我就是用惯了 VMware,但是一直苦于虚拟机的各种不便( IP 配置,文件共享,内存分配),所以才在体验 wsl 之后赞不绝口的✧٩(ˊωˋ*)و✧
sunhk25
2020-04-05 21:38:39 +08:00
wsl 里用 Ubuntu 搭建 Nginx 服务器可行吗
kindjeff
2020-04-05 21:39:12 +08:00
使用 MacOS 三年的 vim 用户,因为疫情已经使用 wsl2+Extraterm 工作两个月了,真香。
以前的各种乱七八糟小毛病都解决的七七八八,差不多完全可以用来工作了。

还存在的问题:
- 快捷键。比如 terminal 和其他应用里的复制粘贴按键就不一样,用 ahk 调过也没搞成功( Linux 同样有这个问题)
- 内存泄漏。写个.wslconfig 限制一下最大内存可以一次性解决(最吃内存的通常是几个 docker 容器,MacOS 同样要限制 docker-machine 的最大内存,所以影响不大)
- 每次重启完:docker 需要手动启动、hosts 会被复原、sysctl 改的东西需要重新改。我写了一个 start.sh 每次重启完电脑打开 terminal 都手动运行一下。
- 把默认 shell 设置成 fish 时,Extraterm 会有毛病。不过可以配置 terminal 启动 shell 和 tmux 的启动 shell 来曲线实现默认 shell 的效果。
kindjeff
2020-04-05 21:43:08 +08:00
还有一个网络问题,我自己配置透明代理在网关层所以无所谓。问题就是 wsl2 外面启动的应用在 wsl2 里面不能用 127.0.0.1 访问到(因为是虚拟机),所以如果想在 wsl2 里面使用运行在宿主机上的代理工具,比如 clash,需要配置 clash 允许 LAN 访问,然后在 wsl2 里设置 proxy 为宿主机 LAN 地址(比如 192.168 )。
windyland
2020-04-05 21:46:54 +08:00
@kindjeff 非常感谢您详尽的回复,让我少踩一些坑(跑题:扇贝英语全家桶很棒)
ErrorMan
2020-04-05 22:10:00 +08:00
@kindjeff 我有一些 WSL 1 下的经验,可能 WSL 2 下也可以用,docker 类的服务可以通过在 Widnwos 的启动文件夹里放置快捷方式来实现开机自动启动服务,启动文件夹运行 ”shell:startup" 可以直达; hosts 是每次系统启动时从 windows 端直接复制生成的,所以需要定制 hosts 的时候去修改 windows 那边的 hosts 就可以生效。
ErrorMan
2020-04-05 22:10:40 +08:00
@ErrorMan 修正:Widnwos -> Windows
luzemin
2020-04-05 22:14:36 +08:00
最近尝试 WSL2+.NET Core+Docker 的尝试,https://www.cnblogs.com/talentzemin/p/12581028.html
hwdef
2020-04-05 23:00:57 +08:00
wsl1 本身 IO 性能太差。wsl2 与主机的 IO 太差,wsl2 的网络是个问题,不像 wsl1 那么方便。
systemcall
2020-04-06 00:23:33 +08:00
@Remember hyper-v 装 ubuntu 点几下就行了,微软自己搞的定制版虚拟机启动快不少,沙盒和应用程序防护也比自己搭的方便吧。可惜不能像以前那样和 win32 交互了
mooyo
2020-04-06 02:11:37 +08:00
目前从 linux 迁移到了 wsl2 以下问题需要注意
win 关闭快速启动,否则 localhost 转发会偶尔出现问题
不要跨系统 io,效率非常低。
vscode remote 是个好东西。
使用 genie 解决 systemd 的问题。
通过开机脚本解决自启动问题。
localhost 转发不是对所有场景都生效,原因未知。
ZZSZZSZZS
2020-04-06 10:39:45 +08:00
@mooyo 我这迁移到了 wsl2,快速启动工作正常,应该是微软的 bug,之前我把 Windows defender 内核防护打开后也出现过快速启动无法运行的情况,后来重装系统了快速启动就又有了
Osk
2020-04-06 10:45:53 +08:00
我可以说有点鸡肋吗。。。

wsl1:io 感人,特别是 npm 什么的来一个,会慢到怀疑人生。
wsl2:hyper-v 了,rootfs 是 vhdx 了,io 大大提升了,但和主机文件系统交互变成 9pfs 了,9p 也更慢了,这是我 kvm+9p 的体验:/www.v2ex.com/t/656569


另外,wsl2 和其他 hypervisor 冲突也很烦。wsl2 有时莫名其妙的占用大量内存,即使没有启动 wsl2.
既然都是虚拟机,那我为何不自己开个虚拟机呢?除了没有主机文件系统直通只好用 smb 外,其它功能暂时用不上。而且自己的虚拟机 **不用焦虑重装 Windows 后我如何导入之前的 wsl 环境!!**


之前开玩笑说 wsl 我是用来算 hash 的,被喷了,然而事实就是,wsl 我用了后,最终还是起了自己的虚拟机干活,wsl 在我这里是作为命令行的补充。所以目前还是 wsl1,因为 9p 的慢和 wsl2 吃内存我无法接受,反正做开发等工作是在自己的虚拟机里面的,无所谓了,而且自己的虚拟机在需要时我还能直接重启切换成实体机启动,获得更好的性能和直接的硬件访问。


对于我个人来说:做 wsl2 还不如把 wsl2 的 9pfs 等功能移植到 hyper-v ( wsl2 底层本来就是 hyper-v ),hyper-v 本身也有快速创建 guest 的功能,易用性方面也不会差。另外,我个人使用 linux 时经常需要直接访问 usb 硬件,hyper-v 也好,wsl2 也好,都不支持。。。
ZZSZZSZZS
2020-04-06 10:46:38 +08:00
wsl2 网络有大问题,首先是没有双向 localhost 映射,wsl 里不能通过 localhost 访问 Windows,另外无法用过局域网连接到 wsl 里的端口,必须手动添加端口转发啥的,最后是我的电脑上 hyperv 的 dns 服务一直有问题,用 dhcp 出来的 dns 服务器上不了网,需要手动改 dns,这个不仅是 wsl 这样,所有用了 hyperv 的东西都这样,有可能是和 Windows docker 冲突了,最后 hyperv 的虚拟交换机偶尔会 dhcp 失败,这个时候只需要重置网络就好了。
ZZSZZSZZS
2020-04-06 10:51:56 +08:00
wsl2 还是有很多不错的地方的,比如启动很快几乎感觉不到,双向文件共享,可以在 wsl 里运行 Windows 的程序等等,io 比 wsl1 极大提升了(除 /mnt ),有了内核,有了 ext4,终于可以愉快的搞交叉编译了,
Plumes
2020-04-06 13:36:43 +08:00
跨系统 io 的问题还是没有解决,npm run watch 很痛苦
shunf4
2020-04-06 19:07:24 +08:00
WSL1 真的不太行,我自己在做一些比较高频的 IO 操作比如 rsync 、大仓库 git submodule update 的时候经常会卡住,issue https://github.com/microsoft/WSL/issues/2138 里提到了这个问题并且还没解决。

然后目前 issue 里提到的最好的 workaround 是用 AutoHotkey 自动时不时调整下窗口大小,这样就能给相关的本不该睡得进程送一个 SIGWINCH 把它唤醒。太蠢了
LANB0
2020-05-24 09:30:36 +08:00
你们都没遇到过 wsl2 内存一直增长的问题? 2004 版本,8G 内存编译 openwrt,wsl 的占用能达到 6G,停止编译还不会把内存归还宿主机。看 GitHub 说是早已经解决了,实际用配置文件限制内存会必现蓝屏
windyland
2020-05-24 09:43:56 +08:00
@LANB0 openwrt 编译我用 github action,跑编译还真不敢在 wsl 里折腾,能跑 ide 我就心满意足了

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

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

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

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

© 2021 V2EX