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

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 25: Строка 25:
 
</PRE>
 
</PRE>
   
==Проверка===
+
==Проверка==
 
Первым делом надо на всякий случай проверить, всё ли готово для работы с LXC-контейнерами с помощью команды lxc-checkconfig. Напротив каждого пункта в её выводе должно стоять значение enabled.
 
Первым делом надо на всякий случай проверить, всё ли готово для работы с LXC-контейнерами с помощью команды lxc-checkconfig. Напротив каждого пункта в её выводе должно стоять значение enabled.
 
<PRE>
 
<PRE>
Строка 58: Строка 58:
 
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
 
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig
 
</PRE>
 
</PRE>
  +
==Создание контейнеров==
 
<PRE>
 
<PRE>
 
lxc-create --name vmh1 --template ubuntu
 
lxc-create --name vmh1 --template ubuntu
 
</PRE>
 
</PRE>
Вся файловая система контейнеров фактически находится в каталоге /var/lib/lxc/имя_контейнера/rootfs (а значит, мы можем легко монтировать туда папки с опцией bind). Там же находится и конфигурационный файл config, в котором описаны все параметры. В принципе, параметры и файлы можно на лету менять с хост-машины, но это не всегда безопасно. Кстати, шаблонами пользоваться совсем необязательно. Практически для каждого популярного дистрибутива можно найти пример оформления config-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.
+
Вся файловая система контейнеров фактически находится в каталоге /var/lib/lxc/имя_контейнера/rootfs (а значит, мы можем легко монтировать туда папки с опцией bind).
  +
* открытый вопрос - как лимитировать размер?
   
  +
Там же находится и конфигурационный файл config, в котором описаны все параметры. В принципе, параметры и файлы можно на лету менять с хост-машины, но это не всегда безопасно. Кстати, шаблонами пользоваться совсем необязательно. Практически для каждого популярного дистрибутива можно найти пример оформления config-файла или же создать его самому. В нашем случае надо добавить информацию о сетевых интерфейсах для только что созданного контейнера.
   
 
/var/lib/lxc/vmh1/config
 
sudo nano /var/lib/lxc/vmh1/config
 
   
 
В конец файла необходимо добавить следующие строки:
 
В конец файла необходимо добавить следующие строки:
  +
<PRE>
 
 
lxc.network.type = veth
 
lxc.network.type = veth
 
lxc.network.flags = up
 
lxc.network.flags = up
Строка 80: Строка 82:
 
lxc.network.name = eth1
 
lxc.network.name = eth1
 
lxc.network.ipv4 = 192.168.56.201/24
 
lxc.network.ipv4 = 192.168.56.201/24
  +
</PRE>
  +
   
 
Из названия сетевых переменных в общем-то ясно, за что они отвечают. Тип veth выбирается при использовании сетевого моста, флаг up даёт команду на поднятие сетевого интерфейса при старте контейнера, в link прописывается используемый интерфейс хост-машины, а в name — имя адаптера внутри контейнера. В примере прописано два интерфейса. Один для выхода в Сеть, второй для обмена данными между контейнерами и хост машиной. IP-адрес прописывается вручную из выбранных выше диапазонов, чтобы потом не выяснять, как подключиться к тому или иному контейнеру. Внутри самого контейнера править сетевые настройки не требуется.
 
Из названия сетевых переменных в общем-то ясно, за что они отвечают. Тип veth выбирается при использовании сетевого моста, флаг up даёт команду на поднятие сетевого интерфейса при старте контейнера, в link прописывается используемый интерфейс хост-машины, а в name — имя адаптера внутри контейнера. В примере прописано два интерфейса. Один для выхода в Сеть, второй для обмена данными между контейнерами и хост машиной. IP-адрес прописывается вручную из выбранных выше диапазонов, чтобы потом не выяснять, как подключиться к тому или иному контейнеру. Внутри самого контейнера править сетевые настройки не требуется.
   
  +
Это все так (выше была цитата) но для этого надо уже иметь предварительно настроенные 2 бриджа. К тому же у меня контейнер при старте пробовал получить адрес по DHCP
   
  +
===Проблема №2===
   
   

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

/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

Проблема №2

Раз уже 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. Хотя бы одной из них мы наверняка коснёмся в будущих материалах. Но это потом, а пока позвольте откланяться и по традиции пожелать удачных экспериментов на виртуальных нивах.