如何导出Vagrant虚拟机以便进行转移

118

我有一个已配置好 LAMP 技术栈的 Vagrant 虚拟机正在运行中。我需要将其转移到另一台电脑。如何导出它? 我猜我可以得到一个文件(或多个文件),可以将其复制到另一台电脑,然后在那里运行一些命令以导入 Vagrant 虚拟机。


1
我编写了一些脚本来自动化传输Vagrant虚拟机。请参见soniah/transfer_vagrant_boxes - Sonia Hamilton
//,有人尝试过Sonia的脚本吗? - Nathan Basanese
据我所知,这些脚本有助于传输基础盒子,而不是生成的运行虚拟机,因为它们使用vagrant box repackage(请参阅其文档)。 - Olivier Berger
可能是重复的问题,参考有没有办法克隆已经安装好的 Vagrant Box - tanaydin
9个回答

132

你有两种方法可以做到这一点,我将其称为肮脏方式清洁方式:

1. 肮脏的方式

使用vagrant package命令从当前的虚拟环境创建一个盒子:

http://docs.vagrantup.com/v2/cli/package.html

然后将盒子复制到另一台计算机上,使用vagrant box add添加它,并像往常一样使用vagrant up运行。

请记住,当虚拟机启动时,工作目录中的文件(带有Vagrantfile的目录)是共享的,因此您还需要将其复制到其他计算机上。

2. 清洁的方式

理论上来说,使用Vagrant不应该需要导出/导入。如果您有预见性地使用配置虚拟环境的自动化工具(如chef、puppet、ansible)和版本控制系统(如git)来管理您的工作目录,那么在这一点上复制一个环境将变得非常简单,只需运行:

git clone <your_repo>
vagrant up

5
试图成为一个“干净”、有远见的管理员……你不需要在你的git库中放置操作系统安装iso文件,是吗?你是否建议,例如使用ansible,在你的git库中包含Vagrantfile和一个ansible playbook。Vagrantfile将会1.从vagrantcloud下载一个basebox 2.使用其他文件/库/云存储运行ansible playbook以提供/配置basebox。对吗?或者在git库中还有其他内容? - hobs
10
“清洁的方式”是否考虑了可能位于虚拟机内部的数据库(如mySQL、Wordpress)?那么如何将其同步到其他电脑上? - kevllar
2
@kevllar 清洁的方式意味着在启动新的开发环境时,不需要git存储库之外的任何信息。这意味着安装和配置数据库将在通过Chef/Puppet/what-have-you提供新vagrant box时完成。 - Hovis Biddle
3
Hashicorp 推荐的方法也是“不规范”的吗?即打包并上传到 Atlas 服务器上?我不确定“规范”的方式是否能够完全复制确切的环境,这正是 Vagrant 的整个目的所在。 - sijpkes
1
我不明白为什么官方的方式被认为是肮脏的。有没有好心人能解释一下为什么? - thclpr
显示剩余9条评论

32

我的Mac电脑中的硬盘在进行项目时发出嘟嘟声,所以我决定安装SSD。我需要将项目从一个磁盘移动到另一个磁盘。需要考虑几个问题:

  • 我是在Mac上使用vagrant和virtualbox
  • 我正在使用git

这是对我有效的方法:

1.) Copy your ~/.vagrant.d directory to your new machine.
2.) Copy your ~/VirtualBox\ VMs directory to your new machine. 
3.) In VirtualBox add the machines one by one using **Machine** >> **Add**
4.) Run `vagrant box list` to see if vagrant acknowledges your machines. 
5.) `git clone my_project`
6.) `vagrant up`

我在使用VB的客户端附加组件时遇到了几个问题。

输入图像描述

我通过这个解决方案修复了它们。


// 我打算试一下,@KJPrince。感谢您为我们分解它。 - Nathan Basanese
// 我尝试过了,但是当我将VirtualBoxVMs目录复制到~/VirtualBox\ VMs并运行vagrant box list时,我在以下链接中遇到了错误:http://0bin.net/paste/iCiaqNhU-i3bbfY2#-KDiXYcRFni1RNgNJhOBrIs/Kb0w890ol0mn0sGyltc - Nathan Basanese

26

这其实相当简单

  1. 在远程机器上安装VirtualBoxVagrant
  2. 封装你的Vagrant虚拟机

    vagrant package --base [虚拟机名称,与VirtualBox中显示的名称一致] --output /Users/myuser/Documents/Workspace/my.box

  3. 将.box文件复制到远程机器

  4. 在远程机器上运行以下命令初始化.box文件

    vagrant init [虚拟机名称,与VirtualBox中显示的名称一致] /Users/myuser/Documents/Workspace/my.box

  5. 运行 vagrant up


2
如果您的计算机名称很长,而且您懒得查看Virtualbox GUI并键入其名称或ID,则可以使用此终端命令列出所有VM的名称和ID:VBoxManage list vms。之后,您只需复制并执行@Phil第2步和第4步中所述的操作即可。 :) 是的。 - Sid
@Sid 为什么不直接使用 $ vagrant box list 呢? - Ken Ratanachai S.
1
@KenRatanachaiS 因为你的命令列出了盒子,例如:(scotch/box (virtualbox, 3.0))。我的命令是使用标识符的虚拟机,例如:"Win10 - SandBox" {bc251c06-501f-4c0f-bgfa-21f2815ba2cd}。 - Sid

