6114 字
31 分钟
KVM虚拟化入门: Debian系统上用物理 DVD 安装 KVM 虚拟机攻略

环境:Dell PowerEdge R730 / Debian 13 / KVM+libvirt / 纯 SSH 终端(无图形界面)

目标:从服务器物理光驱安装 Fedora 44 和 Arch Linux 虚拟机

参考文章: Linux KVM 虚拟化实战:基于 Debian 系统的完整指南


1. 前置条件#

1.1 硬件虚拟化支持检查#

KVM 依赖 CPU 的硬件虚拟化扩展,需确保 CPU 支持并启用该功能:

检查 CPU 支持: 执行以下命令,若输出包含 vmx(Intel)或 svm(AMD),则支持虚拟化:

Terminal window
grep -E --color=auto 'vmx|svm' /proc/cpuinfo

若无输出,可能是 CPU 不支持,或需在 BIOS/UEFI 中启用(常见选项:Intel Virtualization Technology 或 AMD SVM)。

验证内核模块加载: 若硬件支持,KVM 内核模块会自动加载(或按需加载):

Terminal window
lsmod | grep kvm
# 输出示例(Intel):
# kvm_intel 311296 0
# kvm 942080 1 kvm_intel

1.2 Debian 系统要求#

  • 系统版本:推荐 Debian 11(Bullseye)或 12(Bookworm,最新稳定版),内核版本 ≥ 5.10(KVM 功能更完善)。
  • 资源建议
    • CPU:至少 2 核心(推荐 4 核心以上,支持多线程)。
    • 内存:至少 4GB(每台虚拟机建议分配 2GB+,根据需求调整)。
    • 存储:至少 20GB 空闲空间(推荐 SSD 以提升虚拟机磁盘性能)。

2. 在 Debian 上安装 KVM#

2.1 安装核心组件#

Debian 官方仓库提供 KVM 相关包,直接通过 apt 安装:

Terminal window
# 更新软件源
sudo apt update
# 安装 KVM 核心组件、管理工具及网络支持
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager virtinst

组件说明:

