В этой статье мы попробуем «установить» Linux в Windows, чтобы, сидя в Windows, можно было разрабатывать софт в Visual Studio для Linux.
А если без шуток, то Windows Subsystem for Linux (WSL) позиционируется Microsoft как инструмент для разработчиков. WSL — это слой совместимости для запуска Linux-приложений в Windows 10. Благодаря сотрудничеству компаний Microsoft и Canonical можно опробовать следующие образы Linux: Ubuntu, Debian, SUSE и Kali (которые я нашел в Microsoft Store к установке на момент написания) для непосредственного запуска поверх WSL множества инструментов и утилит из этой ОС без какой-либо виртуализации. При желании можно запускать приложения и с GUI (но с ограничениями) и работать с ними из под Windows как с обычными приложениями.
Установка и настройка WSL
Сразу стоит посмотреть на билд вашей ОС — требуется Windows 10 build 16215 и более поздние, в противном случае пора обновиться! ;)
Установка начинается с включения компонента «Подсистема Windows для Linux«, включается в Панель управления -> Все элементы панели управления
-> Программы и компоненты -> Включение или отключение компонентов Windows:
Далее заходим в Microsoft Store и через поиск находим образ Ubuntu для установки в WSL:
После установки в Пуске появится bash-консоль с аналогичным названием Ubuntu, запускаем её (при первом запуске необходимо будет ввести имя нового пользователя и пароль):
Примечание: я не сделал скриншоты, пока разбирался, а всё заново переустанавливать смысла нет, там и так всё интуитивно понятно… поэтому будут только некоторые моменты установки.
Теперь стоит обновить Ubuntu и доустановить необходимые компоненты. Начинаем с обновления:
$ sudo apt-get update $ sudo apt-get upgrade
Далее установим пакет с утилитами для разработки а-ля GNU C++ компилятор, линкер и т. д. :
$ sudo apt install -y build-essential
Также потребуется gdbserver, который позволит удалённо отлаживать программу при помощи GDB отладчика:
$ sudo apt install -y gdbserver
Для удаленного подключения к Ubuntu ещё потребуется SSH-сервер:
$ sudo apt install -y openssh-server
После установки openssh-server необходимо подправить его конфигурацию. Открываем файл конфигурации в nano-редакторе:
$ sudo nano /etc/ssh/sshd_config
Пролистываем вниз до параметра “PasswordAuthentication” и меняем его значение на “yes”, что разрешает подключение по паролю:
Примечание: Нажимаем CTRL + X для выхода и далее Y для сохранения изменений.
Генерируем SSH ключи:
$ sudo ssh-keygen -A
Теперь необходимо запустить службу SSH перед подключением из Visual Studio:
$ sudo service ssh start
Примечание: Запуск службы необходимо производить каждый раз, когда запускается первая bash-консоль после перезагрузки\включения ПК или закрытия всех окон bash-консоли, т.к. WSL убивает все процессы Linux, когда вы закрываете последнее окно bash консоли.
И вот тут с SSH может возникнуть такой прикол, что вы вводите правильные логин\пароль, а в ответ вам — доступ запрещён. А это может произойти все по простой причине — в Windows 10 включён встроенный SSH-сервер. И через Putty, и через Visual Studio по localhost вы будете пытаться подключиться не к WSL, а встроенному в Windows SSH серверу, и, понятное дело, будете получать отказ доступа. Починить просто, надо в службах отключить его:
На этом настройка WSL завершена, можно переходить к следующему этапу.
Первый проект — настройка, компиляция, отладка
Устанавливаем Visual Studio 2017 с набором инструмента «Разработка для Linux на C++»:
Теперь можно создать проект для консольного приложения под Linux:
Чуток изменим исходный код по сравнению с исходным и поставим брейкпоинт на втором printf:
#include <cstdio> int main() { printf("Hello from ConsoleApplication1!\n"); for (;;) { printf("loop!\n"); } return 0; }
Теперь настроим подключение к WSL, чтобы попробовать скомпилировать и начать отладку. Заходим в Tools -> Options -> Cross Platform (у вас будет пусто на свежеустановленной Visual Studio):
Нажимаем Add и вводим логин\пароль пользователя, что задавали в bash-консоли (не забываем предварительно запустить SSH-сервер и не закрывать bash-консоль):
Если все ввели правильно (и не забыли отключить встроенный в Windows SSH сервер), то подключение появится в списке. Можно закрывать окно и пробовать собрать проект, должны получить в Output следующее:
1>------ Build started: Project: ConsoleApplication1, Configuration: Debug x64 ------ 1>Validating architecture 1>Validating sources 1>Copying sources remotely to 'localhost' 1>Starting remote build 1>Compiling sources: 1>main.cpp 1>Linking objects 1>ConsoleApplication1.vcxproj -> C:\Users\Andrew\Documents\Visual Studio 2017\Projects\ConsoleApplication1\ConsoleApplication1\bin\x64\Debug\ConsoleApplication1.out ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Успех! Пробуем начать отладку:
Ква-ква-ква. Небольшой провал. Но и это поправимо, надо просто сменить в настройках проекта тип отладки:
Пробуем еще раз (кликабельно):
Работает! :)
Примечание: Текст из printf выводится не в стандартный Output, а в консоль Linux, которая находится в Debug -> Linux Console.
На этом всё.
Заключение
В итоге могу сказать, что установка и настройка для работы проходит быстро и без каких-либо красноглазых засиживаний часами, практически всё уже подготовлено не то, что для разработчика, а для новичка-нуба в отношении Linux.
Более подробно о установке WSL, настройке проекта и его параметрах можно почитать в официальном мануале от Microsoft, эта статья же — просто краткий мануал к установке с описанием возможных проблем.
Мне же интересно опробовать компиляцию для АРМ SoC в WSL, т. к. грамотный человек пишет, что с использованием WSL всё происходит в разы быстрее и без костылей типа MSys, minGW, Cygwin. Будем разбираться, пробовать. :)
Спасибо, что прочитали!