OpenVZ в Proxmox, заметки на полях

в 10:49, , рубрики: openvz, proxmox, виртуализация, Серверное администрирование, системное администрирование, метки: ,

OpenVZ в Proxmox, заметки на полях
Возможно данная заметка не тянет на полноценную статью, но я постарался собрать здесь все нестандартные моменты, с которыми сталкивался при работе с контейнерами OpenVZ и гипервизором Proxmox, дать готовые рецепты с примерами, возможно кому-то это сэкономит время на поиск вариантов решения. Текста будет мало, примеров много, котиков картинок не будет.

  • Краткое содержание для экономии времени
  • 1. Проброс различных возможностей и устройств из гипервизора в контейнер OpenVZ
  • 1.1. Проброс fuse
  • 1.2. Проброс NFS
  • 1.3. Проброс USB-устройств
  • 1.4. Проброс звуковой карты (как встроенной так и usb)
  • 1.5. Проброс X'ов
  • 1.6. Проброс раздела диска
  • 1.7. Включение tun/tap
  • 2. Фаирвол
  • 3. Разные мелочи

И так поехали:

1. Проброс различных возможностей и устройств из гипервизора в контейнер OpenVZ


1.1.Проброс fuse


На гипервизоре выполнить:
Остановить контейнер OpenVZ

vzctl set  [VEID] --devices c:10:229:rw --save

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

vzctl exec  [VEID] mknod /dev/fuse c 10 229

, где [VEID] номер контейнера, после чего монтирование в контейнере работает.

1.2. Проброс NFS

На гипервизоре:
Устанавливаем nfs сервер

aptitude install nfs-kernel-server

правим конфиг nfs

nano /etc/exports

например экспортируем /var/lib/vz для 10.1.1.2

/var/lib/vz 10.1.1.2(rw,sync,fsid=root,no_root_squash,crossmnt,no_subtree_check)

перезапускаем nfs сервер

/etc/init.d/nfs-kernel-server restart

Добавляем поддержку nfs в контейнер

vzctl set  [VEID] --features "nfs:on" --save  

Внутри контейнера:

aptitude install nfs-common

пример монтирования

mount -t nfs 10.1.1.1:/var/lib/vz/ /vz 

1.3. Проброс USB-устройств

Во всех случаях проброса устройств, если устройств более одного, лучше напрямую править конфиг контейнера, а не использовать vzctl, дело в том, что если вы не поместили все необходимые устройства сразу в одну строку, то vzctl затрет все предыдущие пробросы и установит только последний.

В общем случае:

vzctl set VEID --devices b|c:major:minor|all:[r|w|rw|none]

где b — блочное устройство, c — символьное. major:minor необходимо посмотреть в /dev/bus/usb для конкретного устройства.
Проброс по имени

vzctl set  [VEID] --devnodes ttyUSB0:rw --save

Проброс по коду

vzctl set  [VEID] --devices c:189:all:rw --save

Либо правкой конфига:

nano /etc/pve/openvz/[VEID].conf
DEVNODES="ttyUSB1:rw "
DEVNODES="c:189:all:rw "

Для проброса USB-устройства в запущенный контейнер необходимо:
Смонтировать из хост-системы в контейнер

mount -o bind /dev/<DEVNAME> $VE_ROOT/dev/<DEVNAME> 

1.4. Проброс звуковой карты (как встроенной так и usb)

Во многом похоже на проброс обычного usb устройства, но с некоторыми отличиями.
На гипервизоре:
Ставим модули ядра для работы со звуком

modprobe snd_dummy
echo "snd_dummy" >> /etc/modules

Если USB звуковая, то еще

modprobe snd_usb_audio 
echo "snd_usb_audio" >> /etc/modules

Убедимся что модули подключились

lsmod | grep snd

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

Добавляем в конфиг виртуалки

vzctl set  [VEID] --devices c:116:all:rw --devices c:4:all:rw --save 

Если это не первое пробрасываемое устройство, то команда затрет предыдущие, тогда
правим фаил

/etc/pve/openvz/[VEID].conf 

добавляем в него строку

DEVICES="c:116:all:rw c:4:all:rw " 

Выводим список всех snd устройств

ls -la /dev/snd

crw-rw---T  1 root audio 116, 6 Jan 25 19:19 controlC0
crw-rw---T  1 root audio 116, 9 Jan 27 09:52 controlC1
crw-rw---T  1 root audio 116, 5 Jan 25 19:19 pcmC0D0c
crw-rw---T  1 root audio 116, 4 Jan 25 19:20 pcmC0D0p
crw-rw---T  1 root audio 116, 8 Jan 27 09:52 pcmC1D0c
crw-rw---T  1 root audio 116, 7 Jan 27 09:52 pcmC1D0p
crw-rw---T  1 root audio 116, 3 Jan 25 17:47 seq
crw-rw---T  1 root audio 116, 2 Jan 25 17:47 timer  