组件说明
qemu-kvm提供硬件模拟功能,是 KVM 的用户态组件
libvirt-daemon-systemlibvirt 守护进程(管理虚拟机的核心服务)
libvirt-clientslibvirt 命令行工具(如 virsh
bridge-utils网络桥接配置工具
virt-manager图形化虚拟机管理工具(可选,适合桌面环境)
virtinst命令行虚拟机创建工具(如 virt-install

2.2 配置用户权限#

默认情况下,仅 root 用户可管理 KVM 虚拟机。为避免直接使用 root,需将普通用户添加到 kvmlibvirt 组(前者控制设备访问,后者控制 libvirt 服务):

Terminal window
# 将当前用户加入 kvm 和 libvirt 组
sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $USER
# 重新登录使权限生效(或执行 `newgrp kvm; newgrp libvirt` 临时生效)

2.3 验证安装#

检查 libvirt 服务状态:

Terminal window
sudo systemctl status libvirtd
# 预期输出:Active: active (running)

验证 KVM 模块加载:

Terminal window
sudo virsh capabilities | grep -A 10 "cpu"
# 输出应包含 CPU 特性(如 vmx/svm),表明 KVM 可用

列出默认网络:

Terminal window
virsh net-list --all
# 预期输出:默认 NAT 网络 "default" 处于活跃状态

3. 环境检查#

动手前先确认 KVM 服务正常:

Terminal window
# CPU 虚拟化支持
grep -E "(vmx|svm)" /proc/cpuinfo | head -1
# KVM 模块
lsmod | grep kvm
# 设备节点
ls -la /dev/kvm
# libvirtd 状态
systemctl status libvirtd
# 用户组(当前用户需在 libvirt 组)
groups

4. 光驱设备定位#

插入 DVD 后,用以下命令定位设备:

Terminal window
lsblk -o NAME,TYPE,SIZE,MODEL,LABEL | grep -E "(sr|cdrom)"

输出示例:

sr0 rom 3.6G HL-DT-ST DVD-ROM DTA0N Fedora-S-dvd-x86_64-44

结论:设备文件是 /dev/sr0,符号链接 /dev/cdromsr0,光盘是 Fedora 44 安装 DVD。

确认设备信息:

Terminal window
cat /proc/sys/dev/cdrom/info
# drive name: sr0
# Can read DVD: 1

验证光盘内容:

Terminal window
sudo mount /dev/sr0 /mnt -o ro
ls /mnt/
# boot EFI Fedora-Legal-README.txt images LICENSE media.repo Packages repodata
sudo umount /mnt

5. 失败的尝试与排错#

以下是我踩过的三个坑,帮你绕过。

尝试一:--cdrom 直接启动#

Terminal window
sudo virt-install \
--name fedora-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/fedora-vm.qcow2,size=30 \
--cdrom /dev/sr0 \
--os-variant fedora-unknown \
--network network=default \
--graphics none \
--console pty,target_type=serial

结果:VM 启动后一片空白,无法看到安装界面。

原因:Fedora 安装器(Anaconda)默认使用图形界面--graphics none 禁用了图形输出后,串口控制台没有显示任何内容。WARNING 提示:

CDROM 介质默认情况下不输出信息到文本控制台

尝试二:--location + inst.text#

升级方案——用 --location 从光盘加载内核,加 inst.text 强制文本模式:

Terminal window
sudo mount /dev/sr0 /mnt -o ro
sudo virt-install \
--name fedora-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/fedora-vm.qcow2,size=30 \
--location /mnt \
--os-variant fedora-unknown \
--network network=default \
--graphics none \
--extra-args "inst.text console=ttyS0,115200" \
--console pty,target_type=serial

结果:内核启动成功,dracut 加载 initrd,但随后进入超时循环:

[ 170.526] dracut-initqueue[1091]: Warning: dracut-initqueue: timeout
[ 170.546] dracut-initqueue[1091]: Warning: It seems that the boot has failed.
[ 170.552] dracut-initqueue[1091]: Warning: missing inst.stage2 or inst.repo
boot parameters on the kernel cmdline.
[ 170.555] dracut-initqueue[1091]: Warning: Please verify that you have
specified inst.stage2 or inst.repo.

原因分析

--location /mnt 只会从光盘加载 vmlinuz(内核)initrd.img 两个文件,然后启动安装环境。但安装环境启动后,它不知道从哪里获取剩余的安装数据(RPM 软件包仓库),因为光盘并没有作为块设备传给虚拟机——只传了挂载点里的两个引导文件。

Anaconda 需要 inst.stage2inst.repo 参数来告知第二阶段安装源的位置。没有这个参数,dracut-initqueue 就在循环等待 /dev/root 出现,最终超时。

尝试三:混合使用 --cdrom + --extra-args#

天真地想用 --cdrom 传光盘设备,同时用 --extra-args 传文本模式参数:

Terminal window
sudo virt-install \
--name fedora-vm \
--cdrom /dev/sr0 \
--graphics none \
--extra-args "inst.text console=ttyS0,115200" \
...

结果:直接报错 ❌

ERROR Kernel arguments are only supported with location or kernel installs.

原因virt-install 规定——内核参数 --extra-args 只能与 --location(PXE/URL/本地目录)搭配使用,不能和 --cdrom(模拟光驱启动)混用。因为 --cdrom 模式下 libvirt 直接让 BIOS/UEFI 从光盘引导,不经过 libvirt 的内核注入流程。


6. 终极方案#

综合以上教训,正确的方案是双管齐下

--location /mnt 负责引导 + --disk /dev/sr0,device=cdrom 传光盘设备 + inst.repo=cdrom 指定安装源

Terminal window
# 1. 挂载 DVD
sudo mount /dev/sr0 /mnt -o ro
# 2. 清理之前的试错残留(如有)
sudo virsh destroy fedora-vm 2>/dev/null
sudo virsh undefine fedora-vm --remove-all-storage 2>/dev/null
# 3. 终极命令
sudo virt-install \
--name fedora-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/fedora-vm.qcow2,size=30 \
--disk /dev/sr0,device=cdrom,readonly=on \
--location /mnt \
--os-variant fedora-unknown \
--network network=default \
--graphics none \
--extra-args "inst.text console=ttyS0,115200 inst.repo=cdrom" \
--console pty,target_type=serial

参数详解#

参数作用为什么需要
--disk /dev/sr0,device=cdrom,readonly=on把物理光驱以 CDROM 设备传给 VMAnaconda 需要直接访问光盘上的 RPM 仓库
--location /mnt从挂载的光盘中提取 vmlinuz + initrd用于启动安装环境(允许传 --extra-args
--graphics none禁用图形输出服务器没有图形界面
--extra-args "inst.text ..."强制文本模式安装跳过 Anaconda 的图形/RDP 提示
--extra-args "... inst.repo=cdrom"指定安装源为光盘关键参数——解决 dracut-initqueue timeout
--extra-args "console=ttyS0,115200"串口终端输出安装信息输出到 virsh console
--console pty,target_type=serial安装后自动连接串口无需手动 virsh console

执行流程图#

物理光驱 /dev/sr0
├──► 挂载到 /mnt
│ │
│ └──► --location /mnt ──► 提取 vmlinuz + initrd ──► 启动安装内核
│ │
│ ├──► inst.text ──► 文本模式安装
│ │
│ └──► inst.repo=cdrom ──► 从光盘读取 RPM
└──► --disk /dev/sr0,device=cdrom ──► VM 内出现 /dev/sr0 ──► Anaconda 挂载读取

7. Fedora 文本安装流程#

安装启动后,Anaconda 会提示选择模式:

1) Use graphical mode via Remote Desktop Protocol
2) Use text mode
输入 2,然后输入 c 确认

然后按数字键选择配置项:

输入配置项说明
1Language已默认简体中文
2Timezone已默认 Asia/Shanghai
3Install Source应自动识别为 Local media
4Software选择 Fedora Server Edition
5Disk选择自动分区方案
7Root Password必须设置
8User创建管理员用户
bBegin开始安装

完成后系统会重启进入新系统。


8. 安装后管理#

连接到虚拟机#

Terminal window
# 方式 1:串口控制台
sudo virsh console fedora-vm
# 退出:按 Ctrl + ]
# 方式 2:SSH(推荐,安装好 guest-agent 后)
sudo virsh domifaddr fedora-vm # 查看 IP
ssh mint@<vm-ip>

在 VM 内安装 Guest Agent#

Terminal window
sudo dnf install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent

日常管理速查#

Terminal window
# VM 生命周期
sudo virsh list --all # 查看所有 VM
sudo virsh start fedora-vm # 启动
sudo virsh shutdown fedora-vm # 正常关机
sudo virsh destroy fedora-vm # 强制关机
sudo virsh autostart fedora-vm # 开机自启
# 修改硬件
sudo virsh edit fedora-vm # 编辑全部配置
sudo virsh setvcpus fedora-vm 4 --config
sudo virsh setmaxmem fedora-vm 4096 --config
# 快照
sudo virsh snapshot-create-as fedora-vm --name clean-install
sudo virsh snapshot-revert fedora-vm clean-install
# 网络
sudo virsh net-dhcp-leases default # 查看 VM 的 IP
# 克隆
sudo virt-clone --original fedora-vm --name fedora-vm2 \
--file /var/lib/libvirt/images/fedora-vm2.qcow2
# 删除
sudo virsh destroy fedora-vm
sudo virsh undefine fedora-vm --remove-all-storage

9. 网络配置:让外部设备访问虚拟机#

安装完成后,你会发现一个尴尬的问题:virsh console 可以连上 VM,但从笔记本 SSH 过去却 100% packet loss

9.1 为什么默认网络外部无法访问#

KVM 默认使用 NAT 虚拟网络virbr0,网段 192.168.122.0/24)。它的工作原理:

┌─────────────────────────────────────────────────────┐
│ 宿主机 (R730) │
│ │
│ 物理网卡 eno1 虚拟网桥 virbr0 │
│ 192.168.43.101 ──NAT──► 192.168.122.1 │
│ │ │ │
│ │ ├── VM: .225 │
│ │ ├── VM: .xxx │
│ │ └── ... │
│ │ │
└───────┼──────────────────────────────────────────────┘
┌────┴────┐
│ 路由器 │
│ 192.168.43.1
└────┬────┘
┌────┴────┐
│ 你的笔记本 │
│ 192.168.43.x
└─────────┘

关键问题:

  • 笔记本发给 192.168.122.225 的包到达路由器后,路由器查路由表:192.168.122.0/24 在哪?不知道,丢弃。
  • 只有宿主机自己知道这个子网(virbr0 在宿主机内部)。
  • 这就是 ping 不通、ssh 不了的根因。

9.2 三种暴露方案对比#

方案难度VM IP适用场景
桥接网络⭐⭐独立 IP,和宿主机同网段VM 长期运行,需要对外提供服务
SSH 隧道无需暴露 VM IP临时访问,无需改网络
端口转发⭐⭐无需暴露 VM IP只暴露特定端口(如 Web、SSH)

下文重点讲解桥接网络(推荐方案)的完整原理与配置。

9.3 桥接网络原理#

桥接的本质:让虚拟机”冒充”一台真机直接接入物理交换机

配置前(NAT) 配置后(桥接 br0)
┌──────────┐ ┌──────────────────────┐
│ 宿主机 │ │ 宿主机 │
│ eno1 │ │ │
│ .101 │ │ eno1 ──┐ │
│ │ │ (无IP) │ │
│ virbr0 NAT│ │ br0 │
│ ├─ VM .225│ │ .101 (宿主机) │
│ │ │ .250 (VM) │
└──────────┘ └─────────┬────────────┘
VM 对外不可见 ┌────┴────┐
│ 路由器 │
└────┬────┘
┌────┴────┐
│ 笔记本 │
└─────────┘
ssh mint@192.168.43.250 ✅

数据流向变化:

阶段NAT 模式桥接模式
VM 发包virbr0 → 宿主机 NAT → eno1 → 物理网络br0eno1 → 物理网络(直达)
外部回包路由器发给宿主机 .101,宿主机再做 NAT 转回 VM路由器直接发给 VM 的 IP
性能多一层 NAT 转换零拷贝,接近物理网卡性能

