如何导出 Vagrant 虚拟机进行传输

Posted

技术标签:

【中文标题】如何导出 Vagrant 虚拟机进行传输【英文标题】:How to export a Vagrant virtual machine to transfer it 【发布时间】:2014-01-07 20:46:23 【问题描述】:

我有一个 vagrant box 正在运行(配置了 LAMP 堆栈)。我需要把它转移到另一台电脑上。我怎样才能导出它? 我想我可以得到一个可以复制到另一台 PC 的文件(或多个文件),所以我可以在那里运行一些命令来导入 vagrant box。

【问题讨论】:

我写了一些脚本来自动转移流浪者盒子。见soniah/transfer_vagrant_boxes // , 有人试过 Sonia 的脚本吗? @NathanBasanese AFAIU,这些脚本帮助转移基本盒子,而不是生成的运行虚拟机,因为它们使用了 vagrant box repackage(请参阅其文档) Is there any way to clone a vagrant box that is already installed的可能重复 【参考方案1】:

你有两种方法可以做到这一点,我称之为dirty wayclean way

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

【讨论】:

努力成为那个干净,有远见的管理员......你不必在你的git repo中放置操作系统安装iso吗?例如,您是否建议这样做。使用 ansible,您的 repo 将包含 Vagrantfile 和 ansible playbook。 Vagrantfile 将 1. 从 vagrantcloud 下载 basebox 2. 运行 ansible playbook 以使用其他文件/repos/cloud-storage 配置/配置 basebox。正确的?还是 git repo 中还有其他内容? “干净的方式”是否考虑了可能位于 vm 内部的数据库(mysql、Wordpress)?如何同步到另一台电脑? @kevllar 干净的方式意味着在 git 存储库之外没有启动新开发环境所需的信息。这意味着安装和配置数据库将在配置新的 vagrant box 期间完成(通过 Chef/Puppet/what-have-you)。 那么Hashicorp推荐的方式也“脏”吗?即打包盒子并上传到atlas服务器?我不确定“干净”的方式是否真的会复制确切的环境,我认为这是 vagrant 的全部目的...... 我不明白官方的方式怎么被认为是肮脏的。哪位好心人能解释一下原因?【参考方案2】:

我的 Mac 中的硬盘在进行项目时发出哔哔声,因此我决定安装 SSD。我需要将我的项目从一个磁盘移动到另一个磁盘。需要考虑的几点:

我是在 Mac 上使用 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 来宾时遇到了一些问题。

我修复了它们with this solution。

【讨论】:

//,我要试试这个,@KJPrince。感谢您为我们分解它。 // ,我试过了,但是当我将 VirtualBoxVMs 目录复制到 ~/VirtualBox\ VMs 并运行 vagrant box list: 0bin.net/paste/iCiaqNhU-i3bbfY2#-KDiXYcRFni1RNgNJhOBrIs/… 时,出现以下链接的错误跨度> 【参考方案3】:

其实很简单

    在远程机器上安装virtual box和vagrant

    收拾你的流浪机器

    vagrant package --base [machine name as it shows in virtual box] --output /Users/myuser/Documents/Workspace/my.box

    将盒子复制到遥控器

    通过运行在远程机器上初始化盒子

    vagrant init [machine name as it shows in virtual box] /Users/myuser/Documents/Workspace/my.box

    运行vagrant up

【讨论】:

如果您的机器名称很长,并且您懒得查看 Virtualbox GUI 并输入它的名称或 ID - 您可以使用以下终端命令列出所有 VM 的名称和 ID:VBoxManage list vms。在您可以复制并执行@Phil 2nd 和 4th 步骤中的操作之后。 :) 是的。 @Sid 为什么不只是 $ vagrant box list @KenRatanachaiS 因为您的命令列出了框,例如:(scotch/box (virtualbox, 3.0))。我的命令 - 带有标识符的虚拟机,例如:"Win10 - SandBox" bc251c06-501f-4c0f-bgfa-21f2815ba2cd【参考方案4】:

最简单的方法是打包 Vagrant 盒子,然后将其复制(例如 scprsync)到另一台 PC,添加它并添加 vagrant up ;-)

详细步骤请查看=&gt;Is there any way to clone a vagrant box that is already installed

【讨论】:

【参考方案5】:

以上答案都不适合我。我已经花了 2 天时间研究如何将 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 被加载并作为 使用 box 时的 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) (如果您已经有一个具有此名称的虚拟机并想要覆盖它,则可以使用 --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 时,mysql 出现问题,它无法正常工作。我必须在虚拟服务器上运行(右键单击oracle虚拟机->显示控制台):apt-get install mysql-server

在此之后,我再次 vagrant up,一切正常,但数据库中没有数据。所以我从计算机 1 做了一个 mysqldump 所有表并将它们上传到计算机 2。

其他说明: 我的虚拟机并不完全在计算机 1 和计算机 2 上。例如,我前段时间进行了内部配置以使用 NFS(加速服务器同步文件夹),我需要在计算机 2 主机上再次运行此命令:@ 987654329@

【讨论】:

【参考方案6】:

如中所述

How can I change where Vagrant looks for its virtual hard drive?

虚拟机状态存储在预定义的 VirtualBox 文件夹中。将除了您的 vagrant-project 之外的相应机器(文件夹)复制到您的其他主机应该保留您的虚拟机状态。

【讨论】:

【参考方案7】:

我还必须从 .vagrant/machines/default/virtualbox 文件夹中复制 private_key 文件,以便 vagrant ssh 工作

【讨论】:

【参考方案8】:

截至 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

【讨论】:

以上是关于如何导出 Vagrant 虚拟机进行传输的主要内容,如果未能解决你的问题,请参考以下文章

删除 .vagrant 文件后如何销毁虚拟机?

用ssh免密码以root身份登陆vagrant虚拟机

Vagrant使用

使用vagrant创建虚拟机

Vagrant搭建虚拟化开发环境虚拟机优化 PHP升级 打包分发

0. vagrant+vbox创建centos7虚拟机