Установка LXC контейнеров через Libvirt

Прежде чем импортировать контейнер в Libvirt, его нужно создать средствами LXC.

Можно также использовать уже существующий контейнер LXC. В таком случае вы можете перейти к шагу "Импорт контейнера в Libvirt".

Контейнеры LXC расположены в папке /var/lib/lxc.

Скачать контейнер Ubuntu 18.04 можно командой:

lxc-create -t download -n test-ubuntu -- --dist ubuntu --release bionic --arch amd64

Centos 7 командой:

lxc-create -t download -n test-centos -- --dist centos --release 7 --arch amd64

Создание файла libvirt-lxc

Создайте файл lxc, выполнив команду 

nano /usr/bin/libvirt-lxc

Вставьте следующий текст, в этот файл

#!/bin/bash
virsh -c lxc:/// $@

Установите права на выполнение данного файла командой

chmod +x /usr/bin/libvirt-lxc

Импорт контейнера в Libvirt

Конфигурация LXC Контейнера хранится в файле config в папке самого контейнера. Чтобы импортировать, нужно сначала сконвертировать конфиг в формат libvirt. Делается это следующей командой:

cd /var/lib/lxc/<название контейнера>
libvirt-lxc domxml-from-native lxc-tools config > config-libvirt.xml

Если выдает ошибку, создайте файл вручную. Если ошибки нет, то отредактируйте его командой nano config-libvirt.xml

Содержимое файла xml:

<domain type='lxc'>
  <name>test-ubuntu</name>
  <memory unit='KiB'>65536</memory>
  <currentMemory unit='KiB'>65536</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64'>exe</type>
    <init>/sbin/init</init>
  </os>
  <idmap>
    <uid start='0' target='100000' count='65536'/>
    <gid start='0' target='100000' count='65536'/>
  </idmap>
  <features>
    <capabilities policy='allow'>
    </capabilities>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <emulator>/usr/lib/libvirt/libvirt_lxc</emulator>
    <filesystem type='mount' accessmode='passthrough'>
      <source dir='/var/lib/lxc/test-ubuntu/rootfs'/>
      <target dir='/'/>
    </filesystem>
    <interface type='network'>
      <source network='default'/>
      <mac address='00:16:3e:5f:34:10'/>
      <ip address='172.30.0.10' family='ipv4' prefix='24'/>
      <route family='ipv4' address='0.0.0.0' gateway='172.30.0.1'/>
      <guest dev='eth0'/>
      <link state='up'/>
    </interface>
    <console type='pty' tty='/dev/pts/0'>
      <source path='/dev/pts/0'/>
      <target type='lxc' port='0'/>
      <alias name='console0'/>
    </console>
  </devices>
</domain>

Обратите внимание на секции memory, idmap, interface, console. Задайте в них корректные значения. Поменяйте mac адрес и пропишите статический IP адрес. Размер памяти можно узнать командой free.

Импортируйте конфигурацию:

libvirt-lxc define config-libvirt.xml

Выполните команду, показать список всех lxc контейнеров. Ваш контейнер должен быть в списке.

libvirt-lxc list --all

Запустите тестовый контейнер:

libvirt-lxc start test-ubuntu 

Проверьте сеть:

ping 172.30.0.10

Включения автозапуска контейнера

Включить автозапуск:

libvirt-lxc autostart test-ubuntu

Выключить автозапуск:

libvirt-lxc autostart --disable test-ubuntu

Подключение к контейнеру через консоль

По умолчанию в контейнере не будет установлен root пароль. Поэтому, его нужно установить принудительно. Для этого отредактируйте файл shadow командой

nano /var/lib/lxc/test-ubuntu/rootfs/etc/shadow

Для root можно прописать строчку:

root:$6$jOJaaad3$213aac5XXw7XMVrtI8dPuwyJazAeMOoaq5QOvo.uf/7V70lA3PIsV7WAiM3d1SWPyDkPiVTvizRHta1P7ZyKs/:17541:0:99999:7:::

Это хэш пароля qwerty!2

Подключитесь к гостевой консоли, используя команду

libvirt-lxc console test-ubuntu

Введите логин root и пароль qwerty!2.

Чтобы отключиться от терминала нужно нажать клавиши Ctrl+5

Установка SSH

Установите ваш публичный сертификат в контейнер:

mkdir -p /var/lib/lxc/test-ubuntu/rootfs/root/.ssh/
cat ~/.ssh/id_rsa.pub >> /var/lib/lxc/test-ubuntu/rootfs/root/.ssh/authorized_keys
chown -R lxc-root:lxc-root /var/lib/lxc/test-ubuntu/rootfs/root/.ssh
chmod 700 /var/lib/lxc/test-ubuntu/rootfs/root/.ssh
chmod 400 /var/lib/lxc/test-ubuntu/rootfs/root/.ssh/authorized_keys

Подключитесь к контейнеру через консоль командой:

libvirt-lxc console test-ubuntu

Установите SSH сервер.

Для Ubuntu:

apt install openssh-server -y

Для Centos:

yum install openssh-server -y
systemctl enable sshd

Завершите текущий сеанс в контейнере:

logout

Отключитесь от терминала нажав клавиши Ctrl+5

Теперь вы можете подключиться к контейнеру через SSH:

ssh root@172.30.0.10

Сбросьте root пароль контейнера

Отредактируйте файл shadow командой

nano /var/lib/lxc/test-ubuntu/rootfs/etc/shadow

Для root пропишите строчку:

root:!:17541:0:99999:7:::

Остановка контейнера

Чтобы остановить контейнер, нужно выполнить комманду:

libvirt-lxc destroy test-ubuntu

Если возникает ошибка permission denied при остановке контейнера, то нужно настроить apparmor

Далее

  1. Настройка сети и iptables

Материалы

  1. LXC Getting Started
  2. Русскоязычная документация по LXC
  3. Libvirt LXC
  4. LXC Server Guide