用这么久 Arch 了,但是却很少写 Arch 相关的博客……

最近常需要在虚拟机上装 Arch,所以把常用工具及配置整理在这儿,省得每次 pacstrap 时都要想半天咱需要装什么……


装系统

Arch Wiki 的 Installation Guide 在使用 pacstrap 装系统时只写了最基础的软件包 base, linuxlinux-firmware,可以在这一步补充亿些常用的软件。

pacstrap -K /mnt base linux linux-firmware \
    base-devel gcc grub amd-ucode intel-ucode \
    zsh zsh-syntax-highlighting zsh-autosuggestions \
    vim neovim git openbsd-netcat \
    sudo man-db htop wget \
    neofetch

进 chroot 后编辑 /etc/pacman.conf,添加以下配置,启用 Arch Linux CN。

# /etc/pacman.conf
[archlinuxcn]
# Server = https://repo.archlinuxcn.org/$arch
Server = https://mirrors.bfsu.edu.cn/archlinuxcn/$arch

之后安装 yay:

sudo pacman -Syy && sudo pacman -S archlinuxcn-keyring
sudo pacman -S yay

如果电脑上安装了其他系统的话,需要额外安装 os-prober,让 GRUB 在生成配置文件时搜索安装了其他系统的磁盘。

sudo pacman -S os-prober

如果是为 QEMU KVM 虚拟机装系统的话,在执行 grub-install 配置 UEFI 启动引导时记得加一个 --removable 参数。

sudo pacman -S efibootmgr
sudo grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB --removable
sudo grub-mkconfig -o /boot/grub/grub.cfg

如果不装其他网络工具,只使用 systemd-networkd 的话,需要创建一份默认的配置文件使用 DHCP,否则连不上网。

# /etc/systemd/network/10-default.network
[Match]
Name=enp*

[Network]
DHCP=yes

