Skip to content

grml als eigenes Rescuesystem

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.

Update: Das hier beschriebene Verfahren funktioniert seit grml 2011.12 nicht mehr. Der Way to Go is nun grml-rescueboot.

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

Trackbacks

Zugschlusbeobachtungen on : Debian blind installieren

Show preview
Ich habe mir nach langer Abstinenz mal wieder einen Server bei Hetzner gemietet. In der Serverbörse verschachert der Anbieter ältere Geräte als Einzelstücke, die von ihrem bisherigen Mieter zurückgegeben wurden und die teilweise aufgrund individueller Aus

Comments

Display comments as Linear | Threaded

mika on :

Danke für die Info bezüglich "Allerdings bleibt dann die Platte trotz “toram” eingehängt [...]" bei findiso - schau ich mir noch genauer an.

mfg, -mika-

mika on :

Bug fixed mit Upload von live-initramfs 1.157.1-1grml.05, siehe auch http://bts.grml.org/grml/issue675 -> Bug wird also mit der Stable-Release nicht mehr auftreten.

mfg, -mika-

Mike Gerber on :

Danke! Eine kleine Anmerkung jedoch: Die Zeilen die mit "findiso" beginnen, gehören natürlich noch an das Ende der "kernel"-Zeilen. Kein Zeilenumbruch.

Add Comment

Markdown format allowed
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
Form options