Translate

Показ дописів із міткою LXC. Показати всі дописи
Показ дописів із міткою LXC. Показати всі дописи

субота, 24 серпня 2013 р.

LXC установка.

LXC Linux containers описание.

Нам надо всего 3 пакета:
aptitude install -y bridge-utils debootstrap lxc
Монтируем виртуальную файловую систему контрольной группы в /cgroup:
mkdir /cgroup
echo "cgroup /cgroup cgroup defaults 0 2" >> /etc/fstab
mount -a
Сетевой мост.
Добавляем сетевой мост в основной сетевой интерфейс (/etc/network/interfaces):
# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 0
bridge_maxwait 0
bridge_stp off
Restart networking:
/etc/init.d/networking restart

Можно приступать к настройке.

LXC настройка.

Когда все установлено и настроено, можно приступать к созданию тестового контейнера, но перед этим подготовить базовый список пакетов, которые будут входить в наш контейнер.
vi /etc/lxc/packages:
# Extra packages
packages=\
ifupdown,\
locales,\
libui-dialog-perl,\
dialog,\
isc-dhcp-client,\
netbase,\
net-tools,\
iproute,\
openssh-server,\
vim,\
apt-utils,\
mc,\
rcconf,\
ssh,\
wget,\
rcconf,\
dnsutils,\
ntpdate,\
iputils-ping,\
aptitude,\
cron,\
aptitude

Скачанные пакеты будут находиться в /var/cache/lxc и иметь вид debian-$release.tar
Все необходимые скрипты лежат в /usr/local/sbin.

Для каждого контейнера создается поддиректория с оригинальным названием, данным ему при подготовке. Пароль root – root.

Автостарт контейнера:/etc/default/lxc

# Comment out to run the lxc init script
RUN=yes

# Directory containing the container configurations
CONF_DIR=/etc/lxc

# Start /etc/lxc/example.conf, /etc/lxc/autostart.conf, etc.
#CONTAINERS="example autostart container"
CONTAINERS="имена контейнеров"

На базе контейнеров будет поднята вся инфраструктура сети нашего предприятия.
Все контейнеры нужно прописать в /etc/fstab на нашем хосте.
/usr/local/sbin /var/lib/lxc/vm/rootfs/usr/local/sbin none bind 0 0
/usr/local/etc /var/lib/lxc/vm/rootfs/usr/local/etc none bind 0 0
Все сервера должны иметь статический сетевой адрес.
Настройка.
/etc/network/interfaces

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.17.250
netmask 255.255.255.0
network 192.168.17.0
broadcast 192.168.17.255
gateway 192.168.17.1



Все контейнеры нужно прописать в /etc/fstab на нашем хосте.

/usr/local/sbin    /var/lib/lxc/vm/rootfs/usr/local/sbin                    none     bind      0          0
/usr/local/etc     /var/lib/lxc/vm/rootfs/usr/local/etc                      none     bind      0          0

 
Все сервера должны иметь статический сетевой адрес.
Настройка.

/etc/network/interfaces

# The primary network interface
auto eth0
iface eth0 inet static
     address 192.168.17.250
     netmask 255.255.255.0
     network 192.168.17.0
     broadcast 192.168.17.255
     gateway 192.168.17.1

lxc-prepare

#!/bin/bash

hostname=vm0
release=stable
arch=i386

cache=/var/cache/lxc
lib=/var/lib/lxc

. /etc/lxc/packages

check_args()
{
    if [ ! -z $1 ]; then hostname=$1; fi
    if [ ! -z $2 ]; then release=$2; fi
}

download()
{
    if [ ! -e "$cache/debian-$release-$arch.tar" ]; then
        debootstrap --verbose --arch=$arch \
          --make-tarball="$cache/debian-$release-$arch.tar" \
          --include $packages --variant=minbase \
          $release "$cache/$release-$arch"
        if [ $? -ne 0 ]; then
           exit 1
        fi
    else
        echo "There is '$cache/debian-$release-$arch.tar'... skipping download."
    fi
}

