Wie übergebe ich Argumente von der PXE-Befehlszeile an ein Kickstart-Skript% pre,% post?

7

Grundsätzlich möchte ich eine ARGV-ähnliche Verwendung in der PXE-Befehlszeile, kann jedoch keine Dokumentation dazu sehen.

im grunde möchte ich so etwas weitergeben

Scientific-Linux-6 HOSTNAME VLAN

Dann in% pre einige APIs treffen, um die Netzwerkinformationen zu erhalten, die ich brauche, um sie an die KS-Konfiguration anzuhängen. Dieser Teil ist einfach, wenn ich die Parameter habe.

Schließlich möchte ich in% post einen Kochlauf starten und den Gurt zum Kochserver booten. Dies muss auch Hostname / Domainname kennen (im Grunde Hostname -f nicht in die Luft jagen), aber dies sollte nicht so schlimm sein, wenn ich die oben genannten vervollständigen kann. Leider war dies mein ursprüngliches Ziel, aber dann schlug es fehl, als mir klar wurde, dass ich den Hostnamen noch nicht festgelegt hatte.

Folgendes habe ich bisher gelernt.

$ cat linux-install/msgs/param.msg 



                        09Kernel Parameter Help07

Some kernel parameters can be specified on the command line and will be
passed to the running kernel.  This does not include options to modules
such as ethernet cards or devices such as CD-ROM drives.

To pass an option to the kernel, use the following format:
     0flinux <options>07
If a different installation mode is desired, enter it after the option(s).

For example, to install on a system with 128MB of RAM using expert mode, 
type the following:
     0flinux mem=128M expert07

To pass options to modules, you will need to use the expert mode to disable
PCI autoprobing.  When the installation asks for your device type that needs
an option or parameter passed to it, there will be a place to type those
in at that time. 

Süss!? Das heißt also, auf PXE kann ich gehen wie ...

scientific-linux-6 linux ARGV_APPEND

Recht?

Dann habe ich diese Präsentation und einige andere Erwähnungen gefunden

Stick this at the top of the %pre section, and it will take anything of the form var=value
from /proc/cmdline and turn it into a variable you can use directly

set -- `cat /proc/cmdline`

for I in $*; do case "$I" in *=*) eval $I;; esac; done

Das heißt also, ich kann sagen

scientific-linux-6 linux HOSTNAME=foo.example.com, VLAN=ddd

Recht?

Dann in% pre Das heißt, ich kann

Klicken Sie auf meine API, um IP, Maske und Gateway abzurufen und das Netzwerk in etwas Ähnliches zu ändern

network --bootproto=static --ip=10.0.2.15 --netmask=255.255.255.0
 --gateway=10.0.2.254 --nameserver=10.0.2.1

Wie beschrieben Hier

Dann werden wir in% post für unseren Koch-Kunden-Lauf eingerichtet.

Meine Frage ist. Klingt es so, als würde das funktionieren? Gibt es einen besseren Weg? Sicher hat das schon jemand anderes gemacht?

Update (Lösung basierend auf Antwort implementiert)

In der PXE-Befehlszeile habe ich Optionen übergeben

$ hotbox linux prefix_varname="foo" prefix_another_var="bar"

(Alles, was danach linuxauf / proc / cmdline gesetzt wird, hotboxwar das PXE-Label.) Dann habe %postich in / proc / cmdline (in Ruby) nach allen Variablen gesucht, die mit / prefix _ * / übereinstimmen, und sie in einen Hash umgewandelt. Dies führte dazu, dass der Küchenchef es auf der Grundlage der Ergebnisse einer Webanforderung zur weiteren Konfiguration weitergab.

Hinweis: Razor war nicht da, als ich das alles gemacht habe. Ich persönlich war mit Rasiermesser nicht zufrieden und wir verwenden immer noch mehr oder weniger die oben genannte Methode.

EnabrenTane
quelle
Wie @amcnabb hervorhebt, ist DHCP großartig, aber dies ist speziell für dedizierte Ausrüstung und das einfache Bootstrapping möglich.
EnabrenTane

Antworten:

3

Mit einfachen booleschen Optionen habe ich ein grepIn durchgeführt /proc/cmdline, was sehr einfach ist. Für Schlüsselwertoptionen setscheint der Trick praktisch zu sein, obwohl ich ihn nicht ausprobiert habe. Spezifische Antworten auf Ihre Fragen:

1) Ja, das klingt so. Ich habe sehr ähnliche Dinge mit Kickstart und gemacht /proc/cmdline.

2) Nein, ich glaube nicht, dass es einen besseren Weg gibt. Der Kernel stellt seine Befehlszeilenoptionen in zur Verfügung /proc/cmdline, und Kickstart bietet keine allgemeinen Mechanismen für den Umgang mit Kernel-Befehlszeilenoptionen.

3) Ja, das wurde schon mal gemacht. Probieren Sie es aus und kommen Sie zurück, wenn Sie es nicht zum Laufen bringen können.

Ein paar zusätzliche Gedanken:

1) Setzen Sie kein Komma zwischen die Befehlszeilenoptionen (trennen Sie sie einfach durch Leerzeichen).

2) Bei pxelinux kann es hilfreich sein, eine appendLinie zu verwenden. Zum Beispiel:

append initrd=f16-x86_64/initrd.img ks=nfs:server.example.com:/path/to/f16.ks mycustomflag mykey=myval

3) Netzwerkeinstellungen (wie das von Ihnen angegebene Beispiel für den Hostnamen) werden häufig besser von DHCP bereitgestellt.

amcnabb
quelle
Ich mag auch DHCP. Leider ist dies für ein Hosting-Unternehmen und manchmal hosten wir dedizierte Geräte, auf die DNS verweist.
EnabrenTane
@EnabrenTane, hattest du schon die Chance es zu versuchen? Ich bin gespannt, ob Sie auf Probleme gestoßen sind.
Amcnabb
Habe es mit ein bisschen Trauer zum Laufen gebracht. Schrieb meinen eigenen / proc / cmdline-Parser anstelle des obigen Bash-Parsers. Und etwas, wie in meinem Fall RVM (Ruby Version Manager) wird nicht installiert, weil es / dev / fd / 62
EnabrenTane
2

Ich konnte es mit den folgenden Befehlen zum Laufen bringen, um alle Schlüsselwertpaare in Variablen zu analysieren:

# Get the kernel parameters
params=`cat /proc/cmdline`
# Split them on spaces
params_split=(${params// / })
# Go through each of them
for p in "${params_split[@]}"; do
  # And if it's a key value pair
  if [[ $p =~ "=" ]]; then
    # And if the key doesn't have a period in it
    p_split=(${p//=/ })
    if [[ !($p_split[0] =~ ".") ]]; then
      # Then set the key to the value
      eval $p;
    fi;
  fi
done
Dave Johansen
quelle
Ja, das habe ich mehr oder weniger getan. Lassen Sie mich die Frage mit meinen Ergebnissen aktualisieren.
EnabrenTane
0

Das sollte sein

if [[ ! ($p_split[0] =~ ".") ]]; then
      ^^^

Und vielleicht möchten Sie das umgeben mit:

#raw
...
#end raw

Es wird also keine Probleme mit der Interpolation von Schuster- / Gepardenvorlagen geben.

Randy Zagar
quelle