Rescue/Deploy/system-restore/Interaction

Материал из ALT Linux Wiki

Взаимодействие с фронтэндом

Данный раздел предназначен для разработчиков дистрибутива (модулей Альтератора). Если вы к ним не относитесь, можете его смело пропустить. Программа system-restore может выступать в роли готового бэкенда и взаимодействовать с соответствующим фронтэндом или вашими скриптами, которые будут сами организовывать диалоги и вывод происходящего.

Список накопителей, подходящих в качестве целевых (вывод для скриптов):

# system-restore -Tq
/dev/sda
/dev/sdc

То же самое в формате JSON:

# system-restore -Tj |jq
[
  "/dev/sda",
  "/dev/sdc"
]

Показать намерения при развёртывании на диск /dev/sdc:

# system-restore -ID /dev/sdc
ALT Linux Deployment System started [STICK-v1.9]
Checking the backup metadata...

Action type: DEPLOYMENT
Computer:    animal-123456
System time: 2026-03-29 05:06 UTC
Partitioner: lvm2 (GUID/GPT)
Target disk: /dev/sdc (21.47 GB QEMU HARDDISK QM00015 2.5+)
Boot mode:   UEFI + Legacy/CSM
Hypervisor:  Yes (KVM)
ESP size:    100M (/dev/sdc1)
BBP size:    1M (/dev/sdc2)
SWAP size:   2G (/dev/mapper/alt-swap)
ROOT size:   10G (/dev/mapper/alt-root)
DATA size:   * (/dev/mapper/alt-data)

То же самое в формате JSON:

# system-restore -IDj /dev/sdc |jq
{
  "PID": 4706,
  "Action": "deploy",
  "Computer": "animal-123456",
  "SysTime": "2026-03-29 05:04 UTC",
  "Partitioner": "lvm2",
  "PtScheme": "GUID/GPT",
  "Target": "/dev/sdc",
  "DiskInfo": "21.47 GB QEMU HARDDISK QM00015 2.5+",
  "BootMode": "UEFI + Legacy/CSM",
  "Hypervisor": "KVM",
  "ESP_part": "/dev/sdc1",
  "ESP_size": 104857600,
  "BBP_part": "/dev/sdc2",
  "BBP_size": 1048576,
  "SWAP_part": "/dev/mapper/alt-swap",
  "SWAP_size": 2147483648,
  "ROOT_part": "/dev/mapper/alt-root",
  "ROOT_size": 10737418240,
  "DATA_mntp": "/home",
  "DATA_part": "/dev/mapper/alt-data",
  "DATA_size": 0,
  "UsePCIbus": true,
  "Instance": false,
  "Release": "1.9",
  "Protocol": "file",
  "FinalAction": "none"
}

Перечисленное выше, вкупе с обнулением параметра choose_target, позволяет избавиться от нежелательного диалога в консоли и организовать собственные диалоги, чтобы получить все недостающие параметры развёртывания перед запуском длинного процесса.

Ниже показан механизм получения данных от system-restore в процессе работы при организации взаимодействия с неким гипотетическим фронтэндом через PIPE (FIFO), назовём его условно «Альтератор 3.0». В первом терминале набираем:

# mkfifo -m 600 /tmp/test1.fifo
# while :; do read -r str < /tmp/test1.fifo; echo "$str"; [ "${str:0:4}" != 'E: #' ] && [ "$str" != 'I: Done.' ] || break; done

Здесь мы создали PIPE и ждём появления данных в канале. При появлении данных, мы их выводим их в консоль и проверяем маркеры окончания процесса. При появлении маркера, завершаем работу. Во втором терминале набираем:

# cd /mnt/autorun/
# system-restore -M -l /tmp/check.log -f /tmp/test1.fifo
ALT Linux Deployment System started [STICK-v1.9]
Checking the backup metadata...
Validating backup images...
- 'esp.tgz'...
- esp.tgz=eb27daa66e62347105f2483932ccf263210701073e2e465845a02a86e2d291fa OK
- 'root.tgz'...
- root.tgz=ee28e86adabdb2c409a4442e7d42cabc51a28d56d73395b73e932f67fdc87fe0 OK
Backup images validated successfully!

