Vagrantでゲストとホストのフォルダを共有する

/

導入

VirtualBoxなどで仮想マシンを作成した場合ホストマシンとゲストマシンはOS単位では別のものとして扱われるため、それぞれが独立したフォルダ(ディレクトリ)構造を持っています。
そのままではお互いにファイルをやりとりしたい時などに手間ですが、共有フォルダの設定をする事でそれぞれのマシンから同じファイルを直接扱うことが出来るようになります。

共有フォルダの機能はVirtualBoxなどでも設定できますが、Vagrantを利用した仮想マシンの場合Vagrantfileから簡単に共有フォルダの設定をする事が出来ます。

Vagrant(&VirtualBox)で作る仮想開発環境/Koltatt

実行環境

ホストOS ubuntu16.04LTS
ゲストOS CentOS7.2
Vagrant 1.8.6
VirtualBox 5.0.24

/vagrant

VagrantではホストマシンのVagrantfileのあるフォルダとゲストマシンのVagrantfileのあるフォルダ(e.g. /home/vagrant)はデフォルトで共有フォルダになっています。
新たに共有フォルダを設定するなどすると設定が解除されてしまう場合もあるようですが、簡単なファイルのやり取りであれば特に新たな設定をしなくともVagrantfileのあるフォルダを介して行う事が出来ます。

Synced Folder

Vagrantfileのあるフォルダ以外でファイルの共有を行いたい場合にはSynced Folederを使います。
Synced FolederはVagrantfile内で指定したゲストOSとホストOSのそれぞれのフォルダを共有フォルダに設定してくれます。

#config.vm.synced_folder "host_machine/folder/path", "guest_machine/folder/path"

Vagrant.configure(2) do |config|
  config.vm.synced_folder "src/", "/srv/website"
end

https://www.vagrantup.com/docs/synced-folders/

オプション

Synced Folderには色々とオプションが用意されており、ホストマシンとゲストマシンのパスの設定の後に指定する事が出来ます。

Vagrant.configure(2) do |config|
  config.vm.synced_folder "src/", "/srv/website",
  owner: "root",group: "root",
  :mount_options => ["dmode=777','fmode=755'],
  create: true,
  disabled: false
end

https://www.vagrantup.com/docs/synced-folders/basic_usage.html

Owner&Group

共有するフォルダの所有者とグループを設定します。

owner: root, group: root

Mount Oputions

共有フォルダの権限を指定します。
以下の例ではフォルダの権限を777にファイルの権限を755に設定しています。

:mount_options => ['dmode=777','fmode=755']

create

trueに設定すると指定したフォルダが存在しない場合には作成します。

create: "true|false"

disabled

trueにすると共有ディレクトリの機能をOFFに出来ます。

disabled: "true|false"

Rsync

Synced Folderでフォルダの共有を設定するとVagrant upやreloadを実行した時やファイルを操作した際にある程度自動で同期を行ってくれますが、ファイルを編集しただけでは同期を実行してくれない場合もあるので確実に同期を実行したい場合にはrsyncの機能を使います。

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.synced_folder "src/", "/srv/website",
  type: "rsync",
  rsync_exclude: ".git/"
end

type: “rsync”

rsyncを使う場合にはSync floderのtypeオプションに”rsync”を指定します。

type: "rsync"

srync_exclude

rsyncの同期の対象から除外したいファイルやフォルダを指定します。

rsync_exclude: ".git/"

コマンド

同期

同期を実行するにはターミナルからVagrantのrsyncコマンドを実行します。

$ vagrant rsync

自動で同期

sysnc-autoを実行すると対象のファイルを監視して変更があった場合にその都度同期を実行してくれます。

$ vagrant rsync-auto

通常のSync Folderで十分な場合が多く個人的にあまりrsyncを使う事はないのでここでは深くつっこみませんがその他にもオプションが用意されているので詳しくはVagrantのサイトを参照してみてください。
またサイトによると今のところrsncの機能はホスト => ゲストの一方通行しか実装されていないようです。
https://www.vagrantup.com/docs/synced-folders/rsync.html

Sync Foloderの注意点

Vagrantで共有ファイルを設定する際にゲストOSに既にあるディレクトリを後から共有ディレクトリに設定した場合ホストOSの内容で上書きされてしまう事があります。
そのため既にあるディレクトリを共有フォルダに設定したい場合には一旦目的のディレクトリの中身を避難させ、共有ディレクトリを設定した後にファイルを元に戻すなどの方法を行います。

$ mkdir ~/tmp
$ mv ~/guest_sync/* ~/tmp
Vagrant.configure(2) do |config|
  config.vm.synced_folder "host_sync/", "/home/vagrant/guest_sync"
end
$ vagrant reload
$ mv ~/tmp ~/guest_sync

フォルダの上書きは設定を解除すれば元に戻る場合もありますが、最悪ゲストOS側にあったファイルが消失するケースもあるようです。
そのため仮想マシンの作成時に初めから共有フォルダの設定をしておくか、一時的にファイルを避難させておくと安全に共有フォルダの設定が出来ます。

あとがき

仮想マシンをWebアプリなどの開発環境として使う場合テキストエディタなどは使い慣れたものを使いたいのでコードはホスト側で書いているのですが、折角の仮想マシンで書いたコードを一々FTPなどで送るのは面倒なので共有フォルダの機能を使っています。
Vagrantを使うと共有フォルダの設定やON|OFFを簡単に切り替えられるので個人的にホストネームなどと同様に必須の機能です