開発環境としてCentOS 6が必要となり、どうしようかと考えたのですが、愛機Surface Pro LTE AdvancedのWindows 10上で仮想マシンを立ち上げることにしました。最初はDockerも考えたのだけど、結構複雑な環境を作らないといけないので、自分でイメージを作るのはきついなと…。
Hyper-V環境でのVirutalBox
で、ひとまずVagrantとVirtualBox(最新は6.1ですがVagrantの都合で6.0)を入れて、CentOS 6のVagrant Boxを使えばよいだろうとやってみたのですが、VirutalBox上で仮想マシンが起動せず。理由は分かっているのです。Windows 10でDockerを使うとHyper-Vを有効にせねばならず、そうするとVirtualBoxが必要とする仮想化機能と共存できなくなる。でも、最新のVirutalBoxだとそういう環境でもOKになったという話もあり、期待をかけてやってみたのですが、やはりダメ。VirutalBoxのバージョンが6.1じゃないのが問題なのかもしれませんが、それはVagrantがVirutalBox 6.1に対応するのを待つことにして、ひとまずどうするか…。
Hyper-V環境でのVagrant
Vagrant Boxの中にはHyper-V環境に対応したものもあるということで、VirutalBoxはあきらめてHyper-V環境でのVagrantを試してみることにしました。
Hyper-V環境でのVagrantは管理者権限が必要になるので、PowerShellを管理者権限で立ち上げ、例えば、d:\dev\centos6のようなフォルダを作成して、そこで下記のコマンドを実行します。
vagrant box add centos/6
vagrant box init centos/6
これでVagrantファイルができるので、下記のように追記します。
config.vm.provider "hyperv" do |hv|
# この間にHyper-V特有の設定が可能
end
config.vm.provider “virtualbox”という部分がコメントアウトされた状態であると思うので、その上あたりに書くと良いでしょう。この記述があると、VagrantはVirtualBoxではなく、Hyper-Vを使って仮想マシンを立ち上げようとします。
vagrant up
Hyper-Vマネージャを立ち上げると、このようにCentOS 6の仮想マシンが立ち上がっています。
Hyper-V環境での共有フォルダ
VirtualBoxだとsharaed folderの機能を使って、ホスト(Windows)とゲスト(CentOS)の間でファイル共有ができるのですが、どうやらHyper-Vだとrsyncがかかるだけの様子。rsyncはvagrant upの時などだけしか動かないので、仮想マシンを立ち上げっぱなしにして、ソースコードを編集してすぐに試すということができません。これに気付くのに、2時間くらいかかった…。後述のとおり解決策はあるので、ひとまずVagrantファイルを編集して共有フォルダの設定を行います。
config.vm.synced_folder ".", "/vagrant"
このように、ホストのカレントフォルダ(D:\dev\centos6)を、ゲストの/vagrantに共有します。この設定の後ろに、owner: “foo”, group: “bar”のように書くと、ゲスト側のファイルのオーナーなどを設定できます。デフォルトだと、vagrantユーザー、vagrantグループになります。
このように最後らへんにRsyncがかかって、フォルダが共有(というか同期)されます。
フォルダの自動同期
フォルダの自動同期を行うには、上図のように仮想マシンが立ち上がった後で、下記のコマンドを実行します。
vagrant rsync-auto
これで、ホスト側でファイルの編集などが行われると、自動的にゲスト側に同期がかかります。WindowsでVisual Studio Codeなどを使ってガンガン、ソースを編集してもちゃんとそれが反映された状態で動作するわけです。
Dockerが自動的にやっていた以外では、初めてHyper-Vをまともに使った!という感じなのですが、VirtualBoxと比べて少し工夫などが必要ながらやりたいことはできるようになりました。