Windowsユーザのための Vagrant 入門 [利用編:ローカルファイルの同期]

# Windowsユーザのための Vagrant 入門 [利用編:ローカルファイルの同期]
## 目的
* Windows ユーザにも Unix ユーザ同様に vagrant を利用してもらいたい
  * Unix ユーザの方で CentOS Box を使う場合も、PowerShell 部分を読み替えて頂くだけで大丈夫かと思います

## 前提条件
* Windows 10 Pro VM 上で作業しています
* Windows 上のシェルは PowerShell を利用しています
  * PowerShell のプロンプトは PS> と表記します
* Box は CentOS 7
* その他は前記事[環境構築編]を参照ねがいます http://qiita.com/hirofumihida/items/3c75d45f0e6178d49aa1

## 前回のおさらい
* Windows 上で vagrant 環境の構築はできたでしょうか?
  * [環境構築編] http://qiita.com/hirofumihida/items/3c75d45f0e6178d49aa1
* まずは作業前に yum update をして reboot しておきましょう

```shell-session
PS> cd <path-to-target-vagrant-folder>
PS> vagrant ssh
$ sudo yum -y update
$ exit
PS> vagrant reload
```

## 今回やること
* vagrant の特徴的な使い方を紹介していこうと思います

## ローカルファイルの共有

ref. https://www.vagrantup.com/docs/getting-started/synced_folders.html
ref. https://www.virtualbox.org/manual/ch04.html
ref. https://wiki.centos.org/HowTos/Virtualization/VirtualBox/CentOSguest
ref. http://unix.stackexchange.com/questions/18435/how-to-install-virtualbox-guest-additions-on-centos-via-command-line-only
ref. https://forums.virtualbox.org/viewtopic.php?f=3&t=66317

1) ローカルファイルの共有には Guest VM 上に vboxguest モジュールが必要です

* 入ってるかどうか確認してみましょう

```shell-session
$ lsmod | grep ^vbox
```
* プロンプトがそのまま戻ってきた場合は対象モジュールがインストールされていません
* インストールされている場合は以下のような出力が得られます

```shell-session
vboxsf                 43798  1 
vboxguest             249035  2 vboxsf
```

2) vboxguest モジュールをインストールする(準備編)

* モジュールをインストールするには VM に仮想光学デバイスが必要になります
* 一旦 VM を停止させて光学デバイスを追加しましょう

```shell-session
PS> vagrant halt
```

