Übergeben von Variablen zur Verwendung in der Voreinstellungsdatei für eine Debian Jessie-Installation

7

Ist es möglich, eine Variable über die Startaufforderung zum Debian-Installationsprogramm hinzuzufügen, damit diese Variable in einer vorab festgelegten Datei verwendet werden kann?

Insbesondere versuche ich das folgende Problem zu lösen:

Wir haben ein ziemlich umfangreiches Skript nach der Installation, das normalerweise von einem Server heruntergeladen wird. Aber jetzt möchte ich Packer-Images erstellen und das Skript nach der Installation zusammen mit den anderen Packer-Dateien in der Versionskontrolle belassen. Für den Zugriff auf den Preseed kann ich im Boot-Befehl "preseed / url = http: // {{.HTTPIP}}: {{.HTTPPort}} / preseed.cfg" ausführen. Aber jetzt möchte ich, dass das Installationsprogramm das Skript nach der Installation von demselben Speicherort herunterlädt.

Derzeit sieht der Hook nach der Installation folgendermaßen aus:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://our.public.server/postinstall.jessie.sh ; sh /tmp/postinstall.sh

Im Idealfall möchte ich etwas tun wie:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://{{ .HTTPIP }}:{{ .HTTPPort }}/postinstall.jessie.sh ; sh /tmp/postinstall.sh

Aber natürlich wird das Debian-Installationsprogramm diese nicht durch die erforderlichen Werte ersetzen. Daher dachte ich, dass es möglich sein könnte, umgebungsvariablenähnliche Variablen an das Installationsprogramm zu übergeben, die wir in der vorab festgelegten Datei verwenden können.

Alle Hinweise oder Tipps sind willkommen!

BEARBEITEN: Es wurde versucht, den Befehl late_command zum Startbefehl hinzuzufügen, aber das wurde nicht erkannt.

BEARBEITEN: Vorab versucht / ausgeführt, aber in einer anderen Umgebung ausgeführt, in der der Befehl in-target nicht zulässig ist.

EDIT: Dies kann eine Problemumgehung sein: Wie führe ich Befehle in einer Debian-Preseed-Datei zusammen? Aber ich würde es vorziehen, das Skript in einer separaten Datei zu haben. Wenn es nicht möglich ist, ist es jedoch nicht möglich.

Tim Stoop
quelle

Antworten:

3

Dies hängt davon ab, welches Betriebssystem Sie verwenden. Mit dem Linux-Kernel können Sie jedoch Umgebungsvariablen als Kernelparameter angeben. Die Linux - Kernel - Dokumentation hat einige gute Informationen drum herum (wichtig Absatz bolded):

Die Argumentliste

Die Kernel-Befehlszeile wird in eine Liste von Zeichenfolgen (Boot-Argumenten) analysiert, die durch Leerzeichen getrennt sind. Die meisten Boot-Argumente haben die Form:

 name[=value_1][,value_2]...[,value_10]

Dabei ist 'name' ein eindeutiges Schlüsselwort, mit dem angegeben wird, welchem ​​Teil des Kernels die zugehörigen Werte (falls vorhanden) zugewiesen werden sollen. Beachten Sie, dass die Grenze von 10 real ist, da der vorliegende Code nur 10 durch Kommas getrennte Parameter pro Schlüsselwort verarbeitet. (Sie können jedoch dasselbe Schlüsselwort mit bis zu 10 zusätzlichen Parametern in ungewöhnlich komplizierten Situationen wiederverwenden,> vorausgesetzt, die Setup-Funktion unterstützt dies.)

Der größte Teil der Sortierung ist in der Kernel-Quelldatei init / main.c codiert. Zunächst prüft der Kernel, ob das Argument eines der speziellen Argumente 'root =', 'nfsroot =', 'nfsaddrs =', 'ro', 'rw', 'debug' oder 'init' ist. Die Bedeutung dieser speziellen Argumente wird unten beschrieben.

