VagrantのLinked Clones(linked_clone)を有効にし、仮想マシンのディスク使用量を減らし、仮想マシンの作成時間を早くする

VagrantはLinked Clones機能(linked_clone)を有効にする事で、仮想マシンのディスク使用量を大幅に節約したり、仮想マシンの作成スピード(vagrant upコマンドの実行時間)を早くする事ができます。実際に設定方法と仮想マシンの作成時間を測定してベンチマークしています。

目的と環境

最終更新日:2021/4/20

VagrantのLinked Clones機能(linked_clone)を使えば、仮想マシン(VM)で使用するディスク容量の節約や仮想マシンの作成スピードを早くする事ができます。 特に、ディスク容量に関しては劇的に減らせるので、同じBoxから複数の仮想マシンを作成して使う場合には、Linked Clones機能を有効にして使うメリットは大きいはずです。

ここでは、VagrantでのLinked Clones機能の設定、使い方の説明と、実際にLinked Clones機能を有効/無効にして仮想マシンを作成・起動して、どれだけ使用するディスク容量を減らす事ができるか、どれだけ仮想マシンの作成時間を早くする事ができるのかを計測してみたので、それについて書いていきます。

◾️環境とバージョン情報です。
ホストPCのOS:macOS Big Sur(バージョン11.1)
Vagrant 2.2.7
VirtualBox 6.1.16

$ vagrant -v
Vagrant 2.2.7

$ VirtualBox -h
Oracle VM VirtualBox VM Selector v6.1.16

VagrantとVirtualBoxをインストールしてある事が前提で説明していきます。

Vagrant(VirtualBox)のLinked Clones機能とは?メリットとか

Vagrantで仮想マシンを作成・起動する時に、Vagrantfileの初期設定ではLinked Clones(linked_clone)機能は無効になっていますが、無効の時は仮想マシン作成時に毎回Boxをインポートしてから作る事になります。

そして、このLinked Clones機能を有効にすると、初回の仮想マシン作成時にBoxからマスターの仮想マシン(マスターVM)が作成され、それ以降の仮想マシンの作成は、マスターの仮想マシンからのクローンで作成されるようになります。

そして、マスター仮想マシンからクローンで作成される仮想マシンは、PCのディスク容量がかなり少なくて済みますのでストレージの節約になりますし、作成時間も早くなりますので仮想マシン作成時の待ち時間のストレスも少しは減らす事が出来ます。特に、使用するディスク容量を減らせる効果は大きいです。

linked_cloneを有効/無効にして仮想マシンを複数台作成して、仮想マシンが使用するディスク容量を調べてみる

Linked Clones機能のオンオフを切り替えて、それぞれ仮想マシンを3台ずつ作成・起動し、仮想マシンが使用するディスク容量(ストレージ)がどれだけ違うかを調べたいと思います。

その前にまずはBoxの準備です。Boxなら何でも良いと思いますが、ここではVirtualBoxのhashicorp/bionic64(OSはUbuntu18.04)を使用します。 Vagrant環境にhashicorp/bionic64がない場合、まずはvagrant addコマンドでBoxをダウンロードして追加します。

$ vagrant box add hashicorp/bionic64
==> box: Loading metadata for box 'hashicorp/bionic64'
    box: URL: https://vagrantcloud.com/hashicorp/bionic64
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) virtualbox
3) vmware_desktop

Enter your choice: 2
==> box: Adding box 'hashicorp/bionic64' (v1.0.282) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/hashicorp/boxes/bionic64/versions/1.0.282/providers/virtualbox.box
    box: Download redirected to host: vagrantcloud-files-production.s3.amazonaws.com
==> box: Successfully added box 'hashicorp/bionic64' (v1.0.282) for 'virtualbox'!

途中でどの仮想マシンを使うかを聞かれますが、上では2のvirtualboxを選択しています。あと、Boxをダウンロードするので少し時間がかかるかもしれません。

Boxの準備ができたら、最初にLinked Clones機能が無効(初期設定)のパターンでやっていきます。
適当なディレクトリ上で、vagrant initを実行してVagrantfileを作成し、Vagrant環境を初期化します。

$ vagrant init hashicorp/bionic64

Vagrantfileが作成されたら、仮想マシンを3台作成するように編集します(見やすくするために、コメント文はすべて削除しています)。

$ cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.define "host1" do |host1|
    host1.vm.box = "hashicorp/bionic64"
  end

  config.vm.define "host2" do |host2|
    host2.vm.box = "hashicorp/bionic64"
  end

  config.vm.define "host3" do |host3|
    host3.vm.box = "hashicorp/bionic64"
  end
end

Vagrantfileを編集したら、仮想マシンを作成・起動します。

$ vagrant up
〜
$ vagrant status
Current machine states:

host1                     running (virtualbox)
host2                     running (virtualbox)
host3                     running (virtualbox)
3台とも起動できましたので、仮想マシンのディスク容量を確認してみます。

まずは実際に仮想マシンが使用するディスク容量です。
作成された仮想マシンは、"~/VirtualBox\ VMs"ディレクトリに実体ができます。

$ ls ~/VirtualBox\ VMs
tmp_default_1611337753199_77055                      tmp_host1_1611666290691_72149
myHogeVM_default_1583948976718_8200                  tmp_host2_1611666343536_82393
myCentOS7_default_1584178558895_53820                tmp_host3_1611666394429_71785
tmp_default_1610992829623_86739                      vagrant_default_1389437969
私の環境では、今回作成した3台はtmp_host1_~、tmp_host2_~、tmp_host3_~です(頭のtmp_は、実行したディレクトリ名なので、人それぞれだと思います)。

duコマンドでディレクトリ容量を確認します。

 $ du -sh ~/VirtualBox\ VMs/tmp_host1_1611666290691_72149
1.8G	/Users/hogeuser/VirtualBox VMs/tmp_host1_1611666290691_72149
1.8GBでした。他の2台も同じだったので、1.8*3=5.4GBのディスク容量を消費した事になります。

今度は、VirtualBoxマネージャーでもディスク容量を確認してみます。
対象の仮想マシンを選択して、ストレージという部分をクリックします。
VirtualBoxのストレージ確認

すると選択した仮想マシンのストレージというウインドウが開くので、左側のストレージデバイスから"ubuntu-18.04~.vmdk"を選択すれば、右側の情報で仮想的なサイズと実際のサイズがわかります。
VirtualBoxのストレージ容量確認(仮想的サイズと実際のサイズ)

仮想的なサイズが64GBで、実際のサイズが1.84GBです。さっきduコマンドで調べたディレクトリ容量は1.8GBだったので、誤差の範囲と言えそうです

今回は実際にどれだけ仮想マシンがディスク容量を消費したかを確認したいので、仮想的なサイズについては気にする必要はないですが、仮想マシンにログインしてdfコマンドで確認できます。

$ vagrant ssh host1
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-58-generic x86_64)
〜
vagrant@vagrant:~$ df -h
Filesystem                    Size  Used Avail Use% Mounted on
udev                          463M     0  463M   0% /dev
tmpfs                          99M  4.8M   94M   5% /run
/dev/mapper/vagrant--vg-root   62G  1.6G   58G   3% /
tmpfs                         493M     0  493M   0% /dev/shm
tmpfs                         5.0M     0  5.0M   0% /run/lock
tmpfs                         493M     0  493M   0% /sys/fs/cgroup
vagrant                       234G  169G   65G  73% /vagrant
tmpfs                          99M     0   99M   0% /run/user/1000
/(ルートディレクトリ)のサイズが62GBなので、これも誤差の範囲と言えると思います。

これでディスク容量を調べ終わったので、もう仮想マシンは停止(vagrant halt)、破棄(vagrant destroy)して大丈夫です。

次は、Linked Clones機能が有効にして、同じように仮想マシンを3台作成・起動してディスク容量を確認していきます。
Vagrantfileを編集し直します。

$ cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.define "host1" do |host1|
    host1.vm.box = "hashicorp/bionic64"
    host1.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end

  config.vm.define "host2" do |host2|
    host2.vm.box = "hashicorp/bionic64"
    host2.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end

  config.vm.define "host3" do |host3|
    host3.vm.box = "hashicorp/bionic64"
    host3.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end
end
3台ともvm.providerメソッド内でVirtualboxのlinked_cloneをtrueに設定しています。これでLinked Clones機能を有効にできます。

Vagrantfileを編集したら、仮想マシンを作成・起動します。

