环境:Dell PowerEdge R730 / Debian 13 / KVM+libvirt / 纯 SSH 终端(无图形界面)
目标:从服务器物理光驱安装 Fedora 44 和 Arch Linux 虚拟机
1. 前置条件
1.1 硬件虚拟化支持检查
KVM 依赖 CPU 的硬件虚拟化扩展,需确保 CPU 支持并启用该功能:
检查 CPU 支持:
执行以下命令,若输出包含 vmx(Intel)或 svm(AMD),则支持虚拟化:
grep -E --color=auto 'vmx|svm' /proc/cpuinfo若无输出,可能是 CPU 不支持,或需在 BIOS/UEFI 中启用(常见选项:Intel Virtualization Technology 或 AMD SVM)。
验证内核模块加载: 若硬件支持,KVM 内核模块会自动加载(或按需加载):
lsmod | grep kvm# 输出示例(Intel):# kvm_intel 311296 0# kvm 942080 1 kvm_intel1.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 安装:
# 更新软件源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-system | libvirt 守护进程(管理虚拟机的核心服务) |
libvirt-clients | libvirt 命令行工具(如 virsh) |
bridge-utils | 网络桥接配置工具 |
virt-manager | 图形化虚拟机管理工具(可选,适合桌面环境) |
virtinst | 命令行虚拟机创建工具(如 virt-install) |
2.2 配置用户权限
默认情况下,仅 root 用户可管理 KVM 虚拟机。为避免直接使用 root,需将普通用户添加到 kvm 和 libvirt 组(前者控制设备访问,后者控制 libvirt 服务):
# 将当前用户加入 kvm 和 libvirt 组sudo usermod -aG kvm $USERsudo usermod -aG libvirt $USER
# 重新登录使权限生效(或执行 `newgrp kvm; newgrp libvirt` 临时生效)2.3 验证安装
检查 libvirt 服务状态:
sudo systemctl status libvirtd# 预期输出:Active: active (running)验证 KVM 模块加载:
sudo virsh capabilities | grep -A 10 "cpu"# 输出应包含 CPU 特性(如 vmx/svm),表明 KVM 可用列出默认网络:
virsh net-list --all# 预期输出:默认 NAT 网络 "default" 处于活跃状态3. 环境检查
动手前先确认 KVM 服务正常:
# CPU 虚拟化支持grep -E "(vmx|svm)" /proc/cpuinfo | head -1
# KVM 模块lsmod | grep kvm
# 设备节点ls -la /dev/kvm
# libvirtd 状态systemctl status libvirtd
# 用户组(当前用户需在 libvirt 组)groups4. 光驱设备定位
插入 DVD 后,用以下命令定位设备:
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/cdrom → sr0,光盘是 Fedora 44 安装 DVD。
确认设备信息:
cat /proc/sys/dev/cdrom/info# drive name: sr0# Can read DVD: 1验证光盘内容:
sudo mount /dev/sr0 /mnt -o rols /mnt/# boot EFI Fedora-Legal-README.txt images LICENSE media.repo Packages repodatasudo umount /mnt5. 失败的尝试与排错
以下是我踩过的三个坑,帮你绕过。
尝试一:--cdrom 直接启动
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 强制文本模式:
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.stage2 或 inst.repo 参数来告知第二阶段安装源的位置。没有这个参数,dracut-initqueue 就在循环等待 /dev/root 出现,最终超时。
尝试三:混合使用 --cdrom + --extra-args
天真地想用 --cdrom 传光盘设备,同时用 --extra-args 传文本模式参数:
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指定安装源
# 1. 挂载 DVDsudo mount /dev/sr0 /mnt -o ro
# 2. 清理之前的试错残留(如有)sudo virsh destroy fedora-vm 2>/dev/nullsudo 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 设备传给 VM | Anaconda 需要直接访问光盘上的 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 Protocol2) Use text mode
输入 2,然后输入 c 确认然后按数字键选择配置项:
| 输入 | 配置项 | 说明 |
|---|---|---|
1 | Language | 已默认简体中文 |
2 | Timezone | 已默认 Asia/Shanghai |
3 | Install Source | 应自动识别为 Local media |
4 | Software | 选择 Fedora Server Edition |
5 | Disk | 选择自动分区方案 |
7 | Root Password | 必须设置 |
8 | User | 创建管理员用户 |
b | Begin | 开始安装 |
完成后系统会重启进入新系统。
8. 安装后管理
连接到虚拟机
# 方式 1:串口控制台sudo virsh console fedora-vm# 退出:按 Ctrl + ]
# 方式 2:SSH(推荐,安装好 guest-agent 后)sudo virsh domifaddr fedora-vm # 查看 IPssh mint@<vm-ip>在 VM 内安装 Guest Agent
sudo dnf install -y qemu-guest-agentsudo systemctl enable --now qemu-guest-agent日常管理速查
# VM 生命周期sudo virsh list --all # 查看所有 VMsudo 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 --configsudo virsh setmaxmem fedora-vm 4096 --config
# 快照sudo virsh snapshot-create-as fedora-vm --name clean-installsudo 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-vmsudo virsh undefine fedora-vm --remove-all-storage9. 网络配置:让外部设备访问虚拟机
安装完成后,你会发现一个尴尬的问题: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 → 物理网络 | → br0 → eno1 → 物理网络(直达) |
| 外部回包 | 路由器发给宿主机 .101,宿主机再做 NAT 转回 VM | 路由器直接发给 VM 的 IP |
| 性能 | 多一层 NAT 转换 | 零拷贝,接近物理网卡性能 |
9.4 宿主机桥接配置
⚠️ 警告:以下操作会导致 SSH 短暂断开(约 5~10 秒),因为主网卡的 IP 要迁移到桥接口上。
第一步:查看当前网络布局
# 查看默认路由和主网卡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)
# 1. 创建桥接接口 br0sudo 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 需求,应预先设置。
第三步:验证桥接
# 确认 br0 已创建并获取 IPip addr show br0 | grep inet# inet 192.168.43.101/24 ...
# 确认 eno1 已从属到 br0ip link show eno1# ... master br0 ...
# 确认默认路由走 br0ip route show default# default via 192.168.43.1 dev br0 ...
# 确认 NetworkManager 连接状态nmcli con show --active | grep br09.5 创建 libvirt 桥接网络
宿主机网络桥 OK 了,但 libvirt 还不知道这个桥的存在。需要为 libvirt 定义网络:
# 编写 libvirt 网络定义 XMLcat > /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 --allXML 参数详解:
| 元素 | 含义 |
|---|---|
<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 运行时在线切换)
# 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 才在线生效;两者同时用=永久在线切换)
--livevs--config:
--live:立即生效,但重启后丢失--config:写入 XML,下次启动才生效- 两者共用 = 立即生效且持久化
在 VM 内刷新 DHCP
网卡切换后,VM 需要重新获取 IP:
# 进入 VM 控制台sudo virsh console fedora-vm
# 在 VM 内执行sudo dhclient enp1s0# 或sudo nmcli con down enp1s0 && sudo nmcli con up enp1s0验证
# 宿主机上查看 VM 的网络接口sudo virsh domiflist fedora-vm# 接口 类型 源 型号 MAC# vnet5 bridge br0 virtio 52:54:00:54:7e:bc# ↑ 已改为 br09.7 查看虚拟机 IP 的多种方式
这是日常管理中最常用的操作,按推荐度排列:
方式一:virsh domifaddr(推荐,最全面)
# 通过 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 网络)
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 -仅适用于
defaultNAT 网络。桥接到br0后,DHCP 由路由器负责,libvirt 不知道租约信息。
方式三:宿主机的 ARP 表
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 内部查看
sudo virsh console fedora-vm# 登录后执行ip addr show enp1s0# 或hostname -IIP 查看速查表
| 场景 | 推荐命令 |
|---|---|
| 日常快速查 IP | sudo virsh domifaddr fedora-vm --source agent |
| NAT 网络查 IP | sudo virsh net-dhcp-leases default |
| 桥接网络查 IP | ip neigh show dev br0 |
| Guest Agent 未装 | sudo virsh console fedora-vm 进去看 |
9.8 SSH 隧道方案(备选)
如果不想改网络,可以用宿主机做跳板:
# 笔记本上执行(一次性)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:
# 在 R730 上执行:把 R730:2222 转发到 VM:22sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 \ -j DNAT --to-destination 192.168.122.225:22sudo iptables -A FORWARD -p tcp -d 192.168.122.225 --dport 22 -j ACCEPTsudo iptables -t nat -A POSTROUTING -j MASQUERADE
# 持久化(Debian)sudo apt install iptables-persistentsudo 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),踩了完全不同的坑。本节记录整个过程。

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必须先探查光盘布局:
sudo mount /dev/sr0 /mnt -o rols -laR /mnt/arch/boot/# 输出:# /mnt/arch/boot/x86_64/initramfs-linux.img同时查看引导器配置,获取必需的内核参数:
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=arch和archisosearchuuid=<UUID>是 Arch ISO 引导时必须的。没有它们,initramfs 找不到光盘上的根文件系统。
11.2 正确的启动命令
Arch 需要用 --boot 显式指定内核和 initrd 路径,不能依赖 --location:
# 1. 挂载 DVDsudo mount /dev/sr0 /mnt -o ro
# 2. 清理残留sudo virsh destroy arch-vm 2>/dev/nullsudo 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=cdrom | archisobasedir=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,安装前务必切换到国内镜像:
echo "Server = https://mirrors.ustc.edu.cn/archlinux/\$repo/os/\$arch" > /etc/pacman.d/mirrorlistecho "Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/\$repo/os/\$arch" >> /etc/pacman.d/mirrorlistecho "Server = https://mirrors.aliyun.com/archlinux/\$repo/os/\$arch" >> /etc/pacman.d/mirrorlist
# 开启并行下载sed -i 's/^#ParallelDownloads/ParallelDownloads/' /etc/pacman.confpacman -Syy效果:下载速度从 12 KiB/s → 3 MiB/s,提升约 250 倍。
11.4 分区与 Btrfs 文件系统
由于 zfs-dkms 已从 Arch 官方仓库移除,且第三方 archzfs 源在国内不可用,改用 Btrfs——它和 ZFS 一样支持 CoW(写时复制)、快照、透明压缩等特性,且原生内置于内核。
# 查看磁盘lsblk# vda 30G ← 唯一磁盘
# MBR 分区(BIOS 模式)parted /dev/vda mklabel msdosparted /dev/vda mkpart primary ext4 1MiB 513MiB # /bootparted /dev/vda set 1 boot onparted /dev/vda mkpart primary 513MiB 100% # btrfs
# 格式化mkfs.ext4 /dev/vda1 # boot 分区mkfs.btrfs -f /dev/vda2 # btrfs 根分区
# 创建 btrfs 子卷(方便快照管理)mount /dev/vda2 /mntbtrfs subvolume create /mnt/@ # 根子卷btrfs subvolume create /mnt/@home # home 子卷umount /mnt
# 挂载mount -o compress=zstd,subvol=@ /dev/vda2 /mntmkdir -p /mnt/{boot,home}mount -o compress=zstd,subvol=@home /dev/vda2 /mnt/homemount /dev/vda1 /mnt/boot分区布局:
| 分区 | 大小 | 文件系统 | 挂载点 |
|---|---|---|---|
/dev/vda1 | 512 MiB | ext4 | /boot |
/dev/vda2 | 29.5 GiB | btrfs (子卷 @) | / |
| 同上 | — | btrfs (子卷 @home) | /home |
11.5 安装基础系统
安装 linux-zen 内核以支持 drm_panic 功能(内核崩溃时显示 QR 码),同时安装中文字体:
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 内核开箱即支持,且针对桌面/服务器混合负载做了优化。

