Настройка и команды OpenVZ

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

Поскольку OpenVZ базируется на ядре Linux, в отличие от виртуальных машин (напр. VMware) или паравиртуализационных технологий (напр. Xen), в роли «гостевых» систем могут выступать только дистрибутивы Linux. Однако, виртуализация на уровне операционной системы в OpenVZ даёт лучшую производительность, масштабируемость, плотность размещения, динамическое управление ресурсами, а также лёгкость в администрировании, чем у альтернативных решений. Согласно сайту OpenVZ, накладные расходы на виртуализацию очень малы, и падение производительности составляет всего 1-3 %, по сравнению с обычными Linux-системами.

OpenVZ является базовой платформой для Virtuozzo — проприетарного продукта Parallels, Inc. OpenVZ распространяется на условиях лиценции GNU GPL v.2. OpenVZ состоит из модифицированного ядра Linux и пользовательских утилит.

OpenVZ - это технология ядра Linux, позволяющая запускать несколько виртуальных частных серверов (VPS) на одном физическом компьютере. Каждый из серверов при этом выглядит как отдельный сервер с отдельными доступом root, IP-адресом, таблицей процессов, файловой системой, правилами брандмауэра и т. д. От средств полной виртуализации вроде Xen или VMWare эту программу отличает то, что в каждом экземпляре VPS используется одна и та же разделяемая копия ядра Linux. По этому, например, с OpenVZ нельзя загрузить экземпляр Windows 7 и экземпляр RedHat, и нельзя загружать модули ядра независимо в каждый VPS. Но «пространство пользователя» в каждом VPS может быть разным, поэтому можно, например, запустить CentOS и SUSE рядом на одном и том же ядре. Это эффективное решение, и можно создать достаточно полную иллюзию отдельно администрируемых компьютеров, чтобы удовлетворить пользователей, которые не хотят много платить за хостинг-услуги.

Ядро OpenVZ — это модифицированное ядро Linux, которое обеспечивает виртуализацию, изоляцию, управление ресурсами и сохранение текущего состояния VE.

Установка OpenVZ (VzLinux) 8

Современный OpenVZ https://vzlinux.org версии 8, 9. Современные хостинг провайдеры, такие как PQ хостинг позволяют установить OpenVZ в редакции VzLinux из панели. Или вы можете установить нужную вам версию OpenVZ 8 из ISO образа.

После установки мы получим:

Welcome to Virtuozzo Linux 8 (Community Edition)!
 
с ядром
4.18.0-305.vl8.x86_64

ОС VzLinux 8 Community Edition. Система оптимизирована под процессоры x86-64 и готова для запуска как на «голом железе», так и в контейнерах или виртуальных машинах (ВМ). Она является полностью бинарно совместимым форком RHEL 8 и предназначена для поддержки приложений и систем корпоративного уровня с интенсивными I/O-нагрузками.

Но внутри у вас OpenVZ не будет.

Использование LXC (Linux Containers) контейнеров вместо OpenVZ.

  • vzctl - утилита для манипулирования VPS (создание, уничтожение, установка параметров …)
  • vzquota - утилита для квотирования VPSs. Чаще используется неявно через vzctl.
  • vzpid - позволяет определить, какому контейнеру принадлежит процесс (в качестве параметра принимает pid процесса).
  • vzubc - утилита, заменяющая такой инструмент, как cat /proc/user_beancounters.
  • vzlist — печатает листинг контейнеров.
  • vzmemcheck, vzcpucheck, vzcalc — служат для получения информации об используемых ресурсах.

Рекомендуется запустить vzctl без параметров, чтобы получить полный список поддерживаемых параметров и команд.

  • Запустить контейнер по его имени или CTID:
    # vzctl start example1
    # vzctl start 101
  • Проверить состояние VE:
    # vzctl status 101
    CTID 101 exist mounted running
    # vzlist -a
          CTID      NPROC STATUS    IP_ADDR         HOSTNAME
           101          8 running   10.161.85.101   my.example.com
  • Выполнить в нём одиночную команду:
    vzctl exec 101 uname -a
  • Перейти в командную строку контейнера с правами суперпользователя:
    vzctl enter example1

Сервер OpenVZ

