在VirtualBox中共享文件夹用于Apache

30

我的主机是ArchLinux,我在一个CentOS虚拟机中运行Apache。我把虚拟主机配置和站点代码都放在了一个共享文件夹中。为了能够把虚拟主机配置放在共享文件夹中,我将该文件夹挂载为apache: apache。

shared    /mnt/shared    vboxsf    defaults,uid=48,gid=48  0 0

当我在主机上编辑文件时,Apache 会不断地发送带有尾随字符的旧版本文件。在 vim 中,它们显示为^@,因此我猜它们是空字符。空字符的数量与我所做的更改数量有关,即使我编辑第一行,空字符也会出现在末尾。如果我要猜测,它看起来像是错误的 diff。

如果我停止 httpdumount,卸载再挂载文件系统,然后启动 httpd,文件看起来就正常了。只是重新启动 httpd 是没有用的。

我应该如何调试挂载?在 /var/log 中没有什么引人注目的信息。


你可以将vbox的权限添加到apache2中:http://superuser.com/questions/335322/how-do-i-set-the-apache2-documentroot-to-a-vboxsf-virtualbox-shared-folder-p - user3566622
"uid=48,gid=48" 是表示用户ID和组ID的意思。这与我遇到的问题无关。 - mqsoh
可能是Vagrant/VirtualBox/Apache2奇怪的缓存行为的重复问题。 - kenorb
3个回答

53

我错了,它发生在别的地方,但我注意到只有.css和.js文件有这个问题。搜索后我找到了这篇文章,它谈到了vboxsf和小文件的问题。

解决方法是在Apache中设置:

    EnableSendfile off

这对我没用。但是,如果我在虚拟机上用vim打开文件并保存它,那么在虚拟机上保存后它就可以工作了。还有其他想法吗? - David Biehl
2
为了完整起见:在Nginx配置中,它是“sendfile off;”。 - Ramon de la Fuente

2

你是一个英雄! - H2ONOCK

1
为了回答具体问题“如何调试挂载”,在诊断问题出现在虚拟主机内的Apache读取文件方面后,我将使用“strace -p”在虚拟主机内记录Apache的系统调用。在跟踪过程中,仅请求一个截断/损坏的文件。经过仔细诊断,会发现它正确地stat该文件以获取其长度,然后使用sendfile系统调用进行传输。基本上,确认sendfile未正常工作,这意味着这必须是虚拟机中的错误。搜索“sendfile virtualbox”可导向这些错误。

https://www.virtualbox.org/ticket/9069 https://www.virtualbox.org/ticket/12597


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