在 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 命令提示符中运行以下命令:
> 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` 应用程序,或者在 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/996 和 Gentoo: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 可执行文件复制到您选择的目录,并在此旁边存储用于身份验证的证书。
将 `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` 可以解决此问题。