Страницы

воскресенье, 11 марта 2012 г.

Настройка LXC окружения на домашнем компьютере


Настройка LXC окружения на домашнем компьютере с ОС Ubuntu 11.10
Статья тестовая, незавершенная, исключительно для сохранения опыта.

LXC - LinuX Containers. Контейнеры Linux - технология виртуализации программного обеспечения на уровне операционной системы. Контейнеры Linux поддерживаются на уровне ядра.

Преимущества контейнерной технологии lxc для меня лично.
1. Не требуется поддержка виртуализации vt-x процессором. Intel Celeron 420 ее не поддерживает.
2. Легко устанавливается из репозиториев ubuntu.
3. Легко формируется минимальный сервер ubuntu в контейнере.
4. Работает
5. В силу особенностей технологии, унифицирует программное окружение контейнеров и хост-системы. Условно говоря - "везде ubuntu".
6. Присутствуют решаемые трудности.

Что получиться в результате настройки
1. Будет установлена на хост-системе (домашнем компьютере) инфраструктура lxc
2. Будет создан контейнер с минимальной версией ubuntu 11.10.
3. Проведена локализация и первоначальная настройка контейнера.
4. Управление контейнером будет осуществляться стандартными средствами lxc и ОС.

Установка поддержки инфраструктуры LXC в хост-системе Ubuntu 11.10
$ sudo apt-get update
$ sudo apt-get install lxc

Установка сопутствующих пакетов в хост-системе
Комплект утилит для управления мостовыми(bridge) соединениями. Дело в том, что сетевое подключение контейнера к локальной сети и интернет, выполняется через сетевой мост.
$ sudo apt-get install bridge-utils


Операции с контейнерами выполняются в пользовательском окружении root хост-системы.
Перейти в пользовательское окружении суперпользователя root
$ sudo -s


Создание контейнера, команда lxc-create

Создание контейнера с выбранным именем syncserver, на основе встроенного шаблона ubuntu 11.10
$ sudo lxc-create -n syncserver -t ubuntu
Более правильно, вначале создать файл конфигурации, а потом на его основе создать контейнер. Это часто используется для копирования настроек сети в конфигурационный файл контейнера.
Конфигурационный файл config, относящийся к создаваемому контейнеру, создается в папке /var/lib/lxc/syncserver/
Корневая файловая система контейнера создается в папке /var/lib/lxc/syncserver/rootfs


Производится загрузка пакетов минимальной версии Ubuntu 11.10 (или текущей версии) и сохранение ее в кэше, дополнительно в хост-систему установился пакет lxcguest. Были какие-то трудности с локализацией.
Возможно мелкая трудность, решится, с помощью генерации "C" локали.
В некоторых системах, исправляется следующим образом:
$ sudo locale-gen ru_RU.UTF-8
$ sudo dpkg-reconfigure locales
и еще
$ export LC_ALL=ru_RU.UTF-8
Также можно отредактировать /etc/default/locale и внести строку вида LC_ALL=ru_RU.UTF-8
это можно сделать перед генерацией сервера.

Настройка сети контейнера

Прописать в файл конфигурации контейнера следующее, для статического ipv4-адреса:

# Настройка сети
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.100.2/24 192.168.100.255



Опционально. Удаление контейнера, команда lxc-destroy
Если какие-то настройки неудачны, то можно удалить созданный контейнер
$ lxc-destroy -n syncserver





Первая правка конфигурации контейнера для подключение к локальной сети
Выбор способа сетевого подключения.  Настройка локальной сети контейнеров, самая сложная часть в данном изложении.
Мостовое подключение, при наличии собственной внутренней домашней локальной сети за роутером, позволяет обращаться к контейнеру как обычному компьютеру, с любых домашних компьютеров. Этот вариант нам подходит, т.к. позволит обеспечить синхронизацию контактов между всеми домашними компьютерами и телефонами, подключенными к домашней сети, без выхода в интернет. Роутер раздает IP-адреса из диапазона "серых" адресов и обеспечивает выход в Интернет посредством трансляции адресов на роутере (NAT gateway).
Вариант с трансляцией ip-адресов (NAT) непосредственно на хост-системе (домашнем компьютере) дает иные возможности, но ограничивает доступ к контейнеру из локальной сети, позволяя обращаться к нему только с хост-системы.
Вариант, когда нет домашней локальной сети, а компьютер напрямую подключен к локальной сети провайдера и к сети Интернет через VPN - мой временный вариант.

Итак, настройка вариантов.

Вариант - через мост. Настройка мостового соединения
Сборка моста - создание интерфейса моста br0 (иное название допустимо)
$ sudo brctl addbr br0
....


Вариант - через NAT на хост-системе. Ручная настройка в режиме пошагового тестирования и проверки
Определим что контейнере будут располагаться в отдельном сегменте, 192.168.100.xxx:
На хост-системе выполняем:
Сборка моста - создание интерфейса моста br0 (иное название допустимо)
$ sudo brctl addbr br0

Присвоение "серого" статического IPv4 адреса, мосту, он будет как-бы шлюзом, для наших контейнеров:
$ sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0 promisc up

Включение NAT
Выполнить sudo -s , затем echo 1 > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
$iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

В контейнере выполняем:
$ sudo ifconfig eth0 192.168.100.2 netmask 255.255.255.0 up
если статический адрес не был присвоен ранее, в конфигурационном файле контейнера.
смотрим
$ sudo ifconfig
Выясним доступен ли бридж
$ ping 192.168.100.1
Бридж должен быть доступен.