6
最简单的方法是将Vagrant box打包,然后将其复制(例如scprsync)到另一台计算机上,在该计算机上添加并执行vagrant up即可。更详细的步骤请查看=>如何克隆已安装的Vagrant box?

3

以上答案都不适用于我。我已经花了两天时间研究如何将一个 Vagrant + VirtualBox 虚拟机从一台电脑迁移到另一台电脑...... 这是有可能的!

首先,您需要了解虚拟机与您的同步/共享文件夹是分开的。因此,当您打包虚拟机时,您是不带有文件,但是带有数据库。

您需要做的事情:

1- 打开计算机 1 主机 CMD (命令行。使用正确按钮将其作为管理员打开 ->“以管理员身份运行”),然后转到您的 vagrant 安装文件夹。在我的情况下:C:/VVV 您将看到您的 Vagrantfile 和这些文件夹:

/config/
/database/
/log/
/provision/
/www/
Vagrantfile
...

/www/文件夹是我存放开发域的同步文件夹。您可能将同步文件夹放在其他位置,但一定要确保了解自己在做什么。此外/config和/database也是同步文件夹。

2- 运行以下命令:vagrant package --vagrantfile Vagrantfile

(此命令使用您的Vagrantfile配置打包虚拟机。)

以下是有关该命令的Vagrant文档中的描述:

一个常见的误解是--vagrantfile选项将打包一个 在使用此框时与vagrant init一起使用的Vagrantfile。这 不是这种情况。相反,当使用该框时,Vagrantfile会被加载和读取为 Vagrant加载过程的一部分。有关更多信息, 请阅读有关Vagrantfile加载顺序的说明。

https://www.vagrantup.com/docs/cli/package.html

完成后,您将拥有一个package.box文件。

3- 复制所有这些文件(/config、/database、Vagrantfile、package.box等),并将它们粘贴到您想要安装虚拟机的计算机2上(在我的情况下是D:/VVV)。

现在您已经在计算机2主机上拥有了所需的所有副本。

4- 运行以下命令:vagrant box add package.box --name VVV

(--name用于为虚拟机命名。在我的情况下,它被命名为VVV) (如果您已经有一个名为VVV的虚拟机并想要覆盖它,请使用--force。(小心使用!))

这将解压缩您的新vagrant虚拟机。

5- 完成后,运行: vagrant up

该机器将安装,并且您应该在“Oracle虚拟机框管理器”中看到它。如果您无法看到虚拟机,请尝试以管理员身份运行Oracle VM框(右键单击->以管理员身份运行)

现在您可能已经一切正常,但请记住检查您的主机是否符合您的预期:

c:/windows/system32/hosts

6- 或许将您的主机文件从计算机1复制到计算机2是个好主意。或者只复制您需要的行。在我的情况下,这些是我需要的主机:

192.168.50.4 test.dev
192.168.50.4 vvv.dev
...

在这里,192.168.50.4是我的虚拟机IP地址,test.dev和vvv.dev是开发主机。

希望这能帮到你 :) 如果您有任何反馈,请告诉我。

我遇到的一些特殊情况:

当我运行vagrant up时,mysql出了问题,无法正常工作。 我不得不在虚拟服务器上运行以下命令(右键单击Oracle虚拟机 ->显示控制台):apt-get install mysql-server

之后,我再次运行vagrant up,一切都正常工作,但数据库中没有数据。 所以我从计算机1中使用mysqldump all-tables导出所有表,并将它们上传到计算机2中。

其他注意事项: 我的虚拟机并不完全位于计算机1和计算机2上。 例如,我之前进行了内部配置以使用NFS(加快服务器同步文件的速度),我需要在计算机2主机上再次运行此命令:vagrant plugin install vagrant-winnfsd


1

1

我不得不将我的Vagrant虚拟机迁移到新的机器上,并发现了这种肮脏但简单的方法可以很好地工作(它适用于基于VirtualBox的虚拟机,我认为它可以适应其他提供程序):

  • 复制VirtualBox虚拟机,例如使用VirtualBox GUI中的“导出/导入虚拟设备”功能
  • 复制Vagrant目录
  • 编辑Vagrant目录中的.vagrant/machines/default/virtualbox/id文件到新的VirtualBox ID(通过VBoxManage list vms获取)。

将最后一步的功劳归功于@ingmurillo,参见此问题 - Tgr

0

我还需要从.vagrant/machines/default/virtualbox文件夹中复制private_key文件,以便vagrant ssh正常工作


-1

截至2019年,有一个子命令:vagrant box repackage

vagrant box repackage --help 
Usage: vagrant box repackage <name> <provider> <version>
    -h, --help                       Print this help

您可以通过运行 vagrant box list 命令来查找 nameproviderversion

vagrant box list
macinbox (virtualbox, 10.14.5)

vagrant box repackage 的输出是一个名为 package.box 的文件,它基本上是一个 tgz 文件,其内容可以列出如下:

tar tzf package.box
./metadata.json
./box.ovf
./Vagrantfile
./box-disk001.vmdk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接