Meefik’s Blog

Freedom and Open Source

Применение 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:

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

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

1
2
3
4
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 бита):

1
2
3
linuxdeploy -f 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'

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

1
linuxdeploy -f linux conf -x

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

1
linuxdeploy -f linux deploy

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

1
linuxdeploy -f linux shell -u root

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

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

1
linuxdeploy -f linux conf --include='$INCLUDE init' --init='sysv' --init-level='3' --init-user='$USER_NAME' --init-bg

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

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

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

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

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

1
2
3
cd /path/to
linuxdeploy -f linux conf -i ./linux.conf
linuxdeploy -f linux deploy

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

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

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

1
linuxdeploy -f linux start

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

1
linuxdeploy -f 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:

1
2
3
4
linuxdeploy -f 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'

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

1
linuxdeploy -f arch config -x
1
2
3
4
5
6
7
8
9
10
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:

1
linuxdeploy -f arch deploy

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

1
linuxdeploy -f arch shell -u root

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

1
linuxdeploy -f arch deploy -n bootstrap extra/openssh-server

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

1
2
linuxdeploy -f arch config --include='${INCLUDE} extra/openssh-server'
linuxdeploy -f arch deploy -n bootstrap

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

1
linuxdeploy -f arch export rootfs.tar.gz

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

1
2
linuxdeploy -f arch config --source-path='rootfs.tar.gz'
linuxdeploy -f arch deploy bootstrap/rootfs

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

1
linuxdeploy -f arch config
1
2
3
4
5
6
7
8
9
* arch            archlinux  i686       latest     bootstrap
- centos          centos     i386       7          bootstrap
- debian          debian     i386       jessie     bootstrap lxde
- 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) и совместимых с текущей конфигурацией компонентов с их зависимостями можно получить командой:

1
linuxdeploy -f arch config -l
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bootstrap/rootfs               Prepare and import RootFS
bootstrap/archlinux            Bootstrap for Arch Linux
core/fakeroot                  Without superuser privileges
core/emulator                  CPU emulation
core/dns                       DNS servers
core/mtab                      Mounted file systems table
core/motd                      Message after a successful login
core/hosts                     Hosts file
core/hostname                  Hostname
core/timezone                  Time zone
core/su                        SU command
core/profile                   User and its environment
core/sudo                      Sudoers file
core/aid                       Android users and groups
core/locale                    Localization
core/repository                Repository for a package manager
core/unchroot                  Break chroot
core                           Core components
bootstrap                      Installer of Linux distibution

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

1
linuxdeploy config -la

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

1
linuxdeploy -f arch config -l extra/openssh-server

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

1
linuxdeploy -f arch start

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

1
linuxdeploy help extra/openssh-server
1
2
3
4
5
6
7
8
Name: extra/openssh-server
Description: Secure shell (SSH) server
Target: debian:*:* ubuntu:*:* kalilinux:*:* archlinux:*:* fedora:*:* opensuse:*:* gentoo:*:* slackware:*:*
Depends: extra
Help:

   --ssh-port=PORT
     Port of SSH server.

На данный момент идет тестирование и отладка 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. Например:

1
2
3
4
5
6
7
8
9
10
11
12
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 без возможности какого-либо восстановления.

Установка и настройка RDP-сервера

Linux Deploy в качестве графической подсистемы по умолчанию использует VNC, как наиболее нативный сбособ организации удаленного доступа к рабочему столу GNU/Linux системы. Однако можно настроить удаленный доступ и по протоколу RDP, используемый в операционных системах MS Windows. В примере используется дистрибутив Ubuntu 12.04 (Precise Pangolin), однако с небольшими изменениями это будет работать и в других дистрибутивах. В данном случае RDP будет работать поверх VNC-сервера, поэтому требуется чтобы он был установлен. В Linux Deploy VNC-сервер устанавливается по умолчанию.

Инструкция

  • Запустить предварительно установленную GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться к системе по SSH, VNC (IP-адрес для подключения указан в верхней строке главного окна приложения) или через Android-терминал (сценарий linuxdeploy shell).

  • Открыть командную строку (терминал) системы и переключиться в режим суперпользователя:

1
sudo -s
  • Установить пакет xrdp:
1
apt-get install xrdp
  • Разрешить пользователю xrdp работать с сетью:
1
usermod -aG aid_inet xrdp
  • Для автоматического запуска и остановки RDP-сервера через интерфейс Linux Deploy необходимо в параметрах разрешить сценарии пользователя (Параметры -> Сценарии пользователя) и в список сценариев добавить путь /etc/init.d/xrdp (Параметры -> Список сценариев).

  • Перезапустить GNU/Linux систему кнопками СТОП/СТАРТ из главного окна приложения.

  • Подключиться через RDP-клиент: module - sesman-Xvnc, username - android, password - changeme.

Управление Linux Deploy из командной строки

Помимо графического интерфейса Linux Deploy позволяет управлять экземпляром GNU/Linux системы из командной строки через эмулятор терминала Android. Для данных целей служит специальный сценарий linuxdeploy, который может запускаться из командной строки Android и принимает следующие параметры:

  • prepare - подготовить контейнер, создать образ и файловую систему;
  • mount - смонтировать контейнер;
  • umount - размонтировать контейнер;
  • install - запустить установку новой системы;
  • configure - запустить переконфигурацию контейнера;
  • start - запустить контейнер;
  • stop - остановить контейнер;
  • shell - выполнить chroot в контейнер;
  • status - информация о системе.

По умолчанию сценарий linuxdeploy находится в каталоге ENV_DIR/bin/linuxdeploy, где ENV_DIR - каталог рабочего окружения (по умолчанию /data/data/ru.meefik.linuxdeploy/linux), однако доступ к нему можно сделать более удобным (без указания полного пути к сценарию), если поместить символьную ссылку на этот сценарий в /system/bin. Для этого в настройках Linux Deploy есть опция Настройки -> Создать симлинк, после изменения параметра необходимо выполнить обновление окружения (Настройки -> Обновить окружение).

Все параметры, установленные через графический интерфейс Linux Deploy, хранятся в файле ENV_DIR/etc/deploy.conf. Их можно менять путем редактирования этого файла, однако следует учесть, что любые изменения параметров через графический интерфейс приведут к перезаписи файла и потере внесенных изменений. Переключение профилей также приводит к перезаписи конфигурационного файла. Однако оригинальный конфигурационный файл можно скопировать, например, на карту памяти, отредактировать его и указать этот файл в качестве параметра “-c FILE”.

Команда linuxdeploy shell, наверное, наиболее полезна и нужна для доступа к командной строке установленного дистрибутива прямо из терминала Android. Эта команда также имеет необязательный параметр, принимающий команду, которую необходимо выполнить после перехода в chroot, по умолчанию запускается командный интерпретатор bash.

Примеры использования:

1
2
3
linuxdeploy shell date
linuxdeploy shell "uname -a"
linuxdeploy shell /bin/bash

Сборка ядра Linux и модулей для Android

Дистрибутивы, запускаемые через Linux Deploy, работают с ядром Android (модифицированное ядро Linux), а потому изменить конфигурацию ядра или подключить новые модули можно только путем пересборки этого ядра, либо сборки модулей под данную версию ядра.

Инструкция

  • Скачать и подготовить Android NDK:
1
2
3
4
wget http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
tar -jxf android-ndk-r9d-linux-x86.tar.bz2
export ARCH=arm
export CROSS_COMPILE=$(pwd)/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
  • Скачать и подготовить Android SDK, понадобятся утилиты adb и fastboot:
1
2
3
4
wget http://dl.google.com/android/android-sdk_r13-linux_x86.tgz
tar -zxf android-sdk_r13-linux_x86.tgz
android-sdk-linux_x86/tools/android update sdk -u -t platform-tool
export PATH=$PATH:$(pwd)/android-sdk-linux_x86/platform-tools
  • Получить исходники ядра данного устройства (в нашем случае это tinykernel-flo для Nexus 7 (2013), либо скачать аналогичную версию с kernel.org):