9.4 宿主机桥接配置#

⚠️ 警告:以下操作会导致 SSH 短暂断开(约 5~10 秒),因为主网卡的 IP 要迁移到桥接口上。

第一步:查看当前网络布局#

Terminal window
# 查看默认路由和主网卡
ip route show default
# default via 192.168.43.1 dev eno1 ...
# ↑主网卡名
# 查看当前连接
nmcli con show --active
# NAME UUID TYPE DEVICE
# Wired-1 xxxx ethernet eno1
# ...

第二步:创建网桥(用 NetworkManager)#

Terminal window
# 1. 创建桥接接口 br0
sudo nmcli con add type bridge ifname br0
# 2. 把主网卡 eno1 作为 br0 的从属
sudo nmcli con add type bridge-slave ifname eno1 master br0
# 原理:nmcli 在 /etc/NetworkManager/system-connections/ 下创建两个配置文件:
# - br0.nmconnection → 桥接设备定义
# - br0-slave-eno1.nmconnection → eno1 从属关系
# NetworkManager 重启后自动生效,持久化无需额外操作。

此时发生了什么:

执行前:
eno1 ── IP 192.168.43.101 ── 默认网关 192.168.43.1
执行中(nmcli con up br0):
1. eno1 被加入 br0(变为从属,IP 被剥离)
2. br0 发起 DHCP 请求,获取 IP ← SSH 断开发生在这里
3. 默认路由从 eno1 转移到 br0
执行后:
eno1 ── 无 IP(master: br0)
br0 ── IP 192.168.43.xxx(新 DHCP 分配的 IP)

注意:新 IP 可能和原来不同!本次实操中,eno1 原来的 IP 是 192.168.43.69,桥接后 br0 拿到的是 192.168.43.101。如果你有 DHCP 保留 / 静态 IP 需求,应预先设置。

第三步:验证桥接#

Terminal window
# 确认 br0 已创建并获取 IP
ip addr show br0 | grep inet
# inet 192.168.43.101/24 ...
# 确认 eno1 已从属到 br0
ip link show eno1
# ... master br0 ...
# 确认默认路由走 br0
ip route show default
# default via 192.168.43.1 dev br0 ...
# 确认 NetworkManager 连接状态
nmcli con show --active | grep br0

9.5 创建 libvirt 桥接网络#

宿主机网络桥 OK 了,但 libvirt 还不知道这个桥的存在。需要为 libvirt 定义网络:

Terminal window
# 编写 libvirt 网络定义 XML
cat > /tmp/bridge-net.xml << 'EOF'
<network>
<name>host-bridge</name> <!-- libvirt 内的网络名称 -->
<forward mode="bridge"/> <!-- 桥接模式:二层转发 -->
<bridge name="br0"/> <!-- 绑定到宿主机 br0 网桥 -->
</network>
EOF
# 定义(注册到 libvirt)
sudo virsh net-define /tmp/bridge-net.xml
# 启动
sudo virsh net-start host-bridge
# 设为开机自启
sudo virsh net-autostart host-bridge
# 确认
sudo virsh net-list --all

XML 参数详解:

元素含义
<forward mode="bridge"/>二层桥接模式。和 NAT 模式 (mode='nat') 不同,不做 IP 转换,VM 数据帧直接透传到 br0
<bridge name="br0"/>指定宿主机上已有的 Linux bridge 设备名

<forward mode="bridge"/> vs <forward mode="nat"/>:前者工作在数据链路层(二层),后者工作在网络层(三层)。桥接模式下的 VM 和宿主机在同一个广播域中。

9.6 将虚拟机接入桥接网络#

热切换(VM 运行时在线切换)#

Terminal window
# 1. 查看当前接口
sudo virsh domiflist fedora-vm
# 接口 类型 源 MAC
# vnet4 network default 52:54:00:cf:37:f1
# 2. 断开默认 NAT 接口(--mac 用于精确定位要删除的接口)
sudo virsh detach-interface fedora-vm network --mac 52:54:00:cf:37:f1
# 3. 接入桥接网络
sudo virsh attach-interface fedora-vm bridge br0 \
--model virtio \ # 准虚拟化网卡(最佳性能)
--config \ # 持久化到 XML 配置
--live # 立即生效(--config 只存配置,--live 才在线生效;两者同时用=永久在线切换)

--live vs --config

  • --live:立即生效,但重启后丢失
  • --config:写入 XML,下次启动才生效
  • 两者共用 = 立即生效且持久化

在 VM 内刷新 DHCP#

网卡切换后,VM 需要重新获取 IP:

Terminal window
# 进入 VM 控制台
sudo virsh console fedora-vm
# 在 VM 内执行
sudo dhclient enp1s0
# 或
sudo nmcli con down enp1s0 && sudo nmcli con up enp1s0

验证#

