OPENVZ

OpenVZ — это реа­ли­за­ция тех­но­ло­гии вир­ту­а­ли­за­ции на уровне опе­ра­ци­он­ной систе­мы, кото­рая бази­ру­ет­ся на ядре Linux. OpenVZ поз­во­ля­ет на одном физи­че­ском сер­ве­ре запус­кать мно­же­ство изо­ли­ро­ван­ных копий опе­ра­ци­он­ной систе­мы, так назы­ва­е­мых кон­тей­не­ров (Virtual Environments, VE).

Thank you for reading this post, don't forget to subscribe! 

Посколь­ку OpenVZ бази­ру­ет­ся на ядре Linux, в роли «госте­вых» систем могут высту­пать толь­ко дис­три­бу­ти­вы GNU/Linux. Одна­ко вир­ту­а­ли­за­ция на уровне опе­ра­ци­он­ной систе­мы в OpenVZ дает так­же и мно­гие пре­иму­ще­ства, а имен­но: удоб­ство в адми­ни­стри­ро­ва­нии, плот­ное раз­ме­ще­ния вир­ту­аль­ных кон­тей­не­ров в хост-систе­ме (это обыч­но поло­жи­тель­но отра­жа­ет­ся на сто­и­мо­сти VPS-хостин­га) и несколь­ко луч­шую про­из­во­ди­тель­ность по срав­не­нию с тех­но­ло­ги­я­ми пол­ной виртуализации.

Конеч­но, и недо­стат­ков доста­точ­но. Глав­ный из них, что в отли­чие от KVM, моду­ли OpenVZ не вхо­дят в ваниль­ное ядро, поэто­му для фун­ци­о­ну­ван­ня послед­не­го необ­хо­ди­мо отдель­ное ядро и вер­сия его дале­ко не послед­няя. На момент пуб­ли­ка­ции этой ста­тьи послед­няя ста­биль­ная вер­сия — 2.6.32-042stab084.14. Из это­го по сути сле­ду­ет, что хост-систе­мой на OpenVZ может высту­пать не каж­дый дис­три­бу­тив, а толь­ко с ядром 2.6.32 и око­ло вер­сии. Поэто­му, ска­жем, OpenVZ — ядро под Ubuntu 12.04 LTS вряд ли заве­дет­ся (что я уже попро­бо­вал), ведь ядро здесь вер­сии 3.8. Но не все так пло­хо, так как для RedHat 6 (CentOS 6, Scientific Linux 6) и Debian 7 все про­сто уста­нав­ли­ва­ет­ся и эти дис­три­бу­ти­вы офи­ци­аль­но под­де­жи­ва­ют­ся Parallels.

Сле­ду­ю­щий недо­ста­ток в том, что все кон­тей­не­ры рабо­та­ют под одним ядром (ядром хост-систе­мы) и доба­вить необ­хо­ди­мый модуль ядра уже будет не так про­сто, как в слу­чае с тех­но­ло­ги­я­ми пол­ной вир­ту­а­ли­за­ции. В резуль­та­те на OpenVZ-кон­тей­не­рах не смо­жет рабо­тать NFS-сер­вер или дру­гие сер­ви­сы, кото­рым необ­хо­ди­ма тес­ная инте­гри­ра­ция с ядром

При­сту­пим к установке:

Уста­нов­ка OpenVZ

cd /etc/yum.repos.d/
wget http://download.openvz.org/openvz.repo
rpm --import http://download.openvz.org/RPM-GPG-Key-OpenVZ

yum repolist

Проверяем,что по умол­ча­нию под­клю­ча­ет­ся репо­зи­та­рий для Centos 6 (а не Centos 5)

nano openvz.repo

[openvz-utils]
name=OpenVZ user-space utilities
mirrorlist=http://download.openvz.org/mirrors-current
enabled=1
gpgcheck=1
gpgkey=http://download.openvz.org/RPM-GPG-Key-OpenVZ

## RHEL6-based OpenVZ kernels