Сервер виртуализации OpenVZ: CentOS теперь CentOS Stream-6.4-x86_64, Установка и использование OpenVZ в 2023, LVM.

  • Файловая система. Разбивка HDD на аппаратном узле. Рекомендуется использовать отдельный раздел для хранения данных VE. (по умолчанию /vz/private/<veid>). Причина этого в том, что если вы захотите использовать дисковые квоты на каждый VE, используемые OpenVZ, вы не сможете использовать обычные квоты Linux. На том же разделе. В данном контексте OpenVZ-квота не является чистой квотой, она действует как обычная дисковая квота, но в рамках VE, а не аппаратного узла. Квоты OpenVZ поддерживаются только для файловых систем ext2/ext3, если квоты не важны рекомендуется ставить ext4. Избегайте использовать корневой раздел для хранения данных VE. В такой ситуации администратор VE может превысить дисковый барьер в 5%, полностью заполнить корневой раздел аппаратного узла, и вызвать крах системы.
Точка монтированияТип файловой системыКомментарии
/ ext4 Корневой раздел для файлов ОС аппаратного узла. 8-10 Гб
/swap swap Пространство подкачки Linux. 2хОЗУ или 1хОЗУ
LVM - Все свободное место.
LVM /tmpext4/tmp 10GB
LVM /homeext4/home 20GB
LVM /vzext4/vz Rest
LVM /noexecext4/vz/noexec 10GB
  • Выбираем минимальную установку. В руководстве безопасности OpenVZ настоятельно рекомендуется не использовать на уровне аппаратного узла никаких сетевых сервисов кроме sshd (Защита демона sshd).
  • После установки обновляем установленную ОС, при помощи Использование Yum
    yum update -y
    shutdown -r now
  • Доставим дополнительные пакеты
    # yum install nano mc wget lsof mailx mlocate ntsysv
  • Фаервол Руководство по iptables: Настройка и оптимизация фаервола Linux можно отключить, если не нужен NAT преобразование сетевых адресов, при помощи Команда chkconfig. В случае если в контейнере используются IP из серых сетей, то есть нужен NAT, можно использовать эту заготовку Пример 3. iptables CentOS OpenVZ.
  • Установка ядра с поддержкой OpenVZ, для этого добавим официальный репозиторий OpenVZ:
    # cd /etc/yum.repos.d
    # wget -P /etc/yum.repos.d/ http://ftp.openvz.org/openvz.repo
    # rpm --import http://ftp.openvz.org/RPM-GPG-Key-OpenVZ
    # yum install vzkernel
  • Редактируем загрузчик ОС в файле menu.lst, в котором ядро с поддержкой OpenVZ должно стоять первым или единственным
    # cp /boot/grub/menu.lst /boot/grub/menu.lst.bak
    # nano /boot/grub/menu.lst
  • Установка инструментов администрирования OpenVZ
    # yum install vzctl vzquota ploop
    # shutdown -r now
  • Настраиваем sysctl утилита, предназначенная для управления параметрами ядра:
    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
  • Запуск
    # service vz start

Установка VE

  • Cкачиваем готовые шаблоны для VE: Precreated template caches for different distributions. Также скачиваем контрольные суммы для проверки целостности файлов шаблона (OpenVZ - проверка целостности template).
    # cd /vz/template/cache/
    # wget -c http://download.openvz.org/template/precreated/debian-6.0-x86_64.tar.gz
    # wget -c http://download.openvz.org/template/precreated/debian-6.0-x86_64.tar.gz.asc
    
    # wget -c http://download.openvz.org/template/precreated/contrib/debian-5.0-i386-minimal.tar.gz
    # wget -c http://download.openvz.org/template/precreated/contrib/debian-5.0-i386-minimal.tar.gz.asc
    
    # wget -O - http://download.openvz.org/RPM-GPG-Key-OpenVZ | gpg --import
    # gpg --verify debian-6.0-x86_64.tar.gz.asc

