操作系统是 Debian 10,vagrant 提供程序是 libvirt。
vagrant global-status
应该提供系统上所有虚拟机的信息,但我可以在 virt-manager 中看到未列出的已关闭和正在运行的虚拟机vagrant global-status
。我只对 Vagrant 使用过 libvirt,所以我知道 Vagrant 是罪魁祸首。
我如何确定每个虚拟机的关联目录/Vagrantfile?
我认为这个命令可以解决问题:
find / -name Vagrantfile -exec echo {} \; -exec bash -c 'cd "$(dirname {})" && vagrant status | grep -E shutoff\|running' \; 2>/dev/null
但这样的事情似乎是必要的,而且在大型文件系统上会花费很长时间,这似乎很荒谬。
我究竟如何确定每个虚拟机关联的 Vagrantfile 的目录?除了详尽搜索文件系统之外,一定还有更简单的方法。
答案1
根据模板[1],Vagrant 似乎没有跟踪 libvirt 域元数据中与 VM 关联的项目目录。
Vagrant 内部将虚拟机的信息(包括目录)保存在一个 JSON 文件中~/vagrant.d/data/machine-index/index
,具体请查看示例 [2]
我猜想可以修改模板以将目录添加为元数据,类似于 Openstack Nova 如何向 Guest 的 libvirt 域添加一些元数据,元数据可用于直接从计算节点获取虚拟机名称、Flavor 等,而无需查询 Nova。
显然,这并不适用于变更之前的现有虚拟机。
[2]
cat .\index | python -m json.tool
{
"version": 1,
"machines": {
"4f9bf5cd740f409c867553c19c52a81c": {
"local_data_path": "C:/Vagrant-Machines/bionic-vm/.vagrant",
"name": "default",
"provider": "hyperv",
"state": "running",
"vagrantfile_name": null,
"vagrantfile_path": "C:/Vagrant-Machines/bionic-vm",
"updated_at": null,
"extra_data": {
"box": {
"name": "hashicorp/bionic64",
"provider": "hyperv",
"version": "1.0.282"
}
}
}
}
}
作为参考,以下是 Nova 的元数据形式:
virsh dumpxml instance-0033dd00 | head
<domain type='kvm' id='93'>
<name>instance-0033dd00</name>
<uuid>XXXXXXXXXXXXXXXXXXX</uuid>
<metadata>
<nova:instance xmlns:nova="http://openstack.org/xmlns/libvirt/nova/1.0">
<nova:package version="17.0.13"/>
<nova:name>VM-NAME</nova:name>
<nova:creationTime>2021-05-11 10:50:49</nova:creationTime>
<nova:flavor name="m1.small">
<nova:memory>16384</nova:memory>