タグ: VirtualBox
Vagrantで起動したゲストOSを停止した後、再度起動させようとすると共有ディレクトリのマウントで「Failed to mount folders in Linux guest.」エラーが発生する
症状
Vagrantfileがあるディレクトリを/vagrantにマウントされるBoxを使用して、vagrant up
↓
作業ののち、vagrant haltで停止
↓
vagrant upで再度起動すると、
==> default: Mounting shared folders... default: /vagrant => D:/Users/hogehoge/vagrant/
のあたりでしばらく止まり
Failed to mount folders in Linux guest. This is usually because the "vboxsf" file system is not available. Please verify that the guest additions are properly installed in the guest and can work properly. The command attempted was: mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3`,dmode=777,fmode=777 vagrant / vagrant mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant`,dmode=777,fmode=777 vagrant /vagrant The error output from the last command was: stdin: is not a tty /sbin/mount.vboxsf: mounting failed with the error: No such device
が出力されて終了する。
原因&解決方法
プロビジョンでパッケージのアップデートを行った際、カーネルもアップデートされたため、VitualBox GuestAdditionをインストールした際の変更がリセットされた。そこで、vagrant-vbguestプラグインを使用して、VitualBox GuestAdditionを再度適用させる。
参考
Windows + VirtualBox 5.0 + Vagrant 1.7.3 でvagrant up時にエラー
上記組み合わせで、vagrant upすると
chown: changing ownership of /vagrant: Not a directory
というエラーで止まってしまいます。
Unable to mount /vagrant folder in 1.7.3 · Issue #5933 · mitchellh/vagrant
より、Vagrant 1.7.4で修正されるようですが、1.7.3を使う場合、
https://github.com/mitchellh/vagrant/issues/5933#issuecomment-120951432 に書かれているように、
C:\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.7.3\plugins\providers\virtualbox\driver\version_5_0.rbを
のようにコメントアウトすることで、一時的に回避できました。
参考
cookbook-anyenvのCentOS7対応とグローバルインストール対応
koba04/cookbooks-anyenvはVagrant+Chefで利用した際、/home/vagrant以下にanyenvをインストールし、anyenvからrbenvなどの*envをインストール、さらにperl,ruby,nodejs,python,phpをインストールしてくれるものです。
レシピ内の依存パッケージがdebianのものになっていてCentOSではインストール時にエラーになり、またanyenvのインストール先を/opt/以下にしたかったため、いくつか変更しました。
変更点
- CentOSにインストールできるように依存パッケージを追加
- /home/vagrant以下にインストールするモードと/opt以下にインストールするモードを切り替えられるように
- プログラミング言語処理系のインストールをせず、明示的に指定するようにした。(デフォルトでは*envはインストールするが、それらを使ってperlなどはインストールしない)
変更したもの: mistymagich/cookbooks-anyenv
デモ: mistymagich/cookbooks-anyenv-demo
nginx cookbookのpassengerレシピのCentOS7対応
nginxのcookbookである miketheman/nginx にはpassengerをモジュールとして追加できるレシピがあります。
そこで、CentOS7上で利用するために、attributeの node[nginx][repo_source] を passenger に node[‘nginx’][‘install_method’] を package に設定してインストールしようとしたところ、
if platform_family?('rhel') if node['nginx']['repo_source'] == 'epel' include_recipe 'yum-epel' elsif node['nginx']['repo_source'] == 'nginx' include_recipe 'nginx::repo' package_install_opts = '--disablerepo=* --enablerepo=nginx' elsif node['nginx']['repo_source'].to_s.empty? log "node['nginx']['repo_source'] was not set, no additional yum repositories will be installed." do level :debug end else fail ArgumentError, "Unknown value '#{node['nginx']['repo_source']}' was passed to the nginx cookbook." end
としてrepo_source==passengerの選択肢はなく、
case node['platform_family'] when 'rhel', 'fedora' log 'There is not official phusion passenger repo for redhat based systems.' do level :info end
とあり、パッケージリポジトリがない。
また、readme.mdには
Basic configuration to use the official Phusion Passenger repositories:
–node['nginx']['repo_source']
– ‘passenger’
–node['nginx']['package_name']
– ‘nginx-extras’
–node['nginx']['passenger']['install_method']
– ‘package’
とあるが、nginx-extras はCentOSのパッケージにはないため、インストールができない。
一方、PHUSION Passengerの公式ドキュメントには
We provide an official Phusion Passenger YUM repository with packages for Red Hat Enterprise Linux and CentOS.
とあり、パッケージリポジトリが用意されている。そこで、これをrepo_passenger.rbに組み込み、passengerモジュールをインストールする
変更ファイル
- recipes/package.rb
プラットフォームファミリーがrhelの場合にrepo_source==’passenger’の選択肢を増やす - recipes/repo_passenger.rb
RHEL,CentOS用のリポジトリファイルを/etc/yum.repos.dにおいて、キャッシュを更新する - attributes/passenger.rb
/etc/nginx/conf.d/passenger.confにあるpassenger_rootの値が違っていたため、プラットフォームファミリーがrhelの場合の時だけ変更する
オリジナルからの変更点一覧: https://github.com/mistymagich/nginx/commit/6327617a066cb09e60703b8dac17fe4c746dc15b?diff=unified
miketheman/nginxをforkして、上記変更を適用したものをmistymagic/nginxに置きました。
またそれを使ってインストールしたpassengerに対して、PHUSION Passengerの公式ドキュメントにあるデモをVagrant+Chefの組み合わせで動かしたデモをmistymagich/nginx-passenger-on-CentOS7-demo
に置きました。
Dockerで作るPHPの実行環境サンプル
ファイル一式: https://github.com/mistymagich/vagrant-docker-php
php,nginx,mysqlのコンテナを動かして、PHPを実行させるサンプル環境です。
vagrantとvirtualboxもしくはdockerがインストールされているlinuxから起動できます。
必要なもの
- Vagrantを使う方式
- VirtualBox
- Vagrant
- Vagrantプラグイン
- Vagrant Host Manager
vagrant plugin install vagrant-hostmanager
- Vagrant Host Manager
- Dockerから起動する方式
- DockerがインストールされたLinux
バージョン 1.5.0 以上
- DockerがインストールされたLinux
セットアップ
- Vagrantを使う方式
> git clone https://github.com/mistymagich/vagrant-docker-php.git > cd vagrant-docker-php > vagrant up
CoreOSが立ち上がるので、PuTTYなどでSSHでログインする (接続先は vagrant ssh-configで確認)
$ cd /vagrant $ /vagrant/docker-build.sh
- Dockerから起動する方式
$ git clone https://github.com/mistymagich/vagrant-docker-php.git $ cd vagrant-docker-php $ chmod +x *.sh $ sudo ./docker-build.sh $ sudo echo '127.0.0.1 sandbox.local' >> /etc/hosts
Ubuntu/Debianでdockerコマンドが docker.io1 になっている場合、docker-build.sh、docker-run.shの
DOCKER=docker
を
DOCKER=docker.io
に変更したのち実行する。
起動
$ sudo ./docker-run.sh
正常に起動できれば、ブラウザで
http://sandbox.local
でアクセスするとPHPInfoが表示されます。
MySQLコンテナとの接続サンプルは
http://sandbox.local/dbconnect.php
にあります。
構造
Nginxコンテナ
コンテナ名:sandbox-nginx
公式Nginxコンテナをもとに、ホスト名sandbox.localに対して、PHPコンテナを参照する設定追加しています。
ドキュメントルートはsrc/public
拡張子がPHPならPHPコンテナにあるPHP-FPMを通して実行されます。
MySQLコンテナ
コンテナ名:sandbox-mysql
公式MySQLコンテナをそのまま利用しています。
データの永続化はしていません。
docker-run.sh実行時にsrcディレクトリにあるinit.sqlを実行することで、データベース・テーブル・データのインポートを行っています。
sanbox.localに対して3306にアクセスすることでMySQLコンテナにアクセスできます。
ユーザー名はroot、パスワードはdocker-run.shでMySQLコンテナ起動時にMYSQL_ROOT_PASSWORDで指定している値です。(編集していない場合、mysecretpw)
PHP(FPM)コンテナ
コンテナ名:sandbox-php
公式PHPコンテナのFPMをもとに、以下のモジュールを追加しています。
- pdo
- pdo_mysql
- gd
- mysqli
- mcrypt
- mbstring
- iconv
関係図
PHP(FPM)コンテナはホスト名mysqlでMySQLコンテナにアクセスできます。
Nginxコンテナはホスト名phpでPHP(FPM)コンテナを参照しています。
PHPMyAdminを動かすサンプル
- PHPMyAdminをダウンロード
- 解凍して、中にあるPHPファイルをsrc/publicにコピー(すでにあるファイルは削除する)
- config.sample.incをconfig.incにリネーム
- config.incを編集
ホスト名を変更
/* Authentication type */ $cfg['Servers'][$i]['auth_type'] = 'cookie'; /* Server parameters */ -$cfg['Servers'][$i]['host'] = 'localhost'; +$cfg['Servers'][$i]['host'] = 'mysql'; $cfg['Servers'][$i]['connect_type'] = 'tcp';
末尾に追加
$cfg['CheckConfigurationPermissions'] = false;
- http://sandbox.localにアクセス
- ID:root / PW:mysecretpw (docker-run.shのMySQLコンテナ起動時のMYSQL_ROOT_PASSWORDで指定している値)
その他
- docker-run.sh実行時にすべてのコンテナを削除します。
- コンテナが正常に動かない場合、docker ps -aでコンテナIDを調べ、docker logs コンテナID で原因となるメッセージが出力されることがあります。
- Ubuntu/Debianの場合、dockerコマンドがdocker.ioになっているため、いまさら聞けないDocker入門(2):ついに1.0がリリース! Dockerのインストールと主なコマンドの使い方 (1/3) – @ITにあるようにしてdockerコマンドを利用できるようにする方法もあります。 ↩
OpenAMをVirtualBox(Vagrant&Docker)で動かす
OpenAMを試用用途でVirtualBox上で動かすため、VagrantとDockerを使ったファイル一式です。
ファイル一式はこちらから
必要なもの
- ホストの空きメモリ2GB (Vagrantfile内のv.memoryにして指定)
- VirtualBox
- Vagrant
- Vagrant Host Manager
vagrant plugin install vagrant-hostmanager - Vagrant WinNFSd (ホストがWindowsのとき)
vagrant plugin install vagrant-winnfsd
注意事項
- ファイル類はコンテナ内に保存(/root/openam)されるため、コンテナを停止すると消えます。Vagrantfile内のd.runのargsに-v(Data Volume)や–volumes-from(Data Volume Container) を追加することで永続化ができます
- cloneする際、ホストがWindowsの場合フォルダ名に「-」(ハイフン)を含めないようにしてください。NFSマウント時にエラーになります。
Windows上でcoreos-vagrantとsynced_folder
Windows+VirtualBoxでCoreOSをVagrantを使って起動した際、ホスト側のフォルダを共有フォルダでゲスト側にリンクさせる。
config.rb.sampleをconfig.rbに変更し
#$share_home=false
を
$share_home=true
にしてvagrant upをすると、
> vagrant up Bringing machine 'core-01' up with 'virtualbox' provider... ==> core-01: Importing base box 'coreos-alpha'... ==> core-01: Matching MAC address for NAT networking... ==> core-01: Checking if box 'coreos-alpha' is up to date... ==> core-01: Setting the name of the VM: coreos-vagrant_core-01_1425462114328_13396 No synced folder implementation is available for your synced folders! Please consult the documentation to learn why this may be the case. You may force a synced folder implementation by specifying a "type:" option for the synced folders. Available synced folder implementations are listed below. docker, nfs, rsync, smb, virtualbox
となってしまい、CoreOSが起動しない。そこで、Windows上でNFSが扱えるvagrant-winnfsdプラグインをインストールする。
> vagrant plugin install vagrant-winnfsd
> vagrant up Bringing machine 'core-01' up with 'virtualbox' provider... ==> core-01: Importing base box 'coreos-alpha'... ==> core-01: Matching MAC address for NAT networking... ==> core-01: Checking if box 'coreos-alpha' is up to date... ==> core-01: Setting the name of the VM: coreos-vagrant_core-01_1425462958797_25829 ==> core-01: Clearing any previously set network interfaces... ==> core-01: Preparing network interfaces based on configuration... core-01: Adapter 1: nat core-01: Adapter 2: hostonly ==> core-01: Forwarding ports... core-01: 22 => 2222 (adapter 1) ==> core-01: Running 'pre-boot' VM customizations... ==> core-01: Booting VM... ==> core-01: Waiting for machine to boot. This may take a few minutes... core-01: SSH address: 127.0.0.1:2222 core-01: SSH username: core core-01: SSH auth method: private key core-01: Warning: Connection timeout. Retrying... ==> core-01: Machine booted and ready! ==> core-01: Setting hostname... ==> core-01: Configuring and enabling network interfaces... ==> core-01: Exporting NFS shared folders... ==> core-01: Preparing to edit nfs mounting file. [NFS] Status: halted [NFS] Start: started ==> core-01: Mounting NFS shared folders...
CoreOSにログインすると
core@core-01 ~ $ ls C: core@core-01 ~ $ mount : : 172.17.8.1:/C/Users/XXXXX on /home/core/C:/Users/XXXXX type nfs (rw,relatime,vers=3,rsize=32768,wsize=4096,namlen=255,hard,nolock,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=172.17.8.1,mountvers=3,mountport=1058,mountproto=udp,local_lock=all,addr=172.17.8.1)
となり、ホームディレクトリ同士がリンクされています。どちらかでファイルを変更するともう片方に反映されます。あとは必要に応じて、config.rbの$shared_foldersに設定を追加していきます。
ただし、ゲストOS上で、シンボリックリンクやソケットファイルなどの特殊なファイルを作成しようとするとエラーになります。
core@core-01 ~/C:/Users/XXXXX $ touch aaa core@core-01 ~/C:/Users/XXXXX $ ln -s aaa bbb ln: failed to create symbolic link 'bbb': Input/output error
検証環境
- VirtualBox
- 4.3.22
- ホストOS
- Windows 8.1 64ビット版
- Vagrant
- 1.7.2