从 Virtualbox 共享文件夹提供服务时 Lighttpd 损坏

从 Virtualbox 共享文件夹提供服务时 Lighttpd 损坏

我在 Virtualbox 4 中的 Debian 6 客户机上设置了一个 lighttpd 网络服务器。我在 virtualbox 共享文件夹中找到了 www 目录,这样我就可以在 Windows 主机中开发网站。

我的问题是,用不同的文本编辑器创建的两个文件在其他方面完全相同,lighttpd 提供的服务却不同。Vim 可以正常工作,但使用 echo(或任何其他编辑器)创建的文件在磁盘上看起来没问题,但 lighttpd 提供这些文件后,这些文件就会损坏。只有当文档根目录位于共享的 virtualbox 文件夹上时,才会出现此问题。展示此问题可能比解释它更容易,所以我在下面做了一个测试用例。

编辑:这是某种缓存问题,echo 3 > /proc/sys/vm/drop_caches在 wget 之前运行可使下载的文件正常工作。但仍无法解释为什么 vim 不受影响...

root@Apricots:/var/www/xxx.org/http# vim vim.txt
    (I type 'Line 1' into vim, on one line)
root@Apricots:/var/www/xxx.org/http# echo 'Line 1' >> echo.txt
root@Apricots:/var/www/xxx.org/http# md5sum vim.txt echo.txt
376cbf50d47a30459adca22b15964912  vim.txt
376cbf50d47a30459adca22b15964912  echo.txt
root@Apricots:/var/www/xxxt.org/http# cd ~
root@Apricots:~# wget xxx.org/vim.txt xxx.org/echo.txt
    (The two files download OK)
root@Apricots:~# md5sum vim.txt echo.txt
376cbf50d47a30459adca22b15964912  vim.txt
376cbf50d47a30459adca22b15964912  echo.txt
root@Apricots:~# cat vim.txt
Line 1
root@Apricots:~# cat echo.txt
Line 1
root@Apricots:~# cd /var/www/xxx.org/http/
root@Apricots:/var/www/xxx.org/http# vim vim.txt
    (I type 'Line 2' in a second line in vim)
root@Apricots:/var/www/xxx.org/http# echo 'Line 2' >> echo.txt
root@Apricots:/var/www/xxx.org/http# md5sum vim.txt echo.txt
ef3095884e8daf72dc4d2ea71306caa7  vim.txt
ef3095884e8daf72dc4d2ea71306caa7  echo.txt
root@Apricots:/var/www/xxx.org/http# cat vim.txt
Line 1
Line 2
root@Apricots:/var/www/xxx.org/http# cat echo.txt
Line 1
Line 2
root@Apricots:/var/www/xxx.org/http# cd ~
root@Apricots:~# rm vim.txt echo.txt
root@Apricots:~# wget xxx.org/vim.txt xxx.org/echo.txt
    (They both download fine again)
root@Apricots:~# md5sum vim.txt echo.txt
ef3095884e8daf72dc4d2ea71306caa7  vim.txt
0b8835dcb6bb73c7a4eb25301101699a  echo.txt
root@Apricots:~# cat vim.txt
Line 1
Line 2
root@Apricots:~# cat echo.txt
Line 1
root@Apricots:~# hexdump vim.txt
0000000 694c 656e 3120 4c0a 6e69 2065 0a32
000000e
root@Apricots:~# hexdump echo.txt
0000000 694c 656e 3120 000a 0000 0000 0000
000000e
root@Apricots:~# echo "what the hell just happened there??"
what the hell just happened there??

答案1

好的,修复了。显然是因为sendfile()来自 virtualbox 的共享文件夹损坏了。您可以通过添加指令让 lighttpd 使用 write 系统调用来发送文件server.network-backend = "writev"。由于这只是为了开发,所以没什么大不了的。

来源:

http://forums.virtualbox.org/viewtopic.php?f=6&t=38973

http://forums.virtualbox.org/viewtopic.php?f=8&t=24905&p=129089&hilit=vboxsf+web+server

答案2

我在从 VBox 共享文件夹提供文件时也遇到了一些问题。就我而言,我在主机上编辑了文件,但更改并未反映在虚拟机中。

为了解决这个问题,我必须umount清除mount虚拟机内的共享文件夹,让它看到新文件。也许这里发生了类似的事情,你可能需要清除sync它,或者也强制umount清除mount共享文件夹。

如果可行的话,也许可以选择自动执行。

相关内容