読者です 読者をやめる 読者になる 読者になる

Vagrant上のCentOSでhttpd.confをVagrant共有ディレクトリのシンボリックリンクにしているとOSブート時にhttpdが自動起動しない #vagrant #apache

これはApacheに関わらず、Vagrant共有ディレクトリにサービス起動に必要なファイルを配置している場合に発生する現象です。 解決方法を考えてみましたが、起動スクリプトを変更するという微妙な方法になりました。 どなたか良い解決方法をご存知なら教えていただきたいです。

現象

以下再現手順。

$ vagrant ssh

Apacheインストール
[vagrant@localhost ~]$ sudo yum -y install httpd

自動起動ON
[vagrant@localhost ~]$ sudo chkconfig add httpd
[vagrant@localhost ~]$ exit

OS再起動
$ vagrant reload

自動起動確認OK
$ vagrant ssh
[vagrant@localhost ~]$ ps -ef | grep httpd
root      1614     1  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1616  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1617  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1618  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1619  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1620  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1621  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1622  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
apache    1623  1614  0 02:56 ?        00:00:00 /usr/sbin/httpd
vagrant   1625  1590  0 02:56 pts/0    00:00:00 grep httpd

/etc/httpd/conf/httpd.confを/vagrant/httpd.confのシンボリックリンクに変更
[vagrant@localhost ~]$ cp /etc/httpd/conf/httpd.conf /vagrant/.
[vagrant@localhost ~]$ sudo rm /etc/httpd/conf/httpd.conf
[vagrant@localhost ~]$ sudo ln -s /vagrant/httpd.conf /etc/httpd/conf/.
[vagrant@localhost ~]$ exit

OS再起動
$ vagrant reload

自動起動していない
$ vagrant ssh
[vagrant@localhost ~]$ ps -ef | grep httpd
vagrant   1647  1590  0 03:01 pts/0    00:00:00 grep httpd

起動コマンドで普通に起動する
[vagrant@localhost ~]$ sudo service httpd start
                                                           [  OK  ]

原因

これは、/etc/init.dの起動スクリプトが実行されるタイミングで/vagrantディレクトリがマウントされていないことが原因です。 その時点で必要なファイルが存在しないため、起動でエラーになってしまっています。

対策

起動スクリプトからVagrant共有ディレクトリのマウント状態をチェックするスクリプトを実行することで解決しました。

1. スクリプトの作成

[vagrant@localhost ~]$ sudo vi /usr/local/bin/vagrant-mount-checker
#!/bin/sh
check_vagrant_mount() {
  local prog=$1;
  for ((i = 1; i <= 6; i++))
  do
      [ -f /vagrant/Vagrantfile ] && return 0
      sleep 5
  done

  /usr/bin/logger -t vagrant-mount-checker "$prog couldn't start, because the vagrant shared directory didn't mount."
  return 1
}


2.起動スクリプトを編集

[vagrant@localhost ~]$ sudo vi /etc/init.d/httpd
~
#以下を処理の最初に追加
. /usr/local/bin/vagrant-mount-checker
check_vagrant_mount `basename $0`|| exit 1
~