背景
用 WSL2 的人应该都遇到过这种情况:代码放在 Windows 的盘符下(方便 VS Code 这类 IDE 直接打开),但在 WSL 里跑 npm install、git status、node_modules 遍历,动辄就是十几秒起步。
原因在于 WSL2 跨系统访问 Windows 目录时,默认走的是 9P 协议。9P 来自 Plan 9,WSL2 把它用作 Windows 和 Linux 之间的文件桥接,设计上并没有针对"高频小文件"这个场景做优化。而现代工程的构建过程,恰恰就是小文件密集型的。
WSL3 开始支持使用 virtiofs 来接管这部分 I/O。virtiofs 是 virtio 协议族里专门为共享目录设计的文件系统,数据通过虚拟机的 virtio 通道传递,省掉了 9P 那套路径转换和额外的内存拷贝。微软在 WSL Container 公测公告里给出的说法是 “A new default file system for WSL container: ‘virtiofs’ that makes Windows file access 2x faster”,即 Windows 文件访问速度翻倍。
需要说明的是,这个"翻倍"是官方在特定负载下测得的口径,不是所有场景的保证。在小文件密集的负载上提升相当可观,大文件顺序读写则改善有限。
本文记录一下怎么在 WSL3 中设置开启 virtiofs。
1. 确认 WSL 版本
virtiofs 需要足够新的 WSL。在 PowerShell 或 CMD 里执行:
wsl --version
---
WSL 版本: 3.0.3.0
内核版本: 6.18.54.1-1
WSLg 版本: 1.0.79
MSRDC 版本: 1.2.7391
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows 版本: 10.0.26300.9550
看第一行的 WSL 版本,在 3.0.0 以上才会默认走 virtiofs。低于这个版本的,即使配置对了也还是 9P。
2. 升级到 3.0 以上
如果版本不够,执行升级:
# 普通升级(走应用商店 / 预装渠道)
wsl --update
# 绕过商店,直接从网络下载最新的内核与组件
wsl --update --web-download
如果升级一直失败,则需要自己想办法开启网络代理后再试。或者去 github 下载 WSL 3 的安装包,手动安装。
升级后可以先进入 WSL 开启查看下当前的挂载协议
mount | grep -E 'virtiofs|9p'
---
drivers on /usr/lib/wsl/drivers type 9p (ro,nosuid,nodev,noatime,aname=drivers;fmask=222;dmask=222,cache=0x5,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
C:\ on /mnt/c type 9p (rw,noatime,aname=drvfs;path=C:\;uid=1000;gid=1000;symlinkroot=/mnt/,cache=0x5,access=client,msize=65536,trans=fd,rfd=6,wfd=6)
可以看到当前 Windows 磁盘的默认挂载协议是 9P。
3. 在 .wslconfig 中开启 virtiofs
修改 Windows 用户目录下的 .wslconfig 文件(就是 C:\Users\<你的用户名>\.wslconfig)。
在 cmd 里执行下面这行,记事本会直接创建并打开该文件:
notepad %USERPROFILE%\.wslconfig
写入以下内容:
[wsl2]
virtiofs=true
这个选项控制了 virtiofs 是否启用。改动后,需通过 wsl --shutdown 完全关闭 WSL 以使其生效。
4. 验证
再次进入 WSL 执行 mount 查看挂载状态,可以看到 Windows 盘符已经使用 virtiofs 协议挂载成功。
mount | grep -E 'virtiofs|9p'
---
drivers on /usr/lib/wsl/drivers type 9p (ro,nosuid,nodev,noatime,aname=drivers;fmask=222;dmask=222,cache=0x5,access=client,msize=65536,trans=fd,rfd=8,wfd=8)
drvfs on /run/wsl/virtiofs-mounts/drvfs type virtiofs (rw,relatime)
drvfs on /mnt/c type virtiofs (rw,noatime)
5. 性能提升说明
virtiofs 改变的是 Windows 盘符挂载点的性能,你自己的发行版根文件系统(ext4/btrfs 存在 vhdx 里)完全不受影响。所以体感差别主要出现在代码放在 /mnt/c 或 /mnt/d这些目录下。
提升明显的是这类负载:
npm install/pnpm install—— 几万个文件写入git status/git add—— 需要扫描整个工作区和索引- 依赖树的遍历,比如
dotnet restore、cargo build - 编辑器索引,
node_modules、bin、target等目录的递归扫描
提升有限的是:
- 少量大文件的顺序读写,比如拷贝一个 iso、一个大的二进制包
- 编译器的中间产物,如果本身就集中在少量文件上