跳转到内容
来自 Arch Linux 中文维基

作为 archlinux-wsl 项目的一部分,Arch Linux 提供官方 WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统) 镜像。

镜像每月构建并发布一次,旨在通过最简且完整的系统在 WSL 上提供完整的 Arch Linux 体验。

注意:该项目仅为 WSL 2 构建镜像,不支持 WSL 1。

安装

安装 WSL

在 UEFI 设置中启用虚拟化,然后从 Microsoft Store 安装 Windows Subsystem for Linux(适用于 Linux 的 Windows 子系统)

注意:Microsoft Store 内的 WSL 是默认版本。不要启用 "Windows Subsystem for Linux" 组件,也不要安装 WSL 内核或 WSLg 的 MSI 安装包,因为它们不再被需要。相比于 Windows 组件,使用 Microsoft Store 版本的 WSL 可让您更快地获取更新WSLg 现也已被打包。

更新 WSL

要更新到最新稳定版的 WSL 和 WSLg,在具有管理员权限的 Windows 的命令行 Shell 中执行以下命令:

> wsl --update

要更新到最新的预发行版本,请换用以下命令:

> wsl --update --pre-release

在 WSL 上安装 Arch Linux

已安装了 WSL 2 的 Windows 系统上遵循以下安装方式之一:

自动安装

在 Windows 的命令行 Shell 中执行该命令:

> wsl --install archlinux

然后您可以在开始菜单中通过 archlinux 应用程序在 WSL 中运行 Arch Linux,亦可在 Windows 的命令行 Shell 中执行 wsl -d archlinux

如果您不希望使用 WSL 的默认安装路径和发行版名称,可以使用以下命令:

> wsl --install -d archlinux --name 自定义名称 --location 自定义路径

其中 --name 用于设置名称,--location 用于设置安装路径,例如:

> wsl --install -d archlinux --name Arrrrch --location D:\WSLOS\Arch

执行 wsl --help 命令以查看 WSL 的更多操作。

手动安装

注意:需要 WSL 2.4.4 及更新版本,关于更旧版本,请参阅本文的历史修订 31886

下载最新的 Arch Linux .wsl 镜像,然后双击以进行安装或在 Windows 的命令行 Shell 中执行以下命令:

> wsl --install --from-file WSL_image

例如:

> wsl --install --from-file C:\Users\用户名\Downloads\archlinux-2025.04.01.121271.wsl
提示:这会以默认发行版名称 archlinux 安装 WSL 镜像,若您欲以不同名称导入,请添加 --name Distro_name 选项。

然后您可以在开始菜单中通过 archlinux 应用程序在 WSL 中运行 Arch Linux,亦可在 Windows 的命令行 Shell 中执行 wsl -d archlinux

提示和技巧

设定默认用户

要设定 root 以外的默认用户,首先确保该用户已被创建,然后将以下行添加到 /etc/wsl.conf

[user]
default=username

关闭会话前记得为 root 用户设置密码,如果您被“拒之门外”,请在 Windows 主机的 CMD 中执行:

> wsl -u root

此更改将在下次会话启动时生效,要终止当前会话,请在 Windows 的命令行 Shell 中执行以下命令:

> wsl --terminate archlinux

若您使用 WSL 2.4.10 或更新版本,则可以使用以下命令为您的发行版设定默认用户:

> wsl --manage archlinux --set-default-user 用户名

此更改将在下次启动时生效。

用 WSLg 运行图形界面应用程序

WSLg(Windows Subsystem for Linux GUI)项目致力于让 WSL 支持 Linux 音频(PulseAudio)和图形界面(X11 和 Wayland)

WSLg 默认启用,您可在 WSL 配置文件中将 wsl2.guiApplications 设为 false 以将其关闭。

WSL 可在打开会话时创建 X11 和 Wayland 服务器套接字的符号链接,但在初始化时会被 systemd 覆盖。更多信息参见microsoft/wslg#1032

注意:符号链接覆写问题已在 WSL 预发行版 2.5.7.0 中修复,但依然需要设置 GALLIUM_DRIVER=d3d12 环境变量。

在等待上游修复该问题时,您可以手动创建这些符号链接。首先,创建一个 systemd-tmpfiles 配置以链接到包含 X11 服务器套接字的目录:

/etc/tmpfiles.d/wslg.conf
#      Path         Mode UID  GID  Age Argument
L+     %T/.X11-unix -    -    -    -   /mnt/wslg/.X11-unix

然后创建以下文件以链接到包含 PulseAudio 和 Wayland 服务器套接字的目录并设定 Gallium 驱动程序:

/etc/profile.d/wslg.sh
export GALLIUM_DRIVER=d3d12

for i in "/mnt/wslg/runtime-dir/"*; do
  [ "$XDG_RUNTIME_DIR" = "$HOME" ] && XDG_RUNTIME_DIR="/var/run/user/$UID"
  if [ ! -L "$XDG_RUNTIME_DIR/$(basename "$i")" ]; then
    [ -d "$XDG_RUNTIME_DIR/$(basename "$i")" ] && rm -r "$XDG_RUNTIME_DIR$(basename "$i")"
    ln -s "$i" "$XDG_RUNTIME_DIR/$(basename "$i")"
  fi
done

此更改将在下次会话启动时生效,要终止当前会话,请在 Windows 的命令行 Shell 中执行以下命令:

> wsl --terminate archlinux

硬件加速渲染

要在 WSL 中使用硬件加速渲染,请安装以下软件包:

  • mesa - 包含 OpenGL 所需的 d3d12 Gallium 驱动
  • vulkan-dzn - 包含实验性的 dzn(亦作 microsoft-experimental)Vulkan 驱动

