WSL默认不自动挂载Windows磁盘,需配置/etc/wsl.conf启用automount并含metadata选项,再执行wsl --shutdown重启;VSCode需用WSL终端以小写路径(如/mnt/c)启动,且确保locale支持UTF-8。

WSL里为什么看不到Windows盘?
WSL默认不会自动挂载Windows磁盘(比如C:、D:),你执行ls /mnt可能只看到空目录,或报错No such file or directory。这不是VSCode的问题,而是WSL本身的设计:它用/mnt作为Windows分区的挂载点,但需要手动启用或确认挂载状态。
检查是否已挂载:运行ls /mnt/c。如果提示Permission denied或直接不存在,说明要么没挂载,要么挂载时禁用了元数据支持——后者会导致后续所有文件操作权限异常。
- 确保WSL配置启用了自动挂载:编辑
/etc/wsl.conf(若不存在则新建),加入以下内容:
[automount] enabled = true options = "metadata,uid=1000,gid=1000,umask=22,fmask=11"
- 改完必须退出WSL并重启:在PowerShell中运行
wsl --shutdown,再重新打开终端或VSCode - 重启后
ls /mnt/c应能列出WindowsC:盘内容,且ls -l /mnt/c/Users显示的UID/GID应匹配你的Linux用户(通常是1000)
VSCode Remote-WSL打不开/mnt/c下的项目?
即使/mnt/c能正常访问,VSCode Remote-WSL仍可能拒绝打开路径,错误提示类似Unable to resolve non-existing folder或卡在“Opening folder…”。根本原因有两个:一是VSCode服务端进程未以当前用户身份启动(尤其在从Windows快捷方式启动时),二是路径大小写敏感导致解析失败(如/mnt/C实际无效,必须是小写/mnt/c)。
- 永远用WSL终端启动VSCode:
code /mnt/c/Users/xxx/project,不要从Windows资源管理器右键“Open with Code” - 确认路径全为小写:
/mnt/c✅,/mnt/C❌;WSL对/mnt下盘符大小写敏感 - 如果项目含中文路径,确保WSL的locale支持UTF-8(
locale | grep UTF-8,否则可能乱码或无法识别路径)
Permission denied写不了Windows文件?
最典型现象:你在/mnt/c/Users/xxx/file.txt上执行echo "test" > file.txt报错Permission denied,但cat file.txt却能读。这是WSL元数据(metadata)未启用导致的——Windows NTFS不提供Linux所需的UID/GID/Mode信息,WSL默认按只读+固定权限模拟,关掉metadata就彻底失去写权限。
- 回到
/etc/wsl.conf,确认options中包含metadata(不是noatime或dev等替代项) - 禁用Windows Defender实时保护(临时):它常锁住刚创建的文件,导致
touch后立即报错Operation not permitted - 避免在
/mnt/c/Windows、/mnt/c/Program Files等系统目录下直接编辑——即使有权限,也容易触发UAC或防病毒拦截
为什么改了wsl.conf还是没用?
常见误区是修改后没真正重启WSL内核。仅关闭终端窗口或VSCode不生效,wsl --shutdown必须执行,且要确认没有后台WSL进程残留。另一个隐藏坑是:Windows 11 22H2+默认启用“WSLg”,它会干扰挂载行为,尤其是当你同时装了多个WSL发行版(Ubuntu、Debian等)时,配置可能只生效于默认发行版。
- 运行
wsl -l -v查看当前发行版列表和状态,用wsl -t Ubuntu-22.04(替换为你实际发行版名)单独终止 - 检查
/etc/wsl.conf是否在正确的发行版里——每个WSL发行版都有独立的/etc,不能共用 - 如果仍失败,临时用
sudo mount -t drvfs C: /mnt/c -o metadata,uid=1000,gid=1000手动挂载验证配置项是否被识别
跨系统路径的本质是drvfs驱动桥接,不是普通挂载。一旦metadata开关没对齐,后面所有编辑、Git操作、甚至Node.js fs.writeFileSync都会静默失败或权限错乱——这点比路径拼写错误更难排查。


















