Я полтора года мучился с одной неприятной особенностью 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)


  1. pokidovea
    15.10.2017 15:08

    Попадись мне этот пост год назад…


  1. plus
    15.10.2017 15:37

    Настоящий ад, это когда используешь это всё ещё и без ssd :)


    1. vlreshet Автор
      15.10.2017 15:39

      Даа) Я как поставил себе ssd — так словно мир технологий на 10 лет вперёд прыгнул


  1. croupier
    15.10.2017 15:54

    Простите за оффтоп: не сравнивали работу в virtualbox со встроенной недавно в вин10 убунтой? Я совсем немного потыкал, вроде всё ок и с папками, и со скоростью в общем.
    А за статью спасибо, когда-то отказался от виртуалки именно из-за этой проблемы.


    1. vlreshet Автор
      15.10.2017 16:49

      Лично я не сравнивал, а коллега сравнивал… да так и остался на ней. Весь LAMP стек вроде, отлично поднялся, проблем не было. Радуется теперь, мол никакого вагранта не надо)


    1. DaneSoul
      15.10.2017 21:16

      Преимущество связки VirtualBox c Vagrant в изолированности, то есть можно спокойно экспериментировать в «песочнице», которую потом легко убить если что-то пошло не так или закатать в отдельный бокс для отдельного круга задач с готовыми настройками…
      Так что Vagrant удобен даже если и host и guest системы одинаковые.


      1. vlreshet Автор
        16.10.2017 10:55
        +1

        ИМХО, суть даже не в изолированности, а в том что можно иметь несколько окружений. Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии. А так два отдельных бокса — и весело-удобно)


        1. DaneSoul
          16.10.2017 11:00

          Да, а еще возможность не засорять основную систему и точно знать что установлено в данной конкретной сборке конкретного проекта, чтобы потом не гадать чем сервер куда загрузили результат отличается от локального и почему на нем не завелось.


        1. Darth_Saracen
          16.10.2017 11:01

          OpenServer (не реклама) переключает версии влёгкую) Дома пользуюсь им


          1. vlreshet Автор
            16.10.2017 12:56

            Инструмент отличный, но его хватает ровно до того момента когда проекту нужны unix-специфичные php-модули


        1. ALexhha
          16.10.2017 17:01

          Допустим, у меня параллельно два проекта на php7 и php5.6, и держать их в одной системе ну очень напряжно, по причинам того что php и apache не умеют быстро переключать версии
          очень даже умеют — запуск нескольких версий php


          1. vlreshet Автор
            16.10.2017 18:02

            Не, ну то что они умеют это в теории — я знаю. Практика же показала что настройка этого зоопарка — та ещё боль, и потом рано или поздно да вылезают какие-нибудь косяки. Реально проще содержать две виртуальные машины, чем настраивать так одну.


  1. ALexhha
    15.10.2017 20:27

    В первую очередь вагрант используется для переносимости и повторяенмости окружения. И лишь потом для локальной разработки.


    1. vlreshet Автор
      16.10.2017 10:58
      +1

      Сможете обосновать? Нет, правда интересно. Уже третий год как разрабатываю исключительно на вагранте — и горя не знаю. Полная повторяемость боевого сервера на *nix, при этом не надо себя мучать, и можно спокойно работать на windows. В чём проблема?


      1. ALexhha
        16.10.2017 17:07

        Вы разрабатываете на VirtualBox по сути, а вагрнат лишь некая обвертка. Из личного опыта — за последние пару лет ни один из разработчиков, с которыми работал, никогда не использовал виртуализацию для подобного. Docker + compose вполне хватает для поднятия локального окружения. Возможно мне попадались исключительно правильные разработчики.

        Не знаю как сейчас обстоят дела при запуске Vagrant на Windows платформе, но в свое время приходилось выдумывать велосипеды

        P.S.
        windows не используем, только mac/linux


        1. vlreshet Автор
          16.10.2017 18:06

          Может на макоси нужны какие-то велосипеды, но в текущее время, на windows, всё абсолютно прозрачно. Утром пришёл, запустил один ярлык (на самом деле .bat файл который выполняет vagrant up в нужной директории), подождал около минуты, всё, всё готово, можно работать. Поднять полностью готовую к работе машину можно минут за 30, при том что 20 минут будет качаться образ убунты. Я ни в коем случае не фанатик вагранта, просто за пару лет с ним только позитивный опыт, а тут, оказывается, это не комильфо)

          P.S. о докере слышал, но пока что руки не доходят. да и, как говорится, не хочется чинить то что не сломано (менять то что работает)


          1. ALexhha
            16.10.2017 22:22

            Тут речь скорее идет не просто о запуске виртуалки как таковой, а когда вам необходимо выполнить какие-либо дополнительные действия, например тот же проивизион через ansible/chef/etc


            1. vlreshet Автор
              16.10.2017 22:45

              Возможно не совсем понимаю о чём вы, но в вагранте можно прописывать provision скрипты, которые выполнятся сразу при загрузке виртуалки. Как автозагрузка в windows


              1. ALexhha
                16.10.2017 22:49

                Я это прекрасно знаю, но я уже приводил ссылку выше, когда ansible не работал в среде windows, но при этом отлично работал на linux/mac. Тут конечно вина не самого вагранта как такового, он лишь посредник, а сама возможность создавать повторяемые и независимые окружения без привязки к ОС.


  1. Ikarr
    15.10.2017 21:19

    А нет решения для чистого virtualbox?


  1. boodda
    16.10.2017 00:15

    это не работает как надо, куча проблем, особенно с гитом. когда переключаешь ветку, файлы могут не синхронизироваться, рандомные баги в коде из-за этого. Куча багов на гитхабе про это. Под Винду нет нормального способа разрабатывать. Vagrant + что угодно: баги и медленно, docker +win 10(7): баги с правами. Вечные проблемы с правами на файлы и папки. нормально не пробрасывается. Как итог — пока vagrant + winnfsd и vagrant reload при смене ветки или просто если начались глюки


    1. vlreshet Автор
      16.10.2017 13:01

      Буду тестить, пока что гит не жалуется. Если будут проблемы — напишу апдейт поста


  1. g4xd
    16.10.2017 08:54

    «А знаете в чём соль? Да работает оно и на windows, нельзя верить документации! »
    Зачем вводить людей в заблуждение? Это написано в официальной документации и официально это не поддерживается. Решение которое предлагаете вы — костыль неизвестного человека


    1. vlreshet Автор
      16.10.2017 11:02

      А почему заблуждение? Документация говорит что вагрант будет тупо игнорировать запрос на nsf на windows хосте, при том что по факту, он этого не делает. В чём заблуждение? Стабильность «костыля» — другой вопрос, но работоспособность то не вызывает сомнений


      1. g4xd
        16.10.2017 12:58

        В том что документация не распространяется на стороннее допиливание? Вы действительно не понимаете разницы?


        1. vlreshet Автор
          16.10.2017 12:59

          Это уже вопрос терминологии. А по факту — документация говорит что что-то не будет работать в принципе, а оно заводится с минимальными телодвижениями


  1. g4xd
    16.10.2017 09:08

    Уберите этот пост из раздела администрирования, пишите на php, не пишите на habr, пожалуйста


  1. Darth_Saracen
    16.10.2017 09:24

    Есть ещё вариант — мне помог ввиду невозможности установить nfs в гостевую машину — я пользуюсь PHPStorm, там есть опции синхронизации файлов с гостевой машиной. Буквально, после изменения/переключения в другую ветку, файлы просто аплодятся куда надо. Есть некоторые минусы, но всё работает значительно быстрее. «Тебе не придётся терпеть медленный vboxsf, если твой проект будет в самом вагранте»)


    1. vlx
      16.10.2017 09:28

      Если только этот проект не состоит из охуллиона файлов


      1. Darth_Saracen
        16.10.2017 09:32

        Да нет, всё в порядке. Загружаются же только изменённые файлы. Вопрос уже в том, насколько «свежи» ваши ветки от основного бранча)


        1. vlx
          16.10.2017 18:26

          Правда перед этим они часа четыре качаются.


  1. dimkanevidimka
    16.10.2017 12:50

    1. Поднимаем в убунте самбу(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, все манипуляции с гитом только там


  1. 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


  1. alysenko
    16.10.2017 12:58

    Недавно столкнулся с проблемой, что гостевая ubuntu на vagrant'е самовольно убивала процессы (выдавала сообщение "Killed"). Может кто в курсе, с чем это связано?