Terminal window
# 宿主机上查看 VM 的网络接口
sudo virsh domiflist fedora-vm
# 接口 类型 源 型号 MAC
# vnet5 bridge br0 virtio 52:54:00:54:7e:bc
# ↑ 已改为 br0

9.7 查看虚拟机 IP 的多种方式#

这是日常管理中最常用的操作,按推荐度排列:

方式一:virsh domifaddr(推荐,最全面)#

Terminal window
# 通过 Guest Agent 查询(需 VM 内安装 qemu-guest-agent)
sudo virsh domifaddr fedora-vm --source agent
# 名称 MAC 地址 协议 地址
# lo 00:00:00:00:00:00 ipv4 127.0.0.1/8
# enp1s0 52:54:00:54:7e:bc ipv4 192.168.43.250/24
# 通过 libvirt DHCP 租约查询(仅 NAT 网络有效)
sudo virsh domifaddr fedora-vm --source lease

--source 参数的含义:

来源适用网络原理
agent所有网络查询 VM 内的 qemu-guest-agent,返回真实 IP。最准确。
lease仅 NAT查询 libvirt 的 dnsmasq DHCP 租约表。桥接模式下不由 libvirt 管理 DHCP,故查不到。
arp所有网络查看宿主机的 ARP 表(同方式三)。

方式二:virsh net-dhcp-leases(仅 NAT 网络)#

Terminal window
sudo virsh net-dhcp-leases default
# 到期时间 MAC 地址 协议 IP 地址 主机名
# 2026-05-19 03:40:42 52:54:00:cf:37:f1 ipv4 192.168.122.225/24 -

仅适用于 default NAT 网络。桥接到 br0 后,DHCP 由路由器负责,libvirt 不知道租约信息。

方式三:宿主机的 ARP 表#

Terminal window
ip neigh show dev br0
# 192.168.43.250 lladdr 52:54:00:54:7e:bc REACHABLE
# 或用 arp 命令
arp -n -i br0
# Address HWtype HWaddress Flags Iface
# 192.168.43.250 ether 52:54:00:54:7e:bc C br0

原理:宿主机和 VM 在同一个二层域(br0),宿主机通信时自然会缓存 VM 的 MAC-IP 映射。

方式四:路由器后台#

直接登录路由器管理页面(如 192.168.43.1),在 DHCP 客户端列表中找到 VM(可根据主机名 fedora-vm 或 MAC 地址识别)。

方式五:登入 VM 内部查看#

Terminal window
sudo virsh console fedora-vm
# 登录后执行
ip addr show enp1s0
# 或
hostname -I

IP 查看速查表#

场景推荐命令
日常快速查 IPsudo virsh domifaddr fedora-vm --source agent
NAT 网络查 IPsudo virsh net-dhcp-leases default
桥接网络查 IPip neigh show dev br0
Guest Agent 未装sudo virsh console fedora-vm 进去看

9.8 SSH 隧道方案(备选)#

如果不想改网络,可以用宿主机做跳板:

Terminal window
# 笔记本上执行(一次性)
ssh -J mint@<R730的IP> mint@192.168.122.225

配置 ~/.ssh/config 后更简单:

Host r730
HostName <R730的IP>
User mint
Host fedora-vm
HostName 192.168.122.225
User mint
ProxyJump r730

然后直接 ssh fedora-vm

原理:SSH 客户端先连 R730,在 R730 上开启一个端口转发通道,再通过该通道连接 VM。192.168.122.225 对笔记本仍然不可达,但 R730 可达——它充当了代理角色。

9.9 端口转发方案(备选)#

只暴露特定端口,用 iptables 做 DNAT:

Terminal window
# 在 R730 上执行:把 R730:2222 转发到 VM:22
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 \
-j DNAT --to-destination 192.168.122.225:22
sudo iptables -A FORWARD -p tcp -d 192.168.122.225 --dport 22 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -j MASQUERADE
# 持久化(Debian)
sudo apt install iptables-persistent
sudo netfilter-persistent save

笔记本连接:ssh -p 2222 mint@192.168.43.101

数据流路径

笔记本 → R730:2222 → iptables DNAT → VM:22

适用:只需暴露 Web(80/443)或 SSH 等少数端口。不适用多端口或 UDP 密集型服务。


10. Fedora 安装小结#

Fedora 安装的核心在于同时使用 --location(提取内核)和 --disk device=cdrom(传光盘设备)。三个关键参数缺一不可:

参数作用
--disk /dev/sr0把物理光驱作为块设备传给 VM
--location /mnt提取 vmlinuz + initrd 引导
inst.repo=cdrom告诉 Anaconda 从光盘读取 RPM

详细公式见文末第 13 节”全文总结”。


11. Arch Linux 安装实战#

说明:在上述 Fedora 安装完成后,笔者又用同样的物理光驱安装了 Arch Linux(2026.05.01 版 ISO),踩了完全不同的坑。本节记录整个过程。

