跳转至内容

在 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

注意 商店版本的 WSL 是 WSL 的当前默认版本。您不应启用“Windows Subsystem for Linux”可选组件,也不应安装 WSL 内核或 WSLg MSI 包,因为它们不再需要。使用商店版本的 WSL允许您比以前更快地获得 WSL 更新,因为以前它是一个 Windows 组件。WSLg也已包含在内

更新 WSL

要更新到最新稳定版的 WSL 和 WSLg,请在提升的 Windows 命令提示符中运行以下命令:

> 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

下次启动发行版时,此更改将生效。

在 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

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/sbin/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 使用了一个已合并依赖更新的 fork(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 包管理器

> winget install usbipd

安装后,使用以下命令在 Windows 上识别可用的 USB 设备并记下总线 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


调整区域设置

默认情况下,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` 可以解决此问题。

参见