クォータサポートはlxcで頻繁にリクエストされる機能です。 Linuxファイルシステムのクォータは、複数のユーザーにコンテナへのアクセスを許可し、1人のユーザーがすべてのディスク領域を使用していないことを制御する場合に必要です。クォータは、Webホスティングサーバーにも必要です。 ISPConfig 3では、同じ理由で、1つのWebサイトがディスク全体をいっぱいにすることはできません。このハウツーでは、 lxcの使用方法を説明します qemu nbdを使用したハードディスククォータ Debian 8のqcow画像ファイルを使用 。
lxcを使用するには、qemuユーティリティとlxcパッケージ自体が必要です。次の電話でインストールしてください:
apt-get install lxc qemu-utils
インストーラーは、後でlxc仮想マシンイメージをインストールするディレクトリを選択するように求めます。このディレクトリは、多くの空き領域があるパーティション上にある必要があります。 / varに十分なスペースがある場合は、デフォルトの/ var / lib / lxcを受け入れます。そうでない場合は、最大のパーティションで空きディレクトリを選択します。デフォルト以外のパスを使用する場合は、以下のすべてのコマンドと構成ファイルでパスを変更してください。
カーネルループモジュールがロードされているかどうかを確認します:
lsmod | grep '^loop'
結果が得られない場合は、次のコマンドを実行してモジュールを有効にできます:
modprobe loop
これで、VMの作成を開始できます。このチュートリアルでは、ホストとコンテナーの両方でDebian Jessieを使用しますが、もちろん他のlxcテンプレートを使用することもできます。 g。 Debianwheezyまたはubuntu。
lxc-create -B loop -t debian -n mydebianvm --fssize=20G -- -r jessie
-t 引数はメインテンプレート-rを選択します 使用するリリースを決定します。仮想マシンのハードディスクサイズを設定するには、-fssizeを変更します。 口論。 50ギガバイトのディスクを作成するとし、引数を-fssize =50Gに変更するとします。 。
引数-n vmの名前を設定します。 mydebianvmを使用しました このチュートリアルでは。以下のすべてのコマンドで、選択した内容に応じて名前を変更してください。
生のイメージファイルを使用したくないので、ディスクイメージをqemu qcow2に変換する必要があります フォーマット。これは次のコマンドで実行されます
qemu-img convert -O qcow2 /var/lib/lxc/mydebianvm/rootdev /var/lib/lxc/mydebianvm/rootdev.qcow2
バックアップ処理を簡単にするために、後でイメージファイルセットを作成します。 e。デバイスへのすべての変更を記録する2番目のファイル。
qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2
次のコマンドで元のRAW画像ファイルを削除できるようになりました:
rm /var/lib/lxc/mydebianvm/rootdev
bridge-utilsをインストールします:
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
ポストストップスクリプト/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
VMを起動してクォータを設定します
これで、次のように入力して、コンテナをバックグラウンドモードで起動できます。
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を介してquotaをアクティブ化することはできません。そこで、コンテナの次回の起動時に実行される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
vmの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
その後、ルートfsをアンマウントする必要があります。
umount /var/lib/lxc/mydebianvm/rootfs
最後のステップは、nbdを切断することです。必ず正しいデバイス番号を選択してください。
絶対に rootfsをアンマウントする前に、nbdを切断してください。これは多くの問題を引き起こし、ホストを完全に強制的に再起動する必要があります。
qemu-nbd -d /dev/nbd0
VMのバックアップ
コンテナのイメージファイルを作成するときに2つのファイルを作成したため、VMを停止せずに簡単にバックアップできます。まず、その間に発生した変更をベースファイルにコミットする必要があります。
qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2
/var/lib/lxc/mydebianvm/rootdev.qcow2 これで、VMのハードディスクの現在の状態が含まれるため、このファイルをバックアップできます。