LXC
LXC в Убунту 11.10
Это такие контейнеры. Как jail но другие, если Вы понимаете о чем я =)
- почитать тут - http://habrahabr.ru/post/181247/ - это что то новое, не проверял пока что
Предварительная настройка
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
Ссылки
- http://www.mail-archive.com/lxc-users@lists.sourceforge.net/msg01423.html
- http://comments.gmane.org/gmane.linux.kernel.containers.lxc.general/1400
- http://www.3dnews.ru/workshop/619981
- https://help.ubuntu.com/12.04/serverguide/lxc.html
- https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/884428
- http://comments.gmane.org/gmane.linux.kernel.containers.lxc.general/1400
- http://blog.philippklaus.de/2011/01/container-virtualization-using-lxc-on-ubuntu/
- http://ubuntuforums.org/showthread.php?t=1346581
- http://lxc.sourceforge.net/index.php/news/
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!
- Тут много интересного о лимитах - все понятно http://foaa.de/old-blog/2010/05/lxc-on-debian-squeeze/trackback/index.html
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 под линуксом. К сожалению попробовать времени нет но вообще на первый взгляд все выглядит достаточно просто.