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 можно воспользоваться обычным копированием каталогов (с последующим