本書が提供している開発環境はとてもよく出来ていて、しかも本書のとおりに作っておけばあとは「vagrant up」するだけで、用意が整います。

それに、サーバが動くのはVirtualBoxで、centOSであるのに、ソースはWindows内で書けるようになっています。初心者に、いきなりサーバに入ってLinuxオペレーションで作業しろというのは酷ですもんね。現時点において最良と思える環境を、初心者にも扱いやすく提供されているわけです。

しかし、この環境を提供するために、実は裏でかなり高度なことしてます。あ、いや、私にとっては高度です。その道の手練れの方から見たらどうかは知りませんよ、あくまで私見でございます。

vagrant upは、vagrantfileに記録された命令を実行します。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = 'bento/centos-6.7-i386'
  config.vm.box_url = 'https://atlas.hashicorp.com/bento/boxes/centos-6.7-i386/versions/2.2.2/providers/virtualbox.box'
  config.vm.network 'forwarded_port', guest: 80, host: 8000, host_ip: '127.0.0.1'
  config.vm.synced_folder '.', '/vagrant', disabled: true
  config.vm.synced_folder '..', '/mnt/fuelphp', mount_options: ['dmode=777', 'fmode=666']
  config.vm.provision :shell, path: 'bootstrap.sh'
end

本書で提供されているVagrantfileです。

config.vm.box

config.vm.box_url

この二つは、centOSのインストールっぽいです。

-386が付いてるのは32bitのバージョンを表しています。私のマシンが64bit版が動かなかったので。

config.vm.network

これは、portだとかip_addressだとかを決めているのは見ると分かりますよね。

さて、問題は次です。

config.vm.syncod_folderがふたつ、書かれています。

特に二つ目の

config.vm.synced_folder ‘..’, ‘/mnt/fuelphp’, mount_options: [‘dmode=777’, ‘fmode=666’]

明らかにサーバ側の/mnt/fuelphpを指しており、dmodeとfmodeはパーミッション指定しているのは分かりますが、おそらくディレクトリとファイルにそれぞれ指定しているのではないかなぁ。ちょっと調べてみましょう。

vagrant upしてPuTTYでつないで中を見てみます。

/mnt直下にあるfuelphpディレクトリは確かに777ですね。

fuelphpディレクトリに移動して、そこにあるファイルやディレクトを表示してみると、やはりディレクトリは777でファイルは666ですね。

ひとつめの

config.vm.synced_folder ‘.’, ‘/vagrant’, disabled: true

これは何してるんでしょうね。。

ググってみると、ゲストOSとホストOSの任意のフォルダを同期させられるらしいです。

ただし、disabled:trueにしてるということは同期を無効化してるということなんじゃないかな。。

そして、おそらく 「’.’」がホストOS、つまりWindows側で、ドットは今の位置を表しますから、フルで書くと

C:\donichi\fuelphp-1.7.3\vagrant

を指してると思うんですよね。

で、ゲスト側、’/vagrant’なんですけど、centOS側にそんなディレクトリないんですよね。

あったとしても、これ何してるんでしょうね。。分かりません。

一度vagrant haltして、この一行をコメントアウトして、再度立ち上げてみます。

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
  config.vm.box = 'bento/centos-6.7-i386'
  config.vm.box_url = 'https://atlas.hashicorp.com/bento/boxes/centos-6.7-i386/versions/2.2.2/providers/virtualbox.box'
  config.vm.network 'forwarded_port', guest: 80, host: 8000, host_ip: '127.0.0.1'
#  config.vm.synced_folder '.', '/vagrant', disabled: true
  config.vm.synced_folder '..', '/mnt/fuelphp', mount_options: ['dmode=777', 'fmode=666']
  config.vm.provision :shell, path: 'bootstrap.sh'
end

たぶん、#でコメントアウトじゃないですかね。

そして再び、vagrant upします。

