本文记录使用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

参考 链接到标题

https://docs.microsoft.com/zh-cn/windows/wsl/