本書が提供している開発環境はとてもよく出来ていて、しかも本書のとおりに作っておけばあとは「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の中にだけ、作成する、ということも可能な気がします。
次回、ちょっとチャレンジしてみたいと思います。