Windows Subsystem for Linux (WSL) 详解:安装与配置 – wiki基地


Windows Subsystem for Linux (WSL) 详解:安装与配置指南

前言

在现代软件开发的浪潮中,Linux 因其强大的命令行工具、灵活的脚本能力以及开放的生态系统,成为了许多开发者和系统管理员的首选平台。然而,对于长期依赖 Windows 生态系统的用户而言,完全切换到 Linux 并非易事。虚拟机、双系统等解决方案都存在各自的弊端,如资源占用高、切换不便、硬件兼容性问题等。

正是在这样的背景下,微软推出了 Windows Subsystem for Linux (WSL),旨在弥合 Windows 与 Linux 之间的鸿沟。WSL 允许你在 Windows 环境下原生运行 ELF 格式的 Linux 二进制文件,为你提供一个集成度高、性能优越的 Linux 开发和运行环境。它不是一个传统的虚拟机,也不是一个简单的命令行模拟器,而是一种独特的兼容层技术。

本文将详细介绍 WSL 的概念、WSL1 与 WSL2 的区别,并提供详尽的安装和配置指南,帮助你轻松地在 Windows 系统中构建一个强大的 Linux 子系统环境。

什么是 WSL?为什么需要它?

WSL 的核心思想是让开发者能够在 Windows 上获得 Linux 的命令行体验和大部分工具链,而无需离开 Windows 桌面环境。它通过在 Windows 内核之上构建一个兼容层,将 Linux 系统调用转换为 Windows 系统调用(WSL1),或运行一个轻量级的虚拟机来托管标准的 Linux 内核(WSL2),从而实现 Linux 程序的执行。

为什么你需要 WSL?

  1. 开发便利性: 许多现代开发工具、框架(如 Node.js, Python, Ruby, Docker 等)、脚本和命令行工具(如 grep, sed, awk)最初或最佳运行环境是 Linux。WSL 让你可以在 Windows 上直接使用这些工具,无需复杂的交叉编译或部署到远程 Linux 服务器。
  2. 统一工作流: 开发者可以在同一个操作系统中处理 Windows 应用程序和 Linux 后端服务,无需频繁切换系统。
  3. 性能优越(WSL2): 相较于传统的虚拟机,WSL2 启动更快、资源占用相对较低,并且文件系统性能在 Linux 文件系统内非常接近原生 Linux。
  4. 与 Windows 集成: WSL 可以方便地访问 Windows 文件系统,也可以从 Windows PowerShell 或命令提示符中直接调用 Linux 命令。同时,WSLg (WSL Graphics) 的出现使得在 WSL 中运行 Linux GUI 应用程序成为可能,进一步模糊了 Windows 和 Linux 的界限。
  5. 隔离性: 可以在不同的 WSL 发行版中安装不同的开发环境,实现环境隔离,避免冲突。
  6. 易于管理: WSL 发行版可以像普通 Windows 应用程序一样安装、卸载、导入和导出。

WSL1 vs. WSL2:核心区别与选择

理解 WSL1 和 WSL2 的区别至关重要,因为它影响着性能、兼容性和功能。WSL2 是对 WSL1 的重大改进,也是微软推荐的默认版本。

WSL1 (第一代)

  • 工作原理: WSL1 不是运行一个 Linux 内核,而是在 Windows 内核之上实现了一个兼容层。它将 Linux 的系统调用翻译成 Windows 可以理解的系统调用。
  • 优点: 启动速度非常快,与 Windows 文件系统的互操作性稍好(直接访问 \\wsl$\ 更稳定)。
  • 缺点:
    • 兼容性有限: 无法运行所有 Linux 应用程序,特别是那些依赖于特定 Linux 内核功能(如 inotify, ptrace 等)的程序。Docker 这种需要深度内核集成的应用在 WSL1 中无法原生运行。
    • 文件系统性能差: 在访问 Linux 文件系统(ext4)时,性能远低于原生 Linux。
    • 网络兼容性问题: 有时网络配置比较复杂。