В OpenVZ существует два основных варианта размещения файлов контейнера, они называются ploop и simfs. Simfs – более старый способ размещения файлов контейнера. При его использовании все файлы находятся в определенном каталоге файловой системы физического узла. Ploop более новый способ, при его использовании все файлы контейнера размещаются в одном отдельном большом файле.

  • Создание контейнера simfs для debian-5.0-i386-minimal.tar.gz:
    # vzctl create 101 --ostemplate debian-5.0-i386-minimal --layout simfs
    CT configuration saved to /etc/vz/conf/101.conf
  • Выполним настройку контейнера: Включить автоматический запуск виртуального окружения при старте сервера
    # vzctl set 101 --save
                  --onboot yes
                  --name talk-mss
                  --ipadd 10.161.85.101
                  --hostname my.example.com
                  --nameserver '208.67.222.222 8.8.4.4'

    save приказывает сохранить изменения в conf-файле. Без этого параметра они будут применены к запущенному контейнеру без сохранения; onboot приказывает запускать контейнер при старте OpenVZ; name задаёт произвольное читабельное имя, которое затем можно использовать вместо VEID. Например, "vzctl status talk-mss"; ipadd назначает контейнеру IP-адрес во внутренней сети OpenVZ; hostname изменяет имя системы, используемое внутри контейнера для самоидентификации; "nameserver" конфигурирует контейнер на использование указанного DNS-сервера;

Лимиты VE

OpenVZ ограничивает для контейнеров потребление всех системных ресурсов: процессора, оперативной памяти, дискового пространства, системных буферов, сокетов и т. д. Начальные лимиты настолько строгие, что даже команда apt-get update в только что созданном контейнере завершается с сообщением об ошибке.

Управление ограничениями в системе с OpenVZ является двухуровневым: для контейнера в целом – средствами OpenVZ, внутри контейнера – стандартными средствами Linux, через ulimit и дисковые квоты.

Для проверки внешних ограничений служит файл /proc/user_beancounters. Внутри контейнера этот файл заполнен информацией по данному контейнеру, во внешней системе содержит сведения обо всех запущенных окружениях. Основной интерес в нём представляет последний столбец, «failcnt» («failure counter», т. е. «количество сбоев»):

# egrep -v ' 0$' /proc/user_beancounters
  • –cpuunits num

"Вес" CPU для данного контейнера. Аргументом может быть положительное число в диапазоне от 8 до 500000. Устанавливает зависимость распределения CPU между разными контейнерами. Значение по умолчанию - 1000. Значение 1000 в одном контейнере и 2000 в другом означает, что при прочих равных условиях второй контейнер получит вдвое больше CPU.

  • –cpulimit num[%]

Лимит использования CPU контейнером. В процентах. Если компьютер имеет два CPU, то это значит он имеет всего 200% CPU, которые можно распределить между контейнерами. Значение по умолчанию - 0 (нет лимита).

  • –cpus num

Устанавливает количество процессоров (не ядер) доступных в контейнере.

Клонирование VPS сервера

Клонирование VPS сервера на OpenVZ:

  • Остановим сервер, который будем клонировать
    # vzctl stop 101
  • Клонируем конфигурационный файл, в нем как минимум нужно изменить IP до запуска нового VE
    # cp /etc/vz/conf/101.conf /etc/vz/conf/103.conf
  • Если используется mount
    # cp /etc/vz/conf/101.mount /etc/vz/conf/103.mount
    # mkdir /vz/noexec/vz-103-home
  • Клонируем сервер копированием при помощи утилиты Использование rsync в примерах, ключ -а позволяет сохранить права на файлы и указывает на рекурсивное копирование, слеш "/" в конце директории, указывает, что мы ее копируем .
    # rsync -av /vz/private/107/ /vz/private/108
    
    # rsync -av /vz/noexec/vz-107-home/ /vz/noexec/vz-108-home
  • Для переноса VE между серверами можно использовать утилиту tar с ключом -p, который позволяет сохранить права на файлы. Например: на первом хосте
    # cd /vz/private/
    # tar -cpvf 109-mb3_3.tar 109/

    Любым способом копируем на второй хост и на нем запускаем

    # cd /vz/private/
    # tar -xvpf 109-mb3_3.tar