还需要安装 vulkan-icd-loader(要运行 32 位应用程序则亦需安装 lib32-vulkan-icd-loader)。

若 openGL 依然在英特尔 GPU 上使用 llvmpipe 软件渲染,则需要为 libedit 创建符号链接:

# ln -s /usr/lib/libedit.so /usr/lib/libedit.so.2

更多信息参见 Issue 996GentooGentoo in WSL#OpenGL falling back to llvmpipe software renderer on Intel GPUs

WSL 互操作

WSL 支持与 Windows 互操作,这让您可以从 WSL 运行 Windows 二进制程序。

其默认启用,您可在 /etc/wsl.conf 中将 interop.enabled 设定为 false 以将其禁用[1]

有一些工具能让您在 WSL 内使用 Windows 服务和功能。

从 Windows 桥接 SSH 代理服务

wsl2-ssh-agent 工具允许您在 WSL 内使用 Windows SSH 代理

当您使用需要物理安全密钥甚至是 Windows Hello*-sk SSH 密钥时,这会很有用。

安装 wsl2-ssh-agentAUR 并将以下行添加到您的 ~/.bashrc

eval "$(/usr/sbin/wsl2-ssh-agent)"

重启 shell,SSH_AUTH_SOCK 环境变量 应该已正确设置。

使用 Windows Hello 进行 PAM 认证

WSL-Hello-Sudo 是一个使用 Windows Hello 进行用户身份认证的 PAM 插件。

安装 wsl-hello-sudo-binAUR 并运行 /opt/wsl-hello-sudo/install.sh。安装程序会复制一个 Windows 可执行程序到您选定的目录并存储用于身份认证的证书。

提示:WSL-Hello-Sudo 已经 4 年没有更新了,因此 wsl-hello-sudo-binAUR 打包了一个分支,合并了一些依赖更新。

欲使用 Windows Hello 进行认证,将 auth sufficient pam_wsl_hello.so 行添加到 /etc/pam.d 中相应组件的配置文件,例如 Sudo:

/etc/pam.d/sudo
#%PAM-1.0
auth            sufficient      pam_wsl_hello.so
auth            include         system-auth
account         include         system-auth
session         include         system-auth

向 WSL 连接设备

WSL 2 是一个 Hyper-V 虚拟机,这使得设备可以从主机(Windows)直连到客户机(WSL 2)。

挂载磁盘

WSL 2 支持附加并挂载 Windows 可用的磁盘。

欲如此做,首先请用以下 PowerShell 命令获取磁盘的 DeviceID

> GET-CimInstance -query "SELECT * from Win32_DiskDrive"

找到欲挂载的磁盘后,请在 Windows 上执行以下命令(需要管理员权限):

> wsl --mount DeviceID --bare
警告:这会使相应磁盘在 Windows 上下线,挂载前确保您已关闭所有正在使用该驱动器的应用程序。

附加后,您应当可以用 lsblk 看到该磁盘。

要取消挂载,请运行:

> wsl --unmount DeviceID

欲获取更多信息,请参阅 官方文档(中文文档在此)。

连接 USB 设备

usbipd-win 项目可以将本地连接的 USB 共享到其他设备,包括 WSL 2。

首先请在 Windows 上安装该软件。您可以选择运行最新发布的安装程序(.msi)或使用 Windows 包管理器

> winget install usbipd

安装完成后,请在 Windows 上执行以下命令,找到欲共享的 USB 设备,特别留意其 bus ID:

> usbipd list

执行以下命令以准备欲共享的 USB 设备(需要管理员权限):

> usbipd bind --busid busid
警告:确保您已关闭了所有使用该 USB 设备的应用程序。

然后执行以下命令将 USB 设备连接到 WSL 2:

> usbipd attach --wsl --busid busid

连接后,您应当可以用 lsusb 看到该设备。

要与 USB 设备断开连接,请执行:

> usbipd detach --busid busid

欲获取更多信息,请参阅官方文档

疑难解答

systemd 支持

Arch Linux WSL 镜像支持 systemd

然而,有一些已知问题可能需要额外操作才能使 systemd 正常工作。

systemd 需要纯 cgroup v2 支持

目前,WSL 默认以 cgroup v1 支持启动系统[2],但 256 版本后的 systemd 不支持 cgroup v1 [3],需要纯 cgroup v2支持。

在等待 WSL 默认以 cgroup v2 支持启动系统时,您可以在 Windows 系统的 %USERPROFILE%\.wslconfig 文件(若不存在则创建)中强制禁用 cgroup v1 支持,如下:

[wsl2]
kernelCommandLine = cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1

此更改将在下次会话启动时生效,要终止当前会话,请在 Windows 的命令行 Shell 中执行以下命令:

> wsl --terminate archlinux

Docker 容器运行出错

从 WSL 运行 Docker 容器可能会出现如下报错:

Error response from daemon: path / is mounted on / but it is not a shared or slave mount
Error: failed to start containers

有可能是 docker run 之类的命令一直挂起而不输出。

因为 Docker 需要根目录(/)被挂载为可共享。

欲修复,请运行:

# mount --make-rshared /

欲持久化该更改,您可以创建一个 systemd 服务,使其在启动时就执行命令:

/etc/systemd/system/mount-root-rshared.service
[Unit]
Description=Remount / with shared propagation
Requires=-.mount
After=-.mount

[Service]
Type=oneshot
ExecStart=/bin/mount --make-rshared /

[Install]
WantedBy=local-fs.target

然后启动/启用 mount-root-rshared.service

关于该选项的更多信息,请参阅 mount(8) § Shared subtree operations

参见