Diesen Artikel habe ich schon im Mai 2009 geblogged. Allerdings hat sich grml seitdem so dramatisch weiterentwickelt,
dass ich ihn aktualisiert und mit neuem Datum versehen habe.
In Mietserver-Recovery mit veraltetem Rescuesystem habe ich beschrieben, wie man
grml aus dem komprimierten Image von einer Festplatte booten kann, was zum Beispiel für Rescue-Zwecke an einem Server
ohne direkt zugängliche Konsole sehr praktisch sein kann. Zu dieser Zeit (der Artikel stammt aus dem März 2007) war
das noch eine größere Operation mit “CD-Image loopback mounten, die einzelnen Dateien rauskopieren und an die
richtige Stelle im Dateisystem werfen”, mit neueren grml-Versionen ist es aber noch viel einfacher geworden.
Neueres grml (die hier beschriebenen Verfahren sind mit dem daily grml-small_sid vom 17. August 2009 getestet) erspart
einem einen Teil des Lottos, denn mit Hilfe der isofrom-Option kann sich grml beim booten selbst die benötigten Daten
direkt aus einem .iso-File ziehen. Das könnte einem die Artistik mit dem Loopback-Mount zur Installationszeit ersparen,
wenn man nicht Kernel und initrd bräuchte, bevor grml in der Lage ist, direkt auf das .iso zuzugreifen. grub 0.9 bracht
kernel und initrd noch direkt im Boot-Dateisystem, und so muss man sich seine Dateisystemstruktur doch selbst aus dem
.iso zusammenkratzen.
Damit reicht dann aber auch ein
title grml-small
root (hd0,0)
kernel /grml/linux26 quiet vga=791 lang=de boot=live noeject noprompt keyboard=de findiso=/grml/grml.iso
toram=grml-small-daily-sid.squashfs
initrd /grml/initrd.gz
und das grml bootet aus diesen drei Dateien. Das macht natürlich das Updaten verhältnismäßig einfach.
grub2 kann direkt ein .iso-File loopback mounten und auch kernel und initrd direkt aus dem .iso laden. Somit reicht es,
im Updatefall einfach ein neues .iso an die passende Stelle im Dateisystem zu werfen, und fertig ist man. Die dafür
notwendige grub2-Konfiguration ist diese hier:
menuentry “grml” {
loopback loop (hd0,1)/grml/grml.iso
linux (loop)/boot/grmlsmalldailysid/linux26 quiet vga=791 lang=de boot=live noeject noprompt keyboard=de
findiso=/grml/grml.iso toram=grml-small-daily-sid.squashfs
initrd (loop)/boot/grmlsmalldailysid/initrd.gz
}
Dank der bekanntermaßen tollen Dokumentation für grub2 (eine Erklärung, wie die neue grub.cfg aussieht, habe ich in
keiner der automatisch installierten Packages für grub2 gefunden, und grub2-doc gibt es nicht) hätte ich das
allerdings ohne Mikas Hilfe nicht rausbekommen. Doch dazu noch ein anderer
Artikel in diesem
Blog.
Die Pfade innerhalb des .iso variieren mit dem Image-Flavor (z.B. Released, oder daily image, basierend auf sid,
testing, stable, grml, grml-medium, grml-small), hier muss man noch ein wenig aufpassen. Und der Loopback-Mount
funktioniert nur, wenn dem grub2 die Mondphase gerade passt (siehe auch Debian Bug #543924).
Mit der Bootoption ssh=password kann man dem System beim Booten sagen, dass es einen ssh-Server starten soll und das
Passwort für den User grml auf das angegebene Passwort setzen soll. Wenn ein DHCP-Server im Netz vorhanden ist und
korrekte Informationen ausgibt, kann das System somit direkt ohne Konsolenzugang übers Netz erreicht werden.
Etwas komplexer wird es, wenn das System nicht per DHCP ans Netz gebracht werden kann. Aber auch hierfür hat grml
(nicht nur ein einziges) Bordmittel bei sich. So kann man z.B. mit der Bootoption scripts ein innerhalb des .iso
liegendes Script beim booten ausführen. Grml kann auch nach einem Dateisystem mit dem Label GRMLCFG suchen und sich das
Script aus dessen Root Directory holen. Das passt allerdings nicht so schön in ein Setup, in dem das grml nur das
Rescuesystem ist.
Die grml daily images ab dem 17. August sind auch in der Lage, die Koordinaten zu dem Startscript von der Kommandozeile
zu beeinflussen. Die Bootoptionen myconfig=/dev/sda1 scripts=boot/grml/network.sh veranlassen grml zum Beispiel, nach
dem Start das Script /boot/grml/network.sh von dem Dateisystem auf /dev/sda1 zu starten. Wenn man dort ein Script nach
der Machart von
#!/bin/sh
ip link set dev eth0 up
ip addr add dev eth0 192.168.8.240/24 brd +
ip route add default via 192.168.8.254
echo “nameserver 192.168.8.254” > /etc/resolv.conf
echo “grml:1234” | chpasswd
/etc/init.d/ssh start
hinterlegt, kommt das System mit den hier eingestellten Netzwerkparametern hoch, setzt ein Passwort für den User grml
und startet den sshd. Dann muss man noch verhindern, dass einem der DHCP-Client dazwischenfunkt (Bootoption dhcp) und
man kann das System komplett ohne Mitarbeit der RZ-Infrastruktur zu Rettungsmaßnahmen ans Netz bringen.
Insgesamt arbeite ich also inzwischen mit dem Grub-Eintrag
title grml-small
root (hd0,0)
kernel /boot/grml/linux26 quiet vga=791 lang=de boot=live noeject noprompt keyboard=de
findiso=/boot/grml/grml-small_sid_20090817.iso toram=grml-small-daily-sid.squashfs nodhcp myconfig=/dev/sda1
scripts=boot/grml/network.sh
initrd /boot/grml/initrd.gz
Ein Hoch auf grml, die tägliche Arbeit wird jeden Tag etwas einfacher.
Und hier noch ein Script für grub2, das beim Aufruf von update-grub automatisch für jedes gefundene grml-Image einen
korrekten Booteintrag erzeugt:
#!/bin/sh
set -e
. /usr/lib/grub/update-grub_lib
list=$(for i in /boot/grml/grml*.iso ; do
if grub_file_is_not_garbage “$i” ; then echo -n “$i ” ; fi
done)
while [ “x$list” != “x” ] ; do
grml=$(version_find_latest $list)
echo “Found grml image: $grml” >&2
basename=“$(basename $grml .iso)”
dirname=“$(dirname $grml)”
rel_dirname=“$(make_system_path_relative_to_its_root $dirname)”
kernel=“$(isoinfo -f -J -i $grml | grep ‘linux26$’)”
initrd=“$(isoinfo -f -J -i $grml | grep ‘initrd\.gz$’)”
squashfs=“$(basename $(isoinfo -f -J -i $grml | grep ‘\.squashfs$’))”
cat << EOF
menuentry “$basename” {
loopback loop $rel_dirname/${basename}.iso
linux (loop)$kernel quiet vga=791 lang=de boot=live noeject noprompt keyboard=
initrd (loop)$initrd
}
EOF
list=$(echo $list | tr ' ' ‘\n’ | grep -vx $grml | tr ‘\n’ ' ‘)
done