Тема 13

Учения, регламенты, эксплуатационная готовность

Учения, регламенты, эксплуатационная готовность

Предыдущие двенадцать тем курса последовательно выстроили все звенья автономного комплекса: в темах 3–5 был рассчитан суточный энергобаланс, подобрана химия аккумуляторов и спроектирована солнечная генерация; в теме 6 определены принципы компонентного ремонта вычислительной платформы и сформирован запас деталей; темы 7–9 обеспечили программную независимость — локальное зеркало пакетов, офлайн-энциклопедии и стратегию резервного копирования с контролем целостности; темы 10–12 дали средства радиосвязи, локальной меш-сети и электромагнитной защиты вводов. Каждое из этих решений было рассчитано, промоделировано симулятором или проверено в пространстве имён операционной системы.

Однако наличие исправного оборудования и корректных конфигурационных файлов не означает, что система готова к работе в условиях изоляции. Наиболее опасная иллюзия при проектировании автономных систем — убеждение, что закупленный и сложенный на стеллаж комплект железа автоматически решает задачу выживания информационного узла 1. На практике в момент реального обесточивания и обрыва связи выясняется, что пароль от резервного диска хранился в облачном менеджере паролей, шнур с нужным разъёмом питания остался в другом помещении, аккумулятор за полгода хранения без подзаряда деградировал ниже порога срабатывания BMS, а оператор в состоянии стресса и переохлаждения не может вспомнить порядок подъёма локального DNS-сервера.

Эксплуатационная готовность (англ. operational readiness) — это не статическое свойство закупленного оборудования, а непрерывный динамический процесс 2. Комплекс работоспособен ровно настолько, насколько отработаны действия оператора в условиях, максимально приближённых к аварийным. Единственный способ доказать готовность системы — провести натурное учение: физически разомкнуть автоматический выключатель ввода внешней сети, отключить магистральный интернет-кабель и зафиксировать по секундомеру, сколько времени займёт подъём каждого уровня деградации, сколько ватт-часов энергии будет израсходовано и какие скрытые дефекты проявятся в процессе.

Настоящая тема объединяет инженерные решения всех слоёв курса в единый регламент эксплуатации. В ней рассматривается структура документов непрерывности, методика проведения четырёхчасовых комплексных учений, психофизиология человека в условиях депривации и холода, календарный график технического обслуживания и замкнутый контур постоянного улучшения по методике инженерной устойчивости (англ. resilience engineering).

Документы непрерывности и операционная готовность

План непрерывности автономного узла

В корпоративной практике стандартом де-факто для обеспечения выживаемости инфраструктуры является стандарт ISO 22301:2019 3, регламентирующий систему управления непрерывностью бизнеса (англ. Business Continuity Management System, BCMS). В масштабе персонального или полевого автономного узла громоздкие корпоративные регламенты неприменимы, однако заложенный в них принцип сохраняет силу: план обеспечения непрерывности (англ. Business Continuity Plan, BCP) должен отвечать на вопросы «что сохраняем в первую очередь», «кто и что делает при отказе» и «как восстанавливать систему от простого к сложному».

План непрерывности автономного узла представляет собой сжатый документ, связывающий матрицу сценариев (А, Б, В, Г из темы 1) со шкалой уровней деградации (0–4). Он не содержит рассуждений и теоретических выкладок. Его основа — строгая матрица приоритетов и условий перехода:

Уровень деградацииМинимальный состав функционирующих звеньевЦелевое назначениеКритический порог RTOИсточник питания
Уровень 0Шина 12 В, базовая консоль терминала, системный накопительАварийный мониторинг, диагностика, ввод команд15 минутБуферная АКБ LiFePO4
Уровень 1Локальная файловая система, офлайн-документация, ZIM-базыДоступ к инструкциям, схемам, справочникам30 минутБуферная АКБ
Уровень 2Локальная сеть Ethernet/Wi-Fi, локальный DNS (unbound), NTP (chrony), веб-интерфейс KiwixКоллективная работа на площадке, координация1 часБуферная АКБ / СЭС
Уровень 3Служба синхронизации syncthing, репликация хранилищСогласование данных между узлами площадки2 часаСЭС / бензогенератор
Уровень 4Шлюз пакетной радиосвязи (LoRa, APRS, FT8), КВ/УКВ трансиверЭкстренная передача сводок за пределы узла4 часаГенератор / буфер

План непрерывности регламентирует три критических состояния узла:

  1. Переход в автономный режим: последовательность отключения неприоритетных потребителей (инверторы 230 В, внешняя подсветка, фоновые вычислительные задачи) для сохранения емкости накопителя.
  2. Удержание деградированного состояния: минимально допустимый профиль энергопотребления, обеспечивающий заданный срок живучести (например, 72 часа для сценария Б при температуре −20 °C).
  3. Холодный запуск (англ. cold start): пошаговая процедура развертывания узла из полностью обесточенного состояния при разрушенной локальной конфигурации 4.

Одностраничные карточки процедур (SOP)

Самая частая причина провала при ликвидации аварий — невозможность быстро найти нужную информацию в многостраничных руководствах. Когда в помещении гаснет свет, температура падает, а напряжение на шине аккумулятора стремительно снижается, человек физически не способен читать подробные руководства по администрированию Linux или схемы электрических щитов.