Arch
archlinux喵

11.1 Arch Linux 的光驱引导#

Arch Linux 的 ISO 结构与 Fedora 完全不同——它没有 virt-install --location 能识别的安装树。--location 检查 /mnt 后直接报错:

ERROR 验证安装位置出错:在 URL '/mnt' 上找不到可安装的发行版

失败原因#

Fedora 光盘内有标准的 images/pxeboot/vmlinuz + initrd.img 布局,--location 能自动发现。Arch 的内核和 initrd 则藏在更深的路径下:

/mnt/arch/boot/x86_64/vmlinuz-linux
/mnt/arch/boot/x86_64/initramfs-linux.img

必须先探查光盘布局:

/mnt/arch/boot/x86_64/vmlinuz-linux
sudo mount /dev/sr0 /mnt -o ro
ls -laR /mnt/arch/boot/
# 输出:
# /mnt/arch/boot/x86_64/initramfs-linux.img

同时查看引导器配置,获取必需的内核参数:

Terminal window
cat /mnt/loader/entries/01-archiso-linux.conf
# title Arch Linux install medium (x86_64, UEFI)
# linux /arch/boot/x86_64/vmlinuz-linux
# initrd /arch/boot/x86_64/initramfs-linux.img
# options archisobasedir=arch archisosearchuuid=2026-05-01-06-05-08-00

关键参数 archisobasedir=archarchisosearchuuid=<UUID> 是 Arch ISO 引导时必须的。没有它们,initramfs 找不到光盘上的根文件系统。

11.2 正确的启动命令#

Arch 需要用 --boot 显式指定内核和 initrd 路径,不能依赖 --location

Terminal window
# 1. 挂载 DVD
sudo mount /dev/sr0 /mnt -o ro
# 2. 清理残留
sudo virsh destroy arch-vm 2>/dev/null
sudo virsh undefine arch-vm --remove-all-storage 2>/dev/null
# 3. 启动安装
sudo virt-install \
--name arch-vm \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/arch-vm.qcow2,size=30 \
--disk /dev/sr0,device=cdrom,readonly=on \
--boot kernel=/mnt/arch/boot/x86_64/vmlinuz-linux,\
initrd=/mnt/arch/boot/x86_64/initramfs-linux.img,\
kernel_args="console=ttyS0,115200 archisobasedir=arch archisosearchuuid=2026-05-01-06-05-08-00" \
--os-variant archlinux \
--network network=default \
--graphics none \
--console pty,target_type=serial

参数对比:Fedora vs Arch

