KVM虚拟机磁盘readonly故障分析

本文记录了一次大规模虚拟机只读故障的排查过程。通过对集群监控、虚拟机操作及分布式文件系统的深入分析,最终定位到备份任务为根本原因,并提出解决方案。

集群有200余台虚拟机,运行在分布式文件系统mfs上。

现象:
1、每天凌晨0:10 ,出现批量虚拟机分区出现readonly问题,导致用户无法正常写入。

原因分析:
1、之前偶尔也会出现个别readonly的情况,没有深入排查,只是推测和chunkserver磁盘坏道有关,当vm读写正好在chunkserver坏道的块上时,可能出现报错,导致异常。
2、此次出现大批量readonly,且监控和日志显示均是在凌晨出现,故排除磁盘坏道问题。
3、如果虚拟机上承载docker 、mysql 等可能造成大并发的业务,也可能造成此类问题。但是虚拟机镜像在mfs上是连续的空间,正常的mysql读写并不会有问题。有出现在vm上进行批量docker容器删除时,出现异常的情况。
4、推测有vm用户提交了大量并发的读写任务,而我们并未对虚拟机读写进行限制,也有可能造成此类问题。前期有vm出现load 90+ 报警,紧接着就有chunkserver出现load 100+的报警,和此问题非常类似。

排查定位:
1、检查宿主机负载、网络等,未发现异常情况。
2、检查mfschunkserver ,发现有部分磁盘出现raid errro。
3、检查mfschunkserver ,发现有一台chunkserver出现load +100,iowait达到90%以上的情况,带宽未见异常,写入的数据量也很低,现象大概持续3分钟左右。
4、检查vm在凌晨的监控情况,发现批量机器出现iowait达到100%,流量、load均未见明显异常。有部分vm上有大量的sendmail进程。
5、检查虚拟机上凌晨的crontab、进程等,没有发现异常。
6、检查mfs上的读写情况,未见在凌晨有大量的 chunk create 和replica,但是 max operations in queue 值特别高。
7、检查虚拟机备份程序,发现正好是在凌晨0:10进行备份,执行了snapshot操作,而且每台vm备份间隔仅1s,初步确认此备份为导致异常的主要原因。

由于snapshot操作并未带来大量的读写,之前并未关注到。在深入剖析了snapshot的原理,发现是执行了类似linux 系统的硬链接操作,此时批量的snapshot虚拟机,200台vm大概20TB,按照mfs的每个chunk块 64MB的划分,换算下来执行一次操作,会产生 2010241024/64 = 327680 创建链接的操作,每台vm备份也会产生1600次操作,如果在1s内没有完成,那么cpu队列就会越来越大,从而产生了load和iowait都非常高的现象。由于镜像备份并不是十分紧急的任务,故将间隔时间修改到60s执行一台。

可能造成虚拟机readonly故障的原因:
1、虚拟机备份进程的批量操作产生大量的并发,导致chunkserver 的cpu队列拥塞,产生vm读写出现iowait过高超时的情况,从而造成了磁盘remount为readonly的情况。故有此类批量操作的动作,一定要考虑并发负载的问题。 因为chunkserver是存储型服务器,cpu配置都比较低。

2、个别vm用户大量的提交任务导致后端异常。针对此现象,使用cgroug 进行io限制。可避免此类问题发生。

3、mfschunkser 规格建议配置一致,避免读写负载出现不均衡的情况。

此次定位问题耗时一周:
1、监控不到位,由于zabbix 进行大批量机器对比时,效率很低,临时部署了openfalcon和grafana,耗时较长。
2、没有关注到备份任务,之前一致以为是vm用户的问题,但是通过监控定位并不是用户的问题。
3、对mfs的snapshot未深入理解。

欢迎交流: QQ: 249016681

转载于:https://blog.51cto.com/devops9527/2045997