経過を見るためにbatファイルからではなくて、手動でコマンドプロンプトからやってみます。

c:\donichi\fuelphp-1.7.3\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 => 8000 (adapter 1)
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
    default:
    default: Guest Additions Version: 5.0.6
    default: VirtualBox Version: 4.3
==> default: Mounting shared folders...
    default: /vagrant => C:/donichi/fuelphp-1.7.3/vagrant
    default: /mnt/fuelphp => C:/donichi/fuelphp-1.7.3
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.
c:\donichi\fuelphp-1.7.3\vagrant>

たいへん興味深い出力結果です。

最後の方、

==> default: Machine already provisioned. Run `vagrant provision` or use the `–provision` ==> default: to force provisioning. Provisioners marked to run always will still run.

あたりは、おそらく、bootstrap.shを動かしている関連ではないかと。

で、bootstrap.shは何をしているかというと、httpdやmysqlやphpなんかをyumでinstallしたり、Linux上にサーバとしての諸々をセットアップしているように見えます。

#!/usr/bin/env bash
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
yum install -y httpd
yum install -y mysql-server
yum install -y php
yum install -y epel-release
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
yum install -y phpMyAdmin
ln -s /mnt/fuelphp /home/vagrant/fuelphp
cp /mnt/fuelphp/vagrant/*.conf /etc/httpd/conf.d
curl get.fuelphp.com/oil | sh
sed -i 's/^#ServerName www.example.com:80$/ServerName localhost:80/' /etc/httpd/conf/httpd.conf
sed -i 's/^;date.timezone =$/date.timezone = Asia\/Tokyo/' /etc/php.ini
chkconfig httpd on
chkconfig mysqld on
service httpd start
service mysqld start
mysqladmin -u root password root

その他、細々と、設定をしてくれてます。ただ、これ、最初の一回目で動いたら、installの部分なんかは飛ばすんですかね。httpdやmysqlの起動をしたりしてるように見えます。

そうなると、気になるのはどこで、Linux側とWindows側がマウントされているのか、です。

vagrant upのログにははっきりと出てますよね。

==> default: Mounting shared folders…    

default: /vagrant => C:/donichi/fuelphp-1.7.3/vagrant    

default: /mnt/fuelphp => C:/donichi/fuelphp-1.7.3

これはいったいどこにその記述があるのか。。あったんです。

Vagrantfileがある場所に「.vagrant」というディレクトリがあります。

その中を潜っていくと。

C:\donichi\fuelphp-1.7.3\vagrant\.vagrant\machines\default\virtualbox

こげな深い場所に

このようなファイルが群れております。synced_foldersというファイルがあるので、開いてみますと、

{"virtualbox":{"/mnt/fuelphp":{"mount_options":["dmode=777","fmode=666"],"guestpath":"/mnt/fuelphp","hostpath":"C:/donichi/fuelphp-1.7.3","disabled":false},"/vagrant":{"guestpath":"/vagrant","hostpath":"C:/donichi/fuelphp-1.7.3/vagrant","disabled":false}}}

こんな記述があります。

vagrnt upで出ていたログはまさしくこの記述に則ったものに見えます。

この

.vagrant

という、頭にドットがついたファイルやディレクトリは要注意な気がします。今の時点での私の推測は、vagrant upは、この.vagrantディレクトリの下にある設定を読みに行くんじゃないでしょうか。

vagrantfileを作成するときに、同時に.vagrantフォルダが作成され、その中にマウントの情報を書いておけば、マウントされる、という動きに思えます。

ただ、この記述はVagrantfileに直接書くことも可能なように思えますが。。勝手な推測ですかね。

しかし、推測としてそんなにずれていないと思うので、これらの設定を元に、例えば

cakePHPの開発環境を、ゲストOSとホストOSの同期という形でなく、ゲストOSの中にだけ、作成する、ということも可能な気がします。

次回、ちょっとチャレンジしてみたいと思います。