Рейтинг:1

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

флаг tr

Вовремя поздняя_команда шаг автоматической установки, я запускаю сценарий оболочки:

d-i preseed/late_command string in-target /bin/sh -c './execute-script.sh'

При достижении шага late_command в пользовательском интерфейсе (синий фон, серое окно) отображается сообщение «Выполняется preseed...»:

введите описание изображения здесь

Мне интересно, есть ли способ живого отображения других сообщений на основе того, что выполнить-script.sh делается.

Я наивно думал, что использование обычного STDOUT с эхом поможет, но это кажется более сложным.

Мои поиски до сих пор привлекли мое внимание к потенциальному использованию debconf но я не смог найти никакого способа.

Текущая версия моего сценария изменена в соответствии с ответом @Andrew:

#!/бин/ш

. /usr/доля/debconf/confmodule
. "./переменные.ш"

logFile="/target${INSTALLATION_LOG_LOCATION}"
templatePath="/target/tmp/deployment_progress_tracker.templates"

кошка > "${templatePath}" << 'EOF'
Шаблон: deployment_progress_tracker/progress/fallback
Тип: текст
Описание: ${ШАГ}...
EOF

debconf-loadtemplate deploy_progress_tracker "${templatePath}"
db_progress НАЧАЛО 0 1 deployment_progress_tracker/прогресс

журналы просмотра () {
  развертывание выполнено = ложь
  пока ! $deploymentDone
  делать
    если [-f "${logFile}" ]; тогда
      step=$(grep -E -o -a -h "Progress-step: .*" "${logFile}" | tail -1 | sed 's/Progress-step: //')
      если [ -z "${шаг##*$DEPLOYMENT_FINISHED*}" ]; тогда
        развертывание выполнено = истина
      Элиф [-n "${шаг}"]; тогда
        db_subst deploy_progress_tracker/progress/fallback ШАГ "${шаг}"
        db_progress INFO deployment_progress_tracker/progress/fallback
      фи
    фи
    спать 3
  сделано
}



(
  журналы просмотра;
  rm -f "${templatePath}";
  db_progress НАБОР 1;
  спать 1;
  db_progress СТОП;
  db_unregister deployment_progress_tracker/progress;
) &

Предыдущий скрипт приведет к следующему:

введите описание изображения здесь

И возвращает обратно в меню установщика (выбор «Завершить установку» фактически снова запустит предварительно заданную часть и завершится сбоем, выбор «Прервать» не приведет к размонтированию ISO и перезагрузке, в любом случае я пытаюсь выполнить размонтирование и перезагрузку автоматически):

введите описание изображения здесь

Рейтинг:2
флаг es

Вы будете довольно ограничены debconf и, возможно, это не стоит усилий. Я не думаю, что вы сможете сделать это вообще с запуском скрипта в цель. Я добился успеха, используя следующий предварительно заданный фрагмент и сценарий с Debian Buster. Он меняет текст, где Запуск Preseed... отображается три раза. Это покажет

  1. Шаг А
  2. Шаг Б
  3. Бег с... (вариант «запасной»)

Частичный preseed-файл для загрузки и запуска скрипта.

d-i preseed/late_command строка \
  wget -P /run http://REDACTED/my_script.sh ; \
  chmod 755 /run/my_script.sh ; \
  /run/my_script.sh

Содержание my_script.sh.

#!/бин/ш

. /usr/доля/debconf/confmodule

установить -е

# создаем файл шаблонов со строками для отображения debconf
кошка > /run/my_script.templates << 'EOF'
Шаблон: my_script/progress/a
Тип: текст
Описание: Шаг А

Шаблон: my_script/progress/b
Тип: текст
Описание: Шаг Б

Шаблон: my_script/progress/fallback
Тип: текст
Описание: Выполняется ${STEP}...
EOF

# используем утилиту для загрузки сгенерированного файла шаблона
debconf-loadtemplate my_script /run/my_script.templates

# сделать паузу, чтобы показать "Running Preseed..."
спать 2

