У меня есть веб-сервер lighttpd, настроенный на гостевой системе Debian 6 в Virtualbox 4. У меня есть каталог www в общей папке virtualbox, так что я могу разработать веб-сайт на хосте Windows.
Моя проблема в том, что два идентичных файла, созданных разными текстовыми редакторами, по-разному обслуживаются lighttpd. Vim работает так, как должен, но создание файлов с помощью echo (или любого другого редактора) создает файлы, которые хорошо выглядят на диске, но становятся поврежденными, как только lighttpd их обслуживает. Эта проблема присутствует только тогда, когда корень документа находится в общей папке виртуального бокса. Возможно, проще показать эту проблему, чем объяснить ее, поэтому я выполнил тестовый пример ниже.
EDIT: это какая-то проблема с кешированием, запущенная 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??
Хорошо, исправил. Видимо это потому, что sendfile()
из общих папок виртуального бокса не работает. Вместо этого вы можете заставить 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
У меня также были проблемы с обслуживанием файлов из общей папки VBox. В моем случае я редактирую файлы на хост-машине, но изменения не отражаются на виртуальной машине.
Чтобы обойти это, я должен umount
и mount
общую папку внутри виртуальной машины, чтобы она могла видеть новые файлы. Возможно, здесь происходит что-то подобное, и вам может понадобиться либо sync
это или заставить смыть umount
и mount
общая папка тоже.
Если это сработает, возможно, есть возможность сделать это автоматически.