Сборка из исходных кодов стабильной версии lxc для Centos 7 с поддержкой python. Поддержка python необходима, например для работы команды lxc-ls --fancy

Установка зависимостей:

yum install -y epel-release
yum install -y gcc git rpm-build automake make python34 python34-devel
yum install -y libcap-devel docbook2X graphviz

Согласно официальному сайту на момент написания статьи доступно 3 версии LXC, я выбрал LTS stable-1.0 Скачивание исходных кодов:

git clone git://github.com/lxc/lxc -b stable-1.0
cd lxc

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

./autogen.sh
./configure --enable-python PYTHON=/usr/bin/python3.4 PYTHONDEV_CFLAGS=-I/usr/include/python-3.4m PYTHONDEV_LIBS=-l/usr/include/python-3.4m

Как можно заметить, конфигурация происходит с явным указанием версии python3.4, он появился сравнительно недавно в EPEL, его и будем использовать далее.

Т.к. у нас Centos и тут не все как у людей как в других дистрибутивах, изменим в исходниках путь до исполняемого файла Python, но сперва найдем файлы, которые нужно модифицировать:

grep -Rn '^#.*/python3'

В результате у меня получился такой небольшой скрипт:

for f in config/apparmor/lxc-generate-aa-rules.py src/lxc/lxc-device src/lxc/lxc-ls.in src/lxc/lxc-start-ephemeral.in src/lxc/lxc-ls src/lxc/lxc-start-ephemeral src/python-lxc/examples/api_test.py src/python-lxc/examples/pyconsole-vte.py src/python-lxc/examples/pyconsole.py src/python-lxc/setup.py src/python-lxc/setup.py.in; do
    sed -i 's|#!/usr/bin/python3|#!/usr/bin/python3.4|' $f
done

sed -i 's|Requires: python3|Requires: python34|' lxc.spec
sed -i 's|BuildRequires: python3-devel|BuildRequires: python34-devel|' lxc.spec
sed -i 's|/python3.3/site-packages/|/python3.4/site-packages/|' lxc.spec

После изменений проверим результат:

grep -Rn '^#.*/python3'

Теперь соберем rpm пакеты используя Python3.4:

make rpm PYTHON=/usr/bin/python3.4 PYTHONDEV_CFLAGS=-I/usr/include/python-3.4m PYTHONDEV_LIBS=-l/usr/include/python-3.4m

Найти собранные пакеты можно в каталоге cd /root/rpmbuild/RPMS/x86_64, а установить командой:

yum localinstall lxc-libs-1.0.7-1.el7.centos.x86_64.rpm lxc-1.0.7-1.el7.centos.x86_64.rpm

Не будем останавливаться на этом! Для запуска Centos 7 контейнера необходимо проделать еще несколько манипуляций: В файле /usr/share/lxc/config/centos.common.conf нужно найти опцию lxc.cap.drop, содержащую значения setfcap и setpcap их нужно убрать, например для хоста Ubuntu 14.04 нужно сделать примерно так:

#lxc.cap.drop = mac_admin mac_override setfcap setpcap
lxc.cap.drop = mac_admin mac_override

Не зависимо от дистрибутива нужно в тот же файл еще добавить в конец сроки:

# This lets LXC SUSE containers run on hosts with apparmor.
# It does nothing on hosts which do not have apparmor enabled.
lxc.aa_profile = unconfined

# https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1347020
lxc.kmsg = 0

UPD: 14.10.2016

Под Centos 7 и начиная с Ubuntu 16.06 для персистентных контейнеров лучше использовать systemd-nspawn и управлять ими через machinectl.


Ссылки по теме:

  1. Bug 1176816 - booting a centos 7 container is extremely slow
  2. centos 7 needs setpcap capability
  3. systemd does not boot in a container
  4. [[lxc-devel] [PATCH] Various fixes for Fedora/CentOS/OpenSUSE templates and systemd.](https://lists.linuxcontainers.org/pipermail/lxc-devel/2014-September/010261.html)
  5. big big login delays in CentOS 7 systemd #340
  6. Linux Containers: Downloads
  7. [LXC 1.0: Troubleshooting and debugging 10/10

Comments

comments powered by Disqus