转载请注明作者(think8848)和本文链接http://think8848.cnblogs.com
挂载oVirt虚拟机磁盘
目标: oVirt Engine
挂了后虚拟机无法启动,在其他Linux系统中挂载虚拟机磁盘找回数据。
此文目的是记录找回数据的过程,使用的方法不一定是最佳方案,欢迎有更好方法的大神提供最优方案
1. 准备工作
1.1 安装用于找回数据的Linux系统,我使用的是Ubuntu 22.04.3
, 在安装过程中磁盘不采用lvm格式;此系统的磁盘一定要大,最好有接近要找回磁盘文件2
倍大的剩余空间。
1.2 在oVert Node
中找到磁盘文件,通常位于oVirt Node
数据存储目录下的images
目录中,例: /data/hdd1/230845d7-1164-4e44-8d98-a77ccfcd6fc8/images
。
为了能够在Engine挂了后还能找到对应的磁盘文件,强烈建议在创建虚拟机磁盘时填写磁盘的备注信息,否则可能无法确定哪个磁盘是您所需要找回的目标。
1.3 将磁盘文件复制到新安装的Ubuntu
系统中。如果磁盘文件过大,或者在复制期间要关闭terminal
工具(WiFi不稳定,下班要回家等等情况),建议使用后台复制,命令如下:
nohup scp -r xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx root@xxx.xxx.xxx.xxx:/root > nohup.out 2>&1
在复制的过程中可以使用bg
命令查看复制是否正在进行。
如果磁盘过大,转输的网速又不够快,建议在传输磁盘文件之前先行压缩,推荐使用pigz
进行多线程压缩/解压。
nohup tar --use-compress-program="pigz -p 70" -xvpf file.tar.gz &
上面示例中的-p 70
参数意为使用70个线程进行解压,如果不指定-p
参数则默认使用8
个线程进行解压(经测试,在压缩时确实可以跑满70个线程,但是解压时貌似指定了70个线程,但实际上还是使用8个线程,不过确实比直接使用tar
快很多)
强烈建议在oVirt Engine上创建虚拟机时按需分配虚拟机磁盘空间,否则在找回磁盘文件将消耗大量的磁盘空间和时间
2. 查看并处理Raw文件
2.1 为了方便操作文件,可将xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
形式的文件名修改为raw
。
mv xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx raw
2.2 查看raw
文件分区情况
fdisk -l raw
2.3 将raw
格式文件(注意:此处的文件名正好也是raw
)转换为qcow2
格式文件
# 安装qemu-utils工具
apt install -y qemu-utils
# 将raw格式文件转换为qcow2格式文件
nohup qemu-img convert -O qcow2 raw newfile.qcow2 &
以上的文件操作在采用了SSD固态硬盘的情况下耗时数小时(我要挂载的虚拟机磁盘为2.5T),如果换作机械硬盘估计至少需要24小时以上。
3. 挂载qcow2
格式磁盘
3.1 安装libguestfs-tools
虚拟机磁盘管理工具
apt install libguestfs-tools -y
3.2 查看qcow2
格式磁盘中的磁盘分区情况
virt-filesystems -a newfile.qcow2
3.3 挂载磁盘
guestmount -a newfile.qcow2 -m /dev/ubuntu-vg/ubuntu-lv /mnt
如果不出意外,进入/mnt
目录就可以看到虚拟机磁盘中的数据了!
4. 其他需要说明的情况
4.1 本方法适用于在创建虚拟机时使用lvm
逻辑卷的情况。使用lvm逻辑卷的好处很多,但是在挂载磁盘数据时会导致出现mount: unknown filesystem type 'LVM2_member'
的情况。针对这个情况本文提供了解决方案。
4.2 如果在创建虚拟机时不使用lvm
,而是使用了ext4
磁盘格式,那么可以使用本文的方法,直接挂载ext4
分区。
从某些层面而言,如果您大概率确定虚拟机的磁盘在将来使用时不需要扩容或者缩容,那么直接在创建虚拟机的时候就采用ext4
格式,将来一旦出现oVirt Engine
故障时,您可以快速高效的把文件抢救出来:)