windows电脑上用linux系统操作cuda?wsl/wsl2疑惑一文通通搞懂

WSL的本质与作用域

WSL (Windows Subsystem for Linux) 本质上是 Windows 操作系统的一个子系统组件,而不仅仅是一个普通的程序。它是由微软开发的一个完整的系统层级组件,能够让 Windows 10 和 Windows 11 原生运行 Linux 二进制可执行文件。

核心特性:

  1. 系统层级集成:WSL 直接集成在 Windows 内核中,通过一个特殊的系统组件(称为 WSL2 驱动程序)来实现 Linux 内核的功能。
  2. 虚拟化技术:WSL2 使用 Hyper-V 虚拟化技术,但它比传统虚拟机更轻量级和更紧密地集成到 Windows 中。

WSL1 与 WSL2 的区别

WSL1 和 WSL2 是两个不同的架构版本,它们在实现方式和性能特点上有显著差异:

对比项WSL1WSL2
架构实现使用转译层将 Linux 系统调用转换为 Windows 系统调用使用轻量级虚拟机,运行完整的 Linux 内核
内核类型不包含真正的 Linux 内核包含完整的 Linux 内核
虚拟化技术不使用虚拟化基于 Hyper-V 技术
系统性能- 启动更快
- 内存占用更少
- Windows 文件系统访问更快
- Linux 文件系统性能更好
- 系统调用兼容性更好
- I/O 密集操作更快
功能支持- 基本的 Linux 功能
- 有限的系统调用兼容性
- 完整的 Linux 内核功能
- 支持 Docker
- 支持 GPU 计算
- 支持完整的系统调用
资源占用较低相对较高
适用场景- 轻量级 Linux 工具使用
- 频繁访问 Windows 文件系统
- 资源受限环境
- 需要完整 Linux 内核功能
- Docker 开发
- 深度学习/GPU 计算
- 重度 Linux 开发
文件系统与 Windows 共享文件系统独立的 Linux 文件系统,通过 9P 协议访问 Windows 文件
网络处理使用 Windows 网络有自己的网络虚拟化
硬件支持有限,无 GPU 支持完整,支持 GPU 直通
选择建议:
  • 如果主要使用 Linux 工具和需要完整 Linux 内核功能,选择 WSL2
  • 如果频繁访问 Windows 文件系统或内存受限,可以考虑 WSL1

CUDA 与硬件支持

WSL1 和 WSL2 在 CUDA 和硬件支持方面有显著差异:

对比项WSL1WSL2
CUDA 支持不支持- 完整支持 NVIDIA CUDA
- 需要 CUDA 驱动 11.2 及以上
- Windows 11 Build 22000+ 最佳支持
GPU 访问不支持直接访问- 支持 GPU 直接访问
- GPU 性能接近原生 Linux
- 支持 CUDA 工具链
硬件支持范围有限,主要通过 Windows 系统接口转换- 完整的硬件支持
- 支持 USB 设备
- 支持更多硬件特性
硬件要求基本系统要求- 需要支持 CUDA 的 NVIDIA GPU
- 需要安装 WSL 专用 NVIDIA 驱动
- 需要启用 BIOS 虚拟化支持
性能表现有限- GPU 性能接近原生
- 可运行深度学习框架
- 支持完整 CUDA 开发环境
配置复杂度简单- 需要安装 CUDA Toolkit for WSL
- 需要正确配置环境变量
- 建议使用 Ubuntu 20.04+
使用建议:
  1. 如果需要 CUDA 开发

    • 必须选择 WSL2
    • 确保硬件和系统版本满足要求
    • 按照配置指南正确设置环境
  2. 如果不需要 CUDA

    • 可以根据其他需求选择 WSL1 或 WSL2
    • WSL1 可能更适合轻量级使用场景

WSL2 的安装与配置

WSL2 的安装需要几个步骤,以下是完整的安装流程:

前置条件检查:
  1. 系统要求:
    • Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)
    • Windows 11
  2. 硬件要求:
    • 64 位处理器
    • 4GB 以上系统内存
    • 在 BIOS 中启用虚拟化(Intel VT-x 或 AMD-V)
安装步骤:
  1. 启用必要的 Windows 功能:

    # 以管理员身份运行 PowerShell,执行以下命令
    
    # 启用 WSL 基础功能
    dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    # 命令解释:
    # dism.exe - Windows 系统部署映像服务和管理工具
    # /online - 表示对当前运行的操作系统进行操作
    # /enable-feature - 启用 Windows 功能
    # /featurename: - 指定要启用的功能名称
    # /all - 启用该功能的所有依赖项
    # /norestart - 安装完成后不重启系统
    
    # 启用虚拟机平台
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    # 这条命令启用 WSL2 所需的虚拟机平台支持
    
  2. 重启系统

  3. 下载并安装 WSL2 Linux 内核更新包:

    • 访问微软官方下载页面:https://aka.ms/wsl2kernel
    • 下载并安装适用于 x64 机器的包
  4. 将 WSL2 设置为默认版本:

    # 设置 WSL2 为默认版本
    wsl --set-default-version 2
    
    # 验证设置是否成功
    wsl --status
    # 此命令会显示:
    # - 默认 WSL 版本
    # - 内核版本
    # - WSL 版本
    # 如果显示 "默认版本:2" 则说明设置成功
    
  5. 安装 Linux 发行版:

    方法一:通过 Microsoft Store 安装(推荐)
    1. 打开 Microsoft Store
    2. 搜索 “Linux”
    3. 推荐的发行版:
      • Ubuntu(最受欢迎,对新手最友好)
      • Debian(稳定,占用资源少)
      • Kali Linux(安全测试工具集成)
    4. 选择后点击"获取"或"安装"
    5. 等待下载和安装完成
    方法二:命令行安装
    # 查看可用的 Linux 发行版列表
    wsl --list --online
    
    # 输出示例:
    # NAME                                   FRIENDLY NAME
    # Ubuntu                                Ubuntu
    # Debian                                Debian GNU/Linux
    # kali-linux                           Kali Linux Rolling
    # ...
    
    # 安装特定发行版(例如 Ubuntu)
    wsl --install -d Ubuntu
    
    # 验证安装
    wsl --list --verbose
    # 输出示例:
    # NAME                   STATE           VERSION
    # Ubuntu                 Running         2
    
    安装后的初始化:
    1. 首次启动发行版时,会要求:

      Enter new UNIX username: your_username
      Enter new UNIX password: your_password
      Retype new UNIX password: your_password
      
    2. 这些凭据:

      • 仅用于该 Linux 发行版
      • 与 Windows 用户无关
      • 用于 sudo 命令的权限验证
    验证安装成功:
    # 进入已安装的发行版
    wsl -d Ubuntu
    
    # 检查系统信息
    uname -a
    
    # 测试基本命令
    pwd         # 显示当前目录
    ls          # 列出文件
    whoami      # 显示当前用户
    
安装过程详解

以下是安装 Ubuntu 22.04 LTS 时的输出信息解释:

  1. 安装命令与初始化

    wsl --install -d Ubuntu-22.04
    正在安装: Ubuntu 22.04 LTS
    已安装 Ubuntu 22.04 LTS。
    正在启动 Ubuntu 22.04 LTS...
    
    • 这表明系统开始下载和安装 Ubuntu 22.04 LTS
  2. 代理相关提示

    wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
    
    • 这是因为 Windows 系统配置了本地代理
    • WSL2 使用 NAT 网络模式,不能直接使用 Windows 的 localhost 代理
    • 这个提示不影响正常使用,但如果需要代理,应该配置 WSL2 专用的代理设置
  3. 用户设置

    Please create a default UNIX user account. The username does not need to match your Windows username.
    Enter new UNIX username: yuuu
    New password:
    Retype new password:
    passwd: password updated successfully
    
    • 系统要求创建一个默认的 UNIX 用户账户
    • 这个用户名可以与 Windows 用户名不同
    • 此用户将成为 WSL2 中的默认用户,具有 sudo 权限
  4. 系统欢迎信息

    Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)
    
    • 显示了 Ubuntu 版本:22.04.5 LTS
    • 内核版本:5.15.153.1-microsoft-standard-WSL2
    • 系统架构:x86_64
  5. 系统状态信息

    System information as of Sat Feb 15 18:56:09 CST 2025
    System load:  0.47                Processes:             32
    Usage of /:   0.1% of 1006.85GB   Users logged in:       0
    Memory usage: 3%                  IPv4 address for eth0: 172.24.52.246
    Swap usage:   0%
    
    • 系统负载:0.47(较低)
    • 磁盘使用:仅使用了 0.1%,总空间约 1TB
    • 内存使用:3%(非常低)
    • 网络地址:172.24.52.246(WSL2 的虚拟网络地址)
    • 交换空间:未使用
  6. 每日提示信息

    This message is shown once a day. To disable it please create the
    /home/yuuu/.hushlogin file.
    
    • 这是 Ubuntu 的每日欢迎信息

    • 如果不想看到这个信息,可以创建 .hushlogin 文件:

      touch ~/.hushlogin
      
