KVM虚拟机将无法启动并出现以下错误

我有一台带有Web服务器的KVM虚拟机。 昨天,在没有对服务器或主机进行任何修改的情况下,该虚拟机停止响应。 目前为止,我可以看到它在启动时冻结,而永久使用100%的一个核心cpu。 虚拟机有2个CPU分配,但只占用1个,如主机上的HTOP所示。

closures它的唯一方法是做一个virsh destroy 。 在启动时,我可以看到虚拟机在引导时遇到以下问题:

 [ 1.201865] List of all partitions: [ 1.202927] No filesystem could mount root, tried: [ 1.204415] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) [ 1.206842] CPU: 2 PID: 1 Comm: swapper/0 Not tainted 3.10.0-514.2.2.el7.x86_64 #1 [ 1.209032] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 1.210684] ffffffff818b4340 00000000de564bbf ffff880139abfd60 ffffffff816861cc [ 1.212973] ffff880139abfde0 ffffffff8167f5d3 ffffffff00000010 ffff880139abfdf0 [ 1.215219] ffff880139abfd90 00000000de564bbf 00000000de564bbf ffff880139abfe00 [ 1.217494] Call Trace: [ 1.218221] [<ffffffff816861cc>] dump_stack+0x19/0x1b [ 1.219712] [<ffffffff8167f5d3>] panic+0xe3/0x1f2 [ 1.221149] [<ffffffff81b0a602>] mount_block_root+0x2a1/0x2b0 [ 1.222849] [<ffffffff81b0a664>] mount_root+0x53/0x56 [ 1.224358] [<ffffffff81b0a7a3>] prepare_namespace+0x13c/0x174 [ 1.226092] [<ffffffff81b0a270>] kernel_init_freeable+0x1f5/0x21c [ 1.227882] [<ffffffff81b099db>] ? initcall_blacklist+0xb0/0xb0 [ 1.229656] [<ffffffff81674630>] ? rest_init+0x80/0x80 [ 1.231220] [<ffffffff8167463e>] kernel_init+0xe/0xf0 [ 1.232716] [<ffffffff81696718>] ret_from_fork+0x58/0x90 [ 1.234304] [<ffffffff81674630>] ? rest_init+0x80/0x80 

据我了解,挂载根filesytem有一个问题。 我不知道在这种情况下我能做些什么,是什么导致了这个问题。 如果您有任何可能与我的情况有关的信息,请告诉我。

我在CentOS 7上使用lvm存储: Linux srv1.host.ro 3.10.0-514.6.2.el7.x86_64 #1 SMP Thu Feb 23 03:04:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

我也检查了虚拟机的主要硬盘上的智能,它看起来不错:

 ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 1 Raw_Read_Error_Rate 0x002f 200 200 051 Pre-fail Always - 0 3 Spin_Up_Time 0x0027 175 174 021 Pre-fail Always - 2250 4 Start_Stop_Count 0x0032 100 100 000 Old_age Always - 66 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 7 Seek_Error_Rate 0x002e 200 200 000 Old_age Always - 0 9 Power_On_Hours 0x0032 078 078 000 Old_age Always - 16090 10 Spin_Retry_Count 0x0032 100 253 000 Old_age Always - 0 11 Calibration_Retry_Count 0x0032 100 253 000 Old_age Always - 0 12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 66 192 Power-Off_Retract_Count 0x0032 200 200 000 Old_age Always - 56 193 Load_Cycle_Count 0x0032 200 200 000 Old_age Always - 517 194 Temperature_Celsius 0x0022 108 097 000 Old_age Always - 35 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 0 198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 0 199 UDMA_CRC_Error_Count 0x0032 200 200 000 Old_age Always - 0 200 Multi_Zone_Error_Rate 0x0008 200 200 000 Old_age Offline - 0 