FAQ

  • Как включить в VE OpenVZ запись истории команд пользователя, которые отображаются командой history в консоли? (No bash history in VE). По умолчанию в Основы BASH скрипты, циклы, горячие клавиши всё пишется в файл ~/.bash_history. Если хотим хранить историю в другом файле, то нужно в .bashrc, задать команду HISTFILE=~/.my_history. Выясним в какой файл записывается история в нашем VE
    # env | grep -i HISTFILE
    HISTFILE=/dev/null

    И видим что история сразу затирается. Редактируем файл и задаем параметр HISTFILE глобально /etc/bash.bashrc или в .bashrc пользователя)

    # nano /root/.bashrc
    OR
    # nano ~/.bashrc
    ...
    HISTFILE=~/.bash_history
    HISTSIZE=1000
    HISTFILESIZE=2000
    ...
  • HISTSIZE — определяет число строк, хранящихся в списке истории (в памяти интерпретатора).
  • HISTFILESIZE — максимальное количество команд хранящихся в файле истории.
  • Очистить Историю Команд в BASH
    history -c

Доступ к устройствам из VE

Из виртуальных окружений прямой доступ отсутствует и к железу, и к ядру. Каталог /dev почти пуст и содержит только логические устройства: null, zero, random, tty, console и т. д.

Задача. Сделать доступным в VE подключенный USB ключ (на флешке лицензия).

  • Устанавливаем usbutils в HN и VE, после этого станет доступна утилита Описание lsusb.
  • Вывести список USB устройств. Нас интересуется флешка вставленная в Bus 006 Device 002
    # lsusb
    Bus 004 Device 002: ID 046b:ff10 American Megatrends, Inc. Virtual Keyboard and Mouse
    Bus 006 Device 002: ID 04b9:0300 SafeNet USB SuperPro/UltraPro
  • Подробности об устройстве:
    # ls -al /dev/bus/usb/006/002
    crw-rw-r-- 1 root root 189, 641 Ноя 27 09:10 /dev/bus/usb/006/002
  • Войдем в VE и создадим это устройство в нем (mknod)
    # vzctl enter VEID
    # mkdir -p /dev/bus/usb/006
    # cd /dev/bus/usb/006
    # mknod 002 c 189 641
  • В конфигурационный файл /etc/vz/conf/VEID.conf добавим строку
    DEVNODES="bus/usb/006/002:rw "
  • Перезагрузим VE и проверим видимость USB ключа в VE
    # vzctl restart VEID
    # vzctl enter VEID
    # lsusb 
    Bus 006 Device 002: ID 04b9:0300 SafeNet USB SuperPro/UltraPro

Настройка OpenVPN развернутое руководство и видео в 2023 выбирай всегда tun, в 99.9% случаев он достаточен. TUN и TAP нужен только для всяческих ethernet bridge.

По умолчанию запрещено использование этих виртуальных драйверов.

  1. Загрузим модуль tun в HN:
    modprobe tun

    проверим

    lsmod | grep tun
  2. Выясним параметры устройства tun в HN для использования в mknod VE
    ls -la /dev/net/tun
    crw-rw-rw- 1 root root 10, 200 Авг 27 08:26 /dev/net/tun
  3. Включаем поддержку на самом VE сервере (111 — номер VE сервера)
    vzctl set 111 --devnodes net/tun:rw --save
    vzctl set 111 --devices c:10:200:rw --save
    vzctl set 111 --capability net_admin:on --save
    vzctl exec 111 mkdir -p /dev/net
    vzctl exec 111 chmod 600 /dev/net/tun
  4. Перезагрузите VE сервер
    vzctl restart 111

    5. Проверяем что модуль подгрузился в виртуальном сервер:

    # cat /dev/net/tun
    cat: /dev/net/tun: File descriptor in bad state

    При выводе должно сказать bad file descriptor, если сказало, что permission denied — значит, не получилось. Можете попробовать сделать всё то же самое еще раз.

В случае когда VE OpenVZ два и более сетевых интерфейса, например venet0:0 и venet0:1 может возникнуть проблема прохождения пакетов между HN OpenVZ, то есть не в пределах одного сервера OpenVZ (где все они соединены через интерфейс venet0), а между двумя и более HN OpenVZ. Самое простое решение использовать NAT на HW, но тогда будет подменяться IP, что не всегда нужно. Втрое решение исправить в VE изменить маску сети на /24

