1. 故障现象描述
环境描述:
- 主机:Linux物理机
- 工具:使用
virt-install
命令行工具创建KVM虚拟机 - 媒介:Anolis OS ISO安装镜像
问题描述:
执行 virt-install
命令后,虚拟机启动并开始Anolis安装流程(anaconda),但在检测存储设备的阶段卡住。通过 virsh console <vm-name>
或VNC客户端查看后台日志,发现关键错误信息:
anaconda.storage.module :blivet:edd to match edd entry 0x80
此后安装进程无响应,无法识别到磁盘设备,导致无法继续安装。
2. 深度技术分析
2.1 核心组件作用解析
要定位该故障,首先需要理解报错信息中两个核心组件的作用:
-
Anaconda:
Red Hat系Linux(包括RHEL, CentOS, Fedora, Anolis)的安装程序。它负责引导系统、硬件检测、软件包安装、系统配置等全过程。 -
Blivet模块:
Anaconda中负责所有存储配置的核心底层库。它的作用是:- 枚举设备:探测系统上的所有存储设备(硬盘、光盘、USB驱动器等)。
- 识别技术:判断设备类型(如SATA, SCSI, NVMe, VirtIO)、分区表、文件系统、RAID、LVM等。
- 管理配置:根据用户在安装界面上的选择,进行分区、格式化、挂载等操作。
- 与硬件交互:调用底层工具(如
libparted
,mdadm
,lvm2
)并处理内核中的设备映射(/dev/mapper/*
)。
简单来说,Blivet是Anaconda和磁盘硬件之间的“翻译官”和“执行官”。安装卡在blivet模块,说明问题必然出在存储设备的识别或配置阶段。
2.2 错误根源定位
edd to match edd entry 0x80
是本次故障的直接线索。
-
EDD (Extended Disk Device):
这是一个古老的BIOS规范,旨在为操作系统引导加载程序(如GRUB)提供一个标准化的接口来访问磁盘,而无需依赖复杂的驱动程序。BIOS会将自己检测到的磁盘按顺序编号,如:0x80
: 第一块可启动硬盘0x81
: 第二块硬盘- …以此类推
-
问题本质:
在现代化的虚拟化环境中,虚拟机的磁盘通常由半虚拟化驱动(如VirtIO) 或高效的模拟设备(如SATA) 提供。这些设备的枚举和管理主要由Linux内核负责,而非传统的BIOS EDD机制。
然而,Anaconda(或其底层库)在某些配置下,仍然尝试去查询BIOS的EDD信息,并期望将其与Linux内核识别到的设备(如/dev/vda
)进行匹配。当这种匹配失败时——通常是因为虚拟机的磁盘控制器类型与安装程序期望的不一致——就会抛出所述错误并导致进程卡住。
结论:故障的根本原因是虚拟机配置的磁盘控制器类型与Anolis安装镜像中的内核驱动/Anaconda配置存在兼容性问题,导致Blivet模块无法通过传统BIOS EDD机制正确映射现代虚拟化磁盘设备。
3. 解决方案与步骤
解决思路围绕更改磁盘控制器类型和传递内核参数两大方向。以下是详细的解决步骤,建议按顺序尝试。
方案一:更改磁盘控制器为VirtIO(首选方案)
VirtIO是KVM虚拟化的半虚拟化标准,性能最佳且兼容性最好。但需要额外加载驱动。
-
销毁当前虚拟机(如果已创建):
virsh destroy <vm-name> # 强制关闭 virsh undefine <vm-name> # 删除定义
-
下载VirtIO驱动镜像:
从Fedora项目仓库下载最新的VirtIO驱动ISO:wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso -O /path/to/virtio-win.iso
-
修改virt-install命令:
在原来的virt-install
命令中,移除--disk
参数,并替换为以下内容,明确指定总线类型为virtio
:virt-install \ --name anolis-vm \ --memory 4096 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/anolis-vm.qcow2,size=40,format=qcow2,bus=virtio \ # 关键修改:bus=virtio --cdrom /path/to/anolis.iso \ --disk path=/path/to/virtio-win.iso,device=cdrom \ # 添加VirtIO驱动盘 --os-type linux \ --os-variant almalinux8 \ # 或选择最接近的变体,如 generic --network bridge=virbr0,model=virtio \ # 网络也建议用virtio --graphics vnc,listen=0.0.0.0 \ --boot uefi \ # 建议使用UEFI,兼容性更好 --console pty,target_type=serial
-
在安装过程中加载驱动:
- 启动虚拟机并通过VNC连接。
- 在Anaconda的欢迎界面(选择语言和安装目标的界面),你会可能看不到任何磁盘。
- 此时,按
Ctrl+Alt+F2
切换到第二个虚拟控制台,以root身份登录(无需密码)。 - 手动加载VirtIO驱动:
# 查找VirtIO驱动盘,通常为 /dev/sr1 或 /dev/sr0 lsblk # 挂载驱动盘 mkdir /mnt/virtio mount /dev/sr1 /mnt/virtio # 请根据lsblk结果确认设备名 # 运行Anaconda的驱动盘安装脚本 /mnt/virtio/blivet.sh # 或者查找并运行其他可能的安装脚本
- 按
Ctrl+Alt+F6
(或F1)返回图形界面,点击刷新或重新扫描磁盘,此时应能正确识别到vda
设备。
方案二:向安装内核传递启动参数
如果不想使用VirtIO,可以尝试通过内核参数禁用有问题的功能。
-
编辑GRUB启动项:
在virt-install
启动虚拟机后,迅速在VNC窗口中操作。当出现安装菜单时,高亮选择 “Install Anolis OS” 并按下Tab
键(或e
键,如果是UEFI界面)。 -
添加故障规避参数:
在显示的内核命令行(以linuxefi
或linux
开头的行)末尾,添加以下参数:... quiet edd=off nompath nodmraid
edd=off
: 直接禁用EDD检测,这是最针对性的参数。nodmraid
: 禁用软RAID检测。nompath
: 禁用多路径设备检测。
-
启动安装:
按下Ctrl+X
来使用修改后的参数启动。这通常会绕过该错误。
方案三:使用其他磁盘总线类型
如果以上方案均无效,可以尝试回退到兼容性更好的模拟设备。在 virt-install
命令中修改 --disk
参数:
- SATA 控制器:
bus=sata
- SCSI 控制器:
bus=scsi
例如:
--disk path=...,bus=sata
4. 总结与预防
- 根本原因:传统BIOS EDD机制与现代虚拟化磁盘控制器(尤其是默认配置)不兼容。
- 最佳实践:
- 明确指定总线类型:在使用
virt-install
时,始终使用bus=virtio
以获得最佳性能和兼容性,并准备好驱动镜像。 - 使用UEFI:在虚拟化环境中,UEFI固件比传统BIOS更现代,问题更少。
- 参数化启动:熟知
edd=off
,nodmraid
等常用故障规避参数,在遇到问题时能快速尝试。
- 明确指定总线类型:在使用
通过上述分析和方法,可以系统地解决此类安装卡住的问题,并总结出在KVM环境下安装Linux虚拟机的一套可靠配置规范。