我的虚拟机挂了!怎么把镜像里面的数据找回来?

创建了一个虚拟机,不知道为什么挂了,重启也启动不了,VNC也登不上去,强行关机后再也启动不起来了,开机一大堆错误,可是里面还有很重要的数据啊,怎么办,怎么办,谁能救救我!

下面分析几个解救的方法。

方法零:谁让你把重要数据放在系统盘里面了,请使用云盘,也即块存储,虚拟机挂了,盘可以轻松的关联到新的机器上,而且块存储系统如Ceph多是三备份,数据丢不了,下次请牢记。

您肯定会骂我,这次咋办,下面分享真正解救的办法。

1. 方法一:使用qemu的工具Network Block Device

网络块设备是通过NBD Server将虚拟块设备通过TCP/IP export出来,可以远程访问。

NBD Server通常是qemu-nbd

1.1 使用方法一:可以提供unix socket

qemu-nbd -t -k /home/openstack/images/ubuntutest-nbd ubuntutest.img

连接这个unix socket

qemu-system-x86_64 -enable-kvm -name ubuntutest -m 2048 -hda nbd:unix:/home/openstack/images/ubuntutest-nbd -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=n -monitor stdio

1.2 使用方法二:普通的socket连接

qemu-nbd -t -p 1088 ubuntutest.qcow2

qemu-system-x86_64 -enable-kvm -name ubuntutest  -m 2048 -hda nbd:16.158.166.150:1088 -vnc :19 -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=n -monitor stdio

1.3 使用方法三:将镜像 mount到一个network block device

竟然可以这样做,咱们镜像里面的内容有救了。

查看内核是否编译进去NBD

#grep NBD /boot/config-XXXX-generic

CONFIG_BLK_DEV_NBD=m

查看内核模块信息modinfo nbd

查看内核模块是否加载lsmod | grep nbd

如果没有加载modprobe nbd,也可以指定最多的partition: modprobe nbd max_part=16

加载后出现16个NBD

查看哪个nbd device被使用:cat /proc/partitions

将image付给一个network block device

qemu-nbd -c /dev/nbd0 ubuntutest.img

可以看到这个image里面有三个partition

Mount其中一个partition

可以看到里面的文件啦!!!!!

修改结束后

umount ubuntutestnbd0p1

qemu-nbd -d /dev/nbd0

2. 方法二:如果镜像里面是LVM

有LVM的情况相对复杂

qemu-nbd -c /dev/nbd0 centos-5.8.new.qcow2

发现里面有LVM,当然LVM不能作为整体访问,因为里面有Logic volume,都是单独成文件系统的

查看LVM的信息

Import这个volume group

vgimport VolGroup00

将这个volume group设为active

vgchange -ay VolGroup00

Mount其中一个LV

mount /dev/VolGroup00/LogVol00 ubuntutestnbd0p1/

可以拿到这个Logic Volume里面的文件啦!!!!!

修改结束后

umount ubuntutestnbd0p1/

vgchange -an VolGroup00

vgexport VolGroup00

qemu-nbd -d /dev/nbd0

3. 方法三:使用libguestfs

这个工具十分强大,Libguestfs可以在不启动虚拟机的情况下,编辑Image

安装:apt-get install libguestfs-tools

编辑一个Image:

guestfish -a trusty-server-cloudimg-amd64-disk1.img

接着运行run,则一个虚拟机启动了

查看所有的文件系统

list-filesystems

Mount这个文件系统

mount /dev/sda1 /

3.1 libguestfs的架构和原理,知其然知其所以然

  • guestfish -a trusty-server-cloudimg-amd64-disk1.img启动的进程,也即那个交互命令行是main program
  • 运行run的时候,会创建一个child process,在child process中,qemu运行一个称为appliance的小的虚拟机。创建子进程是由guestfs_launch函数完成的
  • 在appliance中,运行了linux kernel和一系列用户空间的工具(LVM, ext2等),以及一个后台进程guestfsd
  • main process中的libguestfs和这个guestfd通过RPC进行交互。
  • 由child process的kernel来操作disk image

libguestfs是一个C的library,你可以写一个C的程序,将这个类库加载进去,调用它的API

文档http://libguestfs.org/guestfs.3.html就描述了这些C的API

而guestfish是一个交互命令行,可以通过执行命令,他来调用C类库的API,帮我们完成操作

文档http://libguestfs.org/guestfish.1.html描述了这些命令,几乎所有的API,都有对应的命令

3.2 Libguestfs appliance的启动过程,更详细的了解它

如果我们想看这个appliance启动的详细过程,则需要export LIBGUESTFS_DEBUG=1

然后运行guestfish -a trusty-server-cloudimg-amd64-disk1.img

然后运行run,打印出很多的东西

