Невозможно установить бродячие плагины без sudo на OS X
Я установил плагины ранее в vagrant. Сейчас на другом MacBook я пытаюсь установить те же плагины, которые я использовал на моем старом MacBook.
Например, когда я пытаюсь установить vagrant-hostmanager, я получаю ошибку разрешения ruby:
$ vagrant plugin install vagrant-hostmanager
Installing the 'vagrant-hostmanager' plugin. This can take a few minutes...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:
An error occurred while installing ffi (1.9.8), and Bundler cannot continue.
Make sure that `gem install ffi -v '1.9.8'` succeeds before bundling.
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/opt/vagrant/embedded/bin/ruby extconf.rb
checking for ffi.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/opt/vagrant/embedded/bin/ruby
--with-ffi_c-dir
--without-ffi_c-dir
--with-ffi_c-include
--without-ffi_c-include=${ffi_c-dir}/include
--with-ffi_c-lib
--without-ffi_c-lib=${ffi_c-dir}/
--with-libffi-config
--without-libffi-config
--with-pkg-config
--without-pkg-config
/opt/vagrant/embedded/lib/ruby/2.0.0/tmpdir.rb:92:in `mktmpdir': parent directory is world writable but not sticky (ArgumentError)
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:510:in `try_link0'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:534:in `try_link'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:427:in `have_devel?'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:433:in `try_do'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:549:in `block in try_compile'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:502:in `with_werror'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:549:in `try_compile'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:1044:in `block in have_header'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:895:in `block in checking_for'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:340:in `block (2 levels) in postpone'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:310:in `open'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:340:in `block in postpone'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:310:in `open'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:336:in `postpone'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:894:in `checking_for'
from /opt/vagrant/embedded/lib/ruby/2.0.0/mkmf.rb:1043:in `have_header'
from extconf.rb:16:in `<main>'
Gem files will remain installed in /Volumes/Passport/vagrant.d/gems/gems/ffi-1.9.8 for inspection.
Results logged to /Volumes/Passport/vagrant.d/gems/gems/ffi-1.9.8/ext/ffi_c/gem_make.out
Одна вещь, которая отличается от других, заключается в том, что, поскольку у меня мало места на моем локальном твердотельном накопителе, я определил следующее в моем.bashrc:
export VAGRANT_HOME=/Volumes/Passport/vagrant.d
Таким образом, мои файлы ящиков хранятся на USB-накопителе емкостью 2 ТБ вместо того, чтобы использовать ценное пространство на SSD.
Теперь я могу выполнить установку плагина с помощью sudo, но это становится каскадной проблемой, в этом vagrant up
теперь не может видеть плагин в Vagrantfile, не делая sudo vagrant up
, И затем виртуальная машина принадлежит root... вы можете видеть, как это выходит из-под контроля.
Кто-нибудь знает, что не так? Как я могу решить?
редактировать: я обнаружил, что если я изменю свой VAGRANT_HOME
вернуться к значению по умолчанию ~/.vagrant.d
Я могу установить плагин - однако мои ящики теперь находятся на томе, недоступном по умолчанию. По-видимому, это ограничение Ruby.
ТИА!
2 ответа
Хорошо, я нашел проблему в этом, но неясно, где лежит ответственность за исправление этой ошибки - я думаю, что это ошибка Ruby в OS X (по крайней мере для версии, встроенной в Vagrant).
Оказывается Dir.mktmpdir
ожидает, что для переменной $TMPDIR будет установлен бит закрепления. В OS X переменная $TMPDIR указывает на уникальность для каждого пользовательского каталога, например:
/var/folders/yl/y9zbwwm951v3x6p62yn24ckw0000gn/T
Изменение липкого бита с помощью
chmod +t $TMPDIR
или действительно более подходящим
chmod 700 $TMPDIR
Исправляет эту проблему.
Примечание: я не уверен, почему или как мой $TMPDIR получил разрешения 777, я проверил другие установки OS X 10.10 и обнаружил, что $TMPDIR правильно имеет 700 разрешений.
Я подозреваю, что разрешения на /Volumes/Passport могут быть странными. Вы можете попробовать:
> sudo chown -R `whoami` /Volumes/Passport
> sudo chmod 755 /Volumes/Passport
А затем повторите попытку установки.