Meefik's Blog

Freedom and Open Source

Релиз Linux Deploy 2.0

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

linuxdeploy

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

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

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

Интерфейс командной строки (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.

Окружение рабочего стола в Linux Deploy

Linux Deploy поддерживает автоматическую установку и настройку нескольких наиболее распространенных окружений рабочего стола. В версии LD 2.0 оставлена поддержка окружений XTerm (терминал на весь экран), LXDE, Xfce и MATE. Эти окружения есть почти во всех поддерживаемых LD дистрибутивах, они не сильно требовательны к ресурсам и могут работать без графического ускорения. Однако запустить другие окружения рабочего стола можно вручную. Для этого нужно в настройках LD выбрать окружение рабочего стола “Другое” и выполнить команду “Конфигурировать”. После этого нужно подключиться к контейнеру, установить пакеты нужного окружения рабочего стола, и под пользователем (по умолчанию - android) отредактировать файл ~/.xsession, прописав команду запуска рабочего окружения.

Установку и настройку различных рабочих окружений можно выполнить следующим образом (на примере дистрибутива Debian/Ubuntu):

1. GNOME

Установка:

apt-get install desktop-base x11-xserver-utils xfonts-base xfonts-utils gnome-core

Файл ~/.xsession:

XKL_XMODMAP_DISABLE=1
export XKL_XMODMAP_DISABLE
if [ -n "`gnome-session -h | grep '\-\-session'`" ]
then
gnome-session --session=gnome
else
gnome-session
fi

2. KDE

Установка:

apt-get install desktop-base x11-xserver-utils xfonts-base xfonts-utils kde-standard

Файл ~/.xsession:

startkde

3. E17

Установка:

apt-get install desktop-base dbus-x11 x11-xserver-utils xfonts-base xfonts-utils e17

Файл ~/.xsession:

enlightenment_start

4. Cinnamon

Установка:

apt-get install desktop-base x11-xserver-utils xfonts-base xfonts-utils cinnamon

Файл ~/.xsession:

XKL_XMODMAP_DISABLE=1
export XKL_XMODMAP_DISABLE
cinnamon

Реализация WebSocket-сервера на SH

Websocket.sh - кроссплатформенная реализация WebSocket сервера на SH. Для работы требуется только busybox, вместо bash можно использовать ash. Может использоваться во встраиваемых системах.

Bash-оболочка через веб-браузер

Для демонстрации работы websocket.sh подготовлен простой сценарий (файл /cgi-bin/terminal), позволяющий получить доступ к shell из браузера. Для этого сначала нужно запустить httpd (из пакета busybox) в директории с websocket.sh.

Для запуска примера работы через библиотеку JQuery Terminal Emulator, позволяющая реализовать выполнение простых команд и отображение результата выполнения, нужно выполнить:

cd jquery.terminal
WS_SHELL="sh" httpd -p 8080

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

cd xterm.js
telnetd -p 5023 -l /bin/bash -f /etc/issue
WS_SHELL="telnet 127.0.0.1 5023" httpd -p 8080

После этого достаточно открыть страницу в браузере http://localhost:8080/cgi-bin/terminal, где должна отобразиться командная строка терминала.

websocket.sh

Чтобы корректно обрабатывалось изменение размера терминала в зависимости от размера окна (в xterm.js), нужно чтобы в файле issue присутствовал символ “\l”. Или просто ввести команду tty в браузере для отображения текущего устройства pty.

Ручной запуск

Можно обойтись без httpd, запустив websocket.sh вручную, однако при перезагрузке страницы браузера скрипт придется запускать заново:

WS_SHELL="sh" nc -l -p 5000 -e websocket.sh

Здесь используется версия NetCat из пакета busybox, имеющая параметр -e. Также, возможно, в самом скрипте потребуется указать другой путь к интерпретатору, например, так:

#!/bin/busybox ash
...

Теперь из браузера можно подключиться к серверу по порту 5000 через WebSocket:

var port = 5000;
var ws = new WebSocket('ws://' + location.hostname + ':' + port);
ws.onmessage = function(msg) {
// convert base64 to string
var data = atob(msg.data);
// decode utf-8 chars
data = decodeURIComponent(escape(data));
console.log('Received data: ', data);
}
ws.onclose = function() {
console.log('Connection closed.');
}
// send command: ls /
var data = 'ls /';
// encode utf-8 chars
data = unescape(encodeURIComponent(data));
// convert string to base64
data = btoa(data);
ws.send(data);

Прослойка websocket.sh создавалась для Linux Deploy, чтобы получить возможность управлять контейнерами из браузера, однако может быть использована и для других целей.

Применение Linux Deploy CLI на десктопах

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

Linux Deploy CLI - это приложение с интерфейсом для командной строки, предназначенное для автоматизации процесса установки, конфигурирования и запуска GNU/Linux дистрибутивов внутри контейнера chroot. Приложение может работать как в обычных десктопных Linux-дистрибутивах, так и на мобильных платформах, основанных на ядре Linux, при условии соблюдения необходимых зависимостей (все зависимости могут быть собраны статически). Приложения из Linux-дистрибутива запускаются в chroot окружении, работают параллельно с основной системой и сопоставимы с ней по скорости. Поскольку работа Linux Deploy базируется на системном вызове ядра Linux, то в роли “гостевых” систем могут выступать только дистрибутивы Linux.

Приложение может работать в двух режимах: с правами суперпользователя (chroot) и без них (proot). В обычном режиме доступны все поддерживаемые типы установки: установка в файл, на раздел диска (логический диск), в POSIX совместимую директорию и в оперативную память (tmpfs). В режиме proot доступна установка только в директорию, а также появляется ряд ограничений:

  • все пользователи внутри контейнера имеют полный доступ ко всей файловой системе контейнера, а владельцем всех файлов и каталогов является текущий пользователь;
  • нет доступа к привилегированным операциям с системой, например, не работает ping, ulimit и т.п.;
  • приложения могут работать только с номерами сетевых портов выше 1024;
  • если приложение в своей работе использует системный вызов chroot, то его необходимо запускать через специальную утилиту fakechroot, например fakechroot /usr/sbin/sshd -p 2222.

Приложение поддерживает автоматическую установку (базовой системы) и начальную настройку дистрибутивов Debian, Ubuntu, Kali Linux, Arch Linux, Fedora, CentOS, Gentoo, openSUSE и Slackware. Установка Linux-дистрибутива осуществляется по сети с официальных зеркал в интернете. Также поддерживается импорт любой другой системы из заранее подготовленного rootfs-ахрива в формате tar.gz, tar.bz2 или tar.xz. Приложение позволяет подключаться к консоли установленной системы (контейнеру), а также запускать и останавливать приложения внутри контейнера (есть поддержка различных систем инициализации и собственных сценариев автозапуска). Каждый вариант установки сохраняется в отдельный конфигурационный файл, который отвечает за настройку каждого контейнера. При необходимости, контейнеры можно запускать параллельно. Можно экспортировать конфигурацию и сам контейнер как rootfs-архив для последующего развертывания этого контейнера без повторной установки и настройки.

Вообще, идея Linux Deploy возникла из желания получить легкий и удобный инструмент для быстрого развертывания Linux-дистрибутива, который можно было бы использовать для целей разработки, тестирования или обучения, а затем быстро удалить его, не внося изменения в основную (хост) Linux-систему и не рискуя ее целостностью. Благодаря программе proot стало возможным создавать контейнеры для запуска Linux-приложений без прав суперпользователя (root), а также использовать программную эмуляцию QEMU для запуска приложений с отличающийся от хоста архитектурой без необходимости поддержки модуля binfmt_misc на уровне ядра.

Так вышло, что на моей основной работе с 2011 года используются компьютеры с Debian. Местные разработчики периодически нуждаются в системе для запуска и тестирования своих веб-приложений (в основном Java, PHP, Python). Для этих целей обычно использовались виртуальные системы либо на базе VirtualBox, либо в местном “облаке” Proxmox, либо Docker. Основным недостатком VirtualBox является его требовательность к ресурсам компьютера, большой размер VDI образа диска, относительно невысокая скорость работы и вероятность поломки образа VM при неправильном выключении системы. Недостатком при использовании “облака” можно назвать необходимость самому администратору обслуживать запросы пользователей на создание таких систем, а также расходование ресурсов “облака” на второстепенные задачи. Для работы с Docker требуются права суперпользователя.

В этом месяце был проведен эксперимент, PHP-разработчикам их виртуальный сервер был заменен на LD-контейнер. Были подготовлены два контейнера на базе Debian: Apache + PHP + OCI8 и Apache + PHP + MySQL + PhpMyAdmin. Контейнеры были размещены на общем сетевом диске в локальной сети, размер каждого контейнера составил около 150 МБ.

Что от этого получил администратор:

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

Что получил разработчик:

  • развертывание, запуск и управление системой в контейнере осуществляется без участия администратора одной командой;
  • развертывание контейнера из заранее подготовленных архивов осуществляется по сети менее чем за минуту;
  • запуск и остановка контейнера (Веб-сервер + БД) происходит мгновенно, не нужно ждать запуска операционной системы;
  • нет риска повредить контейнер, если забыл его отключить при выключени компьютера, т.к. образ системы представляет собой обычный каталог без собственной файловой системы;
  • компьютер работает быстрее, т.к. ресурсы тратятся только на запускаемый софт в контейнере, а не на всю операционную систему (в нашем случае это порядка 50 МБ, вместо 500 МБ в VirtualBox).
  • проверка работоспособности ПО прямо из каталога IDE без необходимости заливать его на сервер, для этого достаточно подключить к контейнеру необходимый каталог основной системы.

А теперь более подробно о том, как этого добиться. Далее будет приведена инструкция по подготовке и развертыванию LD-контейнера.

Для запуска контейнеров без прав суперпользователя необходимо установить proot:

mkdir ~/bin
wget http://portable.proot.me/proot-x86_64 -O ~/bin/proot
chmod 755 ~/bin/proot

Загрузка и установка Linux Deploy CLI:

wget https://github.com/meefik/linuxdeploy/archive/cli.zip
unzip cli.zip
rm cli.zip
ln -sf ~/linuxdeploy-cli/cli.sh ~/bin/linuxdeploy

Создание конфигурации с именем “linux” для развертывания базовой системы Debian Wheezy (64 бита):

linuxdeploy -p linux conf --method='proot' --source-path='http://mirror.yandex.ru/debian/' \
--distrib='debian' --arch='amd64' --suite='wheezy' --target-path='$ENV_DIR/rootfs/linux' \
--chroot-dir='$TARGET_PATH' --target-type='directory' --username='webmaster' --include='bootstrap'

Посмотреть сохраненную конфигурацию:

linuxdeploy -p linux conf -x

Запуск развертывания новой системы:

linuxdeploy -p linux deploy

Подключение к консоли контейнера под пользователем root (для выхода команда exit):

linuxdeploy -p linux shell -u root

Далее можно установить и настроить необходимый софт в контейнере, однако следует учитывать описанные ранее особенности. Например, для запуска Apache нужно поменять его порт (файл /etc/apache2/ports.conf) на 8000, установить пустой параметр APACHE_ULIMIT_MAX_FILES=” “ (файл /etc/apache2/envvars), а сам apachectl запускать из-под обычного пользователя (не root).

Настройка автозапуска на базе системы инициализации SysV:

linuxdeploy -p linux conf --include='$INCLUDE init' --init='sysv' --init-level='3' --init-user='$USER_NAME' --init-async

Параметры: INIT_LEVEL - уровень инициализации SysV, INIT_USER - из-под какого пользователя запускать сервисы (по умолчанию это root), INIT_ASYNC - запускать сервисы параллельно.

Подготовка конфигурации, экспорт ее и экспорт контейнера в rootfs-архив (поддерживаются tar.gz, tar.bz2 и tar.xz архивы):

linuxdeploy -p linux conf --source-path='linux.tgz' --target-path='\$ENV_DIR/rootfs/linux' --chroot-dir='\$TARGET_PATH'
linuxdeploy -p linux conf -x > /path/to/linux.conf
linuxdeploy -p linux export /path/to/linux.tgz

Экранирование “$” позволяет сохранять в конфиг имена переменных, а не их значения. Таким образом при импорте конфига эти переменные будут автоматически заменены на соответствующие значения, которые могут отличаться от текущих.

Теперь есть два файла (linux.conf и linux.tgz), которые можно использовать при импорте контейнера на другом компьютере:

cd /path/to
linuxdeploy -p linux conf -i ./linux.conf
linuxdeploy -p linux deploy

Подключить к контейнеру каталог основной системы (каталог ~/www подключить в /var/www контейнера):

linuxdeploy -p linux conf --mounts='$HOME/www:/var/www'

Запуск контейнера (для SysV выполняются сценарии /etc/rcN.d/SXXname start):

linuxdeploy -p linux start

Остановка контейнера с освобождением ресурсов (для SysV выполняются сценарии /etc/rc6.d/KXXname stop):

linuxdeploy -p linux stop -u

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

Предварительный обзор Linux Deploy 2.0

Готовится к выходу следующая версия Linux Deploy, которая будет включать много новых интересных функций. Вот основные из них:

  • работа с контейнерами без прав суперпользователя (на базе proot), в том числе эмуляция архитектуры без необходимости поддержки модуля binfmt_misc на уровне ядра;
  • модульная архитектура на основе подключаемых компонентов;
  • обновленный интерфейс приложения для Android;
  • встроенный в Android-приложение интерфейс управления через telnet и веб-интерфейс;
  • расширенный CLI для управления контейнерами из командной строки;
  • CLI с поддержкой различных платформ на базе ядра Linux, не только Android;
  • репозиторий готовых контейнеров (конфигурации контейнеров и rootfs-архивы к ним).

Уже сейчас доступен для тестирования интерфейс командной строки Linux Deploy 2.0, который существенно изменился. Теперь он позволяет создавать, настраивать и полностью управлять контейнерами через команду linuxdeploy. Каждый контейнер имеет конфигурационный файл, содержащий в себе все параметры развертывания и запуска конкретного дистрибутива. Можно работать с несколькими конфигурациями, переключаясь между ними при необходимости. Linux Deploy теперь имеет модульную архитектуру, состоящую из отдельных компонентов, написанных на Bash-совместимом языке сценариев Ash. Компоненты связаны между собой зависимостями и подключаются в заданном порядке, есть защита от циклических зависимостей. Каждый компонент имеет пять базовых функций, которые являются обработчиками действий: установка, конфигурация, запуск, остановка, справка. Компоненты имеют древовидную структуру и располагаются в корневом каталоге, который задается в переменной окружения INCLUDE_DIR. Каждый компонент представляет собой каталог, в котором содержатся необходимые компоненту файлы. Основных файлов два: deploy.conf - конфигурация компонента, deploy.sh - функции компонента.

Компоненты разделены на несколько групп, отвечающих за какой-то определенный функционал. Например, группа компонентов bootstrap отвечает за подготовку rootfs и развертывание дистрибутива. Группа компонентов core включает основные настройки дистрибутивов и базовые функции для работы с контейнерами. Есть еще группы для поддержки различных систем инициализации (init), графических подсистем (graphics) и окружений рабочего стола (desktop), а также коллекция компонентов для установки и запуска различного программного обеспечения. Комбинируя компоненты можно собрать собственную версию дистрибутива с необходимым набором программ.

Допустим, мы хотим создать контейнер с Arch Linux в базовой комплектации. Чтобы создать контейнер, первым делом, нужно задать его параметры, для этого следует использовать команду config:

linuxdeploy -p arch config --target-path='linux.img' --chroot-dir='/mnt' \
--target-type='file' --disk-size='2000' --fs-type='auto' \
--source-path='http://mirrors.kernel.org/archlinux/' --distrib='archlinux' --arch='i686' \
--user-name='android' --include='bootstrap'

Дамп получившегося конфигурационного файла можно получить командой:

linuxdeploy -p arch config -x
TARGET_PATH="linux.img"
CHROOT_DIR="/mnt"
TARGET_TYPE="file"
DISK_SIZE="2000"
FS_TYPE="auto"
SOURCE_PATH="http://mirrors.kernel.org/archlinux/"
DISTRIB="archlinux"
ARCH="i686"
USER_NAME="android"
INCLUDE="bootstrap"

Когда базовые параметры установлены, можно запускать установку командой deploy:

linuxdeploy -p arch deploy

Эта команда без параметров запускает установку и конфигурацию всех подключенных через параметр INCLUDE компонентов, в данном случае это bootstrap. После завершения процесса развертывания и конфигурации можно подключиться к контейнеру командой shell:

linuxdeploy -p arch shell -u root

Возможно, нам понадобится в последствии установить какие-то дополнительные компоненты без переустановки базовой системы, тогда можно воспользоваться следующей командой, например, для установки ssh-сервера:

linuxdeploy -p arch deploy -n bootstrap extra/ssh

Здесь опция “-n bootstrap” исключает из установки компоненты группы bootstrap, от которых зависит компонент extra/ssh. Аналогичным образом будут работать следующие команды, однако компонент extra/ssh будет сохранен в конфигурации контейнера:

linuxdeploy -p arch config --include='${INCLUDE} extra/ssh'
linuxdeploy -p arch deploy -n bootstrap

Здесь переменная ${INCLUDE} берется из текущей конфигурации и в данном случае содержит “bootstrap”. Развернутый контейнер можно экспортировать как rootfs-архив:

linuxdeploy -p arch export rootfs.tar.gz

Иногда нужно импортировать дистрибутив из rootfs-архива, для этого можно воспользоваться такими командами:

linuxdeploy -p arch config --source-path='rootfs.tar.gz'
linuxdeploy -p arch deploy bootstrap/rootfs

Список созданных конфигураций можно посмотреть через команду conf:

linuxdeploy -p arch config
arch archlinux i686 latest bootstrap extra/ssh
centos centos i386 7 bootstrap init
debian debian i386 jessie bootstrap graphics desktop
fedora fedora i386 21 bootstrap
gentoo gentoo i686 latest bootstrap
kali kalilinux i386 sana bootstrap
opensuse opensuse i586 13.2 bootstrap
slackware slackware x86 latest bootstrap
ubuntu ubuntu i386 wily bootstrap

Список доступных компонентов можно посмотреть через команду conf. Каждый компонент имеет совместимость со всеми или только некоторыми дистрибутивами. Список подключенных (через INCLUDE) и совместимых с текущей конфигурацией компонентов с их зависимостями можно получить командой:

linuxdeploy -p arch config -l
bootstrap Installer of Linux distibution
bootstrap/debian Bootstrap for Debian GNU/Linux
bootstrap/rootfs Prepare and import RootFS
core Core components
core/aid Android users and groups
core/emulator CPU emulation
core/hostname Hostname
core/hosts Hosts file
core/locale Localization
core/mnt Mount points configuration
core/motd Message after a successful login
core/net Network configuration
core/profile User and its environment
core/proot PRoot configuration
core/su SU command
core/sudo Sudoers file
core/timezone Time zone
core/unchroot Break chroot

Список всех компонентов:

linuxdeploy config -la

Список зависимостей для конкретного компонента:

linuxdeploy -p arch config -l extra/ssh

Запуск/остановка текущей конфигурации со всеми компонентами делается командами start и stop, например:

linuxdeploy -p arch start

Справку по всем подключенным компонентам можно получить командой help, информацию о конкретном компоненте можно получить так:

linuxdeploy help extra/ssh
Name: extra/ssh
Description: Secure shell (SSH) server
Target: debian:*:* ubuntu:*:* kalilinux:*:* archlinux:*:* fedora:*:* opensuse:*:* gentoo:*:* slackware:*:*
Depends: extra
Help:
--ssh-port=PORT
Port of SSH server.
--ssh-args=STR
Defines other sshd options, separated by a space.

На данный момент идет тестирование и отладка CLI, удалось добиться установки без прав суперпользователя дистрибутивов Debian (wheezy), Ubuntu (precise), Kali Linux (moto), Arch Linux, Gentoo и Slackware.

BusyBox для Android

Приложение представляет собой инсталлятор последней версии BusyBox для Android. Приложение содержит сборку BusyBox для различных аппаратных архитектур и является сборкой с наиболее полным набором функций, на данный момент поддерживается 335 апплетов (для busybox v1.23.2). Приложение позволяет установить в систему BusyBox или удалить уже установленный. Есть возможность выбора директории установки и режима установки (с установкой апплетов, с заменой существующих апплетов или без). Также сборку можно сохранить на карту памяти в виде zip-архива для последующей установки через рекавери.

Что же такое BusyBox? BusyBox содержит крошечные версии многих утилит UNIX в одном маленьком исполняемом файле. Он обеспечивает замену для большинства утилит, которые можно найти в GNU fileutils, shellutils и др. Утилиты BusyBox обычно имеют меньше возможностей, чем их полнофункциональные собратья GNU, однако те функции, которые включены в BusyBox, совместимы с аналогичными функциями утилит GNU. BusyBox предоставляет довольно полное окружение для любых мобильных или встраиваемых систем.

Требования:

  • Устройство с архитектурой ARM, x86 или MIPS
  • Android 2.3 (API 9) или выше
  • Права суперпользователя (root)

busybox

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/busybox
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.busybox

Обновление часовых поясов в Android

Приложение появилось из-за сложившийся сложной ситуации с обновлением часовых поясов в Android. Международная база данных часовых поясов обновляется каждый месяц, но нет никаких штатных средств обновления этой базы на устройствах. Следить за обновлениями часовых поясов и выпускать своевременные обновления прошивок, по идее, должны производители устройств, но на деле этого нет. В итоге было разработано приложение Timezone Updater, которое скачивает и обновляет до последней версии данные часовых поясов на Android-устройстве. Обновляются база данных часовых поясов и ICU данные. На устройстве изменяются следующие файлы:

  • /data/misc/zoneinfo/tzdata или /system/usr/share/zoneinfo/*
  • /system/usr/icu/*.dat

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

Для работы приложения необходимы:

  • Android 2.3 (API 9) или выше
  • права суперпользователя (root)
  • установленный BusyBox

tzupdater

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/tzupdater
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.tzupdater

Интеграция Linux Deploy с Android

Начиная с версии 1.5.3 в Linux Deploy начаты работы по интеграции GNU/Linux контейнеров с окружением Android. Это открывает следующие возможности:

  • доступ ко всей файловой системе Android;
  • выполнение приложений/команд Android прямо из контейнера (например, getprop, reboot, shutdown);
  • переключение между консолью контейнера и Android (команда unchroot).

Для активации возможности запуска Android-приложений нужно в параметрах разрешить монтирование (Параметры -> Монтирование), а в качестве точки монтирования (Параметры -> Точки монтирования) должен быть добавлен каталог /system (добавлен по умолчанию). После этого нужно нажать кнопку СТАРТ в приложении, чтобы каталог смонтировался в контейнере. Команды из Android будут доступны из консоли контейнера, если их названия не пересекаются с аналогичными в контейнере, либо доступны по полному пути, например /system/bin/ls. Команды reboot и shutdown автоматически переопределены в контейнере и вызывают аналогичные команды из Android.

Если возможностей запуска некоторых команд из Android недостаточно, то можно воспользоваться переключением между консолью контейнера и Android командой unchroot внутри контейнера. Вызов unchroot без параметров открывает sh из Android со всеми его переменными окружения, вызов с параметрами запускает соответствующую команду в Android. Например:

root@THL:/ # linuxdeploy shell
Configuring the container:
dns ... done
mtab ... done
Debian GNU/Linux 8 (jessie) [running on Android via Linux Deploy]
root@localhost:/# unchroot getprop ro.product.model
thl 5000
root@localhost:/# unchroot
root@THL:/ # ls /data/
...
root@THL:/ # exit
root@localhost:/#

Таким образом, имея доступ к Android прямо из контейнера, можно организовывать более плотную интеграцию запускаемых приложений внутри GNU/Linux контейнеров с системой Android.

Немного о Linux Deploy

Проекту Linux Deploy (сокращенно LD) уже три года, и вот немного статистики. Текущая версия LD 1.5.2-160 - это 52 релиза и 160 обновлений, на github выложено 18 805 строк кода. Поддерживается более 10 000 устройств начиная с версии Android 2.1. Около 500 тыс. установок. На данный момент LD поддерживает 8 дистрибутивов (Debian, Ubuntu, Kali Linux, Fedora, Arch Linux, Gentoo, openSUSE, Slackware), для которых специально написаны инсталяторы и конфигураторы. Для каждого дистрибутива поддерживается от 2 до 9 архитектур (разновидности ARM и x86, 32 и 64 бита) и от 1 до 7 релизов. В общей сложности поддерживается 121 вариант версий дистрибутивов и их архитектур. Каждый дистрибутив может быть автоматически сконфигурирован для работы с 1 из 5 поддерживаемых окружений рабочего стола (XTerm, LXDE, Xfce, GNOME, KDE), не говоря уже о конфигурировании SSH, VNC и Xorg. С учетом окружений рабочего стола (дистрибутив/архитектура/окружение рабочего стола) получается 597 вариантов установки, которые могут быть автоматически развернуты и сконфигурированы через LD.

Немногие знают, но в LD есть интерфейс командной строки (CLI), который доступен из терминала через команду linuxdeploy. С помощью CLI можно управлять процессом развертывания дистрибутивов без графического интерфейса Android. Также, в последних версиях, CLI поддерживает работу не только в Android, но и на обычных компьютерах под GNU/Linux операционными системами. Это может быть полезно для экспериментов с разными дистрибутивами, их версиями и архитектурами. Что касается архитектуры, то LD поддерживает кросс-архитектурную инсталляцию ARM <-> x86, эмуляция реализована с помощью QEMU и работает в обе стороны, т.е. можно запускать x86 дистрибутивы на ARM архитектуре и ARM дистрибутивы на x86 арxитектуре. Для поддержки режима эмуляции в Linux-ядре должна присутствовать поддержка binfmt_misc.

Часто уже готовые сборки дистрибутивов распространяют в виде rootfs-архивов, которые представляют собой tar-архив корневой файловой системы. Такие архивы используются в системах виртуализации, основанных на контейнерах, например, OpenVZ или Docker. LD поддерживает установку из rootfs-архивов, для этого в параметрах LD достаточно выбрать тип установки RootFS и указать путь к архиву на карте памяти или ссылку на архив в интернете. В последних версиях добавлена функция экспорта в виде rootfs-архива уже установленной в LD системы. В дальнейшем можно будет использовать репозитории контейнеров для развертывания и запуска их через LD.

Linux Deploy - открытый некоммерческий проект, развитие которого зависит в том числе от вклада сторонних людей. Если вы заинтересованы в данном проекте, то поддержите его своим участием или сделайте пожертвование в копилку проекта, это поможет его развитию.

Установка GNU/Linux в оперативную память

Современные модели мобильных устройств комплектуются значительным объемом оперативной памяти, например, ThL 5000 имеет 2 ГБ ОЗУ и 1 ГБ swap памяти. Система Android и системные приложения используют не более 1 ГБ оперативной памяти. Таким образом, остается еще как минимум 1 ГБ памяти, которую можно использовать в своих целях.

В Linux Deploy версии 1.5.1 добавлена поддержка установки дистрибутивов GNU/Linux в оперативную память. Для этих целей создается tmpfs точка монтирования заданного размера, куда будет осуществляться установка дистрибутива. Для использования данной функции в Linux Deploy достаточно выбрать “Параметры -> Тип установки -> Оперативная память” (“Properties -> Installation type -> RAM”) и ниже указать размер создаваемого образа в мегабайтах. Если указано 0, то размер образа будет рассчитываться автоматически, исходя из объема свободной оперативной памяти.

Производительность GNU/Linux системы в таком режиме очень хорошая, приложения моментально запускаются, а интерфейсы реагируют на действия мгновенно. Также порадует и время установки дистрибутива. Например, базовый Debian на ThL 5000 устанавливается по Wi-Fi за 3 минуты, а вместе с графическим окружением LXDE и SSH сервером - за 5 минут. Минимальный размер образа для Debian: минимальная установка - 300 МБ, окружение рабочего стола LXDE + SSH сервер - 700 МБ.

Данный тип установки хорошо подходит для быстрой проверки чего-либо или быстрого доступа к каким-то функциям GNU/Linux дистрибутива без необходимости постоянного хранения образа системы. Следует помнить, что все данные, хранящиеся на диске в оперативной памяти, бесследно пропадут при перезагрузке устройства. Эту особенность можно использовать и с точки зрения безопасности, перезагрузка устройства сотрет все следы работы в GNU/Linux без возможности какого-либо восстановления.