とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

Apple SiliconなMacでVagrantを使ってテスト環境を用意する

普段アプリケーション開発をしていると、いろいろな環境で動作確認をしたいシーンがあると思います。 そんなとき最近であればコンテナーで環境を用意して、動作確認をすることが多いと思います。

しかし、場合によってはアプリケーションの動作確認を仮想マシン環境で行いたい場合があるかもしれません。 そんなとき私はこれまでVagrantをよく使っていました。

VagrantはHashicorpがリリースする製品であり、詳細は後述しますがBusiness Source Licenseでライセンスされています。ソフトウェア自体は現在、無料で使えます。

最近使っているクライアントの環境が買い替えによってApple Siliconモデルに変わったので、CPUアーキテクチャーに対して気にしないといけなくなりました。

これまでのIntel CPUを使ったMacでは、amd64とかx86_64というような分類のCPUアーキテクチャーが採用されていました。当然イメージやISOイメージなどはamd64やx86_64に対応するイメージ*1を利用します。

一方、M1, M2, M3, M4 といったApple Siliconモデルはarm64とかaarch64に分類されるCPUアーキテクチャーです。amd64とかx86_64とはまったく別であり互換性がないため、当然そのままApple SiliconモデルのMacで動作しません*2

VirtualBoxはもともとx86マシンをエミュレートするためのソフトウェアでしたが、新たにApple Silicon向けのビルドも公開され、現在は比較的安定して動作しています。 Apple Silicon向けのVirtualBoxは、現在arm64やaarch64といったアーキテクチャー向けのみ対応しています。 つまりVagrantをつかう場合、arm64 (もしくはaarch64)のboxイメージを用意しないといけないことになります。

余談ですが、Linux環境をすぐ欲しいときに私はMultipassもよく使うのですが、Apple Siliconモデル対応のMultipassは現在、環境はQEMUがデフォルトで使われています。選択肢として「VirtualBox」はあるものの、Apple Silicon向けのVirtualBoxは現時点では使えないようです。ただこれについてGithubなどでやり取りをみると、いずれ対応をしそうな雰囲気を感じています。

Vagrantを使う場合に注意すること

CPUアーキテクチャー以前に、Hashicorpのソフトウェアは自由なオープンソースライセンスから制限のあるBusiness Source Licenseに移行しています。使い始める前にそれを認識しており、新しいライセンスでも使っても問題ないことを確認する必要があります。特に企業で利用する場合は注意かもしれません。

またこのライセンス変更により、旧来Vagrant向けイメージをUbuntuが公式でリリースしていましたが、これを取りやめており、Ubuntu 22.04以降のバージョンのイメージは提供されないようになりました。今後再びVagrantのライセンスがオープンソースへ切り替わらない限り、その方針は変わらないもののと思われます。 Ubuntu以外のディストリビューションは、そのままオフィシャルでリリースされている印象です。良く使うDebian, AlmaLinux, Rocky Linux等のboxイメージは最新のものも公開されているのを確認しています。Ubuntuについては後述のbentoが提供するものを使えば良いと思います。

VirtualBoxもコア機能はオープンソースですが、VirtualBox Extension Packはオープンソースライセンスではないのでこちらも要注意です。

Apple Silicon MacでVagrantとVirtualBoxを利用する時の注意

Apple Silicon対応のVirtualBoxを公式サイトからダウンロードしてインストールしておきます。 同様にVagrantもダウンロードして、インストールしておきます。

VagrantはVMを作ってboxというOSイメージの塊を使って仮想マシン環境を用意します。 このイメージがarm64(もしくはaarch64と記述されることもある)対応のVirtualBox用のイメージである必要があります。

Apple Siliconに対応したVirtualBoxはリリースされてから日も浅いことがあり、イメージが対応していないことが多いです。bentoが提供するvagrant boxイメージはvirtualbox/arm64に対応するイメージがあるのでおすすめです。

たとえば次のように実行して、VMを作るためのVagrantfileテンプレートを作成します。

$ vagrant init bento/almalinux-9 --box-version 202502.21.0

このイメージは現在shared subfoldersの機能が使えないようなので、この行のコメントを外すか、警告を無視してください。機能を利用したい場合は各VMにGuest AditionをVMにインストールする必要がありそうです。

config.vm.synced_folder ".", "/vagrant", disabled: true

その上でvagrant upを実行すると、Apple SiliconのMacでもVagrantでVirtualBoxにVMを作成できます。 これでコンテナ以外でアプリケーションのテスト環境を用意したいときも、さくっと環境を用意できます。良かったですね。

$ vagrant status
Current machine states:

node1                     running (virtualbox)
node2                     running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

$ vagrant ssh node1
This system is built by the Bento project by Chef Software
More information can be found at https://github.com/chef/bento

Use of this system is acceptance of the OS vendor EULA and License Agreements.
[vagrant@vbox ~]$

Tips

Vagrantfileの末尾に次のように書いておくと、一つのVagrantfileを使って複数のVMを作成できて便利です。VMはNATとhostonlyアダプターを実装して作成、起動されてすぐ使える状態になります。複数台構成のテストを手元で実験するときに便利です。

  config.vm.define "node1" do |node1|
    node1.vm.network "private_network", ip: "192.168.33.11"
  end
  config.vm.define "node2" do |node2|
    node2.vm.network "private_network", ip: "192.168.33.12"
  end
end

*1:ファイル名にだいたい書かれているが、書かれていない場合もある。書かれていない場合は確認が必要ですが、だいたいその場合はamd64やx86_64向けバイナリー

*2:macOSのRosetta 2を使えば、ARM環境上でIntel CPU用のアプリケーションを動かすことができます。一部の仮想化ソフトウェアはこのRosetta 2を使ってARM64 Linux OS上でx86_64向けにビルドされたアプリケーションを実行できたり、Docker Desktop用にx86_64向けのイメージを作ったり、そのようなイメージを使ってアプリケーションを展開できます。QEMUを使えば他アーキテクチャーのOSをVMで動かすことも可能ですが、エミュレートなので超遅いので実用的ではないです