17 - Arch Linux 深度玩法

超出桌面使用,进入系统工程师领域——内核定制、启动钩子、包管理自动化、系统救援。


17.1 mkinitcpio 定制

配置文件

# /etc/mkinitcpio.conf
# 这个文件决定 initramfs(启动镜像)的内容和行为
 
MODULES=() # 手动加载的内核模块
BINARIES=() # 额外二进制文件
FILES=() # 引导时需要的配置文件
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)

HOOKS 详解

Hook作用何时需要
base基础环境(必须)永远
udev设备管理永远
autodetect只保留当前硬件需要的模块(减小镜像)单机使用
microcode加载 CPU 微码(intel-ucode/amd-ucode)永远
modconf加载 /etc/modprobe.d 配置永远
kms尽早启动图形模式有图形界面
keyboard键盘驱动加密文件系统
keymap键盘布局加密 + 非 US 键盘
consolefont控制台字体TTY 美化
block块设备永远
filesystems文件系统驱动永远
fsck文件系统检查永远
encrypt解密 LUKS加密根分区
lvm2LVM 支持使用 LVM
btrfsBtrfs 工具使用 Btrfs
resume休眠恢复使用休眠
plymouth启动画面美化启动过程

优化示例

# 极简系统(无加密、无 LVM)
HOOKS=(base udev autodetect microcode modconf kms keyboard consolefont block filesystems fsck)
 
# 加密 Btrfs 系统
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt btrfs filesystems fsck)
 
# LVM + 加密
HOOKS=(base udev autodetect microcode modconf kms keyboard keymap consolefont block encrypt lvm2 filesystems fsck resume)
 
# 重建 initramfs
sudo mkinitcpio -P

压缩选择

# /etc/mkinitcpio.conf
COMPRESSION="lz4" # 最快解压(推荐桌面用户)
# COMPRESSION="zstd" # 平衡
# COMPRESSION="xz" # 最小(嵌入式/慢启动)
# COMPRESSION="cat" # 不压缩(调试用)
 
COMPRESSION_OPTIONS=() # lz4 的 -l 选项自动加

17.2 内核选择与编译

Arch 官方内核

# 查看可用内核
pacman -Ss ^linux$
 
linux # 主线稳定(推荐)
linux-lts # 长期支持(服务器)
linux-zen # 桌面优化(MuQSS 调度器、更低延迟)
linux-hardened # 安全加固

安装 linux-zen(桌面用户推荐)

sudo pacman -S linux-zen linux-zen-headers
sudo grub-mkconfig -o /boot/grub/grub.cfg # 更新引导菜单

编译自定义内核

# 1. 获取源码
git clone https://github.com/archlinux/linux.git
cd linux
 
# 2. 基于当前配置调整
zcat /proc/config.gz > .config
# 或复制 Arch 默认的:
# cp /usr/src/linux/config .config
 
# 3. 配置(三选一)
make nconfig # ncurses 菜单(推荐)
make menuconfig # 传统菜单
make xconfig # Qt 图形界面
 
# 4. 关键优化项
# General setup → Local version → 写 "-custom" 作为版本后缀
# Processor type → 选你自己的 CPU 系列
# 禁用不需要的驱动(减少编译时间 90%)
 
# 5. 编译
make -j$(nproc) # 用全部核心
make modules_install
cp arch/x86/boot/bzImage /boot/vmlinuz-linux-custom
sudo mkinitcpio -k /boot/vmlinuz-linux-custom -g /boot/initramfs-linux-custom.img
 
# 6. 更新 GRUB
sudo grub-mkconfig -o /boot/grub/grub.cfg

内核模块管理

# 立即加载模块
sudo modprobe vfio-pci
 
# 启动时加载
echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio.conf
 
# 禁用模块
echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia.conf
echo "blacklist pcspkr" | sudo tee /etc/modprobe.d/nobeep.conf # 禁用主板蜂鸣器
 
# 模块参数
echo "options snd_hda_intel power_save=0" | sudo tee /etc/modprobe.d/audio.conf

17.3 Pacman Hooks —— 自动化系统管理

# 目录:/etc/pacman.d/hooks/
# 每次 pacman 操作后自动触发
 
