Debian 8에서 LXC 및 할당량 지원으로 가상 컨테이너를 설정하는 방법
이 페이지에서
- 전제 조건
- 준비 중
- 가상 머신 만들기
- 네트워크 브리지 구성
- VM 구성
- VM 시작 및 할당량 설정\n
- 결과 확인\n
- 가상 머신 제거
- VM 백업
할당량 지원은 lxc에서 자주 요청되는 기능입니다. 여러 사용자에게 컨테이너에 대한 액세스 권한을 부여하고 한 사용자가 모든 디스크 공간을 사용하지 않도록 제어하려는 경우 Linux 파일 시스템 할당량이 필요합니다. 할당량은 웹 호스팅 서버에도 필요합니다. 같은 이유로 ISPConfig 3을 사용하면 하나의 웹사이트가 전체 디스크를 채울 수 없습니다. 이 하우투는 Debian 8에서 qcow 이미지 파일과 함께 qemu nbd를 사용하여 하드 디스크 할당량과 함께 lxc를 사용하는 방법을 보여줍니다.
결과가 표시되지 않으면 다음을 실행하여 모듈을 사용 설정할 수 있습니다.
modprobe loop
가상 머신 만들기
이제 VM 생성을 시작할 수 있습니다. 이 튜토리얼에서는 호스트와 컨테이너 모두에서 Debian Jessie를 사용하지만 물론 다른 lxc 템플릿을 사용할 수도 있습니다. g. Debian wheezy 또는 우분투.
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
백업 처리를 더 쉽게 하기 위해 나중에 이미지 파일 세트를 만듭니다. i. 이자형. 장치에 대한 모든 변경 사항을 기록하는 두 번째 파일.
qemu-img create -f qcow2 -b /var/lib/lxc/mydebianvm/rootdev.qcow2 /var/lib/lxc/mydebianvm/rootdev-live.qcow2
이제 다음을 사용하여 원본 원시 이미지 파일을 삭제할 수 있습니다.
rm /var/lib/lxc/mydebianvm/rootdev
<엠>엠>
네트워크 브리지 구성
브리지 유틸리티를 설치합니다.
apt-get install bridge-utils
편집기에서 데비안 네트워크 구성 파일 /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
VM 구성
이전 구성 파일을 백업합니다.
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를 통해 할당량을 활성화할 수 없습니다. 따라서 다음 번 컨테이너 부팅 시 실행되는 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
vms 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 백업
컨테이너용 이미지 파일을 생성할 때 두 개의 파일을 생성했기 때문에 vm을 중지하지 않고도 쉽게 백업할 수 있습니다. 먼저 그동안 발생한 변경 사항을 기본 파일에 커밋해야 합니다.
qemu-img commit /var/lib/lxc/mydebianvm/rootdev-live.qcow2
/var/lib/lxc/mydebianvm/rootdev.qcow2에는 이제 vms 하드 디스크의 현재 상태가 포함되어 있으므로 이 파일을 백업할 수 있습니다.