commit d239d426c251b334d95709a8901c2d60e7ce749e Author: PTah Date: Thu Jul 9 10:28:49 2026 +1000 docs: добавить ТЗ и инструкцию развёртывания Proxmox Документация по консолидации СКАДА, ЛЭРС, лифтов и Меркурия на единый сервер Proxmox VE — два варианта (GPU passthrough и RDP). Co-authored-by: Cursor diff --git a/README.md b/README.md new file mode 100644 index 0000000..b2fe182 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# SKADA — документация по консолидации серверов + +Проект переноса систем **СКАДА**, **ЛЭРС**, **управление лифтами** и **«Меркурий»** с трёх отдельных компьютеров на единый сервер **Proxmox VE**. + +## Документы + +| Документ | Описание | +|----------|----------| +| [Техническое задание](docs/TZ-proxmox-konsolidaciya.md) | Цели, два варианта архитектуры (GPU passthrough / RDP), требования к железу, критерии приёмки | +| [Развёртывание и настройка](docs/razvertyvanie-proxmox.md) | Пошаговая инструкция: Proxmox, IOMMU, passthrough, RDP, миграция, бэкапы | + +## Варианты реализации + +- **Вариант А** — сервер в комнате диспетчеров, 3 GPU passthrough, 3 монитора +- **Вариант Б** — сервер в серверной, доступ к 3 VM по RDP с клиентского ПК + +## Состав виртуальных машин + +| VM | Системы | +|----|---------| +| VM-01 | СКАДА + «Меркурий» | +| VM-02 | ЛЭРС Учёт | +| VM-03 | Управление лифтами | diff --git a/docs/TZ-proxmox-konsolidaciya.md b/docs/TZ-proxmox-konsolidaciya.md new file mode 100644 index 0000000..93166a7 --- /dev/null +++ b/docs/TZ-proxmox-konsolidaciya.md @@ -0,0 +1,315 @@ +# Техническое задание + +## Консолидация систем СКАДА, ЛЭРС, лифты и «Меркурий» на единый сервер Proxmox VE + +| Параметр | Значение | +|----------|----------| +| Версия | 1.0 | +| Дата | 09.07.2026 | +| Статус | Проектная документация | +| Связанный документ | [Развёртывание и настройка](razvertyvanie-proxmox.md) | + +--- + +## 1. Цель проекта + +Перенести с трёх отдельных компьютеров (Windows 10, Intel Core i5-7400, 8 ГБ RAM) на **один физический сервер** следующие системы: + +| № | Система | Текущее размещение | Монитор | +|---|---------|-------------------|---------| +| 1 | СКАДА + «Меркурий» (USB-ключ защиты) | один ПК | 1 | +| 2 | ЛЭРС Учёт | отдельный ПК | 2 | +| 3 | Управление лифтами | отдельный ПК | 3 | + +### 1.1. Требования + +- три системы доступны оператору **одновременно**; +- изоляция систем друг от друга (падение одной не останавливает остальные); +- сохранение привычной работы оператора; +- резервное копирование и возможность восстановления; +- замена MOXA на другой контроллер — **отдельная фаза** (раздел 10). + +--- + +## 2. Исходные данные + +| Параметр | Значение | +|----------|----------| +| ОС на всех системах | Windows 10 | +| Мониторы | 3 шт., рядом (~1 м друг от друга) | +| USB-ключ защиты | только «Меркурий» (Guardant / HASP / Rutoken) | +| Связь со счётчиками | MOXA (Ethernet → COM), замена планируется позже | +| Текущая нагрузка | i5-7400, 8 ГБ RAM на каждый ПК | + +--- + +## 3. Целевая архитектура (общая для обоих вариантов) + +На гипервизоре **Proxmox VE 8.x** создаются **3 виртуальные машины**: + +| ВМ | Назначение | vCPU | RAM | Диск | +|----|-----------|------|-----|------| +| VM-01 | СКАДА + «Меркурий» | 4–6 | 16–20 ГБ | 120–200 ГБ | +| VM-02 | ЛЭРС Учёт | 4 | 12–16 ГБ | 80–120 ГБ | +| VM-03 | Управление лифтами | 4 | 12–16 ГБ | 80–120 ГБ | + +**Ресурсы хоста Proxmox:** 4–6 vCPU, 8–12 ГБ RAM (остаток от 64 ГБ ОЗУ). + +**Хранилище:** ZFS mirror из 2× NVMe SSD на хосте. + +--- + +## 4. Вариант А — GPU Passthrough (сервер в комнате диспетчеров) + +### 4.1. Описание + +Сервер располагается **рядом с рабочим местом оператора** (расстояние до мониторов 1–2 м). К каждой ВМ пробрасываются: + +- отдельная видеокарта → свой монитор; +- отдельный комплект клавиатура/мышь; +- на VM-01: USB-ключ «Меркурия» и MOXA/конвертер (до замены). + +Оператор работает **как на трёх отдельных компьютерах**. + +### 4.2. Схема + +``` +┌─────────────────────────────────────────────────────────────┐ +│ Сервер (Proxmox VE) — комната диспетчеров │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │ VM-01 │ │ VM-02 │ │ VM-03 │ │ +│ │СКАДА+ │ │ ЛЭРС │ │ Лифты │ │ +│ │Меркурий │ │ │ │ │ │ +│ └──┬───┬───┘ └──┬───┬───┘ └──┬───┬───┘ │ +│ │GPU│USB │GPU│USB │GPU│USB │ +└─────┼───┼─────────┼───┼─────────┼───┼───────────────────────┘ + │ │ │ │ │ │ + Мон.1 КМ1 Мон.2 КМ2 Мон.3 КМ3 + │ + USB-ключ + MOXA (VM-01) +``` + +### 4.3. Требования к оборудованию + +> **Важно.** Абсолютной гарантии совместимости passthrough не существует — результат зависит от связки CPU + материнская плата + BIOS + GPU. Перед закупкой проверять IOMMU groups на [iommu.info](https://iommu.info/) и обсуждения на [форуме Proxmox](https://forum.proxmox.com/). + +| Компонент | Рекомендация | Комментарий | +|-----------|-------------|-------------| +| CPU | AMD Ryzen 9 5900X (12C/24T) или Ryzen 9 7900 | IOMMU из коробки; Intel — только с VT-d | +| Материнская плата | ASUS ProArt X570-CREATOR WIFI (AM4) или ASUS ProArt X870E-CREATOR WIFI (AM5) | Хорошие IOMMU groups по отзывам сообщества Proxmox | +| Альтернатива (3 GPU) | ASRock X570 Taichi, ASUS WS X570-ACE, Supermicro H12SSL-i | Нужно 3 физических PCIe ×16 и проверка IOMMU groups | +| RAM | 64 ГБ DDR4/DDR5 | ECC — желательно на серверных платах | +| Диски | 2× NVMe 1–2 ТБ (Samsung 990 Pro, Kingston KC3000) | ZFS mirror на хосте | +| GPU ×3 | AMD RX 550 4GB Low Profile (**предпочтительно**) | Стабильнее NVIDIA; возможен AMD reset-bug → модуль `vendor-reset` | +| GPU (альтернатива) | NVIDIA GT 1030 Low Profile ×3 | Часто Code 43 → патч VBIOS, `hidden=1`, `cpu: host` | +| GPU хоста | Встроенная iGPU или отдельная служебная | Proxmox не должен использовать passthrough-GPU | +| БП | 750–850 Вт, 80+ Gold | | +| UPS | 1000–1500 ВА, line-interactive | Сервер + мониторы | +| Сеть | 2× Gigabit | Отделение технологической сети (VLAN) | +| USB | 3+ независимых USB-контроллера или PCIe USB-карты | Надёжный passthrough КМ и USB-ключа | + +#### Рекомендуемая конфигурация + +| Позиция | Модель | +|---------|--------| +| CPU | AMD Ryzen 9 5900X | +| MB | ASUS ProArt X570-CREATOR WIFI | +| RAM | 64 ГБ DDR4-3200 (2×32) | +| SSD | 2× Samsung 990 Pro 1TB | +| GPU ×3 | Sapphire RX 550 4GB LP | +| БП | be quiet! Straight Power 11 850W | +| UPS | APC Smart-UPS 1500VA | + +**Ориентир стоимости:** 150–220 тыс. ₽ (без мониторов и периферии). + +#### Настройки BIOS (обязательно) + +| Параметр | Intel | AMD | +|----------|-------|-----| +| Виртуализация | VT-x ON | SVM ON | +| IOMMU | VT-d ON | IOMMU ON (не Auto) | +| Режим загрузки | UEFI, CSM OFF | UEFI, CSM OFF | +| Above 4G Decoding | ON | ON | +| Resizable BAR | OFF (для NVIDIA) | по необходимости | +| Primary Display | iGPU (если есть) | iGPU (если есть) | + +### 4.4. Плюсы и минусы + +| Плюсы | Минусы | +|-------|--------| +| Полная автономность каждого рабочего места | Сложная настройка passthrough | +| Нет зависимости от сети для отображения | Сервер в комнате диспетчеров (шум, пыль) | +| Минимальная задержка ввода | Жёсткие требования к плате (3 PCIe ×16) | +| Привычно для оператора | NVIDIA может потребовать патч VBIOS | + +--- + +## 5. Вариант Б — RDP (сервер в серверной) + +### 5.1. Описание + +Сервер располагается в **серверной / шкафу**. На рабочем месте диспетчеров — **клиентский ПК** с 3 мониторами. Оператор подключается к каждой ВМ по **RDP** в полноэкранном режиме на свой монитор. + +### 5.2. Схема + +``` +┌──────────────────────┐ Gigabit LAN ┌─────────────────────┐ +│ Серверная │◄────────────────────────────►│ Комната диспетчеров│ +│ Proxmox VE │ (VLAN) │ Клиентский ПК │ +│ ┌────┐┌────┐┌────┐ │ │ Монитор 1 → RDP VM-01 +│ │VM01││VM02││VM03│ │ │ Монитор 2 → RDP VM-02 +│ └──┬─┘└──┬─┘└──┬─┘ │ │ Монитор 3 → RDP VM-03 +│ 1× GPU (админ) │ └─────────────────────┘ +└──────────────────────┘ +``` + +### 5.3. Требования к оборудованию + +#### Сервер (серверная) + +| Компонент | Рекомендация | +|-----------|-------------| +| CPU | AMD Ryzen 9 5900X / Intel Core i7-13700 (12+ ядер) | +| MB | Любая с VT-d/IOMMU | +| RAM | 64 ГБ | +| SSD | 2× NVMe 1TB, ZFS mirror | +| GPU | 1× GT 1030 или iGPU — только для консоли хоста | +| NIC | 2× Gigabit (Intel I210/I225 предпочтительнее Realtek) | +| UPS | Обязателен | + +#### Клиентское рабочее место + +| Компонент | Рекомендация | +|-----------|-------------| +| ПК | Intel NUC / Beelink / офисный mini-PC (i5, 8 ГБ RAM) | +| Мониторы | 3× существующих | +| КМ | 1 комплект (управление клиентом) | +| Сеть | Gigabit, задержка ≤5 мс до сервера | +| ОС | Windows 10/11 Pro | + +#### Сеть + +| Параметр | Требование | +|----------|-----------| +| Пропускная способность | ≥1 Gbps | +| Задержка | ≤5 мс | +| VLAN | Отделить SCADA/лифты от офисной сети | +| Firewall | RDP (TCP 3389) только клиент ↔ сервер | + +### 5.4. USB-ключ «Меркурия» + +USB-ключ остаётся **на сервере**, пробрасывается в VM-01. MOXA (до замены) работает по **Ethernet** — USB passthrough для MOXA не требуется. + +### 5.5. Лицензирование RDP + +Windows 10 Pro допускает **1 одновременную RDP-сессию** на ВМ. Для данного проекта достаточно: клиент открывает 3 отдельных RDP-подключения к 3 разным ВМ. + +### 5.6. Плюсы и минусы + +| Плюсы | Минусы | +|-------|--------| +| Сервер в серверной (тише, безопаснее) | Зависимость от сети | +| Не нужны 3 GPU и сложный passthrough | Клиентский ПК — дополнительная точка отказа | +| Проще железо и поддержка | Задержка ввода (обычно незаметна в LAN) | +| Дешевле | При обрыве сети — нет доступа к системам | + +--- + +## 6. Сравнение вариантов + +| Критерий | Вариант А (GPU) | Вариант Б (RDP) | +|----------|----------------|-----------------| +| Расположение сервера | Комната диспетчеров | Серверная | +| Сложность внедрения | Высокая | Средняя | +| Стоимость железа | Выше (+3 GPU) | Ниже | +| Надёжность отображения | Не зависит от сети | Зависит от LAN | +| Изоляция систем | Полная | Полная | +| USB-ключ «Меркурия» | Passthrough | Passthrough | +| **Рекомендация** | Сервер рядом с мониторами | Сервер в серверной | + +--- + +## 7. План работ (этапы) + +| Фаза | Содержание | Срок | +|------|-----------|------| +| 0 | Инвентаризация, бэкапы, выбор варианта | 3–5 дней | +| 1 | Закупка и сборка железа, проверка IOMMU (Вариант А) | 3–7 дней | +| 2 | Установка Proxmox VE | 1 день | +| 3 | Создание 3 ВМ, установка Windows 10 | 1–2 дня | +| 4 | Миграция СКАДА, «Меркурия», ЛЭРС, лифтов | 2–5 дней | +| 5 | Настройка passthrough (А) или RDP (Б) | 1–2 дня | +| 6 | Настройка резервного копирования | 0.5 дня | +| 7 | Параллельная эксплуатация и тесты | 7–14 дней | +| 8 | Ввод в промышленную эксплуатацию | 1 день | + +Подробные команды и процедуры — в документе [Развёртывание и настройка](razvertyvanie-proxmox.md). + +--- + +## 8. Критерии приёмки + +| № | Критерий | Вариант А | Вариант Б | +|---|----------|-----------|-----------| +| 1 | 3 системы работают одновременно | ✓ | ✓ | +| 2 | Каждая система на своём мониторе | ✓ | ✓ | +| 3 | USB-ключ «Меркурия» определяется ПО | ✓ | ✓ | +| 4 | Опрос счётчиков через MOXA работает | ✓ | ✓ | +| 5 | Reboot одной ВМ не влияет на другие | ✓ | ✓ | +| 6 | Reboot хоста → autostart всех ВМ ≤10 мин | ✓ | ✓ | +| 7 | Ежедневный vzdump-бэкап выполняется | ✓ | ✓ | +| 8 | Restore из бэкапа проверен | ✓ | ✓ | + +--- + +## 9. Риски и меры + +| Риск | Вероятность | Мера | +|------|-------------|------| +| Code 43 (NVIDIA passthrough) | Средняя | AMD RX 550; патч VBIOS | +| IOMMU groups «склеены» | Средняя | Проверка до покупки; ACS override (крайний случай) | +| USB-ключ нестабилен в VM | Низкая | Passthrough USB-контроллера целиком | +| AMD GPU reset-bug | Средняя | Модуль `vendor-reset` | +| Единая точка отказа (сервер) | Высокая | UPS + vzdump + процедура restore ≤4 ч | +| Обрыв сети (Вариант Б) | Средняя | Выделенный VLAN, резервный клиент | +| Windows Update перезагрузка | Средняя | Отложенные обновления, maintenance window | + +--- + +## 10. Будущая фаза: замена MOXA на Меркурий-220/221 + +> **Статус:** не входит в текущий объём работ. Выполняется после стабилизации основной системы. + +| № | Действие | +|---|----------| +| 10.1 | Определить модель: **Меркурий-221 (USB)** — предпочтительно | +| 10.2 | Подключить к серверу, passthrough в VM-01 по vendor:product ID | +| 10.3 | Установить драйвер USB-COM в Windows VM-01 | +| 10.4 | Перенастроить «Меркурий»: COM-порт, скорость, адреса счётчиков | +| 10.5 | Параллельный опрос (MOXA + 221) 3–7 дней | +| 10.6 | Переключение на 221, отключение MOXA | +| 10.7 | Документирование новой схемы | + +--- + +## 11. Рекомендация по выбору варианта + +| Условие | Вариант | +|---------|---------| +| Сервер может стоять в комнате диспетчеров | **А** (GPU passthrough) | +| Сервер только в серверной | **Б** (RDP) | +| Нет опыта с passthrough / ограничен бюджет | **Б** | +| Критична минимальная задержка и автономность | **А** | +| Не уверены в совместимости железа | Начать с **Б** | + +--- + +## 12. Передаваемая документация + +После внедрения подготовить: + +1. Схема сети (IP, VLAN, порты). +2. Таблица passthrough (GPU ↔ VM, USB ↔ VM). +3. Учётные записи и пароли (в защищённом хранилище). +4. Инструкция: перезагрузка сервера, restore из бэкапа. +5. Журнал изменений. diff --git a/docs/razvertyvanie-proxmox.md b/docs/razvertyvanie-proxmox.md new file mode 100644 index 0000000..155b03a --- /dev/null +++ b/docs/razvertyvanie-proxmox.md @@ -0,0 +1,882 @@ +# Развёртывание и настройка Proxmox VE + +## Консолидация СКАДА, ЛЭРС, лифты, «Меркурий» + +| Параметр | Значение | +|----------|----------| +| Версия | 1.0 | +| Дата | 09.07.2026 | +| Связанный документ | [Техническое задание](TZ-proxmox-konsolidaciya.md) | + +--- + +## Содержание + +1. [Предварительные требования](#1-предварительные-требования) +2. [Фаза 0 — Подготовка](#2-фаза-0--подготовка) +3. [Фаза 1 — Установка Proxmox VE](#3-фаза-1--установка-proxmox-ve) +4. [Фаза 2 — Настройка IOMMU и VFIO (Вариант А)](#4-фаза-2--настройка-iommu-и-vfio-вариант-а) +5. [Фаза 3 — Создание виртуальных машин](#5-фаза-3--создание-виртуальных-машин) +6. [Фаза 4 — Установка Windows 10](#6-фаза-4--установка-windows-10) +7. [Фаза 5 — GPU и USB Passthrough (Вариант А)](#7-фаза-5--gpu-и-usb-passthrough-вариант-а) +8. [Фаза 6 — Настройка RDP (Вариант Б)](#8-фаза-6--настройка-rdp-вариант-б) +9. [Фаза 7 — Миграция программ](#9-фаза-7--миграция-программ) +10. [Фаза 8 — Резервное копирование](#10-фаза-8--резервное-копирование) +11. [Фаза 9 — Тестирование и ввод в эксплуатацию](#11-фаза-9--тестирование-и-ввод-в-эксплуатацию) +12. [Устранение неполадок](#12-устранение-неполадок) +13. [Справочник конфигураций ВМ](#13-справочник-конфигураций-вм) + +--- + +## 1. Предварительные требования + +### 1.1. Состав виртуальных машин + +| VM ID | Имя | Назначение | IP (пример) | vCPU | RAM | Диск | +|-------|-----|-----------|-------------|------|-----|------| +| 101 | vm-scada | СКАДА + «Меркурий» | 192.168.10.11 | 6 | 20 ГБ | 200 ГБ | +| 102 | vm-lers | ЛЭРС Учёт | 192.168.10.12 | 4 | 16 ГБ | 120 ГБ | +| 103 | vm-lifts | Управление лифтами | 192.168.10.13 | 4 | 16 ГБ | 120 ГБ | + +### 1.2. Необходимые образы и файлы + +- ISO Proxmox VE 8.x — [proxmox.com/downloads](https://www.proxmox.com/en/downloads) +- ISO Windows 10 +- VirtIO drivers — [fedoraproject.org/wiki/Windows_Virtio_Drivers](https://fedoraproject.org/wiki/Windows_Virtio_Drivers) +- Полные бэкапы текущих ПК (образы + БД + конфигурации) + +### 1.3. Сетевая схема (пример) + +| Узел | IP | VLAN | Назначение | +|------|-----|------|-----------| +| Proxmox host | 192.168.10.10 | 10 | Управление | +| VM-101 | 192.168.10.11 | 10 | СКАДА + «Меркурий» | +| VM-102 | 192.168.10.12 | 10 | ЛЭРС | +| VM-103 | 192.168.10.13 | 10 | Лифты | +| MOXA (до замены) | 192.168.10.20 | 10 | Конвертер RS-485 | +| RDP-клиент | 192.168.10.50 | 10 | Рабочее место (Вариант Б) | + +--- + +## 2. Фаза 0 — Подготовка + +### 2.1. Инвентаризация + +Зафиксировать для каждого текущего ПК: + +- [ ] Версия Windows 10 (build) +- [ ] Версии СКАДА, ЛЭРС, лифтов, «Меркурия» +- [ ] Размеры баз данных +- [ ] IP-адреса, маски, шлюзы, DNS +- [ ] COM-порты и скорости (если используются) +- [ ] Подключение MOXA (IP, порт, виртуальный COM) +- [ ] Vendor:Product ID USB-ключа «Меркурия» + +Узнать ID USB-ключа на Linux-хосте (после установки Proxmox): + +```bash +lsusb +# Пример вывода: Bus 001 Device 005: ID 0529:0001 Aladdin HASP HL 3.25 +``` + +### 2.2. Резервное копирование исходных систем + +На каждом из трёх ПК: + +1. Создать образ диска (Macrium Reflect / Clonezilla). +2. Экспортировать базы данных СКАДА и ЛЭРС штатными средствами ПО. +3. Сохранить конфигурации лифтовой программы и «Меркурия». +4. Скопировать бэкапы на внешний носитель и NAS. + +### 2.3. Проверка IOMMU (только Вариант А, после сборки железа) + +В BIOS включить VT-d/IOMMU, установить Proxmox, выполнить: + +```bash +dmesg | grep -e DMAR -e IOMMU -e AMD-Vi +``` + +Скрипт проверки IOMMU groups: + +```bash +#!/bin/bash +# save as: /root/check-iommu.sh +for g in /sys/kernel/iommu_groups/*; do + echo "Group $(basename $g):" + for d in $g/devices/*; do + echo -e "\t$(lspci -nns ${d##*/})" + done +done +``` + +```bash +chmod +x /root/check-iommu.sh +/root/check-iommu.sh | tee /root/iommu-groups.txt +``` + +**Критерий готовности:** каждая GPU находится в отдельной IOMMU group (допустимо только с HDMI-audio той же карты). + +--- + +## 3. Фаза 1 — Установка Proxmox VE + +### 3.1. Установка + +1. Загрузиться с ISO Proxmox VE 8.x. +2. Target disk: ZFS (RAID1) — выбрать 2 NVMe. +3. Задать: + - Hostname: `pve-scada` + - IP: `192.168.10.10/24` + - Gateway, DNS — по сети заказчика +4. Завершить установку, перезагрузить. + +### 3.2. Первичная настройка хоста + +```bash +# Обновление системы +apt update && apt full-upgrade -y + +# Часовой пояс (пример: Москва) +timedatectl set-timezone Europe/Moscow + +# Проверка версии +pveversion -v +``` + +### 3.3. Загрузка ISO в хранилище + +Через веб-интерфейс: **Datacenter → pve-scada → local → ISO Images → Upload** + +Загрузить: + +- `Win10_22H2_ru.iso` +- `virtio-win-0.1.xxxx.iso` + +### 3.4. Настройка хранилища (если нужен NAS для бэкапов) + +**Datacenter → Storage → Add → NFS/CIFS** — указать путь к NAS для vzdump. + +--- + +## 4. Фаза 2 — Настройка IOMMU и VFIO (Вариант А) + +> Для **Варианта Б (RDP)** этот раздел можно пропустить, достаточно базовой установки Proxmox. + +### 4.1. BIOS + +| Параметр | Значение | +|----------|----------| +| Intel VT-x / AMD SVM | ON | +| Intel VT-d / AMD IOMMU | ON | +| Boot Mode | UEFI | +| CSM / Legacy | OFF | +| Above 4G Decoding | ON | +| Resizable BAR | OFF (NVIDIA) | +| Primary Display | iGPU | + +### 4.2. GRUB + +```bash +nano /etc/default/grub +``` + +Для Intel: + +``` +GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on iommu=pt" +``` + +Для AMD: + +``` +GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on iommu=pt" +``` + +Применить: + +```bash +update-grub +``` + +### 4.3. Модули ядра + +```bash +cat >> /etc/modules << 'EOF' +vfio +vfio_iommu_type1 +vfio_pci +EOF +``` + +### 4.4. Blacklist GPU-драйверов на хосте + +```bash +cat > /etc/modprobe.d/blacklist-gpu.conf << 'EOF' +blacklist nouveau +blacklist nvidia +blacklist nvidiafb +blacklist radeon +blacklist amdgpu +EOF +``` + +### 4.5. Привязка GPU к vfio-pci + +Узнать PCI ID видеокарт: + +```bash +lspci -nn | grep -i vga +# Пример AMD RX 550: 1002:699f +# Пример NVIDIA GT 1030: 10de:1d01 +``` + +```bash +nano /etc/modprobe.d/vfio.conf +``` + +``` +options vfio-pci ids=1002:699f,1002:699f,1002:699f +softdep radeon pre: vfio-pci +softdep amdgpu pre: vfio-pci +softdep nouveau pre: vfio-pci +softdep nvidia pre: vfio-pci +options vfio-pci disable_vga=1 +``` + +> Замените `ids=` на реальные ID ваших трёх GPU. + +```bash +update-initramfs -u -k all +reboot +``` + +### 4.6. Проверка после перезагрузки + +```bash +dmesg | grep -i vfio +lspci -k | grep -A3 -i vga +# Должно быть: Kernel driver in use: vfio-pci +``` + +### 4.7. AMD reset-bug (при необходимости) + +Если GPU не перезапускается после shutdown ВМ: + +```bash +apt install git dkms build-essential -y +git clone https://github.com/gnif/vendor-reset.git +cd vendor-reset +echo "vendor-reset" >> /etc/modules +dkms install . +modprobe vendor-reset +``` + +--- + +## 5. Фаза 3 — Создание виртуальных машин + +### 5.1. Создание через CLI (пример VM-101) + +```bash +# Создание VM +qm create 101 --name vm-scada --memory 20480 --cores 6 --sockets 1 \ + --cpu host --machine q35 --bios ovmf --ostype win10 \ + --scsihw virtio-scsi-single --agent enabled=1 \ + --net0 virtio,bridge=vmbr0,firewall=1 + +# EFI disk +qm set 101 --efidisk0 local-zfs:1,efitype=4m,pre-enrolled-keys=0 + +# Системный диск +qm set 101 --scsi0 local-zfs:200,iothread=1,discard=on,ssd=1 + +# CD-ROM с Windows +qm set 101 --ide2 local:iso/Win10_22H2_ru.iso,media=cdrom + +# VirtIO drivers (второй CD) +qm set 101 --ide0 local:iso/virtio-win-0.1.xxxx.iso,media=cdrom + +# USB 3.0 controller +qm set 101 --usb0 xhci=1 + +# Autostart +qm set 101 --onboot 1 + +# Boot order +qm set 101 --boot order=ide2\;scsi0 +``` + +Аналогично для VM-102 и VM-103: + +```bash +qm create 102 --name vm-lers --memory 16384 --cores 4 --sockets 1 \ + --cpu host --machine q35 --bios ovmf --ostype win10 \ + --scsihw virtio-scsi-single --agent enabled=1 \ + --net0 virtio,bridge=vmbr0,firewall=1 +qm set 102 --efidisk0 local-zfs:1,efitype=4m,pre-enrolled-keys=0 +qm set 102 --scsi0 local-zfs:120,iothread=1,discard=on,ssd=1 +qm set 102 --ide2 local:iso/Win10_22H2_ru.iso,media=cdrom +qm set 102 --ide0 local:iso/virtio-win-0.1.xxxx.iso,media=cdrom +qm set 102 --usb0 xhci=1 --onboot 1 +qm set 102 --boot order=ide2\;scsi0 + +qm create 103 --name vm-lifts --memory 16384 --cores 4 --sockets 1 \ + --cpu host --machine q35 --bios ovmf --ostype win10 \ + --scsihw virtio-scsi-single --agent enabled=1 \ + --net0 virtio,bridge=vmbr0,firewall=1 +qm set 103 --efidisk0 local-zfs:1,efitype=4m,pre-enrolled-keys=0 +qm set 103 --scsi0 local-zfs:120,iothread=1,discard=on,ssd=1 +qm set 103 --ide2 local:iso/Win10_22H2_ru.iso,media=cdrom +qm set 103 --ide0 local:iso/virtio-win-0.1.xxxx.iso,media=cdrom +qm set 103 --usb0 xhci=1 --onboot 1 +qm set 103 --boot order=ide2\;scsi0 +``` + +### 5.2. Создание через веб-интерфейс + +Для каждой ВМ (**Create VM**): + +| Вкладка | Параметр | Значение | +|---------|----------|----------| +| General | VM ID | 101 / 102 / 103 | +| General | Name | vm-scada / vm-lers / vm-lifts | +| OS | ISO | Windows 10 | +| System | Machine | q35 | +| System | BIOS | OVMF (UEFI) | +| System | Qemu Agent | ✓ | +| Disks | Bus | SCSI, VirtIO, SSD, Discard | +| CPU | Type | host | +| CPU | Cores | по таблице | +| Memory | Memory | по таблице | +| Network | Model | VirtIO | +| Network | Bridge | vmbr0 | +| Confirm | Start after created | ✗ | + +--- + +## 6. Фаза 4 — Установка Windows 10 + +### 6.1. Установка ОС + +1. Запустить ВМ, открыть Console. +2. При установке Windows на экране выбора диска нажать **Load driver**. +3. Указать драйвер VirtIO SCSI с CD `virtio-win` (папка `vioscsi/w10/amd64`). +4. Установить Windows 10. +5. После первой загрузки установить с CD `virtio-win`: + - `viofs` (опционально) + - `vioserial` + - `Balloon` + - `qxldod` (если используется виртуальный дисплей) + - `NetKVM` (сеть VirtIO) + +### 6.2. Установка QEMU Guest Agent + +С CD `virtio-win`, папка `guest-agent`, запустить `qemu-ga-x86_64.msi`. + +Проверка на хосте Proxmox: + +```bash +qm agent 101 ping +# Expected: no error +``` + +### 6.3. Базовая настройка Windows + +На каждой ВМ: + +```powershell +# Имя компьютера (пример для VM-101) +Rename-Computer -NewName "VM-SCADA" -Restart + +# Статический IP (пример) +New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.168.10.11 -PrefixLength 24 -DefaultGateway 192.168.10.1 +Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.168.10.1 + +# Отключить спящий режим +powercfg /change standby-timeout-ac 0 +powercfg /change hibernate-timeout-ac 0 + +# Отложить автоматические перезагрузки (через gpedit.msc или настройки Update) +``` + +### 6.4. Windows Update + +Рекомендуется: + +- активные часы: 08:00–20:00; +- отложить feature updates на 365 дней; +- отложить quality updates на 30 дней; +- запретить автоматическую перезагрузку в рабочее время. + +--- + +## 7. Фаза 5 — GPU и USB Passthrough (Вариант А) + +### 7.1. Определение PCI-адресов GPU + +```bash +lspci | grep -i vga +# Пример: +# 01:00.0 VGA compatible controller: AMD Radeon RX 550 +# 03:00.0 VGA compatible controller: AMD Radeon RX 550 +# 04:00.0 VGA compatible controller: AMD Radeon RX 550 +``` + +### 7.2. Проброс GPU + +**Через CLI:** + +```bash +# VM-101 — GPU на 01:00 +qm set 101 --hostpci0 01:00,pcie=1,x-vga=1,rombar=1 + +# VM-102 — GPU на 03:00 +qm set 102 --hostpci0 03:00,pcie=1,x-vga=1,rombar=1 + +# VM-103 — GPU на 04:00 +qm set 103 --hostpci0 04:00,pcie=1,x-vga=1,rombar=1 +``` + +**Через веб-интерфейс (Hardware → Add → PCI Device):** + +| Параметр | Значение | +|----------|----------| +| Device | Выбрать GPU | +| All Functions | ✓ | +| ROM-Bar | ✓ | +| PCI-Express | ✓ | +| Primary GPU | ✓ | +| Display | none (убрать виртуальный VGA) | + +Для NVIDIA добавить флаг CPU: + +```bash +qm set 101 --cpu host,hidden=1,flags=+pcid +``` + +### 7.3. Проброс USB-ключа «Меркурия» (VM-101) + +**По Vendor/Device ID (рекомендуется):** + +```bash +# Узнать ID +lsusb | grep -i hasp +# Пример: 0529:0001 + +qm set 101 --usb1 host=0529:0001,usb3=1 +``` + +**Passthrough USB-контроллера (если ключ нестабилен):** + +```bash +# Найти USB controller в IOMMU group +lspci | grep -i usb + +# Пробросить контроллер целиком +qm set 101 --hostpci1 00:14.0,pcie=1 +``` + +> Не подключать USB-ключ через некачественный USB-hub. + +### 7.4. Проброс клавиатуры и мыши + +**Вариант 1 — отдельные USB-устройства (простой):** + +Через GUI: **Hardware → Add → USB Device → Use USB Vendor/Device ID**. + +**Вариант 2 — passthrough USB-контроллера (надёжный):** + +К каждой ВМ привязать отдельный физический USB-контроллер (встроенный или PCIe): + +```bash +# VM-101 — USB controller at 00:14.0 +qm set 101 --hostpci2 0b:00.0,pcie=1 + +# VM-102 — USB controller at 0c:00.0 (PCIe USB card) +qm set 102 --hostpci1 0c:00.0,pcie=1 + +# VM-103 — USB controller at 0d:00.0 (PCIe USB card) +qm set 103 --hostpci1 0d:00.0,pcie=1 +``` + +### 7.5. Установка драйверов GPU в Windows + +1. Запустить VM-101 с passthrough GPU. +2. Изображение установки/рабочего стола должно появиться на **физическом мониторе**, подключённом к GPU-1. +3. Установить драйвер AMD/NVIDIA. +4. Повторить для VM-102 и VM-103. + +### 7.6. NVIDIA Code 43 — устранение + +Если в диспетчере устройств **Code 43**: + +1. Убедиться: `ostype win10`, `cpu host,hidden=1`, `machine q35`, `bios ovmf`. +2. Дамп VBIOS: + +```bash +# На хосте, когда GPU не занят VM +echo 1 > /sys/bus/pci/devices/0000:01:00.0/reset +cat /sys/bus/pci/devices/0000:01:00.0/rom > /tmp/gt1030.rom +``` + +3. Пропатчить ROM ([nvidia-kvm-patcher](https://github.com/sk1080/nvidia-kvm-patcher)). +4. Указать ROM в конфиге: + +```bash +qm set 101 --hostpci0 01:00,pcie=1,x-vga=1,rombar=1,romfile=local:snippets/gt1030.rom +``` + +### 7.7. Проверка passthrough + +```bash +# Перезагрузка хоста +reboot + +# После загрузки — все ВМ должны стартовать автоматически +qm list + +# Проверить USB +qm config 101 | grep usb +qm config 101 | grep hostpci +``` + +**Чек-лист:** + +- [ ] VM-101: картинка на мониторе 1, ключ «Меркурия» виден в Windows +- [ ] VM-102: картинка на мониторе 2 +- [ ] VM-103: картинка на мониторе 3 +- [ ] Каждая КМ управляет только своей ВМ +- [ ] Reboot хоста → все ВМ поднимаются, passthrough сохраняется + +--- + +## 8. Фаза 6 — Настройка RDP (Вариант Б) + +### 8.1. Настройка Windows на каждой ВМ + +```powershell +# Включить Remote Desktop +Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server" -Name "fDenyTSConnections" -Value 0 +Enable-NetFirewallRule -DisplayGroup "Remote Desktop" + +# Разрешить NLA (рекомендуется) +Set-ItemProperty -Path "HKLM:\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1 +``` + +Или: **Параметры → Система → Удалённый рабочий стол → Включить**. + +### 8.2. Создание учётных записей + +| ВМ | Пользователь | Назначение | +|----|-------------|-----------| +| VM-101 | operator_scada | СКАДА + «Меркурий» | +| VM-102 | operator_lers | ЛЭРС | +| VM-103 | operator_lifts | Лифты | + +Добавить пользователей в группу **Remote Desktop Users**. + +### 8.3. USB-ключ на сервере (VM-101) + +```bash +qm set 101 --usb1 host=0529:0001,usb3=1 +``` + +MOXA подключается по сети — настроить виртуальный COM в Windows VM-101 (IP MOXA: `192.168.10.20`). + +### 8.4. Настройка клиентского ПК + +На ПК в комнате диспетчеров создать три `.rdp`-файла: + +**scada.rdp:** + +``` +full address:s:192.168.10.11 +username:s:operator_scada +screen mode id:i:2 +use multimon:i:1 +desktopwidth:i:1920 +desktopheight:i:1080 +session bpp:i:32 +compression:i:1 +networkautodetect:i:1 +``` + +**lers.rdp** — `192.168.10.12`, **lifts.rdp** — `192.168.10.13`. + +Запуск: + +```powershell +# Монитор 1 +mstsc.exe "C:\RDP\scada.rdp" /f + +# Монитор 2 и 3 — запустить аналогично, перетащить окна на нужные мониторы +``` + +### 8.5. Автозапуск RDP-сессий (опционально) + +```powershell +# Поместить ярлыки в shell:startup +Copy-Item "C:\RDP\*.rdp" "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup\" +``` + +### 8.6. Проверка сети + +```powershell +# С клиентского ПК +Test-NetConnection 192.168.10.11 -Port 3389 +Test-NetConnection 192.168.10.12 -Port 3389 +Test-NetConnection 192.168.10.13 -Port 3389 + +# Задержка +ping 192.168.10.11 +# Должно быть < 5 ms +``` + +--- + +## 9. Фаза 7 — Миграция программ + +### 9.1. Метод P2V (перенос образа) + +```bash +# На исходном ПК — Clonezilla → файл образа → скопировать на Proxmox + +# Конвертация и импорт (пример) +qm importdisk 101 /path/to/scada-disk.img local-zfs --format qcow2 +qm set 101 --scsi0 local-zfs:vm-101-disk-0 +``` + +### 9.2. Метод чистой установки + restore (рекомендуется) + +1. Установить Windows 10 на ВМ. +2. Установить СКАДА / ЛЭРС / лифты / «Меркурий» с дистрибутивов. +3. Восстановить базы данных из бэкапов. +4. Перенести конфигурационные файлы проектов. + +### 9.3. Порядок миграции + +| Шаг | Система | VM | Проверка | +|-----|---------|-----|----------| +| 1 | «Меркурий» + USB-ключ | 101 | Ключ определяется, опрос через MOXA | +| 2 | СКАДА | 101 | Архив, тренды, алармы | +| 3 | ЛЭРС | 102 | Отчёты, база данных | +| 4 | Лифты | 103 | Связь с контроллерами, команды | + +### 9.4. Настройка MOXA (до замены) + +На VM-101: + +1. Установить драйвер виртуального COM MOXA NPort. +2. Настроить подключение к IP `192.168.10.20`, порт по документации MOXA. +3. В «Меркурии» указать виртуальный COM-порт. +4. Проверить опрос счётчиков. + +--- + +## 10. Фаза 8 — Reservное копирование + +### 10.1. vzdump через веб-интерфейс + +**Datacenter → Backup → Add:** + +| Параметр | Значение | +|----------|----------| +| Node | pve-scada | +| Storage | NAS / local (с достаточным объёмом) | +| Schedule | Daily 02:00 | +| Selection mode | Include selected VMs | +| VMs | 101, 102, 103 | +| Mode | Snapshot | +| Compression | zstd | +| Retention | Keep last 7 | + +### 10.2. vzdump через CLI + +```bash +# Ручной бэкап +vzdump 101 102 103 --mode snapshot --compress zstd --storage nas-backup + +# Проверка +ls -lh /mnt/pve/nas-backup/dump/ +``` + +### 10.3. Restore из бэkaпа + +```bash +# Список бэкапов +pvesm list nas-backup + +# Восстановление (пример) +qmrestore /mnt/pve/nas-backup/dump/vzdump-qemu-101-*.zst 101 --force +``` + +### 10.4. Бэкапы баз данных + +Дополнительно к vzdump — штатные средства резервного копирования СКАДА и ЛЭРС по расписанию на NAS. + +--- + +## 11. Фаза 9 — Тестирование и ввод в эксплуатацию + +### 11.1. Тестовый чек-лист + +| № | Тест | Ожидаемый результат | ✓ | +|---|------|----------------------|---| +| 1 | СКАДА: сбор архива 24 ч | Данные поступают | | +| 2 | СКАДА: открытие трендов | Без ошибок | | +| 3 | «Меркурий»: опрос счётчиков | Все точки отвечают | | +| 4 | ЛЭРС: формирование отчёта | Корректные данные | | +| 5 | Лифты: команда / статус | Контроллер отвечает | | +| 6 | Reboot VM-102 | VM-101 и VM-103 работают | | +| 7 | Reboot хоста Proxmox | Все 3 VM autostart ≤10 мин | | +| 8 | Restore VM-101 из vzdump | Система работоспособна | | +| 9 | Отключение UPS (тест) | Корректное shutdown | | + +### 11.2. Параллельная эксплуатация + +- Срок: **7–14 дней**. +- Старые ПК остаются включёнными, но не используются оператором. +- При проблемах — откат на старые машины. + +### 11.3. Ввод в эксплуатацию + +1. Отключить старые ПК (хранить 2 недели). +2. Передать документацию оператору и администратору. +3. Зафиксировать дату ввода в журнале. + +--- + +## 12. Устранение неполадок + +### 12.1. GPU passthrough — VM не стартует + +```bash +# Проверить лог +qm start 101 2>&1 | tee /tmp/vm101-start.log +journalctl -u pve-guest@101 --no-pager -n 50 +``` + +Возможные причины: + +- GPU занята хостом → проверить `lspci -k`, должен быть `vfio-pci`. +- IOMMU group содержит лишние устройства → ACS override (крайний случай). +- Нет UEFI ROM → использовать SeaBIOS или пропатченный ROM. + +### 12.2. NVIDIA Code 43 + +- `cpu: host,hidden=1` +- `ostype: win10` +- Пропатченный VBIOS ROM +- `x-vga=1`, Display = none + +### 12.3. USB-ключ не определяется + +```bash +# На хосте — виден ли ключ +lsusb | grep -i "0529\|guardant\|hasp\|rutoken" + +# Проверить конфиг VM +qm config 101 | grep usb + +# Попробовать passthrough USB-контроллера вместо устройства +``` + +### 12.4. HASP — высокая нагрузка CPU + +При USB 2.0 passthrough с HASP dongle: + +- Обновить VirtIO net driver до последней версии. +- Passthrough USB-контроллера целиком. +- Альтернатива: VirtualHere (USB over IP). + +### 12.5. RDP — чёрный экран / обрыв + +- Проверить firewall на VM и между VLAN. +- Отключить Bitmap Cache в RDP-клиенте. +- Проверить `qm agent NNN ping`. + +### 12.6. AMD GPU reset-bug + +После shutdown VM GPU не отдаётся: + +```bash +modprobe vendor-reset +# или reboot хоста +``` + +--- + +## 13. Справочник конфигураций ВМ + +### 13.1. Пример `/etc/pve/qemu-server/101.conf` (Вариант А) + +``` +agent: 1 +bios: ovmf +boot: order=scsi0 +cores: 6 +cpu: host +efidisk0: local-zfs:vm-101-disk-0,efitype=4m,pre-enrolled-keys=0,size=1M +hostpci0: 01:00,pcie=1,x-vga=1,rombar=1 +machine: q35 +memory: 20480 +name: vm-scada +net0: virtio=XX:XX:XX:XX:XX:XX,bridge=vmbr0,firewall=1 +onboot: 1 +ostype: win10 +scsi0: local-zfs:vm-101-disk-1,iothread=1,size=200G,ssd=1 +scsihw: virtio-scsi-single +smbios1: uuid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +usb0: xhci=1 +usb1: host=0529:0001,usb3=1 +vga: none +``` + +### 13.2. Таблица passthrough (заполнить при внедрении) + +| Ресурс | PCI / USB ID | VM | Монитор / назначение | +|--------|-------------|-----|---------------------| +| GPU-1 | 01:00.0 | 101 | Монитор 1 | +| GPU-2 | 03:00.0 | 102 | Монитор 2 | +| GPU-3 | 04:00.0 | 103 | Монитор 3 | +| USB-ключ «Меркурия» | 0529:0001 | 101 | Лицензия | +| USB-контроллер КМ-1 | 0b:00.0 | 101 | Клавиатура/мышь 1 | +| USB-контроллер КМ-2 | 0c:00.0 | 102 | Клавиатура/мышь 2 | +| USB-контроллер КМ-3 | 0d:00.0 | 103 | Клавиатура/мышь 3 | + +### 13.3. Полезные команды + +```bash +# Статус всех VM +qm list + +# Конфиг VM +qm config 101 + +# Консоль VM (VNC, если нет GPU passthrough) +qm terminal 101 + +# Перезапуск VM +qm reboot 101 + +# Shutdown VM +qm shutdown 101 --timeout 120 + +# Guest agent: IP адрес VM +qm guest cmd 101 network-get-interfaces + +# Snapshot перед изменениями +qm snapshot 101 before-passthrough + +# Откат snapshot +qm rollback 101 before-passthrough +``` + +--- + +## Связанные документы + +- [Техническое задание](TZ-proxmox-konsolidaciya.md) +- [Proxmox PCI Passthrough Wiki](https://pve.proxmox.com/wiki/PCI_Passthrough) +- [Proxmox USB Passthrough](https://pve.proxmox.com/wiki/USB_Physical_Port_Mapping) +- [IOMMU Groups Database](https://iommu.info/)