GNU/Linux >> Tutoriales Linux >  >> Debian

Cómo configurar contenedores virtuales con LXC y soporte de cuotas en Debian 8

El soporte de cuotas es una característica solicitada a menudo en lxc. La cuota del sistema de archivos de Linux es necesaria cuando desea otorgar acceso a varios usuarios a un contenedor y desea controlar que un usuario no utilice todo el espacio en disco. También se requiere una cuota para los servidores de alojamiento web, p. con ISPConfig 3, por la misma razón:un sitio web no podrá llenar todo el disco. Este tutorial le muestra cómo puede usar lxc con cuota de disco duro usando qemu nbd con un archivo de imagen qcow en Debian 8 .

Requisitos

Para usar lxc, necesita las utilidades qemu y el propio paquete lxc. Instálelos llamando a:

apt-get install lxc qemu-utils

El instalador le pedirá que elija el directorio donde se instalarán más tarde las imágenes de la máquina virtual lxc. Este directorio debe estar en una partición con mucho espacio libre. Si tiene suficiente espacio en /var, acepte el valor predeterminado /var/lib/lxc; de lo contrario, elija un directorio libre en su partición más grande. Cuando utilice una ruta no predeterminada, asegúrese de cambiar la ruta en todos los comandos y archivos de configuración a continuación.

Preparando

Compruebe si el módulo de bucle del kernel está cargado con:

lsmod | grep '^loop'

Si no obtiene ningún resultado, puede habilitar el módulo ejecutando:

modprobe loop

Crear la máquina virtual

Ahora podemos comenzar a crear la VM. En este tutorial, usaré Debian Jessie tanto en el host como en el contenedor, pero, por supuesto, puede usar otras plantillas lxc, p. gramo. Debian sibilante o ubuntu.

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

La -t argumento selecciona la plantilla principal, -r decide qué versión usar. Para configurar el tamaño del disco duro para la máquina virtual, puede modificar el --fssize argumento. Supongamos que desea crear un disco con 50 gigabytes, cambiaría el argumento a --fssize=50G .
El argumento -n establece el nombre de la máquina virtual. Usé mydebianvm en este tutorial. Cambie el nombre en todos los comandos siguientes según lo que elija.

Como no queremos usar un archivo de imagen sin procesar, necesitamos convertir la imagen del disco a qemu qcow2 formato. Esto se hace con el siguiente comando

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

Para facilitar el manejo de la copia de seguridad, más adelante creamos un conjunto de archivos de imagen, i. mi. un segundo archivo que registra todos los cambios en el dispositivo.

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

Ahora puede eliminar el archivo de imagen sin procesar original con:

rm /var/lib/lxc/mydebianvm/rootdev

Configurar el puente de red

Instale las utilidades de puente:

apt-get install bridge-utils

Abra el archivo de configuración de Debian Network /etc/network/interfaces en un editor

vim /etc/network/interfaces

y agregue las siguientes líneas:

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

Reemplace la dirección y la máscara de red con valores para su red local.

Luego active el puente de red con el comando:

ifup br0

Configurar la máquina virtual

Copia de seguridad del archivo de configuración anterior:

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

Y crea la configuración para el contenedor:

vim /var/lib/lxc/mydebianvm/config

Y agregue el siguiente contenido en el archivo:

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

Reemplace la dirección IP 192.168.1.101 con una IP libre de su red.

Agregue el script de preinicio /var/lib/lxc/prestart-nbd.sh

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

con el siguiente contenido:

#!/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

y hacerlo ejecutable:

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

Agregue la secuencia de comandos post-stop /var/lib/lxc/poststop-nbd.sh

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

con el siguiente contenido:

#!/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

y hacerlo ejecutable:

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

Iniciar la VM y configurar la cuota

Ahora podemos iniciar el contenedor en modo de fondo escribiendo:

lxc-start -n mydebianvm -d

Instale los paquetes necesarios para la cuota. No tenemos que entrar en el contenedor para esto. Usando lxc-attach podemos ejecutar comandos desde fuera del contenedor.

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

No es posible activar la cuota a través de lxc-attach. Entonces creamos un script bash, que se ejecuta en el próximo arranque del contenedor

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

con el siguiente contenido:

#!/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

El script se eliminará solo y luego vaciará /etc/rc.local del contenedor.
Ahora asegúrese de que el script bash se pueda ejecutar y se llame al inicio:

Hazlo ejecutable:

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

Agregue la llamada al archivo rc.local de la máquina virtual:

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

Con todos los requisitos previos configurados, ahora puede reiniciar el contenedor. Si ha seguido los pasos correctamente, esto activará la cuota.

lxc-stop -r -n mydebianvm

Verificar los resultados

Ahora debe verificar si la cuota está funcionando. Cambia al contenedor.

lxc-attach -n mydebianvm

Dentro del tipo de contenedor:

repquota -avug

Debería ver la cuota usada de usuarios y grupos ahora.

Destruyendo la máquina virtual

Es muy importante para utilizar los comandos en el orden correcto. Antes de que pueda desconectar el dispositivo nbd, debe detener el contenedor si se está ejecutando:

lxc-stop -n mydebianvm

Luego, debe desmontar el root fs.

umount /var/lib/lxc/mydebianvm/rootfs

El último paso es desconectar el nbd. Asegúrese de seleccionar el número de dispositivo correcto.
NUNCA desconecte el nbd antes de desmontar el rootfs. Esto generará muchos problemas y requerirá un reinicio forzado completo de su host.

qemu-nbd -d /dev/nbd0

Copia de seguridad de la máquina virtual

Debido a que creamos dos archivos al crear el archivo de imagen para el contenedor, podemos hacer una copia de seguridad fácilmente sin detener la máquina virtual. Primero necesitamos enviar los cambios que ocurrieron mientras tanto al archivo base.

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

El /var/lib/lxc/mydebianvm/rootdev.qcow2 ahora contiene el estado actual del disco duro de la máquina virtual, por lo que puede hacer una copia de seguridad de este archivo.


Debian
  1. Cómo instalar y configurar Debian 8 Docker Host minimalista

  2. Cómo configurar el servidor y el cliente NTP en Debian 9 Stretch Linux

  3. Cómo configurar la replicación de transmisión de PostgreSQL con ranuras de replicación en Debian 10

  4. Cómo configurar un servidor de correo con Exim4 y DBMail en un VPS Debian 7

  5. Cómo crear y lanzar contenedores LXC Linux con comandos LXC

Alojamiento virtual con Proftpd y MySQL (incluida la cuota) en Debian Lenny

Alojamiento virtual con vsftpd y MySQL en Debian Squeeze

Cómo instalar y configurar el servidor web Apache con host virtual en Debian 10

Cómo configurar el host virtual Apache en Debian 10

Lxc y cómo empezar?

Cómo instalar y configurar contenedores LXC Linux en CentOS/RHEL/Ubuntu