LXC

Материал из Xgu.ru

Перейти к: навигация, поиск
Отличие контейнеров от виртуальных машин (виртуализации на уровне ОС)

LXC (Linux Containers) — механизм виртуализации на уровне операционной системы, позволяющий исполнять множество изолированных Linux-систем (контейнеров) в одной системе.

Ядро Linux может изолировать ресурсы (процессор, память, ввод/вывод, сеть и так далее) при помощи cgroups, не прибегая для этого к использованию виртуальных машин. Посредством cgroups изолируются так же деревья процессов, сеть, пользователи и файловые системы.

LXC комбинирует cgroups и пространства имён (namespace).

На данный момент использует LXC следующие возможности ядра:

  • Kernel namespaces (ipc, uts, mount, pid, network and user)
  • Apparmor and SELinux profiles
  • Seccomp policies
  • Chroots (using pivot_root)
  • Kernel capabilities
  • CGroups (control groups)


LXC используется в разнообразных проектах, в том числе в Docker.

LXC можно воспринимать как что-то среднее между chroot и полноценной виртуальной машиной, такой chroot на стероидах.


Содержание

[править] Установка

1. Инсталлируем сразу все необходимые пакеты:

 sudo apt-get install lxc debootstrap bridge-utils

2. Монтирование cgroup. Пакет lxc зависит от пакета cgroup-lite, который монтирует каждую cgroup подсистему отдельно в /sys/fs/cgroup/ (в Debian и Ubuntu cgroup вручную монтировать не нужно), но если cgroup все же не смонтирован, то:

добавляем строку в /etc/fstab:

 cgroup  /sys/fs/cgroup  cgroup  defaults  0   0

монтируем:

 sudo mount /sys/fs/cgroup

В принципе, точка монтирования не важна -- можно создать любой каталог (например, sudo mkdir /cgroup) и сохранить соответствующую запись в /etc/fstab:

 cgroup  /cgroup   cgroup  defaults  0   0


3. Проверяем правильность установки:

 sudo lxc-checkconfig

В достаточно длинном выводе команды не должно присутствовать сообщений об ошибках:

   --- 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

[править] Команды

lxc-create
создать новый контейнер LXC
lxc-start
запустить контейнер LXC
lxc-console
подключиться к консоли указанного контейнера
lxc-attach
запустить указанную программу внутри контейнера - (NOT SUPPORTED) Run a command in a running container
lxc-destroy
lxc-stop
остановить процесс, работающий внутри контейнера
lxc-execute
выполнить указанную команду внутри контейнера (в чём отличие от lxc-attach?)
lxc-monitor
мониторить состояние контейнеров
lxc-wait
ждать определённого состояния контейнера; завершаться, когда состояние достигнуто
lxc-cgroup
управление cgroup-группами контейнера
lxc-ls
показать список контейнеров в системе
lxc-ps
показать список процессов внутри определённого контейнера
lxc-info
показать информацию о заданном контейнере
lxc-freeze
заморозить все процессы указанного контейнера
lxc-unfreeze
разморозить все процессы указанного контейнера


[править] Примеры использования

[править] Создание контейнера.

Реализуется через выполнение шаблонов, командой: lxc-create -t <название шаблона> -n <название контейнера>:

   sudo lxc-create -t ubuntu -n test_01

Файлы доступных шаблонов (для debian) находятся в каталоге /usr/share/lxc/templates/

После загрузки и инсталляции пакетов, контейнеры будут размещаться в /var/lib/lxc/<название контейнера>. В данном примере -- это каталог /var/lib/lxc/test_01, в котором:

   -rw-r--r-- 1  root root 685  Дек 10 09:52 config 
   -rw-r--r-- 1  root root 1181 Дек 10 00:02 test_01.log 
   -rw-r--r-- 1  root root 0    Дек 9  16:04 fstab 
   drwxr-xr-x 22 root root 4096 Дек 10 10:00 rootfs 

Файл config -- файл конфигурации контейнера, а rootfs -- каталог, в котором развернута файловая система ubuntu.

В команду lxc-create можно передать параметры, в том числе желаемую версию дистрибутива. Чтобы узнать, какие параметры принимает шаблон -- следует выполнить lxc-create --template <название шаблона> --help:

   lxc-create --template ubuntu --help

Например, скачивание и установка шаблона ubuntu может быть выполнена следующим образом:

   lxc-create -t download -n ubuntu -- --dist ubuntu --release wily --arch amd64
   или
   lxc-create -n ubuntu -t ubuntu-cloud -- -r raring -T http://cloud-images.ubuntu.com/raring/current/raring-server-cloudimg-amd64-root.tar.gz


[править] Запуск контейнера

Выполняется командой lxc-start -n <название контейнера>:

   sudo lxc-start -n test_01

В данном случае будет запущен контейнер с ubuntu и мы сразу же попадаем в консоль этой системы. Как правило, логин root, а пароль генерируется случайный:

   Root password is 'TfKDCy7K', please change ! 

Читать вывод на консоль в последней строке запуска контейнера (иногда логин и пароль root:root либо ubuntu:ubuntu,...). После входа рекомендуется его сменить командой passwd.

Согласно документации, отключиться от консоли можно комбинацией клавиш ctrl-a q (в некоторых случая, например при использовании терминальных менеджеров типа tmux или screen, может не работать! в этом случае нужно проверить тип терминала и попробовать с терминалом TERM=vt100).

Если запустить контейнеры с ключом -d, контейнер будет работать в фоновом режиме без подключения к консоли:

   sudo lxc-start -d -n test_01

[править] Просмотр запущенных контейнеров

   sudo lxc-ls -f
   NAME       STATE    IPV4       IPV6  AUTOSTART                                                                                                   
   ----------------------------------------------                                                                                                   
   test_01    RUNNING  10.0.0.10  -     NO

[править] Просмотр состояния конкретного контейнера

   sudo lxc-info -n test_01
   Name:  test_01 
   State: RUNNING 
   PID:   9172 
   IP:    10.0.0.10 
   CPU use: 164.34 seconds 
   Link:    veth-01 
     TX bytes:    4.03 MiB 
     RX bytes:    77.35 MiB 
     Total bytes: 81.38 MiB

[править] Подключение к консоли запущенного контейнера

Выполняется командой lxc-console -n <название контейнера>:

   sudo lxc-console -n test-01

Для более комфортной работы, настроим доступ по ssh. Изначально командой lxc-console заходим на консоль контейнера и устанавливаем sshd (в случае выхода во внешнюю сеть, возможно потребуется скопировать содержимое /etc/resolv.conf из хост-машины), а также создаем нового пользователя user:

   apt-get update && apt-get install ssh
   adduser user

Впоследствии, для доступ к запущенному контейнеру достаточно:

   ssh user@10.0.0.10

[править] Остановка контейнера

Изнутри остановить контейнер можно обычным способом, через shutdown, poweroff или reboot, извне -- командой lxc-stop -n <название контейнера>:

   sudo lxc-stop -n test-01

При этом контейнер нормально завершит свою работу (с сохранениями изменений во всех открытых файлах).

[править] Клонирование контейнера

Рекомендуется использовать команду lxc-clone -o <название базового контейнер> -n <название нового контейнера>

   sudo lxc-clone -o test-01 -n test-02

Хотя вместо lxc-clone можно воспользоваться обычным копированием каталогов (с последующим