1
2
git clone -b tiny-jb-mr2 https://github.com/meefik/tinykernel-flo
cd tinykernel-flo
  • Получить файл конфигурации ядра с устройства (ядро должно быть собрано с поддержкой данной возможности):
1
adb shell cat /proc/config.gz | gzip -d > .config

либо из boot.img (как извлечь boot описано ниже):

1
scripts/extract-ikconfig boot.img > .config
  • Если получить файл конфигурации ядра не получилось, то можно воспользоваться предварительной конфигурацией из поставки ядра (список конфигураций arch/arm/configs):
1
make flo_defconfig
  • Узнать точную версию ядра устройства:
1
adb shell cat /proc/version

Рузультат команды:

1
2
Linux version 3.4.0-g03485a6 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.7 (GCC) )
 #1 SMP PREEMPT Tue Mar 18 15:02:27 PDT 2014

В данном случае полной версией ядра будет строка “3.4.0-g03485a6”.

  • Установить локальную версию ядра (то что отображается после основной версии 3.4.0):
1
echo "-g03485a6" > .scmversion
  • Изменить конфигурацию ядра в файле .config или командой:
1
make menuconfig

В нашем случае в файл .config изменены следующие строки (включена поддержка модулей и включен модуль binfmt_misc):

1
2
CONFIG_MODULES=y
CONFIG_BINFMT_MISC=m
  • Запустить сборку ядра:
1
make

либо только модулей:

1
make modules
  • Скачать утилиты для работы с загрузочным образом (boot.img):
1
2
git clone https://github.com/meefik/binary-tools-android.git
cd binary-tools-android
  • Получить загрузочный образ с устройства (ядро хранится на специальном boot разделе):
1
adb shell su -с 'dd if=/dev/block/platform/msm_sdcc.1/by-name/boot' > boot.img

Путь может отличаться на других устройствах, определить его можно командой:

1
adb shell su -c 'ls /dev/block/platform/*/by-name/boot'
  • Получить информацию об образе:
1
./boot_info boot.img

Результат выглядит так:

1
2
3
4
5
6
7
Page size: 2048 (0x00000800)
Kernel size: 6722240 (0x006692c0)
Ramdisk size: 492556 (0x0007840c)
Second size: 0 (0x00000000)
Board name:
Command line: 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3'
Base address: 2149580800 (0x80200000)
  • Извлечь kernel и ramdisk из boot.img, заменить ядро и запаковать обратно:
1
2
3
4
5
6
./unmkbootimg boot.img
./mkbootimg --kernel ../tinykernel-flo/arch/arm/boot/zImage \
    --ramdisk initramfs.cpio.gz \
    --base 0x80200000 \
    --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3' \
    -o new_boot.img
  • Прошить устройство новым ядром:
1
2
adb reboot bootloader
fastboot flash boot new_boot.img
  • Загрузить модуль на устройстве:
1
2
3
4
5
6
7
8
9
10
adb push ../tinykernel-flo/fs/binfmt_misc.ko /storage/sdcard0/binfmt_misc.ko
adb shell
su
mount -o rw,remount /system
mkdir /system/lib/modules
cp /storage/sdcard0/binfmt_misc.ko /system/lib/modules/binfmt_misc.ko
chmod 644 /system/lib/modules/binfmt_misc.ko
insmod /system/lib/modules/binfmt_misc.ko
exit
exit
  • Следует учесть, что vermagic модуля должен полностью соответствовать версии ядра (с точностью до символа), иначе загрузить новый модуль не удастся. Необходимо узнать vermagic модуля и сравнить его с уже присутствующими на устройстве модулями:
1
modinfo binfmt_misc.ko

Результат выглядит примерно так:

1
2
3
4
5
filename:       /path/to/kernel/fs/binfmt_misc.ko
license:        GPL
depends:
intree:         Y
vermagic:       3.4.0-g03485a6 SMP preempt ARMv7