А это появится на первом терминале:

I: Checking the backup metadata...
I: Validating backup images...
I: - 'esp.tgz'...
I: %[
%: 100
I: %]
I: - 'root.tgz'...
I: %[
%: 50
%: 99
%: 100
I: %]
I: Backup images validated successfully!
I: Done.

Теперь можно удалить PIPE, т.к. сеанс взаимодействия завершён:

# rm -f /tmp/test1.fifo

Если добавить параметр -q в команду, набранную во втором терминале, то в консоли никакого вывода вообще не будет, в этом случае весь вывод осуществляется только во frontend через PIPE, а также в журнал. Если посмотреть журнал:

# cat /tmp/check.log
[2026-03-29 04:03:35] Checking the backup metadata...
[2026-03-29 04:03:35] Validating backup images...
[2026-03-29 04:03:35] - 'esp.tgz'...
[2026-03-29 04:03:35] - 'root.tgz'...
[2026-03-29 04:03:37] Backup images validated successfully!

При отладке используем переменную окружения SYSREST_DEBUG:

SYSREST_DEBUG=1 system-restore -M -l /tmp/check.log -f /tmp/test1.fifo

Теперь PIPE в первом терминале будет примерно таким:

D: Using frontend's pipe: /tmp/test1.fifo
D: Started with arguments: -M -l /tmp/check.log -f /tmp/test1.fifo
R: mktemp -dt -- system-restore-XXXXXXXX.tmp
R: stat -c %d /etc
R: stat -c %d -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
R: mount -t tmpfs -o nodev,noexec,nosuid none /tmp/.private/root/system-restore-2ASB5Qqb.tmp
R: chmod 0700 /tmp/.private/root/system-restore-2ASB5Qqb.tmp
D: Using user-defined configuration: 'sysrest.ini'...
D: Entering the hook 'profile_not_found'...
D: Leaving the hook 'profile_not_found'...
D: Entering the hook 'select_profile'...
D: Leaving the hook 'select_profile'...
D: Entering the hook 'check_hardware'...
D: Leaving the hook 'check_hardware'...
I: Checking the backup metadata...
R: cat -- /mnt/autorun/META.tgz
R: unpigz -qnc
R: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ARCH
R: uname -m
R: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ORGHOST
R: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/esp.uuid
R: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/swap.uuid
R: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/root.uuid
I: Validating backup images...
I: - 'esp.tgz'...
R: stat -L --printf=%s -- /mnt/autorun/esp.tgz
R: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ERROR
I: %[
R: cat -- /mnt/autorun/esp.tgz
%: 100
I: %]
D: Expected: eb27daa66e62347105f2483932ccf263210701073e2e465845a02a86e2d291fa
D: Has got:  eb27daa66e62347105f2483932ccf263210701073e2e465845a02a86e2d291fa
R: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/testsum.chk
I: - 'root.tgz'...
R: stat -L --printf=%s -- /mnt/autorun/root.tgz
R: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ERROR
I: %[
R: cat -- /mnt/autorun/root.tgz
%: 49
%: 99
%: 100
I: %]
D: Expected: ee28e86adabdb2c409a4442e7d42cabc51a28d56d73395b73e932f67fdc87fe0
D: Has got:  ee28e86adabdb2c409a4442e7d42cabc51a28d56d73395b73e932f67fdc87fe0
R: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/testsum.chk
I: Backup images validated successfully!
R: mountpoint -q -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
R: umount -Rfl -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
R: rmdir -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
I: Done.

Вот что означают первые символы в начале каждой строки:

  • `D:` — отладочное сообщение
  • `R:` — выполняемая команда
  • `I:` — информационное сообщение
  • `W:` — предупреждение
  • `E:` — фатальная ошибка
  • `I: %[` — начало длительной операции
  • `I: %]` — окончание длительной операции
  • `%:` — прогресс выполнения от 0 до 100

Маркеры завершения процесса system-restore:

  • `E: #`… — программа завершена фатально
  • `I: Done.` — программа завершена успешно

Журнал с включенной отладкой также станет более информативным:

[2026-03-29 04:19:03] Using frontend's pipe: /tmp/test1.fifo
[2026-03-29 04:19:03] Started with arguments: -M -l /tmp/check.log -f /tmp/test1.fifo
[2026-03-29 04:19:03] Executing: mktemp -dt -- system-restore-XXXXXXXX.tmp
[2026-03-29 04:19:03] Executing: stat -c %d /etc
[2026-03-29 04:19:03] Executing: stat -c %d -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:04] Executing: mount -t tmpfs -o nodev,noexec,nosuid none /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:04] Executing: chmod 0700 /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:04] Using user-defined configuration: 'sysrest.ini'...
[2026-03-29 04:19:04] Entering the hook 'profile_not_found'...
[2026-03-29 04:19:04] Leaving the hook 'profile_not_found'...
[2026-03-29 04:19:04] Entering the hook 'select_profile'...
[2026-03-29 04:19:04] Leaving the hook 'select_profile'...
[2026-03-29 04:19:04] Entering the hook 'check_hardware'...
[2026-03-29 04:19:04] Leaving the hook 'check_hardware'...
[2026-03-29 04:19:04] Checking the backup metadata...
[2026-03-29 04:19:04] Executing: cat -- /mnt/autorun/META.tgz
[2026-03-29 04:19:04] Executing: tar -xpf - -C /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:04] Executing: unpigz -qnc
[2026-03-29 04:19:04] Executing: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ARCH
[2026-03-29 04:19:04] Executing: uname -m
[2026-03-29 04:19:04] Executing: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ORGHOST
[2026-03-29 04:19:04] Executing: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/esp.uuid
[2026-03-29 04:19:04] Executing: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/swap.uuid
[2026-03-29 04:19:04] Executing: head -n1 -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/root.uuid
[2026-03-29 04:19:04] Validating backup images...
[2026-03-29 04:19:04] - 'esp.tgz'...
[2026-03-29 04:19:04] Executing: stat -L --printf=%s -- /mnt/autorun/esp.tgz
[2026-03-29 04:19:04] Executing: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ERROR
[2026-03-29 04:19:04] Executing: cat -- /mnt/autorun/esp.tgz
[2026-03-29 04:19:04] Expected: eb27daa66e62347105f2483932ccf263210701073e2e465845a02a86e2d291fa
[2026-03-29 04:19:04] Has got:  eb27daa66e62347105f2483932ccf263210701073e2e465845a02a86e2d291fa
[2026-03-29 04:19:04] Executing: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/testsum.chk
[2026-03-29 04:19:04] - 'root.tgz'...
[2026-03-29 04:19:04] Executing: stat -L --printf=%s -- /mnt/autorun/root.tgz
[2026-03-29 04:19:04] Executing: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/ERROR
[2026-03-29 04:19:04] Executing: cat -- /mnt/autorun/root.tgz
[2026-03-29 04:19:06] Expected: ee28e86adabdb2c409a4442e7d42cabc51a28d56d73395b73e932f67fdc87fe0
[2026-03-29 04:19:06] Has got:  ee28e86adabdb2c409a4442e7d42cabc51a28d56d73395b73e932f67fdc87fe0
[2026-03-29 04:19:06] Executing: rm -f -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp/testsum.chk
[2026-03-29 04:19:06] Backup images validated successfully!
[2026-03-29 04:19:06] Executing: mountpoint -q -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:06] Executing: umount -Rfl -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp
[2026-03-29 04:19:06] Executing: rmdir -- /tmp/.private/root/system-restore-2ASB5Qqb.tmp

В качестве фронтэнда также поддерживается действующий alterator-browser. Если запустить следующим образом:

# system-restore -Mqa -l /tmp/check.log

получится примерно то же самое, только по протоколу Альтератора. При этом возможности действующего Альтератора по фильтрации сообщений от бэкенда слабее. Но можно написать собственный бэкенд Альтератора (промежуточный модуль), который будет взаимодействовать через PIPE с system-restore в качестве фронтенда, как описано выше.