LXC

Материал из noname.com.ua
Версия от 10:21, 11 июля 2020; Sirmax (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

LXC в Убунту 11.10

Это такие контейнеры. Как jail но другие, если Вы понимаете о чем я =)

Предварительная настройка

none /cgroup cgroup defaults 0 0 to /etc/fstab and mount the new entry using
sudo mount /cgroup
sudo apt-get install dkms build-essential bridge-utils lxc

Настроить бридж:/etc/network/interfaces (у меня убунта 11ю10)

iface br1 inet static
   address 192.168.56.2
   netmask 255.255.255.0
   bridge_ports eth1
   bridge_fd 0

Проверка

Первым делом надо на всякий случай проверить, всё ли готово для работы с LXC-контейнерами с помощью команды lxc-checkconfig. Напротив каждого пункта в её выводе должно стоять значение enabled.

# lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-3.0.0-24-generic
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

Создание контейнеров

lxc-create --name vmh1 --template ubuntu

Вся файловая система контейнеров фактически находится в каталоге /var/lib/lxc/имя_контейнера/rootfs (а значит, мы можем легко монтировать туда папки И ФАЙЛЫ ЛИМИТИРОВАННОГО РАЗМЕРА с опцией bind).

  • открытый вопрос - как лимитировать размер?

Там же находится и конфигурационный файл config, в котором описаны все параметры. В принципе, параметры и файлы можно на лету менять с хост-машины, но это не всегда безопасно. Кстати, шаблонами пользоваться совсем необязательно. Практически для каждого популярного дистрибутива можно найти пример оформления config-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.

/var/lib/lxc/vmh1/config

В конец файла необходимо добавить следующие строки:

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.name = eth0
lxc.network.ipv4 = 10.0.2.201/24

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br1
lxc.network.name = eth1
lxc.network.ipv4 = 192.168.56.201/24


Из названия сетевых переменных в общем-то ясно, за что они отвечают. Тип veth выбирается при использовании сетевого моста, флаг up даёт команду на поднятие сетевого интерфейса при старте контейнера, в link прописывается используемый интерфейс хост-машины, а в name — имя адаптера внутри контейнера. В примере прописано два интерфейса. Один для выхода в Сеть, второй для обмена данными между контейнерами и хост машиной. IP-адрес прописывается вручную из выбранных выше диапазонов, чтобы потом не выяснять, как подключиться к тому или иному контейнеру. Внутри самого контейнера править сетевые настройки не требуется.

Это все так (выше была цитата) но для этого надо уже иметь предварительно настроенные 2 бриджа. К тому же у меня контейнер при старте пробовал получить адрес по DHCP

Проблема №1

Локаль. У меня выпадало куча предупреждений. не увеерн что фатально, но я выставил LANG=C для текущего сеанса.

Проблема №2

Не использовать mc при старте машины у меня проблема выглядела так:

# lxc-start  -name vmh1
lxc-start: inherited fd 6 on pipe:[2401332881]

fd (file descriptor) был другой, но сути это не меняет. Гугление привело к мысли что есть workaround

lxc-start -n vmh1 6<&-

Но вообще-то все портит mc и запускать из-под него плохая идея. Проверка показала что из голой сессии все работает

CGroups

Раз уже LXC использует механизмы cgroups, то можно использовать в конфигурационном файле множество различных параметров. В примере выше мы задали следующие ограничения:

  • memory.limit_in_bytes — максимальный объём памяти для контейнера,
  • memory.memsw.limit_in_bytes — максимальный размер подкачки (swap)
  • cpuset.cpus — доступные процессоры/ядра
  • cpu.shares чуть хитрей. Если у одного контейнера он принимает значение x, а у второго 2x, то в каждый конкретный промежуток времени второй получит в два раза больше процессорных циклов, чем первый.


Остальные параметры можно посмотреть, пролистав каталог /sys/fs/cgroup либо просто поискав документацию в Сети.


lxc.cgroup.memory.limit_in_bytes = 512M
lxc.cgroup.memory.memsw.limit_in_bytes = 1G
lxc.cgroup.cpu.shares = 1024
lxc.cgroup.cpuset.cpus = 0

Внимательно с последним параметром - попытка дать больше процессоров чем есть на самом деле чревата фейлом.


Полезные для дебага ключи:

-logfile /путь/до/log-файла и --logpriority DEBUG
lxc-start --name vmh1

Если всё нормально, то через несколько секунд контейнер заработает и выдаст приглашение для входа в консоль. По умолчанию логин и пароль совпадают и равны root. Лучше сразу же создать нового пользователя без root-полномочий, а заодно проверить работоспособность сети — например, пропинговать хост-машину (у нас в примере это была 192.168.56.2) и какой-нибудь домен в Интернете. Возможно, придётся прописать хотя бы один IP-адрес DNS-сервера в файле /var/lib/lxc/имя_контейнера/rootfs/etc/resolv.conf, да и вообще настроить ОС в контейнере под свои нужды.

Выключение контейнера

sudo shutdown -h now
lxc-stop --name vmh1

