Puncte:1

Se afișează mesajul utilizatorului în timpul unei instalări Debian prestabilite nesupravegheate

drapel tr

In timpul late_command pasul unei instalări nesupravegheate, rulez un script shell:

d-i preseed/late_command șir în-țintă /bin/sh -c './execute-script.sh'

Când este atins pasul late_command, interfața de utilizare (fond albastru, fereastră gri) afișează un mesaj „Running preseed...”:

introduceți descrierea imaginii aici

Mă întreb dacă există vreo modalitate de a afișa în mod viu alte mesaje pe baza a ceea ce execute-script.sh face.

Am crezut naiv că folosirea STDOUT obișnuit cu ecouri ar face smecheria, dar pare mai complicat.

Căutările mele de până acum mi-au adus în atenție o potențială utilizare a debconf dar nu am reușit să găsesc nicio cale.

Versiunea actuală a scriptului meu a fost remodelată conform răspunsului @Andrew:

#!/bin/sh

. /usr/share/debconf/confmodule
. „./variables.sh”

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

pisică > „${templatePath}” << „EOF”
Șablon: deployment_progress_tracker/progress/fallback
Tip: text
Descriere: ${STEP}...
EOF

debconf-loadtemplate deployment_progress_tracker „${templatePath}”
db_progress START 0 1 deployment_progress_tracker/progress

watchLogs () {
  deploymentDone=fals
  in timp ce ! $deploymentDone
  do
    if [ -f "${logFile}" ]; atunci
      pas=$(grep -E -o -a -h "Pasul de progres: .*" "${logFile}" | coada -1 | sed 's/Pasul de progres: //')
      if [ -z "${pas##*$DEPLOYMENT_FINISHED*}" ]; atunci
        deploymentDone=true
      elif [ -n "${pas}" ]; atunci
        db_subst deployment_progress_tracker/progress/fallback PASUL „${step}”
        INFO db_progress deployment_progress_tracker/progress/fallback
      fi
    fi
    somn 3
  Terminat
}



(
  WatchLogs;
  rm -f "${templatePath}";
  db_progress SET 1;
  somn 1;
  db_progress STOP;
  db_unregister deployment_progress_tracker/progress;
) &

Scriptul anterior va avea ca rezultat următoarele:

introduceți descrierea imaginii aici

Și duce înapoi la meniul de instalare (alegerea Terminare, instalarea va rula din nou partea preseedată și va eșua, alegerea Abort nu va demonta ISO și nu va reporni, oricum, încerc să fac atât demontarea, cât și repornirea automată):

introduceți descrierea imaginii aici

Puncte:2
drapel es

Vei fi destul de limitat de debconf și poate că nu merită efortul. Nu cred că veți putea să o faceți deloc cu o rulare de script în țintă. Am avut succes folosind următorul fragment și scriptul preseed cu Debian Buster. Schimbă textul unde Se rulează preseed... este afișat de trei ori. Se va arăta

  1. Pasul A
  2. Pasul B
  3. Alergarea c... (opțiunea „de rezervă”)

Fișier preseed parțial pentru a descărca și a rula un script.

șir de comandă d-i preseed/late_command \
  wget -P /run http://REDACTED/my_script.sh ; \
  chmod 755 /run/my_script.sh ; \
  /run/my_script.sh

Conținutul my_script.sh.

#!/bin/sh

. /usr/share/debconf/confmodule

set -e

# creați un fișier șabloane cu șirurile pentru afișare debconf
cat > /run/my_script.templates << 'EOF'
Șablon: my_script/progress/a
Tip: text
Descriere: Pasul A

Șablon: my_script/progress/b
Tip: text
Descriere: Pasul B

Șablon: my_script/progress/fallback
Tip: text
Descriere: rulează ${STEP}...
EOF

# utilizați utilitarul pentru a încărca fișierul șablon generat
debconf-loadtemplate my_script /run/my_script.templates

# întrerupeți doar pentru a afișa „Preseed în curs de desfășurare...”
somn 2

