虚拟磁盘映像的版本控制

虚拟磁盘映像的版本控制

是否存在现有的系统可以有效地跟踪虚拟磁盘映像的版本历史?

本质上,我有一个磁盘映像,用作测试程序的“模板”根文件系统。我偶尔需要对其进行更改(例如安装软件包),但大多数时候它是只读的。我需要能够保留更改的完整历史记录(主要是为了在出现问题时可以回滚,但我可能还需要按日期和时间查找较旧的修订版本,以便重现较早的测试。)

我希望历史记录以某种增量格式存储,因为大多数时候我所做的更改都非常小(而完整的磁盘映像非常大)。

我希望每个修订版本都存储在单独的文件中,以便于使用 rsync 进行备份。

我希望能够轻松删除不再需要的旧版本。

如果最新的修订版本存储为接近平面文件的形式,我会喜欢它,即读取性能应该是 O(1),而与有多少旧修订版本无关。

哦,虚拟机需要能够安全地使用当我进行修改时,我会更新磁盘映像(以只读方式);“提交”必须是一个原子操作。

(显然我预计这些标准之间会存在一些权衡;我只是想说明我在寻找什么。)

实际“版本控制”操作的性能相对不重要;另一方面,正确性和稳定性至关重要。

我目前正在使用带有 qcow2 磁盘映像的 kvm / qemu,但我有兴趣了解其他选项。

我可以了解如何自己编写这样的版本控制系统,使用 qemu-img 和备份文件并进行变基,但是否有任何现有的工具可以用于此目的?

答案1

这听起来像流浪汉https://www.vagrantup.com/)可能很符合您的需求。 Vagrant 可与多种 VM 引擎配合使用(例如 virtualbox、vmware、查看上面的链接)。

其优点包括:

  • 与 VCS 系统兼容(单个文本文件)
  • 跨平台——windows、linux、mac
  • 可轻松与任何地方的任何人分享
  • 提供一致的测试环境

开始吧

第一的安装 vagrant还有比如说,virtualbox。

然后,您可以在一个 VagrantFile 中描述您的虚拟机,您可以使用以下命令生成该文件:

vagrant init ubuntu/trusty64 [1]

然后,您将获得一个适用于您首选操作系统的描述符文件。如果您愿意,可以在 VagrantFile 中编辑一些 IP 地址、端口、包和共享文件夹。

完成后运行:

vagrant up

并且您有一个可以使用以下命令登录的虚拟机:

vagrant ssh

定制

如果这还不够的话并且您有超出 vagrant 功能的非常具体的要求,有很多 vagrant VM 预先配置了配置管理系统,例如 cfengine、chef、puppet 或任何您喜欢的。

[1] 有很多预先配置好的 vagrant vm,看看 (https://vagrantcloud.com/discover/featured)。

答案2

如果你只运行 amd64 linux 镜像,并且更喜欢使用容器而不是完全虚拟化,那么 Docker 或许是不错的选择。http://docker.io) 将是一个可能的选择。

答案3

看一下这个:

Virtualbox:多连接磁盘
http://virtbjorn.blogspot.co.uk/2012/12/virtualbox-multi-attach-disk.html

当您将主磁盘分配给虚拟机时,虚拟机会创建一个差异磁盘,所有写入都存放在该磁盘上。主磁盘将用于读取差异磁盘上未被覆盖的内容。随着时间的推移,差异磁盘(每个虚拟机的本地磁盘)将增大,大量原始文件将被更新覆盖。这不是必需的,这个概念与节省磁盘空间无关。

查看链接了解更多信息。

答案4

这可能取决于虚拟机映像的存储方式,但使用 qcow2 似乎将它们作为文件系统上的文件。使用 OCFS2 集群文件系统时,您可以使用reflink快照“复制”映像的任何状态。

主要优点是,此类快照将执行 COW(写时复制),因此初始快照占用“零”(即仅几个块)空间;只有当一个块发生变化时,才会分配一个新块并与原始图像“取消共享”。

然而缺点是:

  • 在写入快照映像时,底层文件系统所需的空间会增加。在极端情况下,共享块将为零,而映像需要的空间将是原来的两倍。

  • 如果原始映像完全没有碎片,则在创建快照并写入映像后,它将碎片化。这是由于 COW 造成的,必须分配映像“外部”的新块,并且无法预测下一个要写入的块是什么。当使用纯 SSD 磁盘系统时,这可能不是问题,但对于旋转磁盘,这可能会对性能产生负面影响。

  • 在制作快照时(甚至在删除快照时),图像的 I/O 将会延迟。

因此,当“恢复”到快照时,您可以删除坏映像,然后reflink将其从所需快照中再次删除。这非常快。然后,新映像将再次以 100% 共享块开始。或者,您可以制作快照的普通副本,这样您就没有共享块,但它需要更多空间(自然),并且制作副本需要更长的时间。

由于我实际上正在使用它来制作自动定期快照(例如每小时、每天、每周、每年),我知道(对于通过光纤通道连接的基于 SSD 的 SAN 存储)制作快照通常需要不到三秒钟的时间,但有时也需要大约 30 秒的时间。在拍摄快照时,虚拟机的 I/O 会延迟,直到快照完成。

相关内容