среда, 13 апреля 2016 г.

Маленькие заметки о Chroot

Я хочу получить свой маленький билд-сервер под Ubuntu. Билд-сервер должен быть локальным, вложенным в основную систему, и при этом должен полностью изолировать исходники от живущих снаружи компиляторов, библиотек и прочего барахла (своего рода SDK своими руками).

Здесь будут полезные заметки, которые появились в ходе попыток это сделать.

На билдсервере должна быть минимальная система для динамической линковки:
  • GLibc, а лучше LSB libc (минимальная POSIX-совместимая библиотека C, предоставленная проектом Linux Standards Base)
  • Библиотеки криптографии (т.к. они иногда обновляются с целью закрытия уязвимостей).
  • Библиотеки мультимедиа: OpenGL, OpenAL, SDL2, SDL1.2 (т.к. они соединяют с драйверами)
  • Возможно, ещё какие-то библиотеки, которые имеют стабильные API и ABI
Всё остальное должно быть доступно лишь для статической линковки:
  • C++ STL (варианты: libstdc++, libc++)
  • C++ Boost
  • C++ Cocos2dx
  • C++ Cinder
  • C++ SFML
  • C GLFW
  • И так далее

Chroot и Debootstrap

ОС Linux позволяет создать виртуальную корневую директорию, и войти в неё из-под оболочки терминала. Получается система в системе, причём вложенная система изолирована (не от вредоносного ПО, а от случайного обращения наружу).

Скрипт debootstrap есть в репозиториях Ubuntu, он позволяет скачать и установить в виртуальный корень целый дистрибутив Debian или Ubuntu произвольной версии. После установки можно будет сделать chroot во вложенную систему, и уже там установить необходимое окружение разработки и так далее.

Вот две типичных команды скачивания/установки вложенной системы
# Скачает и установит 32-битной Trusty (Trusty - это Ubunty 14.04) в папку ./trusty32
sudo debootstrap --arch i386 trusty ./trusty32/
# Скачает и установит Trusty родной архитектуры (x64 на моей машине) в папку ./trusty64
sudo debootstrap trusty ./trusty64/

Ещё debootstap позволяет
  • Поставить систему неродной архитектуры, пусть даже ARM (тогда будет запускаться через QEMU)
  • Поставить любую доступную версию Debian или Ubuntu
  • Указать зеркало, с которого скачивать пакеты (например, зеркала Yandex или локальный сервер в Вашей организации)

Настройка chroot после установки вложенной ОС

  1. Чтобы войти в chroot-папку, введите "sudo chroot ./trusty32" (trusty32 - путь к вложенной системе в моём случае)
  2. После установки локаль ещё не настроена, что делает систему не совсем работоспособной. Нагугленная настройка в две строчки выручила меня:
    # Английский язык (Американский диалект), кодировка UTF-8.
    echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
    locale-gen
  3. Войти в chroot-папку может только рут, поэтому для сброса привелегий рута внутри вложенной системы надо настроить пользователя:
    # Выполнить 1 раз и пройти консольный мастер настройки пользователя "bb"
    adduser bb
    # Выполнять каждый раз для логина под пользователем bb
    su - bb
  4. ...
Пост будет обновляться.