笔者这两天将WSL1转换为了WSL2,一路上遇到了些问题,思前虑后认为应当整理总结以飨读者。我遇到的问题一览:
建议在阅读本文前,可以先参考微软官方的FAQ
本文部分参见了这篇文章(WSL1全面使用指南)当中有讲到怎么安装WSL,介绍了很Imba的WSL管理工具LxRunOffline(下载直连),以及非常有必要的更换软件源,和可选的设置中文环境等。大家可以参考看看。
笔者计算机水平很菜,都是业余瞎摆弄,如有疏漏和错误之处,还请读者积极指出,以帮助大家进步!
环境配置笔者建议将Windows版本升级到2004,同时将VMware升级到15.5.5。因为在这样的版本条件下,VMware兼容Hyper-V,即实现了VMware与Docker / WSL2的兼容。这件事情很酷。
将Windows升级到2004的版本号后,可以在命令行cmd(或者powershell)中执行wsl --set-version [镜像名称] [版本号] 命令:
C:\WINDOWS\system32>wsl --set-version Ubuntu 2
Conversion in progress, this may take a few minutes...
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
The distribution is already the requested version.
即可将该WSL1转换为WSL2。
在转换的过程中,可能会遇到一些问题:
顺利完成转换WSL2后,你可能还会遇到一些问题,比如怎么占用那么大内存,怎么安装图形界面,怎么使用代理等。WSL2和WSL1不同,WSL2是完整的虚拟机,其不能和Windows共享IP,所以设置Xserver和代理时会有区别。
问题与解决本文建立在WSL1已经顺利配置好的基础上,再遇到的WSL2的问题。故对最基础的WSL1的问题没有怎么提及,具体可以参见前面贴出的WSL全面使用指南。
WSL2不会自动释放内存的BUG已经在windows更新后修复了,故此条可不看
参考网站:用 wslconfig 配置全局选项
在Users\用户名路径下(%UserProfile%)创建文件.wslconfig,
并配置内容为:
[wsl2]
memory=4GB
swap=0
即可限定WSL2使用的内存上限,同样可以限定使用的CPU。注意,这个配置文件是针对宿主机上所有的WSL2的。
参考网站:关于使用WSL2出现“参考的对象类型不支持尝试的操作”的解决方法。
临时解决方案:
以管理员身份运行cmd,并执行命令
netsh winsock reset
然后重启计算机即可。
如何以管理员身份运行CMD?参照:
长期解决方案:
下载NoLsp工具(需要****才能下载);热心网友提供的(onedrive链接(某度链接翻车了))然后以管理员身份启动CMD,并执行
NoLsp.exe C:\windows\system32\wsl.exe
注意下载的NoLsp位置和WSL的位置
参考文章:win10使用WSL 2运行Docker Desktop,运行文件从C盘迁移到其他目录
既然WSL2占用C盘空间过大, 那么可以想办法将之迁移到别的盘。注意如果迁移到HDD机械硬盘,WSL2的启动速度会降速到2s才能打开。
这个地方分为两部分,即分开迁移WSL2和Docker。(没在Win10安装Docker Destop的可忽略后者)
建议使用LxRunOffline.exe(下载直链)迁移WSL2(一键迁移,很方便)
迁移方法:
在有LxRunOffline的路径下,使用cmd或者别的WSL运行LxRunOffline(这里用的是cmd),输入指令:
LxRunOffline move -n [待迁移WSL的名字] -d [目标路径]
然后等一会即可。
不是所有软件所有指令都可以使用代理,笔者不知道别的办法,自己发现可以用curl测试是否代理成功。
这里有三步走:
关于1.打开“允许局域网的连接”,各个代理软件客户端都有这个功能,但放的位置不尽相同,需要自己找一找。
关于2,设置防火墙放行:
为了待会方便,这里顺便把Xserver也放行:
如果用的是VcXsrv,那就把对应的也打开就好了
现在开始第 3.设置WSL2,使之可以代理。
WSL2不像WSL1,共享Windows的IP,所以不能直接用localhost,而是要先找到对于WSL2而言Win10的IP是多少。可以通过以下命令看到:
cat /etc/resolv.conf
而且…这个IP经常变,所以应当让它被自动的设置好。可以执行一条命令,并将该命令加入到~/.bashrc中,以实现每次启动终端时自动获取宿主机IP:
# echo host_ip=$"(cat /etc/resolv.conf |grep \"nameserver\" |cut -f 2 -d \" \")" >>~/.bashrc # 这条指令有时会失效,请使用下面这条。
# 上面注释掉的指令有时会失效,建议使用下面这条。下面懒得换图了,也以这里为准
echo host_ip=$(cat /etc/resolv.conf | grep -o -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}") >>~/.bashrc
此外,再添加一个脚本(笔者命名为 setproxy)实现控制是否设置代理。根据代理的种类不同,这里需要写的代码也不同:
#!/bin/bash
export ALL_PROXY=socks5://$host_ip:你的端口
# 注意,如果你使用的不是socks,而是http或者https就设置成对应的。比如:
# export ALL_PROXY=http://$host_ip:你的端口
# export ALL_PROXY=https://$host_ip:你的端口
将这个脚本放到~/目录下:
echo "export ALL_PROXY=socks5://$host_ip:你的端口" > ~/.setproxy
并设置快捷方式到~/.bashrc中,使得之后可以直接调用命令setproxy便自动执行这个脚本实现代理。
echo "alias setproxy=source ~/.setproxy" >> ~/.bashrc
最终实现的效果如下:
在~/.路径下有文件.setproxy,其内容为:
给~/.bashrc增加的两行:
# 这里就是懒得换图的地方,下面的图示“1”的部分应该是下面这段代码
host_ip=$(cat /etc/resolv.conf | grep -o -E "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}")
设置好后,source ~/.bashrc,即可测试是否使用上了代理:
注:笔者在使用VcXsrv
4步走:
echo “export DISPLAY=$host_ip:0.0” >> ~/.bashrc
然后source ~/.bashrc刷新一下就好了,输入xeyes测试一波:
我猜是这样的,WSL1与其说是Linux系统,不如说是一个跑在Windows上的软件,所以在其执行和调用Windows的东西就非常快。而WSL2是一个完整的虚拟机,要想访问Windows的东西就比较麻烦,需要绕远路,故会比较慢。
所以如果想要WSL2的运行速度变快,就可以把需要处理的东西先手动拷贝到WSL2的本地文件夹下,然后再处理就好了。
关于如何可视化访问WSL2的文件:使用Windows的文件管理器explorer.exe就好
参考文章:基于WSL2 的 Docker Desktop 启动时 Failed to set version to docker-desktop: exit code: -1的解决方法
在cmd中执行指令:
netsh winsock reset
即可
这又需要用到LxRunOffline.exe工具了。
首先从这里下载Linux系统镜像,比如Ubuntu18.04这种。下载好后解压缩,手动将解压出的所需版本的【distro.appx】修改后缀名为.zip,并再次解压缩到任意路径,然后进入该文件夹。使用LxRunOffline工具选中install.tar.gz
:根据提示即可安装
找到root ALL=(ALL:ALL) ALL
,并在下面追加
# User privilege specification
root ALL=(ALL:ALL) ALL
wsl2 ALL=(ALL:ALL) ALL # 加入管理员权限
wsl2 ALL=(ALL) NOPASSWD: ALL # 无密码切换为管理员
先查看需要默认登陆名的ID,ID 登陆名
LxRunOffline.exe su -n 【WSL的名字】 -v 【上一步看到的UID】
可以直接在 ~/.bashrc 中添加
# 可以查看常规安装的 WSL 中的PATH `echo $PATH`,直接复制过来就行
PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/mnt/c/ProgramData/Anaconda3/Scripts:/mnt/c/Program Files (x86)/Common Files/Intel/Shared Libraries/redist/intel64/compiler:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Windows/System32/OpenSSH/:/mnt/c/Program Files/dotnet/:/mnt/c/myApplication/tools/command/ffmpeg/bin:/mnt/c/myApplication/tools/command/mingw64/bin:/mnt/c/Users/mage/AppData/Local/Programs/Microsoft VS Code/bin:/snap/bin"
参考sudo apt-get install libz1:i386的github答疑
在WSL中执行指令:
dpkg --add-architecture i386 && apt-get update
即可使用apt-get来安装32位的软件了,比如各种i386