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

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

Linux Deploy

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 -O cli.zip https://github.com/meefik/linuxdeploy-cli/archive/master.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 доступны под лицензией GPL версии 3.
Метки:
  • +11
  • 14,9k
  • 7
Поделиться публикацией
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 7
  • 0
    Честно говоря, особо не понял, зачем это все. Как средство доставки систем есть такие вещи, как debbootstrap или даже vagrant, про средства контейнеризации же сегодня не слышал только ленивый.

    Опять же, в чем выгода использовать обычный chroot, без изоляции процессов и сетевого стека?

    В общем, на мобилках еще куда не шло, но на том же андроиде вполне себе реализуется функционал LXC.
    • +1
      Linux Deploy всего лишь инструмент автоматизации, как debootstrap, только с поддержкой разных дистрибутивов и расширенным функционалом.

      Да, Linux Deploy в обычном режиме использует chroot, может быть в будущем появится поддержка и LXC…

      Однако в статье описан способ использования контейнеров без прав суперпользователя, LXC или chroot здесь не подойдут.
      • 0
        способ использования контейнеров без прав суперпользователя, LXC или chroot здесь не подойдут.

        LXC здесь подойдет как нельзя лучше, благо прекрасно поддерживает непривелигированные контейнеры.
    • +2
      Огромное спасибо meefik за Linux Deploy! Именно благодаря Linux Deploy мой Android трансформер был прекрасной машиной для работы в дороге (батареи хватало на гораздо дольше, чем меня :)). Я успешно настроил себе bash, ssh, vim, python, MySQL, PostgreSQL и Rabbitmq.

      Тем не менее, при работе на полноценном Linux нынче есть, например, vagga для случая, когда root нельзя давать ни под каким соусом, а значит Docker уже будет сложнее использовать (хотя можно, наверно, свои обёртки написать, в которых не развенёшься и не запустишь ничего кроме того, что разрешено).
      • +1
        Спасибо за отзыв) Что касается vagga, то тут могу просто перечислить возможные отличия LD:
        • готовый инструмент для сборки rootfs необходимого дистрибутива (на данный момент «из коробки» поддерживается 123 варианта развертывания базовой системы, если учитывать дистрибутив, его версию и архитектуру), для каждого поддерживаемого дистрибутива написан свой bootstrap;
        • поддержка эмуляции архитектуры для запуска, например, ARM-дистрибутивов, может использоваться при кросс-компиляции;
        • возможность запуска Linux Deploy CLI на x86, ARM и MIPS архитектурах, не требуется поддержки специальных опций в ядре (для декстопов не актуально).
        • 0
          Я вот почитал про внутреннее устройство vagga и хоть оно и работает без root'a, но требует дырявую CONFIG_USER_NS (Arch Linux поэтому и не включает эту опцию). Так что, похоже, что LD действительно имеет вполне себе нишу и на desktop.
      • 0
        Присоединюсь к благодарностям за LD для android. Недавно как раз писал о том как его использую habrahabr.ru/post/275595

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.