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
# 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
1
2
3
|
"net.bridge.bridge-nf-call-ip6tables" is an unknown key
"net.bridge.bridge-nf-call-iptables" is an unknown key
"net.bridge.bridge-nf-call-arptables" is an unknown key
|
Значит необходимо подгрузить модуль bridge
1
|
# lsmod | grep bridge
|
1
|
# modprobe bridge
|
1
|
# lsmod | grep bridge
|
1
2
3
|
bridge 66196 0
stp 1634 1 bridge
llc 4266 2 bridge,stp
|
1
|
# sysctl –p
|
Либо закомментировать эти строки в /etc/sysctl.conf
1
|
# nano /etc/vz/vz.conf
|
1
|
NEIGHBOUR_DEVS=all
|
Отключаем 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]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 |
#!/bin/sh # global variables VERSION="2.4" DOWNLOAD_URL="http://owp.softunity.com.ru/download/ovz-web-panel-$VERSION.tgz" RUBYGEMS_URL="http://production.cf.rubygems.org/rubygems/rubygems-1.3.5.tgz" RUBY_SQLITE3_CMD="ruby -e \"require 'rubygems'\" -e \"require 'sqlite3'\"" LOG_FILE="/tmp/ovz-web-panel.log" INSTALL_DIR="/opt/ovz-web-panel/" FORCE=0 # force installation to the same directory PRESERVE_ARCHIVE=0 AUTOSOLVER=1 # automatic solving of dependencies DISTRIB_ID="" DEBUG=0 UPGRADE=0 UNINSTALL=0 ERR_FATAL=1 for PARAM in $@; do eval $PARAM done [ "x$DEBUG" = "x1" ] && set -xv log() { echo `date` $1 >> $LOG_FILE } puts() { echo $1 log "$1" } puts_separator() { puts "-----------------------------------" } puts_spacer() { puts } exec_cmd() { TITLE=$1 COMMAND=$2 puts "$TITLE $COMMAND" `$COMMAND` } fatal_error() { puts "Fatal error: $1" exit $ERR_FATAL } is_command_present() { puts "Checking presence of the command: $1" CMD=`whereis -b $1 | awk '{ print $2 }'` [ -n "$CMD" ] && return 0 || return 1 } detect_os() { puts "Detecting distrib ID…" is_command_present "lsb_release" if [ $? -eq 0 ]; then puts "LSB info: `lsb_release -a`" DISTRIB_ID=`lsb_release -si` return 0 fi [ -f /etc/redhat-release ] && DISTRIB_ID="RedHat" [ -f /etc/fedora-release ] && DISTRIB_ID="Fedora" [ -f /etc/debian_version ] && DISTRIB_ID="Debian" } resolve_deps() { puts "Resolving dependencies…" if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then apt-get update apt-get -y install ruby1.8 rubygems libsqlite3-ruby libruby1.8 rake fi if [ "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" ]; then yum -y install ruby is_command_present gem if [ $? -ne 0 ]; then yum -y install ruby-devel ruby-docs ruby-ri ruby-irb ruby-rdoc wget -nc -P /tmp/ $RUBYGEMS_URL ARCHIVE_NAME=`echo $RUBYGEMS_URL | sed 's/.\+\///g'` DIR_NAME=`echo $ARCHIVE_NAME | sed 's/.tgz//g'` tar -C /tmp/ -xzf /tmp/$ARCHIVE_NAME ruby /tmp/$DIR_NAME/setup.rb rm -f /tmp/$ARCHIVE_NAME rm -rf /tmp/$DIR_NAME fi gem list rake -i [ $? -ne 0 ] && gem install rake gem list rdoc -i [ $? -ne 0 ] && gem install rdoc sh -c "$RUBY_SQLITE3_CMD" > /dev/null 2>&1 if [ $? -ne 0 ]; then yum -y install sqlite-devel make gcc gem install sqlite3 fi fi if [ "$DISTRIB_ID" = "Fedora" ]; then yum -y install ruby rubygems ruby-sqlite3 rubygem-rake fi } check_environment() { puts "Checking environment…" [ "`whoami`" != "root" ] && fatal_error "Installer should be executed under root user." puts "System info: `uname -a`" detect_os [ "x$DISTRIB_ID" != "x" ] && puts "Detected distrib ID: $DISTRIB_ID" detect_openvz } check_dependencies() { [ "x$AUTOSOLVER" = "x1" ] && resolve_deps is_command_present ruby if [ $? -eq 0 ]; then RUBY_VERSION=`ruby -v | awk '{ print $2 }'` if [ "1.8" != "`echo $RUBY_VERSION | awk -F. '{ print $1"."$2 }'`" ]; then fatal_error "Panel requires Ruby 1.8 (Ruby 1.9 is not supported)." fi if [ `echo $RUBY_VERSION | awk -F. '{ print $3 }'` -lt 5 ]; then fatal_error "Panel requires Ruby 1.8.5 or higher." fi puts "Ruby version: $RUBY_VERSION" else fatal_error "Ruby 1.8 is not installed. Please install it first." fi is_command_present gem if [ $? -eq 0 ]; then puts "RubyGems version: `gem -v`" else fatal_error "RubyGems is not installed. Please install it first." fi puts "Checking Ruby SQLite3 support: $RUBY_SQLITE3_CMD" sh -c "$RUBY_SQLITE3_CMD" > /dev/null 2>&1 [ $? -ne 0 ] && fatal_error "Ruby SQLite3 support not found. Please install it first." puts_spacer } detect_openvz() { if [ -f /proc/vz/version ]; then ENVIRONMENT="HW-NODE" puts "OpenVZ hardware node detected." elif [ -d /proc/vz ]; then ENVIRONMENT="VPS" puts "OpenVZ virtual environment detected." else ENVIRONMENT="STANDALONE" puts "Standalone environment detected." fi } install_product() { puts "Installation…" [ -f $INSTALL_DIR/config/database.yml ] && UPGRADE=1 mkdir -p $INSTALL_DIR if [ -f "$DOWNLOAD_URL" ]; then ARCHIVE_NAME=$DOWNLOAD_URL puts "Local archive: $ARCHIVE_NAME" PRESERVE_ARCHIVE=1 else exec_cmd "Downloading:" "wget -nc -P $INSTALL_DIR $DOWNLOAD_URL" [ $? -ne 0 ] && fatal_error "Failed to download distribution." ARCHIVE_NAME="$INSTALL_DIR/"`echo $DOWNLOAD_URL | sed 's/.\+\///g'` fi EXCLUDE_LIST="" if [ "x$UPGRADE" = "x1" ]; then EXCLUDE_LIST="--exclude=*.log --exclude=config/database.yml --exclude=db/*.sqlite3" [ -f "$INSTALL_DIR/config/certs/server.crt" ] && EXCLUDE_LIST="$EXCLUDE_LIST --exclude=config/certs/*" [ -f "$INSTALL_DIR/utils/hw-daemon/certs/server.crt" ] && EXCLUDE_LIST="$EXCLUDE_LIST --exclude=hw-daemon/certs/*" fi exec_cmd "Unpacking:" "tar --strip 2 -C $INSTALL_DIR -xzf $ARCHIVE_NAME $EXCLUDE_LIST" if [ "x$PRESERVE_ARCHIVE" != "x1" ]; then exec_cmd "Removing downloaded archive:" "rm -f $ARCHIVE_NAME" fi if [ "x$UPGRADE" = "x1" ]; then puts "Removing deprecated files…" [ -f $INSTALL_DIR/app/controllers/admin_controller.rb ] && rm $INSTALL_DIR/app/controllers/admin_controller.rb puts "Upgrading database…" CURRENT_DIR=`pwd` cd $INSTALL_DIR rake db:migrate RAILS_ENV="production" cd $CURRENT_DIR [ $? -ne 0 ] && fatal_error "Failed to upgrade database to new version." puts "Syncing physical servers state…" ruby $INSTALL_DIR/script/runner -e production "HardwareServer.all.each { |server| server.sync }" puts "Reset remember_me tokens…" ruby $INSTALL_DIR/script/runner -e production "User.all.each{ |user| user.remember_token = ''; user.save }" fi [ ! -x $INSTALL_DIR/script/owp ] && chmod +x $INSTALL_DIR/script/owp if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" -o "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" -o "$DISTRIB_ID" = "Fedora" ]; then cp $INSTALL_DIR/script/owp /etc/init.d/owp chmod 755 /etc/init.d/owp if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then update-rc.d -f owp remove update-rc.d owp defaults 30 else /sbin/chkconfig --add owp fi fi if [ -f $INSTALL_DIR/script/owp.cron -a -d /etc/cron.daily ]; then cp $INSTALL_DIR/script/owp.cron /etc/cron.daily/owp.cron chmod 755 /etc/cron.daily/owp.cron fi if [ -f $INSTALL_DIR/config/owp.conf.sample -a ! -f /etc/owp.conf ]; then cp $INSTALL_DIR/config/owp.conf.sample /etc/owp.conf sed -i "s|^INSTALL_DIR=.*|INSTALL_DIR=$INSTALL_DIR|g" /etc/owp.conf fi puts "Installation finished." puts "Product was installed into: $INSTALL_DIR" puts_spacer } stop_services() { puts "Stopping services…" $INSTALL_DIR/script/owp stop } start_services() { [ "x$UPGRADE" = "x1" ] && stop_services puts "Starting services…" if [ "x$UPGRADE" = "x0" ]; then if [ "$ENVIRONMENT" = "HW-NODE" ]; then HW_DAEMON_CONFIG="$INSTALL_DIR/utils/hw-daemon/hw-daemon.ini" if [ ! -f $HW_DAEMON_CONFIG ]; then echo "address = 127.0.0.1" >> $HW_DAEMON_CONFIG echo "port = 7767" >> $HW_DAEMON_CONFIG RAND_KEY=`head -c 200 /dev/urandom | md5sum | awk '{ print \$1 }'` echo "key = $RAND_KEY" >> $HW_DAEMON_CONFIG fi $INSTALL_DIR/script/owp start puts "Adding localhost to the list of controlled servers…" ruby $INSTALL_DIR/script/runner -e production "HardwareServer.new(:host => 'localhost', :auth_key => '$RAND_KEY').connect" [ $? -ne 0 ] && puts "Failed to add local server." else $INSTALL_DIR/script/owp start puts "Place hardware daemon on machine with OpenVZ." puts "To start hardware daemon run:" puts "sudo ruby $INSTALL_DIR/utils/hw-daemon/hw-daemon.rb start" fi else $INSTALL_DIR/script/owp start fi } print_access_info() { puts "Panel should be available at:" puts "http://`hostname -f`:3000" puts "Default credentials: admin/admin" } uninstall_product() { if [ ! -d "$INSTALL_DIR" -o "$INSTALL_DIR" = "" -o "$INSTALL_DIR" = "/" ]; then puts "Panel not found. Nothing to uninstall." return 1 fi stop_services rm -rf $INSTALL_DIR if [ "$DISTRIB_ID" = "Ubuntu" -o "$DISTRIB_ID" = "Debian" ]; then update-rc.d -f owp remove elif [ "$DISTRIB_ID" = "RedHat" -o "$DISTRIB_ID" = "CentOS" -o "$DISTRIB_ID" = "Fedora" ]; then /sbin/chkconfig --del owp fi [ -f /etc/owp.conf ] && rm /etc/owp.conf [ -f /etc/init.d/owp ] && rm /etc/init.d/owp [ -f /etc/cron.daily/owp.cron ] && rm /etc/cron.daily/owp.cron puts "Panel was uninstalled." } main() { puts_separator puts "OpenVZ Web Panel Installer." puts_separator check_environment if [ "x$UNINSTALL" = "x1" ]; then uninstall_product else check_dependencies install_product start_services print_access_info puts_separator fi } main |
[/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. Решение на данный момент единственное - выполнить команды:
1 2 |
echo 0 > /sys/module/ploop/parameters/root_threshold echo 0 > /sys/module/ploop/parameters/user_threshold |