如何删除 Vagrant box 的所有痕迹而不必手动进入文件系统?
我正在使用 Packer 创建自定义框,构建和销毁大量测试用例。完成测试用例后,我运行
vagrant destroy
vagrant help
将此命令描述为
停止并删除 vagrant machine 的所有痕迹
一切似乎都很好。但是,当我在全新安装后创建一个新框时,我注意到当天的消息显示虚拟机是在几天前创建的。原来框也存储在 中.vagrant.d\boxes
。Vagrant 正在使用这些框,而不是 Packer 创建的框,或者说是除了这些框之外,这些框位于完全不同的位置。
vagrant 文档vagrant destroy
建议使用vagrant box remove
。
.vagrant.d\boxes
现在,目录中仍有一个框。使用时vagrant box remove
需要一个“名称”。
如果我跑vagrant box list
,它会说
尚未安装任何盒子!使用
vagrant box add
以添加一些。
显然 Vagrant 不知道这个其他框。但如果我运行vagrant global-status
,我会得到如下输出
id name provider state directory
-------------------------------------------------------------------------
47d1c7c default virtualbox poweroff C:/some/path
因此,流浪者能看到一些框。尝试使用vagrant box remove
,无论是“name”还是“id”引用都不起作用:
C:\some\path>vagrant box remove default
The box you requested to be removed could not be found. No
boxes named 'default' could be found.
C:\some\path>vagrant box remove 47d1c7c
The box you requested to be removed could not be found. No
boxes named '47d1c7c' could be found.
当然,我可以只需手动删除框即可在.vagrant.d\boxes
。
似乎我对 Vagrant 中“box”、“destroy”、“remove”以及几乎所有涉及这里的术语的理解都是不正确的。我无法理解这一切。有一个 Vagrant VM 目录包含一个 box,但还有 Packer 创建的 box,还有另一个 box .vagrant.d\boxes
。destroy
一个 box 会删除一些痕迹,但不是全部。该list
命令可以看到一些 box,但看不到其他 box。这一切看起来非常不一致。
如果重要的话,我正在 Windows 7 主机上创建 CentOS 7 客户机。
答案1
Vagrant 创建一个与下载的盒子相关的内部虚拟机。
要从虚拟机和盒子中删除所有数据,我建议移除盒子并销毁虚拟机。
要列出框,请执行以下命令:
vagrant box list
要删除一个框,请执行以下命令:
vagrant box remove box/name
销毁虚拟机
vagrant destroy vm-name
您删除了所有数据。
答案2
@Loren Ipsum 我使用 VagrantFile 备份了整个目录,所以我删除了整个目录。#vagrant global-status --prune
从此列表中删除所有内容。删除.vagrant.d\boxes
C:\tools\Cmder
λ vagrant global-status --prune
id name provider state directory
--------------------------------------------------------------------
There are no active Vagrant environments on this computer! Or,
you haven't destroyed and recreated Vagrant environments that were
started with an older version of Vagrant.
C:\tools\Cmder
λ vagrant box list
centos/7 (hyperv, 1905.1)
debian/buster64 (virtualbox, 10.0.0)
debian/contrib-buster64 (virtualbox, 10.1.0)
debian/jessie64 (virtualbox, 8.11.1)
ubuntu/trusty64 (virtualbox, 20190514.0.0)
ubuntu/xenial64 (virtualbox, 20200204.0.0)
即使执行下面的脚本,一些框仍然显示在 vagrant box 列表中:
C:\Users\Marlon\OneDrive (master -> origin)
λ vagrant box list | cut -f 1 -d ' ' | xargs -L 1 vagrant box remove -f
You requested to remove the box 'centos/7'. This box has
multiple providers. You must explicitly select a single
provider to remove with `--provider`.
Available providers: hyperv, virtualbox
You requested to remove the box 'centos/7'. This box has
multiple providers. You must explicitly select a single
provider to remove with `--provider`.
Available providers: hyperv, virtualbox
Removing box 'debian/buster64' (v10.0.0) with provider 'virtualbox'...
Removing box 'debian/contrib-buster64' (v10.1.0) with provider 'virtualbox'...
Removing box 'debian/jessie64' (v8.11.1) with provider 'virtualbox'...
Removing box 'ubuntu/trusty64' (v20190514.0.0) with provider 'virtualbox'...
Removing box 'ubuntu/xenial64' (v20200204.0.0) with provider 'virtualbox'...
C:\Users\Marlon\OneDrive (master -> origin)
λ vagrant box list
centos/7 (hyperv, 1905.1)
centos/7 (virtualbox, 1905.1)
说实话,我不知道为什么有些框仍然显示在上面(同一提供商)。我手动执行了:
C:\Users\Marlon\OneDrive (master -> origin)
λ vagrant box remove centos/7 --provider=virtualbox --force
Removing box 'centos/7' (v1905.1) with provider 'virtualbox'...
C:\Users\Marlon\OneDrive (master -> origin)
λ vagrant box remove centos/7 --provider=hyperv --force
Removing box 'centos/7' (v1905.1) with provider 'hyperv'...
C:\Users\Marlon\OneDrive (master -> origin)
λ vagrant box list
There are no installed boxes! Use `vagrant box add` to add some.
我以这种方式删除了所有盒子,尝试了几个不使用文件系统的命令,但不幸的是,这似乎是办法......
答案3
根据我使用 vagrant 的经验,我建议:
在销毁机器之前不要在 Vagrantfile 中更改虚拟机的参数
如果发生了这种情况 - 您需要添加需要销毁的机器的信息(虚拟机名称),并通过 CMD 安全销毁它:
vagrant destroy vmname|id
注意:您实际上不需要使用盒子进行任何操作来重新设置虚拟机。
答案4
对我来说,在 Windows 10 上,我删除了上面提到的主要项目后,就直接删除了 Virtual Box 中的映像。这大约占了 6GB。