Vagrant,NFS,端口80和sudo

时间:2013-03-22 12:19:16

标签: vagrant

我有一个Vagrant环境,我非常希望使用NFS在端口80上启动。前者是因为它的Drupal和非标准端口引起了一些胃灼热,后者纯粹是为了表现。要做到这一点,据我所知,我需要使用sudo。没问题,sudo vagrant up确实如此。

我遇到的问题是应用程序生成文件,并且可能是因为VM在sudo下站起来,这些文件归主机系统上的root所有(操作系统) 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

这就是我所看到的情况:

  • 当我从存储库的干净克隆启动时,没有问题。好极了。
    • 但是,我注意到从VM本身查看时/vagrant的内容没有给出完整的烫发(777)。在这些变化之前就是这种情况。
  • 暂停 VM后启动时...
    • 无法编写生成的文件。
    • /vagrant中的文件(同样,从VM中查看时)归dialout用户所有。这似乎是一个NFS的东西,所以只要我能让第一个项目工作就没问题。

更新

看起来问题可能是我对NFS如何工作的理解。我需要尝试纠正这个问题,但如果我只删除NFS组件(现在已经在上面的剪辑中注释和替换),事情似乎更有用。仍然想知道其他人是否/如何处理这个问题。

1 个答案:

答案 0 :(得分: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)以在guest虚拟机上转发到80,然后使用sudo将主机上的端口80转发到主机上的端口8080。

这意味着只有端口80转发是以root身份完成的,而不是整个流浪过程,并且通常会让我更快乐。

注意:如果skype将自己绑定到端口80和443(默认情况下这样做),这在桌面计算机上仍然会失败。

相关问题