安装后的建议操作:
  1. 更新系统

    sudo apt update && sudo apt upgrade
    
  2. 配置代理(如果需要):

    # 在 ~/.bashrc 中添加
    export http_proxy="http://proxy_address:port"
    export https_proxy="http://proxy_address:port"
    
  3. 创建 .hushlogin 文件(如果不需要每日提示):

    touch ~/.hushlogin
    
常用 WSL 管理命令:
# 查看已安装的 Linux 发行版
wsl --list --verbose

# 切换特定发行版的 WSL 版本
wsl --set-version <发行版名称> 2

# 启动特定的发行版
wsl -d <发行版名称>

# 关闭所有 WSL 实例
wsl --shutdown

# 卸载特定发行版
wsl --unregister <发行版名称>
首次使用配置:
  1. 首次启动时需要:

    • 创建用户名和密码
    • 等待系统初始化完成
  2. 建议配置:

    • 更新系统包:

      sudo apt update && sudo apt upgrade
      
    • 配置开发环境

    • 设置 Windows 终端(可选)

故障排除:
  1. 如果遇到虚拟化错误:

    • 检查 BIOS 中的虚拟化设置
    • 确保 Hyper-V 功能已启用
  2. 如果安装失败:

    • 检查 Windows 更新
    • 确保所有必要的 Windows 功能都已启用
    • 尝试使用 wsl --update 更新 WSL
常见错误及解决方案:
  1. 无法获取发行版列表错误:

    C:\Users\yuuu>wsl --list --online
    无法从"https://raw.githubusercontent.com/microsoft/WSL/master/distributions/DistributionInfo.json"中提取列表分发。操作超时
    错误代码: Wsl/0x80072ee2
    

    解决方案:

    • 方案1:使用代理或VPN

      # 设置系统代理后重试
      netsh winhttp set proxy proxy-server="address:port"
      
    • 方案2:直接从 Microsoft Store 安装

      • 绕过命令行安装方式
      • 直接在 Microsoft Store 中搜索并安装所需发行版
    • 方案3:手动下载安装

      1. 访问 https://docs.microsoft.com/zh-cn/windows/wsl/install-manual
      2. 下载所需发行版的 .appx 文件
      3. 双击安装下载的文件
  2. WSL 状态验证示例:

    C:\Users\yuuu>wsl --status
    默认分发: docker-desktop
    默认版本: 2
    

    这表明:

    • WSL2 已成功设置为默认版本
    • 当前默认的 Linux 发行版是 docker-desktop
    • 系统配置正常
  3. 如果仍然无法安装发行版,可以尝试:

    • 清除 WSL 缓存:

      wsl --shutdown
      wsl --unregister <发行版名称>
      
    • 重置网络设置:

      netsh winsock reset
      netsh winhttp reset proxy
      
    • 检查系统防火墙设置

    • 暂时关闭防病毒软件后重试

作用域对比

作用域WSL1WSL2
文件系统- 直接访问 Windows 文件系统
- 性能较好
- 路径形式:/mnt/c/
- 文件权限有限制
- 独立的 Linux 文件系统
- 通过 9P 协议访问 Windows 文件
- 路径形式:/mnt/c/
- 完整的 Linux 文件权限支持
进程管理- 可运行大多数 Linux 程序
- 系统调用转换为 Windows API
- 进程直接与 Windows 进程交互
- 部分系统调用不支持
- 可运行所有 Linux 程序
- 完整的 Linux 系统调用支持
- 进程在虚拟机中运行
- 支持后台服务和守护进程
网络功能- 直接使用 Windows 网络
- 网络配置简单
- 端口直接映射到 Windows
- 网络性能较好
- 有独立的网络虚拟化
- 需要额外的端口转发配置
- 支持完整的 Linux 网络栈
- 可配置独立的网络设置
内存管理- 与 Windows 共享内存
- 内存占用较小
- 资源消耗低
- 独立的内存管理
- 可动态分配内存
- 支持 swap 空间
- 资源消耗相对较大
设备访问- 有限的设备访问能力
- 不支持 GPU
- USB 设备支持受限
- 完整的设备访问支持
- 支持 GPU 直通
- 支持 USB 设备
- 支持更多硬件特性

与普通程序的区别

特性普通 Windows 程序WSL1WSL2
运行级别应用程序级别系统级别组件系统级别组件 + 虚拟化
安装方式直接安装需要启用 Windows 功能需要启用 Windows 功能和虚拟化
系统集成一般的 API 调用深度集成到 Windows 系统通过虚拟化深度集成
多实例支持一般单实例可运行多个 Linux 发行版可运行多个 Linux 发行版
资源隔离共享系统资源部分资源隔离完整的资源隔离
启动方式普通程序启动系统服务方式虚拟机方式
系统权限普通用户权限系统级别权限系统级别权限 + 虚拟化权限
更新方式独立更新通过 Windows 更新通过 Windows 更新 + 内核更新

WSL2 文件系统详解

文件系统结构

