VagrantはLinked Clones機能(linked_clone)を有効にする事で、仮想マシンのディスク使用量を大幅に節約したり、仮想マシンの作成スピード(vagrant upコマンドの実行時間)を早くする事ができます。実際に設定方法と仮想マシンの作成時間を測定してベンチマークしています。
※ 本ページはプロモーションが含まれています。
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で仮想マシンを作成・起動する時に、Vagrantfileの初期設定ではLinked Clones(linked_clone)機能は無効になっていますが、無効の時は仮想マシン作成時に毎回Boxをインポートしてから作る事になります。
そして、このLinked Clones機能を有効にすると、初回の仮想マシン作成時にBoxからマスターの仮想マシン(マスターVM)が作成され、それ以降の仮想マシンの作成は、マスターの仮想マシンからのクローンで作成されるようになります。
そして、マスター仮想マシンからクローンで作成される仮想マシンは、PCのディスク容量がかなり少なくて済みますのでストレージの節約になりますし、作成時間も早くなりますので仮想マシン作成時の待ち時間のストレスも少しは減らす事が出来ます。特に、使用するディスク容量を減らせる効果は大きいです。
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マネージャーでもディスク容量を確認してみます。
対象の仮想マシンを選択して、ストレージという部分をクリックします。
すると選択した仮想マシンのストレージというウインドウが開くので、左側のストレージデバイスから"ubuntu-18.04~.vmdk"を選択すれば、右側の情報で仮想的なサイズと実際のサイズがわかります。
仮想的なサイズが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マネージャーではマスターの仮想マシンもちゃんと表示されていました。
今度は、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が秒です。次は、マスター仮想マシンが無い、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 |
Vagrantで頻繁に仮想マシンを作成するような使い方をしているのなら、Linked Clones機能を有効にした方が時間の節約になりそうです。
以上簡単でしたが、VagrantのLinked Clones機能を試して仮想マシンの使用ディスク容量と作成・起動時間を調べてみました。結論としては、Linked Clones機能を有効にした方が、1つのBoxから複数台の仮想マシンを作るなら大幅にディスク容量を節約できるし、仮想マシンの作成時間も早くなる(起動は意味なし)と言えそうです。個人的には積極的に使ったほうがいい機能だなと思います。
また、Linked Clones機能とは別の話ですが、仮想マシンはどうしてもメモリをそれなりに使うので(特に複数台使うなら)、ホストPC自体が重く(遅く)なったりします。ですので、仮想マシンのメモリ使用量を調整する事により、仮想マシンだけでなく、ホストPCの動作を改善させたい時がよくあります。
Vagrantの仮想マシンのメモリの設定については別ページで説明していますので、そちらを参考にしてください。
(Vagrant)仮想マシンを起動するとPCの動作が重く(遅く)なるので、仮想マシンのメモリ使用量を設定して軽くする