ツテなしフリーランス日誌

ツテが全く無いまま会社を辞め、我が道を行くフリーランスエンジニアのブログです



vagrant up Too many open files - getcwd (Errno::EMFILE) を回避する方法

Vagrantを使って開発をしていると、下記のようなエラーが起きてしまいました。

/opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/safe_chdir.rb:25:in `chdir': Too many open files - getcwd (Errno::EMFILE)
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/safe_chdir.rb:25:in `block in safe_chdir'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/safe_chdir.rb:24:in `synchronize'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/safe_chdir.rb:24:in `safe_chdir'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/subprocess.rb:121:in `execute'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/subprocess.rb:22:in `execute'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/base.rb:430:in `block in raw'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/busy.rb:19:in `busy'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/base.rb:429:in `raw'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/base.rb:367:in `block in execute'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/util/retryable.rb:17:in `retryable'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/base.rb:362:in `execute'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/driver/version_5_0.rb:548:in `read_state'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/plugins/providers/virtualbox/provider.rb:97:in `state'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/machine.rb:501:in `state'
    from /opt/vagrant/embedded/gems/gems/vagrant-1.8.1/lib/vagrant/action/builtin/wait_for_communicator.rb:26:in `block in call'

このエラーの原因は、オープンされたファイルディスクリプタ数が足りないために起きてしまいます。
例えば、私のMac OSX の場合、

user:~ $ ulimit -n
256

と少ない事が分かります。なので、オープンされたファイルディスクリプタ数の上限をあげるよう設定します。

user:~ $ ulimit -n 1024

この後、vagrant up とすると、正常に起動できます。

エラーが出た時は、試してみてください。