在 WSL 上安装 Arch Linux
Arch Linux 作为 archlinux-wsl 项目的一部分,提供了一个官方的 WSL (Windows Subsystem for Linux) 镜像。
镜像每月构建并发布一次,旨在提供最简单但完整的系统,以便在 WSL 中获得纯正的 Arch Linux 体验。
安装
安装 WSL
在 UEFI 设置中启用虚拟化,然后从 Microsoft Store 安装 Windows Subsystem for Linux。
更新 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
此更改将在下次启动分发版时生效。
在 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 的
d3d12Gallium 驱动程序 - 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/996 和 Gentoo: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 可执行文件复制到你选择的目录,并在此旁边存储一个用于验证的证书。
将 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
附加后,你应该能通过 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 设备附加到 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
用户会话错误和早期崩溃
在 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