Alle paar Schaltjahre begebe ich mich auf die Suche, ob es mittlerweile möglich ist, unsere „diskless“ Debian Clients statt via NFSv3 über NFSv4 zu booten. Ich würde mir ein wenig flotteres booten versprechen und eine ungleich einfachere Firewall. Die Initram bietet diese Möglichkeit nach wie vor nicht und das wird sicher auch noch eine Weile so bleiben, wenn man Google so befragt. Doch der gestrige Tag brachte einen Lichtblick: Dracut. Dracut gibt es schon seit einiger Zeit, ist mir aber nur über einen Bug Eintrag („[…] just for the records [..]“) über den Weg gelaufen, dass Dracut in der Lage ist NFSv4 für das Rootfs zu verwenden. Da sah ich schon das Funkeln in meinen Augen, als ich schnell mit dem IPhone mein Gesicht kontrollierte.

Kurz: es funktioniert tatsächlich!

Lang: Es ist besser, wenn ihr euch halbwegs aktuelle Quellen von Dracut besorgt, da die Debian Squeeze Version mit 0.05 (aktuell 0.20) wirklich alt ist. Allerdings gelang es mir nicht ohne viel Zeit zu investieren, 0.20 zu übersetzen. Make brach mit irgendwelchen Fehlern ab, doch 0.19 klappte auf Anhieb. ein anschließendes „make install“ bringt die Dateien an Ort und stelle, sodass man zügig die erste initrd erzeugen kann:

1
2
# dracut -f  -i /etc/dracut/hooks/pre-pivot/create-dirs.sh \
  /lib/dracut/hooks/pre-pivot -m "nfs network base" -H dracut.img
  • -f Force
  • -i Die Datei create-dirs.sh in die initrd packen, nach /lib/dracut/hooks/pre-pivot
  • -m Zusätzliche Module – wobei keine Kernel Module gemeint sind, sondern eher Plugins
  • -H Nur wirklich benötigte Kernel Module, für diesen Rechner einbinden
  • dracut.img Selbst gewählter Dateiname, für die neue Ramdisk

Das Verzeichnis „/etc/dracut/hooks/pre-pivot/“ plus die Datei habe ich selbst erstellt. In meinem Fall benötige ich vor dem Pivot einfach zusätzlich Ordner und Ramdisks. Wichtig ist: Die Scripte müssen auf „*.sh“ enden.

Ansonsten gibt es noch die /etc/dracut.conf, in der ich ebenfalls noch Module einbinden kann, aber nicht muss (z.B. benötige ich kein LVM / MDADM):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#dracutmodules=""
# Dracut modules to omit
#omit_dracutmodules=""
# Dracut modules to add to the default
add_dracutmodules="busybox plymouth"
# additional kernel modules to the default
#add_drivers=""
# list of kernel filesystem modules to be included in the generic initramfs
#filesystems=""
# build initrd only to boot current hardware
hostonly="yes"
# install local /etc/mdadm.conf
mdadmconf="no"
# install local /etc/lvm/lvm.conf
lvmconf="no"

Wie man sieht, habe ich noch die Busybox (für chmod und co) eingebaut und Plymouth. Da Dracut aus den Quellen installiert wurde, stimmen einige Pfade nicht, wenn z.B. Plymouth eingebunden werden soll. Diese Pfade stehen in den Modulen unter /usr/lib/dracut/modules.d/, welche angepasst werden sollten/müssen/können.

Da ich den NFS Pfad etc. per DHCP übergebe, benötige ich an dieser Stelle keine weitere Konfiguration. Spannend wird es dann, wenn es nicht gleich auf Anhieb klappt. Dracut bietet einige Hooks an, die z.B. die Debug Funktion der Shell (sh -x) aktiviert, od. bevor der Pivot erfolgt mich auf eine Kommandozeile schmeißt. Auf diese weise lässt sich prüfen, was nicht funktioniert.

Tja, bei mir hat es theoretisch super geklappt, leider kann ich das noch nicht ins Produktiv- System überspielen, da es dummerweise im AuFS Dateisystem einen Bug gibt, der verhindert, dass richtig gelesen / geschrieben werden kann.

Nichts desto trotz … Dracut ist eine Lösung, die bei mir Initramfs auf lange Sicht bestimmt ersetzen wird.