(1) 启动guestfish

(2) 运行supermin

(3) 选择kernel

(4) 选择initrd, root images, 创建appliance

(5) 检测qemu

(6) 启动qemu appliance

(7)启动initrd

(8) load kernel modules

(9) mount sda, sdb

(10) 将sdb作为root device

(11) 运行init

(12) 启动guestfsd

(13) 开通一个端口,C类库会通过RPC连接这个端口

3.3 Guestfish的有很多的命令

  • 添加一个drive

这个命令只有在run之前起作用

对应的API是guestfs_add_drive_opts

add-drive filename [readonly:true|false] [format:..] [iface:..] [name:..] [label:..] [protocol:..] [server:..]

guestfish -a trusty-server-cloudimg-amd64-disk1.img,这个Image是第一个drive

add-drive /home/openstack/images/ubuntutest.img format:qcow2,添加一个drive

运行run

查看所有的device: list-devices

查看所有的分区: list-partitions

查看所有的文件系统: list-filesystems

  • Mount文件系统

对应的API是guestfs_mount

mount /dev/sda1 /

文件系统操作

ls /

mkdir /mnt/sdb

mount /dev/sdb1 /mnt/sdb

ls /mnt/sdb

ls /mnt/sdb/home/openstack

cat /mnt/sdb/home/openstack/.bash_history

更多文件系统命令chown,chmod,cp等都支持

  • 对partition的操作

part-list /dev/sdb

part-get-bootable /dev/sdb 1

有个partition的命令包括:

part-add,part-del,part-disk,part-get-bootable,part-get-gpt-type,part-get-mbr-id,part-get-name,part-get-parttype,part-init,part-list,part-set-bootable,part-set-gpt-type,part-set-mbr-id,part-set-name,part-to-dev,part-to-partnum

  • 对LVM的操作,哈哈不用害怕LVM了,也不用复杂做这么多操作

guestfish -a trusty-server-cloudimg-amd64-disk1.img

add-drive ./centos-5.8.new.qcow2 format:qcow2

run

查看所有的PV: pvs-full

查看所有的VG: vgs-full

命令包含:lvcreate, lvcreate-free, lvm-canonical-lv-name, lvm-clear-filter, lvm-remove-all, lvm-set-filter, lvremove, lvrename, lvresize, lvresize-free, lvs, lvs-full, lvuuid, pvcreate, pvremove, pvresize, pvresize-size, pvs, pvs-full, pvuuid, vg-activate, vg-activate-all, vgchange-uuid, vgchange-uuid-all, vgcreate, vglvuuids, vgmeta, vgpvuuids, vgremove, vgrename, vgs, vgs-full, vgscan, vguuid

  • 下载和上传文件,直接文件就能拷贝出来

guestfish -a ubuntutest.img

run

list-filesystems

mount /dev/sda1 /

download /home/openstack/.bash_history testdownload

upload instance01.xml /home/openstack/testupload

3.4 在Libvirt里面,Virt也提供了相应命令系列

一个命令完成操作,无需启动交互命令行

  • Guestmount

创建一个本地文件夹

mkdir testguestmount

将image里面的/dev/sda1 mount到这个文件夹里面

guestmount -a ubuntutest.img -m /dev/sda1 testguestmount

结束编辑后

guestunmount testguestmount

  • virt-builder

可以快速的创建虚拟机镜像

update-guestfs-appliance

查看所有的镜像类型

virt-builder –list

创建一个Image

virt-builder fedora-20 -o myfedora.img --format qcow2 --size 20G

设置root password, 放在文件里面

virt-builder fedora-20 --root-password file:/tmp/rootpw

设置hostname

virt-builder fedora-20 --hostname virt.example.com

安装软件

virt-builder fedora-20 –install “apache2“

第一次启动运行脚本

virt-builder fedora-20 --firstboot /tmp/yum-update.sh

virt-ls -a myfedora.img /root/

virt-cat -a myfedora.img /root/.bash_profile

virt-copy-in -a myfedora.img desktop.xml /root/

virt-copy-out -a myfedora.img /root/.bash_profile ./

virt-df -a myfedora.img

virt-list-filesystems -a myfedora.img

virt-list-partitions myfedora.img

欢迎关注微信公众号

原文地址:https://www.cnblogs.com/popsuper1982/p/8537119.html

时间: 2024-10-18 16:53:06

我的虚拟机挂了!怎么把镜像里面的数据找回来?的相关文章

xen 虚拟机挂了,宿主机假死的问题追终,全思路

出问题主机工作环境用的是xenserver6.5集群,有一天上去突然发现一台vm连不上了,想着那就上去xenserver重启虚拟机,结果强制重启不能成功,就上去宿主机查询磁盘空间 [[email protected] cron.d]# df -h Filesystem            Size  Used Avail Use% Mounted on /dev/sda1              20G  20G   0  100% / none                  7.8G 

