是否存在现有的系统可以有效地跟踪虚拟磁盘映像的版本历史?
本质上,我有一个磁盘映像,用作测试程序的“模板”根文件系统。我偶尔需要对其进行更改(例如安装软件包),但大多数时候它是只读的。我需要能够保留更改的完整历史记录(主要是为了在出现问题时可以回滚,但我可能还需要按日期和时间查找较旧的修订版本,以便重现较早的测试。)
我希望历史记录以某种增量格式存储,因为大多数时候我所做的更改都非常小(而完整的磁盘映像非常大)。
我希望每个修订版本都存储在单独的文件中,以便于使用 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 会延迟,直到快照完成。