Заходим в контейнер

vzctl enter  [VEID]

Выполянем

rm -r /dev/snd

mkdir /dev/snd
mknod /dev/snd/controlC0 c 116 6
mknod /dev/snd/controlC1 c 116 9
mknod /dev/snd/pcmC0D0c c 116 5
mknod /dev/snd/pcmC0D0p c 116 4
mknod /dev/snd/pcmC1D0c c 116 8
mknod /dev/snd/pcmC1D0p c 116 7
mknod /dev/snd/seq c 116 3
mknod /dev/snd/timer c 116 2
chmod 660 /dev/snd/*
chown :audio /dev/snd/*

(Обращаем внимание что номера устройств и имена должны совпадать с таковыми на гипервизоре)

Ставим alsa

aptitude install alsa alsa-lib alsa-base alsa-util libdssialsacompat0 

Теперь нужных пользователей контейнера добавляем в группу audio

adduser skype audio

1.5. Проброс X'ов

Заходим в контейнер через vzctl (не SSH)
делаем симлинк

rm /dev/tty0
ln -s /dev/tty1 /dev/tty0 

Удаляем если установлен nscd

aptitude remove nscd 

Ставим нужные пакеты

aptitude -R install xorg xserver-xorg-video-dummy xserver-xorg-input-kbd xserver-xorg-input-mouse alsa-base linux-sound-base libaudiofile0 dbus udev

Приводим /etc/X11/xorg.conf к виду

Section "InputDevice"
        Identifier      "Dummy Input"
        Driver          "void"
EndSection

Section "Device"
        Identifier      "Dummy Video"
        Driver          "dummy"
EndSection

Section "Monitor"
        Identifier      "Configured Monitor"
EndSection

Section "Screen"
        Identifier      "Default Screen"
        Monitor        "Configured Monitor"
        Device          "Dummy Video"
EndSection

Section "ServerLayout"
        Identifier      "Default Layout"
        Screen          "Default Screen"
        InputDevice    "Dummy Input"
EndSection

Стартуем Хы

/usr/bin/X :<DISPLAY#>

где
<Display> указывает дисплей, который будет использоваться (без скобок). Теперь приложения, требующие X-ы смогут работать на любом из этих дисплеев.

Например, для запуска Skype (для Skypiax) на определенном дисплее и под UID «Skype»:

su skype -c "echo secret:password | DISPLAY=:1 /usr/bin/skype --pipelogin 2>>skype_errors.log &»
1.6. Проброс раздела диска

Принцип аналогичен предыдущим, но сделаем это по имени, например пробросим sda4

vzctl set  [VEID] --devnodes sda4:rw --save

1.7. Включение tun/tap

Если мы хотим использовать vpn внутри контейнера, то без этого не обойтись.

Проверяем подгружен ли модуль

lsmod | grep tun

Если нет подгружаем

modprobe tun
echo "tun" >> /etc/modules

vzctl stop [VEID]
vzctl set [VEID] --devices c:10:200:rw --save
vzctl set [VEID] --capability net_admin:on --save
vzctl start [VEID]

С пробросами закончили, остальное делается примерно так-же.

Фаирвол

В стандартном варианте фаирвол для контейнеров очень урезан по функционалу, попробуем это исправить.

nano /etc/vz/vz.conf

Комментируем текущую строку IPTABLES и вместо нее добавляем

IPTABLES="ipt_owner ipt_REDIRECT ipt_recent ip_tables iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ipt_state iptable_nat ip_nat_ftp"

сохраняемся и перезапускаем VZ

/etc/init.d/vz restart

После этого внутри контейнеров мы сможем нормально настроить фаирвол.

Добавляем модули, касающиеся фаирвола, при загрузке ядра на гипервизоре (лишний шаг, но на всякий случай)

nano /etc/modules

ipt_MASQUERADE
ipt_helper
ipt_REDIRECT
ipt_state
ipt_TCPMSS
ipt_LOG
ipt_TOS
iptable_nat
ipt_length
ipt_tcpmss
iptable_mangle
ipt_limit
ipt_tos
iptable_filter
ipt_ttl
ipt_REJECT
loop

Фаирвол на самом гипервизоре

Пример готового фаирвола для гипервизора под спойлером

#!/bin/sh
### BEGIN INIT INFO
# Provides: iptables.sh
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: My firewall
# Description: Rico-X FIREWALL
### END INIT INFO
# /etc/init.d/iptables

IPT=/sbin/iptables

case "$1" in
start)
echo «Starting iptables»

sysctl -w net.ipv4.tcp_synack_retries=1
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
sysctl -w net.ipv4.tcp_fin_timeout=10
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_keepalive_intvl=10
sysctl -w net.ipv4.tcp_keepalive_probes=5
sysctl -w net.ipv4.tcp_keepalive_time=60
sysctl -w net.ipv4.conf.default.rp_filter=1
#sysctl -w net.ipv4.ip_forward=0

# Запрещаем подключение к серверу
$IPT -P INPUT DROP
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT

# Позволяем входящие и исходящие соединения, инициированные уже установленными соединениями
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Открываем свободный доступ для lo интерфейса
$IPT -A INPUT -i lo -j ACCEPT

# Открываем свободный доступ для внутренней сети
$IPT -A INPUT -i eth1 -j ACCEPT
$IPT -A INPUT -i vmbr1 -j ACCEPT
# Открываем ресурсы необходимые для работы кластера
$IPT -A INPUT -m addrtype --dst-type MULTICAST -j ACCEPT
$IPT -A INPUT -p udp -m state --state NEW -m multiport --dports 5404,5405 -j ACCEPT

# Блокируем все попытки входящих TCP-соединений не SYN-пакетами
$IPT -I INPUT -m conntrack --ctstate NEW -p tcp! --syn -j DROP

# Открываем доступ к необходимым сервисам
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT ## SSH
$IPT -A INPUT -p tcp -m tcp --dport 5900:5999 -j ACCEPT ## VNC
$IPT -A INPUT -p tcp -m tcp --dport 8006 -j ACCEPT ## Proxmox panel

# Вводим ограничения для новых подключений по SSH (не больше 4 в минуту)
$IPT -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

# Запрещаем запрос имен netbios
$IPT -A INPUT -p tcp --dport 137:139 -j DROP
$IPT -A INPUT -p udp --dport 137:139 -j DROP

# Разрешаем определенные ICMP пакеты
$IPT -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
$IPT -A INPUT -p ICMP --icmp-type 11 -j ACCEPT

# Отклоняем все с ошибками
$IPT -A INPUT -m state --state INVALID -j DROP

# Разрешаем прохождение DHCP запросов через iptables.
$IPT -A INPUT -p udp -m udp --dport 68 --sport 67 -j ACCEPT

# Блокируем порт-сканнеры
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL ALL -j DROP
$IPT -A INPUT -m state --state NEW -p tcp --tcp-flags ALL NONE -j DROP

# Антиспуффинг
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$IPT -N SYN_FLOOD
$IPT -A INPUT -p tcp --syn -j SYN_FLOOD
$IPT -A SYN_FLOOD -m limit --limit 2/s --limit-burst 6 -j RETURN
$IPT -A SYN_FLOOD -j DROP

;;
stop)
echo «Stopping iptables»

$IPT -F
$IPT -X

$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
;;
*)
echo «Usage: /etc/init.d/iptables {start|stop}»
exit 1
;;
esac

exit 0

3. Разные мелочи

Правильный часовой пояс в контейнерах

mv /etc/localtime  /etc/localtime_org && ln -s /usr/share/zoneinfo/"Europe/Simferopol" /etc/localtime && date

Убираем бесполезное сообщение при входе в гипервизор через web-интерфейс.
В файле /usr/share/pve-manager/ext4/pvemanagerlib.js находим строку

if (data.status !== 'Active') {

и заменяем на

if (data.status == 'Active') {

Иногда с квотами возникает неприятность Proxmox: ‘exit code 60′ – corrupt quota file и виртуалка не стартует,
просто перезапустим квоты.

vzquota off  [VEID]
vzquota : (error) Quota is not running for id  [VEID]
vzquota : (warning) Repairing quota: it was incorrectly marked as running for id  [VEID]
vzquota on  [VEID]

Если нарушен кворум (cluster not ready — no quorum), а работать с остатками кластера нужно,
устанавливаем размер кворума, равным размеру текущих живых нод

pvecm e (количество живых нод) 

Команды управления OpenVZ
Старт [VEID] ОС

vzctl start  [VEID]

Подключаемся гостевой ОС

vzctl enter  [VEID]

Остановка

vzctl stop  [VEID]

Рестарт

vzctl restart  [VEID]

Удаление

vzctl destroy  [VEID]

Посмотреть статус

vzlist -a 

Если у кого-то возникали другие нестандартные ситуации при работе с контейнерами, буду рад пополнить свои заметки, вдруг столкнусь в дальнейшем.

Автор: RicoX

Источник

  1. igor:

    Есть вопрос:
    установил proxmox на 500гб жестком диске без рейда, так задумано. в системном блоке есть еще один 1.5тб винт. Как его увидеть в proxmox, чтобы был доп хранилищем? Рейдов не надо, просто отдельный диск. В unix я средненько сображаю…

    • заходил на огонёк:

      узнать как называется этот ваш диск
      #fdisk -l
      создать каталог куда он будет монтироваться
      #mkdir /mnt/data

      #mount /mnt/data /dev/sdX -t extX, а лучше сразу прописать в fstab монтируемый диск.
      потом в вебморде добавить новое хранилище и указать этот путь, куда был смонтирован диск.

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js