如果需要配置静态网络地址:
(这里只配置了静态 IPv4,如需要禁用 IPv6 的 DHCP,请参照下方桥接网络

# /etc/systemd/network/10-static.network
[Match]
Name=eth0

[Network]
Address=10.128.0.100/16
Gateway=10.128.0.1
DNS=10.128.0.1

并启用 systemd-networkd Systemd Service:

sudo systemctl enable systemd-networkd

基本上到这里就可以愉快的 reboot 了,一个精简的系统所需要的软件就基本装好了。

桥接网络

如果需要使用虚拟机的桥接网络,需要在物理网卡的基础上配置一个桥接网卡,然后为这个桥接网卡配置网络。

先创建一个 br0 网卡设备。

# /etc/systemd/network/25-br0.netdev
[NetDev]
Name=br0
Kind=bridge

br0 绑定到某个物理网卡设备。

# /etc/systemd/network/25-br0-en.network
[Match]
Name=en*

[Network]
Bridge=br0

br0 桥接网卡配置静态 IP 地址,这里禁用了 IPv4 和 IPv6 的 DHCP。

# /etc/systemd/network/25-br0.network
[Match]
Name=br0

[Network]
DHCP=no
DNS=10.128.0.1
IPv6AcceptRA=false

[Address]
Address=10.128.0.100/16

# IPv6 static address
# [Address]
# Address=fd00:cafe:abcd::1001/64

[Route]
Gateway=10.128.0.1
GatewayOnLink=yes

常用命令行工具

如果只作为服务器 / 不包含图形的虚拟机使用的话,装这些咱常用软件,这部分因人而异,仅供参考。

sudo pacman -S go \
    kubectl helm \
    docker docker-buildx \
    podman \
    privoxy \
    proxychains \
    wireguard-tools \
    axel aria2 \
    ffmpeg \
    jq go-yq \
    jdk8-openjdk \
    lm_sensors \
    net-tools traceroute \
    openssh \
    nodejs npm \
    python3 python-pip \
    btrfs-progs \
    bind \
    ethtool \
    bc \
    age

# golangci-lint
yay -S golangci-lint-bin \
    krew-bin

# 装完 Docker 后把普通用户添加到 docker group 中
sudo usermod -aG docker $USER

创建 Docker Daemon 的配置文件 /etc/docker/daemon.json,设定国内的 Mirror,这里用的是咱自己搭的反向代理:

{
  "insecure-registries" : [
    "127.0.0.1:5000"
  ],
  "registry-mirrors": [
    "https://docker.hxstarrys.me/"
  ]
}

除了 Docker,还建议使用 Podman 运行一些容器,使用方式和 Docker 没什么大区别,以免去 Daemon 依赖并支持 Systemd。

如果需要跑虚拟机,需要装 QEMU 和 libvirt 相关的组件(咱用 virsh 管理虚拟机,不手搓 qemu 指令):

sudo pacman -S qemu-full libvirt

K3s / RKE2 Server

在 Arch Linux 上安装了 K3s 或 RKE2,关机时会卡在 a stop is running for libcontainer containerd... 一分多钟……

参考 这个 Issue,创建一个 /etc/systemd/system/shutdown-k3s.service Systemd 文件。

(如果用的是 RKE2,把文件的 k3s 替换为 rke2)

[Unit]
Description=Kill containerd-shims on shutdown
DefaultDependencies=false
Before=shutdown.target umount.target

[Service]
ExecStart=/usr/local/bin/k3s-killall.sh
Type=oneshot

[Install]
WantedBy=shutdown.target

之后启用 shutdown-k3s.service,在关机时 Kill 掉 K3s。

sudo systemctl daemon-reload
sudo systemctl enable shutdown-k3s.service

WireGuard Client

如果 Arch Linux 还配置了 WireGuard 客户端,而这台 Arch Linux Server 被放在了家里,只能通过有公网 IP 的 WireGuard 服务器连接进去,这时尽管设置了 WireGuard 的 persistent keepalive,但在运营商更换了你家的公网 IP 后,还是会碰到无法自动连接回去的情况,这时可以用咱的 这个简单粗暴的脚本,在 WireGuard 断连一段时间后,自动重启接口。

图形界面

显卡驱动:

# AMD
sudo pacman -S xf86-video-amdgpu
# NVIDIA
# (咱并不喜欢 DKMS 因为每次更新内核都得编译一遍 Kernel Module,所以这里使用的和 Linux 内核一同更新的 NVIDIA Open Driver)
sudo pacman -S nvidia-open nvidia-utils nvidia-container-toolkit

X11/Wayland 这些相关组件会随着桌面环境一起安装,所以只需要装桌面环境即可,这里就不需要你额外装 X 了

Wayland on NVIDIA

在 NVIDIA 显卡上运行 Wayland 需要一些额外操作。

  • 增加 nvidia_drm.modeset=1 内核参数(记得重新生成 grub.cfg

    # /etc/default/grub
    GRUB_CMDLINE_LINUX="nvidia_drm.modeset=1"
    
  • 禁用 nouveau

    $ echo "blacklist nouveau" >> /etc/modprobe.d/blacklist.conf
    
  • KMS Early Load。

    # /etc/mkinitcpio.conf
    MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)
    
    # 然后移除 HOOKS 那一行里的 kms 以完全禁用 nouveau
    

    记得重新 mkinitcpio -P

GNOME

如果使用 GNOME Desktop(咱默认使用这个桌面),需要安装这些组件

sudo pacman -S gnome
# 通常不直接装 gnome-extra,而是从里面选咱需要的
sudo pacman -S gnome-tweaks
# GNOME 系统使用的 NetworkManager 需要额外安装并手动启用,否则无法联网
sudo pacman -S networkmanager
sudo systemctl enable --now NetworkManager

XFCE

对于服务器或 NAS 的图形界面,咱用 XFCE + TigerVNC Server。

sudo pacman -S xfce4 tigervnc

# 配置 VNC Server
mkdir ~/.vnc
cat > ~/.vnc/config << EOF
session=xfce
geometry=1920x1080
localhost=no
alwaysshared
EOF

# VNC 登录密码
vncpasswd

echo ":1=<USERNAME>" >> /etc/tigervnc/vncserver.users # 为用户配置使用 VNC 端口 5901 
sudo systemctl enable --now vncserver@:1

常用的 GUI 软件

装好图形界面并顺利跑起来之后,就可以装常用的桌面软件了,下面这些是部分可能用到的软件,这些因人而异,仅供参考。

sudo pacman -S vlc \
    virt-manager \
    ttf-monaco \
    noto-fonts noto-fonts-cjk noto-fonts-emoji ttf-dejavu \
    ibus ibus-rime \
    firefox \
    emacs

在 AUR 中安装的软件:

yay -S google-chrome \
    visual-studio-code-bin

启用 Multilib

启用 Multilib 以安装那些 32 位的软件,例如 Steam。

# /etc/pacman.conf
[multilib]
Include = /etc/pacman.d/mirrorlist

之后安装 Steam。

sudo pacman -S steam

如果需要加速 Steam 游戏,可以安装 uuplugin-bin,把电脑伪装成 Steam Deck,酱紫路由器有 UU 加速器插件的话就能给 Steam 加速。

yay -S uuplugin-bin

如果要运行 Windows 游戏,还要安装 Proton。

yay -S proton

音乐

netease-cloud-music 这个包已经很久没更新了,现在很多功能用不了,除了这个还有一些基于 GTK4 写的网易云音乐客户端也能用。

# yay -S netease-cloud-music # 网易云音乐 (很久未更新,不太好用)
sudo pacman -S netease-cloud-music-gtk4     # GTK4 版本的网易云音乐
sudo pacman -S electron-netease-cloud-music # Electron 网易云音乐
yay -S cider2-bin  # Apple Music (Cider2 软件需要购买)

流程图

Draw.io 这个工具画流程图很好用,而且支持 Linux,可以直接从 Arch Linux CN 安装。

sudo pacman -S drawio-desktop-bin

iPhone

如果需要挂载 iPhone 手机(安分守己)到电脑上,需要安装这些软件。

sudo pacman -Sy ifuse usbmuxd libplist libimobiledevice

之后挂载 iPhone 的数据到某个文件夹下,就可以把手机的照片通过数据线拷贝到电脑上了。

mkdir -p iPhone
ifuse ~/iPhone

未完待续,如果还想到了别的再补充到这儿。