Очень часто в разработке возникает необходимость поднять локальное окружение для отладки каких-либо рабочих моментов. В своей работе я постоянно пользуюсь Vagrant для тестирования инфраструктурного кода, например ansible-ролей. Vagrant остаётся одной из самых популярных утилит для подобных задач, имеет гибкий синтаксис и поддержку базовых алгоритмических структур – можно поднимать N и K машин в цикле, используя заранее вводимые переменные, а потом еще и ansible-inventory генерировать на выходе, разбивая машины по группам.
Долгое время я оставался пользователем MacBook на процессоре Intel, но больше так продолжаться не могло – пришлось сменить компьютер, хотя я и знал о некоторых особенностях работы М1 с виртуальными машинами.
В этой статье я расскажу, как настроить и запустить Vagrant на процессорах Apple M1/M2 и вернуться в привычный рабочий режим.
Рабочая инсталляция
Rosetta 2: позволяет компьютерам Mac с процессорами Apple использовать приложения, созданные для компьютеров Mac с процессорами Intel.
Vagrant (2.3.0+): программное обеспечение для создания и конфигурирования виртуальной среды разработки. Является обёрткой для программного обеспечения виртуализации, например VirtualBox, и средств управления конфигурациями, таких как Chef, Salt и Puppet.
Vagrant-vmware-desktop (3.0.1+): Плагин, который позволяет вагранту контролировать VMware-based машины, обеспечивая более высокую стабильность и производительность, чем ПО от VMware.
Vagrant vmware utility (1.0.21+): Сервис предоставляющий vagrant-vmware-desktop e доступ к различным функциям VMware. Так же используется для выполнения операций, требующих привилегированного доступа на хосте, сетевых операций и верификации машин.
Гипервизор (VMware Fusion Public Tech Preview 22H2): Гипервизор виртуальных машин
Установка
1. Rosetta
Первым делом, нужно установить Rosetta 2, для этого выполним следующую команду:
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
2. Vagrant
Далее, необходимо установить сам Vagrant. Это можно сделать скачав его с официального сайта https://www.vagrantup.com/downloads – выбрав MacOS и установив dmg, либо через brew, выполнив команду:
brew install vagrant
Проверить, что Vagrant работает можно также из консоли:
vagrant -v ✔
vagrant global-status
3. Гипервизор
Тут начинаются первые приколы, но обо всём по порядку. Просто так взять и скачать с сайта VMWare – мы не можем. Но можем посмотреть актуальную версию. Переходим на сайт https://customerconnect.vmware.com/downloads/get-download?downloadGroup=FUS-PUBTP-22H2, там находим и записываем цифры:
После этого, можем скачать данный файл по ссылке, заменив версию на актуальную. Например, можно использовать команду:
wget https://download3.vmware.com/software/FUS-PUBTP-22H2/VMware-Fusion-e.x.p-#{version}_universal.dmg
В качестве альтернативы, можно поставить через brew:
brew install --cask vmware-fusion
Но это еще не всё. Дело в том, что "Tech preview" устанавливается по собственному пути (/Applications/VMWare Fusion Tech Preview.app
), а провайдеры вагранта будут искать VMWare по стандартному (/Applications/VMWare Fusion.app
). Чтобы исправить это недоразумение, воспользуемся командой:
ln -s /Applications/VMWare\ Fusion\ Tech\ Preview.app /Applications/VMWare\ Fusion.app
4. Vagrant vmware utility
Страница, посвященная данной утилите: https://developer.hashicorp.com/vagrant/docs/providers/vmware/vagrant-vmware-utility, но можно просто перейти по следующей ссылке, скачать и установить последнюю версию https://developer.hashicorp.com/vagrant/downloads/vmware. В качестве альтернативы, можно снова воспользоваться brew:
brew install vagrant-vmware-utility
После установки рекомендую проверить работоспособность утилиты, кстати, таким же образом её можно дебажить чтобы понять, что не работает (я так и узнал про несоответствие путей установки):
sudo /opt/vagrant-vmware-desktop/bin/vagrant-vmware-utility api -debug
В выводе может получиться ошибка, что порт 9922 уже занят. Такое случается, если утилита уже включилась и работает. Её можно выключить и подебажить.
Проверить заняты ли порты:
sudo lsof -i -P | grep LISTEN | grep 'vagrant-v'
Выгрузить утилиту:
sudo launchctl unload -w /Library/LaunchDaemons/com.vagrant.vagrant-vmware-utility.plist
Загрузить утилиту обратно:
sudo launchctl load -w /Library/LaunchDaemons/com.vagrant.vagrant-vmware-utility.plist
Также, проверить работоспособность утилиты можно командой:
sudo launchctl list | grep vagrant
5. Vagrant VMWare Plugin
Для установки плагина просто выполняем команду:
vagrant plugin install vagrant-vmware-desktop
На этом инсталляция завершена, пора попробовать запустить виртуальную машину.
Запуск виртуальной машины
Далее, самое сложное :) В целом, всё вышеперечисленное может пройти без ошибок, но машина всё равно не запустится. Я перепробовал множество вариантов, комбинаций и настроек vagrantfile и предоставлю вам решение, которое заработало у меня и моих студентов.
Мне удалось выявить три главных проблемных места при запуске виртуальной машины:
Бокс (образ виртуальной машины) для процессоров ARM
Готовые образы отличаются провайдерами, под которые они заточены, процессорами, и содержимым. Есть популярные образы, которые у меня не заработали, есть образы с 100 загрузок, которые показали себя успешно.
Я остановился на следующих: spox/ubuntu-arm и bytesguy/ubuntu-server-20.04-arm64GUI
По причинам, которые я пока не смог выяснить (подскажите в комментариях!) – виртуальная машина не стартует, если GUI выключен (а он выключен по-умолчанию). В виду этой особенности, приходится добавлять параметрvmware.gui = true
в конфигурации VagrantfileСеть
Когда ваша машина уже практически работает, вагрант может предательски замереть на шаге==> default: Waiting for the VM to receive an address...
Решение было найдено – указатьvmware.vmx["ethernet0.virtualdev"]
= "vmxnet3" в конфигурации Vagrantfile
Создаем директорию для конфигурации нашей будущей машины и Vagrantfile в ней. Итоговый Vagrantfile получается следующим:
Vagrant.configure("2") do |config|
config.vm.box = "spox/ubuntu-arm"
config.vm.box_version = "1.0.0"
config.vm.provider :vmware_desktop do |vmware|
vmware.gui = true
vmware.cpus = 2
vmware.vmx["ethernet0.virtualdev"] = "vmxnet3"
vmware.ssh_info_public = true
vmware.linked_clone = false
end
end
Выполняем запуск машины обычной командой vagrant up
:
Подключаемся к свежесозданной машине через vagrant ssh
:
На этом всё, надеюсь моё руководство помогло вам сэкономить нервы и время. Желаю вам приятного пользования ноутбуком и до новых встреч :) Ну а если вы увлекаетесь DevOps и системным администрированием – жду вас у себя в ламповом сообществе в телеграмм: https://t.me/deusops
Полезные источники
Комментарии (8)
Te0s
04.01.2023 11:24насколько мне известно по умолчанию vagrant работает с Virtual Box, а тот недавно обновился и теперь поддреживает Apple ARM, может и не надо пляски с бубном?
и разве Fusion не является платным продуктом? и его же можно установить стандартными средствами?
D3pRe5s Автор
04.01.2023 11:25я пытался сначала с virtualbox, т.к. с ним и был весь мой предыдущий опыт - но не завелось. следующим был parallels и qemu. в итоге, получилось только как в статье.\
fusion preview поставился спокойно, просто скачав официальную dmg.
ablik
06.01.2023 04:07К сожалению и тут без танцев не обходится.
По идее в свежей версии появилась поддержка процессоров Apple Silicon и в треде на Github люди пишут что с VirtualBox 7.0.2_BETA у них все завелось, однако у меня на этой версии в связке с Vagrant 2.3.2/3 не поднимается, ссылаясь на не поддерживаемый процессор:
Stderr: VBoxManage: error: Unsupported CPU. (VERR_UNSUPPORTED_CPU)
Процессор M1 Max, на обычном M1 в MacBook Air с Monterey этой ошибки нет.
Обновление до VirtualBox 7.0.4_BETA (последняя на данный момент) проблему не решает, начинает падать с другой ошибкой:
The guest machine entered an invalid state while waiting for it to boot. Valid states are 'starting, running'. The machine is in the 'aborted' state. Please verify everything is configured properly and try again. If the provider you're using has a GUI that comes with it, it is often helpful to open that and watch the machine, since the GUI often has more helpful error messages than Vagrant can retrieve. For example, if you're using VirtualBox, run `vagrant up` while the VirtualBox GUI is open. The primary issue for this error is that the provider you're using is not properly configured. This is very rarely a Vagrant issue.
Рекомендации с добавлением дополнительного сетевого интерфейса проблему не решают.
Все это на MacOS Ventura.
В общем пока не ясно то ли не все процессоры Apple Silicon одинаково хорошо поддерживаются и старшие модели не работают, то ли дело в версии ОС, сесть и полноценно все варианты проверить не было времени. Однако очевидно что пока есть сложности и все это дело не очень стабильно.
D3pRe5s Автор
06.01.2023 04:07аналогично, у меня с М1 Макс остановилось на этом же моменте.. Решил пока подождать выхода более стабильной версии
Kentaurus13
04.01.2023 11:25А почему именно "VMWare Fusion Tech Preview"? Fusion 13 для M1/M2 вроде давно уже не в превью
D3pRe5s Автор
04.01.2023 11:27я пробовал с обычным тоже и, вроде, дошел до финальной стадии. но тогда я еще не умел обходить проблему с сетью. как маленько отойду от этого опыта - попробую всё воспроизвести с обычной версией :) ну или поделитесь опытом в комментарии
outlingo
А если сделать brew install qemu и воспользоваться vagrant-qemu, то можно обойтись без плясок вокруг VmWare?
D3pRe5s Автор
этот вариант у меня был сразу после parallels, но виртуозки зависали и не получалось завести. как маленько отойду от этого опыта - попробую еще раз с qemu :) ну или поделитесь опытом в комментарии, если получится сделать