Arch Linux KVM 镜像离线初始化指南

挂载 Arch 镜像

使用 qemu-nbd 连接镜像

加载模块:

sudo modprobe nbd max_part=8

连接:

sudo qemu-nbd \
  --connect=/dev/nbd0 \
  /var/lib/libvirt/images/arch

查看磁盘分区

lsblk /dev/nbd0

示例:

NAME      SIZE TYPE
nbd0       2G disk
├─nbd0p1   1M part
├─nbd0p2 300M part
└─nbd0p3 1.7G part

确认根分区

查看:

blkid /dev/nbd0p*

通常:

分区用途
nbd0p1GPT 保留
nbd0p2EFI
nbd0p3Linux 根分区

挂载:

sudo mount /dev/nbd0p3 /mnt

如果有 EFI:

sudo mkdir -p /mnt/boot
sudo mount /dev/nbd0p2 /mnt/boot

设置 root 密码

推荐使用 virt-customize,无需进入系统。

sudo virt-customize \
  -a /var/lib/libvirt/images/arch \
  --root-password password:12

执行完成后,root 登录密码为:12


配置 systemd-networkd DHCP

创建 networkd 配置文件

文件路径:

/etc/systemd/network/20-wired.network

内容:

[Match]
Type=ether

[Network]
DHCP=yes

不绑定网卡名称,自动匹配所有以太网设备,适合 KVM/libvirt 虚拟机。

写入镜像

创建临时文件:

cat >/tmp/20-wired.network <<EOF
[Match]
Type=ether

[Network]
DHCP=yes
EOF

写入:

sudo virt-customize \
  -a /var/lib/libvirt/images/arch \
  --write \
  /tmp/20-wired.network:/etc/systemd/network/20-wired.network

启用 systemd-networkd

sudo virt-customize \
  -a /var/lib/libvirt/images/arch \
  --run-command \
  'systemctl enable systemd-networkd'

启用 DNS:

sudo virt-customize \
  -a /var/lib/libvirt/images/arch \
  --run-command \
  'systemctl enable systemd-resolved'

修复 resolv.conf

sudo virt-customize \
  -a /var/lib/libvirt/images/arch \
  --run-command \
  'rm -f /etc/resolv.conf' \
  --run-command \
  'ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf'

进入系统环境

sudo arch-chroot /mnt

修复 pacman keyring

遇到的问题

安装软件:

pacman -S fish

出现:

warning: Public keyring not found; have you run 'pacman-key --init'?
error: keyring is not writable
error: required key missing from keyring

原因

  • 镜像未初始化 pacman keyring
  • keyring 文件损坏
  • 镜像过旧

修复

初始化:

pacman-key --init

导入官方密钥:

pacman-key --populate archlinux

更新 keyring:

pacman -Sy archlinux-keyring

升级系统并安装软件

更新系统:

pacman -Syu

安装软件,例如 fish:

pacman -S fish

locale 警告处理

进入 chroot 时可能出现:

bash: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8)

原因:locale 未生成。

修复:编辑 /etc/locale.gen,取消注释:

#zh_CN.UTF-8 UTF-8

改为:

zh_CN.UTF-8 UTF-8

生成 locale:

locale-gen

卸载镜像

退出 chroot:

exit

卸载文件系统:

sudo umount -R /mnt

如果 busy:

sudo umount -l /mnt

断开 nbd:

sudo qemu-nbd \
  --disconnect \
  /dev/nbd0

卸载 nbd 模块(可选):

sudo modprobe -r nbd

检查确认 nbd0 已消失:

lsblk

遇到的问题总结

问题原因解决
guestmount 下 pacman 下载失败FUSE 写入异常改用 qemu-nbd
mount /dev/nbd0pX 失败X 是占位符使用真实分区
pacman keyring 不可写keyring 未初始化pacman-key –init
locale 警告locale 未生成locale-gen
虚拟机无网络没有 networkd 配置systemd-networkd DHCP
root 无密码镜像未初始化virt-customize 设置密码

推荐初始化顺序

  1. qemu-nbd 挂载镜像
  2. virt-customize:设置 root 密码、写入 systemd-networkd 配置、enable networkd/resolved
  3. arch-chroot
  4. pacman-key 初始化
  5. pacman -Syu
  6. 安装软件
  7. 卸载镜像

该流程适合制作 KVM/libvirt Arch Linux 基础镜像。