Il supporto delle quote è una caratteristica spesso richiesta in lxc. La quota del filesystem Linux è richiesta quando si desidera concedere a più utenti l'accesso a un container e si desidera controllare che un utente non stia utilizzando tutto lo spazio su disco. La quota è richiesta anche per i server di web hosting, ad es. con ISPConfig 3, per lo stesso motivo:un sito Web non deve essere in grado di riempire l'intero disco. Questo howto ti mostra come usare lxc con la quota del disco rigido utilizzando qemu nbd con un file immagine qcow su Debian 8 .
Prerequisiti
Per utilizzare lxc, sono necessarie le utilità qemu e il pacchetto lxc stesso. Installali chiamando:
apt-get install lxc qemu-utils
Il programma di installazione ti chiederà di scegliere la directory in cui verranno installate le immagini della macchina virtuale lxc in un secondo momento. Questa directory dovrebbe trovarsi su una partizione con molto spazio libero. Se hai spazio sufficiente in /var, accetta l'impostazione predefinita /var/lib/lxc, altrimenti scegli una directory libera sulla partizione più grande. Quando utilizzi un percorso non predefinito, assicurati di modificare il percorso in tutti i comandi e nei file di configurazione seguenti.
Preparazione
Controlla se il modulo del ciclo del kernel è caricato con:
lsmod | grep '^loop'
Se non ottieni risultati, puoi abilitare il modulo eseguendo:
modprobe loop
Crea la macchina virtuale
Ora possiamo iniziare a creare la VM. In questo tutorial, userò Debian Jessie sia nell'host che nel contenitore, ma puoi ovviamente usare altri modelli lxc, ad es. g. Debian wheezy o Ubuntu.
lxc-create -B loop -t debian -n mydebianvm --fssize=20G -- -r jessie
Il -t argomento seleziona il modello principale, -r decide quale versione utilizzare. Per impostare la dimensione del disco rigido per la macchina virtuale, puoi modificare --fssize discussione. Supponiamo che tu voglia creare un disco con 50 gigabyte, cambieresti l'argomento in --fssize=50G .
L'argomento -n imposta il nome della vm. Ho usato mydebianvm in questo tutorial. Per favore cambia il nome in tutti i seguenti comandi in base a ciò che hai scelto.
Poiché non vogliamo utilizzare un file immagine non elaborato, dobbiamo convertire l'immagine del disco in qemu qcow2 formato. Questo viene fatto dal seguente comando
qemu-img convert -O qcow2 /var/lib/lxc/mydebianvm/rootdev /var/lib/lxc/mydebianvm/rootdev.qcow2
Per semplificare la gestione del backup, in seguito creiamo un set di file immagine, i. e. un secondo file che registra tutte le modifiche al dispositivo.
qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2
Ora puoi eliminare il file di immagine raw originale con:
rm /var/lib/lxc/mydebianvm/rootdev
Configura il bridge di rete
Installa bridge-utils:
apt-get install bridge-utils
Apri il file di configurazione della rete Debian /etc/network/interfaces in un editor
vim /etc/network/interfaces
e aggiungi le seguenti righe:
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
Sostituisci l'indirizzo e la netmask con i valori della tua rete locale.
Attivare quindi il bridge di rete con il comando:
ifup br0
Configura la VM
Eseguire il backup del vecchio file di configurazione:
mv /var/lib/lxc/mydebianvm/config /var/lib/lxc/mydebianvm/config_bak
E crea la configurazione per il contenitore:
vim /var/lib/lxc/mydebianvm/config
E aggiungi il seguente contenuto nel file:
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
Sostituisci l'indirizzo IP 192.168.1.101 con un IP libero dalla tua rete.
Aggiungi lo script di preavvio /var/lib/lxc/prestart-nbd.sh
vim /var/lib/lxc/prestart-nbd.sh
con il seguente contenuto:
#!/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
e rendilo eseguibile:
chmod +x /var/lib/lxc/prestart-nbd.sh
Aggiungi lo script poststop /var/lib/lxc/poststop-nbd.sh
vim /var/lib/lxc/poststop-nbd.sh
con il seguente contenuto:
#!/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
e rendilo eseguibile:
chmod +x /var/lib/lxc/poststop-nbd.sh
Avvia la VM e imposta la quota
Ora possiamo avviare il contenitore in modalità background digitando:
lxc-start -n mydebianvm -d
Installa i pacchetti necessari per la quota. Non dobbiamo entrare nel contenitore per questo. Usando lxc-attach possiamo eseguire comandi dall'esterno del contenitore.
lxc-attach -n mydebianvm -- apt-get -y update
lxc-attach -n mydebianvm -- apt-get -y install quota
Non è possibile attivare la quota tramite lxc-attach. Quindi creiamo uno script bash, che viene eseguito al prossimo avvio del contenitore
vim /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
con il seguente contenuto:
#!/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
Lo script si cancellerà da solo e in seguito svuoterà /etc/rc.local del contenitore.
Ora assicurati che lo script bash sia eseguibile e chiamato all'avvio:
Rendilo eseguibile:
chmod 700 /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
Aggiungi la chiamata al file rc.local della macchina virtuale:
echo '#!/bin/bash
if [[ -e "/opt/actquota.sh" ]] ; then
/opt/actquota.sh
fi' > /var/lib/lxc/mydebianvm/rootfs/etc/rc.local
Con tutti i prerequisiti impostati ora puoi riavviare il container. Se hai seguito correttamente i passaggi, questo attiverà la quota.
lxc-stop -r -n mydebianvm
Verifica i risultati
Ora dovresti controllare se la quota funziona. Passa al contenitore.
lxc-attach -n mydebianvm
All'interno del tipo di contenitore:
repquota -avug
Dovresti vedere la quota utilizzata di utenti e gruppi ora.
Distruggere la macchina virtuale
È molto importante per utilizzare i comandi nell'ordine corretto. Prima di poter disconnettere il dispositivo nbd devi fermare il contenitore se è in esecuzione:
lxc-stop -n mydebianvm
Successivamente, devi smontare il root fs.
umount /var/lib/lxc/mydebianvm/rootfs
L'ultimo passaggio è disconnettere il nbd. Assicurati di selezionare il numero di dispositivo corretto.
MAI disconnetti l'nbd prima di smontare il rootfs. Ciò porterà a molti problemi e richiederà un riavvio forzato completo del tuo host.
qemu-nbd -d /dev/nbd0
Esegui il backup della VM
Poiché abbiamo creato due file durante la creazione del file immagine per il contenitore, possiamo facilmente eseguire il backup senza interrompere il vm. Per prima cosa dobbiamo eseguire il commit delle modifiche avvenute nel frattempo nel file di base.
qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2
/var/lib/lxc/mydebianvm/rootdev.qcow2 ora contiene lo stato corrente del disco rigido della macchina virtuale, quindi puoi eseguire il backup di questo file.