跳转至内容

在 WSL 上安装 Arch Linux

来自 ArchWiki

Arch Linux 作为 archlinux-wsl 项目的一部分,提供了一个官方的 WSL (Windows Subsystem for Linux) 镜像。

镜像每月构建并发布一次,旨在提供最简单但完整的系统,以便在 WSL 中获得纯正的 Arch Linux 体验。

注意 需要 WSL 2支持 WSL 1。本指南假设已安装最新的稳定版本。

安装

安装 WSL

在 UEFI 设置中启用虚拟化,然后从 Microsoft Store 安装 Windows Subsystem for Linux

注意 Store 版本的 WSL 现在是默认版本。你不应该启用“适用于 Linux 的 Windows 子系统”可选组件,也不需要安装 WSL 内核或 WSLg MSI 安装包,因为它们不再需要。使用 Store 版本的 WSL 可以让你比作为 Windows 组件时更快地获得 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 应用程序,或者在 Windows shell 中运行 wsl -d archlinux 来运行 WSL 中的 Arch Linux。

手动安装

下载 最新的 Arch Linux .wsl 镜像并双击它开始安装,或在 Windows shell 中运行以下命令

> wsl --install --from-file WSL_image

例如:

> wsl --install --from-file C:\Users\Username\Downloads\archlinux-2025.04.01.121271.wsl
提示 这将以默认分发版名称 archlinux 安装 WSL 镜像。如果你想以不同的名称导入,请添加选项 --name distro_name

然后,你可以通过开始菜单中的 archlinux 应用程序,或者在 Windows shell 中运行 wsl -d archlinux 来运行 WSL 中的 Arch Linux。

技巧与提示

设置默认用户

要设置一个不同于 root 的默认用户,首先确保该用户已被创建,然后在 /etc/wsl.conf 文件中追加以下内容

[user]
default=username

在关闭会话之前,请务必为你的 root 用户设置密码。如果你发现自己被“锁在外面”,请在

> wsl -u root

Windows 宿主的 CMD 窗口中调用

更改将在下次会话时生效。要终止当前会话,请在 Windows shell 中运行以下命令

> wsl --terminate archlinux

如果你使用的是 WSL 2.4.10 或更高版本,可以使用以下命令设置分发版的默认用户

> wsl --manage archlinux --set-default-user username

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

警告 当多个运行中的分发版其各自的默认用户共享相同的 UID 时,WSL 不支持在这些分发版中启用 systemd。建议为每个 WSL 分发版/镜像的默认用户使用不同的 UID(参见如何创建具有特定 UID 的用户)。

在 WSL 宿主浏览器中打开 URL

为了在 Windows 宿主浏览器中打开链接,请安装 xdg-utils 软件包。这对于 pkgctl repo web 等各种命令以及各种云供应商 CLI 工具(如 az login)的身份验证流程至关重要。

使用 WSLg 运行图形应用程序

WSLg (Windows Subsystem for Linux GUI) 是一个旨在在 WSL 内部运行具有音频 (PulseAudio) 和图形 (X11 和 Wayland) 支持的 Linux 应用程序的项目。

WSLg 默认启用。你可以通过在 WSL 配置文件中将 wsl2.guiApplications 设置为 false 来禁用它。

硬件加速渲染

要在 WSL 中启用 GPU 视频加速渲染,请安装以下软件包

  • mesa - 包含用于 OpenGL 的 d3d12 Gallium 驱动程序
  • vulkan-dzn - 包含实验性的 dzn (也称为 microsoft-experimental) Vulkan 驱动程序

你还需要安装 vulkan-icd-loader(如果你还想运行 32 位应用程序,则安装 lib32-vulkan-icd-loader)。

~/.bashrc
export GALLIUM_DRIVER=d3d12
export LIBVA_DRIVER_NAME=d3d12

如果 OpenGL 在 Intel GPU 上回退到 llvmpipe 软件渲染器,你需要为 libedit 创建一个符号链接

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

更多信息请参阅 https://github.com/microsoft/wslg/issues/996Gentoo:Gentoo in WSL#OpenGL falling back to llvmpipe software renderer on Intel GPUs

避免不必要的 GTK4 依赖

gtk4 依赖于 xdg-desktop-portal-gtk,而后者又会引入多个依赖项(如 pipewire, polkit, fuse3, 以及 rtkit),这些在 WSL 环境中可能是不需要的,会导致 Arch 客户机内部安装不必要的软件包。

为了防止这种情况,请从 AUR 安装 xdg-desktop-portal-gtk-dummyAUR。这是一个虚包,可以在不安装上述任何软件包的情况下满足 xdg-desktop-portal-gtk 的依赖关系,从而保持 WSL 环境精简。

提示 该虚包还设置了 ADW_DISABLE_PORTAL=1,这会使 libadwaita 应用程序遵循通过 nwg-look 等工具配置的 GTK 主题,而不是查询 portal。

