VirtualBox:使用LVM快照创建运行虚拟机的备份和克隆(无停机)
如果您为VirtualBox VM使用LVM卷(如在VirtualBox VM中使用RAW设备的教程中所示),您可以创建正在运行的VM的备份和克隆,而不关闭它。 本教程仅显示:使用LVM快照创建运行VirtualBox VM的备份和克隆,而不会停机。
我不会保证这将为您工作!
1初步说明
因为我在无头服务器上安装了VirtualBox,所以我在这里使用phpvirtualbox作为VirtualBox GUI。 如果您使用原始的VirtualBox GUI,这是非常好的。
我运行的虚拟机(其中我要备份)被命名为vm10
,它位于LVM卷/ dev / vg0 / vm10上
。
确保您以root身份登录(输入
sudo su
成为root),因为我们必须以root用户身份运行本教程中的所有步骤。
2使用LVM快照创建运行的虚拟机的备份
要创建运行的虚拟机vm10
的备份,我首先创建名为vm10_snap
的/ dev / vg0 / vm10
的LVM快照。 快照可以小于原始卷 - 512MB可能就够了,但是我在这里使用的大小为5GB:
lvcreate -L5G -s -n vm10_snap /dev/vg0/vm10
接下来,我使用dd
从快照中读取内容并将其管道到gzip,以在目录/备份
中创建一个gzip压缩的备份映像(当然可以使用任何其他目录):
dd if=/dev/vg0/vm10_snap bs=64k | gzip -c > /backup/vm10.img.gz
就是这样 - 你的vm10
的备份现在位于/backup/vm10.img.gz
。
现在删除LVM快照:
lvremove -f /dev/vg0/vm10_snap
3从备份恢复备份/克隆
恢复和克隆本质上是一样的,所以我将展示如何从刚刚创建的备份中创建一个名为vm11
的克隆。
首先创建与原始LVM卷相同大小的LVM卷(在本例中为20GB):
lvcreate -L20G -n vm11 vg0
将vm10
的备份还原到新的逻辑卷/ dev / vg0 / vm11
:
gunzip -c /backup/vm10.img.gz | dd of=/dev/vg0/vm11 bs=64k
接下来为/ dev / vg0 / vm11
(例如vm11.vmdk
)创建一个.vmdk
文件,以便我们可以在VirtualBox中使用它。 最好在运行VirtualBox的用户的主目录中创建它(例如,如果您使用phpvirtualbox,则为/ home / vbox
) - 该文件也必须由该用户拥有:
cd /home/vbox
VBoxManage internalcommands createrawvmdk -filename vm11.vmdk -rawdisk /dev/vg0/vm11
chown vbox:vbox vm11.vmdk
接下来去你的VirtualBox GUI(原来的VirtulBox GUI或phpvirtualbox),然后点击New
:
单击创建新虚拟机
向导中的下一步>>
:
指定新VM的名称,并选择与原始VM使用的操作系统和版本相同的操作系统和版本:
指定克隆的内存:
在虚拟硬盘
屏幕上,选择使用现有硬盘
,然后单击选择虚拟硬盘文件
图标:
选择vm11.vmdk
文件,然后单击确定
:
点击下一步>>
:
点击创建
:
在我们启动克隆之前,您可能需要调整某些设置,例如,如果原始VM使用桥接,则可能需要为网络配置中的克隆选择桥接:
现在点击开始
启动克隆:
在引导过程中,您可能会注意到网络配置挂起:
这是因为VirtualBox为接口eth0
分配了不同的MAC地址,但克隆的/etc/udev/rules.d/70-persistent-net.rules
文件仍然使用原始的MAC地址。 启动完成后,登录到克隆并运行...
ifconfig
...你会看到eth0
缺少(因为MAC地址问题),这意味着克隆不能使用网络:
要解决此问题,请在克隆中打开/etc/udev/rules.d/70-persistent-net.rules
...
vi /etc/udev/rules.d/70-persistent-net.rules
...并注释掉eth0
(以及在启动期间添加的eth1
行,因为eth0
的MAC地址错误)行。 这样可以确保在下一次引导过程中,系统会添加一个新的具有正确MAC地址的eth0
行。
现在重新启动克隆。 重新启动后,它的网络应该工作,你应该在输出中看到eth0
ifconfig
恭喜,您已成功克隆VM而不关闭原始VM。
4链接
- VirtualBox: http : //www.virtualbox.org/
- phpvirtualbox: http : //code.google.com/p/phpvirtualbox/