VirtualBoxとVagrantによる同一仮想環境の提供 その4
おそらくWindows 10 Creator's Updateのせいだとおもっているが、Vagrantのインスタンスがup/resumeできなくなった。それしようとすると次のエラーがでる:
PS %HOMEPATH%> vagrant resume ==> default: Resuming suspended VM... ==> default: Booting VM... There was an error while executing `VBoxManage`, a CLI used by Vagrant for controlling VirtualBox. The command and stderr is shown below. Command: ["startvm", "5fba24a4-2790-4b9e-92eb-da69d49fb28d", "--type", "headless"] Stderr: VBoxManage.exe: error: The virtual machine 'hogehoge' has terminated unexpectedly during startup with exit code -1073741819 (0xc0000005) VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component MachineWrap, interface IMachine PS %HOMEPATH%>
ひょっとしたら更新のせいではないかもしれないが、そしてエラーコードに"0xc0000005"がでているあたりはメモリーエラーっぽいが、再起動しても治らなかったのでイメージを作り直すことにする。
イメージの作り直し方作成の仕方
今回はrails-dev-box編である。他でも応用は効くだろう。作り直し方とあるが、事実上最初から作り直しである。
Vagrantを使うと、ホストに開発ソースプログラムを置いていて実行環境だけを管理・整備していくことができるのは、使い方によっては便利である。
先ずバックアップ
今回はバックアップしなくても作業は進められるが、何事も備えあれば憂いなし。
git clone && vagrant up
rails-dev-boxのcloneを実行する。第二引数を指定しなければ、rails-dev-boxが作成される。
$ git clone https://github.com/rails/rails-dev-box.git hoge-dev-box
実行する前からrails-dev-boxディレクトリが残っていると実行を止めてしまうので、ディレクトリ名を指定するか、これまで使っていたディレクトリの名前を変更しておくこと。
続いて、作成したディレクトリに降りてvagrant upを実行する。README.mdに書いてある通りに実行しているだけだ(簡単だ!)。但し、メモリやCPU割り当て数をこれまで変更していたなら、実行する前にVagrantファイル内の設定値を変更しておくことが望ましい(Virtural Boxの管理挙動を全て知っているなら後からでもよいだろう)。因みにデフォルトはv.memoryをデフォルト2048(2G bytes)だが、大抵の小規模開発であれば1024(1G bytes)で十分である。
vagrant up実行時のエラー対処
vagrant upを実行すると次のエラーが出力されることがある:
==> default: Destroying VM and associated drives... C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_open.rb:21:in `initialize': The requested address is not valid in its context. - connect(2) for "0.0.0.0" port 3000 (Errno::EADDRNOTAVAIL) from C:/HashiCorp/Vagrant/embedded/gems/gems/vagrant-1.9.3/lib/vagrant/util/is_port_open.rb:21:in `new'
ネットワーク接続できませんと訴えている。Windows以外のOSでは出現しないそうだが(未確認)、Windowsでは出現し、その解決方法が示されていた:
github.com
要するに、ローカルホストにアクセスするのに0.0.0.0/32を指定しているが、ループバック・ローカル・アドレスの127.0.0.1を指定すればよい。
config.vm.network "forwarded_port", guest: 22, host: 2222, host_ip: "127.0.0.1", id: 'ssh'
上記は私の場合の設定で、hostのポート2222を利用させている。これまで記しておかなかったが、環境によっては、ポート2222が使えるように、Windowsのネットワークセキュリティ設定を変更しなければならない。その解説は他のサイトに譲る。
Powershell上でのスナップショット保存スクリプト実行
以前スナップショット名に年月日日時分を持たせるバッチスクリプトを書いておいたが、Windows 10 Creator's Updateを実行するとエクスプローラーなどから起動できるシェルがPowershellに変更されたので、そのままでは実行できない。Powershell用のスクリプトコードを書ければ移植したほうがよいだろうが、幸運にもPowershel既存のDOSバッチが実行できるので、以前に書いておいた資産を有効利用することにした。何のことはない、相対パスで指定してバッチスクリプトを実行するだけでよい。
PS C:\hogehoge> .\the_bat_script
/vagrantマウント先を戻す
忘れていたが、退避しておいた/vagrantのマウント先(Windows空間)のフォルダを新しい/vagrantのマウント先に移動・コピーして思い通りになるか確認すべし。rails-dev-boxを使って何かウェブサービスを作っていたなら、サーバーを立ち上げて動くか確認すればよいだけだ。
Railsなどでlocalhost:3000にアクセスできないときの対処法
上記の「vagrant up実行時のエラー対処」でネットワークアドレスを0.0.0.0/32からローカル・ループバック・アドレスに指定してネットワーク接続を可能にしたが、同様に他のポートも明示しないといけないようだ。どのポートも開放し、どこからでも受け付ける設定にできるだろうが、調べていないので(後日調査するつもりだ)、ポートフォワードで対処することにした:
config.vm.network "forwarded_port", guest: 3000, host: 3000, host_ip: "127.0.0.1"
このようにすればホスト上のブラウザからVagrant(Virtualbox)ゲストOSで立ち上げたサーバーにアクセスできるだろう。プロトコル制限はしていない。