WSL 文件系统访问

Windows 与 Linux 文件系统互访、路径转换和性能优化


📋 目录


Windows 访问 Linux 文件系统

通过文件资源管理器

方法一:使用 \wsl$ 路径

  1. 打开文件资源管理器
  2. 在地址栏输入:\\wsl$
  3. 或输入:\\wsl$\Ubuntu-22.04

路径格式

\\wsl$\<DistroName>\<LinuxPath>

示例

\\wsl$\Ubuntu-22.04\home\username
\\wsl$\Ubuntu-22.04\etc
\\wsl$\Ubuntu-22.04\var\www

方法二:从开始菜单

  1. 在开始菜单搜索 Linux 发行版名称
  2. 右键点击发行版
  3. 选择”在文件资源管理器中打开”

方法三:映射网络驱动器

# 在 PowerShell 中映射网络驱动器
net use Z: \\wsl$\Ubuntu-22.04\home\username

通过命令行

# 在 PowerShell 中访问
cd \\wsl$\Ubuntu-22.04\home\username
 
# 列出文件
dir \\wsl$\Ubuntu-22.04\home\username
 
# 复制文件
copy \\wsl$\Ubuntu-22.04\home\username\file.txt C:\Users\YourUsername\Desktop\

通过 VS Code

# 在 PowerShell 中
code \\wsl$\Ubuntu-22.04\home\username\project
 
# 或在 VS Code 中
# File → Open Folder → 输入 \\wsl$\Ubuntu-22.04\home\username\project

Linux 访问 Windows 文件系统

Windows 驱动器挂载

WSL 自动将 Windows 驱动器挂载到 /mnt/ 目录下。

# 访问 C: 驱动器
cd /mnt/c
 
# 访问 D: 驱动器
cd /mnt/d
 
# 访问用户目录
cd /mnt/c/Users/YourUsername
 
# 列出文件
ls /mnt/c/Users/YourUsername/Desktop

挂载点配置

WSL 自动挂载配置在 /etc/wsl.conf 中:

[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
crossDistro = false

配置选项说明

  • enabled:是否启用自动挂载
  • root:挂载点根目录(默认 /mnt/
  • options:挂载选项
    • metadata:启用文件元数据支持
    • umask=22:目录权限掩码(755)
    • fmask=11:文件权限掩码(644)
  • crossDistro:是否跨发行版共享挂载

自定义挂载点

# 手动挂载(需要 root 权限)
sudo mount -t drvfs C: /mnt/c
 
# 卸载
sudo umount /mnt/c

访问 Windows 文件

# 读取文件
cat /mnt/c/Users/YourUsername/file.txt
 
# 编辑文件
nano /mnt/c/Users/YourUsername/file.txt
code /mnt/c/Users/YourUsername/project
 
# 复制文件
cp /mnt/c/Users/YourUsername/file.txt ~/file.txt
 
# 创建符号链接
ln -s /mnt/c/Users/YourUsername/Projects ~/projects

路径转换

Windows 路径转 Linux 路径

规则

  • 驱动器字母转换为小写
  • 反斜杠转换为正斜杠
  • 冒号移除

示例

C:\Users\Username\file.txt
→ /mnt/c/Users/Username/file.txt

D:\Projects\app
→ /mnt/d/Projects/app

Linux 路径转 Windows 路径

规则

  • /mnt/<drive>/ 转换为 <drive>:\
  • 正斜杠转换为反斜杠

示例

/mnt/c/Users/Username/file.txt
→ C:\Users\Username\file.txt

/home/username/project
→ \\wsl$\Ubuntu-22.04\home\username\project

使用 wslpath 转换

# Linux 路径转 Windows 路径
wslpath -w /home/username/file.txt
# 输出:\\wsl$\Ubuntu-22.04\home\username\file.txt
 
# Windows 路径转 Linux 路径
wslpath "C:\Users\Username\file.txt"
# 输出:/mnt/c/Users/Username/file.txt
 
# 显示 Unix 路径(相对路径)
wslpath -u "C:\Users\Username\file.txt"
# 输出:/mnt/c/Users/Username/file.txt
 
# 显示 Windows 路径(绝对路径)
wslpath -a /home/username
# 输出:\\wsl$\Ubuntu-22.04\home\username

在脚本中使用路径转换

#!/bin/bash
# 获取 Windows 路径
WIN_PATH=$(wslpath -w "$1")
echo "Windows path: $WIN_PATH"
 
# 在 Windows 中执行命令
cmd.exe /c "echo $WIN_PATH"

性能优化

WSL 1 vs WSL 2 文件系统性能

WSL 1

  • Windows 文件系统:性能较好
  • Linux 文件系统:性能较差(大量小文件操作)

WSL 2

  • Windows 文件系统:性能较差(需要通过 9p 协议)
  • Linux 文件系统:性能优秀(ext4 文件系统)

最佳实践

1. 项目文件位置

推荐:将项目文件放在 Linux 文件系统中

# 推荐:Linux 文件系统
/home/username/projects/myapp
 
# 不推荐:Windows 文件系统
/mnt/c/Users/Username/projects/myapp

原因

  • WSL 2 中 Linux 文件系统性能更好
  • 避免文件权限问题
  • 更好的符号链接支持

2. 使用符号链接

# 在 Linux 文件系统中创建指向 Windows 目录的符号链接
ln -s /mnt/c/Users/Username/Documents ~/Documents
 
# 在 Windows 中创建指向 Linux 目录的快捷方式
# 或使用 mklink(需要管理员权限)

3. 避免频繁跨文件系统操作

# 不推荐:频繁在 Windows 和 Linux 文件系统间复制
cp /mnt/c/file.txt ~/file.txt
# 修改文件
cp ~/file.txt /mnt/c/file.txt
 
# 推荐:在 Linux 文件系统中工作
cp ~/file.txt ~/file_backup.txt
# 修改文件
# 完成后一次性复制到 Windows

性能测试

# 测试文件系统性能
# 在 Linux 文件系统中
time for i in {1..1000}; do touch /home/username/test$i; done
 
# 在 Windows 文件系统中
time for i in {1..1000}; do touch /mnt/c/Users/Username/test$i; done

文件权限问题

常见问题

1. 文件权限显示为 777

原因:Windows 文件系统不支持 Linux 文件权限

解决方案

  • /etc/wsl.conf 中配置挂载选项
  • 使用 metadata 选项启用元数据支持
[automount]
options = "metadata,umask=22,fmask=11"

2. 无法执行脚本

原因:文件没有执行权限

解决方案

# 添加执行权限
chmod +x script.sh
 
# 或使用 bash 直接执行
bash script.sh

3. 文件所有者问题

原因:在 Windows 中创建的文件所有者可能不正确

解决方案

# 修改文件所有者
sudo chown username:username file.txt
 
# 递归修改目录
sudo chown -R username:username directory

权限映射

WSL 尝试将 Windows 文件权限映射到 Linux 权限:

  • Windows 只读 → Linux 444555
  • Windows 读写 → Linux 666777
  • Windows 执行 → Linux 755777

处理 Windows 文件权限

# 查看文件权限
ls -l /mnt/c/Users/Username/file.txt
 
# 修改权限(可能不生效,取决于文件系统)
chmod 644 /mnt/c/Users/Username/file.txt
 
# 最佳实践:复制到 Linux 文件系统
cp /mnt/c/Users/Username/file.txt ~/file.txt
chmod 644 ~/file.txt

特殊文件系统操作

符号链接

在 Linux 中创建符号链接

# 创建符号链接
ln -s /mnt/c/Users/Username/Documents ~/Documents
 
# 创建绝对路径符号链接
ln -s /mnt/c/Users/Username/Projects ~/projects
 
# 查看符号链接
ls -l ~/Documents

Windows 符号链接支持

WSL 2 支持 Windows 符号链接,但需要注意:

  • Windows 符号链接在 Linux 中可能显示为普通文件
  • Linux 符号链接在 Windows 中可能无法正确解析

硬链接

# 创建硬链接(仅在同一文件系统内)
ln /mnt/c/file.txt /mnt/c/file_link.txt
 
# 硬链接不能跨文件系统
# 以下命令会失败:
ln /mnt/c/file.txt ~/file_link.txt  # 错误

文件锁定

# Linux 文件系统支持完整的文件锁定
# Windows 文件系统锁定支持有限
 
# 检查文件是否被锁定
lsof /path/to/file

备份与恢复

备份 Linux 文件系统

# 在 PowerShell 中导出发行版
wsl --export Ubuntu-22.04 D:\Backup\ubuntu-22.04-backup.tar

备份特定目录

# 在 WSL 中
tar -czf ~/backup.tar.gz /home/username/projects
 
# 复制到 Windows
cp ~/backup.tar.gz /mnt/c/Users/Username/Desktop/

恢复文件

# 解压备份
tar -xzf backup.tar.gz -C /home/username/
 
# 从 Windows 复制文件
cp /mnt/c/Users/Username/backup/file.txt ~/file.txt

📚 参考资源


返回 WSL 知识体系

WSL 文件系统 路径转换 性能优化