install()
{
    if [ ! -d "$lib/$hostname/rootfs" ]; then
        debootstrap --verbose --arch=$arch \
          --unpack-tarball="$cache/debian-$release-$arch.tar" \
          --include $packages --variant=minbase \
          $release "$lib/$hostname/rootfs"
        if [ $? -ne 0 ]; then
           exit 1
        fi
    else
        echo "There is '$lib/$hostname'... skipping install."
    fi
}

configure()
{
    rootfs=$lib/$hostname/rootfs

    mkdir -p $rootfs/selinux
    echo 0 > $rootfs/selinux/enforce

    if [ -f "$HOME/.ssh/id_rsa.pub" ]; then
        mkdir -p $rootfs/root/.ssh
        cp ~/.ssh/authorized_keys "$rootfs/root/.ssh/authorized_keys"
    fi

    cat <<EOF > $rootfs/etc/inittab
id:3:initdefault:
si::sysinit:/etc/init.d/rcS
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin
1:2345:respawn:/sbin/getty 38400 console
c1:12345:respawn:/sbin/getty 38400 tty1 linux
c2:12345:respawn:/sbin/getty 38400 tty2 linux
EOF

    cat <<EOF > $rootfs/etc/apt/sources.list

deb http://ftp.debian.org/debian/ $release main contrib non-free
deb-src http://ftp.debian.org/debian/ $release main contrib non-free

deb http://security.debian.org/ $release/updates main
deb-src http://security.debian.org/ $release/updates main
EOF

    cat <<EOF > $rootfs/etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
EOF

    domain=`hostname -d`
    if [ ! -z $domain ]; then
        domain=.$domain
    fi
    cat <<EOF > $rootfs/etc/hostname
$hostname
EOF

    cat <<EOF >> $rootfs/etc/dhcp/dhclient.conf
send host-name "$hostname";
EOF

    cat <<EOF > $rootfs/etc/hosts
127.0.0.1   localhost
EOF

    cat <<EOF > $rootfs/etc/locale.gen
en_US.UTF-8 UTF-8
EOF

    echo net.ipv6.conf.all.disable_ipv6=1 >\
$rootfs/etc/sysctl.d/disableipv6.conf

    echo "AddressFamily inet" >>\
$rootfs/etc/ssh/sshd_config

    cp /etc/timezone $rootfs/etc/timezone
    cp /etc/localtime $rootfs/etc/localtime
    area=$(debconf-show tzdata | grep Areas | cut -d ' ' -f 3)
    zone=$(debconf-show tzdata | grep Zones/${area} | cut -d ' ' -f 3)

    cat <<EOF | chroot $rootfs
mknod -m 666 /dev/tty1 c 4 1
mknod -m 666 /dev/tty2 c 4 2
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8
echo "tzdata tzdata/Areas select $area" | debconf-set-selections
echo "tzdata tzdata/Zones/$area select $zone" | debconf-set-selections
dpkg-reconfigure -u tzdata
/usr/sbin/update-rc.d -f umountfs remove
/usr/sbin/update-rc.d -f hwclock.sh remove
/usr/sbin/update-rc.d -f hwclockfirst.sh remove
apt-get update
apt-get -y upgrade
apt-get autoremove
apt-get clean
apt-get autoclean
echo "root:root" | chpasswd
EOF

    cat <<EOF > $lib/$hostname/config
lxc.utsname = $hostname
lxc.tty = 4
lxc.pts = 1024
lxc.rootfs = $rootfs
lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm

# mounts point
lxc.mount.entry=proc $rootfs/proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=devpts $rootfs/dev/pts devpts defaults 0 0
lxc.mount.entry=sysfs $rootfs/sys sysfs defaults  0 0

# network
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 00:1E:$(hex):$(hex):$(hex):$(hex)
EOF
}

hex()
{
    echo "`tr -dc A-F0-9 < /dev/urandom | head -c 2 | xargs`"
}

