LXC: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 1: Строка 1:
 
=LXC=
 
=LXC=
   
  +
Это такие контейнеры. Как jail но другие, если Вы понимаете о чем я =)
   
  +
  +
  +
==Предварительная настройка==
  +
<PRE>
 
none /cgroup cgroup defaults 0 0 to /etc/fstab and mount the new entry using
 
none /cgroup cgroup defaults 0 0 to /etc/fstab and mount the new entry using
  +
</PRE>
 
  +
<PRE>
 
sudo mount /cgroup
 
sudo mount /cgroup
  +
</PRE>
 
  +
<PRE>
 
 
 
sudo apt-get install dkms build-essential bridge-utils lxc
 
sudo apt-get install dkms build-essential bridge-utils lxc
  +
</PRE>
   
  +
Настроить бридж:/etc/network/interfaces (у меня убунта 11ю10)
 
  +
<PRE>
 
iface br1 inet static
 
iface br1 inet static
 
address 192.168.56.2
 
address 192.168.56.2
Строка 16: Строка 23:
 
bridge_ports eth1
 
bridge_ports eth1
 
bridge_fd 0
 
bridge_fd 0
  +
</PRE>
   
  +
==Проверка===
 
Первым делом надо на всякий случай проверить, всё ли готово для работы с LXC-контейнерами с помощью команды lxc-checkconfig. Напротив каждого пункта в её выводе должно стоять значение enabled.
 
Первым делом надо на всякий случай проверить, всё ли готово для работы с LXC-контейнерами с помощью команды lxc-checkconfig. Напротив каждого пункта в её выводе должно стоять значение enabled.
  +
<PRE>
  +
# 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 ---
lxc-create --name vmh1 --template ubuntu
 
  +
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
  +
</PRE>
  +
<PRE>
 
lxc-create --name vmh1 --template ubuntu
  +
</PRE>
 
Вся файловая система контейнеров фактически находится в каталоге /var/lib/lxc/имя_контейнера/rootfs (а значит, мы можем легко монтировать туда папки с опцией bind). Там же находится и конфигурационный файл config, в котором описаны все параметры. В принципе, параметры и файлы можно на лету менять с хост-машины, но это не всегда безопасно. Кстати, шаблонами пользоваться совсем необязательно. Практически для каждого популярного дистрибутива можно найти пример оформления config-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.
 
Вся файловая система контейнеров фактически находится в каталоге /var/lib/lxc/имя_контейнера/rootfs (а значит, мы можем легко монтировать туда папки с опцией bind). Там же находится и конфигурационный файл config, в котором описаны все параметры. В принципе, параметры и файлы можно на лету менять с хост-машины, но это не всегда безопасно. Кстати, шаблонами пользоваться совсем необязательно. Практически для каждого популярного дистрибутива можно найти пример оформления config-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.
   

Версия 18:25, 11 февраля 2013

LXC

Это такие контейнеры. Как 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-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.


sudo nano /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-адрес прописывается вручную из выбранных выше диапазонов, чтобы потом не выяснять, как подключиться к тому или иному контейнеру. Внутри самого контейнера править сетевые настройки не требуется.



Раз уже LXC использует механизмы cgroups, то можно использовать в конфигурационном файле множество различных параметров. В примере выше мы задали следующие ограничения: memory.limit_in_bytes — максимальный объём памяти для контейнера, memory.memsw.limit_in_bytes — максимальный размер подкачки (swap), cpuset.cpus — доступные процессоры/ядра (первый и третий, в VirtualBox мы указали использование трёх ядер). Параметр 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, 2

Впрочем, оставим эти эксперименты на потом, а пока проверим работоспособность контейнера, запустив его указанной ниже командой. Для отладки можно добавить параметры --logfile /путь/до/log-файла и --logpriority DEBUG. В случае неудачи просмотр логов поможет разобраться, что же именно не так.

sudo lxc-start --name vmh1

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

adduser username

После того как все настроено и проверено, контейнер можно остановить. Лучше всё-таки выполнить внутри него что-нибудь в духе

sudo shutdown -h now

Но можно и из консоли хост-машины принудительно остановить его.

sudo lxc-stop --name vmh1

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

Проще всего для изучения команд 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 этого материала будет достаточно. Остальное придётся осваивать самостоятельно, да и для описания всех возможностей и тонкостей работы LXC понадобилась бы не одна солидная статья. Помимо LXC для Linux существует и ряд других систем виртуализации уровня ОС — OpenVZ, Virtuozzo и Linux-VServer. Хотя бы одной из них мы наверняка коснёмся в будущих материалах. Но это потом, а пока позвольте откланяться и по традиции пожелать удачных экспериментов на виртуальных нивах.