LOADING

加载过慢请开启缓存 浏览器默认开启

WSL入坑记

2022/9/24 linux

起因是最终还是受不了Linux生态过于薄弱,又不想用ms-Windows做开发,遂想到了这个,然后开始尝试,还是踩了不少坑,总结如下:


首先,我选择的Arch发行版,因为我之前一直用的manjaro,然鹅manjaro的wsl貌似很久没维护了,所以我就干脆使用Arch了。
仓库地址:https://github.com/yuk7/ArchWSL ,我使用的是安装方法1。wsl版本是wsl2。

关于Error 0x80370102

开始安装,首先要安装以下三条:

或者也可以在powershell里开启:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

然而即使这样做了,启动时仍然报错80370102,搜遍全网,最后在知乎这里找到了答案,就是在上述做完后,再键入一条:

bcdedit /set hypervisorlaunchtype auto

就没问题了。

代理配置

因为在wsl中,随着宿主机的重启,wsl和宿主机的IP全都会变,这就会造成很大的麻烦,还好wsl里有文件能自动更新IP,于是设置代理如下:

/etc/profile[//]: # (这里配置的环境变量全局可见,永久有效)中添加以下语句:

host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:20170"
export all_proxy="http://$host_ip:20170"

端口根据宿主机配置的来,我Windows为此换成了clash,也为的是它能智能的分流,clash中要把“allow lan”打开。此时全局都可以走代理了,而对于chrome这类不走all_proxy的,可以在其启动参数后增加--proxy-server=$all_proxy来走代理。

GUI

微软搞了个wslg,可以很方便地运行GUI程序,甚至还给wsl搞了显卡驱动,但很可惜,我折腾了半天,显卡是没有驱动上的。

首先将wsl更新到最新版本,然后把显卡驱动也更新到最新。然后安一堆诸如xorg,ffmpeg,libGL等等一堆库后,就神奇的跑起来了,开始菜单也能看到Linux程序了。

高分屏缩放

不绕弯了,放上最干货的回答:https://zhuanlan.zhihu.com/p/424930447

小声bb:为什么最后找到的解决方案都是知乎上的🥲「悲」

在家目录下新建文件:~/.Xresource,然后输入:

Xft.dpi: 175

上面填入缩放大小,175%就填175,保存退出。然后在/etc/profile后追加:

xrdb -merge ~/.Xresource

就大功告成了!这里是相当于直接调整了X11的缩放,是最完全的!

指纹sudo

在Windows下最大的好处是可以使用指纹来验证sudo,不用每次都输密码了,这绝对是一个巨大优势

仓库地址:https://github.com/nullpo-head/WSL-Hello-sudo

按照教程一步步来,其实很简单。最后因为我的不是Ubuntu,需要手动添加,需在/etc/pam.d/sudo首部追加:

auth sufficient pam_wsl_hello.so

即可。

网络转发

由于wsl2是基于hyperV的,就是一个虚拟机,所以网络肯定是和主机隔开的,我们查看网卡也可以发现多了一块wsl的虚拟网卡,那么问题来了,假如在wsl里serve,外部怎么访问到呢?微软已经贴心的做了转发,本机访问localhost:端口会自动访问到wsl的serve,但是如果想要局域网访问,那还得费一番功夫,因为每次IP都会变,网上貌似有自动脚本,但是考虑到要向局域网暴露的时候不多(顶多传个文件),直接放在.bat里执行就行,内容如下:(都要以管理员运行)

打开转发:

netsh interface portproxy add v4tov4 listenport=要暴露的端口 connectaddress=wsl的IP地址 connectport=wsl的端口 listenaddress=* protocol=tcp

另外,需要关闭防火墙,局域网才能访问!


关闭转发:(注意,上述打开转发执行后,会一直开着,重启也会继续,所以最好用完就关闭)

netsh interface portproxy delete v4tov4 listenport=要关闭的已暴露端口 protocol=tcp

Systemd与Docker

wsl2一直不支持systemd,这导致诸如docker守护进程就无法启动,然而在我安装的前两天,Win11的22H2更新带来了systemd的支持:https://github.com/microsoft/WSL/releases/tag/0.67.6https://aka.ms/wslsystemd

打开方法:更新后配置/etc/wsl.conf,在其后追加:

[boot]
systemd=true

然后wsl.exe --shutdown一波,差不多应该就可以了。我尝逝了一下,结果docker是好了,wslg炸了。wslg的issue里也有多人反馈,哎……看来还是不要追新。不得已,把上述配置删掉,wslg立刻就恢复了,幸好。评论区以及有人提出,相信过几天就应该能修好(毕竟是pre-release)

不使用systemd的情况下,要使用docker就只能每次开个终端手动执行sudo dockerd啰。

后记

折腾了这么两天,中途都有点怀疑这样做的意义,也一直在比较wsl和纯Linux的异同。最后还是决定入wsl弃实机Linux,首先是Windows装wsl比Linux装Windows虚拟机绝对是要强的多的。其次Windows的软件生态是不可忽视的一环,比如MIUI+之类的。另外,wsl备份挺方便的,一键备份无忧。wsl的两个系统文件互通做得很不错。

另外今早我进行了Windows的续航测试,不插电轻度使用从早上9点用到中午12点半共3个半小时掉了60%的电,这基本上是两个大节的时间,这样是完全能接受的,所以说也没有什么理由不使用win+wsl了。唯一的不足可能是Windows的minecraft的帧率为何低于Linux呢?可以留着Linux环境玩MC Java版用。


后续更新:10月就弃了WSL了,Linux实体机还是性能更高,更适合当开发系统。Windows还是留着当游戏启动器罢!「悲」