# 示例 1:更新引导菜单(每次内核/GRUB 更新后)
# /etc/pacman.d/hooks/grub.hook
[Trigger]
Operation = Install
Operation = Upgrade
Operation = Remove
Type = File
Target = usr/lib/modules/*/vmlinuz
Target = usr/lib/systemd/boot/efi/*
Target = boot/*-ucode.img
 
[Action]
Description = Updating GRUB config
When = PostTransaction
Exec = /usr/bin/grub-mkconfig -o /boot/grub/grub.cfg

实用 Hooks 大全

# 1. 清理 pacman 缓存(安装/更新后清理旧版本)
# /etc/pacman.d/hooks/paccache.hook
[Trigger]
Operation = Upgrade
Operation = Install
Operation = Remove
Type = Package
Target = *
 
[Action]
Description = Cleaning pacman cache...
When = PostTransaction
Exec = /usr/bin/env bash -c "paccache -rk1"
# 2. systemd-boot 自动更新
[Trigger]
Type = File
Operation = Install
Operation = Upgrade
Target = usr/lib/systemd/boot/efi/systemd-bootx64.efi
 
[Action]
Description = Updating systemd-boot
When = PostTransaction
Exec = /usr/bin/bootctl update
# 3. Flatpak 更新后清理
[Trigger]
Type = Package
Operation = Upgrade
Operation = Install
Target = flatpak
 
[Action]
Description = Removing unused Flatpak runtimes...
When = PostTransaction
Exec = /usr/bin/flatpak uninstall --unused -y
# 4. 更新后发送通知
[Trigger]
Operation = Upgrade
Type = Package
Target = *
 
[Action]
Description = Notifying about upgrade
When = PostTransaction
Exec = /usr/bin/notify-send "System Updated" "Pacman upgrade completed" -i package
# 5. 检测 .pacnew 文件(配置更新冲突)
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = *
 
[Action]
Description = Checking for .pacnew files
When = PostTransaction
Exec = /usr/bin/env bash -c "pacnew=$(find /etc -name '*.pacnew' 2>/dev/null); [ -n \"$pacnew\" ] && notify-send 'Pacnew Files Found' \"$pacnew\" -u critical"

17.4 系统救援

从 Live USB 修复系统

# 1. 启动 Arch Live USB
# 2. 挂载系统分区
 
# Btrfs 系统:
mount -o subvol=/@,compress=zstd:3 /dev/nvme0n1p2 /mnt
mount -o subvol=/@home /dev/nvme0n1p2 /mnt/home
mount /dev/nvme0n1p1 /mnt/boot
 
# 3. chroot
arch-chroot /mnt
 
# 4. 修复
pacman -Syu # 重新同步更新
pacman -S linux # 重新安装内核(如果误删)
mkinitcpio -P # 重建 initramfs
grub-mkconfig -o /boot/grub/grub.cfg # 重建 GRUB 配置
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB

忘记密码恢复

# 1. 在 GRUB 菜单按 e 进入编辑
# 2. 在 linux 开头的行末尾加:
init=/bin/bash
# 3. Ctrl+X 启动
# 4. 在 root shell 中:
mount -o remount,rw /
passwd your_username
# 5. 重启
reboot -f

修复 Pacman 数据库损坏

# 检查数据库
sudo pacman -Dk
 
# 修复
sudo rm /var/lib/pacman/db.lck # 如果锁文件残留
sudo pacman -Syy # 强制刷新数据库
sudo pacman -S filesystem # 重新安装基础文件系统

17.5 包管理高级技巧

找出不需要的包

# 孤立包(不再被任何包依赖)
pacman -Qdt
 
# 显式安装的包
pacman -Qe
 
# 作为依赖安装的包
pacman -Qd
 
# 来自非官方仓库的包
pacman -Qm
 
# 查看包反向依赖(什么包依赖这个包)
pacman -Qi glibc | grep "Required By"
 
# 找出占用最多的包
pacman -Qi | awk '/^Name/{name=$3} /^Installed Size/{size=$4; unit=$5; if(unit=="KiB"){s=size/1024} else if(unit=="MiB"){s=size} else if(unit=="GiB"){s=size*1024} else{s=0}; printf "%.2fMiB\t%s\n", s, name}' | sort -rh | head -20

安装包的特定版本(降级)

# pacman 缓存
ls /var/cache/pacman/pkg/linux-*.pkg.tar.zst
sudo pacman -U /var/cache/pacman/pkg/linux-6.8.1.arch1-1-x86_64.pkg.tar.zst
 
# Arch Linux Archive
# https://archive.archlinux.org/packages/

重建所有包的依赖关系

# 如果系统损坏严重,重建所有 ABI 依赖
for pkg in $(pacman -Qq); do
 sudo pacman -S --asdeps --noconfirm "$pkg" 2>/dev/null
done

17.6 启动分析

# 启动耗时分析
systemd-analyze
systemd-analyze blame # 按耗时排序
systemd-analyze critical-chain # 关键路径
systemd-analyze plot > boot.svg
 
# 禁用不必要的服务
systemctl list-unit-files --state=enabled
sudo systemctl disable bluetooth.service # 不用蓝牙
sudo systemctl mask lvm2-monitor.service # 不用 LVM
 
# 并行启动(改善启动时间)
sudo systemctl edit --full systemd-udev-settle.service
# ExecStart 改为 /bin/true(如果不需要等待 udev settle)

17.7 安全加固

基本加固

# 1. 防火墙
sudo pacman -S ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw enable
sudo systemctl enable ufw
 
# 2. 内核参数加固
# /etc/sysctl.d/99-security.conf
kernel.kptr_restrict=2 # 限制内核指针暴露
kernel.dmesg_restrict=1 # 限制 dmesg 访问
kernel.unprivileged_bpf_disabled=1
net.core.bpf_jit_harden=2
kernel.yama.ptrace_scope=2 # 限制 ptrace
fs.protected_symlinks=1
fs.protected_hardlinks=1
fs.suid_dumpable=0
sudo sysctl -p /etc/sysctl.d/99-security.conf

USBGuard

sudo pacman -S usbguard
sudo systemctl enable --now usbguard
 
# 生成初始策略(当前插的设备都允许)
sudo usbguard generate-policy > /etc/usbguard/rules.conf

强制访问控制 (AppArmor)

sudo pacman -S apparmor
sudo systemctl enable --now apparmor
 
# 需要在内核参数中启用:
# /etc/default/grub
GRUB_CMDLINE_LINUX="... apparmor=1 lsm=landlock,lockdown,yama,apparmor,bpf"

17.8 性能优化

实时调优

# CPU 调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
 
# 安装守护进程管理
sudo pacman -S power-profiles-daemon
sudo systemctl enable --now power-profiles-daemon
powerprofilesctl set balanced
 
# GPU 性能模式
# AMD:
echo "high" | sudo tee /sys/class/drm/card0/device/power_dpm_force_performance_level
 
# I/O 调度器
# NVMe SSD → none (noop)
# SATA SSD → mq-deadline
# HDD → bfq
echo "mq-deadline" | sudo tee /sys/block/sda/queue/scheduler

zram 内存压缩

sudo pacman -S zram-generator
# /etc/systemd/zram-generator.conf
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0
 
# 查看
zramctl

预加载优化

# preload — 预加载常用程序
paru -S preload
sudo systemctl enable --now preload
 
# 或用 systemd-readahead

17.9 电源管理

# 休眠配置
# 1. 确保 swap 足够大(>= RAM 大小)
# 2. 找到 resume 设备
sudo blkid | grep swap
# 3. 配置 initramfs
# /etc/mkinitcpio.conf
HOOKS=(... resume ...)
 
# /etc/default/grub
GRUB_CMDLINE_LINUX="... resume=UUID=your-swap-uuid"
 
# 重建
sudo mkinitcpio -P
sudo grub-mkconfig -o /boot/grub/grub.cfg
# 合盖休眠(笔记本)
# /etc/systemd/logind.conf
HandleLidSwitch=suspend
HandleLidSwitchExternalPower=lock
HandleLidSwitchDocked=ignore
LidSwitchIgnoreInhibited=yes

17.10 无噪声日志系统

# 限制 journald 日志大小
# /etc/systemd/journald.conf
SystemMaxUse=500M
RuntimeMaxUse=100M
MaxRetentionSec=2week
MaxFileSec=1week
# 禁用内核消息刷到 tty(防止 dmesg 污染 TTY)
echo "kernel.printk = 3 3 3 3" | sudo tee /etc/sysctl.d/20-quiet-printk.conf
 
# 隐藏启动日志(plymouth 或 quiet 参数)
# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet loglevel=3 udev.log_level=3"

17.11 自定义 systemd 服务

用户服务示例

# ~/.config/systemd/user/my-app.service
[Unit]
Description=My Custom App
After=graphical-session.target
PartOf=graphical-session.target
 
[Service]
Type=simple
ExecStart=/usr/bin/my-app
Restart=on-failure
RestartSec=5
 
[Install]
WantedBy=graphical-session.target
systemctl --user daemon-reload
systemctl --user enable --now my-app.service

定时器示例

# ~/.config/systemd/user/pacman-cleanup.timer
[Unit]
Description=Weekly pacman cache cleanup
 
[Timer]
OnCalendar=weekly
Persistent=true
 
[Install]
WantedBy=timers.target
 
# ~/.config/systemd/user/pacman-cleanup.service
[Service]
Type=oneshot
ExecStart=/usr/bin/paccache -rk2

17.12 mirrorlist 自动管理

# 安装 reflector
sudo pacman -S reflector
 
# 手动更新为中国最快镜像
sudo reflector --country China --age 12 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
 
# systemd 定时自动更新
sudo systemctl enable --now reflector.timer
 
# /etc/xdg/reflector/reflector.conf
--country China,Japan,Singapore
--age 12
--protocol https
--sort rate
--save /etc/pacman.d/mirrorlist

17.13 VFIO / GPU 直通(虚拟化精华)

# 显卡直通给 Windows 虚拟机打游戏
 
# 1. 确认 IOMMU 已启用
dmesg | grep -i iommu
# 内核参数:intel_iommu=on 或 amd_iommu=on
 
# 2. 隔离 GPU(让 vfio-pci 抢占)
# /etc/modprobe.d/vfio.conf
options vfio-pci ids=10de:2484,10de:228b # GPU 音频 + GPU 视频
# /etc/mkinitcpio.conf
MODULES=(vfio_pci vfio vfio_iommu_type1 vfio_virqfd)
# 3. QEMU/KVM + libvirt
sudo pacman -S qemu libvirt virt-manager edk2-ovmf
sudo systemctl enable --now libvirtd
sudo usermod -aG libvirt $USER
 
# 4. 在 virt-manager 中创建 VM,添加 PCI 直通的 GPU

17.14 杂项高级技巧

# 降级单个包到特定日期
# 使用 Arch Linux Archive
 
# 搜索哪些包包含某文件
pacman -F /usr/lib/libfoo.so
 
# 获取包的构建日期
pacman -Qi glibc | grep "Build Date"
 
# 查找系统中大于 100M 的文件
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
 
# 查看哪些进程在使用已删除的文件(释放磁盘空间)
sudo lsof +L1
 
# 查看硬件信息
sudo dmidecode -t system # BIOS/主板
lspci -nnk # PCI 设备及驱动
lsusb -t # USB 设备树
sudo hdparm -I /dev/nvme0n1 # NVMe 详细信息
 
# 测试磁盘性能
sudo hdparm -Tt /dev/nvme0n1
# 或
sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 \
 --name=test --filename=test --bs=4k --iodepth=64 --size=4G \
 --readwrite=randread --time_based --ramp_time=4 --runtime=10

17.15 自制 Arch 工具链(总结)

你的 Arch 工具箱应该包括:

系统层:
 mkinitcpio 定制 → 精确控制启动镜像
 自定义内核 → linux-zen 或自己编译的
 pacman hooks → 自动化所有安装后操作
 snapper + 快照 → 更新前的安全网
 btrfs-assistant → GUI 管理

桌面层:
 Niri/Hyprland → Wayland 合成器
 DMS → 面板/启动器/锁屏/通知一体化
 matugen → 壁纸驱动的全局主题
 fuzzel + kitty → 启动器 + 终端
 QuickShell → 自定义 Shell 组件

开发层:
 PKGBUILD + AUR → 打包发布
 fish + starship → Shell 环境
 scripts in ~/.local/bin → 日常自动化