当前位置:   article > 正文

pve(proxmox)宿主机奔溃无法进入系统,lxc容器和虚拟机迁移,无备份,硬盘未损坏,记录数据找回过程及思考_pve debug修复系统

pve debug修复系统

pve的主机突然CPU满载,然后远程断电后pve就无法启动了,之前一直上面的虚拟机和容器也没有备份,折腾了两天总算找回来了记录一下处理过程和思路,方便后续查找。

一、隐患分析

1.周四突然手欠,由于之前家里的pve主机老给我发邮件,提示我硬盘有问题,但可以正常使用,我从网上找了半天也没有好的关闭方案,随后我就看看smart这个硬盘检测服务关闭能不能生效

  1. 硬盘smart检查服务关闭
  2. systemctl disable smartmontools
  3. systemctl enable smartmontools
  4. systemctl stop smartmontools

2.看到pve有个ceph从来没用过(不知道干啥的),于是手欠尝试了一下,安装完成后,连接地址配置到了pve本机,但好像没啥用。

3.我的pve主机i3-2120 16g内存小马拉大车,硬盘一个ssd+一个hdd,混合存储,删除了local-lvm卷都合并到local下

二、问题解决之路

我本人对Linux的了解,只是会用一点儿命令,然后知道Linux万物皆文件。

主要参考文档Proxmox VE 中文手册 v7.3 — Promxox VE 中文文档 7.1 文档

1.pve开机直接进入initramfs 模式,比较高级我也不懂,我只知道

参考这篇文章http://www.zztongyun.com/article/pve%E5%90%AF%E5%8A%A8%E5%8D%A1%E5%9C%A8loading

  1. blkid //查看硬盘信息,你只要查出硬盘格式为type=ext4 的分区
  2. fsck -t ext4 /dev/sdb2 -y
  3. 用这个命令修复了几次还是报错

但至少硬盘没坏,后来我也把硬盘拆下来,放连到另一台Linux电脑上试了一下(本以为都是Linux可能可以直接打开),结果提示让格式化,应该是pve的文件系统在deepin上不识别。

然后也尝试了用pve的安装镜像进debug模式折腾半天也没啥用。

2.重装系统打算用pve来识别自己原来的系统盘

重装完成后用,插上原来的两个硬盘数据盘,了解了pve有vg,lv,lvm等概念

vgdisplay查看 默认的vg名称都叫pve所以系统识别时会有重名的风险

 用 命令

  1. vgrename OFZVRn-M7NP-nomv-ooqg-XCwZ-8cSx-Wenkck vg
  2. # vg的ID是不重复的 vgrename vgid vg新名称

把旧存储的vg名称改成其他名字防止冲突,此时有报了另一个错,而且再改回去这个错也还在,可能时系统报错的真正原因但是不知道怎么处理。

此时在pve的页面上是可以看到这两个硬盘的,但是从挂载需要先格式化硬盘,于是查一下pve挂载原数据盘

 参考这篇文章Proxmox VE重装后,如何无损挂载原有的数据盘? - 知乎

挂载了半天我的 /dev/sdb3 因为报错挂不上去,后来想到可能是我的两个硬盘做了融合,不能在再单独挂载于是查了一下,有人提了lvm这个存储的挂载

先用lvdisplay 看一下情况,发现旧的路径是 dev/vgname/swap 和  dev/vgname/root

 此时挂载应该挂载 lv的路径 

  1. mkdir /mnt/vgold #创建挂载点
  2. mount /dev/vg/root /mnt/vgold

此时可以看到原来整个系统的目录和文件都在 

3.系统的虚拟机和容器恢复

需要先找到原来的镜像存在哪里了

参考佛西博客 - Proxmox VE磁盘/目录详解,并且安装第二个硬盘,修改ISO/虚拟机存放位置。

参考佛西博客 - PVE的local和local-lvm 

可以看到 local-lvm删除后的虚拟机等数据是存在 /var/lib/vz下 

3.1 pve中虚拟机的恢复:按照官网的做法可以创建一个虚拟机将raw文件或者qcow2文件挂载上去

