故障定位总结:virt-install安装ISO卡在“anaconda.storage.module :blivet:edd to match edd entry 0x80“

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中负责所有存储配置的核心底层库。它的作用是:

    1. 枚举设备:探测系统上的所有存储设备(硬盘、光盘、USB驱动器等)。
    2. 识别技术:判断设备类型(如SATA, SCSI, NVMe, VirtIO)、分区表、文件系统、RAID、LVM等。
    3. 管理配置:根据用户在安装界面上的选择,进行分区、格式化、挂载等操作。
    4. 与硬件交互:调用底层工具(如 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虚拟化的半虚拟化标准,性能最佳且兼容性最好。但需要额外加载驱动。

  1. 销毁当前虚拟机(如果已创建):

    virsh destroy <vm-name>        # 强制关闭
    virsh undefine <vm-name>       # 删除定义
    
  2. 下载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
    
  3. 修改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
    
  4. 在安装过程中加载驱动

    • 启动虚拟机并通过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,可以尝试通过内核参数禁用有问题的功能。

  1. 编辑GRUB启动项
    virt-install 启动虚拟机后,迅速在VNC窗口中操作。当出现安装菜单时,高亮选择 “Install Anolis OS” 并按下 Tab 键(或 e 键,如果是UEFI界面)。

  2. 添加故障规避参数
    在显示的内核命令行(以 linuxefilinux 开头的行)末尾,添加以下参数:

    ... quiet edd=off nompath nodmraid
    
    • edd=off直接禁用EDD检测,这是最针对性的参数。
    • nodmraid: 禁用软RAID检测。
    • nompath: 禁用多路径设备检测。
  3. 启动安装
    按下 Ctrl+X 来使用修改后的参数启动。这通常会绕过该错误。

方案三:使用其他磁盘总线类型

如果以上方案均无效,可以尝试回退到兼容性更好的模拟设备。在 virt-install 命令中修改 --disk 参数:

  • SATA 控制器bus=sata
  • SCSI 控制器bus=scsi

例如:

--disk path=...,bus=sata

4. 总结与预防

  • 根本原因:传统BIOS EDD机制与现代虚拟化磁盘控制器(尤其是默认配置)不兼容。
  • 最佳实践
    1. 明确指定总线类型:在使用 virt-install 时,始终使用 bus=virtio 以获得最佳性能和兼容性,并准备好驱动镜像。
    2. 使用UEFI:在虚拟化环境中,UEFI固件比传统BIOS更现代,问题更少。
    3. 参数化启动:熟知 edd=off, nodmraid 等常用故障规避参数,在遇到问题时能快速尝试。

通过上述分析和方法,可以系统地解决此类安装卡住的问题,并总结出在KVM环境下安装Linux虚拟机的一套可靠配置规范。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值