へっぽこびんぼう野郎のnewbie日記

けろけーろ(´・ω・`)!

誤ってVagrantfile以下の.vagrantなどのディレクトリなどを削除してしまった場合にすること

状況

  • 誤ってVagrantfileがあるディクレトリにある .vagrant ディレクトリを削除してしまった
  • Vagrantで立てたVirtualBoxVMは残っている
  • しかしアクセスできない
  • あたらしく $ vagrant up しようとすると
A customization command failed:

["modifyvm", :id, "--memory", "3072", "--cpus", "2", "--name", "KaeruOldVM", "--natdnshostresolver1", "on", "--natdnsproxy1", "on", "--vram", "16"]

The following error was experienced:

#<Vagrant::Errors::VBoxManageError: There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["modifyvm", "c766d472-87d1-4b37-b826-80fe035ad257", "--memory", "3072", "--cpus", "2", "--name", "KaeruOldVM", "--natdnshostresolver1", "on", "--natdnsproxy1", "on", "--vram", "16"]

Stderr: VBoxManage: error: Could not rename the directory '/Users/usrNeko/VirtualBox VMs/ansible_default_1500964641566_30491' to '/Users/usrNeko/VirtualBox VMs/KaeruOldVM' to save the settings file (VERR_ALREADY_EXISTS)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component SessionMachine, interface IMachine, callee nsISupports
VBoxManage: error: Context: "SaveSettings()" at line 3052 of file VBoxManageModifyVM.cpp
>

Please fix this customization and try again.

のようなエラーが出る

何がおこっているのか?

  • Vagrantは、通常 Vagrantfile.vagrant にある情報を見て動作するのだが、その .vagrant が消えてしまった。
  • .vagrant がないので、新たにVMを作ろうとした。
  • あたらしく作ろうとしたが、以前つくったVMと名前がダブっている。(VERR_ALREADY_EXISTS)
  • ダブっているのでRenameできなくてエラー

解決方法

注意

ホストマシンでのコマンドは % foo、ゲストマシンでのコマンドは $ fooで書きます

とりあえずsshでログインできるようにする

VirtualBoxVMは残っているので、まずVirtualBoxからログインする(パスワードは通常vagrantと入力すればログインできる)

$ cat ~/.ssh/authorized_keys で、以前の.vagrant下にあった秘密鍵と対応する公開鍵があるかどうか確認する。ないとおかしい。

もし対応する秘密鍵を既にもっているのなら、以下は不要なので、★★★の箇所まで移動してください。

公開鍵がわかったからといって、秘密鍵がわかるわけではないので、新しく鍵ペアを生成する。

ホストマシンで % ssh-keygen -t rsa をして、秘密鍵(id_rsa)と公開鍵(id_rsa.pub)を生成。

(※あたりまえだが、ゲストマシンでssh-keygenをしないこと。ゲストマシンでやると、秘密鍵を移動する必要が出てくる。公開鍵は別に誰かにバレても問題ではない。もちろんバレるよりかはバレない方がいいけど)

生成されたid_rsa.pub というファイル名をauthorized_keys に変更し、ゲストマシンの ~/.ssh/ 下に置く。 この段階ではホストマシンから接続できないと思うので、たとえばGithub等に公開鍵をあげておいて、ゲストマシンから $ git clone https://あなたのレポジトリ などのようにするのがオススメ。

うまくゲストマシンに ~/.ssh/authorized_keys として配置できたら、

$ chmod 600 ~/.ssh/authorized_keys

その後、 % vagrant ssh-config で出てくる

★★★

Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes

の情報に、秘密鍵を紐付ける。

% mv ~/id_rsa ~/.vagrant/machines/default/virtualbox/private_key

のようにして、秘密鍵の情報を置き換えてやる。 % vagrant ssh-config 自体は動かないかもしれない。

これで接続できるようになった。

あとは~/.ssh/config に↑の情報を登録すれば、% ssh default でログインでき、[vagrant]$のようになるはず( ‘ω’)

バーチャルマシンへの向き先を以前のものに変更する

ログインできるようになったからといってもまだ解決はしていない。 今あるVagrantfileで生成されている.vagrantディレクトリには、バーチャルマシンの情報があるが、その情報が、新しいバーチャルマシンになっている。 これを既存のものに変更する。

% VBoxManage list vms すると、VirtualBoxでのバーチャルマシンの一覧が出る。 VBoxManageVirtualBoxをコントロールするコマンド。 このIdとかVboxManage コマンドをもとにVagrantはバーチャルマシンを管理・変更している。

↓さっきのエラー画面にもそう書いてある。

["modifyvm", :id, "--memory", "3072", "--cpus", "2", "--name", "KaeruOldVM", "--natdnshostresolver1", "on", "--natdnsproxy1", "on", "--vram", "16"]

The following error was experienced:

#<Vagrant::Errors::VBoxManageError: There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

ここで出てきた以前のバーチャルマシンのIDを、 % ~/.vagrant/machines/default/virtualbox/id に書き込む。 ちなみに書き込む前のidは、あたらしく作ったバーチャルマシンのIDになっているはず。

書き込み後、% vagrant reload でリロードする。 たぶんこれで動く。

わざわざ再プロビジョニングしなくてよくなって便利( ‘ω’)

今回特にググらなかったけど、解決した後でググったら結構いっぱい解決策あってびっくりした。