最后的libvirt条目日志是:

 qemu: terminating on signal 15 from pid 1138 2017-02-23 09:15:02.440+0000: shutting down 2017-02-23 09:15:21.080+0000: starting up libvirt version: 2.0.0, package: 10.el7_3.4 (CentOS BuildSystem <http://bugs.centos.org>, 2017-01-17-23:37:48, c1bm.rdu2.centos.org), qemu version: 1.5.3 (qemu-kvm-1.5.3-126.el7_3.3), hostname: srv1.host.ro LC_ALL=C PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin QEMU_AUDIO_DRV=none /usr/libexec/qemu-kvm -name Nginx -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off -cpu Penryn -m 4096 -realtime mlock=off -smp 4,sockets=4,cores=1,threads=1 -uuid be91646a-f5d3-494d-8a51-e9e598bfdf52 -nographic -no-user-config -nodefaults -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-2-Nginx/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=discard -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -drive file=/dev/Storage/Nginx,format=raw,if=none,id=drive-ide0-0-0,cache=none,aio=native -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,bootindex=1 -drive if=none,id=drive-ide0-0-1,readonly=on -device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 -netdev tap,fd=26,id=hostnet0 -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:2c:e1:cd,bus=pci.0,addr=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4 -msg timestamp=on char device redirected to /dev/pts/0 (label charserial0) 

由于您的虚拟机在根目录从您的initramfs到存储在“/ root”的系统之前未能挂载root,所以您的初始ramdisk无法find根文件系统很可能是一个问题 – 或者是因为它不是在那里,initramfs没有安装它所需的工具,或者因为你有某种types的卷或启动configuration错误。

鉴于提供的证据,我会断言,这可能是客户操作系统级别的问题,或者你错过了一个曾经挂在这个虚拟机上的磁盘,它与根文件系统有关。 例如,如果您在具有多个虚拟磁盘成员的guest虚拟机上使用LVM。

更新也可能会影响您的启动时间参数或安装到您的initramfs的软件包。 通常情况下,只有升级内核时才会发生这种情况。 除此之外,更改引导加载程序configuration或者有时更改LVM支持的计算机上的主机名或卷名称。

另外,真正的文件系统故障完全有可能导致这种情况发生,无论是在主机上还是在客户端上。 如果未configuration为定期检查,则可以考虑检查基础磁盘,文件系统和来宾文件系统,作为简单的故障排除步骤。

List of all partitions:应该是所有分区的列表(显然)。 参见例如Linux 3.10 init / do_mounts.c:418 , mount_block_root()一部分:

  printk("List of all partitions:\n"); printk_all_partitions(); printk("No filesystem could mount root, tried: "); for (p = fs_names; *p; p += strlen(p)+1) printk(" %s", p); printk("\n"); #ifdef CONFIG_BLOCK __bdevname(ROOT_DEV, b); #endif panic("VFS: Unable to mount root fs on %s", b); 

for (p = fs_names; ...) printk(...);循环仅仅是打印以零结尾string的零终止列表的C语言方式,我可以解释它是如何工作的,采取几个段落,是不相关的你的问题。)

另请注意, Unable to mount root fs on unknown-block(0,0)在内核恐慌消息中的Unable to mount root fs on unknown-block(0,0)unknown-block(0,0)部分当然是红旗。

printk_all_partitions()是在Linux 3.10 block / genhd.c:738中定义的 ,基本上只是打印内核已知的所有磁盘分区列表。

我们可以得出结论, 有些事情已经导致你的KVM虚拟机丢失了它的磁盘。 (这种事情也会导致一个系统经历各种不正确的行为,包括你经历过的冻结。) 调查并修复这个问题,你的虚拟机应该会恢复正常,假设数据还是不错的。

您需要了解虚拟磁盘映像有一些损坏,而不是物理磁盘。 我会尝试以下两件事情:

  1. qemu-img check图像,validation它没有图像级别的损害
  2. 用附带的liveCD ISO引导虚拟机,并检查虚拟磁盘,至less,如果需要重build那台机器,后者可能有助于恢复数据。