WSL2 (第二代)

  • 工作原理: WSL2 使用了轻量级虚拟机技术真实的 Linux 内核(基于最新的稳定分支,由微软定制和维护)。每个 WSL2 发行版都在自己的独立虚拟机中运行。
  • 优点:
    • 完全的系统调用兼容性: 能够运行几乎所有 Linux 应用程序,包括 Docker、Kubernetes、各种数据库等,因为它们直接与真实的 Linux 内核交互。
    • 卓越的文件系统性能: 在 Linux 文件系统(/home, / 等)内的读写性能与原生 Linux 几乎相当。
    • 更好的网络性能和兼容性。
    • 支持 WSLg: 可以在 WSL2 中运行带有 GUI 的 Linux 应用程序。
  • 缺点:
    • 启动时间稍长: 相比 WSL1,启动一个发行版需要几秒钟(但远快于传统虚拟机)。
    • 内存占用: 作为虚拟机,WSL2 会占用一定的内存资源,不过其设计旨在按需分配和释放内存。
    • Windows 文件系统访问: 从 WSL2 访问 Windows 文件系统(/mnt/c 等)的性能相较于 WSL1 有所下降,且有时会遇到权限问题。

选择建议:

强烈推荐使用 WSL2。 除非你有非常特殊的理由(例如运行在非常老的 Windows 版本上,或者极度看重从 Linux 访问 Windows 文件系统的性能),否则 WSL2 的兼容性和性能优势使其成为绝大多数场景下的最佳选择。本文后续的安装和配置主要围绕 WSL2 进行。

WSL 安装指南

安装 WSL 有两种主要方法:简单安装(推荐)和手动安装。简单安装适用于大多数现代 Windows 版本,会自动完成大部分步骤。手动安装则提供了更多的控制权,或用于旧版本的 Windows。

方法一:简单安装 (推荐)

这种方法适用于 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11。只需要一个命令,它会帮你完成所有必要的操作:启用 WSL 功能、启用虚拟机平台功能、下载并安装最新的 WSL2 Linux 内核、以及安装一个默认的 Linux 发行版(通常是 Ubuntu)。

  1. 打开 PowerShell 或 命令提示符 (管理员权限): 在 Windows 搜索栏输入 “PowerShell” 或 “cmd”,右键点击搜索结果,选择 “以管理员身份运行”。
  2. 执行安装命令:
    bash
    wsl --install
  3. 等待安装完成: 这个过程可能需要几分钟,具体取决于你的网络速度。期间会下载一些组件和安装默认的 Linux 发行版。
  4. 重启计算机: 安装完成后,系统会提示你重启计算机。
  5. 首次启动 Linux 发行版: 重启后,默认安装的 Linux 发行版会自动启动,并在新的终端窗口中运行。
  6. 创建用户账户: 首次启动时,系统会提示你创建一个新的 UNIX 用户账户(用户名和密码)。这个账户是你在 WSL 中使用的默认用户,也是 sudo 命令的默认用户。请记住你设置的密码。

至此,WSL 和一个默认的 Linux 发行版就已经安装并配置好了。

默认安装的发行版: 通常情况下,wsl --install 会默认安装最新版本的 Ubuntu。如果你想安装其他发行版,可以运行 wsl --install -d <发行版名称>。例如,安装 Debian:

bash
wsl --install -d Debian

要查看可用的发行版列表,可以运行:

“`bash
wsl –list –online

或 wsl -l -o

“`

方法二:手动安装 (适用于旧版本 Windows 或特殊需求)

