WSL踩坑记录

Creative Commons
本作品采用知识共享署名

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

1
.\LxRunOffline.exe l

执行结果

Ubuntu-18.04
Ubuntu-20.04

LxRunOffline.exe m -n <WSL名称> -d <路径>命令将WSL发行版移动到指定位置,例如我移动到的是F:/wsl

1
2
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

移动时间比较久。移动完后可以使用下面命令查看移动后的目录

1
2
LxRunOffline.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
2
wsl --shutdown
New-Item -ItemType SymbolicLink -Path $env:USERPROFILE\AppData\Local\Temp -Value "F:\TEMP" -Force

参考

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