2

我有一个非常想使用 NFS 在端口 80 上启动的 Vagrant 环境。前者是因为它是 Drupal 并且非标准端口会引起一些胃灼热,而后者纯粹是为了性能。为此,据我所知,我需要使用sudo. 没问题,sudo vagrant up是的。

我遇到的问题是应用程序生成文件,大概是因为虚拟机是在 下站起来的sudo,这些文件归root主机系统(OS X)所有,所以当应用程序尝试将文件写入服务器时,权限被拒绝。

我更改了我的 Vagrant 文件以将整个项目目录设置为777. 只是为了披露,以下是我的相关(和非标准)片段Vagrantfile

config.vm.network :hostonly, "192.168.33.10"
config.vm.forward_port 80, 80
# config.vm.share_folder( "v-root", "/vagrant", ".", :nfs => (RUBY_PLATFORM =~ /mingw32/).nil?, :extra => 'dmode=777,fmode=777' )
config.vm.share_folder( "v-root", "/vagrant", ".", :extra => 'dmode=777,fmode=777' )
config.vm.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"]
Vagrant::Config.run do |config|
  config.vm.provision :shell, :path => "provision.vm.sh"
end

这是我看到的情况:

  • 当我从存储库的干净克隆启动时,没有问题。耶。
    • 但是,我确实注意到/vagrant,当从 VM 本身查看时, 的内容并没有被赋予完整的权限 ( 777)。在这些变化之前就是这种情况。
  • 当我在停止虚拟机 后启动时......
    • 无法写入生成的文件。
    • 中的文件/vagrant(同样,当从 VM 中查看时)归dialout用户所有。这似乎是 NFS 的事情,所以只要我能让第一个项目工作就没有问题。

更新

看起来问题可能是我对 NFS 工作原理的理解。我需要尝试纠正这一点,但如果我只是删除 NFS 组件(现在在上面的片段中进行了评论和替换),事情似乎更有用。仍然很想知道其他人是否/如何处理这个问题。

4

1 回答 1

1

而不是做sudo vagrant up- 这并不理想 - 我正在做以下事情:

if Vagrant::Util::Platform.windows?
    config.vm.network :forwarded_port, host: 80, guest: 8080
elsif Vagrant::Util::Platform.darwin?
    config.vm.network :forwarded_port, host: 8080, guest: 80
    config.vm.network :forwarded_port, host: 8443, guest: 443
    config.trigger.after [:provision, :up, :reload] do
      puts " ==> Sudo Password (to forward ports) "
      system('echo "
    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 80 -> 127.0.0.1 port 8080  
    rdr pass on lo0 inet proto tcp from any to 127.0.0.1 port 443 -> 127.0.0.1 port 8443  
    " | sudo pfctl -f - > /dev/null 2>&1; echo "==> Fowarding Ports: 80 -> 8080, 443 -> 8443"')  
    end
else
    config.vm.network :forwarded_port, host: 8080, guest: 80
    config.vm.network :forwarded_port, host: 8443, guest: 443
    puts " ==> Sudo Password (to forward ports) "
    system("sudo ipfw add 100 fwd 127.0.0.1,8080 tcp from any to me 80;
    sudo ipfw add 101 fwd 127.0.0.1,8443 tcp from any to me 443")
end

if Vagrant::Util::Platform.darwin?
    config.trigger.after [:halt, :destroy] do
        system("sudo pfctl -f /etc/pf.conf > /dev/null 2>&1; echo '==> Removing Port Forwarding'")
    end
end

(其中的 linux 节不如 OS X(“darwin”)节简洁,后者删除了转发的端口vagrant halt

这样做是在主机上设置端口 8080(和 8443)转发到客户机上的 80,然后使用 sudo 将主机上的端口 80 转发到主机上的端口 8080。

这意味着只有 80 端口的转发是以 root 身份完成的,而不是整个 vagrant 进程,这通常让我更开心。

注意:如果 Skype 将自身绑定到端口 80 和 443,这在台式机上仍然会失败,默认情况下会这样做。

于 2014-06-20T10:19:07.447 回答