手动安装步骤更多,但提供了对每一步的控制。

  1. 启用 WSL 功能:

    • 使用 PowerShell (管理员权限):
      powershell
      dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    • 使用图形界面: 打开 “控制面板” -> “程序” -> “启用或关闭 Windows 功能”,勾选 “适用于 Linux 的 Windows 子系统”,点击确定。
  2. 启用虚拟机平台功能 (WSL2 需要): WSL2 基于虚拟机技术,需要启用此功能。

    • 使用 PowerShell (管理员权限):
      powershell
      dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    • 使用图形界面: 打开 “控制面板” -> “程序” -> “启用或关闭 Windows 功能”,勾选 “虚拟机平台”,点击确定。
    • 注意: 如果你的 Windows 版本是 Windows 10 家庭版 (Home),并且版本低于 2004,可能无法直接使用 WSL2。需要升级到更高版本。
  3. 重启计算机: 完成上述功能启用后,需要重启计算机以使更改生效。

  4. 下载并安装 WSL2 Linux 内核更新包: 这是将 WSL1 升级到 WSL2 的关键步骤。

    • 访问 Microsoft 官方文档页面查找最新的内核更新包下载链接。通常链接是:https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
    • 下载 wsl_update_x64.msi 文件并运行它进行安装。按照安装向导提示完成安装即可。
  5. 将 WSL2 设置为默认版本: 安装内核更新包后,你的 WSL 环境已经具备运行 WSL2 的能力,但可能默认仍然使用 WSL1。运行以下命令将其设置为默认:
    bash
    wsl --set-default-version 2

    如果你之前安装过 WSL1 发行版,系统可能会提示你需要手动将其转换为 WSL2。转换命令是 wsl --set-version <发行版名称> 2

  6. 安装 Linux 发行版:

    • 打开 Microsoft Store 应用。
    • 在搜索框中输入 “WSL” 或你想安装的发行版名称(如 “Ubuntu”, “Debian”, “Kali Linux”, “openSUSE” 等)。
    • 选择你想安装的发行版,点击 “获取” 或 “安装”。
    • 安装完成后,点击 “启动”。
  7. 首次启动 Linux 发行版: 首次启动时,会有一个简短的安装过程,然后提示你创建 UNIX 用户账户和密码,过程同简单安装。

至此,手动安装 WSL2 并安装一个 Linux 发行版也完成了。

首次启动与基础配置

无论你使用哪种方式安装,首次启动 Linux 发行版后,都会进入终端界面。你需要完成以下几个基础配置步骤:

  1. 创建用户账户: 按照提示输入用户名和密码。请务必记住密码,后续使用 sudo 命令时需要它。这个用户会被自动添加到 sudo 组,拥有管理员权限。

  2. 更新软件包列表并升级已安装的软件包: 这是任何新安装的 Linux 系统上的第一步,确保你的系统拥有最新的安全补丁和软件版本。
    bash
    sudo apt update
    sudo apt upgrade

    sudo 命令用于以管理员权限执行后续命令。apt update 从软件源下载最新的软件包信息,apt upgrade 升级所有可升级的软件包。过程中可能需要输入你刚刚设置的用户密码。

  3. 安装常用工具: 根据你的需求,可以安装一些常用的 Linux 工具。例如:

    • git: 版本控制工具
    • curl, wget: 下载工具
    • vimnano: 文本编辑器
    • htop: 进程查看工具

    bash
    sudo apt install git curl wget vim htop

WSL 的基本使用

安装并完成首次配置后,你就可以开始使用 WSL 了。

  1. 启动 WSL:

    • 点击 Windows 开始菜单,找到你安装的 Linux 发行版(例如 “Ubuntu”),点击启动。
    • 在 Windows 搜索栏输入 “wsl” 或发行版名称,回车启动。
    • 打开 PowerShell 或 命令提示符,直接输入 wsl 回车,这会启动你的默认 WSL 发行版。
  2. 执行 Linux 命令: 在 WSL 终端中,你可以像在原生 Linux 系统中一样执行各种 Linux 命令。例如:
    bash
    ls -l /home
    pwd
    cd ~
    mkdir myproject
    python3 your_script.py
    docker ps # 如果安装了 Docker Desktop 并启用 WSL2 集成

  3. 访问 Windows 文件系统: WSL 会将你的 Windows 硬盘自动挂载到 /mnt/ 目录下。例如:

    • C: 盘挂载在 /mnt/c/
    • D: 盘挂载在 /mnt/d/
      你可以像访问 Linux 文件一样访问 Windows 文件:
      bash
      ls /mnt/c/Users/你的用户名/Documents
      cd /mnt/d/开发项目

      注意: 从 WSL2 访问 /mnt/c 的性能不如访问 WSL 文件系统内部(如 /home)。为了获得更好的性能,建议将开发项目存放在 WSL 文件系统内部,并通过 Windows 访问。
  4. 访问 Linux 文件系统 (从 Windows): 从 Windows 资源管理器、命令提示符或 PowerShell 中,你可以通过特殊的网络路径访问 WSL 的文件系统:
    bash
    \\wsl$\<发行版名称>

    例如,访问 Ubuntu 20.04 的文件系统:
    bash
    \\wsl$\Ubuntu-20.04\home\你的用户名\

    你可以在 Windows 资源管理器的地址栏直接输入这个路径,或者在 PowerShell 中使用 cd \\wsl$\Ubuntu-20.04 进入。

  5. 从 Windows 调用 Linux 命令: 你可以直接在 Windows 命令提示符或 PowerShell 中运行 WSL 中的 Linux 命令:
    powershell
    wsl ls -l
    wsl -- distribuição Debian bash -c "echo 'Hello from Debian' && apt update"
    wsl python your_script.py

  6. 从 WSL 调用 Windows 可执行文件: 在 WSL 中,你可以直接运行 Windows 的 .exe 程序:
    bash
    /mnt/c/Windows/System32/notepad.exe # 打开记事本
    explorer.exe . # 在 Windows 文件资源管理器中打开当前目录 (Linux 路径)
    cmd.exe /c dir # 运行 Windows 命令提示符命令

    Windows 的环境变量也通常在 WSL 中可用,所以很多时候你可以直接输入程序名而无需完整路径(例如 notepad.exe, explorer.exe)。