# foreach 3 шага сообщают debconf, какую строку шаблона отображать
для шага в a b c; делать

    если ! db_progress INFO my_script/progress/$step; тогда
        db_subst my_script/progress/fallback STEP "$step"
        db_progress INFO my_script/прогресс/запасной вариант
    фи

    случай $вступить
        "а")
            # запускать команды или сценарии в среде установщика (при этом используется команда sleep в среде установщика)
            спать 10
            ;;
        "б")
            # запускать команды или сценарии в среде chroot (при этом используется команда sleep из установленной системы)
            целевой сон 10
            ;;
        "с")
            # еще один пример шага
            спать 10
            ;;
    эсак
сделано

Сценарий и созданный файл шаблонов основаны на отделка-установка (debian-установщик упаковка) сценарий и шаблоны.

Bil5 avatar
флаг tr
Спасибо за отличную идею, на ее основе, почему бы не работать следующее? `d-i preseed/late_command string /bin/sh logs-observer.sh &; in-target --pass-stdout /bin/sh -c './my-target-script.sh > outputlog'` - `myscript.sh` будет отображать различные шаги a, b, c... они будут сохранены в `outputlog` - `logs-observer.sh` будет запускать бесконечный цикл (пока он не прочитает "DONE") и читать последний шаг, записанный в "общем" `outputlog`, и соответствующим образом обновлять сообщение. Конечно, шаги должны быть определены заранее в `logs-observer.sh`, точно так же, как вы сделали это в файле `my-script.sh`.
Andrew Lowther avatar
флаг es
@ Bil5 это может сработать, но звучит очень сложно. Я бы внутри скрипта `logs-observer.sh` вызывал `in-target ./my-target-script.sh`. `in-target` — это просто сценарий в среде установщика, который заключает команду в некоторую настройку chroot. Его можно вызвать из вашего скрипта и не обязательно вызывать каталог из `late_command`
Bil5 avatar
флаг tr
ваше предложение работает безупречно, большое спасибо, однако, делая так, как вы сказали (`in-target ./my-target-script.sh` и из него вызывая `/bin/sh logs-observer.sh`), я не могу чтобы заставить работать любую команду `db_progress INFO` при вызове ее непосредственно из `logs-observer.sh` (конечно, предварительно получив `confmodule` и сгенерировав шаблон). Единственный способ, который я нашел, - это сделать это непосредственно из `my-target-script.sh`, и, таким образом, оба сценария должны взаимодействовать друг с другом, и файл журнала - единственный способ, который я нашел. Любая мысль?
Andrew Lowther avatar
флаг es
Я думаю, это зависит от того, насколько конкретными вы хотите, чтобы обновления пользовательского интерфейса были. Я добавил в пример сценария, чтобы показать, как он может обновить пользовательский интерфейс, а затем запустить команду или сценарий. Это включает в себя возможность запуска команды или сценария «в цели». Пользовательский интерфейс может быть обновлен снова только после завершения команды или сценария.
Bil5 avatar
флаг tr
Я могу подтвердить, что этот способ работает хорошо, и я нашел способ вызывать каждую команду debconf из сценария установки. Теперь я столкнулся с другой сложной проблемой: после того, как я закончил работу со сценарием, вместо автоматического выхода из установщика, извлечения компакт-диска и перезагрузки (как настроено в предварительном задании и успешно протестировано перед debconf), он возвращается к установщику. меню и не позволяет просто перезагрузиться без перезапуска установки. Я заметил это сообщение в системном журнале: «Элемент меню «Завершить установку» выполнен успешно, но запрошено, чтобы его оставили ненастроенным».
Bil5 avatar
флаг tr
Я добавил текущую версию сценария, которую я тестирую, в свой первый комментарий, чтобы мы могли ее обсудить.
Bil5 avatar
флаг tr
После размышлений это может выйти за рамки моего первоначального вопроса, я хотел здесь увидеть некоторые сообщения в программе установки, и благодаря вашему ответу это работает. Звучит чище, если я создам еще одну тему для моей новой заботы. Еще раз спасибо. https://serverfault.com/questions/1074794/debian-installer-wont-exit-after-preseed-installation

Ответить или комментировать

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