配置VirtualBox虚拟机实现Ubuntu与Windows系统间数据交换即Putty的访问

一.直接修改Ubuntu IP系统配置文件 Ubuntu IP的网络配置文件是:/etc/network/interfaces打开后里面可设置DHCP或手动设置静态Static IP.前面auto eth0,让网卡开机自动挂载,以下操作针对有线网络在Ubuntu中实现两个网卡.               1.以DHCP方式配置网卡(推荐) (1)打开要编辑的文件interfaces 它的的目录是/etc/network/interfaces                          

虚拟机创建过程中镜像格式的的变化过程

这里通过OpenStack的horizon组件来创建一个m1.small的virtual machine,来详细分析下镜像格式的变化以及glance底层具体执行的哪些操作. (1)首先看一下Glance管理的镜像,如果采用local storage,glance将镜像文件默认存储到/var/lib/glance/image目录下,这里我们选择c036d689-0336-4fcd-a8e0-4aed4dd5e420这个镜像来作为创建虚拟机的模板,此镜像是通过如下命令添加的,因此在horizon中显

学习之初,约定,认识Linux,创建虚拟机,安装CentOS7镜像

时间:2018年1月22日1.1 学习之初1.2 约定1.3 认识Linux1.4 安装虚拟机1.5 安装centos7 1.1学习之初与1.2约定课程笔记 1.3认识Linux系统一.究竟什么是Linux?Linux就是一个操作系统,类似于电脑的微软windows以及苹果电脑的IOS系统,手机系统具体也分为安卓和苹果IOS,其实安卓手机系统就是linux,苹果IOS手机系统是Unix,很多一线互联网大公司的服务器的操作系统都是linux(百度,阿里,腾讯等). 二.Linux的起源linux的

Docker Toolbox虚拟机文件地址修改 以及镜像加速

Docker Toolbox虚拟机文件地址修改  默认情况下,docker-machine创建的虚拟机文件,是保存在C盘的C:\Users\用户名\.docker\machine\machines\default 目录下的,如果下载和使用的镜像过多,那么必然导致该文件夹膨胀过大,如果C盘比较吃紧,那么我们就得考虑把该虚拟机移到另一个盘上.具体操作如下 powershell输入docker-machine stop default 停止虚拟机 打开VirtualBox,选择"管理"菜单下

最新虚拟机SAP ECC6.0 EHP7带示例数据IDES版+BW740

学习SAP,请联系QQ:858-048-581 版本:ECC6.0 EHP7.虚拟机操作系统:windows server 2008 64bit..数据库:SQL2008 R2.系统已经做过编译,运行的速度比较快.系统默认000\001\066\800\810\811\812七个客户端可登陆,账号密码都已经配备好,可直接使用,权限最大. 系统已经带有示例的数据,并且可以做新建程序及接口等开发作业,程序激活等都没有问题 对硬件的要求:内存>=4G  ,如果低于这个内存可能启动及运行速度会慢点.硬盘

《Java虚拟机规范》阅读笔记-运行时数据区

Java虚拟机运行时数据区包括PC寄存器.Java虚拟机栈.Java堆.方法区.本地方法栈.运行时常量池六个部分. 1. PC寄存器 PC寄存器(又叫程序计数器,Program Counter Register),每一条Java虚拟机线程都有自己的PC寄存器.PC寄存器报错当前正在执行方法的字节码指令地址:如果当前方法是native的,则PC寄存器的值为undefined. 2. Java虚拟机栈 Java虚拟机栈(Java Virtual Machine Stack),每一条Java虚拟机线程

IT忍者神龟之 《Java虚拟机原理图解》JVM运行时数据区

[last updated :2014/11/7]      JVM运行时数据区(JVM Runtime Area)其实就是指JVM在运行期间,其对计算机内存空间的划分和分配.本文将通过以下几个话题来讨论JVM运行时数据区. Topic 1. JVM运行时数据区里有什么? Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么? Topic 3.栈帧是什么?栈帧里有什么? Topic 4. 方法区是什么?方法区里有什么? Topic 1.JVM运行时数据区里有什么? Topic 2. 虚拟机栈是什

Linux修改docker镜像和容器数据存储位置

指定镜像和容器存放路径的参数是--graph=/var/lib/docker,其默认存储位置为/var/lib/docker, Docker 的配置文件可以设置大部分的后台进程参数,在各个操作系统中的存放位置不一致, 1. 在 Ubuntu 中的位置是:/etc/default/docker, OPTIONS=--graph="/root/data/docker" -H fd://# 或者DOCKER_OPTS="-g /root/data/docker" 最后重新