# pentru fiecare 3 pași spune lui debconf ce șir de șablon să fie afișat
pentru pasul din a b c; do

    dacă ! db_progress INFO my_script/progress/$step; atunci
        db_subst my_script/progress/fallback PASUL „$pas”
        db_progress INFO my_script/progress/fallback
    fi

    cazul $intervine
        "A")
            # rulați comenzi sau scripturi în mediul de instalare (aceasta folosește comanda sleep în mediul de instalare)
            dormi 10
            ;;
        "b")
            # rulați comenzi sau scripturi în mediul chroot (aceasta folosește comanda sleep din sistemul instalat)
            somn în țintă 10
            ;;
        "c")
            # doar un alt pas exemplu
            dormi 10
            ;;
    esac
Terminat

Scriptul și fișierul șabloane generate se bazează pe finisare-instalare (debian-installer pachet) scenariu și șabloane.

Bil5 avatar
drapel tr
Mulțumesc pentru ideea grozavă, pe baza ei, de ce următoarele nu ar funcționa? `d-i preseed/late_command șir /bin/sh logs-observer.sh &; in-target --pass-stdout /bin/sh -c './my-target-script.sh > outputlog'` - `myscript.sh` va ecou diferiții pași a, b, c... ar fi salvați în `outputlog` - `logs-observer.sh` ar rula o buclă infinită (până când va citi „DONE”) și ar citi ultimul pas scris în „shared” `outputlog` și va actualiza mesajul în consecință. Desigur, pașii ar fi definiți în prealabil în `logs-observer.sh`, așa cum ați făcut și în fișierul dvs. `my-script.sh`.
Andrew Lowther avatar
drapel es
@Bil5 care ar putea funcționa, dar sună foarte complicat. Aș avea scriptul `logs-observer.sh` de apel `in-target ./my-target-script.sh` în interiorul acestuia. `in-target` este pur și simplu un script în mediul de instalare care include o comandă în cadrul unor setări chroot. Poate fi apelat din scriptul dvs. și nu trebuie să fie numit director din `late_command`
Bil5 avatar
drapel tr
sugestia ta funcționează impecabil, mulțumesc, totuși, procedând așa cum ai spus (`in-target ./my-target-script.sh` și de la ea apelând `/bin/sh logs-observer.sh`), nu pot pentru a face să funcționeze orice comandă `db_progress INFO` atunci când o apelați direct din `logs-observer.sh` (având, desigur, sursă `confmodule` și a generat șablonul în prealabil). Singura modalitate prin care am găsit, este să o fac direct de la `my-target-script.sh`, și astfel ambele scripturi trebuie să comunice între ele, iar un fișier jurnal este singurul mod în care am găsit. Vreun gând?
Andrew Lowther avatar
drapel es
Cred că depinde cât de specifice vrei să fie actualizările UI. Am adăugat la exemplul de script pentru a arăta cum poate actualiza interfața de utilizare și apoi rula o comandă sau un script. Aceasta include capacitatea de a rula o comandă sau un script „în țintă”. Interfața de utilizare poate fi actualizată din nou numai după ce comanda sau scriptul se termină.
Bil5 avatar
drapel tr
Pot confirma că acest mod funcționează bine și am găsit o modalitate de a apela fiecare comandă debconf din scriptul de instalare. Acum mă confrunt cu o altă problemă grea, după ce am terminat cu scriptul, în loc să ies automat din programul de instalare, să scot cdrom-ul și să repornesc (așa cum a fost configurat în preseed și testat cu succes înainte de lucrurile debconf), se întoarce la programul de instalare meniu și nu permite pur și simplu repornirea fără a relansa instalarea. Am observat acest mesaj în syslog: „Elementul de meniu „finish-install” a reușit, dar a cerut să fie lăsat neconfigurat”
Bil5 avatar
drapel tr
Am adăugat versiunea actuală a scriptului pe care îl încerc în primul meu comentariu, astfel încât să putem discuta.
Bil5 avatar
drapel tr
După reflecție, ar putea fi în afara domeniului întrebării mele inițiale, am vrut să văd aici câteva mesaje în programul de instalare și, datorită răspunsului dvs., funcționează. Sună mai curat să creez un alt subiect pentru noua mea preocupare. Iti multumesc din nou. https://serverfault.com/questions/1074794/debian-installer-wont-exit-after-preseeded-installation

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.