WSL2 实际上有两个独立的文件系统:

  1. Linux 文件系统(主文件系统)

    • 位置:存储在虚拟硬盘文件中(%USERPROFILE%\AppData\Local\Packages\<DistroName>\LocalState\ext4.vhdx
    • 特点:
      • 这是 WSL2 的主要工作区域
      • 完整的 Linux 文件权限和特性
      • 文件操作性能最好
      • 建议将开发项目放在这里
    • 访问方式:
      • 在 WSL2 中直接访问
      • 在 Windows 中通过 \\wsl$\<DistroName>\ 访问
  2. Windows 文件系统(挂载点)

    • 位置:通过 /mnt/c/mnt/d 等访问 Windows 磁盘
    • 特点:
      • 这是对 Windows 文件系统的访问
      • 文件操作性能相对较慢
      • 可能存在权限问题
      • 不建议在这里进行密集型文件操作
文件访问建议
  1. 最佳实践

    • 将项目文件放在 WSL2 的 Linux 文件系统中(如 /home/用户名/projects/
    • 避免在 Windows 挂载点(/mnt/*)进行大量文件操作
    • 使用 VSCode Remote-WSL 插件直接在 WSL2 环境中开发
  2. 性能考虑

    • Linux 文件系统内的操作速度最快
    • 跨系统文件操作(Windows <-> WSL2)会有性能损耗
    • 大型项目建议完全在 WSL2 文件系统内进行开发
  3. 路径使用

    # Linux 文件系统路径(推荐)
    /home/用户名/           # 用户主目录
    /usr/                   # 系统文件
    /etc/                   # 配置文件
    
    # Windows 文件系统路径
    /mnt/c/Users/用户名/    # Windows 用户目录
    /mnt/d/                 # D 盘
    
常见误解澄清
  1. 误解:WSL2 只是 Windows 上的一个文件夹
    实际:WSL2 是一个完整的虚拟机,有自己独立的文件系统

  2. 误解:WSL2 只能操作 Windows 文件夹
    实际:WSL2 有自己的文件系统,还可以访问 Windows 文件系统

  3. 误解:在 /mnt/c 下操作文件和在 Linux 文件系统中操作一样
    实际:在 /mnt/c 下的操作性能较差,建议使用 Linux 文件系统

文件系统操作示例
# 在 Linux 文件系统中创建项目(推荐)
cd ~                      # 进入 Linux 用户主目录
mkdir my_project          # 创建项目目录
cd my_project            # 进入项目目录

# 访问 Windows 文件(必要时)
cd /mnt/c/Users/用户名/Documents  # 访问 Windows 文档文件夹

WSL2 虚拟磁盘详解

虚拟磁盘的本质

想象一下,WSL2 的虚拟磁盘(ext4.vhdx)就像是:

  1. 一个特殊的"大箱子":

    • 这个"箱子"实际上是一个虚拟硬盘文件(.vhdx)
    • 默认最大可以扩展到 256GB
    • 但实际占用空间是动态的,用多少占多少
    • 存放在你的 Windows 系统中的这个位置:%USERPROFILE%\AppData\Local\Packages\<DistroName>\LocalState\ext4.vhdx
  2. 这个"箱子"的特点:

    • 对 Windows 来说:就是一个大文件
    • 对 WSL2 来说:是一个完整的 Linux 文件系统
    • 类似于你用 U 盘装了一个 Linux 系统,但这个"U 盘"是虚拟的
访问方式对比
  1. 从 Linux 内部访问(最快):

    # 直接访问,就像在真实的 Linux 系统中一样
    cd /home/用户名/
    ls /etc/
    vim /home/用户名/文档/test.txt
    
  2. 从 Windows 访问(较慢):

    # 方式一:网络路径方式
    \\wsl$\Ubuntu\home\用户名\
    
    # 方式二:直接访问 vhdx 文件位置(不推荐)
    C:\Users\你的用户名\AppData\Local\Packages\...
    
形象的类比
  1. 类比:租房子

    • WSL2 就像在你的 Windows 电脑上"租"了一块地方
    • 这块地方(vhdx 文件)是它的"独立公寓"
    • 它在这个"公寓"里可以随意布置(安装软件、创建文件)
    • 虽然"公寓"在你的房子(Windows)里,但它有自己独立的钥匙(文件系统)
  2. 类比:虚拟U盘

    • vhdx 文件就像一个虚拟的 U 盘
    • 这个"U盘"装有完整的 Linux 系统
    • Windows 可以看到这个"U盘"
    • 但需要通过特殊方式(\wsl$)才能访问里面的内容
使用建议
  1. 日常开发建议

    • 把代码和项目文件都放在 WSL2 的"公寓"里(/home/用户名/)
    • 因为在"公寓"里工作速度最快
    • 需要和 Windows 共享文件时,再通过 \wsl$ 访问
  2. 存储空间管理

    • vhdx 文件会随着你的使用自动增长
    • 如果空间不够,可以手动扩展
    • 删除文件时,vhdx 不会自动缩小
    • 需要手动压缩才能释放空间

WSL2 存储空间管理详解

VHDX 文件增长机制
  1. 安装软件和文件的影响

    • 在 WSL2 中安装的所有软件
    • 创建的所有文件
    • 下载的所有内容
    • 系统更新和缓存
      都会存储在 vhdx 文件中,导致文件逐渐增大
  2. 常见增长原因

    • 使用 apt install 安装软件包
    • npm/pip 等包管理器安装的依赖
    • Docker 镜像和容器(如果在 WSL2 中使用)
    • 项目文件和开发环境
    • 系统更新和日志文件
空间管理建议
  1. 定期清理

    # 清理 apt 缓存
    sudo apt clean
    sudo apt autoremove
    
    # 清理 Docker(如果已安装)
    docker system prune
    
    # 清理日志文件
    sudo rm -rf /var/log/*.log
    
  2. 监控空间使用

    # 查看磁盘使用情况
    df -h
    
    # 查看大文件和目录
    du -h --max-depth=1 /home/用户名
    
  3. 压缩 VHDX 文件

    # 在 Windows PowerShell 中执行
    # 首先关闭 WSL2
    wsl --shutdown
    
    # 找到 .vhdx 文件位置并压缩
    optimize-vhd -Path "C:\Users\用户名\AppData\Local\Packages\...\ext4.vhdx" -Mode full
    
预防措施
  1. 安装软件前

    • 评估所需空间
    • 考虑是否真正需要
    • 可以在 Windows 上安装的尽量不在 WSL2 中安装
  2. 开发项目建议

    • 使用 .gitignore 避免不必要的文件
    • 及时清理构建缓存和临时文件
    • 大型依赖考虑使用容器化管理
  3. 定期维护计划

    • 每月进行一次系统清理
    • 定期检查大文件
    • 必要时进行 VHDX 压缩
扩容和收缩
  1. 扩容操作

    # 在 WSL2 中查看当前磁盘大小
    df -h
    
    # 在 Windows PowerShell 中扩容
    wsl --shutdown
    diskpart
    select vdisk file="C:\...\ext4.vhdx"
    expand vdisk maximum=100GB
    
  2. 收缩操作

    • WSL2 不会自动收缩 VHDX 文件
    • 删除文件后空间不会立即释放
    • 需要手动压缩才能回收空间
    • 建议在空间接近上限时进行

WSL2 迁移与备份详解

VHDX 文件迁移
  1. 是否可以移动 VHDX 文件?

    • 直接移动:不建议直接移动或复制 vhdx 文件
    • 正确方式:使用官方导出导入命令
    # 导出发行版为 tar 文件
    wsl --export <发行版名称> <导出路径.tar>
    
    # 注销原有发行版
    wsl --unregister <发行版名称>
    
    # 导入到新位置
    wsl --import <发行版名称> <新安装位置> <tar文件路径>
    
  2. 为什么不推荐直接移动 VHDX?

    • WSL2 注册表信息与 vhdx 文件位置绑定
    • 直接移动会导致 WSL2 无法找到系统文件
    • 可能造成系统损坏或无法启动
WSL2 系统迁移
  1. WSL2 可以迁移吗?

    • ✅ 可以,有两种官方支持的迁移方式:

      方式一:使用导出导入命令

      # 1. 导出当前系统
      wsl --export Ubuntu d:\wsl-backup\ubuntu.tar
      
      # 2. 注销当前系统
      wsl --unregister Ubuntu
      
      # 3. 在新位置导入
      wsl --import Ubuntu d:\wsl-new d:\wsl-backup\ubuntu.tar
      

      方式二:使用 wsl 命令移动

      # 适用于 Windows 11 Build 19041 及更高版本
      wsl --move <发行版名称> <新位置>
      
  2. 迁移后的注意事项

    • 检查默认用户设置
    • 验证系统权限
    • 测试基本功能
通过 VHDX 复制实现系统迁移
  1. 是否可以通过复制 VHDX 文件实现?

    • 不推荐:直接复制 vhdx 文件是不安全的
    • 正确方式:使用官方的导出导入功能
  2. 为什么不推荐复制 VHDX?

    • 缺少必要的注册表信息
    • 可能存在权限问题
    • 无法保证系统完整性
    • 可能导致两个系统冲突
备份建议
  1. 定期备份

    # 创建完整备份
    wsl --export <发行版名称> backup_$(date +%Y%m%d).tar
    
  2. 备份策略

    • 重要更新前备份
    • 定期创建增量备份
    • 保留多个备份版本
    • 存储在不同位置
  3. 恢复方法

    # 从备份恢复
    wsl --import <新发行版名称> <安装位置> <备份文件.tar>
    
最佳实践
  1. 迁移前准备

    • 清理不必要的文件
    • 记录重要配置
    • 确保足够的磁盘空间
  2. 迁移后确认

    • 验证文件完整性
    • 测试关键应用
    • 确认权限设置
  3. 注意事项

    • 不要在 WSL2 运行时操作
    • 保留原始备份直到确认新系统正常
    • 迁移后更新相关配置

Docker Desktop 与 WSL2 的关系

Docker Desktop 是什么?
  1. 本质说明

    • Docker Desktop 是一个完整的容器开发环境
    • 它在 Windows 上安装后会自动创建一个专用的 WSL2 发行版
    • 这个发行版名为 “docker-desktop”
    • 它不是普通的 Linux 发行版,而是为 Docker 优化的特殊系统
  2. 组成部分

    • 专用的 WSL2 Linux 内核
    • Docker Engine(Docker 引擎)
    • Docker CLI 客户端
    • Docker Compose
    • Kubernetes
    • 用于管理容器的图形界面
与普通 Linux 发行版的区别
  1. 特殊性

    • 由 Docker 公司维护
    • 专门优化用于运行容器
    • 不建议用作普通的 Linux 开发环境
    • 自动管理,用户不需要直接操作
  2. 使用场景

    • 仅用于 Docker 容器的运行和管理
    • 不应该在其中安装额外的开发工具
    • 建议同时安装一个标准的 Linux 发行版(如 Ubuntu)用于开发
工作方式
  1. 自动集成

    • 安装 Docker Desktop 时自动创建
    • 自动配置 WSL2 集成
    • 自动管理更新和维护
  2. 最佳实践

    • 让 docker-desktop 专注于容器服务
    • 使用其他 WSL2 发行版进行日常开发
    • 不要修改 docker-desktop 发行版的系统配置
默认发行版设置与 Docker Desktop
  1. 互不影响的原理

    • Docker Desktop 使用专用的 docker-desktopdocker-desktop-data 发行版
    • 这些发行版独立于你的默认 Linux 发行版
    • 更改默认发行版不会影响 Docker Desktop 的运行
  2. 工作机制

    • Docker Desktop 不依赖于你的默认 WSL2 发行版
    • 它使用自己的专用 WSL2 发行版来运行 Docker 引擎
    • 即使你将默认发行版设置为 Ubuntu、Debian 或其他,Docker Desktop 仍会正常工作
  3. 最佳实践

    • 可以放心地根据开发需求设置默认发行版
    • Docker Desktop 会继续使用自己的发行版运行
    • 两者可以完全独立运行互不干扰

WSL2 发行版管理详解

发行版管理机制
  1. 基本概念

    • WSL2 可以同时管理多个 Linux 发行版
    • 每个发行版都是完整且独立的系统
    • 类似于虚拟机,但更轻量级和集成化
  2. 管理命令集

    # 查看所有已安装的发行版
    wsl --list --verbose
    # 输出示例:
    # NAME            STATE           VERSION
    # Ubuntu         Running         2
    # docker-desktop Running         2
    # Debian         Stopped         2
    
    # 启动特定发行版
    wsl -d Ubuntu
    
    # 设置默认发行版
    wsl --set-default Ubuntu
    
    # 关闭特定发行版
    wsl --terminate Ubuntu
    
    # 关闭所有运行中的发行版
    wsl --shutdown
    
    # 完全卸载某个发行版
    wsl --unregister Ubuntu
    
发行版隔离特性
  1. 系统级隔离

    • 独立的文件系统(单独的 vhdx 文件)
    • 独立的用户账户和权限系统
    • 独立的软件包管理
    • 独立的系统配置
    • 独立的环境变量
  2. 资源隔离

    • 独立的进程空间
    • 独立的内存管理
    • 独立的网络配置
    • 可以设置单独的资源限制
与 conda 环境管理的对比
  1. WSL2 发行版

    • 完整的操作系统级隔离
    • 可以运行任何 Linux 程序
    • 独立的系统资源
    • 更重量级的隔离
    • 适合完整的开发环境
  2. conda 环境

    • Python 包级别的隔离
    • 共享基础系统
    • 主要用于 Python 开发
    • 轻量级隔离
    • 适合 Python 项目管理
多发行版使用场景
  1. 开发环境分离

    # Ubuntu:用于 Python 开发
    wsl -d Ubuntu
    python3 --version
    
    # Debian:用于 Web 开发
    wsl -d Debian
    node --version
    
    # Kali:用于安全测试
    wsl -d Kali
    nmap --version
    
  2. 项目隔离

    • 不同项目使用不同发行版
    • 避免依赖冲突
    • 方便环境重置
  3. 测试环境

    • 可以快速创建干净的测试环境
    • 方便环境还原
    • 不影响主要开发环境
资源共享机制
  1. 文件系统共享

    • 所有发行版都可以访问 Windows 文件系统(/mnt/c/)
    • 发行版之间可以通过 Windows 文件系统共享文件
    • 可以通过网络路径访问其他发行版的文件系统
  2. 硬件资源共享

    • 共享 GPU 资源
    • 共享网络接口
    • 共享 USB 设备
  3. 网络通信

    • 发行版之间可以通过网络通信
    • 可以使用 localhost 互相访问
    • 支持端口转发
最佳实践建议
  1. 发行版选择

    • 主力开发环境:选择稳定的发行版(如 Ubuntu LTS)
    • 实验性项目:使用单独的发行版
    • 特殊用途:选择专门的发行版(如 Kali)
  2. 资源管理

    • 及时关闭不使用的发行版
    • 定期清理不需要的发行版
    • 注意监控磁盘空间使用
  3. 备份策略

    • 重要发行版定期备份
    • 实验性发行版可以随时重建
    • 保持环境配置文件的版本控制

WSL2 发行版选择指南

可用发行版对比表
发行版名称特点适用场景资源占用推荐指数更新周期
Ubuntu- 最流行的发行版
- 软件包丰富
- 社区支持最好
- 教程资源最多
- 日常开发
- 入门学习
- Web 开发
- 通用开发环境
中等★★★★★6个月/LTS版本
Debian- 超稳定
- 资源占用低
- 软件包干净
- 适合服务器
- 服务器开发
- 轻量级环境
- 稳定性要求高
★★★★☆较慢,稳定
Kali Linux- 预装安全工具
- 渗透测试工具集
- 专注安全领域
- 安全测试
- 渗透测试
- 安全研究
★★★★☆Rolling
Ubuntu 18.04 LTS- 长期支持版本
- 稳定性好
- 较旧但稳定
- 传统项目
- 稳定性要求高
- 老项目维护
中等★★★☆☆LTS
Ubuntu 20.04 LTS- 长期支持版本
- 平衡稳定与新特性
- 广泛使用
- 企业开发
- 稳定性要求高
- 通用开发
中等★★★★☆LTS
Ubuntu 22.04 LTS- 最新LTS版本
- 新特性支持好
- 软件包新
- 现代开发环境
- 新项目开发
- 需要新特性
中等★★★★★LTS
Ubuntu 24.04 LTS- 最新版本
- 最新特性支持
- 可能存在不稳定
- 尝鲜
- 需要最新特性
- 实验性项目
中等★★★☆☆LTS
Oracle Linux- 企业级支持
- 兼容 RHEL
- 适合企业环境
- 企业开发
- Oracle 相关
- 企业应用
★★★☆☆较慢
openSUSE- 企业级品质
- YaST 管理工具
- 德国品质
- 企业开发
- 系统管理
- 欧洲项目
中等★★★☆☆固定/滚动
SUSE Linux Enterprise- 企业级支持
- 高度稳定
- 专业支持
- 企业环境
- 商业应用
- 需要商业支持
★★★☆☆较慢
版本选择建议
  1. 新手推荐

    • 首选:Ubuntu 22.04 LTS
    • 原因:
      • 社区支持最好
      • 教程资源最丰富
      • 软件包最完整
      • 稳定性好
  2. 专业开发

    • 首选:Ubuntu 22.04 LTS 或 Debian
    • 原因:
      • 稳定性好
      • 资源占用适中
      • 软件包齐全
      • 长期支持
  3. 特殊用途

    • 安全测试:Kali Linux
    • 企业应用:SUSE Enterprise 或 Oracle Linux
    • 实验性项目:Ubuntu 24.04 或 openSUSE Tumbleweed
  4. 资源受限

    • 首选:Debian
    • 原因:
      • 资源占用最低
      • 系统干净
      • 稳定性好
安装建议
  1. 系统资源充足

    # 安装最新 LTS 版本
    wsl --install -d Ubuntu-22.04
    
  2. 资源受限

    # 安装轻量级系统
    wsl --install -d Debian
    
  3. 特殊需求

    # 安装特定版本
    wsl --install -d <发行版名称>
    
注意事项
  1. 版本选择

    • LTS 版本优先考虑
    • 避免太新或太旧的版本
    • 考虑项目需求和硬件配置
  2. 多发行版管理

    • 按需安装,避免过多
    • 及时清理不用的版本
    • 做好资源规划
  3. 性能优化

    • 合理分配系统资源
    • 定期维护和更新
    • 及时清理不需要的包
Ubuntu 版本说明
  1. 默认版本机制

    • 当使用 wsl --install -d Ubuntu 命令时(不指定版本号):
      • 会安装 Microsoft Store 中的默认 Ubuntu 版本
      • 通常是最新的 LTS(长期支持)版本
      • 截至 2024 年,默认指向 Ubuntu 22.04 LTS
  2. 版本选择方式

    # 安装默认版本(最新 LTS)
    wsl --install -d Ubuntu
    
    # 安装特定版本
    wsl --install -d Ubuntu-22.04    # 安装 Ubuntu 22.04 LTS
    wsl --install -d Ubuntu-20.04    # 安装 Ubuntu 20.04 LTS
    
  3. 版本选择建议

    • 新手用户:直接使用 wsl --install -d Ubuntu,获取最新稳定 LTS 版本
    • 特定项目:根据项目需求选择特定版本
    • 多版本需求:可以同时安装不同版本的 Ubuntu
  4. 查看当前版本

    # 在 WSL 的 Ubuntu 中执行
    lsb_release -a
    # 或者
    cat /etc/os-release
    

WSL2 发行版的安全实验特性

发行版的独立性与安全性
  1. 完全隔离

    • 每个发行版都是完全独立的环境
    • 一个发行版的崩溃不会影响其他发行版
    • 不会影响 WSL2 系统本身或 Windows 系统
  2. 快速重置能力

    # 删除出问题的发行版
    wsl --unregister Ubuntu-22.04
    
    # 重新安装一个全新的发行版
    wsl --install -d Ubuntu-22.04
    
  3. 实验安全性

    • 可以大胆尝试新技术和配置
    • 适合学习和实验环境
    • 出现问题可以快速恢复
    • 不会影响生产环境
最佳实践建议
  1. 环境分离

    • 生产环境使用稳定的主发行版
    • 实验和学习使用单独的发行版
    • 不同项目使用不同发行版
  2. 备份策略

    # 在进行重要实验前备份
    wsl --export Ubuntu-22.04 ubuntu_backup.tar
    
    # 如果实验失败,可以快速恢复
    wsl --import Ubuntu-22.04 <安装路径> ubuntu_backup.tar
    
  3. 资源管理

    • 实验性发行版用完及时删除
    • 保持系统整洁
    • 避免占用过多磁盘空间
使用建议
  1. 实验环境设置

    • 创建专门的实验用发行版
    • 在实验前记录关键配置
    • 保存重要数据到外部
  2. 故障处理

    • 发生严重错误时直接删除重装
    • 保持核心发行版的稳定
    • 定期整理和清理实验环境
  3. 开发流程

    • 在实验环境中测试新功能
    • 验证成功后再迁移到生产环境
    • 保持开发环境和实验环境的分离

WSL2 网络与端口映射详解

网络架构
  1. 基本架构

    • WSL2 使用虚拟化网络
    • 每个 WSL2 发行版都有自己的虚拟网络适配器
    • 使用 NAT(网络地址转换)连接到 Windows 主机
    • WSL2 的 IP 地址是动态分配的
  2. 网络特点

    • WSL2 获得独立的 IP 地址(通常是 172.x.x.x)
    • Windows 主机在 WSL2 中可通过 host.docker.internal 访问
    • WSL2 可以直接访问 Windows 的网络
    • 支持 IPv4 和 IPv6
端口映射机制
  1. 自动端口转发

    • Windows 11 支持自动端口转发
    • 监听 0.0.0.0 的服务会自动映射到 Windows
    • 可以通过 localhost 访问 WSL2 的服务
    # WSL2 中启动服务示例
    python -m http.server 3000  # 会自动映射到 Windows
    
  2. 手动端口转发

    • Windows 10 可能需要手动设置端口转发
    • 使用 netsh 命令配置
    # 在 Windows PowerShell(管理员)中执行
    netsh interface portproxy add v4tov4 listenport=3000 listenaddress=0.0.0.0 connectport=3000 connectaddress=<WSL2-IP>
    
访问方式对比
访问方向访问方法示例
Windows → WSL2localhost:端口http://localhost:3000
WSL2 → Windowshost.docker.internalcurl http://host.docker.internal:80
WSL2 → WSL2WSL2 IP 地址curl http://172.x.x.x:3000
外部 → WSL2Windows IP:端口http://192.168.1.100:3000
常见使用场景
  1. Web 开发

    # 在 WSL2 中启动开发服务器
    npm start  # 默认监听 localhost:3000
    # 在 Windows 中访问:http://localhost:3000
    
  2. 数据库服务

    # WSL2 中的 MySQL
    sudo service mysql start
    # Windows 中连接:localhost:3306
    
  3. Docker 容器

    # WSL2 中运行 Docker 容器
    docker run -p 8080:80 nginx
    # Windows 访问:http://localhost:8080
    
网络故障排查
  1. 查看 WSL2 IP

    # 在 WSL2 中执行
    ip addr show eth0
    # 或
    hostname -I
    
  2. 端口占用检查

    # WSL2 中检查
    sudo netstat -tulpn | grep LISTEN
    
    # Windows 中检查
    netstat -ano | findstr LISTENING
    
  3. 常见问题解决

    • 端口冲突:更换端口或关闭占用程序
    • 无法访问:检查防火墙设置
    • IP 变化:使用脚本自动更新端口转发
最佳实践建议
  1. 开发环境配置

    • 使用 0.0.0.0 而不是 127.0.0.1 监听
    • 避免硬编码 IP 地址
    • 使用环境变量管理端口配置
  2. 安全性考虑

    • 仅暴露必要的端口
    • 配置防火墙规则
    • 使用 HTTPS 进行安全通信
  3. 性能优化

    • 避免不必要的端口转发
    • 合理使用端口范围
    • 及时清理未使用的端口映射
网络配置脚本
# 创建自动端口转发脚本 (port-forward.ps1)
$wslIP = (wsl hostname -I).Trim()
$ports = @(3000, 8080, 3306) # 需要转发的端口列表

foreach ($port in $ports) {
    netsh interface portproxy delete v4tov4 listenport=$port listenaddress=0.0.0.0
    netsh interface portproxy add v4tov4 listenport=$port listenaddress=0.0.0.0 connectport=$port connectaddress=$wslIP
}
WSL2 网络关系通俗解释
  1. IP 地址关系

    • 把 WSL2 想象成一个"虚拟电脑":
      • Windows 是你的"主电脑"(比如 IP:192.168.1.100)
      • WSL2 是一个"虚拟电脑"(比如 IP:172.24.52.246)
      • 每个 WSL2 发行版都是一个独立的"虚拟电脑"
      • 这些"虚拟电脑"都有自己独立的 IP 地址
  2. 网络连接方式

    • 类似于这样的关系:
      • Windows 系统相当于一个"路由器"
      • 每个 WSL2 发行版都是连接到这个"路由器"的"电脑"
      • WSL2 通过 Windows 系统访问外网
      • Windows 可以访问 WSL2,就像访问局域网中的其他电脑
  3. 端口使用

    • 就像两台不同的电脑:
      • WSL2 的端口和 Windows 的端口是独立的
      • 比如:WSL2 可以用 3000 端口,Windows 也可以用 3000 端口
      • 它们不会互相冲突,因为是两个不同的系统
    # 例如:同时运行两个服务
    # 在 WSL2 中运行:
    python -m http.server 3000
    # 在 Windows 中运行:
    node app.js  # 也使用 3000 端口
    # 两者互不影响
    
  4. 访问方式举例

    • 想象一个网站在 WSL2 中运行:

      # 在 WSL2 中启动网站(端口 3000)
      npm start
      
    • 访问这个网站的方式:

      • 从 Windows 访问:http://localhost:3000(最简单)
      • 从 WSL2 内部访问:http://localhost:3000
      • 从其他 WSL2 访问:http://172.24.52.246:3000(使用 WSL2 的 IP)
      • 从局域网访问:http://192.168.1.100:3000(使用 Windows 的 IP)
  5. 端口映射说明

    • Windows 11 的自动端口映射:
      • 就像一个"自动转接员"
      • 当你访问 Windows 的 localhost:3000
      • 它会自动帮你转发到 WSL2 的对应服务
    • Windows 10 需要手动设置:
      • 就像手动告诉"转接员"怎么转发
      • 需要明确指定哪些端口需要转发
  6. 实际应用例子
    让我们通过几个具体场景来详细说明各个组件的配置和访问方式:

    场景一:Web 开发服务器

    # 网络环境说明:
    # 路由器 IP:192.168.1.1
    # Windows 主机:
    #   - 局域网 IP:192.168.1.100
    #   - 本地回环:127.0.0.1
    # WSL2 Ubuntu:
    #   - 虚拟网络 IP:172.24.52.246
    #   - 本地回环:127.0.0.1
    
    # 1. 在 WSL2 中启动 Node.js 服务器
    cd ~/project
    node server.js  # 监听在 0.0.0.0:3000
    
    # 2. 访问方式:
    # 从 WSL2 内部访问:
    curl http://localhost:3000
    curl http://127.0.0.1:3000
    curl http://172.24.52.246:3000  # 都可以访问
    
    # 从 Windows 访问:
    # 浏览器打开:http://localhost:3000
    # 或:http://127.0.0.1:3000
    
    # 从局域网其他设备访问:
    # 浏览器打开:http://192.168.1.100:3000
    

    场景二:数据库服务

    # 网络环境说明:
    # 同上,但使用不同端口
    
    # 1. 在 WSL2 中启动 MySQL
    sudo service mysql start
    # MySQL 配置:
    # bind-address = 0.0.0.0
    # port = 3306
    
    # 2. 连接方式:
    # 从 WSL2 内部连接:
    mysql -h 127.0.0.1 -u root -p
    mysql -h localhost -u root -p
    
    # 从 Windows 连接:
    # MySQL Workbench 配置:
    # 主机:localhost 或 127.0.0.1
    # 端口:3306
    # 用户名:root
    
    # 从局域网其他设备连接:
    # 主机:192.168.1.100
    # 端口:3306
    

    场景三:多服务协同

    # 网络环境说明:
    # 同上,使用多个端口
    
    # 1. 在 WSL2 中运行前端开发服务器
    cd ~/frontend
    npm start  # 监听在 3000 端口
    
    # 2. 在 WSL2 中运行后端 API 服务器
    cd ~/backend
    python app.py  # 监听在 5000 端口
    
    # 3. 在 WSL2 中运行数据库
    sudo service postgresql start  # 监听在 5432 端口
    
    # 访问配置:
    # 前端开发服务器:
    # - WSL2 内部:http://localhost:3000
    # - Windows:http://localhost:3000
    # - 局域网:http://192.168.1.100:3000
    
    # 后端 API:
    # - WSL2 内部:http://localhost:5000
    # - Windows:http://localhost:5000
    # - 局域网:http://192.168.1.100:5000
    
    # 数据库:
    # - WSL2 内部:postgresql://localhost:5432
    # - Windows:postgresql://localhost:5432
    # - 局域网:postgresql://192.168.1.100:5432
    

    场景四:Docker 容器服务

    # 网络环境说明:
    # Docker 网络:
    # - docker0 网桥:172.17.0.1
    # - 容器网络:172.17.0.2+
    
    # 1. 在 WSL2 中运行 Docker 容器
    docker run -d -p 8080:80 nginx
    
    # 容器访问方式:
    # 从 WSL2 内部访问:
    curl http://localhost:8080
    curl http://172.24.52.246:8080
    
    # 从 Windows 访问:
    # 浏览器打开:http://localhost:8080
    
    # 从局域网访问:
    # 浏览器打开:http://192.168.1.100:8080
    
    # 容器间通信:
    docker run -d --name api -p 8081:80 api-image
    docker run -d --name web -p 8082:80 web-image
    # 容器可以通过服务名互相访问:
    # - api 容器访问 web:http://web
    # - web 容器访问 api:http://api
    

    端口使用总结

    服务类型端口WSL2 访问Windows 访问局域网访问
    Web 前端3000localhost:3000localhost:3000192.168.1.100:3000
    API 后端5000localhost:5000localhost:5000192.168.1.100:5000
    MySQL3306localhost:3306localhost:3306192.168.1.100:3306
    PostgreSQL5432localhost:5432localhost:5432192.168.1.100:5432
    Nginx8080localhost:8080localhost:8080192.168.1.100:8080

    注意事项

    1. WSL2 的 IP 地址可能在重启后改变,建议使用 localhost 访问
    2. 对外服务需要考虑防火墙设置
    3. 生产环境建议使用 HTTPS
    4. 数据库服务注意访问权限控制
    5. Docker 容器注意网络隔离和安全性
端口冲突处理
  1. 端口可见性

    • WSL2 只能看到自己系统内的端口占用情况
    • 无法直接看到 Windows 系统上运行的服务端口
    • Windows 系统可以看到所有端口(包括 WSL2 的映射端口)
  2. 端口检查命令

    # 在 WSL2 中检查端口
    sudo netstat -tulpn | grep LISTEN    # 只能看到 WSL2 内的服务
    sudo lsof -i :3000                   # 只能看到 WSL2 内的 3000 端口占用
    
    # 在 Windows 中检查端口(PowerShell)
    netstat -ano | findstr LISTENING     # 可以看到所有端口,包括 WSL2 映射的端口
    
  3. 端口终止操作

    • WSL2 中的 kill 命令只能终止 WSL2 内的进程

    • 无法从 WSL2 终止 Windows 系统的进程

    • 需要在对应的系统中终止进程:

      # 在 WSL2 中终止进程
      sudo kill -9 <WSL2进程ID>          # 只能终止 WSL2 内的进程
      
      # 在 Windows 中终止进程(管理员 PowerShell)
      taskkill /F /PID <Windows进程ID>   # 可以终止 Windows 的进程
      
  4. 最佳实践

    • 在启动服务前,分别在两个系统中检查端口占用
    • 使用不同的端口范围避免冲突
    • Windows 系统的端口占用问题需要在 Windows 中解决
    • WSL2 的端口占用问题在 WSL2 中解决
  5. 端口冲突解决方案

    • 更换端口号
    • 先确认是哪个系统的服务占用了端口
    • 在对应的系统中终止进程
    • 使用环境变量动态分配端口
Windows 与 WSL2 的进程管理关系
  1. 进程可见性与管理权限

    • WSL2 只能看到和管理自己的进程
    • Windows 可以看到 WSL2 的端口映射,但不能管理 WSL2 内部进程
    • 每个系统只能管理自己的进程空间
  2. 从 Windows 查看 WSL2 端口

    # 在 Windows PowerShell 中执行
    netstat -ano | findstr "3000"
    # 可以看到端口,但显示的是 WSL 进程的 ID,而不是 Linux 内部的进程 ID
    
  3. 进程终止限制

    • Windows 不能直接终止 WSL2 内部的具体进程
    • 使用 taskkill 只能终止整个 WSL2 实例
    • 必须在 WSL2 内部使用 Linux 命令管理进程
  4. 正确的进程管理方式

    • 在 WSL2 中管理 Linux 进程

      # 查找占用端口的进程
      sudo netstat -tulpn | grep 3000
      
      # 终止特定进程
      sudo kill -9 <进程ID>
      
    • 在 Windows 中管理 WSL2 实例

      # 终止特定的 WSL 发行版
      wsl --terminate Ubuntu-22.04
      
      # 关闭所有 WSL 实例
      wsl --shutdown
      
  5. 最佳实践建议

    • 在对应的系统中管理各自的进程
    • 不要尝试跨系统强制终止进程
    • 如果遇到端口冲突:
      1. 先确认是哪个系统的进程
      2. 在对应的系统中终止进程
      3. 必要时可以重启 WSL2 实例
  6. 安全性考虑

    • 系统隔离是重要的安全特性
    • 每个系统只管理自己的进程空间
    • 这种限制防止了潜在的系统干扰

WSL2 中使用 Docker 部署服务

推荐程度:★★★★☆ (强烈推荐)
  1. 优点

    • 性能接近原生 Linux
    • 文件系统性能优于 Windows Docker Desktop
    • 内存管理更灵活高效
    • 完整的 Linux 环境,避免跨平台兼容性问题
    • Windows 可通过 localhost 直接访问服务
    • 资源管理更精细
  2. 环境配置

    # 1. 在 WSL2 中安装 Docker
    sudo apt update
    sudo apt install docker.io
    
    # 2. 启动 Docker 服务
    sudo service docker start
    
    # 3. 配置用户权限
    sudo usermod -aG docker $USER
    
  3. 服务部署示例

    # MySQL 部署
    docker run -d \
      --name mysql \
      -p 3306:3306 \
      -v /home/user/mysql-data:/var/lib/mysql \
      -e MYSQL_ROOT_PASSWORD=yourpassword \
      mysql:8.0
    
    # Redis 部署
    docker run -d \
      --name redis \
      -p 6379:6379 \
      -v /home/user/redis-data:/data \
      redis:latest
    
  4. 注意事项

    • 数据卷建议放在 WSL2 文件系统内,而不是 Windows 目录
    • 服务绑定到 0.0.0.0 以确保可访问性
    • 合理配置资源限制
    • 做好数据备份
    • 注意端口冲突处理
  5. 最佳实践

    • 在 WSL2 中管理 Docker 服务
    • 在 Windows 中使用开发工具
    • 通过 localhost 访问所有服务
    • 定期备份重要数据
    • 及时清理未使用的资源

Windows 访问 WSL2 文件系统

访问方式
  1. 通过网络路径访问

    • 最简单的方式:在文件资源管理器地址栏输入:

      \\wsl$
      
    • 会显示所有已安装的 WSL2 发行版

    • 选择特定发行版后可以浏览其完整文件系统

    • 路径示例:\\wsl$\Ubuntu-22.04\home\username

  2. 通过 VSCode 访问

    • 安装 “Remote - WSL” 扩展
    • 使用 code . 命令在 WSL2 中打开当前目录
    • 或在 VSCode 中使用 “Remote-WSL: New Window” 命令
    • 可以直接编辑 WSL2 中的文件,支持所有 VSCode 功能
  3. 通过 WSL2 挂载点访问 Windows 文件

    # 在 WSL2 中访问 Windows 文件
    cd /mnt/c/Users/your-username/
    
文件权限和性能考虑
  1. 权限处理

    • 通过 \\wsl$ 访问时保持 Linux 文件权限
    • 建议使用 VSCode Remote-WSL 进行开发
    • 避免在 Windows 中直接修改 Linux 系统文件
  2. 性能优化

    • 将项目文件放在 WSL2 文件系统中(/home/username/)
    • 避免在 Windows 文件系统(/mnt/c/)中进行频繁操作
    • 使用 VSCode Remote-WSL 可获得最佳性能
  3. 文件同步

    • WSL2 和 Windows 之间的文件访问是实时的
    • 修改会立即反映在另一个系统中
    • 注意文件换行符差异(Windows CRLF vs Linux LF)
最佳实践建议
  1. 开发工作流

    Windows 文件资源管理器
    \\wsl$\Ubuntu-22.04\home\username\projects\  # 浏览项目文件
    
    VSCode
    code .  # 在 WSL2 中打开当前目录
    
  2. 文件组织

    • 开发项目放在 WSL2 的 /home/username/ 目录下
    • 共享文件可以放在 Windows 用户目录中
    • 使用 .gitignore 管理不同系统的临时文件
  3. 常见问题解决

    • 文件权限问题:在 WSL2 中使用 chmod 修改
    • 访问速度慢:检查文件位置,避免跨系统操作
    • 编码问题:使用 UTF-8 编码,注意换行符设置
  4. 安全注意事项

    • 不要在 Windows 中修改 WSL2 的系统文件
    • 保持正确的文件权限
    • 定期备份重要数据
    • 注意敏感文件的访问权限
实用命令和技巧
  1. 快速访问常用目录

    # 在 Windows PowerShell 中创建快捷方式
    New-Item -ItemType SymbolicLink -Path "Desktop\WSL Projects" -Target "\\wsl$\Ubuntu-22.04\home\username\projects"
    
  2. 文件权限修复

    # 在 WSL2 中修复权限
    sudo chown -R username:username /home/username/projects
    sudo chmod -R 755 /home/username/projects
    
  3. VSCode 集成

    # 在 WSL2 中打开当前目录
    code .
    
    # 在 WSL2 中打开特定文件
    code filename.txt
    
  4. 文件同步检查

    # 在 WSL2 中检查文件状态
    ls -la
    
    # 在 Windows 中检查
    dir "\\wsl$\Ubuntu-22.04\home\username\projects"
    

WSL2 Ubuntu 安装 Docker 与 MySQL 部署实践

第一步:安装 Docker
  1. 更新系统包

    # 更新包索引
    sudo apt update
    
    # 升级所有已安装的包
    sudo apt upgrade -y
    
  2. 安装 Docker 必需的包

    # 安装必要的系统工具
    sudo apt install -y \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    

    实战反馈:

    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    lsb-release is already the newest version (11.1.0ubuntu4).
    lsb-release set to manually installed.
    ca-certificates is already the newest version (20240203~22.04.1).
    ca-certificates set to manually installed.
    curl is already the newest version (7.81.0-1ubuntu1.20).
    curl set to manually installed.
    gnupg is already the newest version (2.2.27-3ubuntu2.1).
    gnupg set to manually installed.
    The following NEW packages will be installed:
      apt-transport-https
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    

    分析:

    • 大多数必需的包已经预装在系统中
    • 只需要安装 apt-transport-https
    • 系统处于较新的状态,其他包都是最新版本
  3. 添加 Docker 官方 GPG 密钥

    # 下载并添加 Docker 的官方 GPG 密钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    实战反馈:

    File '/usr/share/keyrings/docker-archive-keyring.gpg' exists. Overwrite? (y/N) y
    

    说明:如果已存在密钥文件,系统会询问是否覆盖。选择 ‘y’ 确认覆盖即可。

  4. 设置 Docker 仓库

    # 添加 Docker 官方仓库
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
  5. 安装 Docker Engine

    # 再次更新包索引
    sudo apt update
    
    # 安装 Docker Engine 和 Docker Compose
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    

    实战反馈:

    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following additional packages will be installed:
      dbus-user-session docker-buildx-plugin docker-ce-rootless-extras libltdl7 libslirp0 pigz slirp4netns
    ...
    Need to get 127 MB of archives.
    After this operation, 458 MB of additional disk space will be used.
    ...
    Setting up docker-ce (5:27.5.1-1~ubuntu.22.04~jammy) ...
    Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service.
    Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket.
    

    分析:

    • 安装了完整的 Docker 环境,包括 Docker Engine 和相关工具
    • 自动设置了系统服务和 socket
    • 总计使用约 458MB 磁盘空间
  6. 配置 Docker 用户权限

    # 将当前用户添加到 docker 组
    sudo usermod -aG docker $USER
    
    # 使新的组成员身份生效
    newgrp docker
    
  7. 验证 Docker 安装

    # 检查 Docker 版本
    docker --version
    # 输出:Docker version 27.5.1, build 9f9e405
    
    # 验证 Docker 是否正常工作
    docker run hello-world
    

    实战问题:

    docker run hello-world
    Unable to find image 'hello-world:latest' locally
    docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
    

    问题分析与解决:

    • 问题原因:网络连接超时,可能是因为:
      1. 网络代理配置问题
      2. Docker 守护进程网络设置问题
      3. 防火墙限制

    解决方案:

    1. 配置 Docker 代理:

      sudo mkdir -p /etc/docker
      sudo nano /etc/docker/daemon.json
      

      添加以下内容:

      {
        "registry-mirrors": ["https://registry.docker-cn.com"],
        "proxies": {
          "default": {
            "httpProxy": "http://127.0.0.1:7890",
            "httpsProxy": "http://127.0.0.1:7890",
            "noProxy": "localhost,127.0.0.1"
          }
        }
      }
      

      然后重启 Docker 服务:

      sudo service docker restart
      
    2. 如果仍然无法连接,可以尝试使用国内镜像源:

      sudo nano /etc/docker/daemon.json
      

      添加或修改:

      {
        "registry-mirrors": [
          "https://mirror.ccs.tencentyun.com",
          "https://registry.docker-cn.com",
          "https://docker.mirrors.ustc.edu.cn"
        ]
      }
      

      重启 Docker 服务:

      sudo service docker restart
      
第二步:配置 Docker 服务自启动
  1. 设置 Docker 服务开机自启

    # 启动 Docker 服务
    sudo service docker start
    
    # 设置开机自启
    sudo systemctl enable docker
    
  2. 创建 Docker 服务启动脚本

    # 创建启动脚本
    echo '#!/bin/sh
    service docker start' | sudo tee /etc/wsl.conf > /dev/null
    
    # 添加执行权限
    sudo chmod +x /etc/wsl.conf
    
第三步:部署 MySQL 数据库
  1. 创建 MySQL 数据目录

    # 创建数据存储目录
    mkdir -p ~/docker-data/mysql
    

    实战反馈:

    # 命令执行成功,目录创建完成
    
  2. 创建 MySQL 配置文件

    # 创建配置文件目录
    mkdir -p ~/docker-data/mysql/conf
    
    # 创建并编辑 MySQL 配置文件
    cat > ~/docker-data/mysql/conf/my.cnf << 'EOF'
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    default-time-zone='+8:00'
    
    [client]
    default-character-set=utf8mb4
    
    [mysql]
    default-character-set=utf8mb4
    EOF
    
  3. 拉取 MySQL 镜像

    # 拉取 MySQL 5.7 镜像
    docker pull mysql:5.7
    
  4. 运行 MySQL 容器

    # 启动 MySQL 容器
    docker run -d \
      --name mysql5.7 \
      -p 3306:3306 \
      -v ~/docker-data/mysql/data:/var/lib/mysql \
      -v ~/docker-data/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -e MYSQL_DATABASE=test_db \
      --restart unless-stopped \
      mysql:5.7
    

    命令说明:

    • -d: 后台运行容器
    • --name: 指定容器名称为 mysql5.7
    • -p: 端口映射,主机端口:容器端口
    • -v: 挂载数据卷,实现数据持久化
    • -e: 设置环境变量,包括 root 密码和默认数据库
    • --restart: 容器重启策略
  5. 验证 MySQL 部署

    # 检查容器状态
    docker ps
    
    # 查看容器日志
    docker logs mysql5.7
    
    # 进入 MySQL 容器
    docker exec -it mysql5.7 mysql -uroot -p123456
    
    # 在 MySQL 命令行中验证配置
    mysql> SHOW VARIABLES LIKE 'character%';
    mysql> SELECT NOW();  # 验证时区
    mysql> exit
    
  6. 从 Windows 连接测试

    # MySQL 连接信息:
    # 主机:localhost 或 127.0.0.1
    # 端口:3306
    # 用户名:root
    # 密码:123456
    
常见问题处理
  1. 端口冲突
    如果遇到以下错误:

    Error response from daemon: driver failed programming external connectivity on endpoint mysql5.7: failed to bind port 0.0.0.0:3306/tcp: Error starting userland proxy: listen tcp4 0.0.0.0:3306: bind: address already in use.
    

    解决方案:

    # 1. 检查是否有其他 MySQL 实例或服务占用 3306 端口
    sudo netstat -tulpn | grep 3306
    
    # 2. 如果是其他 Docker 容器占用端口,可以停止并删除:
    docker ps -a | grep mysql
    docker stop <容器ID>
    docker rm <容器ID>
    
    # 3. 如果是本地 MySQL 服务占用端口,可以停止服务:
    sudo service mysql status    # 检查服务状态
    sudo service mysql stop     # 停止服务
    
    # 4. 或者使用其他端口启动容器,例如使用 3307:
    docker run -d \
      --name mysql5.7 \
      -p 3307:3306 \
      -v ~/docker-data/mysql/data:/var/lib/mysql \
      -v ~/docker-data/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -e MYSQL_DATABASE=test_db \
      --restart unless-stopped \
      mysql:5.7
    

    注意事项:

    • 更改端口后,客户端连接时需要使用新的端口号
    • 确保新端口号未被其他服务占用
    • 建议在更改端口前备份重要数据
  2. 数据持久化问题

    # 备份数据库
    docker exec mysql5.7 mysqldump -uroot -p123456 test_db > backup.sql
    
    # 恢复数据库
    docker exec -i mysql5.7 mysql -uroot -p123456 test_db < backup.sql
    
  3. 容器无法启动

    # 查看详细错误信息
    docker logs mysql5.7
    
    # 检查配置文件权限
    ls -l ~/docker-data/mysql/conf/my.cnf
    
    # 重置容器
    docker rm -f mysql5.7
    # 然后重新运行容器
    
  4. Docker 守护进程未运行
    如果遇到以下错误:

    docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
    See 'docker run --help'.
    

    解决方案:

    # 1. 检查 Docker 服务状态
    sudo service docker status
    
    # 2. 启动 Docker 服务
    sudo service docker start
    
    # 3. 如果启动失败,可以尝试以下步骤:
    # 检查详细错误信息
    sudo systemctl status docker
    
    # 重新启动 Docker 服务
    sudo service docker restart
    
    # 如果还是无法启动,可以检查系统日志
    sudo tail -f /var/log/syslog | grep docker
    

    注意事项:

    • 每次重启 WSL 后需要手动启动 Docker 服务
    • 可以将启动命令添加到 ~/.bashrc 文件实现自动启动
    • 确保当前用户在 docker 用户组中:sudo usermod -aG docker $USER
  5. 容器名称冲突
    如果遇到以下错误:

    docker: Error response from daemon: Conflict. The container name "/mysql5.7" is already in use by container "30383d2a61c484218b31b1962b7073b03571aa4345c9de01f9b5545deacc20db". You have to remove (or rename) that container to be able to reuse that name.
    See 'docker run --help'.
    

    解决方案:

    # 1. 查看所有容器(包括停止的容器)
    docker ps -a | grep mysql5.7
    
    # 2. 如果旧容器不再需要,可以删除:
    docker rm -f mysql5.7
    
    # 3. 如果需要保留旧容器数据,可以:
    # 先停止旧容器
    docker stop mysql5.7
    # 重命名旧容器
    docker rename mysql5.7 mysql5.7_old
    # 然后再运行新容器
    docker run -d \
      --name mysql5.7 \
      -p 3306:3306 \
      -v ~/docker-data/mysql/data:/var/lib/mysql \
      -v ~/docker-data/mysql/conf/my.cnf:/etc/mysql/conf.d/my.cnf \
      -e MYSQL_ROOT_PASSWORD=123456 \
      -e MYSQL_DATABASE=test_db \
      --restart unless-stopped \
      mysql:5.7
    

    注意事项:

    • 删除容器前确保重要数据已备份
    • 使用 docker ps -a 查看所有容器,包括未运行的
    • 如果要保留数据,可以先备份数据卷中的内容
    • 使用有意义的容器名称,避免冲突
性能优化建议
  1. 内存配置
    在 my.cnf 中添加:

    [mysqld]
    # 根据实际内存大小调整
    innodb_buffer_pool_size=1G
    innodb_log_buffer_size=32M
    
  2. 连接数优化

    [mysqld]
    max_connections=200
    
  3. 监控命令

    # 查看容器资源使用情况
    docker stats mysql5.7
    
    # 查看 MySQL 状态
    docker exec -it mysql5.7 mysqladmin -uroot -p status
    
安全建议
  1. 密码策略

    • 使用强密码
    • 定期更改密码
    • 避免使用默认密码
  2. 访问控制

    # 创建具有限制权限的用户
    CREATE USER 'app_user'@'%' IDENTIFIED BY 'password';
    GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'app_user'@'%';
    
  3. 网络安全

    • 限制远程访问
    • 使用 SSL 连接
    • 定期更新 Docker 和 MySQL 版本
日常维护
  1. 备份策略

    # 创建备份脚本
    cat > backup.sh << 'EOF'
    #!/bin/bash
    DATE=$(date +%Y%m%d)
    docker exec mysql5.7 mysqldump -uroot -p"123456" --all-databases > backup_$DATE.sql
    EOF
    
    # 添加执行权限
    chmod +x backup.sh
    
  2. 日志管理

    # 查看容器日志
    docker logs --tail 100 mysql5.7
    
    # 清理日志
    sudo truncate -s 0 $(docker inspect --format='{{.LogPath}}' mysql5.7)
    
  3. 定期维护

    # 优化表
    OPTIMIZE TABLE your_table;
    
    # 分析表
    ANALYZE TABLE your_table;
    
    1. 在 WSL2 中执行:

      sudo bash -c 'grep -v "export.*proxy" /etc/profile > /etc/profile.tmp'
      sudo bash -c 'mv /etc/profile.tmp /etc/profile'
      source /etc/profile
      
    • 在用户目录创建 .wslconfig 文件:

      [wsl2]
      networkingMode=mirrored
      
    • 文件位置:C:\Users\你的用户名\.wslconfig

    • 创建方法:

      # 在 Windows PowerShell 中执行
      New-Item -Path "$env:USERPROFILE\.wslconfig" -ItemType "file" -Force
      
      export http_proxy="http://127.0.0.1:7890"
      export https_proxy="http://127.0.0.1:7890"
      
  4. 配置 .wslconfig 后需要重启 WSL:

    wsl --shutdown
    
  5. 如果需要临时关闭:

    unset http_proxy https_proxy
    
    echo $http_proxy
    echo $https_proxy
    
    # 测试连接
    curl -I https://www.google.com
    

WSL2 生命周期管理

WSL2 运行状态说明
  1. 启动机制

    • WSL2 不会随 Windows 自动启动
    • 首次访问时(如打开终端)才会启动
    • 可以同时运行多个不同的 Linux 发行版
    • 每个发行版是独立的实例
  2. 运行状态查看

    # 在 Windows PowerShell 中执行
    wsl --list --verbose
    # 输出示例:
    # NAME                   STATE           VERSION
    # Ubuntu-20.04          Running         2
    # Debian                Stopped         2
    
  3. 生命周期特点

    • 启动触发

      • 打开 WSL 终端时
      • 使用 wsl 命令时
      • 访问 WSL 文件系统时(如 \\wsl$
    • 保持运行

      • 即使关闭所有终端,WSL 实例仍可能在后台运行
      • 后台进程会继续执行
      • 网络服务(如数据库、Web 服务器)保持可访问
    • 关闭方式

      • 自动:空闲一段时间后可能自动关闭
      • 手动:使用命令显式关闭
      # 关闭特定发行版
      wsl --terminate Ubuntu-20.04
      
      # 关闭所有 WSL 实例
      wsl --shutdown
      
  4. 多实例管理

    • 可以同时运行多个发行版
    • 每个发行版可以打开多个终端
    • 资源是共享的,注意内存使用
    # 启动特定发行版
    wsl -d Ubuntu-20.04
    
    # 以特定用户启动
    wsl -d Ubuntu-20.04 -u username
    
  5. 开机自启配置

    • WSL2 默认不会自动启动

    • 如需开机自启,可以:

      1. 创建计划任务
      2. 添加到 Windows 启动项
      # 创建启动脚本 startup.vbs
      Set ws = CreateObject("WScript.Shell")
      ws.Run "wsl -d Ubuntu-20.04", 0
      
  6. 终端关闭影响

    • 关闭终端窗口不会停止 WSL 实例

    • 后台进程继续运行

    • 需要显式关闭才会停止:

      # 方法一:关闭特定发行版
      wsl --terminate <发行版名称>
      
      # 方法二:关闭所有 WSL 实例
      wsl --shutdown
      

Docker 网络连接问题解决方案

在 WSL2 中安装 Docker 后可能遇到网络连接超时问题,表现为无法拉取镜像:

docker run hello-world
# 错误:
# Unable to find image 'hello-world:latest' locally
# docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": 
# net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).
    # 在 .wslconfig 中设置
    [wsl2]
    memory=8GB
    processors=4
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
### 如何在 WSL 上安装配置 CUDA #### 准备工作 为了确保能够在 WSL 中成功安装并配置 CUDA,在此之前需确认已经正确设置好了 Windows Subsystem for Linux (WSL),并且选择了合适的 Linux 发行版,比如 Ubuntu 24.04。另外,还需保证系统能够连接互联网以便于下载必要的软件包和驱动程序[^1]。 #### 安装 NVIDIA 驱动程序和支持组件 对于 Windows 11 用户来说,操作系统本身提供了对 WSL 下 GPU 加速的支持功能。这意味着只要更新到最新版本的操作系统补丁,并启用相应的特性开关即可获得基本支持环境[^3]。具体操作可以通过 PowerShell 执行 `wsl --update` 命令来完成系统的升级准备;接着利用设备管理器中的显示适配器选项检查是否有适用于当前硬件的新版图形卡驱动可供安装。 #### 启用 WSL 2 并切换默认发行版至 WSL 2 由于只有基于 WSL 2 的实例才完全兼容完整的 CUDA 功能集,因此建议将所使用的 Linux 发行版转换成 WSL 2 模式。这一步骤可通过命令行工具轻松实现: ```powershell wsl --set-version <DistributionName> 2 ``` 其中 `<DistributionName>` 应替换为实际使用的发行版名称,例如 "Ubuntu" 或者其他自定义命名的空间名。 #### 获取并安装 CUDA Toolkit 当上述准备工作完成后,就可以着手获取官方发布的 CUDA Toolkit 来源文件了。访问[NVIDIA 开发者网站](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&Version=latest)选择适合 WSL 环境下的版本进行下载。按照提示逐步完成整个过程直至结束。通常情况下会涉及到接受许可协议条款、指定安装路径等交互环节,请根据个人需求做出合理的选择[^2]。 #### 测试 CUDA 是否正常运作 最后一步就是验证新安装好的 CUDA 是否可以正常使用。进入终端界面后尝试编译运行一段简单的测试代码如下面所示: ```cpp // test_cuda.cu #include <stdio.h> int main() { int deviceCount; cudaError_t error = cudaGetDeviceCount(&deviceCount); if(error != cudaSuccess){ printf("CUDA Error: %s\n", cudaGetErrorString(error)); return 1; } printf("Found %d CUDA devices.\n", deviceCount); for(int i = 0; i < deviceCount; ++i){ cudaDeviceProp prop; cudaGetDeviceProperties(&prop, i); printf("Device Number: %d\n", i); printf(" Device name: %s\n", prop.name); printf(" Memory Clock Rate (KHz): %d\n", prop.memoryClockRate); printf(" Memory Bus Width (bits): %d\n", prop.memoryBusWidth); printf(" Peak Memory Bandwidth (GB/s): %.2f\n\n", 2.0*prop.memoryClockRate*(prop.memoryBusWidth/8)/1.0e6); } } ``` 保存以上内容作为一个 `.cu` 文件之后,使用 nvcc 编译它: ```bash nvcc -o test_cuda test_cuda.cu ./test_cuda ``` 如果一切顺利的话,则应该可以看到有关本地 GPU 设备的信息输出,证明 CUDA 成功部署完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值