$ vagrant up
〜
$ vagrant status
Current machine states:

host1                     running (virtualbox)
host2                     running (virtualbox)
host3                     running (virtualbox)

起動できたので、duコマンドで仮想マシンの実際のディスク容量を確認します。

 $ du -sh ~/VirtualBox\ VMs/tmp_host1_1611676630176_21659
136M	/Users/hogeuser/VirtualBox VMs/tmp_host1_1611676630176_21659
136MBです!Linked Clones機能が無効の時は1.8GBだったので、相当ディスク容量を削減できた事になります。

ちなみにLinked Clones機能を有効にした場合、Boxからの最初の仮想マシン作成時にマスターの仮想マシン(マスターVM)が作られると話しましたが、そのマスター仮想マシンの実際のディスク使用量です。

 $ du -sh ~/VirtualBox\ VMs/ubuntu-18.04-amd64_1611676613142_25870
1.7G	/Users/hogeuser/VirtualBox VMs/ubuntu-18.04-amd64_1611676613142_25870
1.7GBですね。という事は、仮想マシンを1台だけ作成するならLinked Clones機能のオンオフでディスク使用量の差はほとんどありませんが、同じBoxから複数台の仮想マシンを作成するならLinked Clones機能を有効にした方が、ディスク使用量を大幅に削減できそうです。

あと、VirtualBoxマネージャー上でのストレージ容量は、Linked Clones機能のオンオフ関係なく仮想的なサイズと実際のサイズの両方ともまったく同じでした。また、VirtualBoxマネージャー上の実際のサイズは1.73GBと表示されますが、Linked Clones機能を有効にした時の実際のディスク使用量は136MBなので、結構違いがある事は気に留めておきたいところです。

あと、VirtualBoxマネージャーではマスターの仮想マシンもちゃんと表示されていました。
Vagrant、VirtualBoxのLinked Clonesのマスター仮想マシン

linked_cloneを有効/無効にして仮想マシンを作成・起動した時のスピードの違いは?

今度は、Linked Clones機能のオンオフを切り替えて、仮想マシン3台を作成・起動した時(vagrant up実行時)の時間をを調べたいと思います。

ですので先程作成した仮想マシンはすべて停止(vagrant halt)、破棄(vagrant destroy)し、マスターの仮想マシンも削除しておきます。

マスターの仮想マシンを削除するには、VirtualBoxマネージャー上でマスターの仮想マシンを右クリック->除去を選択し、すべてのファイルを削除ボタンを押します。

まずは、マスター仮想マシンが無い、Linked Clones機能が無効の状態で、仮想マシンを3台作成・起動した時の実行時間を調べます(実行時間を計測するには、vagrant upコマンドの前にtimeコマンドを付けます)。

$ cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.define "host1" do |host1|
    host1.vm.box = "hashicorp/bionic64"
  end

  config.vm.define "host2" do |host2|
    host2.vm.box = "hashicorp/bionic64"
  end

  config.vm.define "host3" do |host3|
    host3.vm.box = "hashicorp/bionic64"
  end
end
$ time vagrant up
〜
real	2m5.578s
user	0m17.417s
sys	0m7.150s

$ time vagrant up
〜
real	1m59.100s
user	0m17.244s
sys	0m6.887s

$ time vagrant up
〜
real	2m7.033s
user	0m17.472s
sys	0m7.200s
realの右側がコマンドの実行時間です。mが分、sが秒です。
(*上ではtime vagrant upコマンドを3つ並べて書いていますが、仮想マシンの作成時間を調べたいので、time vagrant upコマンドの合間では仮想マシンを停止(vagrant halt)、破棄(vagrant destroy)しています。)

次は、マスター仮想マシンが無い、Linked Clones機能が無効の状態で、仮想マシンを3台起動だけした時の実行時間です(仮想マシンの作成はしない)。

$ time vagrant up
〜
real	1m15.108s
user	0m14.640s
sys	0m6.367s

$ time vagrant up
〜
real	1m15.800s
user	0m15.072s
sys	0m6.744s

$ time vagrant up
〜
real	1m14.034s
user	0m14.700s
sys	0m6.410s

次は、マスター仮想マシンが有る(事前に作っておく)、Linked Clones機能が無効の状態で、仮想マシンを3台作成・起動した時の実行時間です。

