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控制器后又会无法启动。

相关推荐
Serverless社区2 小时前
进阶指南:BrowserUse + Agentrun Sandbox 最佳实践指南
运维·阿里云·云原生·serverless·函数计算
Maggie_ssss_supp2 小时前
Linux-MySQL权限管理
linux·运维·mysql
石像鬼₧魂石2 小时前
Kali Linux 内网渗透:深度工程实施手册
linux·运维·服务器
运维螺丝钉4 小时前
docker安装应用
运维·docker·容器
以太浮标4 小时前
华为eNSP模拟器综合实验之- 路由表RIB和转发表FIB的关联解析
运维·网络·华为·信息与通信
optimistic_chen4 小时前
【Docker入门】cgroups 资源控制
linux·运维·ubuntu·docker·容器·cgroup
LXY_BUAA4 小时前
《嵌入式操作系统》_内核编译练习与配置文件讲解_20260119
linux·运维·服务器
触想工业平板电脑一体机5 小时前
【触想智能】MES工位一体机在自动化生产线上的作用和市场应用前景分析
大数据·运维·自动化
芥子沫5 小时前
书签管理工具使用:Readeck-Docker部署和使用技巧
运维·docker·容器·书签管理