在 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 回退到 Intel GPU 上的 llvmpipe 软件渲染器。
WSL 互操作性
WSL 在 Windows 和 WSL 之间提供互操作性。这允许您在 WSL 中运行 Windows 二进制文件。
它默认启用。您可以通过在 /etc/wsl.conf 文件中将 interop.enabled 设置为 false 来禁用它。 [1]
已经创建了各种工具,让您可以在 WSL 中利用 Windows 服务和功能。
桥接来自 Windows 的 ssh-agent 服务
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 是一个 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 包管理器。
> winget install usbipd
安装后,使用以下命令在 Windows 上识别可用的 USB 设备,并记下总线 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。
调整区域设置
默认情况下,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 可以解决此问题。