以的100虚拟机ikuai为例

  1. qm create 100 --memory 2048 --net0 virtio,bridge=vmbr0
  2. qm importdisk 100 /mnt/vgold/var/lib/vz/images/100/vm-100-disk-0.raw local --format=raw
  3. qm importdisk 100 /mnt/vgold/var/lib/vz/images/100/vm-100-disk-0.qcow2 local --format=qcow2
  4. #查看对应文件夹 有哪个文件就用哪个 local 是你新存储文件的位置 我之前删掉了local-lvm

 等待成功

页面查看并启动验证

出现未使用硬盘

编辑一下,保持默认,并保存

 选项中修改:引导顺序

启动测试正常

 3.2 pve中备份文件的恢复 

查看 ls /mnt/vgold/var/lib/vz/dump/ 的备份,lxc为容器,qemu为虚拟机

备份恢复

  1. qmrestore help 查看帮助
  2. -storage local-lvm 配置新的虚拟机的存储位置
  3. -unique true 配置是否生成新网卡
  4. # 虚拟机恢复 102为新机器编号
  5. qmrestore vzdump-qemu-102-2023_07_06-10_42_50.vma.zst 102
  6. #容器恢复 103为新容器编号
  7. pct restore 103 vzdump-lxc-103-2023_07_27-11_05_34.tar.zst

3.3 无备份容器恢复,我的大多数服务都是直接使用pve的容器创建,且无备份,使用虚拟挂载硬盘的方式无法恢复,于是想到直接把容器的镜像拷贝的新的pve目录下,发现并没有直接识别

查看全局搜了一下新增的容器增加了那些文件 发现在/var/lib下和vz同级有一个lxc的目录

发现这里也有lxc的配置, 从旧硬盘拷贝对应文件到 /var/lib/lxc/104 目录

  1. 拷贝容器配置
  2. cp -r /mnt/vgold/var/lib/lxc/110 /var/lib/lxc/
  3. root@pve:/var/lib/lxc# ls /var/lib/lxc/ #确认多了目录
  4. 103 104 110
  5. 拷贝镜像
  6. cp -r /mnt/vgold/var/lib/vz/images/110 /var/lib/vz/images/

 本以为这就可以启动了,pct start 110,发现少一个配置文件

找了一下新主机别的已有容器的配置文件,在/etc/pve/nodes/pve/lxc 这个目录下,然后去旧目录找居然没找到配置

查看新机器上的配置,发现并不复杂,自己复制写一份

 代码如下

  1. root@pve:/etc/pve/nodes/pve/lxc# cat 110.conf
  2. arch: amd64
  3. cores: 2
  4. hostname: devops-vm4
  5. memory: 8192
  6. net0: name=eth0,bridge=vmbr0,firewall=1,gw=192.168.3.1,hwaddr=4E:70:6A:70:B6:EB,ip=192.168.3.112/24,type=veth
  7. onboot: 1
  8. ostype: centos
  9. rootfs: local:110/vm-110-disk-0.raw,size=40G
  10. swap: 8192
  11. lxc.apparmor.profile: unconfined
  12. lxc.cgroup.devices.allow: a
  13. lxc.cap.drop:
  14. lxc.cgroup2.devices.allow: c 10:200 rwm
  15. lxc.mount.entry: /dev/net dev/net none bind,create=dir

主要修改 raw文件的位置和名称 最好和镜像一致 ,此处文件内容根据自己的实际情况修改

查看界面发现多了一个110容器,修改网卡配置因为配置是拷贝其他机器的,所以网卡的hwaddr会重复,重新添加网卡测试一下,

 验证一下镜像是否正常,之前的docker服务启动都正常

4. 按照容器备份思路应该可以对未备份虚拟机进行恢复, 配置在

/etc/pve/nodes/pve/qemu-server 目录下,看了一下还是用3.1的步骤比较简单,防止某些虚拟ID重复。

支持pve数据恢复思路整理完成,教训就是虚拟机有自己的便捷性,但还是做好备份最重要。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/130356
推荐阅读
  

闽ICP备14008679号