我的主机是ArchLinux,我在CentOS客户端运行Apache。我有共享文件夹中的vhost配置和所有站点代码。为了能够将vhost配置放在共享文件夹中,我将共享文件夹挂载为apache:apache。
shared /mnt/shared vboxsf defaults,uid=48,gid=48 0 0
当我在主机中编辑文件时,Apache会一直开始发送带有尾随字符的旧版本文件。在vim中,它们显示为^ @,所以我猜它们是空字符。即使我编辑第一行,空字符的数量也与我所做的更改数量有关,最后显示空字符。如果我推测,它看起来像是一个糟糕的差异。
如果我停止httpd
,umount
,重新安装,并启动httpd
,该文件就可以了。只是重新启动httpd无济于事。
我如何调试挂载?在/var/log
中没有任何事情发生在我身上。
答案 0 :(得分:53)
我错了;它发生在其他地方,但我注意到它只有.css和.js文件。搜索引导我this post,它讨论了vboxsf和小文件的问题。
解决方案是在Apache中设置
EnableSendfile off
答案 1 :(得分:2)
在lighttpd
上解决方法是将以下行添加到lighttpd.conf
server.network-backend = "writev"
请参阅:Lighttpd broken when serving from Virtualbox shared folder
答案 2 :(得分:1)
要回答具体问题"我该如何调试mount":
(以下是释义,基于我刚刚对Virtualbox中的相同错误导致的问题进行的调查,但使用不同的Web服务器)
在诊断出问题发生在Apache如何读取虚拟主机内的文件之后,我会使用" strace -p"在虚拟主机内部,用于记录Apache的系统调用。
在stracing时,只请求一个截断/损坏的文件。
仔细诊断会发现它正确统计文件以获取其长度。然后它使用sendfile系统调用来提供它。基本上确认sendfile是行为不端的,这意味着它必须是虚拟机中的错误。
搜索" sendfile virtualbox"带你到这些错误。
https://www.virtualbox.org/ticket/9069 https://www.virtualbox.org/ticket/12597