在Mac OS X上无法在没有sudo权限的情况下安装vagrant插件

3

我之前在 vagrant 中安装过插件。现在在另一台 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

有一点不同的是,由于我的本地SSD空间紧张,我已经在我的.bashrc文件中定义了以下内容:

export VAGRANT_HOME=/Volumes/Passport/vagrant.d

所以我的盒子文件存储在一个2TB的USB3驱动器上,而不是占用宝贵的SSD空间。

现在我可以使用sudo执行插件安装,但这会成为一个级联问题,因为vagrant up现在无法在Vagrantfile中看到该插件,除非执行sudo vagrant up。然后VM被root拥有...你可以看到这如何失控。

有人知道出了什么问题吗?我该如何解决?

编辑:我发现如果我将VAGRANT_HOME更改回默认值~/.vagrant.d,我就可以安装插件 - 但我的盒子现在位于默认设置无法访问的卷上。显然这是Ruby的限制。

TIA!

2个回答

4

好的,我找到了这个问题所在,但是不确定谁负责修复这个问题——我想这是OS X上Ruby bug的问题(至少是Vagrant内嵌版本的问题)。

事实证明,Dir.mktmpdir期望$TMPDIR变量具有sticky bit设置。 在OS X上,$TMPDIR变量指向每个用户唯一的目录,例如:

/var/folders/yl/y9zbwwm951v3x6p62yn24ckw0000gn/T

使用以下方法更改粘滞位:

chmod +t $TMPDIR

或者更恰当的说
chmod 700 $TMPDIR

解决这个问题。

注意:我不确定为什么我的$TMPDIR获得了777权限,我检查了其他的OS X 10.10安装程序,发现$TMPDIR正确地具有700权限。


我在Sierra上遇到了这个错误,这个解决方案解决了问题,谢谢! - Simon Walker

0

我怀疑 /Volumes/Passport 的权限可能有问题。你可以尝试:

> sudo chown -R `whoami` /Volumes/Passport
> sudo chmod 755 /Volumes/Passport

然后重试您的安装。


好的想法,但那不是问题所在。我的权限没问题。我越学习,发现这与 Ruby 有关,因为它无法跨卷编译 gem(这似乎非常奇怪),这导致 Vagrant 作者做出了一个糟糕的设计决策,即没有为将盒子存档到外部卷创建单独的变量。 - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接