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*
通常:
| 分区 | 用途 |
|---|---|
| nbd0p1 | GPT 保留 |
| nbd0p2 | EFI |
| nbd0p3 | Linux 根分区 |
挂载:
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 设置密码 |
推荐初始化顺序
qemu-nbd挂载镜像virt-customize:设置 root 密码、写入 systemd-networkd 配置、enable networkd/resolvedarch-chrootpacman-key初始化pacman -Syu- 安装软件
- 卸载镜像
该流程适合制作 KVM/libvirt Arch Linux 基础镜像。