Введение.

Данная статья будет неким дополнением опубликованной ранее (не мной) статьи. Чтобы не повторять написанное, по ссылке выше есть информация о требованиях к работе wsl2 на windows 10, как его включить, настроить, обновить и запустить графическую среду. В текущей статье я расскажу о том, как вести разработку графических приложений в wsl используя не только visual studio code со спец. плагином, а любую среду разработки.

Когда есть необходимость разработки под линукс, обычно, для этого использовали виртуальную машину, например, VirtualBox с убунтой, ждали пока она запустится, настраивали сеть, общие ресурсы, разрешение монитора и тп. При этом редко, но в какой-то момент виртуальная машина переставала запускаться и ее приходилось хоронить, создавать новую на основе бэкапов.  Приятной особенностью wsl является ее скорость работы в сравнении с виртуальными машинами – это и почти мгновенный запуск, и быстрая сборка и доступ к файловой системе основной ОС. В wsl не нужно настраивать разрешение экрана, не нужно ставить расширений как для виртуальной машины. Все уже есть и работает быстро! А главное – это уменьшается потеря времени на компиляцию, на отладку приложения в дебаггере. Нажал ярлык на рабочем столе в windows и сразу же работаешь со своей средой разработки в линуксе. Далее опишу подробнее.

В качестве x-сервера в windows я использую бесплатный Vcxsrv. Настраивается он по инструкции в соответствии с тем как описано в статье по ссылке в самом начале. Особых глюков с Vcxsrv не наблюдается, если что его можно быстро перезапустить и продолжать работу в штатном режиме.

Запуск среды разработки.

Мы в своей работе используем среду QtCreator, но описанным ниже способом можно запускать любую. Определяем имя нужной нам системы для работы (запускаем из командной строки windows):

Список установленных систем wsl
Список установленных систем wsl

Данная команда выводит список установленных систем wsl. Далее буду показывать на примере системы spear.

Для того чтобы запустить нужную систему (spear) и залогиниться под нужным нам пользователем (user) выполняем и проверяем, что мы действительно зашли куда нужно:

Запуск нужной wsl-системы
Запуск нужной wsl-системы

Wsl быстрее работает с файлами которые расположены внутри ее файловой системы, поэтому «массивные» проекты для разработки храним в домашней директории и сборку ведем из нее же.

Устанавливаем весь необходимый софт как в обычной убунте. Сейчас нас интересует QtCreator. Проверяем его наличие:

Просмотр пути к запускаемому файлу
Просмотр пути к запускаемому файлу

Теперь в windows, в любой удобной папке создаем .bat файл который будет нам запускать среду разработки:

@echo off
echo ======================= Внимание! ==================================
echo  Для корректной работы GUI Ubuntu в WSL2 необходимо использовать X Server.
echo ==================================================================
wsl -d spear -u user bash -c "cd ~ ; export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0 ; setxkbmap -model pc105 -layout us,ru -option grp:alt_shift_toggle  ; /opt/qtcreator-5.0.3/bin/qtcreator.sh"

Поясню некоторое содержимое скрипта:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

Т.к. мы пользуем x-сервер на хосте с windows, то адрес графического интерфейса есть адрес windows, а его номер мы задаем при запуске Vcxsrv ( это :0). Таким образом мы автоматически получаем адрес x-сервера.

setxkbmap -model pc105 -layout us,ru -option grp:alt_shift_toggle

указываем раскладку и сочетание клавиш для смены языка ввода. При этом, у меня в windows для смены раскладки используется ctrl_shift, поэтому в wsl использую alt_shift иначе глючит.

/opt/qtcreator-5.0.3/bin/qtcreator.sh

Указываем исполняемый файл для запуска. Теперь запускаем батник, появляется консольное окно, затем сам интерфейс qtcreator.

Результат выполнения скрипта запуска QtCreator
Результат выполнения скрипта запуска QtCreator

Запуск любого другого приложения wsl.

Аналогичным образом можем запустить, например, систему контроля версий TortoiseHg. Создаем .bat-файл:

@echo off
echo ==================== Внимание! =====================================
echo  Для корректной работы GUI Ubuntu в WSL2 необходимо использовать X Server.
echo =============================================================================
wsl -d spear -u user bash -c "cd ~ ; export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0 ; setxkbmap -model pc105 -layout us,ru -option grp:alt_shift_toggle  ; /usr/share/applications/thg.desktop"

Запускаем его:

Результат запуска Черепахи
Результат запуска Черепахи

Заключение.

Таким образом мы можем, находясь в windows одновременно быть в линукс, переключается стандартным образом между окнами, использовать буфер обмена, общие файлы и все свои мониторы для размещения окон линукс. При этом из открытой среды разработки мы можем запускать свои приложения в отдельных окнах.

Если нам нужно из консоли запустить что-то руками в
графическом режиме, то редактируем файл по адресу /home/user/.bashrc и добавляем в него строку:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0

Теперь, мы можем запускать что нам угодно:

Просмотр кода скрипта в графическом редакторе Kate
Просмотр кода скрипта в графическом редакторе Kate

Спасибо за внимание.

Комментарии (7)


  1. alexander222
    26.01.2022 13:22

    Применяется-ли масштабирование от системы? Пробовал запускать gui приложения через WSL в windows 11, там не требуется внешний X сервер, но графика во первых немного замыленная, хотя драйвер установил, во вторых не применяется масштаб и все выглядит очень мелко


    1. lehiss Автор
      26.01.2022 16:30

      Масштабирование не применял, но при настройке vcxsrv нужно два параметра изменить:


  1. Barabashkad
    26.01.2022 13:43

    в 11 все намного проще ;-)
    сразу из bash открываеться любое Linux GUI приложение
    сервер уже интегрирован


    1. Balling
      27.01.2022 16:49

      WSL 2 использует виртуальную машину, а не native вызовы. Т.е. хорошо хоть вместе с Vmware уже работает.


  1. 13werwolf13
    26.01.2022 14:09
    +1

    попробуйте вместо vcxsrv заюзать xming. мне показалось что он ощутимо шустрее работает.

    и это, думаю стоит добавить в статью что при такой работе с иксами о графическом ускорении можно забыть, его не будет и если для программы оно обязательно то она упадёт не запустившись до конца. вроде бы как можно использовать vglconnect/vglrun через ssh (и ВМЕСТО ssh -x, и да это будет ещё и завёрнуто в ssh кроме обычных сетевых накладок на латенси будет влиять ещё и шифрование и упаковка), но с WSL я не пробовал будет ли работать.


  1. kale
    27.01.2022 11:17

    В wsl не нужно настраивать разрешение экрана, не нужно ставить расширений как для виртуальной машины.

    Справедливости ради, в VB гостевое расширение ставится буквально в два щелчка мыши, а экран в вашем кейсе вообще не нужен, headless режим в VB имеется.
    Кроме того, в отличии от VB использование wsl2 ограничено только определенными редакциями windows, про кроссплатформенность этого решения и говорить не стоит. Действительно критичный недостаток VB, это ее нестабильность.
    Поэтому я с другой стороны баррикад, Windows под QEMU/KVM))


    1. lehiss Автор
      27.01.2022 12:47

      далеко не всегда гостевое расширение ставиться в два щелчка. Возможны ньюансы, например образ виртуалки создавалс в старой версии и его подтянули на новыую версию VB. Бывает, что после установки расширения виртуалка вообще перестает грузиться. Чтобы получить доступ к хостовой файловой системе приходиться добавлять пользователя в спец группу после установки расширения.