Podpora kvót je často požadovaná funkce v lxc. Kvóta souborového systému Linux je vyžadována, když chcete dát více uživatelům přístup ke kontejneru a chcete mít pod kontrolou, že jeden uživatel nevyužívá celý prostor na disku. Kvóta je také vyžadována pro webhostingové servery, např. s ISPConfig 3 ze stejného důvodu:jeden web nebude schopen zaplnit celý disk. Tento návod vám ukáže, jak můžete použít lxc s kvótou pevného disku pomocí qemu nbd s obrazovým souborem qcow v Debianu 8 .
Předpoklady
Chcete-li používat lxc, potřebujete nástroje qemu a samotný balíček lxc. Nainstalujte je zavoláním:
apt-get install lxc qemu-utils
Instalační program vás požádá o výběr adresáře, kam se později nainstalují obrazy virtuálního počítače lxc. Tento adresář by měl být na oddílu se spoustou volného místa. Pokud máte v /var dostatek místa, přijměte výchozí /var/lib/lxc, v opačném případě zvolte volný adresář na svém největším oddílu. Pokud použijete jinou než výchozí cestu, ujistěte se, že jste změnili cestu ve všech příkazech a konfiguračních souborech níže.
Příprava
Zkontrolujte, zda je modul kernel loop načten s:
lsmod | grep '^loop'
Pokud se výsledek nezobrazí, můžete modul aktivovat spuštěním:
modprobe loop
Vytvořit virtuální počítač
Nyní můžeme začít vytvářet VM. V tomto tutoriálu použiji Debian Jessie v hostiteli i v kontejneru, ale můžete samozřejmě použít i jiné šablony lxc, např. G. Debian wheezy nebo ubuntu.
lxc-create -B loop -t debian -n mydebianvm --fssize=20G -- -r jessie
-t argument vybere hlavní šablonu -r rozhodne, které vydání použít. Chcete-li nastavit velikost pevného disku pro virtuální počítač, můžete změnit --fssize argument. Řekněme, že chcete vytvořit disk s 50 gigabajty, změnili byste argument na ---fssize=50G .
Argument -n nastavuje název vm. Použil jsem mydebianvm v tomto tutoriálu. Změňte prosím název ve všech následujících příkazech podle toho, co jste zvolili.
Protože nechceme používat nezpracovaný obrazový soubor, musíme obraz disku převést na qemu qcow2 formát. To se provádí následujícím příkazem
qemu-img convert -O qcow2 /var/lib/lxc/mydebianvm/rootdev /var/lib/lxc/mydebianvm/rootdev.qcow2
Abychom usnadnili práci se zálohami, později vytvoříme sadu souborů obrazu, tj. E. druhý soubor, který zaznamenává všechny změny v zařízení.
qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2
Nyní můžete smazat původní nezpracovaný soubor obrázku pomocí:
rm /var/lib/lxc/mydebianvm/rootdev
Nakonfigurujte síťový most
Nainstalujte bridge-utils:
apt-get install bridge-utils
Otevřete konfigurační soubor Debian Network /etc/network/interfaces v editoru
vim /etc/network/interfaces
a přidejte následující řádky:
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
Nahraďte adresu a masku sítě hodnotami pro vaši místní síť.
Poté aktivujte síťový most příkazem:
ifup br0
Nakonfigurujte virtuální počítač
Zálohujte starý konfigurační soubor:
mv /var/lib/lxc/mydebianvm/config /var/lib/lxc/mydebianvm/config_bak
A vytvořte konfiguraci pro kontejner:
vim /var/lib/lxc/mydebianvm/config
A přidejte do souboru následující obsah:
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
Nahraďte IP-adresu 192.168.1.101 volnou IP z vaší sítě.
Přidejte předspouštěcí skript /var/lib/lxc/prestart-nbd.sh
vim /var/lib/lxc/prestart-nbd.sh
s následujícím obsahem:
#!/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
a udělejte jej spustitelným:
chmod +x /var/lib/lxc/prestart-nbd.sh
Přidejte poststop skript /var/lib/lxc/poststop-nbd.sh
vim /var/lib/lxc/poststop-nbd.sh
s následujícím obsahem:
#!/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
a udělejte jej spustitelným:
chmod +x /var/lib/lxc/poststop-nbd.sh
Spuštění virtuálního počítače a nastavení kvóty
Nyní můžeme spustit kontejner v režimu na pozadí zadáním:
lxc-start -n mydebianvm -d
Nainstalujte potřebné balíčky pro kvótu. Kvůli tomu nemusíme vstupovat do kontejneru. Pomocí lxc-attach můžeme spouštět příkazy mimo kontejner.
lxc-attach -n mydebianvm -- apt-get -y update
lxc-attach -n mydebianvm -- apt-get -y install quota
Není možné aktivovat kvótu pomocí lxc-attach. Vytvoříme tedy bash skript, který se spustí při příštím spuštění kontejneru
vim /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
s následujícím obsahem:
#!/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
Skript se poté sám smaže a vyprázdní /etc/rc.local kontejneru.
Nyní se ujistěte, že je bash skript spustitelný a volán při spuštění:
Udělejte jej spustitelným:
chmod 700 /var/lib/lxc/mydebianvm/rootfs/opt/actquota.sh
Přidejte volání do souboru rc.local vm:
echo '#!/bin/bash
if [[ -e "/opt/actquota.sh" ]] ; then
/opt/actquota.sh
fi' > /var/lib/lxc/mydebianvm/rootfs/etc/rc.local
Po nastavení všech nezbytných předpokladů můžete nyní kontejner restartovat. Pokud jste postupovali správně, kvóta se aktivuje.
lxc-stop -r -n mydebianvm
Ověřte výsledky
Nyní byste měli zkontrolovat, zda kvóta funguje. Změňte na kontejner.
lxc-attach -n mydebianvm
Typ uvnitř kontejneru:
repquota -avug
Nyní byste měli vidět použitou kvótu uživatelů a skupin.
Zničení virtuálního počítače
Je to velmi důležité používat příkazy ve správném pořadí. Než budete moci odpojit zařízení nbd, musíte zastavit kontejner, pokud běží:
lxc-stop -n mydebianvm
Poté musíte odpojit root fs.
umount /var/lib/lxc/mydebianvm/rootfs
Posledním krokem je odpojení nbd. Ujistěte se, že jste vybrali správné číslo zařízení.
NIKDY odpojte nbd před odpojením rootfs. To povede k mnoha problémům a bude vyžadovat úplný vynucený restart vašeho hostitele.
qemu-nbd -d /dev/nbd0
Zálohujte virtuální počítač
Protože jsme při vytváření image souboru pro kontejner vytvořili dva soubory, můžeme snadno zálohovat bez zastavení vm. Nejprve musíme uložit změny, které mezitím nastaly, do základního souboru.
qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2
Soubor /var/lib/lxc/mydebianvm/rootdev.qcow2 nyní obsahuje aktuální stav pevného disku vm, takže můžete zálohovat tento soubor.