我经常在运行Vagrant时遇到这样的错误:
VBoxManage: error: A NAT rule of this name already exists VBoxManage: error: Details: code NS_ERROR_INVALID_ARG (0x80070057), component NATEngine, interface INATEngine, callee nsISupports VBoxManage: error: Context: "AddRedirect(Bstr(strName).raw(), proto, Bstr(strHostIp).raw(), RTStrToUInt16(strHostPort), Bstr(strGuestIp).raw(), RTStrToUInt16(strGuestPort))" at line 1524 of file VBoxManageModifyVM.cpp
我想在做之前删除所有端口转发规则vagrant up
,但是我在列出natpf规则时遇到了麻烦.有没有办法vboxmanage
在Vagrant中使用或通过一些设施来做到这一点?
更新:Vagrant版本1.3.4.我可以按如下方式复制问题:启动vm安装normal way(vagrant up
)并在安装期间强制关闭vm(这模拟了例如安装失败).然后natpf1端口转发规则留在系统中.清理它的唯一方法是vboxmanage modifyvm #{vmid} --natpf1 delete rule_name
,但是你必须事先知道规则名称...此外,规则保留在那之后vagrant destroy
,似乎我的Ruby natpf1清除功能Vagrant.configure
不会运行,这意味着陈旧的规则仍然与Vagrant试图创造的"新鲜"冲突相冲突.
这完成了我的工作:
VBoxManage showvminfo $VM_NAME --machinereadable | awk -F '[",]' '/^Forwarding/ { printf ("Rule %s host port %d forwards to guest port %d\n", $2, $5, $7); }'
我带着同样的问题来到这里; 有关删除规则的提示我发现您可以使用VirtualBox GUI查找规则并删除它们.
当然,这仅适用于使用GUI桌面的计算机.
打开VirtualBox管理器
打开相关方框的设置(rmb - >设置或齿轮图标)
Network
从左侧列表中选择并打开Port Forwarding
对话框
从这里,您将能够直接删除规则.
http://i.stack.imgur.com/6fQQc.png
看看这些规则,它们似乎只是得到一个等于所设置端口的名称.所以你也可以查看Vagrantfile,并搜索这样一行:
db.vm.network :forwarded_port, guest: 5432, host: 5432
并猜测规则的名称将是5432
.调用用于转发ssh端口22的规则的名称ssh
$ vboxmanage modifyvm "vbox-id" --natpf1 delete "5432"