11.6 系统配置
# 1. fstabgenfstab -U /mnt >> /mnt/etc/fstab
# 2. chrootarch-chroot /mnt
# 3. 时区与本地化ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimehwclock --systohcecho 'en_US.UTF-8 UTF-8' > /etc/locale.genecho 'zh_CN.UTF-8 UTF-8' >> /etc/locale.genlocale-genecho 'LANG=en_US.UTF-8' > /etc/locale.confecho 'arch-vm' > /etc/hostname
# 4. 设置密码echo 'root:arch123' | chpasswduseradd -m -G wheel -s /bin/bash mintecho 'mint:mint123' | chpasswdecho '%wheel ALL=(ALL:ALL) ALL' >> /etc/sudoers.d/wheel
# 5. 复制镜像源配置(新系统也用国内源)cp /etc/pacman.d/mirrorlist /etc/pacman.conf .11.7 initramfs 与 GRUB
# 在 mkinitcpio 中添加 btrfs hooksed -i 's/^HOOKS=.*/HOOKS=(base udev autodetect modconf block btrfs filesystems keyboard fsck)/' /etc/mkinitcpio.confmkinitcpio -P
# 安装 GRUB(BIOS 模式)grub-install --target=i386-pc /dev/vda
# 配置串口输出 + drm_panicsed -i 's|^GRUB_CMDLINE_LINUX_DEFAULT="|GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0,115200 drm.panic_register=1 |' /etc/default/grubsed -i 's|^GRUB_TERMINAL_INPUT=|GRUB_TERMINAL_INPUT=console serial|' /etc/default/grubsed -i 's|^#GRUB_TERMINAL_OUTPUT=|GRUB_TERMINAL_OUTPUT=console serial|' /etc/default/grubecho 'GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"' >> /etc/default/grubgrub-mkconfig -o /boot/grub/grub.cfg
# 启用 NetworkManagersystemctl enable NetworkManager
# 退出 chroot,卸载,关机exitumount -R /mntpoweroff11.8 安装后清理
VM 关机后,从 libvirt XML 中移除 DVD 内核引导配置,改为纯磁盘启动:
# 导出现有 XML,删除 kernel/initrd/cmdline 行sudo virsh dumpxml arch-vm > /tmp/arch-vm.xmlsed -i '/<kernel>.*vmlinuz-linux<\/kernel>/d' /tmp/arch-vm.xmlsed -i '/<initrd>.*initramfs-linux.img<\/initrd>/d' /tmp/arch-vm.xmlsed -i '/<cmdline>.*archisobasedir.*<\/cmdline>/d' /tmp/arch-vm.xml
# 重新定义并启动sudo virsh define /tmp/arch-vm.xmlsudo virsh start arch-vm用户密码:
root/arch123,mint/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 秒)。
# 1. 导出 VM 的 XMLsudo virsh dumpxml <vm-name> | sudo tee /tmp/<vm-name>-vnc.xml > /dev/null
# 2. 在 <devices> 起始标签后插入 graphics + videosudo 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.xmlsudo virsh start <vm-name>
# 4. 查看分配的 VNC 端口sudo virsh vncdisplay <vm-name># 输出示例::1 → 端口 5901<graphics> 参数说明:
| 属性 | 值 | 含义 |
|---|---|---|
type | vnc | 使用 VNC 协议 |
port | -1 | 自动分配端口 |
autoport | yes | 自动选择可用端口 |
listen | 0.0.0.0 | 监听所有网络接口 |
<video> 参数说明:
| 属性 | 值 | 含义 |
|---|---|---|
type | virtio | 准虚拟化显卡(性能最佳) |
heads | 1 | 单显示器 |
primary | yes | 主显示设备 |
12.3 实际执行结果
笔者两台 VM 配置后的端口分配:
| 虚拟机 | VNC 端口 | 连接地址 |
|---|---|---|
arch-vm | :1 | 192.168.43.101:5901 |
fedora-vm | :2 | 192.168.43.101:5902 |
12.4 从笔记本连接
VNC 客户端直连(最直接):
# Linux 笔记本vncviewer 192.168.43.101:5901
# Windows/Mac 可用 TigerVNC、RealVNC 等客户端virt-manager 远程连接(在笔记本上安装 virt-manager):
# 笔记本终端执行(X11 转发)ssh -X mint@192.168.43.101 virt-manager这会打开图形化的虚拟机管理窗口,可以查看所有 VM 的状态和画面。
13. 总结
核心教训
- Fedora/Anaconda 的图形安装器与无图形服务器不兼容,必须用
inst.text强制文本模式 --cdrom模式下不能传--extra-args,必须改用--location方式引导--location只传引导文件,不传光盘设备,必须同时用--disk /dev/sr0,device=cdrom把光盘作为块设备传给 VMinst.repo=cdrom是解决dracut-initqueue timeout的关键参数- Arch Linux 不能用
--location,必须用--boot显式指定内核路径和archisobasedir参数 - Arch 官方仓库已移除
zfs-dkms,国内 archzfs 镜像不可用,改用 Btrfs(子卷 + zstd 压缩)是更务实的选择 drm_panicQR 码内核崩溃诊断 需要linux-zen内核 +drm.panic_register=1内核参数- VNC 图形控制台 通过修改 libvirt XML 添加
<graphics>+<video>实现,不依赖宿主机图形环境
通用公式
Fedora/RHEL/CentOS/Rocky 系列(Anaconda 安装器):
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=serialArch Linux 系列(archiso,用 --boot 显式指定内核):
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
以下是可爱的评论们:

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