Поиск по сайту:

Как настроить виртуальные контейнеры с LXC и поддержкой квот в Debian 8


На этой странице

  1. Предпосылки
  2. Подготовка
  3. Создайте виртуальную машину
  4. Настройка сетевого моста
  5. Настройка виртуальной машины
  6. Запустите виртуальную машину и настройте квоту.
  7. Проверьте результаты
  8. Уничтожение виртуальной машины
  9. Резервное копирование ВМ

Поддержка квот — часто запрашиваемая функция в lxc. Квота файловой системы Linux требуется, когда вы хотите предоставить нескольким пользователям доступ к контейнеру и хотите контролировать, чтобы один пользователь не использовал все дисковое пространство. Квота также требуется для серверов веб-хостинга, например. с ISPConfig 3 по той же причине: один сайт не сможет заполнить весь диск. В этом руководстве показано, как вы можете использовать lxc с квотой жесткого диска, используя qemu nbd с файлом образа qcow в Debian 8.

Предпосылки

Чтобы использовать lxc, вам нужны утилиты qemu и сам пакет lxc. Установите их, позвонив:

apt-get install lxc qemu-utils

Установщик попросит вас выбрать каталог, в который позже будут установлены образы виртуальных машин lxc. Этот каталог должен находиться на разделе с большим количеством свободного места. Если у вас достаточно места в /var, примите /var/lib/lxc по умолчанию, в противном случае выберите свободный каталог на самом большом разделе. Если вы используете путь не по умолчанию, обязательно измените путь во всех командах и файлах конфигурации ниже.

Подготовка

Проверьте, загружен ли модуль цикла ядра:

lsmod | grep '^loop'

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

modprobe loop

Создайте виртуальную машину

Теперь мы можем приступить к созданию виртуальной машины. В этом руководстве я буду использовать Debian Jessie как в хосте, так и в контейнере, но вы, конечно, можете использовать и другие шаблоны lxc, например. грамм. Debian wheezy или ubuntu.

lxc-create -B loop -t debian -n mydebianvm --fssize=20G -- -r jessie

Аргумент -t выбирает основной шаблон, -r решает, какой выпуск использовать. Чтобы установить размер жесткого диска для виртуальной машины, вы можете изменить аргумент --fssize. Допустим, вы хотите создать диск объемом 50 гигабайт, измените аргумент на --fssize=50G.
Аргумент -n задает имя виртуальной машины. . В этом руководстве я использовал mydebianvm. Пожалуйста, измените имя во всех следующих командах в соответствии с тем, что вы выбрали.

Поскольку мы не хотим использовать необработанный файл образа, нам нужно преобразовать образ диска в формат qemu qcow2. Делается это следующей командой

qemu-img convert -O qcow2 /var/lib/lxc/mydebianvm/rootdev /var/lib/lxc/mydebianvm/rootdev.qcow2

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

qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2

Теперь вы можете удалить исходный файл необработанного изображения с помощью:

rm /var/lib/lxc/mydebianvm/rootdev

Настройте сетевой мост

Установите мостовые утилиты:

apt-get install bridge-utils

Откройте файл конфигурации сети Debian /etc/network/interfaces в редакторе.

vim /etc/network/interfaces

и добавьте следующие строки:

auto br0 
iface br0 inet static
     address 192.168.1.254
     netmask 255.255.255.0
     bridge_ports eth0
     bridge_stp off
     bridge_fd 2
     bridge_maxwait 20

Замените адрес и сетевую маску значениями для вашей локальной сети.

Затем активируйте сетевой мост командой:

ifup br0

Настроить виртуальную машину

Сделайте резервную копию старого файла конфигурации:

mv /var/lib/lxc/mydebianvm/config /var/lib/lxc/mydebianvm/config_bak

И создайте конфиг для контейнера:

vim /var/lib/lxc/mydebianvm/config

И добавьте в файл следующее содержимое:

lxc.rootfs = /var/lib/lxc/mydebianvm/rootfs
lxc.rootfs.options = usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0

lxc.hook.pre-start = /var/lib/lxc/prestart-nbd.sh
lxc.hook.post-stop = /var/lib/lxc/poststop-nbd.sh

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf

# only if bridge is set up (or use other method)
lxc.network.type = veth
lxc.network.name = veth0
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.1.101/24
lxc.network.ipv4.gateway = 0.0.0.0

# Container specific configuration
lxc.mount = /var/lib/lxc/mydebianvm/fstab
lxc.utsname = debian8
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0

Замените IP-адрес 192.168.1.101 на свободный IP-адрес из вашей сети.

Добавьте сценарий предварительного запуска /var/lib/lxc/prestart-nbd.sh.

vim /var/lib/lxc/prestart-nbd.sh

со следующим содержанием:

#!/bin/bash
CHK=$(lsmod | grep '^nbd');
if [[ "$CHK" == "" ]] ; then
modprobe nbd nbds_max=64 max_part=8
fi
DEV=""

