The Arch Way

Arch 的核心原则是 KISS(Keep It Simple Stupid)。这让它和 Ubuntu , RedHat 有着显著的区别。后者会考虑到开箱即用,而Arch不会,Arch会尽可能的保持和上游一致,而只做最小范围的更改。

Arch 崇尚的 KISS 不是站在使用者的角度出发的,而是站在维护者的角度出发的。软件打包或者说封装集成上,应该尽可能的的简单,最好什么都不做。然后提供手册,由用户自己要去进行组装配置。

本文将分享一个手动导入 archlinux-bootstrap 镜像文件,搭建基础的 ArchLinux WSL2 命令行环境的配置方法。

如果你觉得本文的配置方法太复杂,那么建议你使用 ArchWSL 项目,或者参考我编写的自动化配置脚本

当然对于 Arch 用户而言,折腾其实是一种乐趣。如果你体会不到这种乐趣,那么可能 Arch 并不适合你。

环境要求

  1. win 10 / 11 最新版本系统
  2. 默认 WSL 版本为 2 wsl --set-default-version 2
  3. 已通过 wsl --install 安装过一个其他的 WSL2 发行版,或者有其他 Linux 机器。用于生成 rootfs 文件

我当前(2023/3/13)的软件版本为:

wsl --version
----
WSL version: 1.1.3.0
Kernel version: 5.15.90.1
WSLg version: 1.0.49
MSRDC version: 1.2.3770
Direct3D version: 1.608.2-61064218
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22621.1265

打包 rootfs

ArchLinux 的镜像仓储中,会保存一份 archlinux-bootstrap-x86_64.tar.gz 文件,是当前最新版本的 bootstrap tar镜像。我们可以通过 tar/bsdtar 命令将其转换为 WSL 所需的 rootfs 文件。

在已有的 WSL2 发行版中,执行下述命令

# 切换到家目录
cd ~

# 从清华镜像下载 bootstrap-x86_64.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/archlinux-bootstrap-x86_64.tar.gz

# 使用bsdtar解压bootstrap tar.gz压缩文件
# 使用bsdtar而非tar是因为GNU tar不会保留拓展属性(extended attributes)
# https://wiki.archlinux.org/title/Full_system_backup_with_tar
sudo bsdtar -xpvf archlinux-bootstrap-x86_64.tar.gz
# 重新打包为archlinux-bootstrap.tar文件
sudo bsdtar -cpvf archlinux-bootstrap.tar -C root.x86_64 .
# 移动archlinux-bootstrap.tar到D盘
mv archlinux-bootstrap.tar /mnt/d

在Windows中导入 archlinux-bootstrap.tar 为 Arch WSL2发行版

wsl --import Arch C:\Arch D:\archlinux-bootstrap.tar

至此你已经有了一个可用的 Arch WSL 发行版,但是就和安装 Arch 一样,你还是需要进行一些初始配置。

配置 locale

设置 en_US.UTF-8

sed -i -e "s/^#en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/" /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
locale

配置 pacman

# 配置镜像
echo 'Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch' > /etc/pacman.d/mirrorlist

# 初始化 keyring,这是关键安全配置
# https://wiki.archlinux.org/title/Pacman/Package_signing
pacman-key --init && pacman-key --populate
pacman -Sy archlinux-keyring && pacman -Su

# disable sandbox
# https://bbs.archlinux.org/viewtopic.php?id=299402
# fix error: restricting filesystem access failed because the landlock rule for the temporary download directory could not be added!
sed -i \
-e "s/^#DisableSandbox/DisableSandbox/" \
/etc/pacman.conf

安装必备软件

看自己的需求,安装必备软件

pacman -S --needed vim sudo wget man

配置 systemd

# 启用 systemd
echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf

# 关闭 wsl 使 systemd 生效
wsl --shutdown

# 校验 systemd 是否启动成功
ps --no-headers -o comm 1

随着 ArchLinux 的升级,WSL 中附带的 Systemd 已不再完全兼容(2024/4/6)。部分服务会无法启动,如 docker。

由于 ArchLinux 社区的行为守则中已明确声明不会考虑与其他操作系统或分支版本兼容,ArchLinux - Code of Conduct。所以此类兼容问题,ArchLinux 官方社区是不会响应的,我们只能借助 ArchWSL 社区解决。

产生问题的原因可能是由于 Systemd 已经弃用了cgroups v1,详见: systemctl initializing · Issue #356 · yuk7/ArchWSL

此问题目前的临时解决方案是手动取消一直在运行中的服务,主要是: systemd-firstboot。取消他们即可让其他服务恢复运行。

然后禁用 systemd-networkd-wait-online 服务, 否则下次它仍会卡住。

sudo systemctl list-jobs | grep running
sudo systemctl cancel <job-number>
sudo systemctl disable systemd-networkd-wait-online

fix systemd issue

如果遇到 docker 等服务启动失败,可以参考 WSL ISSUE 11857 配置 windows 宿主机 .wslconfig 配置文件, 来默认启用 cgroup v2。该配置文件的详细说明,可参考 wsl-config doc

; 设置kernelCommandLine
[wsl2]
kernelCommandLine=cgroup_no_v1=all systemd.unified_cgroup_hierarchy=1

; 或配置 autoMemoryReclaim
[experimental]
autoMemoryReclaim=gradual

配置用户

创建一个用户“ws”,并允许其使用 sudo

# 配置 sudo
EDITOR=vim visudo
--
%wheel ALL=(ALL:ALL) ALL

# 新增用户 ws 并加入 wheel用户组
useradd ws -m -G wheel -s /bin/bash
# 设置用户密码
passwd ws

# 设置 ws 为默认用户
echo -e "[user]\ndefault = ws" >> /etc/wsl.conf
# 禁用 root 账户
passwd -l root

# 重启 wsl 使配置生效
wsl --shutdown

安装 docker

在 Arch 中安装 Docker还是比较简单的,官方源里自带了。 这里我配置了日志文件最大为100m,并使用了网易的Docker镜像。

sudo pacman -S docker
sudo usermod -aG docker ws
newgrp docker
sudo mkdir /etc/docker

MIRROR=http://hub-mirror.c.163.com
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "registry-mirrors": ["$MIRROR"]
}
EOF

sudo systemctl enable docker

修复wslg问题

echo \
'# Type Path           Mode UID  GID  Age Argument
L+     /tmp/.X11-unix -    -    -    -   /mnt/wslg/.X11-unix' | sudo tee /etc/tmpfiles.d/wslg.conf

参考:ArchWSL ISSUE Wslg ISSUE

导出镜像

配置完成后,记得将 WSL 实例导出,免去重复配置的烦恼。在windows下运行:

# 导出
wsl --export Arch Arch.tar
# 导入
wsl --import Arch C:\Arch Arch.tar

导出/导入时,可使用 --vhd 参数来导入导出 vhdx 文件,也可以直接备份 C:\Arch 下的vhdx

最后

bsdtar的思路来源于 ArchWSL-FS,感谢原作者。

你也可以通过 Linux 官方镜像下载 archlinux-bootstrap-x86_64.tar.gz,其他主流发行版的源也都在其中。

如果你要触类旁通安装 Fedora,可以下载 Fedora 的容器镜像 ,解压出 layer.tar 进行导入。下载地址: https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/36/Container/x86_64/images/