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。次のように問題を再現できます:通常の方法(vagrant up
)でvmのインストールを開始し、インストール中にvmの電源を強制的にオフにします(これは、インストールの失敗をシミュレートします)。次に、natpf1ポート転送ルールがシステムに残されます。クリーンアップする唯一の方法はvboxmanage modifyvm #{vmid} --natpf1 delete rule_name
のようなものですが、ルール名を事前に知っておく必要があります...さらに、ルールはvagrant destroy
の後もそこにとどまり、私のRuby natpf1クリア機能が存在するようですin Vagrant.configure
は実行されません。つまり、古いルールは、Vagrantが作成しようとする「新しい」ルールとまだ衝突します。
私は同じ問題でここに来ました。ルールの削除に関するヒントを参考にして、VirtualBoxGUIを使用してルールを見つけて削除できることがわかりました。
もちろん、これはGUIデスクトップを備えたマシンで作業している場合にのみ機能します。
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"
これは私のために仕事を成し遂げました:
VBoxManage showvminfo $VM_NAME --machinereadable | awk -F '[",]' '/^Forwarding/ { printf ("Rule %s Host port %d forwards to guest port %d\n", $2, $5, $7); }'
次のコマンドでNATルールを一覧表示できます。
VBoxManage showvminfo #{vmid}
次に、転送ルールを含むVM)に関する多くの情報を取得します。次に例を示します。
NIC 1 Rule(1): name = ssh, protocol = tcp, Host ip = 127.0.0.1, Host port = 2022, guest ip = , guest port = 22
Andrewの答えを拡張すると、すべてのVMのルールが一覧表示されます
for vm in `vboxmanage list vms | awk -F'"' '$0=$2'`
do
echo "Rules for VM $vm"
VBoxManage showvminfo $vm --machinereadable | awk -F '[",]' '/^Forwarding/ { printf ("Rule %s Host port %-5d forwards to guest port %-5d\n", $2, $5, $7); }'
printf '\n'
done
次のコマンドを発行して、コマンドラインからルールを削除できます。
VBoxManage controlvm "boot2docker-vm" natpf1 delete "tcp-port80"
引用符で囲まれた最後のパラメーターは、削除するルール名です。