Meefik's Blog

Freedom and Open Source

Релиз Linux Deploy 2.0

Сегодня состоялся официальный выпуск Linux Deploy 2.0, включающий много новых разработок, которые велись последний год. Не все удалось реализовать из задуманного по тем или иным причинам, настало время разобраться что же именно поменялось и как с этим жить.

linuxdeploy

Графический интерфейс

Интерфейс приложения переработан на современный лад — Material Design. Помимо стилизации функции приложения более логично распределены по разделам, добавлена выдвижная панель навигации. Благодаря библиотеке совместимости интерфейс почти одинаково отображается под разными версиями Android, начиная с версии Android 2.3.3. Скринкаст по работе с приложением Linux Deploy можно посмотреть тут.

Интерфейс командной строки

Интерфейс командной строки (CLI) претерпел значительные изменения, ядро приложения разделено на отдельные части — компоненты, а сам интерфейс теперь позволяет управлять почти всеми функциями Linux Deploy вообще без графического интерфейса. Также CLI можно использовать и за пределами Android (на других системах с ядром Linux) как самостоятельное приложение, для работы которого требуется лишь набор утилит BusyBox. Еще одной приятной особенностью являются единые конфигурационные файлы для CLI и интерфейса Android-приложения, т.е. настройки, измененные через CLI, отображаются в интерфейсе приложения и наоборот.

Интерфейсы управления

Теперь в Linux Deploy появилась возможность получить доступ к CLI не только из терминала Android или по adb, но и через telnet или веб-интерфейс. Наиболее интересная функция — веб-терминал, который предоставляет доступ к командной строке на устройстве прямо через браузер, что стало возможно благодаря проектам websocket.sh и xterm.js (подробности можно посмотреть тут). Доступ к веб-интерфейсу ограничивается правилами (несколько правил могут задаваться через пробел) в формате httpd, например, по умолчанию доступ ограничивается по логину и паролю (“/:username:password”), а можно открыть доступ для всех (“A:*”), либо только для конкретного IP-адреса (“A:127.0.0.1”).

Поддержка новых версий дистрибутивов

Добавлена поддержка дистрибутивов Debian 9 (stretch), Fedora 24 и Ubuntu 16.10 (yakkety), а также улучшена поддержка других дистрибутивов. Проведенные тесты показали, что на данный момент базовая установка проходит для всех поддерживаемых дистрибутивов, включая архитектуры ARM и x86.

Поддержка окружений рабочего стола

Добавлена поддержка окружения рабочего стола MATE, но из-за различных проблем с запуском GNOME и KDE, пришлось отказаться от их поддержки. Проблемы связаны с завышенными требованиями к ресурсам, а также отсутствием графического ускорения X и VNC в Android.

Запуск контейнеров без прав суперпользователя

Большие надежды возлагались на функцию запуска GNU/Linux приложений без прав суперпользователя, которая основывается на возможностях программы PRoot. Проект PRoot предлагает инструмент, который позволяет запускать приложения, требующие определенных системных привилегий, путем перехвата и подмены системных вызовов, используя механизм трассировки. К сожалению, сам проект не обновляется с 2015 года, поддержка прекращена. Однако был сделан форк проекта. Удалось внести ряд изменений и даже выпустить версию 5.1.1, благодаря чему PRoot заработал в Android 5+, и было добавлено расширение fake_link для эмуляции жестких ссылок, которые перестали работать в Android 6+. Но, к сожалению, усилия по доработке PRoot не оправдали себя, т. к. в Android 5+ настройки SELinux стали настолько суровыми, что часть системных вызовов перестали работать под обычным пользователем. Среди них работа с pty, управление пользователями и группами, доступ к /dev. На данный момент установка дистрибутивов без прав суперпользователя под Android 5+ не работает, а запуск уже готовых контейнеров возможен, но с большими ограничениями.

Поддержка систем инициализации

Ранее запуск скриптов внутри контейнера при его старте осуществлялся по списку. Сейчас появилась поддержка двух систем инициализации — run-parts и sysv. Система run-parts работает просто, указывается путь к файлу или каталогу, которые нужно запустить при старте контейнера. Если указана директория, то все файлы в директории запускаются в алфавитном порядке, в качестве параметра передается «start», а останавливаются в обратном порядке, и передается параметр «stop». Система инициализации sysv подразумевает указание уровня запуска (номер 0 - 5), запуск и остановка сценариев осуществляется в соответствии с данной системой инициализации. В качестве дополнительных опций можно указать пользователя, под которым будет выполняться запуск сценариев, а также способ запуска — асинхронный (параллельный) или обычный (последовательный).

Взаимодействие с Android из контейнера

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

am broadcast -a ru.meefik.linuxdeploy.BROADCAST_ACTION --user 0 --es "info" "Hello World!"

Отобразить предупреждение:

am broadcast -a ru.meefik.linuxdeploy.BROADCAST_ACTION --user 0 --es "alert" "Hello World!"

Скрыть сообщение:

am broadcast -a ru.meefik.linuxdeploy.BROADCAST_ACTION --user 0 --esn "hide"

Репозиторий контейнеров

Теперь помимо установки дистрибутивов из официальных источников есть возможность загрузить уже готовый контейнер из репозитория контейнеров (http://hub.meefik.ru). Это позволит сократить время установки и трафик, а также обойти некоторые возможные проблемы, которые могут возникнуть при установке обычным способом. На данный момент в репозитории доступны контейнеры с Debian (ARM и x86), остальные дистрибутивы становятся доступны после покупки приложения Piggy Helper (приложение для доната). Платный доступ к репозиторию продиктован необходимостью оплачивать хостинг с большим исходящим трафиком, а также необходимостью поддерживать архивы контейнеров в актуальном состоянии.

Другие интересные функции

На этом новые функции не заканчиваются. Помимо множества мелких доработок еще можно выделить следующие:

  • добавлена функция синхронизации рабочего окружения с сервером или другим устройством (команда linuxdeploy sync);
  • добавлена генерация случайного пароля пользователя (вместо changeme);
  • добавлена функция отслеживания изменения сети и обновления текущего контейнера (параметр NET_TRIGGER может содержать путь к файлу, который будет выполняться при изменениях в сети);
  • добавлена возможность добавлять пользователей в группы aid_* из интерфейса приложения (параметр PRIVILEGED_USERS);
  • добавлена опция предотвращения торможения процессора при отключении экрана;
  • расширен синтаксис описания точек монтирования, теперь можно указывать откуда и куда монтировать (/from/dir:/to/dir).

Обратная связь

Поддержка русскоговорящих пользователей осуществляется на форуме 4pda.ru, а англоговорящих — в разделе вопросов на странице проекта в GitHub. Само приложение можно скачать в Google Play, на форуме 4pda.ru или в GitHub.