# Proxmox

![](/Virtualization/Proxmox/proxmox.webp)

Proxmox - достаточно удобная в употреблении система для организации виртуальных машин на [KVM](Linux/System/KVM) и [LXC](Linux/System/LXC)-контейнеров для своих нужд. Для домашнего использования бесплатна, но обновление пакетов за деньги.

Базируется на debian, может быть установлена поверх него, но так же есть уже готовый настроенный образ для установки на сервер. Так же на официальном сайте имеются образы для организации Backup-сервера proxmox.

## Настройка ИБП для Proxmox

В моем случае это ИБП Ippon Back Basic 650 Euro. Подключаем его к серверу по USB. Проверяем его USB id

```bash
root@kanonik-server:~# lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 0665:5161 Cypress Semiconductor USB to Serial <- Это оно если что
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

Проверим корректно ли работает устроиство с Proxmox

```bash
root@kanonik-server:~# lsusb -v -s 1:2

Bus 001 Device 002: ID 0665:5161 Cypress Semiconductor USB to Serial
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x0665 Cypress Semiconductor
  idProduct          0x5161 USB to Serial
  bcdDevice            0.02
  iManufacturer           1 INNO TECH
  iProduct                2 USB to Serial
  iSerial                 3 20100826
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0022
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          3 20100826
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              4 Sample HID
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      27
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              32
Device Status:     0x0000
  (Bus Powered)
```

Далее ставим пакет nut с репозитория

```bash
apt install nut -y
```
Запустим nut-scanner, проверим находит ли сканер наш ИБП
```bash
root@kanonik-server:~# nut-scanner -U
Scanning USB bus.
[nutdev1]
        driver = "nutdrv_qx"
        port = "auto"
        vendorid = "0665"
        productid = "5161"
        product = "USB to Serial"
        vendor = "INNO TECH"
        bus = "001"
```

Отлично, делаем бекапы конфиг-файлов перед редактированием
```bash
cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/ups.conf /etc/nut/ups.example.conf
cp /etc/nut/upsd.conf /etc/nut/upsd.example.conf
cp /etc/nut/upsd.users /etc/nut/upsd.example.users
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
cp /etc/nut/upssched.conf /etc/nut/upssched.example.conf
cp /etc/nut/upssched-cmd /etc/nut/upssched-cmd.example
```
Теперь приступаем к настройке. Открываем `/etc/nut/nut.conf` и редактируем единственную директиву в конце файла:
```
MODE=netserver
```
Далее открываем `/etc/nut/ups.conf` и удалив все содержимое прописываем:
```
pollinterval = 15
maxretry = 3

offdelay = 120
ondelay = 240

[ippon]
driver = nutdrv_qx
port = auto
desc = "INNO TECH"
vendorid = 0665
productid = 5161
serial = 20100826
```
Запустим `upsdrvctl start` для проверки запуска драйвера:
```bash
root@kanonik-server:~# upsdrvctl start
Network UPS Tools - UPS driver controller 2.8.0
Network UPS Tools - Generic Q* USB/Serial driver 0.32 (2.8.0)
USB communication driver (libusb 1.0) 0.43
Duplicate driver instance detected (PID file /run/nut/nutdrv_qx-ippon.pid exists)! Terminating other driver!
Using protocol: Q1 0.07
Can't autodetect number of battery packs [-1/13.60]
Battery runtime will not be calculated (runtimecal not set)
```
Не обращаем внимания на ошибки, потому как ИБП простенький и в нем нет реализации сбора метрик с battery pack.

Открываем `/etc/nut/upsd.conf` и удалив все, прописываем:
```
LISTEN 0.0.0.0 3493
LISTEN :: 3493
```
Теперь открываем nano `/etc/nut/upsd.users` и так же удалив все содержимое вписываем учетки администратора и юзера для службы NUT:
```
[upsadmin]
# Administrative user
password = ADMINPASSWORD
# Allow changing values of certain variables in the UPS.
actions = SET
# Allow setting the "Forced Shutdown" flag in the UPS.
actions = FSD
# Allow all instant commands
instcmds = ALL
upsmon master