[openvz-kernel-rhel6]
name=OpenVZ RHEL6-based stable kernels
mirrorlist=http://download.openvz.org/kernel/mirrors-rhel6-2.6.32
enabled=1
gpgcheck=1
gpgkey=http://download.openvz.org/RPM-GPG-Key-OpenVZ
exclude=vzkernel-firmware

 

yum search vzkernel

Уста­нов­ка ядра соглас­но бит­но­сти операционки
yum install vzkernel.i686
для 32 бит­ных систем
yum install vzkernel.x86_64
для 64 бит­ных систем

 

Про­вер­ка загруз­чи­ка на пред­мет загруз­ки по умол­ча­нию ядра OpenVZ вме­сто штатного

nano /boot/grub/grub.conf

default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title OpenVZ (2.6.32-042stab123.8)
root (hd0,0)
kernel /vmlinuz-2.6.32-042stab123.8 ro root=/dev/mapper/vg_centtest-lv_root rd_LVM_LV=vg_centtest/lv_swap rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_centtest/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-042stab123.8.img
title CentOS 6 (2.6.32-642.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.i686 ro root=/dev/mapper/vg_centtest-lv_root rd_LVM_LV=vg_centtest/lv_swap rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg_centtest/lv_root rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.i686.img

 

Уста­нов­ка ути­лит для управ­ле­ния OpenVZ

yum -y install vzctl vzquota ploop

Уста­нов­ка реко­мен­ду­е­мых пара­мет­ров ядра:
Если уста­нов­ле­на вер­сия vzctl вер­сии 4.4 и выше, то нет необ­хо­ди­мо­сти в руч­ной прав­ке пере­мен­ных ядра

rpm -qa | grep vzctl
vzctl-core-4.9.4-1.i386
vzctl-4.9.4-1.i386

Ина­че нуж­но настро­ить пере­мен­ные ядра вручную

 

nano /etc/sysctl.conf

# On Hardware Node we generally need
# packet forwarding enabled and proxy arp disabled
net.ipv4.ip_forward = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0# Enables source route verification
net.ipv4.conf.all.rp_filter = 1# Enables the magic-sysrq key
kernel.sysrq = 1# We do not want all our interfaces to send redirects
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
Если выла­зит ошиб­ка типа

Зна­чит необ­хо­ди­мо под­гру­зить модуль bridge

Либо заком­мен­ти­ро­вать эти стро­ки в /etc/sysctl.conf

 

 

Отклю­ча­ем SELinux

nano /etc/selinux/config

SELINUX=disabled

Про­вер­ка нали­чия OpenVZ в автозагрузке

chkconfig --list vz

vz 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Пере­гру­жа­ем систе­му и про­ве­ря­ем загру­зив­ше­е­ся ядро

reboot

uname -r
2.6.32-042stab117.16

Про­ве­ря­ем рабо­ту VZ

/etc/init.d/vz restart

Bringing down interface venet0: [ OK ]
Stopping OpenVZ: [ OK ]
Starting OpenVZ: [ OK ]
Applying OOM adjustments: [ OK ]
Bringing up interface venet0: [ OK ]

 

 

Создание виртуальной машины OpenVZ

Уста­нов­ка контейнера(виртуальной маши­ны) будет про­ис­хо­дить из шаблона
Со спис­ком шаб­ло­нов озна­ко­мить­ся мож­но здесь
http://wiki.openvz.org/Download/template/precreated
Либо здесь
https://download.openvz.org/template/precreated/

Загру­жа­ем обра­зы раз­ных опе­ра­ци­он­ных систем
cd /vz/template/cache/
Debian7

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

 

Созда­ние контейнера

Debian7

vzctl create 101 --ostemplate debian-7.0-x86-minimal

 

 

Настрой­ка ресур­сов для создан­но­го контейнера

Доба­вим кон­тей­нер в авто­за­груз­ку после запус­ка нашей хост-системы.

# vzctl set 101 --onboot yes --save

Зада­ем hostname для нашей новой систе­мы ( для ВПСки).

# vzctl set 101 --hostname debian7 --save

Назна­чим айпи (ИП) , уста­нов­ка для VENET — соединения

# vzctl set 101 --save --ipadd 192.168.1.180

Про­пи­сы­ва­ем DNS — сервера

# vzctl set 101 --save --nameserver 8.8.8.8 --nameserver 8.8.4.4

При­сво­им коли­че­ство cpu-ядер

# vzctl set 101 --save --cpus 2

При­сво­им коли­че­ство RAM

# vzctl set 101 --save --ram 512M

При­сво­им коли­че­ство swap

# vzctl set 101 --save --swap 1G

Зада­ем раз­мер наше­го жест­ко­го диска

# vzctl set 101 --save --diskspace 2G

Запу­стим наш контейнер

# vzctl start 101

Уста­но­вим пароль для root-пользователя

# vzctl exec 101 passwd

 

Запуск кон­тей­не­ра
vzctl start 101

Про­вер­ка состо­я­ния всех контейнеров

vzlist -a

Про­смотр смон­ти­ро­ван­ных контейнеров

fdisk -l | grep -E '^/dev/ploop'

Кон­фи­гу­ра­ци­он­ный файл кон­тей­не­ра 101

grep -vE '^$|^#' /etc/vz/conf/101.conf

 

Про­ве­ря­ем, вклю­че­на ли марш­ру­ти­за­ция пакетов

sysctl -a | grep -w net.ipv4.ip_forward

net.ipv4.ip_forward = 1
шлю­зом по умол­ча­нию для вирт.машины высту­па­ет интер­фейс venet0, через кото­рый она пере­на­прав­ля­ет все паке­ты, как в Интер­нет, так и для дру­гих вирт.машин в этой сети

 

Установка Web-панели для управления виртуальными машинами OVZ Web Panel

Созда­ём скрипт со сле­ду­ю­щим содержимым:

[spoiler]

[/spoiler]

Далее запус­ка­ем его:
bash failname

 

После уста­нов­ки панель доступ­на на пор­ту 3000

http://<IP-address-server>:3000
Default credentials: admin/admin

Если вруч­ную выпол­ня­ем команды,тогда через панель нуж­но синхронизироваться

Физи­че­ский сервер->отмечаем все сервера->синхронизация

 

Полез­ные коман­ды для рабо­ты с OpenVZ

110 – номер контейнера

Оста­нов­ка контейнера

# vzctl stop 110

Запуск кон­тей­не­ра

# vzctl start 110

Пере­за­пуск контейнера

# vzctl restart 110

Уда­ле­ние контейнера

# vzctl destroy 110

Запуск коман­ды в контейнере

# vzctl exec 110 command

Под­со­еди­не­ние к кон­со­ли контейнера

# vzctl enter 101

Уста­нов­ка раз­лич­ных пара­мет­ров для контейнера

# vzctl set 101 different_options

Про­вер­ка син­так­си­са кон­фи­гу­ра­ци­он­но­го фай­ла контейнера

# vzcfgvalidate /etc/vz/conf/101.conf

Про­вер­ка син­так­си­са всех кон­фи­гу­ра­ци­он­ных файлов

# for n in /etc/vz/conf/???.conf;do echo check $n; vzcfgvalidate $n; done

Про­ве­ря­ет­ся имен­но файл (с ука­за­ни­ем пол­но­го пути), а не теку­щие пара­мет­ры, кото­рые могут быть дру­ги­ми, если «vzctl set» запус­кал­ся без клю­ча «—save». С дру­гой сто­ро­ны, vzcfgvalidate удо­бен тем, что может про­ве­рять пара­мет­ры, когда кон­тей­нер не запущен

Для исправ­ле­ния кон­фи­гу­ра­ци­он­но­го фай­ла vzcfgvalidate сле­ду­ет запу­стить с клю­чом «-r» («repair mode», авто­ма­ти­че­ское исправ­ле­ние) или «-i» («interactive repair», руч­ное исправление).
Управ­ле­ние огра­ни­че­ни­я­ми в систе­ме с OpenVZ явля­ет­ся двух­уров­не­вым: для кон­тей­не­ра в целом – сред­ства­ми OpenVZ, внут­ри кон­тей­не­ра – стан­дарт­ны­ми сред­ства­ми Linux, через ulimit и дис­ко­вые квоты.
Для про­вер­ки внеш­них огра­ни­че­ний слу­жит файл /proc/user_beancounters. Внут­ри кон­тей­не­ра этот файл запол­нен инфор­ма­ци­ей по дан­но­му кон­тей­не­ру, во внеш­ней систе­ме содер­жит све­де­ния обо всех запу­щен­ных окру­же­ни­ях. Основ­ной инте­рес в нём пред­став­ля­ет послед­ний стол­бец, «failcnt» («failure counter», т. е. «коли­че­ство сбоев»):
Про­вер­ка лимитов/ошибок контейнера
# cat /proc/user_beancounters

 

Бекап/восстановление контейнеров

Ска­чи­ва­ем ути­ли­ту vzdump с одно­го из зер­кал нас сай­те OpenVZ
https://ftp.openvz.org/
Например,

perl-LockFile-Simple и cstream
Оба этих пакетв есть в RPMForge репозитарии.Если этот репо­зи­та­рий не подключен,то доста­точ­но под­клю­чить EPEL-репозитарий

# yum install cperl-LockFile-Simple

Пакет cstream ска­ча­ем с репо­зи­та­рия RPMForge и уста­но­вим с помо­щью пакет­но­го мене­дже­ра rpm

для 64 битных
# wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/cstream-3.1.0-1.el6.rf.x86_64.rpm
rpm -ihv cstream-3.1.0-1.el6.rf.x86_64.rpm

для 32 битных

wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/i386/rpmforge/RPMS/cstream-3.1.0-1.el6.rf.i686.rpm

rpm -ihv cstream-3.1.0-1.el6.rf.i686.rpm

 

Уста­но­вим vzdump

# rpm -ihv vzdump-1.2-4.noarch.rpm

# rpm -qa | grep vzdump

vzdump-1.2-4.noarch

Сде­ла­ем бекап кон­тей­не­ра 101

# vzdump --suspend 101

# ls -lh /vz/dump/*.tar

-rw-r--r-- 1 root root 817M Oct 23 16:52 /vz/dump/vzdump-openvz-101-2016_10_23-16_49_13.tar

Вос­ста­но­вим с бека­па с помо­щью ути­ли­ты vzrestore
Если необ­хо­ди­мо вос­ста­но­вить с ID,которым уже суще­ству­ет кон­тей­нер, то этот кон­тей­нер необ­хо­ди­мо пред­ва­ри­тель­но удалить,чтобы осво­бо­дить ID

# vzctl destroy 101

# vzrestore /vz/dump/vzdump-openvz-101-2016_10_23-16_49_13.tar 101

Так­же с бека­па мож­но создать новый кон­тей­нер с новым уни­каль­ным иден­ти­фи­ка­то­ром контейнера.

# vzrestore /vz/dump/vzdump-openvz-101-2016_10_23-16_49_13.tar 105

 

Мони­то­ринг загруз­ки на про­цес­сор и диск от кон­тей­не­ров OpenVZ

# wget --no-check-certificate https://raw.githubusercontent.com/FastVPSEestiOu/open_vestat/master/open_vestat.pl -O # /usr/local/sbin/open_vestat

# chmod +x /usr/local/sbin/open_vestat

# ln -s /usr/local/sbin/open_vestat /usr/sbin/open_vestat

# open_vestat --sort-by cpu

We sort data by cpu
102: disk_time: 0.0 % disk_sectors: 0.0 % cpu: 5.7 %
103: disk_time: 0.0 % disk_sectors: 0.0 % cpu: 4.4 %
101: disk_time: 0.0 % disk_sectors: 0.0 % cpu: 3.2 %

 

 

На неко­то­рых систе­мах при исполь­зо­ва­нии ploop воз­ни­ка­ет ошиб­ка нехват­ки места на устрой­стве (при созда­нии кон­тей­не­ра из кон­со­ли выда­ет­ся "No space left on device"). Это ошиб­ка OpenVz. Реше­ние на дан­ный момент един­ствен­ное - выпол­нить команды: