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.