[upsuser]
# Normal user
password = USERPASSWORD
upsmon slave
```
Далее открываем `/etc/nut/upsmon.conf` и удалив все содержимое вписываем:
```
RUN_AS_USER root
MONITOR ippon@localhost 1 upsadmin ADMINPASSWORD master

MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h"
NOTIFYCMD /usr/sbin/upssched
POLLFREQ 4
POLLFREQALERT 2
HOSTSYNC 15
DEADTIME 24
MAXAGE 24
POWERDOWNFLAG /etc/killpower

NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery"
NOTIFYMSG LOWBATT "UPS %s battary is low"
NOTIFYMSG FSD "UPS %s: forced shutdown in progress"
NOTIFYMSG COMMOK "Communications with UPS %s established"
NOTIFYMSG COMMBAD "Communications with UPS %s lost"
NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding"
NOTIFYMSG REPLBATT "UPS %s battery needs to be replaced"
NOTIFYMSG NOCOMM "UPS %s is unavailable"
NOTIFYMSG NOPARENT "upsmon parent process died - shutdown impossible"

NOTIFYFLAG ONLINE   SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT   SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT  SYSLOG+WALL+EXEC
NOTIFYFLAG FSD      SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK   SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD  SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT SYSLOG+WALL
NOTIFYFLAG NOCOMM   SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT SYSLOG+WALL

RBWARNTIME 43200
NOCOMMWARNTIME 600

FINALDELAY 5
```
Теперь открываем `/etc/nut/upssched.conf` и удалив все содержимое вписываем:
```
CMDSCRIPT /etc/nut/upssched-cmd
PIPEFN /etc/nut/upssched.pipe
LOCKFN /etc/nut/upssched.lock

AT ONBATT * START-TIMER onbatt 30
AT ONLINE * CANCEL-TIMER onbatt online
AT LOWBATT * EXECUTE onbatt
AT COMMBAD * START-TIMER commbad 30
AT COMMOK * CANCEL-TIMER commbad commok
AT NOCOMM * EXECUTE commbad
AT SHUTDOWN * EXECUTE powerdown
AT SHUTDOWN * EXECUTE powerdown
```
Для работы следующего скрипта необходимо наличие папки `/etc/nut/upssched/`, если ее нет - создадим
```bash
mkdir /etc/nut/upssched/
```
Редактируем теперь сам скрипт `/etc/nut/upssched-cmd`
```
#!/bin/sh
 case $1 in
       onbatt)
          logger -t upssched-cmd "UPS running on battery"
          ;;
       shutdowncritical)
          logger -t upssched-cmd "UPS on battery critical, forced shutdown"
          /usr/sbin/upsmon -c fsd
          ;;
       upsgone)
          logger -t upssched-cmd "UPS has been gone too long, can't reach"
          ;;
       *)
          logger -t upssched-cmd "Unrecognized command: $1"
          ;;
 esac
 ```
 Чтобы скрипт запускался, дадим ему права на запуск:
 ```bash
 chmod +x /etc/nut/upssched-cmd
 ```
 Далее рестартим систему или перезапускаем сервисы:
 ```bash
systemctl restart nut-server
systemctl restart nut-client
systemctl restart nut-monitor
upsdrvctl stop
upsdrvctl start
```
Проверяем получаем ли информацию с ИБП:
```bash
root@kanonik-server:~# upsc ippon@localhost
Init SSL without certificate database
battery.voltage: 13.60
device.type: ups
driver.name: nutdrv_qx
driver.parameter.pollfreq: 30
driver.parameter.pollinterval: 15
driver.parameter.port: auto
driver.parameter.productid: 5161
driver.parameter.serial: 20100826
driver.parameter.synchronous: auto
driver.parameter.vendorid: 0665
driver.version: 2.8.0
driver.version.data: Q1 0.07
driver.version.internal: 0.32
driver.version.usb: libusb-1.0.26 (API: 0x1000109)
input.frequency: 50.3
input.voltage: 229.4
input.voltage.fault: 230.0
output.voltage: 230.0
ups.beeper.status: enabled
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 10
ups.productid: 5161
ups.status: OL
ups.temperature: 25.0
ups.type: offline / line interactive
ups.vendorid: 0665
```

Теперь можно изменять параметры переменных командой `upsrw`. Например:
```
upsrw -s battery.charge.low=40 ippon@localhost # Минимальный заряд ИБП будет 40%
```
## LXC-контейнер со страничкой статуса ИБП
По аналогии можно сделать и на виртуалке, но много ресурсов такая штука не займет

Скачиваем темплейт debian для LXC, создаем новый контейнер. Даем ему 8 GB виртуальный жесткий диск, 1 ядро, 128 мб оперативной памяти, назначаем IP адрес. В опциях ставим галочку на автозапуск контейнера при перезапуске сервера. Запускаем контейнер. Ставим пакеты:
```bash
apt install apache2 nut-cgi nut-client -y
```
Так же делаем бекап конфигов:
```bash
cp /etc/nut/nut.conf /etc/nut/nut.example.conf
cp /etc/nut/hosts.conf /etc/nut/hosts.example.conf
cp /etc/nut/upsset.conf /etc/nut/upsset.example.conf
cp /etc/nut/upsmon.conf /etc/nut/upsmon.example.conf
```
В файле `/etc/nut/nut.conf` редактируем директиву:
```
MODE=netclient
```
В файле `/etc/nut/hosts.conf` удаляем все и прописываем:
```
MONITOR ippon@тут_пишем_ip_адрес_proxmox "IPPON Euro 650"
```
В файле `/etc/nut/upsset.conf` нужно раскомментировать строчку:
```
I_HAVE_SECURED_MY_CGI_DIRECTORY
```
В файле `/etc/nut/upsmon.conf` удаляем все и прописываем:
```
RUN_AS_USER root
MONITOR ippon@тут_пишем_ip_адрес_proxmox 1 upsuser USERPASSWORD slave
```
Теперь добавляем модуль cgi и рестартим сервис apache:
```bash
sudo a2enmod cgi
sudo systemctl restart apache2
```
Проверяем работу монитора перейдя по `http://ip-or-fqdn-lxc/cgi-bin/nut/upsstats.cgi`
![](/Virtualization/Proxmox/nut-client-apache.png)

## Wake-on-Lan на Proxmox
Включаем WOL в BIOS материнской платы. Как это сделать ищите в интернете потому что на разных материнских платах это делается по разному.
Теперь ставим утилиту `ethtool`
```bash
sudo apt install ethtool
```
Теперь нам нужно узнать мак-адрес физической сетевой карты, для этого пишем `ip a`
```bash
root@kanonik-server:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master vmbr0 state UP group default qlen 1000
    link/ether d4:fd:11:6a:89:56 brd ff:ff:ff:ff:ff:ff
...
```
где d4:fd:11:6a:89:56 - наш мак-адрес. Записываем себе в блокнотик
Теперь нужно определить поддерживает ли сетевая карта WOL. Для этого пишем:
```bash
root@kanonik-server:~# ethtool enp2s0
Settings for enp2s0:
        Supported ports: [ TP    MII ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Link partner advertised link modes:  10baseT/Half 10baseT/Full
                                             100baseT/Half 100baseT/Full
                                             1000baseT/Half 1000baseT/Full
        Link partner advertised pause frame use: No
        Link partner advertised auto-negotiation: Yes
        Link partner advertised FEC modes: Not reported
        Speed: 1000Mb/s
        Duplex: Full
        Auto-negotiation: on
        master-slave cfg: preferred slave
        master-slave status: slave
        Port: Twisted Pair
        PHYAD: 0
        Transceiver: external
        MDI-X: Unknown
        Supports Wake-on: pumbg <--------- Поддержка WOL
        Wake-on: d <--------- Включен или нет
        Link detected: yes
```
Если не включен то пишем:
```bash
sudo ethtool -s enp2s0 wol g
```
Теперь добавляем строчку `ethernet-wol g` в блок нашей сетевой карты в`/etc/network/interfaces`. В нашем случае это получилось в таком виде:
```
root@kanonik-server:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

iface enp2s0 inet manual
ethernet-wol g

iface enp3s0 inet manual
```
Теперь выключаем сервер и пробуем включить его какой-нибудь утилитой по запуску компьютеров. В моем случае это тул в mikrotik:
![](/Virtualization/Proxmox/winbox-wol.png)
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9