Proxmox导入虚拟机后进入dracut紧急模式

文章目录


问题描述

虚拟机启动时进入了dracut紧急模式,无法识别LVM卷组。执行lvm pvscan显示"No matching physical volumes found",vgchange也找不到卷组,这说明dracut环境根本看不到底层的物理磁盘设备。

lsmod输出显示只加载了dm_mod,缺少关键的virtio_blk驱动,这是Proxmox虚拟化环境必需的磁盘驱动。

这种从其他平台迁移到Proxmox的镜像最常见的启动问题就是initramfs中缺少VirtIO驱动。特别是当原始系统是物理机或VMware环境时,它们的initramfs通常不包含KVM环境所需的驱动。

网上查看主要两个解决方案:一个是通过Proxmox主机直接修改虚拟机配置来添加IDE磁盘作为临时启动介质,这是一个比较巧妙的外部修复方法;另一个是如果需要保留现有磁盘配置,则必须从外部挂载磁盘并chroot修复。

我们下面使用第一个方案试验一下。


Proxmox后台执行命令,修改虚拟机配置,临时添加IDE磁盘控制器启动

bash 复制代码
root@coco:~/kylin-bianyi# qm set 100 --ide0 file=local-lvm:vm-100-disk-1,format=raw
update VM 100: -ide0 file=local-lvm:vm-100-disk-1,format=raw
root@coco:~/kylin-bianyi# qm set 100 --boot order='ide0'
update VM 100: -boot order=ide0
root@coco:~/kylin-bianyi#

执行成功后执行下面的步骤。

问题修复

  1. 启动测试

现在,请在Proxmox网页界面启动这台虚拟机。这是最关键的一步,目的是验证系统能否通过IDE控制器正常引导。

  1. 进入系统并执行永久修复

如果虚拟机成功启动并进入登录界面,请用你的账号密码登录。登录后,请立即打开终端,执行以下命令来永久修复驱动问题(这是解决下次从VirtIO启动的核心):

bash 复制代码
# 1. 重建initramfs,强制加入VirtIO驱动
sudo dracut --force --add-drivers "virtio_pci virtio_blk virtio_scsi virtio_net" /boot/initramfs-$(uname -r).img $(uname -r)

#让 dracut 自动重建(如果上面的命令失败执行这个)
sudo dracut --force /boot/initramfs-$(uname -r).img

# 2. 更新GRUB配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 3. (可选但建议)检查/etc/fstab,确保根分区没有使用旧的设备路径(如/dev/sda1),而是使用UUID或LVM标签。可以使用以下命令查看:
cat /etc/fstab
# 通常,类似 `/dev/mapper/klas-root` 的LVM标签是正确的,无需修改。
  1. 验证驱动是否加载
    修复后,可以运行以下命令检查VirtIO驱动模块是否已在当前内核中激活:
bash 复制代码
lsmod | grep virtio

如果看到 virtio_pci、virtio_blk 等模块,说明驱动已就绪。

修复验证

  1. 验证重建是否成功
bash 复制代码
# 检查新的 initramfs 文件
ls -lh /boot/initramfs-$(uname -r).img

# 查看新 initramfs 中的 virtio 模块
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio | head -10

# 确认关键模块是否存在
lsinitrd /boot/initramfs-$(uname -r).img -f usr/lib/modules/$(uname -r)/kernel/drivers/block/virtio_blk.ko
lsinitrd /boot/initramfs-$(uname -r).img -f usr/lib/modules/$(uname -r)/kernel/drivers/net/virtio_net.ko
lsinitrd /boot/initramfs-$(uname -r).img -f usr/lib/modules/$(uname -r)/kernel/drivers/scsi/virtio_scsi.ko
  1. 更新 GRUB 配置(可选但建议)
bash 复制代码
# 对于 CentOS/RHEL/Kylin 系统
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

# 或者对于使用 UEFI 的系统
sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
  1. 创建备份内核条目(安全起见)
bash 复制代码
# 备份当前内核和 initramfs
sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-$(uname -r).backup
sudo cp /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.backup

# 查看所有可用的内核
sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /boot/grub2/grub.cfg
  1. 测试 virtio 驱动功能
bash 复制代码
# 检查当前加载的 virtio 模块
lsmod | grep virtio

# 测试磁盘 I/O(virtio_blk)
sudo dd if=/dev/zero of=/tmp/testfile bs=1M count=100 oflag=direct
sudo rm /tmp/testfile

# 测试网络(virtio_net)
ping -c 3 www.baidu.com

# 查看 virtio 设备信息
sudo lspci | grep -i virtio
sudo lsblk
sudo ip link show

最终收尾工作

完成上述修复并确认无误后:

关闭虚拟机。

在Proxmox网页界面,将虚拟机的启动顺序改回你原本的设定(例如 scsi0),并将磁盘 ide0 删除或改回原来的控制器类型(例如SCSI或VirtIO Block)。这能确保虚拟机恢复最优的性能和配置。

重新启动虚拟机。此时,系统应该能直接从VirtIO/SCSI控制器正常启动,因为新的initramfs已经包含了必要的驱动。

总结与提醒

核心原理:我们用IDE控制器"骗"系统启动,是为了进入系统后,给内核的启动镜像(initramfs)"打上"能识别VirtIO磁盘的"补丁"(驱动)。

务必操作:请务必在成功启动后立即执行修复命令,否则关机改回VirtIO控制器后又会无法启动。

相关推荐
云飞云共享云桌面41 分钟前
SolidWorks服务器+云飞云共享云桌面 = 10人共享方案
linux·运维·服务器·网络·制造
Full Stack Developme8 小时前
JVM 与 Linux 交互的核心原理
linux·运维·jvm
Java识堂8 小时前
多级负载均衡架构
运维·架构·负载均衡
MXsoft6188 小时前
## 自动化巡检:从手工两小时到系统五分钟的落地实践
运维·自动化
ZLG_zhiyuan8 小时前
直击华南工博会|ZLG致远电子:EtherCAT与自动化总线应用方案动态实景呈现
运维·自动化
HackTwoHub9 小时前
最新Nessus2026.6.8版本主机漏洞扫描/探测工具Windows/Linux
linux·运维·服务器·安全·web安全·网络安全·安全架构
Nayxxu9 小时前
Gemini + RAG 企业知识库教程:从文档切片到答案生成
运维·人工智能
三雷科技10 小时前
Claude Code 命令行完全指南:从高效交互到自动化工作流
运维·自动化·交互
正经教主11 小时前
【docker基础】第五课:Docker网络详解
运维·docker·容器
小黑蛋学java12 小时前
Nginx 接口耗时 Prometheus + Grafana 监控实施方案
运维·nginx·负载均衡·grafana·prometheus