Цитата:
Чтобы запустить контейнер в фоновом режиме, надо добавить к команде lxc-start параметр --daemon (-d). В этом случае подключиться к консоли контейнера можно командой lxc-console с указанием имени контейнера, а отключиться последовательным нажатием клавиш Ctrl+A и Q. Полезно узнать ещё пару команд. lxc-info показывает текущее состояние контейнера, а lxc-freeze «замораживает» его — при последующем размораживании (команда lxc-unfreeze) будет полностью восстановлено его состояние до заморозки (процессы, содержимое памяти и так далее).

Ctr-A Q у меня не заработало - лучше сразу в скрине запускать.


Проблема №3

Без настроек сети контейнер не работает! В это сложно поверить, но это так.
Ошибка выглядит так:

 Unable to listen for private connections: Failed to bind socket "/com/ubuntu/upstart": Address already in use

Прочее

Проще всего для изучения команд lxc ввести в консоли lxc- и нажать Tab — вы увидите все доступные команды. Каждую из них можно запустить с ключом --help и посмотреть доступные параметры. Впрочем, в Сети документации тоже полно. Напоследок мы склонируем наш, пока что единственный, контейнер во второй, с именем vmh2. Не забудьте в конфигурационном файле новой копии поменять как минимум IP-адреса. Для удаления любого контейнера воспользуйтесь командой lxc-destroy.

Клонирование

lxc-clone -o vmh1 -n vmh2

В дальнейшем можно клонировать готовую конфигурацию сколько угодно раз и выстраивать свой виртуальный кластер. Для автоматического запуска контейнеров надо поместить их конфигурационные файлы с расширением .conf в папку /etc/lxc. Проще сделать символическую ссылку. Также в файле /etc/default/lxc надо раскомментировать строку RUN=yes.

sudo ln -s /var/lib/lxc/vmh1/config /etc/lxc/auto/vmh1.conf
sudo nano /etc/default/lxc

Ссылки

LXC под CentOS 6.3

Пробую то же самое но под CentOS

Сборка

Пакета готового не нашел потому взял

и пересобрал.
Никаких проблем не возникло, по крайне мере ничего важного. (Не забыть подключить epel )

wget wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm 


Получены следующие пакеты:

# ls -1
lxc-0.7.5-2.el6.x86_64.rpm
lxc-devel-0.7.5-2.el6.x86_64.rpm
lxc-doc-0.7.5-2.el6.x86_64.rpm
lxc-libs-0.7.5-2.el6.x86_64.rpm
lxc-templates-0.7.5-2.el6.x86_64.rpm

Естественно, не забываем монтировать /cgroups

Network

Пока для тестов - пробую добавить 2 бриджа, br0 и br1 никак и ни с чем не связанных

brctl   addbr br0
brctl   addbr br1
ip link set up dev br0
ip link set up dev br1
ip addr add 192.168.0.1/24 dev br0
ip addr add 192.168.1.1/24 dev br1

Создание контейнеров

ls -lsa /usr/lib64/lxc/templates/
4 drwxr-xr-x. 2 root root 4096 Feb 12 13:36 .
4 drwxr-xr-x. 4 root root 4096 Feb 12 13:36 ..
4 -rwxr-xr-x. 1 root root 4068 Feb 12 13:34 lxc-sshd

Темплейты взял тут

Важнонужен rsync Далее аналогично убунте - создать образ, подредактировать темплейт и конфиг при необходимости

lxc-create --name vmh1 --template  centos

Запуск контейнеров

Лучше в скрине:

lxc-start --name  vmh1

Немного кусков конфигурации

Немного копипасты:

    lxc.utsname = vm0
    The hostname of the container.
    lxc.network.type = veth
    There are a couple of network types we can work with (man lxc.conf), you should use veth if working with bridges. There is also vlan which you can use if you use linux vlan interfaces and phys, which allows you to hand over a complete physical interface to the container.
    lxc.network.flags = up
    Says the network to be up at start.
    lxc.network.link = br0
    Specifies the network bridge to which the virtual interface will be added.
    lxc.network.name = eth0
    This is the name within the container! Don’t mistake this with the name showing up in the host machine! Don’t set it and it will be eth0 anyway..
    lxc.network.hwaddr = 00:FF:12:34:56:78
    The hardware address (MAC) the device will use.
    lxc.network.ipv4 = 10.0.0.110/24
    Network address assigned to the virtual interface. You can provide multiple, one per line (man lxc.conf).
    You have to edit /etc/network/interfaces within the container (/var/lib/lxc/vm0/rootfs/etc/network/interfaces) as well!


BUGs

/dev/fd/63: No such file or directory

chef-client
chef-client bash: /dev/fd/63: No such file or directory
chef-client 
chef-client bash: line 74: chef-client: command not found
chef-client 

Решение:

ln -s /proc/self/fd /dev/fd

Тунели и вложенная виртуализация

В конфиге разрешить тунели

lxc.cgroup.devices.allow = c 10:200 rwm

И KVM

lxc.cgroup.devices.allow = c 10:232 rwm
mkdir -p /dev/net/
mknod -m 666 /dev/net/tun  c 10 200
mknod /dev/kvm c 10 232

После чего можно смело запускать КВМ-машины внутри LXC-контейнера.

Еще ссылки

http://koder-ua.blogspot.com/2012/01/lxc.html

Вместо заключения

Судя по всему можно забирать внутрь контейнера физические сетевые карты - что выглядит как неплохая возможность строить VRF под линуксом. К сожалению попробовать времени нет но вообще на первый взгляд все выглядит достаточно просто.