$ time vagrant up
〜
real	2m17.197s
user	0m17.497s
sys	0m7.457s

$ time vagrant up
〜
real	2m6.773s
user	0m17.291s
sys	0m7.071s

$ time vagrant up
〜
real	2m7.828s
user	0m17.307s
sys	0m7.176s

次は、マスター仮想マシンが有る(事前に作っておく)、Linked Clones機能が無効の状態で、仮想マシンを3台起動だけした時の実行時間です(仮想マシンの作成はしない)。

$ time vagrant up
〜
real	1m14.460s
user	0m14.340s
sys	0m6.195s

$ time vagrant up
〜
real	1m13.543s
user	0m14.439s
sys	0m6.195s

$ time vagrant up
〜
real	1m14.718s
user	0m14.401s
sys	0m6.370s

次は、マスター仮想マシンが有る(事前に作っておく)、Linked Clones機能を有効にして(linked_clone=true)、仮想マシンを3台作成・起動した時の実行時間です。

$ cat Vagrantfile 
Vagrant.configure("2") do |config|
  config.vm.define "host1" do |host1|
    host1.vm.box = "hashicorp/bionic64"
    host1.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end

  config.vm.define "host2" do |host2|
    host2.vm.box = "hashicorp/bionic64"
    host2.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end

  config.vm.define "host3" do |host3|
    host3.vm.box = "hashicorp/bionic64"
    host3.vm.provider "virtualbox" do |vb|
      vb.linked_clone = true
    end 
  end

end
$ time vagrant up
〜
real	1m28.951s
user	0m18.244s
sys	0m7.433s

$ time vagrant up
〜
real	1m27.398s
user	0m18.032s
sys	0m7.287s

$ time vagrant up
〜
real	1m28.100s
user	0m18.259s
sys	0m7.507s

次は、マスター仮想マシンが有る(事前に作っておく)、Linked Clones機能を有効にして(linked_clone=true)、仮想マシンを3台起動だけした時の実行時間です(仮想マシンの作成はしない)。

$ time vagrant up
〜
real	1m14.763s
user	0m14.990s
sys	0m6.533s

$ time vagrant up
〜
real	1m12.614s
user	0m14.462s
sys	0m6.213s

$ time vagrant up
〜
real	1m14.363s
user	0m14.745s
sys	0m6.510s

実行結果をまとめた表です。

マスターVM無 マスターVM有
作成と起動 起動だけ 作成と起動 起動だけ
Linked Clones無効 2m5.578s
1m59.100s
2m7.033s
1m15.108s
1m15.800s
1m14.034s
2m17.197s
2m6.773s
2m7.828s
1m14.460s
1m13.543s
1m14.718s
Linked Clones有効 1m28.951s
1m27.398s
1m28.100s
1m14.763s
1m12.614s
1m14.363s
表で見ると、起動だけならLinked Clones機能のオンオフ関係なく、全て同じ早さと言えると思います。
けど作成に関しては、明らかにLinked Clones機能を有効にした方が早いと言えそうです。

Vagrantで頻繁に仮想マシンを作成するような使い方をしているのなら、Linked Clones機能を有効にした方が時間の節約になりそうです。

Vagrantの仮想マシンのメモリ使用量を変更してPCの動作を軽くする

以上簡単でしたが、VagrantのLinked Clones機能を試して仮想マシンの使用ディスク容量と作成・起動時間を調べてみました。結論としては、Linked Clones機能を有効にした方が、1つのBoxから複数台の仮想マシンを作るなら大幅にディスク容量を節約できるし、仮想マシンの作成時間も早くなる(起動は意味なし)と言えそうです。個人的には積極的に使ったほうがいい機能だなと思います。

また、Linked Clones機能とは別の話ですが、仮想マシンはどうしてもメモリをそれなりに使うので(特に複数台使うなら)、ホストPC自体が重く(遅く)なったりします。ですので、仮想マシンのメモリ使用量を調整する事により、仮想マシンだけでなく、ホストPCの動作を改善させたい時がよくあります。

Vagrantの仮想マシンのメモリの設定については別ページで説明していますので、そちらを参考にしてください。
(Vagrant)仮想マシンを起動するとPCの動作が重く(遅く)なるので、仮想マシンのメモリ使用量を設定して軽くする