WSL 互操作性

WSL 具有 Windows 和 WSL 之间的互操作性。这允许你在 WSL 内部运行 Windows 二进制文件。

该功能默认启用。你可以通过在 /etc/wsl.conf 文件中将 interop.enabled 设置为 false 来禁用它。[1]

已经创建了各种工具,允许你在 WSL 内部利用 Windows 服务和功能。

桥接 Windows 的 ssh-agent 服务

wsl2-ssh-agent 是一个允许你在 WSL 内部使用 Windows SSH agent 的工具。

如果你使用需要物理安全密钥甚至 Windows Hello*-sk SSH 密钥,这会特别有用。

安装 wsl2-ssh-agentAUR 并将以下内容添加到你的 ~/.bashrc

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

重启 shell,SSH_AUTH_SOCK 环境变量 应该会被正确配置。

使用 Windows Hello 进行 PAM 认证

WSL-Hello-Sudo 是一个 PAM 插件,允许你通过 Windows Hello 对用户进行身份验证。

安装 wsl-hello-sudo-binAUR 并运行 /opt/wsl-hello-sudo/install.sh。安装程序会将一个 Windows 可执行文件复制到你选择的目录,并在此旁边存储一个用于验证的证书。

提示 https://github.com/nullpo-head/WSL-Hello-sudo 已 4 年未更新,因此 wsl-hello-sudo-binAUR 使用了一个已合并依赖更新的分叉版本 (https://github.com/lzlrd/wsl-hello-sudo)。

auth sufficient pam_wsl_hello.so 添加到任何你希望使用 Windows Hello 验证的 /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

更多信息,请参阅 https://learn.microsoft.com/en-us/windows/wsl/wsl2-mount-disk

连接 USB 设备

usbipd-win 是一个允许将本地连接的 USB 设备共享给其他机器(包括 WSL 2)的项目。

你首先需要在 Windows 上安装该软件。你可以运行来自最新版本的安装程序 (.msi),或者使用 Windows Package Manager (winget)

> winget install usbipd

安装后,在 Windows 上运行以下命令识别可用 USB 设备并记录总线 ID (bus ID)

> usbipd list

通过运行以下命令准备你选择的 USB 设备(需要管理员权限)

> usbipd bind --busid busid
警告 请确保已关闭所有使用该 USB 设备的运行中应用程序。

然后,使用以下命令将 USB 设备附加到 WSL 2

> usbipd attach --wsl --busid busid

附加后,你应该能通过 lsusb 看到该设备。

要分离 USB 设备,请运行

> usbipd detach --busid busid

更多信息,请参阅 https://learn.microsoft.com/en-us/windows/wsl/connect-usb


调整区域设置 (Locale)

默认情况下,WSL 会尝试将你的区域设置设置为与 Windows 匹配。如果你想覆盖此设置,请运行

ln -sf /etc/locale.conf /etc/default/locale

然后像在任何其他安装中一样设置你的区域设置

故障排除

运行 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 要求根 (/) 目录以 rshared 传播方式挂载。

为此,请运行

# 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

Docker 初始化时间较长

如果您使用 docker.service 启动 WSL 会话,或者在 启动/启用 docker.socket 后执行 docker info 或任何其他 docker 命令,docker 的初始化可能会花费很长时间。

这是因为 docker.socket 尝试启动 systemd-networkd-wait-online.service 但失败了。

因此,禁用 systemd-networkd-wait-online.service 可以解决这个问题。

容器无法设置 caps

运行无根 (rootless) podman(或 docker)可能会出现如下错误:

ERRO[0000] running `/usr/sbin/newuidmap 410 0 1000 1 1 100000 65536`: newuidmap: Could not set caps
Error: cannot set up namespace using "/usr/sbin/newuidmap": should have setuid or have filecaps setuid: exit status 1

或者

WARN[0000] "/" is not a shared mount, this could cause issues or missing mounts with rootless containers

简单的解决方法就是重新安装 shadow

用户会话错误和早期崩溃

在 WSL 发行版启动或关闭时,可能会遇到与用户会话相关的错误,消息如下:

Failed to start the systemd user session for username. See journalctl for more details.

这可能会导致启动了一个“不完整”的用户会话(例如:loginctl show-user $UID 报告用户“未登录”,且 /run/usr/$UID 目录未填充,最终导致某些工具如 *rootless* podman 出现错误)。

在某些特定情况下,有些人还可能会遇到早期崩溃,即 WSL 窗口在几秒钟后(或执行几个命令后)意外关闭,随后在崩溃重启后出现上述用户会话相关错误。

虽然上述症状的实际原因目前尚不清楚,但启用会话残留 (session lingering) 似乎有所帮助

# loginctl enable-linger username

参见

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.