weidner/archives/2014/04/

Das Initramfs von pxe-initrd debuggen

Das Problem

Ich verwende schon seit längerem pxe-initrd um Voyage Linux auf ALIX-Rechnern zu installieren. Das ist praktisch, weil damit das Betriebssystem vollständig automatisch über das Netzwerk installiert wird und ich nur dafür sorgen muss, dass der Rechner via PXE startet.

Etwa seit Version 0.9 von Voyage-Linux funktionierte das nicht mehr.

Zunächst war das kein Beinbruch, da ich eine Zeit lang kein Gerät neu aufsetzen musste. Neulich brauchte ich aber wieder einen "frischen" Rechner.

Beim Starten konnte ich beobachten, dass PXELINUX den Kernel und das Initramfs lud und startete. Ich konnte sehen, dass ipconfig die richtige Konfiguration für das Netzwerk anzeigte. Anschließend brach das init-Skript ab mit der Meldung, dass keine Netzkonfiguration gefunden wurde.

Da ich an dieser Stelle keine Shell bekam, um das Problem zu untersuchen, blieb mir nur das Initramfs zu analysieren, zu modifizieren und weiter zu testen.

Initramdisk analysieren und modifizieren

Um das Initramfs analysieren zu können, muss ich es zunächst auspacken. Das erledigen diese drei Befehle:

# mkdir /tmp/initrd
# cd /tmp/initrd
# zcat /srv/tftp/initrd-3.10.11-voyage |cpio -i

Nachdem ich das Initramfs ausgepackt hatte, konnte ich es, beginnend beim Skript init im obersten Verzeichnis, analysieren. Dabei sah ich, dass die Skripts nach dem Aufruf von ipconfig aus der Datei /tmp/net-eth0.conf lesen, wenn der Rechner über eth0 startete. Also fügte ich den Befehl ls -l /tmp an dieser Stelle in das Skript ein.

Anschließend verpackte ich die Dateien mit folgenden Befehlen zu einem neuen Initramfs:

# find .|cpio --create --format=newc|gzip \
> /srv/tftp/initrd-3.10.11-voyage

Neustart, weitere Tests

Anschließend startete ich den ALIX-Rechner neu und bekam angezeigt, dass die Datei /tmp/net-eth0.conf genau 0 Byte groß war. Offensichtlich wurde die Datei nicht von ipconfig gefüllt, obwohl dieses die richtige Konfiguration via DHCP bekommen hatte und auch auf der Konsole ausgab.

Mit dem Befehl

# strings bin/ipconfig

konnte ich sehen, dass das Programm sehr wohl noch mit einer Datei net-%s.conf arbeitete, aber es war kein Verzeichnis dabei zu sehen. Ich musste also nach der Datei suchen und dabei kam mir busybox zu Hilfe, welches im Initramfs enthalten ist. Ich fügte den Befehl

busybox find / -name net-\*.conf -exec ls -l {} \;

zum Suchen ein, erzeugte ein neues Initramfs, wie oben beschrieben und startete den ALIX-Rechner noch einmal.

Diesmal zeigten die Skripts zwei Dateien: /run/net-eth0.conf und /tmp/net-eth0.conf. Die Datei in /run/ enthielt Daten.

Mit diesem Wissen konnte ich nun das Initramfs endgültig anpassen und damit dann Voyage Linux 0.9.2 auf dem Rechner installieren.

Demnächst werde ich noch die Skripts in pxe-initrd anpassen, damit die Änderungen auch bei künftigen Versionen von Voyage Linux gleich zur Verfügung stehen.

Posted 2014-04-27
Tags: