本文记录使用WSL/WLS2中遇到的问题和处理方法。
之前在WSL体验和WSL2体验两篇文章中说明WSL/WSL2的安装和使用对比,当时由于WSL2的跨OS文件系统性能极差,导致放弃WSL2仍然使用WSL,但由于WSL并没有完整的Linux内核和系统调用,无法支援一些事情,最近尝试同时使用WSL和WSL2,使用WSL编译和调试Zephyr,WSL2做其它事情,目前已经切换完成,这里记录遇到的问题和处理方法。
现状 链接到标题
笔记本的内存从8G升级到16G,由于WSL2使用的是虚拟机,Vmmem用量比较大,如果同时开VSCode和Chrome内存会比较着急,因此进行升级。 目前已经安装了两个WSL的发行版,Ubuntu 18.04和Ubuntu 20.04。将Ubuntu 20.04继续保持为WSL,而Ubuntu 18.04转换为WSL2。
移动WSL位置 链接到标题
两个发行版加上里面的软件包,已经接近5G,预期后面还会再向Ubuntu 18.04安装更多的软件包,C盘告急,所以第一件事是将WSL移动到其它分区上: 下载LxRunOffline: https://github.com/DDoSolitary/LxRunOffline/release,选择msvc版本,例如LxRunOffline-v3.5.0-msvc.zip 解压缩后打开power shell,执行下面命令查看有哪些WSL发行版
.\LxRunOffline.exe l
执行结果
Ubuntu-18.04 Ubuntu-20.04
用LxRunOffline.exe m -n <WSL名称> -d <路径>命令将WSL发行版移动到指定位置,例如我移动到的是F:/wsl
LxRunOffline.exe m -n Ubuntu-18.04 -d F:/wsl/Ubuntu-18.04
LxRunOffline.exe m -n Ubuntu-20.04 -d F:/wsl/Ubuntu-20.04
移动时间比较久。移动完后可以使用下面命令查看移动后的目录
LxRunOffline.exe di -n Ubuntu-18.04
LxRunOffline.exe di -n Ubuntu-20.04
将WSL发行版转换成WSL2 链接到标题
如何启动WSL2请参考WSL2体验,这里我要将Ubuntu 18.04转化为WSL2,先使用下面命令检查发行版
wsl --list --verbose
如下表示发行版还在WSL下
NAME STATE VERSION
* Ubuntu-18.04 Running 1
Ubuntu-20.04 Running 1
使用下面命令转换成WSL2的发行版
wsl --set-version Ubuntu-18.04 2
转换大约要几分钟,转换完再查看发行版,发现会变为
NAME STATE VERSION
* Ubuntu-18.04 Running 2
Ubuntu-20.04 Running 1
这个时候去看F:\wsl下面的目录结构会发现WSL2的镜像已经变成了虚拟硬盘vhdx文件
.
├── Ubuntu-18.04
│ ├── ext4.vhdx
│ ├── fsserver
│ └── temp
└── Ubuntu-20.04
├── fsserver
├── rootfs
└── temp
此时再运行Ubuntu 18.04就已经是WSL2,而运行Ubuntu 20.04是WSL,二者是可以同时运行的。
WSL2问题 链接到标题
文件访问 链接到标题
访问WSL2的文件,在文件夹浏览器的地址栏中输入\\wsl$即可访问WSL2中的文件,为了方便可以将选择Ubuntu 18.04进行映射网络驱动器,将WSL的网络路径映射为一个磁盘分区,之后如果有跨OS的文件操作就会比较方便
无法访问网络 链接到标题
转化了WSL2后进入Ubuntu 18.04执行ifconfig会发现没有网卡,执行ip addr会发现所有的网卡都出于down的状态,使用命令能将网卡叫起来,但重新启动WSL2后又没网卡了,原因是我为了节约C盘空间,将TEMP文件夹移动到其它分区,细节参考https://github.com/microsoft/WSL/issues/5437#issuecomment-657067645 处理方式就是将C盘的TEMP路径软链接到移动后的TEMP路径上,例如我移动后的TEMP文件夹路径是F:\TEMP,在power shell下执行下面命令即可
wsl --shutdown
New-Item -ItemType SymbolicLink -Path $env:USERPROFILE\AppData\Local\Temp -Value "F:\TEMP" -Force