<think>好的,我现在需要帮助用户解决如何在CentOS7的KVM虚拟机中将启动模式从传统BIOS切换到UEFI的问题。用户之前已经询问过相关问题,现在需要更详细的步骤。首先,我需要回顾之前的对话和提供的引用资料,确保回答的准确性。首先,用户提供的引用中,引用[2]提到了修改KVM的启动类型为UEFI的方法,包括安装OVMF固件和修改虚拟机的XML配置。这应该是关键步骤。我需要确认CentOS7中安装的软件包是否正确,比如edk2-ovmf,而引用[1]和[2]提到了不同的安装方式,比如通过添加firmware源安装edk2.git-ovmf-x64,但CentOS7默认的源可能没有这个包,可能需要配置额外的仓库,比如EPEL或者第三方源。不过用户之前回答中已经提到安装edk2-ovmf,所以可能需要确认是否存在这个包或者是否需要其他步骤。另外,用户提到的步骤中需要修改虚拟机的XML配置,添加loader部分指向OVMF固件文件。需要注意路径是否正确,CentOS7中的路径可能和引用中的不同,比如/usr/share/edk2/ovmf/OVMF_CODE.fd是否存在。如果安装的是edk2-ovmf,可能路径是这里,而如果通过其他方式安装,可能路径不同。需要确认这一点。还有,用户可能需要先关闭虚拟机再进行配置修改,否则无法保存更改。引用[2]中的例子是使用virsh edit来修改虚拟机配置,但需要确保libvirtd服务正在运行,并且用户有权限进行修改。另外,用户可能需要创建新的虚拟机时指定UEFI启动,或者在现有虚拟机上转换。如果是现有虚拟机,可能需要额外的步骤,比如转换分区表或调整引导方式,这可能比较复杂。用户的问题是如何切换现有虚拟机的启动模式,可能需要修改虚拟机配置,并确保客户操作系统支持UEFI启动,比如分区表是GPT格式,并且安装了对应的引导程序(如GRUB2的EFI版本)。还需要考虑安全启动(Secure Boot)的配置,但用户的问题可能不涉及这一点,除非特别需要。不过引用[2]中提到了可能需要安装OVMF固件,并且配置firmware源,这可能涉及到安装正确的软件包。总结步骤应该是:安装必要的固件包,修改虚拟机的XML配置,添加UEFI的loader部分,然后启动虚拟机,并确保客户系统支持UEFI。如果客户系统之前是BIOS模式,可能需要调整分区和引导,否则可能无法启动,这时候可能需要重新安装系统或进行修复。另外,用户可能需要验证切换是否成功,可以通过检查虚拟机XML中的loader部分,或者在客户系统中使用命令如dmesg| grepEFI来确认。现在需要将这些步骤整理成清晰的指导,避免遗漏关键点,比如软件包安装、配置修改、客户系统的调整等。同时,生成相关问题,如如何验证UEFI是否启用,如何处理分区转换,如何配置安全启动等。</think>### 在CentOS7的KVM虚拟机中将BIOS模式切换为UEFI模式的完整步骤 --- #### 一、安装UEFI固件支持 1. **安装OVMF固件包** CentOS7默认仓库中提供`edk2-ovmf`,执行以下命令安装: ```bash sudo yum install edk2-ovmf ``` 若无法找到包,需添加第三方仓库(如EPEL)[^2]: ```bash sudo yum install epel-release sudo yum update ``` 2. **验证固件文件路径** 确认UEFI固件文件存在: ```bash ls /usr/share/edk2/ovmf/OVMF_CODE.fd ``` --- #### 二、修改虚拟机配置 1. **关闭目标虚拟机** 切换前需停止虚拟机运行: ```bash virsh shutdown <vm-name> ``` 2. **编辑虚拟机XML定义** 使用`virsh edit`命令修改配置: ```bash virsh edit <vm-name> ``` 在`<os>`部分添加UEFI加载器配置: ```xml <os> <type arch='x86_64' machine='pc-q35-2.9'>hvm</type> <loader readonly='yes' type='pflash'>/usr/share/edk2/ovmf/OVMF_CODE.fd</loader> <nvram>/var/lib/libvirt/qemu/nvram/<vm-name>_VARS.fd</nvram> </os> ``` **注意**:若缺少`nvram`文件,需手动创建路径并赋予权限[^2]。 --- #### 三、调整虚拟机磁盘分区 1. **检查磁盘分区格式** UEFI要求磁盘为GPT格式,若原系统使用MBR分区,需转换: ```bash sudo parted /dev/vda print | grep Partition\ Table ``` 若输出为`msdos`(MBR),使用`gdisk`工具转换: ```bash sudo gdisk /dev/vda # 输入`w`保存并退出(会破坏数据!需提前备份) ``` 2. **创建EFI系统分区(ESP)** 添加一个100MB以上的FAT32分区,并标记为`EF00`类型: ```bash sudo parted /dev/vda mkpart ESP fat32 1MiB 101MiB sudo parted /dev/vda set 1 esp on ``` --- #### 四、重建引导加载器 1. **进入虚拟机系统** 启动虚拟机后,挂载ESP分区并安装GRUB2: ```bash mount /dev/vda1 /boot/efi grub2-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub ``` 2. **生成GRUB配置文件** ```bash grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg ``` --- #### 五、验证UEFI模式 1. **检查虚拟机配置** ```bash virsh dumpxml <vm-name> | grep 'loader' ``` 应输出`/usr/share/edk2/ovmf/OVMF_CODE.fd`[^2]。 2. **验证系统启动方式** 在虚拟机内执行: ```bash dmesg | grep -i efi ``` 若显示`EFI vX.XX`版本号,则切换成功[^2]。 --- ### 常见问题处理 - **错误:`No such file or directory`** 检查OVMF固件路径是否正确,或重新安装`edk2-ovmf`包。 - **错误:`Failed to start NVMe`** 将虚拟机XML中的`machine`类型改为`q35`以支持UEFI[^2]。 - **Windows虚拟机蓝屏** 需在切换前注入virtio驱动并启用`Hyper-V`兼容性[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值