Я полтора года мучился с одной неприятной особенностью ubuntu под vagrant — чертовски медленная расшаренная папка. Простые бенчмарки показывали просадку производительности I/O операций почти на 2 порядка, проекты на php работали до 10 раз медленнее чем на нативном хосте. Так вот, сегодня я задолбался окончательно, хорошо поискал… и оказалось что есть решение, и теперь я просто не могу не поделиться им с кем-то. Решение простое, кому-то покажется очевидным, кто-то знал о нём с рождения (ну или будет так утверждать), но я уверен что знают о нём не все.
А чём проблема то?
По умолчанию vagrant использует файловую систему vboxsf, которая иногда работает крайне медленно (когда это «иногда» случается — я не знаю, у меня оно всегда тормозило). Свой тип файловой системы можно узнать по команде mount.
Можно заменить файловую систему, но пролема в том что официальная документация… врёт! Она говорит мол да, иногда бывают проблемы с перфомансом расшаренных папок, в таких случаях используйте nfs и будет вам счастье. А ниже приписка — на windows не сработает, и не пробуйте.
А знаете в чём соль? Да работает оно и на windows, нельзя верить документации!
И что делать?
Идём сюда https://github.com/winnfsd/vagrant-winnfsd, читаем, ставим, радуемся. Для тех кому лень читать:
- выполнить в windows консоли «vagrant plugin install vagrant-winnfsd»
- добавить две строки в Vagrantfile
config.vm.network «private_network», type: «dhcp»
config.vm.synced_folder ".", "/vagrant", type: «nfs»
Перезагружаем vagrant, готово! Не знаю, возможно существуют какие-то подводные камни, может кому-то не поможет, но у меня, вроде, работает отлично. Моя конфигурация: Windows 10 (host) + ubuntu 14.04 (guest). Мой проект на laravel ускорил отдачу страницы с 6.5 секунд до 0.5, что не может не радовать.
P.S. пост получился коротким, сумбурным, но попадись он мне год назад — я был бы безумно рад.
UPD. В комментариях говорят что работает нестабильно. Спустя сутки работы убедился сам — бывают проблемы с синхронизацией файлов. Так что не всё так идеально, как казалось на первый взгляд…
Комментарии (34)
croupier
15.10.2017 15:54Простите за оффтоп: не сравнивали работу в virtualbox со встроенной недавно в вин10 убунтой? Я совсем немного потыкал, вроде всё ок и с папками, и со скоростью в общем.
А за статью спасибо, когда-то отказался от виртуалки именно из-за этой проблемы.vlreshet Автор
15.10.2017 16:49Лично я не сравнивал, а коллега сравнивал… да так и остался на ней. Весь LAMP стек вроде, отлично поднялся, проблем не было. Радуется теперь, мол никакого вагранта не надо)
DaneSoul
15.10.2017 21:16Преимущество связки VirtualBox c Vagrant в изолированности, то есть можно спокойно экспериментировать в «песочнице», которую потом легко убить если что-то пошло не так или закатать в отдельный бокс для отдельного круга задач с готовыми настройками…
Так что Vagrant удобен даже если и host и guest системы одинаковые.vlreshet Автор
16.10.2017 10:55+1ИМХО, суть даже не в изолированности, а в том что можно иметь несколько окружений. Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии. А так два отдельных бокса — и весело-удобно)
DaneSoul
16.10.2017 11:00Да, а еще возможность не засорять основную систему и точно знать что установлено в данной конкретной сборке конкретного проекта, чтобы потом не гадать чем сервер куда загрузили результат отличается от локального и почему на нем не завелось.
Darth_Saracen
16.10.2017 11:01OpenServer (не реклама) переключает версии влёгкую) Дома пользуюсь им
vlreshet Автор
16.10.2017 12:56Инструмент отличный, но его хватает ровно до того момента когда проекту нужны unix-специфичные php-модули
ALexhha
16.10.2017 17:01Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии
очень даже умеют — запуск нескольких версий phpvlreshet Автор
16.10.2017 18:02Не, ну то что они умеют это в теории — я знаю. Практика же показала что настройка этого зоопарка — та ещё боль, и потом рано или поздно да вылезают какие-нибудь косяки. Реально проще содержать две виртуальные машины, чем настраивать так одну.
ALexhha
15.10.2017 20:27В первую очередь вагрант используется для переносимости и повторяенмости окружения. И лишь потом для локальной разработки.
vlreshet Автор
16.10.2017 10:58+1Сможете обосновать? Нет, правда интересно. Уже третий год как разрабатываю исключительно на вагранте — и горя не знаю. Полная повторяемость боевого сервера на *nix, при этом не надо себя мучать, и можно спокойно работать на windows. В чём проблема?
ALexhha
16.10.2017 17:07Вы разрабатываете на VirtualBox по сути, а вагрнат лишь некая обвертка. Из личного опыта — за последние пару лет ни один из разработчиков, с которыми работал, никогда не использовал виртуализацию для подобного. Docker + compose вполне хватает для поднятия локального окружения. Возможно мне попадались исключительно правильные разработчики.
Не знаю как сейчас обстоят дела при запуске Vagrant на Windows платформе, но в свое время приходилось выдумывать велосипеды
P.S.
windows не используем, только mac/linuxvlreshet Автор
16.10.2017 18:06Может на макоси нужны какие-то велосипеды, но в текущее время, на windows, всё абсолютно прозрачно. Утром пришёл, запустил один ярлык (на самом деле .bat файл который выполняет vagrant up в нужной директории), подождал около минуты, всё, всё готово, можно работать. Поднять полностью готовую к работе машину можно минут за 30, при том что 20 минут будет качаться образ убунты. Я ни в коем случае не фанатик вагранта, просто за пару лет с ним только позитивный опыт, а тут, оказывается, это не комильфо)
P.S. о докере слышал, но пока что руки не доходят. да и, как говорится, не хочется чинить то что не сломано (менять то что работает)ALexhha
16.10.2017 22:22Тут речь скорее идет не просто о запуске виртуалки как таковой, а когда вам необходимо выполнить какие-либо дополнительные действия, например тот же проивизион через ansible/chef/etc
vlreshet Автор
16.10.2017 22:45Возможно не совсем понимаю о чём вы, но в вагранте можно прописывать provision скрипты, которые выполнятся сразу при загрузке виртуалки. Как автозагрузка в windows
ALexhha
16.10.2017 22:49Я это прекрасно знаю, но я уже приводил ссылку выше, когда ansible не работал в среде windows, но при этом отлично работал на linux/mac. Тут конечно вина не самого вагранта как такового, он лишь посредник, а сама возможность создавать повторяемые и независимые окружения без привязки к ОС.
boodda
16.10.2017 00:15это не работает как надо, куча проблем, особенно с гитом. когда переключаешь ветку, файлы могут не синхронизироваться, рандомные баги в коде из-за этого. Куча багов на гитхабе про это. Под Винду нет нормального способа разрабатывать. Vagrant + что угодно: баги и медленно, docker +win 10(7): баги с правами. Вечные проблемы с правами на файлы и папки. нормально не пробрасывается. Как итог — пока vagrant + winnfsd и vagrant reload при смене ветки или просто если начались глюки
vlreshet Автор
16.10.2017 13:01Буду тестить, пока что гит не жалуется. Если будут проблемы — напишу апдейт поста
g4xd
16.10.2017 08:54«А знаете в чём соль? Да работает оно и на windows, нельзя верить документации! »
Зачем вводить людей в заблуждение? Это написано в официальной документации и официально это не поддерживается. Решение которое предлагаете вы — костыль неизвестного человекаvlreshet Автор
16.10.2017 11:02А почему заблуждение? Документация говорит что вагрант будет тупо игнорировать запрос на nsf на windows хосте, при том что по факту, он этого не делает. В чём заблуждение? Стабильность «костыля» — другой вопрос, но работоспособность то не вызывает сомнений
g4xd
16.10.2017 12:58В том что документация не распространяется на стороннее допиливание? Вы действительно не понимаете разницы?
vlreshet Автор
16.10.2017 12:59Это уже вопрос терминологии. А по факту — документация говорит что что-то не будет работать в принципе, а оно заводится с минимальными телодвижениями
g4xd
16.10.2017 09:08Уберите этот пост из раздела администрирования, пишите на php, не пишите на habr, пожалуйста
Darth_Saracen
16.10.2017 09:24Есть ещё вариант — мне помог ввиду невозможности установить nfs в гостевую машину — я пользуюсь PHPStorm, там есть опции синхронизации файлов с гостевой машиной. Буквально, после изменения/переключения в другую ветку, файлы просто аплодятся куда надо. Есть некоторые минусы, но всё работает значительно быстрее. «Тебе не придётся терпеть медленный vboxsf, если твой проект будет в самом вагранте»)
vlx
16.10.2017 09:28Если только этот проект не состоит из охуллиона файлов
Darth_Saracen
16.10.2017 09:32Да нет, всё в порядке. Загружаются же только изменённые файлы. Вопрос уже в том, насколько «свежи» ваши ветки от основного бранча)
dimkanevidimka
16.10.2017 12:501. Поднимаем в убунте самбу(Samba Server), шарим нужную директорию простеньким конфигом
/etc/samba/smb.conf
[Ubintu16SitesShare]
path = /srv/www
available = yes
browsable =yes
writable = yes
guest ok = yes
read only = no
force user = username
force group = groupname
2. Total Commander -> Net->Network connections: привязываем расшаренную папку к свободной букве диска.
3. Натравливаем пхпшторм на этот виртуальный диск который светится рядом с С:\ и D:\
Работает нааамного быстрее вагрант шаредфолдера
Из минусов — симлинки винда не поддерживает, видит как отдельные файлы
git в винду не ставить, идём в убунту по ssh, все манипуляции с гитом только там
saetoniux
16.10.2017 12:58К сожалению, плагин «vagrant-winnfsd» не является панацеей. При использовании Homestead от Laravel проблем не было, скорость действительно возрасла и стала более чем удовлетворительной (с ssd). При использовании DrupalVM и ряда самодельных машин на базе Ubuntu 16.04 наблюдается проблема при обработке большого количества файлов — виртуальная машина напрочь виснет. Чаще всего это проявляется после установки большого проекта через Composer. Не уверен, что Homestead чем-то лучше других, просто там не разворачивал ничего крупнее Laravel с несколькими зависимостями.
Наткнулся на предложение использовать «winnfsd» без плагина, а как отдельный сервис, но пока не проверял — hollyit.net/blog/windowsvagrantwinnfsd-without-file-update-problems
alysenko
16.10.2017 12:58Недавно столкнулся с проблемой, что гостевая ubuntu на vagrant'е самовольно убивала процессы (выдавала сообщение "Killed"). Может кто в курсе, с чем это связано?
pokidovea
Попадись мне этот пост год назад…