register()
{
    if [ -h /etc/lxc/$hostname.conf ]; then
        rm /etc/lxc/$hostname.conf
    fi

    ln -s $lib/$hostname/config /etc/lxc/$hostname.conf
}

check_args $1 $2
download
install
configure
register
 

Итак:

lxc1:~# lxc-prepare vm0 stable

Для каждого контейнера создается поддиректория с оригинальным названием, данным ему при подготовке. Пароль root – root.

Автостарт контейнера:/etc/default/lxc

# /etc/default/lxc

LXC_AUTO="true"
LXC_DIRECTORY="/var/lib/lxc"
 

В версии 0.7.5, т.е в последней стабильной версии Debian путь автостарта контейнеров lxc изменен. Помочь в этом может символическая ссылка в /etc/lxc/auto directory.
ln -s /etc/lxc/vm0.conf /etc/lxc/auto/vm0.conf
Для проверки: lxc-info -n vm0
 
Управление контейнерами осуществляется с помощью нескольких команд:

lxc-start -n vm0 -d - Старт.

lxc-console -n vm0 - Логин в консоль (непосредственно на хосте)

lxc-stop -n vm0 - Стоп.

lxc-info -n name -d - Вывод имени.

Удаление контейнера:
Для этого надо остановить контейнер, а потом: lxc-destroy -n vm0.
Эта команда удалит все файлы из /var/lib/lxc/vm0

Заморозка контейнера:
lxc-freeze -n vm0,
эта команда запишет и сохранит все в памяти.

Необходимо сделать этот скрипт исполняемым:
chmod +x /usr/local/sbin/lxc-prepare
 
 

Скрипт lxc-shutdown

#!/bin/sh

name=$1
timeout=15

if lxc-info -n $name | grep -qs "STOPPED"
then
    echo $name not running...
    exit 0
fi                                           

ssh $name halt &
#if [ -e /usr/bin/lxc-halt ]; then
#    /usr/bin/lxc-halt -n $name
#else
#    ssh $name halt &
#fi

while [ $timeout -gt 0 ]
do
    timeout=$(($timeout-1));sleep 1
    if lxc-info -n $name | grep -qs "STOPPED"
    then
        exit 0
    fi
done

lxc-stop -n $name
lxc-wait -n $name -s 'STOPPED'

Затем:
chmod +x /usr/local/sbin/lxc-shutdown

Скрипт lxc-backup.

#!/bin/bash

BACKUPDIR=/var/backups/daily/lxc

TIMESTAMP=`date +%Y-%m-%d`
if [ -f /etc/default/lxc ] ; then
. /etc/default/lxc
fi

do_backup()
{
rootfs=$1/rootfs

EXCLUDE="\
--exclude=$rootfs/usr/local/etc/* \
--exclude=$rootfs/usr/local/sbin/* \
--exclude=$rootfs/tmp/* \
--exclude=$rootfs/var/cache/apt/archives/* \
--exclude=$rootfs/var/cache/man/* \
--exclude=$rootfs/var/run/* \
--exclude=$rootfs/var/tmp/* \
--exclude=$rootfs/var/lock/* \
--exclude=$rootfs/var/mail/* \
--exclude=$rootfs/var/lib/scm/* \
--exclude=$rootfs/srv/sftp/*"

/bin/tar czfp $BACKUPDIR/$1-$TIMESTAMP.tgz -C /var/lib/lxc $1/ $EXCLUDE --ignore-failed-read 2> /dev/null
}

if [ ! -e $BACKUPDIR ]; then
mkdir -p $BACKUPDIR
fi

for c in $CONTAINERS; do
echo -n "$c: halting... "
/usr/local/sbin/lxc-halt $c

echo -n "backup... "
do_backup $c

echo -n "starting... "
/usr/bin/lxc-start -n $c -f /etc/lxc/$c.conf -d

# Let container start
sleep 2
echo "done."
done

Затем:
chmod +x /usr/local/sbin/lxc-backup