ifconfig venet0:1 netmask 255.255.255.0

Более подробно решение проблемы здесь: OpenVZ multiple networks on CTs. Можно также запускать эту команду при помощи файла /etc/rc.local

/sbin/ifconfig venet0:1 netmask 255.255.255.0

или для CentOS теперь CentOS Stream создать выполняемый файл /sbin/ifup-local. Для добавления маршрута на новую сеть (например 10.26.95.0/24) в VE обязательно нужно указать источник src <ip вашего сервера>.

ifup-local
#!/bin/bash
/sbin/ifconfig venet0:1 netmask 255.255.255.0
 
/sbin/ip route add 10.26.95.0/24 dev venet0:1 src 10.161.85.112

Резервное копирование контейнеров OpenVZ

Физически файлы контейнера просто находятся в некоторой директории на HN. При запуске VE эта директория монтируются в другую, посредством механизмов, напоминающих mount –bind и последующий chroot. Т.е. для резервного копирования достаточно скопировать или архивировать эту директорию. Т.к. контейнер может быть запущен либо остановлен, то и резервное копирование может быть выполнено «горячее», либо «холодное». При горячем копировании может произойти порча структуры файлов, которые не были закрыты запущенными в контейнере программами. Особенно это чревато для баз данных. По этому этот метод нужно использовать очень осторожно. Этих недостатков лишено холодное копирование, но для него необходимо остановить контейнер, что не всегда приемлемо, да и вообще не хорошо вмешиваться в работу VE.

Для осуществление живой миграции контейнеров между HN у OpenVZ есть специальное состояние — checkpoint. При входе в это состояние все процессы контейнера замораживаются и содержимое памяти сбрасывается в дамп. Сохраняется также ядерная информация (например, о состоянии открытых сокетов). После перемещения файлов и дампа памяти VE на другой HN можно его там «оживить». Если промежуток времени от заморозки до оживления составляет единицы-десятки секунд, то приложения могут даже не заметить перемещения контейнера, а сетевые клиенты могут не отключиться.

Этот режим тоже можно использовать для резервного копирования контейнера OpenVZ. Конечно, через некоторое время, при восстановлении из этой копии, подключенных клиентов уже не будет, но зато целостность системы сохранится и можно будет остановить сервисы для получения полноценной «холодной» системы и запустить вновь.

  1. Установим зависимости для утилиты vzdump. Подключим репозиторий RPMForge.
    rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

    Зависимости

    yum install cstream perl-LockFile-Simple
  2. Установка vzdump.
    rpm -ivh vzdump-1.2-4.noarch.rpm
  1. Использование vzdump с ключем –suspend. Создадим бекап VE не выключая его и отошлем уведомление пользователю. В данном случае производится инкрементальный бэкап с помощью rsync с заморозкой виртуальной машины. Бэкап производится в две стадии, на первой стадии запускается rsync добавляя изменившиеся файлы в бэкап. Затем производится кратковременная остановка виртуальной машины с запуском rsync, который производит повторную синхронизацию файлов. После окончания повторной синхронизации виртуальная машина запускается и продолжает работать. Данный метод позволяет сократить время простоя виртуальной машины до минимума.** При использовании данного метода, наиболее полезны опции: –stdexcludes — позволяет исключить временные файлы (/tmp и т.д.) –exclude-path — позволяет исключить определенные директории. Адреса директорий задаются с помощью regexp.
    modprobe vzcpt
    vzdump --suspend 121 --mailto root
    vzdump --compress --suspend 121 --mailto root
  2. Возможные проблемы:
    ERROR: Backup of VM 121 failed - command 'vzctl --skiplock chkpnt 121 --suspend' failed with exit code 16

    Исправить

    modprobe vzcpt
  3. Восстановить VE с другим CTID
    vzrestore /vz/dump/vzdump-openvz-121-2016_02_09-12_27_09.tgz 123

Почему свой VPN-сервер лучше публичных сервисов? Во-первых, это высокая и стабильная скорость работы. Во-вторых, к подключению имеете доступ только вы, никто другой, включая хостинг и различные ведомства не может иметь доступа к вашему личному серверу. Настройка VPN WireGuard сервера и клиентов

PQ VPS сервера в 28+ странах.