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