Для оперативного управления аварийной ситуацией вводится стандарт одностраничных стандартных операционных процедур (англ. Standard Operating Procedure, SOP) 5. Карточка SOP представляет собой ровно один лист формата А4, содержащий исчерпывающие инструкции для конкретного временного горизонта:

  • Карточка «Первые 15 минут» (SOP-15M): локализация инцидента и выход на Уровень 0. Проверка физической безопасности (запах гари, искрение, залитие), изоляция поврежденных кабельных линий, перевод электропитания на защищенную низковольтную шину 12 В постоянного тока, включение терминала аварийной консоли, замер входного напряжения мультиметром.
  • Карточка «Первый час» (SOP-1H): стабилизация энергобаланса и подъем Уровней 1 и 2. Включение локального хранилища, запуск системных демонов DNS (unbound) и службы точного времени (chrony), проверка локального IP-адреса, запуск локального веб-сервера справочников Kiwix, подтверждение доступа к документации с резервного клиентского устройства.
  • Карточка «Первые сутки» (SOP-24H): переход на долговременный циклический режим. Настройка расписания сеансов радиосвязи (например, 10 минут в начале каждого четного часа), согласование работы зарядных контроллеров MPPT и дизель-генератора, проведение контрольных замеров температуры ячеек АКБ, выполнение инкрементального резервного копирования критических баз данных.
+-----------------------------------------------------------------------+
| КАРТОЧКА SOP-15M: АВАРИЙНЫЙ ПУСК И ВЫХОД НА УРОВЕНЬ 0 (ВЕРСИЯ 2.1)    |
+-----------------------------------------------------------------------+
| 1. БЕЗОПАСНОСТЬ: Убедиться в отсутствии КЗ и запаха гари.             |
|    - Перевести тумблер QS1 (Ввод сети 230 В) в положение «ОТКЛ».       |
| 2. ПИТАНИЕ: Перевести переключатель резерва SA1 в положение «АКБ».    |
|    - Замерить вольтметром напряжение на клеммах контрольной шины ХТ1:  |
|      * НОРМА (LiFePO4 4S): 12,8...13,4 В.                             |
|      * КРИТИЧЕСКИЙ РАЗРЯД: менее 11,8 В -> НЕМЕДЛЕННО ОТКЛЮЧИТЬ ВСЁ.  |
| 3. КОНСОЛЬ: Замкнуть автомат SF2 «Микрокомпьютер узла».               |
|    - Подключить консольный кабель USB-UART к порту ttyUSB0.            |
|    - Запустить терминал: picocom -b 115200 /dev/ttyUSB0                |
| 4. ПРОВЕРКА УРОВНЯ 0:                                                 |
|    - Убедиться в наличии приглашения: "polygon-node login:"           |
|    - Ввести аварийный логин "operator", пароль из пакета N 1.         |
| 5. ТЕЛЕМЕТРИЯ: Зафиксировать в журнале точное время T_start и ток I_0.|
+-----------------------------------------------------------------------+

Требования к исполнению документов при отсутствии системы

Документы оперативного реагирования подчиняются жестким требованиям устойчивости к внешней среде. Если инструкция по восстановлению сервера лежит на диске этого же сервера — системы не существует 1. Документы непрерывности оформляются с учетом следующих правил:

  1. Физическая автономность: все карточки процедур (SOP-15M, SOP-1H, SOP-24H), схемы кабельной разводки, распиновки разъемов, таблицы соответствия предохранителей и аварийные пароли распечатываются на плотной бумаге, ламинируются матовой пленкой (для исключения бликов от налобного фонаря) и хранятся в водонепроницаемом тубусе непосредственно внутри защитного кейса узла.
  2. Бинарность формулировок: в аварийных карточках запрещены фразы «при необходимости», «отрегулируйте оптимально», «попытайтесь настроить». Каждое действие описывается строго бинарно: «Установить переключатель SA2 в положение 1», «Проверить свечение зеленого светодиода HL1: если горит — перейти к шагу 4, если не горит — заменить вставку FU3 на 5 А из ЗИП».
  3. Самодостаточность нотации: в карточках не допускаются ссылки на внешние сетевые ресурсы или команды вида apt install, требующие интернета. Все используемые утилиты, скрипты и конфигурационные файлы приводятся с абсолютными путями в локальной файловой системе (/opt/polygon/bin/healthcheck.sh).

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

Иерархия учений: от разбора за столом к натурному отключению

Регламенты и карточки процедур бесполезны без регулярной практики их отработки. Практика аварийной готовности строится по принципу постепенного усложнения 6:

+--------------------------------------------------------------+
| 3. Полномасштабное натурное учение (Full-Scale Simulation)   |
|    - Физическое отключение сети и питания на 4..24 ч         |
|    - Работа в реальных климатических условиях                |
+------------------------------^-------------------------------+
                               |
+------------------------------+-------------------------------+
| 2. Частное функциональное учение (Functional Drill)          |
|    - Отработка одного звена: пуск ДВС, замена диска, radio   |
|    - Проверка хронометража конкретной карточки SOP           |
+------------------------------^-------------------------------+
                               |
+------------------------------+-------------------------------+
| 1. Кабинетный разбор за столом (Tabletop Exercise)           |
|    - Пошаговая прокрутка сценария на бумаге без воздействия  |
|    - Выявление логических тупиков, отсутствия ЗИП и паролей  |
+--------------------------------------------------------------+