* 左ペインで対象 VM を選択していることを確認し、右ペインから Storage をクリックします
![Screenshot 2016-03-17 23.27.00.png](https://qiita-image-store.s3.amazonaws.com/0/67892/b9c25d8c-f654-bda6-37c2-cb3d28dfff80.png)

* 中ペインの下に並んでいるアイコンから、いちばん左の Adds new storage attachment をクリックし、Add Optical Drive を選択します
![Screenshot 2016-03-17 23.27.18.png](https://qiita-image-store.s3.amazonaws.com/0/67892/e5d61769-f5d1-ad58-6f84-fc9b5c44ed1c.png)
![Screenshot 2016-03-17 23.27.32.png](https://qiita-image-store.s3.amazonaws.com/0/67892/b7e3f5a4-dcca-39b6-3ab3-2a7e83fd13d9.png)

* 空のままにするか、何かファイルをマウントするか聞かれますので今回は空のまま(Leave empty) をクリックします
![Screenshot 2016-03-17 23.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/67892/043edab9-a48d-ad87-25da-6451371a92fd.png)

* これで空の状態の仮想光学デバイスができました
![Screenshot 2016-03-17 23.28.03.png](https://qiita-image-store.s3.amazonaws.com/0/67892/e7b11827-3542-d844-ffa8-535e169a46d2.png)

* OK を押して Settings 画面を閉じます
* では起動させましょう

```shell-session
PS> vagrant up
```

* ではインストールと行きたいところですがもう少し事前にいくつか必要です

```shell-session
PS> vagrant ssh
$ sudo yum -y update
$ sudo yum -y install kernel-devel gcc bzip2
$ exit
PS> vagrant reload
```

3) vboxguest モジュールをインストールする(本編)

* まずは VirtualBox 上の対象 VM で Devices メニューを表示する必要があるのですが、vagrant から起動した場合は Devices メニューが見えません
* コンソール画面を表示すると Devices メニューが表示されるので、左ペインの VM を選択して Show ボタンを押して下さい
![Screenshot 2016-03-17 23.17.12.png](https://qiita-image-store.s3.amazonaws.com/0/67892/86f250fa-7f26-dee4-b907-4c1e19e8b0f6.png)

* コンソール画面が表示されて Devices メニューも見えていると思います
![Screenshot 2016-03-17 23.19.17.png](https://qiita-image-store.s3.amazonaws.com/0/67892/c7f15493-c1a4-bd56-7636-ca824029a0b2.png)

* Devices メニューから Insert Guest Additions CD Image… を選択します
![Screenshot 2016-03-17 23.21.20.png](https://qiita-image-store.s3.amazonaws.com/0/67892/76e4f0f3-9113-8164-5954-7ab60b7379dc.png)
* エラー画面などが表示されなければ VM 上にマウントされているはずです
* では VM にログインして root になってください

```shell-session
PS> vagrant ssh
```

* CD メディアを OS にマウントします

```shell-session
$ sudo mkdir -p /media/cdrom
$ sudo mount -t iso9660 /dev/sr0 /media/cdrom
$ df -k /media/cdrom
```

![Screenshot 2016-03-17 23.48.09.png](https://qiita-image-store.s3.amazonaws.com/0/67892/b805dbb2-c12f-adb6-acbe-3689ac8316ae.png)

* Guest Additions をインストールします

```shell-session
$ sudo su -
# sh /media/cdrom/VBoxLinuxAdditions.run
```

* プロンプトが戻ってきたらモジュールがインストールされたかどうか確認してみましょう

```shell-session
# lsmod | grep ^vbox
```

* vboxvideo, vboxfs, vboxguest が表示されていれば成功です
![Screenshot 2016-03-18 01.26.04.png](https://qiita-image-store.s3.amazonaws.com/0/67892/5aea41a8-28d2-c33c-48bb-47593d268bbf.png)

* 一旦停止させます

```shell-session
# exit
$ exit
PS> vagrant halt
```

4) 設定ファイルの編集

* ローカルにある設定ファイル Vagrantfile を編集します

```shell-session
PS> notepad.exe Vagrantfile
```

* 40行目あたりにある config.vm.synced_folder 設定を変更します
* 変更前

```shell-session
    40	  # config.vm.synced_folder "../data", "/vagrant_data"
```
* 変更後

```shell-session
    40	  # config.vm.synced_folder "../data", "/vagrant_data"
    41	  config.vm.synced_folder ".", "/vagrant_data"
```

* これでローカルの Vagrantfile があるフォルダと VM 上の /vagrant_data フォルダが同期されるはずです

5) 動作確認

* Vagrantfile を保存したら VM を起動します

```shell-session
PS> vagrant up
```

* Guest Additions のインストールが成功している場合、実は vagrant up, reload 時の起動画面にも変化が見られるはずです
* インストール前
![Screenshot 2016-03-18 00.37.33.png](https://qiita-image-store.s3.amazonaws.com/0/67892/db6cafba-5c45-6e3c-1a27-f7c084a40eb5.png)

* インストール後
![Screenshot 2016-03-18 00.35.41.png](https://qiita-image-store.s3.amazonaws.com/0/67892/f18cdbce-d9ac-28b3-b07f-8d5b1fc4b263.png)

* プロンプトが戻ってきたらログインして同期フォルダへ移動しましょう

```shell-session
PS> vagrant ssh
$ cd /vagrant_data
$ ls -l
```

* Vagrantfile ファイルが見えていると思います
* では Windows 上の Vagrantfile があるフォルダでファイルを作ってみましょう
* (. から始まる隠しフォルダを除いては)ローカル側もまだ Vagrantfile のみのはずです

```shell-session
PS> gci
```
* ファイルを作ります

```shell-session
PS> ni hoge.txt -Type file
```

* VM 上で /vagrant_data フォルダを見てみましょう

```shell-session
$ ls -l /vagrant_data
```

* hoge.txt はありましたか?
* 次に VM 上でファイルを作って、ローカルを見てみましょう

```shell-session
$ touch /vagrant_data/fuga.txt
$ ls -l /vagrant_data
```
```shell-session
PS> gci
```

* ローカルに fuga.txt はありましたか?

## ローカルファイルの共有については以上で完了です