参数Fedora (Anaconda)Arch Linux (archiso)
引导方式--location /mnt--boot kernel=...,initrd=...,kernel_args=...
内核参数inst.text inst.repo=cdromarchisobasedir=arch archisosearchuuid=<UUID>
安装源自动搜索光盘上的 RPM 仓库archiso 会自动挂载 /dev/sr0/run/archiso/bootmnt
安装程序Anaconda(图形/文本向导)纯命令行(手动 pacstrap

成功启动后,Arch Live 环境会直接进入 root shell:

Arch Linux 7.0.3-arch1-1 (ttyS0)
archiso login: root (无密码直接登录)

11.3 镜像源加速#

默认镜像源在国内只有几百 B/s,安装前务必切换到国内镜像:

Terminal window
echo "Server = https://mirrors.ustc.edu.cn/archlinux/\$repo/os/\$arch" > /etc/pacman.d/mirrorlist
echo "Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/\$repo/os/\$arch" >> /etc/pacman.d/mirrorlist
echo "Server = https://mirrors.aliyun.com/archlinux/\$repo/os/\$arch" >> /etc/pacman.d/mirrorlist
# 开启并行下载
sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.conf
pacman -Syy

效果:下载速度从 12 KiB/s → 3 MiB/s,提升约 250 倍。

11.4 分区与 Btrfs 文件系统#

由于 zfs-dkms 已从 Arch 官方仓库移除,且第三方 archzfs 源在国内不可用,改用 Btrfs——它和 ZFS 一样支持 CoW(写时复制)、快照、透明压缩等特性,且原生内置于内核。

Terminal window
# 查看磁盘
lsblk
# vda 30G ← 唯一磁盘
# MBR 分区(BIOS 模式)
parted /dev/vda mklabel msdos
parted /dev/vda mkpart primary ext4 1MiB 513MiB # /boot
parted /dev/vda set 1 boot on
parted /dev/vda mkpart primary 513MiB 100% # btrfs
# 格式化
mkfs.ext4 /dev/vda1 # boot 分区
mkfs.btrfs -f /dev/vda2 # btrfs 根分区
# 创建 btrfs 子卷(方便快照管理)
mount /dev/vda2 /mnt
btrfs subvolume create /mnt/@ # 根子卷
btrfs subvolume create /mnt/@home # home 子卷
umount /mnt
# 挂载
mount -o compress=zstd,subvol=@ /dev/vda2 /mnt
mkdir -p /mnt/{boot,home}
mount -o compress=zstd,subvol=@home /dev/vda2 /mnt/home
mount /dev/vda1 /mnt/boot

分区布局

分区大小文件系统挂载点
/dev/vda1512 MiBext4/boot
/dev/vda229.5 GiBbtrfs (子卷 @)/
同上btrfs (子卷 @home)/home

11.5 安装基础系统#

安装 linux-zen 内核以支持 drm_panic 功能(内核崩溃时显示 QR 码),同时安装中文字体:

Terminal window
pacstrap /mnt base base-devel \
linux-zen linux-zen-headers \
linux-firmware btrfs-progs \
grub networkmanager \
vim sudo git \
noto-fonts-cjk

为什么选 linux-zen:主线内核的 drm_panic 功能需要 CONFIG_DRM_PANIC=y 编译选项。Zen 内核开箱即支持,且针对桌面/服务器混合负载做了优化。

Arch Linux Vnc
在VNC里看VNC

11.6 系统配置#

Terminal window
# 1. fstab
genfstab -U /mnt >> /mnt/etc/fstab
# 2. chroot
arch-chroot /mnt
# 3. 时区与本地化
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
hwclock --systohc
echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen
echo 'zh_CN.UTF-8 UTF-8' >> /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
echo 'arch-vm' > /etc/hostname
# 4. 设置密码
echo 'root:arch123' | chpasswd
useradd -m -G wheel -s /bin/bash mint
echo 'mint:mint123' | chpasswd
echo '%wheel ALL=(ALL:ALL) ALL' >> /etc/sudoers.d/wheel
# 5. 复制镜像源配置(新系统也用国内源)
cp /etc/pacman.d/mirrorlist /etc/pacman.conf .

11.7 initramfs 与 GRUB#

Terminal window
# 在 mkinitcpio 中添加 btrfs hook
sed -i 's/^HOOKS=.*/HOOKS=(base udev autodetect modconf block btrfs filesystems keyboard fsck)/' /etc/mkinitcpio.conf
mkinitcpio -P
# 安装 GRUB(BIOS 模式)
grub-install --target=i386-pc /dev/vda
# 配置串口输出 + drm_panic
sed -i 's|^GRUB_CMDLINE_LINUX_DEFAULT="|GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200 drm.panic_register=1 |' /etc/default/grub
sed -i 's|^GRUB_TERMINAL_INPUT=|GRUB_TERMINAL_INPUT=console serial|' /etc/default/grub
sed -i 's|^#GRUB_TERMINAL_OUTPUT=|GRUB_TERMINAL_OUTPUT=console serial|' /etc/default/grub
echo 'GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"' >> /etc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg
# 启用 NetworkManager
systemctl enable NetworkManager
# 退出 chroot,卸载,关机
exit
umount -R /mnt
poweroff

11.8 安装后清理#

VM 关机后,从 libvirt XML 中移除 DVD 内核引导配置,改为纯磁盘启动:

Terminal window
# 导出现有 XML,删除 kernel/initrd/cmdline 行
sudo virsh dumpxml arch-vm > /tmp/arch-vm.xml
sed -i '/<kernel>.*vmlinuz-linux<\/kernel>/d' /tmp/arch-vm.xml
sed -i '/<initrd>.*initramfs-linux.img<\/initrd>/d' /tmp/arch-vm.xml
sed -i '/<cmdline>.*archisobasedir.*<\/cmdline>/d' /tmp/arch-vm.xml
# 重新定义并启动
sudo virsh define /tmp/arch-vm.xml
sudo virsh start arch-vm

用户密码root / arch123mint / mint123


12. VNC 图形控制台配置#

虽然服务器无图形界面,但为 VM 配置 VNC 后,可以从笔记本用 VNC 客户端直连查看 VM 画面(GRUB 菜单、tty 等)。对于 virt-manager 远程管理也必不可少。

12.1 原理#

libvirt 的 <graphics> 元素告诉 QEMU 启动一个内置的 VNC 服务器。<video> 元素定义虚拟显卡型号。两者配合后,VM 就有了图形输出通道。

笔记本 VNC 客户端 ──TCP 5901──► QEMU (libvirt) ──► VM 虚拟显卡

12.2 为已有 VM 添加 VNC#

注意:操作需要 destroy → define → start,VM 会短暂中断(约 10 秒)。

Terminal window
# 1. 导出 VM 的 XML
sudo virsh dumpxml <vm-name> | sudo tee /tmp/<vm-name>-vnc.xml > /dev/null
# 2. 在 <devices> 起始标签后插入 graphics + video
sudo sed -i 's|<devices>|<devices>\n <graphics type="vnc" port="-1" autoport="yes" listen="0.0.0.0">\n <listen type="address" address="0.0.0.0"/>\n </graphics>\n <video>\n <model type="virtio" heads="1" primary="yes"/>\n </video>|' /tmp/<vm-name>-vnc.xml
# 3. 销毁 → 重新定义 → 启动
sudo virsh destroy <vm-name>
sudo virsh define /tmp/<vm-name>-vnc.xml
sudo virsh start <vm-name>
# 4. 查看分配的 VNC 端口
sudo virsh vncdisplay <vm-name>
# 输出示例::1 → 端口 5901

<graphics> 参数说明

属性含义
typevnc使用 VNC 协议
port-1自动分配端口
autoportyes自动选择可用端口
listen0.0.0.0监听所有网络接口

<video> 参数说明

属性含义
typevirtio准虚拟化显卡(性能最佳)
heads1单显示器
primaryyes主显示设备

12.3 实际执行结果#

笔者两台 VM 配置后的端口分配:

虚拟机VNC 端口连接地址
arch-vm:1192.168.43.101:5901
fedora-vm:2192.168.43.101:5902

12.4 从笔记本连接#

VNC 客户端直连(最直接):

Terminal window
# Linux 笔记本
vncviewer 192.168.43.101:5901
# Windows/Mac 可用 TigerVNC、RealVNC 等客户端

virt-manager 远程连接(在笔记本上安装 virt-manager):

Terminal window
# 笔记本终端执行(X11 转发)
ssh -X mint@192.168.43.101 virt-manager

这会打开图形化的虚拟机管理窗口,可以查看所有 VM 的状态和画面。


13. 总结#

核心教训#

  1. Fedora/Anaconda 的图形安装器与无图形服务器不兼容,必须用 inst.text 强制文本模式
  2. --cdrom 模式下不能传 --extra-args,必须改用 --location 方式引导
  3. --location 只传引导文件,不传光盘设备,必须同时用 --disk /dev/sr0,device=cdrom 把光盘作为块设备传给 VM
  4. inst.repo=cdrom 是解决 dracut-initqueue timeout 的关键参数
  5. Arch Linux 不能用 --location,必须用 --boot 显式指定内核路径和 archisobasedir 参数
  6. Arch 官方仓库已移除 zfs-dkms,国内 archzfs 镜像不可用,改用 Btrfs(子卷 + zstd 压缩)是更务实的选择
  7. drm_panic QR 码内核崩溃诊断 需要 linux-zen 内核 + drm.panic_register=1 内核参数
  8. VNC 图形控制台 通过修改 libvirt XML 添加 <graphics> + <video> 实现,不依赖宿主机图形环境

通用公式#

Fedora/RHEL/CentOS/Rocky 系列(Anaconda 安装器):

Terminal window
sudo mount /dev/sr0 /mnt -o ro
sudo virt-install \
--name <vm-name> \
--ram <内存> --vcpus <CPU数> \
--disk path=<磁盘路径>,size=<大小> \
--disk /dev/sr0,device=cdrom,readonly=on \
--location /mnt \
--os-variant <发行版> \
--network network=default \
--graphics none \
--extra-args "inst.text console=ttyS0,115200 inst.repo=cdrom" \
--console pty,target_type=serial

Arch Linux 系列(archiso,用 --boot 显式指定内核):

Terminal window
sudo mount /dev/sr0 /mnt -o ro
# 先获取 UUID: cat /mnt/boot/*.uuid
sudo virt-install \
--name <vm-name> \
--ram <内存> --vcpus <CPU数> \
--disk path=<磁盘路径>,size=<大小> \
--disk /dev/sr0,device=cdrom,readonly=on \
--boot kernel=/mnt/arch/boot/x86_64/vmlinuz-linux,\
initrd=/mnt/arch/boot/x86_64/initramfs-linux.img,\
kernel_args="console=ttyS0,115200 archisobasedir=arch archisosearchuuid=<UUID>" \
--os-variant archlinux \
--network network=default \
--graphics none \
--console pty,target_type=serial

本文记录于 2026 年 5 月 19 日,环境 Debian 13 + libvirt 11.3.0 + QEMU 10.0.8

KVM虚拟化入门: Debian系统上用物理 DVD 安装 KVM 虚拟机攻略
https://www.mintlab.top/posts/tries/r730_kvm/
作者
Mint
发布于
2026-05-19
许可协议
CC BY-NC-SA 4.0
发表评论

输入用户名和邮箱后自动检查登录状态。登录后用户名和邮箱将被绑定, 只可以修改头像和主页链接。

未登录
昵称
邮箱
填写头像链接与主页链接

头像链接为空默认使用gravatar头像

头像
主页
人机验证
评论列表

以下是可爱的评论们:

暂无评论, 呜呜, 快来评论喵!