Vagrantの共有フォルダ設定 (Synced Folder)


前回vagrantの基本機能について記事を書きましたが
今回は拡張機能で出来る共有フォルダ設定について記事を書きます。


# 共有フォルダ（Synced Folder）とは

ホストOSとゲストOSとでファイル共有出来るようにする機能です。
例えばホストOS「PC_A」にて「/Users/test/」というフォルダと
ゲストOS「VM_B」の「/var/www/」というディレクトリをファイル共有設定していた場合

「PC_A」の「C:\Users\test\」配下にファイル「README」を作成すると
共有フォルダ設定をした「VM_B」の「/var/www/」配下にも同じ「README」が作成されるといった感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576311/5c07e31d-ff4a-9cda-7049-19d9f194eb8d.png)


# 前提

ホストOSにvagrantがインストールされていることが条件です。
まだの方は以下参照
[Vagrantを利用してLinux検証環境を構築](https://qiita.com/hamusun47/items/d8e567a850be2b0bf1ac)


# 実際の手順

## 1.プラグインのインストール
まずこの機能を使うにはプラグインをインストールしないといけません。
以下コマンドでホストOSにインストールします。

```
vagrant plugin install vagrant-vbguest
```

## 2.Vagrantfileの編集

Vagrantfileを以下に編集します。

```:Vagrantfile
Vagrant.configure("2") do |config|

  config.vm.define "vm1" do |vm1|
    vm1.vm.box = "bento/amazonlinux-2"
    vm1.vm.hostname = "testB"
    vm1.vm.network "private_network", ip: "192.168.50.4"
    vm1.vm.synced_folder "./test", "/var/www", owner: 'vagrant', group: 'vagrant'
  end

end
```

configの補足説明をしますと
今回の共有フォルダ設定はVagrantfileの以下です。

```
vm1.vm.synced_folder "./test", "/var/www", owner: 'vagrant', group: 'vagrant'
```

 ["./test"]の部分がホストOS側のディレクトリです。
 今回私は相対パスで[./]と記載しましたが、実行するVagrantファイルが配置されているディレクトリがカレントディレクトリとなります。
 私の場合は以下階層でした。
 
```
$ pwd
/c/Users/yuuuk/
$ ls -l
-rw-r--r-- 1 yuuuk 197121 320 Aug 21 14:01 Vagrantfile
drwxr-xr-x 1 yuuuk 197121   0 Aug 21 14:04 test/

``` 


## 3.vagrant upの実行

あとは設定反映させるためにvagrant upコマンドを実行します。

```
vagrant up vm1
```
## 4. vagrant up後のLogの確認


vagrant upするとログが吐き出されますが、一部errorがあったようです。
気になったログとしては以下2点です。
+ １つ目のエラー
```
VirtualBox Guest Additions: Setting up modules
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel 
modules.  This may take a while.
VirtualBox Guest Additions: To build modules for other installed kernels, run
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup <version>
VirtualBox Guest Additions: or
VirtualBox Guest Additions:   /sbin/rcvboxadd quicksetup all
VirtualBox Guest Additions: Kernel headers not found for target kernel
4.14.336-257.568.amzn2.x86_64. Please install them and execute
  /sbin/rcvboxadd setup
```
上記エラーログはVirtualBox Guest Additionsモジュールをセットアップしようとするとカーネルヘッダが見つからないということを意味しているようです。

このカーネルヘッダとはLinuxカーネルのソースコードの一部で、カーネル内部構造や機能を定義するヘッダファイルのことで、カーネルが提供する関数やデータ構造の定義が含まれており、モジュールやドライバはこれを参照して正しく動作します。
カーネルバージョンに対応したヘッダファイルが必要ですが、今回ゲストではそのヘッダファイルが見つからないと言っていると理解しました。

またVirtualBox Guest AdditionsとはVirtualBoxの操作性を向上させるためのモジュールのようです。

+ 2つ目のエラー
```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
```
上記エラーログはvboxsfが利用できないため、共有フォルダのマウントに失敗していることを示しているようです。
vboxsfはVirtualBox Guest Additionsに含まれているモジュールなので１つ目のエラーに依存していそうです。

## 5.エラーログの対策及び、ゲスト側に共有フォルダに必要なセットアップをする

エラーログを読むと以下２つの対策が必要と解釈しました。

1\. カーネルヘッダをインストール
2\. Guest Additionsの再インストール

### ①カーネルヘッダをゲストOSにインストール

ゲストOSにvagrant ssh して以下コマンドでインストールします

```
sudo yum install -y kernel-devel-$(uname -r)
```

### ②Guest Additionsの再インストール
を確認
ゲストOSで以下コマンドを実行してGuest Additionsをインストールします。

```
sudo /sbin/rcvboxadd setup
```

### ③ホストOSに戻りvagrant reload

```
vagrant reload vm1
```

vagrantのログを見ると先ほどのエラーが無くなりました。
ログ中の以下部分が共有フォルダ設定が行われている処理だと思われます。

```
==> vm1: Mounting shared folders...
    vm1: /vagrant => C:/Users/yuuuk
    vm1: /var/www => C:/Users/yuuuk/test

```

では最後に設定が正常に有効になっているか確認します。


## 6.正常性確認
ホストOSでtestファイルを作成してみて、ゲストOSログイン後に同じファイルがゲストOS側にもあれば設定の確認が出来そうです。

### ①ホスト側で共有フォルダ設定したディレクトリでファイル作成
```
cd test
vim README
```

中身は何でもよいので、適当にhogehogeと入力しました。

### ②ゲストOSでファイル確認

vagrant sshでログイン後に以下を確認

```
cd /var/www/
ls -l
-rwxrwxrwx  1 vagrant vagrant    9 Aug 21 05:04 README
cat README
hogehoge

```

ホストで作成したファイルと同じ中身ですね

## 最後に

以上で終わりです。
私はvimよりvscodeでコードやconfig書く方が好きなので
ホスト側でvscodeでコードを書いて、ゲストOSのlinuxにファイル共有するということも共有フォルダ設定をしていれば可能です。