#wsl #ubuntu #nas #mount ## 背景 - **环境**: Windows 11 + WSL2 (Ubuntu 24) - **硬件**: Lenovo ThinkBook 16, Synology DS718 NAS - **目标**: 在 Ubuntu 中访问 NAS 上的 `/volume1/music` 共享文件夹 - **Windows 路径**: `\\192.168.3.17\music` ## 踩过的坑 ### 1. CIFS 方案失败 ❌ #### 尝试方法 ```bash sudo apt install cifs-utils sudo mkdir -p /mnt/nas-music sudo mount -t cifs //192.168.3.17/music /mnt/nas-music -o username=shenwei,password=your_password ``` #### 错误信息 ``` mount error(95): Operation not supported ``` #### 原因分析 - 虽然内核支持 CIFS (`grep -i cifs /proc/filesystems` 有输出) - 但 WSL2 内核被配置为禁止旧 SMB 版本 - dmesg 显示: `vers=2.0 mount not permitted when legacy dialects disabled` - Synology NAS 只支持 SMB 2.0 及更低版本,与 WSL2 不兼容 #### 相关错误日志 ``` CIFS: VFS: \\192.168.3.17 Dialect not supported by server CIFS: VFS: vers=2.0 mount not permitted when legacy dialects disabled ``` ### 2. SSHFS 方案问题 ⚠️ #### 尝试方法 ```bash sudo apt install sshfs sudo sshfs shenwei@192.168.3.17:/volume1/music /mnt/nas-music -o allow_other ``` #### 错误信息 ``` read: Connection reset by peer ``` #### 原因 可能是 Synology SSH 配置的限制或 sshfs 参数兼容性问题 #### 建议 如果 SSH 能连接但 sshfs 有问题,可尝试: - 用密钥认证而不是密码 - 调整参数: `-o reconnect,ServerAliveInterval=15` - 但不如直接用 drvfs 稳定 --- ## ✅ 最终成功方案:在 Windows 挂载后,WSL2 中访问 ### 第 1 步:在 Windows 中挂载 NAS(已完成) PowerShell (管理员): ```powershell net use Z: \\192.168.3.17\music /user:shenwei your_password ``` 验证: ```powershell dir Z:\ ``` ### 第 2 步:在 WSL2 Ubuntu 中挂载 Windows 驱动器 创建挂载点: ```bash sudo mkdir -p /mnt/z ``` 挂载 Z: 驱动器: ```bash sudo mount -t drvfs Z: /mnt/z ``` 验证: ```bash ls /mnt/z/test ``` 输出示例: ``` 20260815 @eaDir albums new test 另外处理 张国荣音乐合集1978-2007 140CD FLAC 英文经典 ``` ### 第 3 步:永久自动挂载(可选) 编辑 `/etc/fstab`: ```bash sudo nano /etc/fstab ``` 在末尾添加: ``` Z: /mnt/z drvfs defaults 0 0 ``` 保存 (Ctrl+O → Enter → Ctrl+X) 测试: ```bash sudo mount -a ``` 以后每次启动 WSL2,Z: 驱动器会自动挂载到 `/mnt/z` --- ## 使用示例 ### 在 Python 中访问 NAS 文件 ```python import os from pathlib import Path # NAS 路径 nas_music_path = Path("/mnt/z") # 列出所有目录 for item in nas_music_path.iterdir(): print(item.name) # 处理音乐文件 for flac_file in nas_music_path.glob("**/*.flac"): print(f"处理: {flac_file}") ``` ### 在 Bash 中访问 NAS 文件 ```bash # 列出文件 ls /mnt/z/albums # 复制文件 cp /mnt/z/albums/artist/album.flac /home/user/music/ # 批量处理 for file in /mnt/z/**/*.flac; do echo "处理: $file" done ``` ### 在 Docker 容器中使用 在 `docker-compose.yml` 中挂载: ```yaml volumes: - /mnt/z:/nas-music:ro ``` 容器内访问: ```bash ls /nas-music/albums ``` --- ## 性能和稳定性对比 |方案|稳定性|性能|易用性|备注| |---|---|---|---|---| |CIFS|❌|-|-|WSL2 不支持低版本 SMB| |SSHFS|⚠️|中|中|可能有兼容性问题| |**drvfs**|✅|快|✅|**推荐方案**| --- ## 故障排查 ### 问题 1: 挂载点不存在 ```bash # 解决 sudo mkdir -p /mnt/z ``` ### 问题 2: 权限不足 ```bash # 加 sudo sudo mount -t drvfs Z: /mnt/z ``` ### 问题 3: Z: 驱动器在 Windows 中不可用 ```powershell # Windows PowerShell (管理员) 中重新挂载 net use Z: \\192.168.3.17\music /user:shenwei your_password ``` ### 问题 4: WSL2 中 Z: 驱动器挂载失败 ```bash # 查看 dmesg 日志 sudo dmesg | tail -20 # 尝试卸载后重新挂载 sudo umount /mnt/z sudo mount -t drvfs Z: /mnt/z ``` --- ## 总结 **最简单和最稳定的方案**: 1. **Windows 中**: `net use Z: \\192.168.3.17\music` 2. **WSL2 中**: `sudo mount -t drvfs Z: /mnt/z` 3. **Ubuntu 中访问**: `/mnt/z/test` 不需要配置复杂的 CIFS 或 SSHFS,直接利用 Windows 已有的网络共享,通过 WSL2 的 drvfs 驱动访问,**稳定、快速、可靠**。 --- ## 相关文件路径 - Windows 网络路径: `\\192.168.3.17\music` - Windows 驱动器: `Z:\` - WSL2 挂载点: `/mnt/z` - 音乐文件实际位置: `/mnt/z/albums/...` --- **更新时间**: 2026-08-16 **验证环境**: WSL2 Ubuntu 24, Synology DS718