for D in /dev/nbd* ; do
F=$(basename $D)
if [[ $(lsblk | grep "^${F} ") == "" ]] ; then
DEV="$D"
break;
fi
done

echo "Next free NBD is $DEV";

CHK=$(lsof /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 | grep 'qemu-nbd' | awk '{ print $2 }');
if [[ "$CHK" == "" ]] ; then
if [[ "$DEV" == "" ]] ; then
print "No free nbd device found";
exit 1;
fi
echo "Connecting $DEV to /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2"
qemu-nbd -c ${DEV} -n --aio=native /var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2
else
NBD=$(lsof -p ${CHK} | grep '/dev/nbd' | awk '{ print $9 }');
if [[ "$NBD" != "" ]] ; then
echo "/var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 is already connected to $NBD"
DEV="$NBD";
else
echo "/var/lib/lxc/${LXC_NAME}/rootdev-live.qcow2 is used by suspicious PID";
exit 1;
fi
fi

CHK=$(mount | grep " /var/lib/lxc/${LXC_NAME}/rootfs ")
if [[ "$CHK" == "" ]] ; then
echo "/var/lib/lxc/${LXC_NAME}/rootfs not mounted";
echo "Mounting ${DEV} to /var/lib/lxc/${LXC_NAME}/rootfs"
mount ${DEV} /var/lib/lxc/${LXC_NAME}/rootfs
fi
echo "${DEV} ${DEV:1} none bind,create=file,optional 0 0" > /var/lib/lxc/${LXC_NAME}/fstab

и сделать его исполняемым:

chmod +x /var/lib/lxc/prestart-nbd.sh

Добавьте скрипт poststop /var/lib/lxc/poststop-nbd.sh.

vim /var/lib/lxc/poststop-nbd.sh

со следующим содержанием:

#!/bin/bash
CHK=$(mount | grep " /var/lib/lxc/${LXC_NAME}/rootfs " | awk '{ print $1 }')
if [[ "$CHK" != "" ]] ; then
echo "Unmounting ${CHK} from /var/lib/lxc/${LXC_NAME}/rootfs"
echo "Disconnecting ${CHK}"
umount /var/lib/lxc/${LXC_NAME}/rootfs && qemu-nbd -d ${CHK}
fi

и сделать его исполняемым:

chmod +x /var/lib/lxc/poststop-nbd.sh

Запустите виртуальную машину и настройте квоту

Теперь мы можем запустить контейнер в фоновом режиме, набрав:

lxc-start -n mydebianvm -d

Установите необходимые пакеты для квоты. Для этого нам не нужно входить в контейнер. Используя lxc-attach, мы можем запускать команды извне контейнера.

lxc-attach -n mydebianvm -- apt-get -y update
lxc-attach -n mydebianvm -- apt-get -y install quota

Невозможно активировать квоту через lxc-attach. Итак, мы создаем bash-скрипт, который выполняется при следующей загрузке контейнера.

vim /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh

со следующим содержанием:

#!/bin/bash
mount -o remount,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0 /
touch /aquota.user /aquota.group
chmod 0600 /aquota.*
quotacheck -cmug /
quotaon -avug
echo '#!/bin/sh -e
exit 0' > /etc/rc.local
rm -f /opt/actquota.sh

После этого скрипт удалит себя и очистит /etc/rc.local контейнера.
Теперь убедитесь, что скрипт bash доступен для выполнения и вызывается при запуске:

Сделайте его исполняемым:

chmod 700 /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh

Добавьте вызов в файл vms rc.local:

echo '#!/bin/bash
if [[ -e "/opt/actquota.sh" ]] ; then
/opt/actquota.sh
fi' > /var/lib/lxc/mydebianvm/rootfs/etc/rc.local

Со всеми предварительными настройками теперь вы можете перезапустить контейнер. Если вы правильно выполнили шаги, это активирует квоту.

lxc-stop -r -n mydebianvm

Проверьте результаты

Теперь вы должны проверить, работает ли квота. Сменить на контейнер.

lxc-attach -n mydebianvm

Тип внутри контейнера:

repquota -avug

Теперь вы должны увидеть использованную квоту пользователей и групп.

Уничтожение виртуальной машины

Очень важно использовать команды в правильном порядке. Прежде чем вы сможете отключить устройство nbd, вы должны остановить контейнер, если он запущен:

lxc-stop -n mydebianvm

После этого вы должны размонтировать root fs.

umount /var/lib/lxc/mydebianvm/rootfs

Последним шагом является отключение nbd. Обязательно выберите правильный номер устройства.
НИКОГДА не отключайте nbd до размонтирования rootfs. Это приведет к массе проблем и потребует полной принудительной перезагрузки вашего хоста.

qemu-nbd -d /dev/nbd0

Резервное копирование виртуальной машины

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

qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2

/var/lib/lxc/mydebianvm/rootdev.qcow2 теперь содержит текущее состояние жесткого диска vms, так что вы можете сделать резервную копию этого файла.