LXC

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску

LXC

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


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