之前在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发行版1
.\LxRunOffline.exe l
执行结果
Ubuntu-18.04
Ubuntu-20.04
用LxRunOffline.exe m -n <WSL名称> -d <路径>
命令将WSL发行版移动到指定位置,例如我移动到的是F:/wsl1
2LxRunOffline.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
移动时间比较久。移动完后可以使用下面命令查看移动后的目录1
2LxRunOffline.exe di -n Ubuntu-18.04
LxRunOffline.exe di -n Ubuntu-20.04
将WSL发行版转换成WSL2
如何启动WSL2请参考WSL2体验,这里我要将Ubuntu 18.04转化为WSL2,先使用下面命令检查发行版1
wsl --list --verbose
如下表示发行版还在WSL下1
2
3 NAME STATE VERSION
* Ubuntu-18.04 Running 1
Ubuntu-20.04 Running 1
使用下面命令转换成WSL2的发行版1
wsl --set-version Ubuntu-18.04 2
转换大约要几分钟,转换完再查看发行版,发现会变为1
2
3 NAME STATE VERSION
* Ubuntu-18.04 Running 2
Ubuntu-20.04 Running 1
这个时候去看F:\wsl下面的目录结构会发现WSL2的镜像已经变成了虚拟硬盘vhdx文件1
2
3
4
5
6
7
8
9.
├── 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下执行下面命令即可1
2wsl --shutdown
New-Item -ItemType SymbolicLink -Path $env:USERPROFILE\AppData\Local\Temp -Value "F:\TEMP" -Force