Anschließend wird eine Liste der Setup-Funktionen durchsucht, um festzustellen, ob die angegebene Argumentzeichenfolge (z. B. 'foo') einer Setup-Funktion ('foo_setup ()') für ein bestimmtes Gerät oder einen Teil des Kernels zugeordnet wurde. Wenn Sie den Kernel mit der Zeile foo = 3,4,5,6 übergeben haben, durchsucht der Kernel das Boot-Setups-Array, um festzustellen, ob 'foo' registriert wurde. Wenn dies der Fall wäre, würde es die mit 'foo' (foo_setup ()) verknüpfte Setup-Funktion aufrufen und die Argumente 3, 4, 5 und 6 übergeben, die in der Kernel-Befehlszeile angegeben sind.

Alles in der Form 'foo = bar', das wie oben beschrieben nicht als Setup-Funktion akzeptiert wird, wird dann als einzustellende Umgebungsvariable interpretiert.
Ein (nutzloses?) Beispiel wäre die Verwendung von 'TERM = vt100' als Startargument.

Alle verbleibenden Argumente, die vom Kernel nicht erfasst und nicht als Umgebungsvariablen interpretiert wurden, werden dann an PID 1 übergeben, bei der es sich normalerweise um das Programm init (1) handelt. Das häufigste Argument, das an den Init-Prozess übergeben wird, ist das Wort "Single", das ihn anweist, den Computer im Einzelbenutzermodus zu starten und nicht alle üblichen Daemons zu starten. Überprüfen Sie auf der Handbuchseite, welche Version von init (1) auf Ihrem System installiert ist, um festzustellen, welche Argumente akzeptiert werden.

Hier ist mein boot_commandAbschnitt in meinem virtualbox-isoBuilder (für Ubuntu 18.04):

boot_command:
  - '<esc><esc><enter><wait>'
  - '/install/vmlinuz noapic fb=false '
  - 'auto=true '
  - 'hostname={{.Name}} '
  - 'url=http://{{.HTTPIP}}:{{.HTTPPort}}/ubuntu.seed '
  - 'initrd=/install/initrd.gz '
  - 'http_proxy={{user `http_proxy`}} '
  - 'packer_host={{.HTTPIP}} '
  - 'packer_port={{.HTTPPort}} '
  - 'hello=world '
  - 'quiet --- <enter>'

Die http_proxy, packer_host, packer_portund helloParameter sind komplett optional und werden in Umgebungsvariablen vom Kernel umgewandelt werden.

In meiner ubuntu.seedDatei habe ich die folgende Zeile, um die helloUmgebungsvariable in eine Datei auszudrucken :

d-i preseed/late_command string echo $hello > /target/home/packer/hello

Wenn ich die OVA importiere und starte, befindet sich diese Datei in meinem Home-Verzeichnis mit worldihrem Inhalt.

Wheeler
quelle
2

Ok, ich habe es selbst gelöst (mit Hilfe von @lieter_). Nicht zu stolz darauf, aber es funktioniert:

d-i preseed/late_command string wget -q -O /tmp/postinstall.sh http://`cat /proc/cmdline | sed 's/.*url=\([^ ]\+\).*/\1/'`/d-i/jessie/postinstall.sh ; sh /tmp/postinstall.sh

Dies macht das, was ich brauche, da wir bei der Installation immer eine URL = zu unserer Befehlszeile hinzufügen.

Tim Stoop
quelle
-1

Während ich versuchte, das gleiche Problem zu lösen, lernte ich etwas Magie, die in das eingebrannt ist debian-installer. Sie können preseed_fetchzum Abrufen von der URL verwenden, wenn Sie /./an der Stelle in der URL eine hinzufügen , die Sie als rootpathfür andere Befehle festlegen möchten, für die deren relative Abrufe ausgeführt werden sollen.

Bei einem Server mit einem vordefinierten Ordner und einem Skriptordner mit anderen Dateien, die Sie verwenden möchten, können Sie bei Übergabe url=http://{{.HTTPIP}}:{{.HTTPPort}}/http/./preseed/ubuntu.seedandere Dateien relativ zum Stammpfad wie referenzieren preseed_fetch /scripts/somescript.sh /tmp/somescript.sh.

d-i preseed/late_command    string preseed_fetch /scripts/late_script /tmp/late_script; \
 log-output -t late_script sh /tmp/late_script
dragon788
quelle