WSL 配置详解

除了首次启动时的基本配置,WSL 还提供了多种配置选项来满足更高级的需求。

  1. 管理 WSL 发行版:

    • 列出已安装的发行版:
      bash
      wsl --list --verbose
      # 或 wsl -l -v

      这个命令会显示已安装的发行版列表、它们的状态(Stopping, Stopped, Running)、WSL 版本(1 或 2)以及它们所在的虚拟内存大小。
    • 设置默认发行版: 当你只输入 wsl 命令时,会启动默认的发行版。
      bash
      wsl --setdefault <发行版名称>
      # 或 wsl -s <发行版名称>

      例如,将 Ubuntu-20.04 设置为默认:wsl -s Ubuntu-20.04
    • 设置特定发行版使用的 WSL 版本:
      bash
      wsl --set-version <发行版名称> <版本号: 1 或 2>

      例如,将 Ubuntu-20.04 转换为 WSL2:wsl --set-version Ubuntu-20.04 2。这个过程可能需要一些时间。
    • 注销发行版: 彻底删除一个 WSL 发行版及其所有数据。注意: 这个操作不可逆!
      bash
      wsl --unregister <发行版名称>
  2. 配置文件 .wslconfig (WSL2 特定配置):
    这是一个强大的配置文件,用于全局配置 WSL2 虚拟机的行为。它只影响 WSL2 发行版,对 WSL1 无效。

    • 文件位置: C:\Users\<你的Windows用户名>\.wslconfig
    • 创建文件: 如果文件不存在,你可以使用任何文本编辑器创建它。确保文件名为 .wslconfig (注意开头的点) 并且没有 .txt 后缀。
    • 文件格式: INI 文件格式。
    • 常用配置项:

      • [wsl2]:WSL2 相关的全局设置
        • memory=<数值>:设置 WSL2 VM 可使用的最大内存量(例如 memory=4GB)。默认为 Windows 总内存的 80%。
        • processors=<数值>:设置 WSL2 VM 可使用的处理器核心数(例如 processors=4)。默认为 Windows 的逻辑处理器总数。
        • swap=<数值>:设置交换空间的大小(例如 swap=8GB)。默认为总内存的 25%。
        • swapFile=<文件路径>:指定用于交换空间的 VHD 文件路径。默认为 %USERPROFILE%\.wsl\wsl.vmem
        • localhostForwarding=<布尔值>:是否启用 localhost 转发,允许从 Windows 访问在 WSL2 中运行的服务(例如 localhostForwarding=true)。默认为 true。
        • kernel=<文件路径>:指定要使用的自定义 Linux 内核文件路径。通常不需要修改。
        • bootCmd=<命令>:在 WSL2 VM 启动时执行的命令。
        • systemd=<布尔值>:自 WSL 新版本(Windows 11 22H2+)起,可以启用 Systemd 支持。设置为 systemd=true
        • dnsMode=<模式>:配置 DNS 解析模式(automatic, fixed, manual)。automatic 为默认,使用 Windows DNS 服务器。manual 允许你在 /etc/resolv.conf 中手动配置。
        • generateResolvConf=<布尔值>:是否自动生成 /etc/resolv.conf 文件。设置为 false 可以手动配置 DNS。
        • networkGateway=<IP地址>:手动配置网络网关(仅在 dnsMode=manual 时可能需要)。
        • staticIp=<IP地址>:为 WSL2 VM 分配静态 IP 地址(需要 dnsMode=manual)。
        • virtualSwitch=<交换机名称>:指定用于 WSL2 的虚拟交换机。
        • defaultKernelCmdLine=<命令>:添加到内核引导命令行的额外参数。
      • [experimental]:实验性功能配置
        • networkingMode=<模式>:配置网络模式(nat, bridged, mirrored)。nat 为默认。mirrored 是一种较新的模式,尝试镜像 Windows 网络接口,提供更好的局域网访问能力,但可能不稳定。
        • autoProxy=<布尔值>:是否自动检测 Windows 的代理设置并应用到 WSL。
        • sparseVhd=<布尔值>:是否让 VHD 文件自动收缩。
        • vmIdleTimeout=<时长>:设置 VM 空闲多久后自动关闭(例如 vmIdleTimeout=60 表示 60 秒)。设置为 0 可以禁用自动关闭。
      • [automount]:Windows 驱动器自动挂载配置
        • enabled=<布尔值>:是否自动挂载 Windows 驱动器(默认为 true)。
        • root=<挂载点>:设置 Windows 驱动器的根挂载点(默认为 /mnt/)。
        • options=<选项>:为所有自动挂载的驱动器添加额外的 mount 选项(例如 options="metadata,umask=22,fmask=111")。
        • mountFsTab=<布尔值>:是否处理 Linux 发行版内部的 /etc/fstab 文件(默认为 true)。
    • 示例 .wslconfig 文件:
      “`ini
      [wsl2]
      memory=8GB # 将最大内存限制为 8GB
      processors=6 # 使用 6 个处理器核心
      swap=0 # 禁用交换空间
      localhostForwarding=true # 启用本地端口转发 (默认已启用)
      # bootCmd=service ssh start # 示例:WSL2 VM 启动时自动启动 SSH 服务

      [experimental]

      networkingMode=mirrored # 尝试使用镜像网络模式

      autoProxy=true # 自动使用 Windows 代理设置

      [automount]

      enabled=true # 启用自动挂载 Windows 驱动器 (默认已启用)

      root=/windrives/ # 将 Windows 驱动器挂载到 /windrives/ 下

      options=”metadata,umask=22,fmask=111″ # 添加 mount 选项

      mountFsTab=true # 处理 /etc/fstab (默认已启用)

      ``
      * **应用配置:** 修改
      .wslconfig文件后,需要完全关闭所有正在运行的 WSL 发行版(可以使用wsl –shutdown` 命令)然后重新启动它们,配置才会生效。

  3. Linux 发行版内部配置:
    这部分配置与原生 Linux 系统一致,例如:

    • shell 配置: 修改 ~/.bashrc, ~/.zshrc 等文件来自定义命令行提示符、别名、环境变量等。
    • 环境变量: 在 shell 配置文件或 /etc/profile 等文件中设置 PATH、LD_LIBRARY_PATH 等环境变量。
    • 软件安装与管理: 使用发行版自带的包管理器(如 apt, yum, pacman)安装、更新、卸载软件。
    • 服务管理: 启动、停止、重启服务。如果你的 WSL 版本支持 systemd (.wslconfig 中设置 systemd=true),可以使用 systemctl 命令;否则,可能需要使用发行版提供的其他服务管理方式或直接运行二进制文件。
    • 网络配置: 通常 /etc/resolv.conf 会由 WSL 自动管理,指向 Windows 的 DNS 服务器。如果你需要手动配置 DNS,可以在 .wslconfig 中设置 generateResolvConf=false,然后手动编辑 /etc/resolv.conf。注意手动修改 /etc/resolv.conf 后,最好使用 sudo chattr +i /etc/resolv.conf 命令将其设置为不可修改,防止被 WSL 自动覆盖。
    • 文件权限: 在 WSL 文件系统 (/home, / 等) 中,标准的 Linux 文件权限(rwx)生效。在访问 Windows 文件系统 (/mnt/c 等) 时,由于底层是 Windows 文件系统,权限模型不同。WSL 会尝试映射权限,但可能不完美。.wslconfig 中的 [automount] 部分可以配置文件权限的映射方式。
  4. 导出和导入 WSL 发行版:
    这是备份、迁移或复制 WSL 环境的好方法。

    • 导出: 将一个发行版的状态导出到一个 tar 文件中。
      bash
      wsl --export <发行版名称> <导出文件路径>

      例如:wsl --export Ubuntu-20.04 D:\WSL_Backups\ubuntu_backup.tar
      导出前最好先关闭该发行版 (wsl --terminate <发行版名称>)。
    • 导入: 从导出的 tar 文件中创建一个新的发行版。
      bash
      wsl --import <新的发行版名称> <安装位置路径> <导出文件路径> [版本号: 1 或 2]

      例如:wsl --import MyUbuntu D:\WSL_Distros\MyUbuntu D:\WSL_Backups\ubuntu_backup.tar --version 2
      导入命令非常有用,你可以将发行版安装到非系统盘,节省 C 盘空间。