Кабинетный разбор (англ. tabletop exercise) проводится перед любым натурным испытанием. Операторы и проектировщики собираются за столом, вводят случайную вводную из матрицы отказов (например: «Сценарий Б, 03:00 ночи, температура −22 °C, отказ системного SSD основного узла») и пошагово воспроизводят действия по имеющимся документам. На этапе настольного разбора отсеивается до 70 % грубых системных ошибок: обнаруживается, что запасной накопитель не отформатирован, образ восстановления записан на флешку устаревшей версии, а ключ шифрования LUKS утерян.

Только после того, как карточки процедур успешно прошли настольную проверку, узел допускается к натурным учениям.

Четырёхчасовое комплексное учение: почему четыре часа

Базовое натурное учение курса длится 4 часа. Это не физическая константа и не норма стандарта, а длительность сценария А из темы 1: отказ внешней сети и питания при доступной сотовой связи, 4 ч (C-01-01). Учение воспроизводит заданный сценарий целиком, поэтому его длительность берётся из постановки (teacher/polygon.json, сценарий А — 4 ч, C-13-03), а не подбирается так, чтобы «успели проявиться эффекты». Сценарии Б (72 ч) и В (336 ч) учением целиком не проверяются: для них учение даёт измеренный расход за 4 часа, который подставляется в модель energy.py вместо оценки профиля.

Из длительности следует и верхняя граница норматива: последний уровень восстановления (L4, внешняя связь) должен быть достигнут не позднее конца сценария, то есть за 240 мин. Тепловые и электрохимические эффекты, которые проявляются только через несколько часов работы, в четырёхчасовом учении могут и не проявиться; это ограничение учения, а не его обоснование.

Учение начинается с вводной: питание от сети отключается автоматом, внешний сетевой кабель отсоединяется. Оператор действует по карточкам SOP и ведёт журнал событий.

Хронометраж 4-часового комплексного учения Полигона
Контрольные точки уровней L0–L4 и нормативы RTO в пределах сценария А

Метрики эксплуатационной готовности

В ходе учения фиксируются три группы метрик; формат после-учебного отчёта заимствован из HSEEP 6 (раздел «Отчёт и план улучшений»).

1. Время восстановления уровней (фактический RTO). Нормативы курса — одни и те же в теме 13, в протоколе учения и в курсовом проекте (C-13-05):

УровеньЧто считается достигнутымНорматив RTO
L0рабочая консоль, измерено напряжение шины≤ 15 мин
L1прочитан локальный файл со схемой узла≤ 30 мин
L2разрешено имя wiki.polygon.internal, открыта первая страница Kiwix≤ 60 мин
L3синхронизация данных между узлами площадки≤ 120 мин
L4отправлен первый пакет во внешний радиоканал≤ 240 мин

2. Расход энергии. Фактический расход сравнивается с моделью:

\delta_E = \frac{E_{\text{факт}} - E_{\text{модель}}}{E_{\text{модель}}} \cdot 100\,\%

Модель для сценария А — energy.py --profile drill_scenario_a: 68,44 Вт·ч из батареи за 4 ч (C-13-01). Принятые в курсе зоны (C-13-02): |δ_E| ≤ 15 % — норма; 15–30 % — замечание (Minor), разбор обязателен; больше 30 % — существенный дефект (Major): модель узла не описывает реальность, и все расчёты автономии по ней недостоверны. Это условие курса, а не норма стандарта; его смысл — модель с погрешностью больше 15 % уже даёт ошибку автономии сценария Б больше полусуток.

3. Дефекты. Каждое отклонение записывается с категорией:

  • критический (Critical): уровень не может быть достигнут — нет кабеля, пароля, исправного носителя;
  • существенный (Major): уровень достигнут с превышением норматива RTO или |δ_E| > 30 %;
  • незначительный (Minor): неудобство, неточная маркировка, недостающий второстепенный инструмент; сюда же — δ_E в зоне 15–30 %.

Протоколирование и журнал событий

Память в учении не используется: каждое действие фиксируется в журнале с отметкой времени. В П0 журнал ведёт drill_timer.py из окружения ЛР 13; бумажный журнал переносится в него флагом --at.

[00:00:00] [ALERT] Вводная: сеть 230 В отключена, внешний Ethernet разорван.
[00:03:12] [POWER] Нагрузка на батарее, U_bus = 13,28 В.
[00:09:20] [LEVEL] L0: консоль доступна.
[00:21:15] [LEVEL] L1: схема узла прочитана с локального носителя.
[00:41:10] [LEVEL] L2: dig @10.13.0.10 wiki.polygon.internal — ответ получен.
[01:15:00] [FAULT] MAJOR: chrony не принимает время от RTC.
[02:00:00] [RADIO] L4: пакет телеметрии передан (LoRa 868,1 МГц).
[04:00:00] [STOP]  Учение завершено, расход — по журналу power_log.csv.

Журнал — пример формата, а не результат измерения.

Ветка учения для П0: ноутбук на батарее

Читатель без Полигона на железе проводит учение на ноутбуке: ноутбук отключается от сети и 4 часа работает от своей батареи, выполняя карточки SOP над учебным узлом из node_up.sh (каталог с конфигурацией DNS, времени, документацией и архивом). Расход измеряется контроллером батареи ноутбука: ядро Linux публикует energy_now (мкВт·ч) или charge_now (мкА·ч) и voltage_now в /sys/class/power_supply/BAT*/, а upower -d показывает те же величины. Скрипт power_log.py record опрашивает их с заданным периодом и пишет CSV; power_log.py analyze считает расход двумя способами — по счётчику энергии и интегрированием мгновенной мощности.

Погрешность такого измерения оценивается явно. Дискретность счётчика контроллера (у многих ноутбуков — десятки мВт·ч) даёт ошибку в пределах одного-двух шагов. Интервал опроса добавляет ошибку интеграла мощности, если нагрузка меняется быстрее опроса; расхождение двух способов — оценка этой ошибки. Абсолютная калибровка контроллера неизвестна, поэтому результат П0 — расход ноутбука в тех же условиях от учения к учению, а не точная энергия. Для сравнения с моделью узла Полигона в окружении есть синтетический журнал ваттметра sample_power_log.csv: по нему расход за 4 ч — 72,05 Вт·ч, а δ_E относительно модели — +5,3 % (C-13-06, C-13-07). Журнал построен не моделью energy.py: в нём есть два неучтённых потребителя, которые нужно найти по почасовому расходу (ЛР 13).

Человеческий фактор и психология изоляции

Когнитивные искажения и физиология стресса

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

Под воздействием острой стрессовой реакции происходит активация симпатоадреналовой системы. Это влечет за собой конкретные физиологические эффекты, напрямую влияющие на работу с техникой:

  • Сужение поля зрения (туннельное зрение): оператор концентрируется на одной частной проблеме (например, не мигает индикатор на сетевой карте) и полностью упускает из виду общее состояние системы (например, то, что напряжение на аккумуляторе упало ниже 11 В).
  • Сужение рабочей памяти: под стрессом человек хуже удерживает длинные последовательности действий 8. Отсюда требование к карточкам: каждая команда выписана целиком и копируется, а не собирается по памяти; длинный конвейер из awk, sed и nft в карточку не попадает — его заменяет проверенный скрипт.
  • Тремор и ухудшение мелкой моторики: на холоде или при выбросе адреналина точность движений пальцев резко падает. Вставить micro-SIM карту в щелевой разъем или припаять оторвавшийся SMD-диод становится практически невыполнимой задачей. Отсюда следует фундаментальное требование к конструкции узла: никаких мелких разъемов и винтов под шлиц 1,5 мм на аварийных узлах коммутации; только надежные винтовые клеммники под стандартную отвертку PH2 или рычажные зажимы WAGO.

Героизм как признак плохого проекта

В популярной культуре преодоление аварий ассоциируется с подвигом: оператор, не спавший двое суток, на морозе голыми руками перебирает генератор и спасает узел от отключения. В системной инженерии и теории устойчивости (resilience engineering) героизм однозначно классифицируется как дефект проектирования 19.

Если для нормального функционирования системы в нештатной ситуации требуется самопожертвование, бессонная ночь или гениальная догадка конкретного специалиста — архитектура системы порочна. Это означает следующее:

  • В системе не были предусмотрены автоматические защиты от разряда (LVD);
  • Отсутствовали понятные пошаговые инструкции, рассчитанные на человека в полубессознательном состоянии;
  • Время автономного удержания было рассчитано впритык без запаса на ошибку;
  • Допущена единая точка отказа в лице единственного носителя ключевых знаний (SPOF-человек).

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

Организация сменности и гигиена сна

В сценариях длительной изоляции (сценарии Б и В длительностью от 3 суток до 2 недель) критическим фактором становится график дежурств. Длительное бодрствование и недосып снижают скорость реакции и повышают вероятность ошибки 8; количественные оценки зависят от исследования и задачи, и курс их не приводит. Для проекта существенно другое: график дежурств — это проектное решение, которое записывается в план непрерывности и проверяется учением, а не оставляется на усмотрение дежурного.

Для автономного узла с постоянным дежурством устанавливаются правила гигиены труда:

  1. График смен. В курсовом проекте график задаётся как условие варианта; в примерах курса для двух операторов принята схема 6/6 (смена 6 часов, отдых 6 часов). Это условие задачи, а не норма: её пригодность проверяется по журналу учения — растёт ли к концу смены время выполнения одинаковых карточек.
  2. Место для сна — в тёмном отапливаемом объёме вне помещения генератора; дежурство «вполглаза» в шуме не считается отдыхом в графике.
  3. Формализованная передача смены: заступающий оператор принимает узел по чек-листу приема-передачи (англ. handover checklist):
    • Фактическое напряжение на шине АКБ и текущий ток потребления;
    • Запас топлива в баке и расходных канистрах;
    • Наличие непрочитанных сообщений в очередях пакетного радиообмена;
    • Отметки в журнале ТО о выполненных операциях за прошедшую смену.
  4. Принцип четырех глаз (англ. four-eyes principle): любые необратимые деструктивные операции (ручная коммутация силовых силовых кабелей напряжением свыше 48 В, переключение полярности зарядных устройств, стирание или форматирование разделов на резервных накопителях) выполняются только при перекрестном контроле второго человека, даже если один из них имеет наивысшую квалификацию.

Регламент технического обслуживания и инвентарный учет

Календарь регламентных работ

Любая автономная система, оставленная без регулярного профилактического обслуживания, непрерывно деградирует. Конденсаторы в блоках питания теряют емкость из-за высыхания электролита, контакты реле окисляются, ячейки аккумуляторов теряют баланс по напряжению, моторное масло в резервном генераторе расслаивается и окисляется, а файлы на flash-накопителях подвергаются утечке заряда в плавающих затворах (англ. data retention failure) 10.

Для предотвращения «тихих» отказов вводится календарный регламент технического обслуживания (ТО) с разделением на четыре интервала:

Календарь регламентного обслуживания автономного узла
Периодичность регламентных процедур по ключевым подсистемам: энергия, данные, радио, защита

Еженедельное ТО (регламентное время: 15 минут)

  • Измерение напряжения разомкнутой цепи (НРЦ) аккумуляторного блока;
  • Визуальный контроль отсутствия вздутий ячеек LiFePO4 и потеков электролита;
  • Проверка доступного свободного места на системных и резервных накопителях (df -h);
  • Анализ журналов ядра на предмет появления дисковых ошибок I/O (dmesg | grep -iE 'error|ata|nvme').

Ежемесячное ТО (регламентное время: 1 час)

  • Измерение эквивалентного последовательного сопротивления (ESR) аккумулятора методом двух нагрузок (тема 4);
  • Контроль баланса ячеек сборки через интерфейс BMS: разбег напряжений не должен превышать 15 мВ в заряженном состоянии;
  • Тестовый холодный пуск бензинового генератора: работа на холостом ходу 5 минут, затем под активной нагрузкой 500 Вт в течение 15 минут;
  • Тестовая выборочная проверка чтения случайного архива резервной копии restic.

Ежеквартальное ТО (регламентное время: 3 часа)

  • Полная верификация целостности архивов и томов восстановления с помощью утилиты par2 (par2 verify *.par2);
  • Измерение коэффициента стоячей волны (КСВ) всех подключенных антенно-фидерных трактов портативным анализатором или встроенным измерителем трансивера (норма: КСВ ≤ 1,5 на рабочих частотах);
  • Протяжка винтовых силовых клемм динамометрической отверткой с нормированным усилием (для предотвращения ослабления контакта из-за температурных колебаний);
  • Проверка срабатывания и целостности варисторов, TVS-диодов и газовых разрядников в щите защиты вводов (тема 12).

Ежегодное ТО (сезонная консервация/расконсервация, регламентное время: 1–2 дня)

  • Контрольный цикл разряда-заряда АКБ стабилизированным током 0,2C до напряжения отсечки (10,0 В для 12-вольтовой LFP-сборки) на разрядном стенде для измерения фактической остаточной емкости в ампер-часах;
  • Замена моторного масла и свечи зажигания в генераторе независимо от наработки в моточасах;
  • Ротация запасов топлива: слив старого бензина в транспортное средство, заливка свежего топлива с добавлением стабилизатора углеводородов;
  • Синхронизация и полное обновление локальных зеркал репозиториев (Debian/Ubuntu), скачивание актуальных дампов Wikipedia/Kiwix в формате ZIM;
  • Проведение комплексного 4-часового учения с полным обесточиванием.

Ревизия химических источников тока

Химический источник тока — наиболее дорогой, тяжелый и уязвимый элемент автономного узла. В теме 4 было доказано, что для литий-железо-фосфатных аккумуляторов (LiFePO4) напряжение разомкнутой цепи практически не зависит от степени заряда (SoC) в диапазоне от 20 % до 80 % (напряжение держится на уровне 3,25–3,30 В на ячейку).

Поэтому регулярный контроль состояния батареи не может ограничиваться измерением напряжения вольтметром. В регламент ТО закладывается измерение внутреннего сопротивления ячеек R_int методом двух нагрузок:

R_{\text{int}} = \frac{U_1 - U_2}{I_2 - I_1} \quad [\text{Ом}]

Абсолютное значение внутреннего сопротивления берётся из паспорта конкретной ячейки, а главное — из собственного первого замера новой сборки при известной температуре: он записывается в журнал обслуживания как эталон. Критерий — рост относительно эталона при той же температуре и тех же нагрузках; производители и справочники связывают рост сопротивления со старением ячейки 10, а порог, при котором батарею выводят из эксплуатации, задаётся паспортом или собственным критерием проекта, если паспорт его не даёт. Батарея с повышенным сопротивлением будет вызывать аварийное отключение инвертора по просадке напряжения при кратковременных пусковых токах.

Верификация резервных копий и данных

Резервная копия, восстановление из которой не проверялось, не может считаться рабочей (тема 9). Проверка восстановления и журнал её результатов — такие же записи журнала обслуживания, как замер батареи; требования к журналам как к доказательству — в 11. Хранение данных на автономном узле подвержено специфическим рискам:

  • «Битовая гниль» (англ. bit rot): деградация диэлектрика в ячейках NAND flash или размагничивание доменов HDD;
  • Ошибки оператора при ручном копировании;
  • Повреждение метаданных файловых систем при аварийных отключениях питания.

Регламент ТО требует не просто проверки успешности завершения скрипта бэкапа (exit code 0), а сквозной верификации. Используется двухуровневая схема защиты:

  1. Контроль избыточности через PAR2 (Parchive): для каждого критического архива создаются файлы контрольных блоков с избыточностью 10–15 %:
    par2create -r10 -n1 /backup/archive_2026_10.tar.gz
    
    В ходе квартального ТО запускается процедура верификации:
    par2verify /backup/archive_2026_10.tar.gz.par2
    
    В случае повреждения секторов носителя утилита автоматически восстанавливает исходный файл без обращения к сетевым источникам.
  2. Тестовое развертывание в чистую среду: раз в полгода резервный образ системного диска разворачивается в изолированную виртуальную машину QEMU/KVM скриптом, не имеющим доступа к рабочей сети. Считается подтвержденным только тот бэкап, из которого виртуальная машина успешно загрузилась до приглашения авторизации и отдала тестовый HTTP-запрос к локальной базе данных.

Инвентарный журнал узла

Все изменения аппаратной конфигурации, результаты замеров, ремонты и инциденты фиксируются в едином физическом документе — Инвентарном журнале узла (англ. site logbook).

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

Типовая структура записи в журнале ТО:

Дата/Время: 2026-11-15 10:30 UTC
Вид ТО: Ежемесячное регламентное обслуживание.
Оператор: Смирнов А. В.
1. АКБ сборка 4S LiFePO4 100 А·ч:
   U_нрц = 13.25 В. Баланс ячеек: [3.312, 3.315, 3.310, 3.314] В (дельта = 5 мВ).
   Замер ESR (нагрузки R1=2.0 Ом, R2=0.5 Ом): R_int = 2.4 мОм на сборку. Норма.
2. Генератор Huter DY3000L:
   Пуск со 2-й попытки (ручной стартер). Время прогрева 3 мин.
   Напряжение под нагрузкой 1.2 кВт (ТЭН) = 224 В, частота 50.8 Гц.
   Уровень масла в норме. Наработка: +0.4 моточаса (всего: 42.6 м/ч).
3. Верификация данных:
   restic check --read-data-subset=10%: SUCCESS. Ошибок нет.
Замечания/ЗИП: требуется пополнить запас моторного масла SAE 10W-30 (остаток 0.5 л).
Подпись: [подпись]

Цикл постоянного улучшения и анализ инцидентов

Анализ инцидентов без поиска виноватых (Blameless Postmortem)

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

Если человек совершил ошибку (например, подключил аккумулятор с переполюсовкой или удалил рабочий конфигурационный файл), наказание оператора приводит лишь к тому, что в следующий раз сбои будут скрываться до серьёзных последствий. Культура открытого разбора (англ. blameless postmortem), сформулированная в концепции Just Culture (Деккер 13, Оллспоу 12), базируется на следующих постулатах:

  • Человек принципиально несовершенен, подвержен усталости и стрессу;
  • Ошибка оператора — это не первопричина аварии, а симптом плохой конструкции системы;
  • Если кабель можно воткнуть с неправильной полярностью — инженер обязан был применить ключ на разъеме (например, разъем Anderson Powerpole с механической блокировкой переполюсовки);
  • Если критический файл можно случайно удалить одной командой rm — система обязана иметь права доступа только для чтения или механизм снапшотов файловой системы.

Цель разбора учения — понять, какие свойства среды, документации или конструкции оборудования подтолкнули оператора к неверному действию, и изменить конструкцию так, чтобы повторение ошибки стало физически невозможным.

Методология анализа первопричин: диаграмма Исикавы и метод «Пяти почему»

Для поиска глубинных системных корней сбоя применяется техника «Пяти почему» (англ. Five Whys) 14. Рассмотрим реальный пример анализа сбоя, произошедшего в ходе учебного развертывания:

Проблема: Во время 4-часового учения автономный узел не смог поднять Уровень 2 в отведенный 1 час (RTO превышен на 45 минут) из-за падения DNS-сервера unbound.

  1. Почему упал unbound? — При старте сервис сообщил об ошибке разбора конфигурационного файла /etc/unbound/unbound.conf.
  2. Почему файл конфигурации оказался некорректным? — В нем была указана директива перенаправления запросов к вышестоящему DNS-серверу 1.1.1.1, который был недоступен из-за физического отключения интернета, а локальная зона не была объявлена авторитарной (auth-zone).
  3. Почему файл содержал внешние адреса в автономной системе? — Конфигурация была скопирована из лабораторного стенда с доступом в интернет за два дня до учения без предварительного тестирования в изолированном окружении.
  4. Почему непроверенная конфигурация попала на боевой узел? — В регламенте подготовки к учению отсутствовал шаг предварительной верификации манифеста профиля узла скриптом валидации.
  5. Почему отсутствовал шаг валидации? — Разработчик профиля посчитал синтаксическую проверку unbound-checkconf достаточной и не учел, что синтаксически корректный конфиг может содержать фатальные скрытые зависимости от внешних сетевых сервисов.

Системное исправление: В репозиторий автономного профиля добавлен обязательный pre-commit хук, запускающий тестовый контейнер в сетевом пространстве имен unshare -n без шлюза по умолчанию и проверяющий разрешение локальных имен при полностью изолированной петле обратной связи. Наказывать оператора или автора конфига бессмысленно — внедрен технический барьер, исключающий человеческую забывчивость.

После-учебный отчёт и план улучшений

HSEEP 6 — американская методика организации учений — завершает каждое учение двумя документами: после-учебным отчётом (англ. after-action report, AAR) и планом улучшений (англ. improvement plan, IP) (C-13-10). Курс берёт эту пару без бюрократической части. AAR содержит: цель и сценарий учения; метрики (RTO по уровням, δ_E, дефекты по категориям); что сработало; что не сработало и почему (разбор без поиска виноватых, в практике эксплуатации — postmortem 7). IP — таблица мер: дефект, мера, ответственный, срок, критерий закрытия. Мера считается закрытой только после проверки в следующем учении. drill_timer.py --export-report формирует протокол с разделом AAR/IP по журналу событий.

Динамика метрик от учения к учению

Одно учение показывает состояние; ряд учений показывает, улучшается ли система. Метрики каждого учения сводятся в трендовую таблицу:

№ДатаСценарийL0, минL1, минL2, минL3, минL4, минδ_E, %CriticalMajorMinorОткрытые меры IP
12026-03-14А12,541,096,0——24,11247
22026-06-13А9,027,571,0150,0—13,80235
32026-09-12А7,522,052,0104,0231,09,60133

Таблица — учебный пример (trend_example.csv в окружении ЛР 13), а не результат реальных учений. Критерий «система улучшается», принятый в курсе: в последнем учении нет критических дефектов; ни один RTO не ухудшился относительно предыдущего учения, а превышения норматива сокращаются; число существенных дефектов не растёт; |δ_E| не растёт; число открытых мер IP не растёт. Для примера все пять условий выполнены, и drill_trend.py выдаёт вердикт «улучшается», а L2 последнего учения — 52 мин при нормативе 60 (C-13-08). Критерий нарочно строгий: одно ухудшение отменяет вердикт и требует разбора.

Динамика метрик готовности по трём учениям
RTO уровней L0–L4 и δ_E по трём учениям: превышения нормативов сокращаются, к третьему учению достигнут L4

Ротация ролей

Учение проверяет не только систему, но и то, что её может восстановить любой член команды. Поэтому роли — руководитель учения (вносит вводные и скрытые дефекты), оператор (действует по карточкам), наблюдатель (ведёт журнал и хронометраж) — меняются от учения к учению по кругу. Если RTO растёт, когда оператором становится другой человек, дефект не в человеке, а в карточке: она опирается на знание, которого в ней нет. Ротация — прямое средство против «человека — единой точки отказа» из подраздела о героизме. drill_timer.py --roles записывает распределение ролей в протокол, чтобы тренд можно было разложить по составу смены.

Замкнутый контур устойчивости: предвидеть — отслеживать — реагировать — учиться

Концепция инженерной устойчивости (resilience engineering) Эрика Холлнагеля 2 описывает систему как замкнутый кибернетический контур из четырех способностей:

Цикл эксплуатационной готовности и устойчивости
Четыре фазы адаптивного контура Холлнагеля: постоянная обратная связь между опытом аварий и проектированием
  1. Предвидеть (Anticipate): анализ потенциальных угроз до их возникновения. Разработка матрицы сценариев, расчет профилей энергопотребления в energy.py, моделирование скин-эффекта и бюджета радиолиний.
  2. Отслеживать (Monitor): непрерывный сбор фактов о текущем состоянии. Датчики напряжения, тока, температуры, демоны мониторинга дисков и сервисов, регулярные записи в журнале ТО. Отслеживание фиксирует приближение к границам устойчивости до отказа.
  3. Реагировать (Respond): активация формализованных процедур в момент возмущения. Переход на аварийное питание, развертывание по карточкам SOP, локализация дефектов.
  4. Учиться (Learn): преобразование опыта реальных инцидентов и плановых комплексных учений в изменения проектных моделей, аппаратной компоновки и регламентов.

Система, лишённая контура «Учиться», повторяет один и тот же сценарий аварии.

Числовой пример: энергобаланс четырёхчасового учения

Разберём до последней цифры расход энергии в учении по сценарию А для узла Полигона и сравним его с журналом ваттметра.

Исходные параметры

Батарея Полигона — LiFePO4 100 А·ч × 12,8 В, DoD 0,8, полезная энергия 1024 Вт·ч (teacher/polygon.json). Потребители питаются от шины 12 В через преобразователи с КПД 0,90. Внешней генерации во время учения нет. Профиль нагрузки учения — файл teacher/sim/profiles/drill_scenario_a.csv с шагом 1 минута:

  • базовый режим, все 4 часа: микрокомпьютер 6,5 Вт, коммутатор 2,5 Вт, приём LoRa 0,3 Вт, индикация 0,7 Вт — итого 10,0 Вт со стороны потребителей;
  • первые 15 минут каждого часа добавляются накопитель SSD 2,5 Вт, поиск в Kiwix 8,0 Вт и передатчик 11,1 Вт — итого +21,6 Вт.

Мощности потребителей — оценки профиля для примера, а не измерения; в проекте их заменяют замеры ЛР 3.

Расчёт по модели

Энергия со стороны потребителей: 10,0 Вт · 4 ч + 21,6 Вт · 1 ч = 40,0 + 21,6 = 61,6 Вт·ч (C-13-04). Из батареи с учётом КПД преобразователей: 61,6/0,90 = 68,44 Вт·ч (C-13-01). Тот же результат даёт модель:

python3 teacher/sim/energy.py --profile drill_scenario_a --scenario А --eta-discharge 0.9 --json
{"hours": 4.0, ..., "load_wh": 61.6, ..., "battery_out_wh": 68.44, ..., "end_soc": 0.9332, ...}

К концу учения батарея сохраняет 93,3 % полезной энергии (C-13-09): 1 − 68,44/1024 = 0,9332. Учение сценария А, таким образом, почти не расходует запас, и его ценность — в измерении профиля и времени восстановления, а не в проверке ёмкости.

Сравнение с журналом и разбор расхождения

Журнал sample_power_log.csv в окружении ЛР 13 — синтетический: он имитирует ваттметр на шине Полигона и построен не моделью energy.py, а отдельным генератором с двумя потребителями, которых в профиле нет. Расход по счётчику — 72,05 Вт·ч, по интегралу мгновенной мощности — 72,22 Вт·ч; расхождение способов 0,17 Вт·ч при шаге счётчика 0,05 Вт·ч (C-13-06).

Отклонение от модели: (72,05 − 68,44)/68,44 · 100 % = +5,3 % (C-13-07) — в зоне нормы. Норма не означает «объяснять нечего»: 3,61 Вт·ч расхождения должны быть разложены на причины полностью. Почасовой расход (17,55; 17,50; 18,50; 18,50 Вт·ч) показывает ступеньку +1,0 Вт·ч в час начиная с третьего часа — потребитель мощностью 1,0 Вт, включившийся через 2 ч (2,0 Вт·ч). Оставшиеся 3,61 − 2,0 = 1,61 Вт·ч равномерно распределены по 4 часам — это постоянный потребитель около 0,4 Вт (1,6 Вт·ч). Сумма 2,0 + 1,6 = 3,6 Вт·ч объясняет расхождение в пределах дискретности счётчика. В ЛР 13 этот разбор выполняется по журналу, а ответ сверяется с генератором после заполнения журнала работы.

Если бы расход измерялся реальным ваттметром, запись в реестре имела бы класс «измерено» с указанием прибора, погрешности и условий, а при невозможности повторить — пометку «измерение автора, не проверено». Синтетический журнал такой пометки не требует, но обязан быть назван синтетическим.

Что эта модель не учитывает

  1. Профиль — оценка. Мощности потребителей в drill_scenario_a.csv заданы, а не измерены; температурная зависимость потребления не моделируется. Следствие: первое учение почти всегда даёт расхождение, и его разбор уточняет профиль.
  2. Только сценарий А. Учение 4 ч не проверяет многосуточные эффекты сценариев Б и В: саморазряд, холод, деградацию батареи. Следствие: автономия Б и В по-прежнему рассчитывается моделью, учение лишь уточняет её вход.
  3. Человек. Метрики RTO зависят от состава и усталости смены; одно учение не отделяет свойство системы от свойства оператора. Следствие: выводы делаются по тренду нескольких учений с ротацией ролей.
  4. Контроллер батареи ноутбука в П0 не калиброван. Следствие: в ветке П0 сравниваются учения между собой, а не с моделью узла Полигона.

Итоги темы

Готовность автономного узла подтверждается не составом оборудования, а учением по заданному сценарию с измеренными метриками. План непрерывности связывает сценарии темы 1 с уровнями деградации L0–L4 и их нормативами RTO (15, 30, 60, 120 и 240 мин); карточки SOP на 15 минут, час и сутки — интерфейс между системой и уставшим человеком без сети, поэтому они бумажные, одностраничные и не содержат внешних зависимостей.

Четырёхчасовое учение воспроизводит сценарий А целиком: его длительность — условие задачи, а не физическая константа. Учение измеряет три вещи: время восстановления каждого уровня, расход энергии относительно модели energy.py и число дефектов по категориям. Расхождение расхода в пределах 15 % — норма, но и оно разбирается до конца: в числовом примере 3,6 Вт·ч расхождения полностью разложены на два неучтённых потребителя. В ветке П0 то же учение проводится на ноутбуке с батареей, а расход берётся из /sys/class/power_supply с явной оценкой погрешности.

Человеческий фактор учитывается конструкцией: команды в карточках выписаны целиком, график смен — проектное решение, роли в учении меняются по кругу. Героизм оператора — признак дефекта проекта, а единственный носитель знания — единая точка отказа.

Учение заканчивается отчётом AAR и планом улучшений IP, мера закрывается только проверкой в следующем учении. Ряд учений сводится в трендовую таблицу, и система считается улучшающейся, только если не ухудшилась ни одна метрика. Календарь обслуживания и журнал узла поддерживают состояние между учениями: эталонные замеры батареи, проверка восстановления данных, ревизия защиты вводов. Вместе они замыкают цикл «предвидеть — отслеживать — реагировать — учиться».

Литература

  1. Hollnagel E. Safety-I and Safety-II: The Past and Future of Safety Management. — Ashgate, 2014.
  2. Hollnagel E., Woods D. D., Leveson N. Resilience Engineering: Concepts and Precepts. — Ashgate, 2006.
  3. ISO 22301:2019. Security and resilience — Business continuity management systems — Requirements. — ISO, 2019.
  4. NIST Special Publication 800-34 Rev. 1. Contingency Planning Guide for Federal Information Systems. — NIST, 2010.
  5. NASA SP-2016-6105 Rev 2. NASA Systems Engineering Handbook. — NASA, 2016.
  6. Homeland Security Exercise and Evaluation Program (HSEEP). — FEMA, 2020.
  7. Beyer B., Jones C., Petoff J., Murphy N. R. (eds.) Site Reliability Engineering: How Google Runs Production Systems. — O'Reilly, 2016.
  8. Reason J. Human Error. — Cambridge University Press, 1990.
  9. Dekker S. The Field Guide to Understanding 'Human Error'. — Ashgate, 2014.
  10. Linden D., Reddy T. B. Handbook of Batteries. 3rd ed. — McGraw-Hill, 2002.
  11. Chuvakin A., Schmidt K., Phillips C. Logging and Log Management: The Authoritative Guide to Understanding the Concepts Surrounding Logging and Log Management. — Syngress, 2012.
  12. Allspaw J. Blameless PostMortems and a Just Culture. — Code as Craft, Etsy, 2012. https://codeascraft.com/2012/05/22/blameless-postmortems/
  13. Dekker S. Just Culture: Balancing Safety and Accountability. 3rd ed. — CRC Press, 2016.
  14. Ohno T. Toyota Production System: Beyond Large-Scale Production. — Productivity Press, 1988.