На хосте выполняем:
$ ping 192.168.100.2
Контейнер должен быть доступен.


Добавление в контейнере маршрута по умолчанию
$ route add default gw 192.168.100.1



После этого, при наличии сети Интернет на хост-системе, он будет доступен и в контейнере. Т.е. NAT включен, но до момента выключения контейнера. Чтобы настройки сети сохранились надо сделать следующее.
Указать сетевые настройки в конфигурационном файле контейнера.
Отредактировать файл /etc/network/interfaces в корневой файловой системе контейнера, можно изнутри контейнера

$ sudo nano /etc/network/interfaces
auto eth0
iface eth0 inet static
   address 192.168.100.2
   netmask 255.255.255.0
   gateway 192.168.100.1


Чтобы шлюз по-умолчанию добавлялся автоматически, надо что-то сделать. Какой-то баг.

может добавить в interfaces #   post-up route add default gw 192.168.100.1
у меня не сработало



Локализация (поддержка русского языка) в консоли контейнера
После появления интернета в контейнере, выполнить обновление репозиториев ubuntu и доустановить локализацию сервера.

$ sudo apt-get update
$ sudo apt-get install language-pack-ru-base
$sudo nano /etc/default/locale
Добавляем строку, если нет: LANG=ru_RU.UTF-8
$ sudo dpkg-reconfigure locales

Выходим и входим заново в контейнере. По идее, перезагружаться не надо.
Команда покажет текущие настройки локали:
$ locale

Справочно. Перезагрузка lxc-контейнера изнутри
$ sudo shutdown -r now


Мой вариант. В моем случае осложняется еще и тем, что интернет передается через VPN, интерфейс ppp0.
В общем случае, существует трудности совместимости менеджера сети среды Gnome (Network Manager) и мостовых утилит (bridge-utils)
Частое решение - отключение менеджера сети и управление сетевыми подключениями производить вручную через командную строку.
Еще одно решение - добавить дополнительную сетевую карту. Это позволит "Менеджеру сети " управлять одной картой, а вторая карта - будет в мосту, для контейнеров. Что обеспечит сервис пользователю.
Можно автоматизировать отключение менеджера сети, поднятие моста и запуск сервера и остановку сервера, разборка моста, отключение моста, включение менеджера сети.


Первый запуск, команда запуска контейнера lxc-start
$ sudo lxc-start -n syncserver


Первоначальная настройка изнутри контейнера

имя пользователя и пароль по умолчанию, при первом входе в консоль контейнера - root/root.
Далее создаем главного пользователя с именем на выбор, - "admin" и добавляем его в группы sudousers.
$ adduser admin
аккуратно заполняем поля.
$ adduser admin sudo
добавляем в группу sudo users.

Изменяем пароль пользователя root, т.к. мы зашли под ним.
$ passwd


Проверка сетевого подключения изнутри контейнера
$ ping www.google.com


Выход пользователя из контейнера
$ exit
Выключение контейнера изнутри
$ sudo shutdown -h now

Безопасное выключение контейнера снаружи, из хост-системы
Вход в консоль управления контейнером
$ sudo lxc-console -n syncserver
Команда выключения
#syncserver> init 0

Грубое выключение контейнера
$ sudo lxc-stop -n syncserver


Чтобы не делать повторно такие настройки, базовую конфигурацию контейнера для местных условий можно сохранить в ... и создавать новые контейнеры на базе этой конфигурации

Определения хранилища пользовательских данных
Для удобного пользования контейнером и удобного резервирования пользовательских данных, можно выносить блочные устройства в другое место.



Резервное копирование контейнера
Сразу после установки и настройки, рекомендуется создать резервную копию с помощью tar
Пример файла backup.sh:
#!/bin/bash
NAME=syncserver
SRC_DIR=/var/lib/lxc/$NAME
DEST_DIR=/media/vm/backups/$NAME
cd $SRC_DIR
mkdir -p $DEST_DIR
tar --one-file-system -cf $DEST_DIR/$NAME-`date +%F`.tar .
#tar --one-file-system -czf $DEST_DIR/$NAME-`date +%F`.tar.gz .

В несжатом состоянии структура создаётся очень быстро.

Перенос контейнера в другое сетевое окружение (другая конфигурация сети)
Например, перенос контейнера в сеть с роутером и динамическим присвоением "серого" IP-адреса. Операционная система хост-системы должна совпадать с исходной.
Фактически, все определяется файлом конфигурации контейнера.

Ресурсы
1. Обстоятельная статья про виртуальные мосты в Linux http://xgu.ru/wiki/Linux_Bridge
2. Тестовый SyncML сервер см. http://gimmor.blogspot.com/2012/03/syncml.html
3. LXC виртуализация, http://koder-ua.blogspot.com/
4. Пояснение о виртуальных сетях lxc, в картинках на англ. языке  http://planet.gentoo.org/archives/2010/2010-09-06.html



4 комментария:

Олег Сиденко комментирует...

Дмитрий! Добрый день! Столкнулся с описанным тобой же багом! Шлюз по умолчанию не добавляется! Интересно, как ты решил эту задачу?

Dmitriy комментирует...

Такие мелкие баги я исправляю на уровне "спинного мозга", поэтому как я это делал - не помню. Скорее всего вручную правил iptables.

Анонимный комментирует...

Картинок бы нащёлкал. Уж больно уныло простыню читать, хоть тема и интересная.

Dmitriy комментирует...

Запустите терминал, вот и картинка.:-)