常见问题与故障排除

  • 虚拟化未启用: 如果安装 WSL2 或启动 WSL2 发行版时报错,提示与虚拟化有关,需要检查你的主板 BIOS/UEFI 设置,确保 “Virtualization Technology” (VT-x 或 AMD-V) 已启用。同时,在 Windows 的 “启用或关闭 Windows 功能” 中确保 “虚拟机平台” 已勾选。
  • WSL2 内核更新包未安装/版本过旧: 确保你下载并安装了最新版本的 WSL2 Linux 内核更新包 (wsl_update_x64.msi)。
  • 网络问题:
    • 检查 Windows 的网络连接是否正常。
    • 如果 /etc/resolv.conf 被自动覆盖导致 DNS 解析失败,可以在 .wslconfig 中设置 generateResolvConf=false 并手动配置 /etc/resolv.conf,然后将其设置为不可修改 (sudo chattr +i /etc/resolv.conf)。
    • 尝试重启 WSL (wsl --shutdown 然后重新启动发行版)。
  • 文件权限问题 (访问 /mnt/c):/mnt/c 等 Windows 驱动器上,Linux 的文件权限与 Windows ACL 存在映射问题。如果遇到权限不足,可以尝试使用 sudo 或检查 .wslconfig 中的 [automount] 配置。对于需要在 WSL 中频繁访问和修改的项目,强烈建议将其存放在 WSL 文件系统内部 (~/home 下)。
  • WSL 启动失败或卡住: 尝试使用 wsl --shutdown 完全关闭 WSL 服务,然后重新启动。检查 Windows 服务中 “LxssManager” 是否正在运行。
  • 磁盘空间占用过大: WSL2 的虚拟硬盘文件 (.vhdx) 会随着使用而增长。可以使用 wsl --list --verbose 查看发行版的大小。可以进入该发行版,清空不需要的文件,然后从 PowerShell 中运行 wsl --shutdown,再启动发行版,WSL 会自动尝试收缩 .vhdx 文件大小。或者,可以手动优化 VHD 文件(高级操作)。

结论

Windows Subsystem for Linux (WSL) 是微软为开发者提供的一个强大工具,它有效地结合了 Windows 的易用性和桌面环境优势,以及 Linux 灵活的命令行、丰富的工具链和开放生态。尤其是 WSL2,通过引入真实的 Linux 内核和轻量级虚拟机技术,极大地提升了兼容性和性能,使得在 Windows 上进行 Linux 开发成为一种流畅且高效的体验。

通过本文的详细安装和配置指南,你应该已经能够成功地在你的 Windows 系统上搭建起 WSL 环境,并进行基本的配置和使用。从简单的命令行操作到复杂的开发环境搭建,WSL 都为你提供了坚实的基础。

现在,你可以自由地探索 Linux 世界,在 Windows 上运行你所需的 Linux 工具和应用程序,享受跨平台的开发便利。不断实践和配置,你会发现 WSL 能为你带来更多惊喜。祝你在 WSL 的世界里使用愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部