Mit dem Kernel-Paket 2.11.0 wurde vom initrd- auf initramfs-Format umgestellt, womit sich die Schritte zur manuellen Bearbeitung dieser Bootdatei grundsätzlich geändert haben.

Allerdings heißt die Bootdatei auch bei Verwendung des initramfs-Formats weiterhin initrd.gz.

Seit Kernel-Paket 3.18.0 werden zudem CPU-Microcode-Updates eingebunden, wodurch sich nun ein geänderter Ablauf zur Bearbeitung ergibt, falls CPU-Microcode-Updates für das eigene System zur Verfügung stehen. In diesem Fall werden beim Kernelupdate in /var/install/initrd alle notwendigen Dateien bereitgestellt.

Mit der Umstellung auf den Kernel 4.9. im Kernelpaket 4.1.2 wird schon beim Boot udev zum Laden von Modulen genutzt, so dass die Datei init nun nicht mehr explizit ausgewählte Module lädt. Eine Bearbeitung der initramfs zum Laden von Modulen ist daher zukünftig weder erforderlich noch sinnvoll. Ebenfalls enthält die initrd für den 4.9er-Kernel alle für den Bootvorgang eventuell notwendigen Module und nicht wie bisher nur eine vordefinierte, auf eine bestimmte Hardware abgestimmte Auswahl an Modulen.

1. Entpacken der initrd.gz

  • Es sind CPU-Microcode-Updates vorhanden, erkennbar daran, dass es in /var/install/initrd eine initrd.gz.without.ucode gibt:
    # cp /var/install/initrd/initrd.gz.without.ucode /tmp/initrd.gz
    # gzip -d /tmp/initrd.gz
  • Es gibt keine CPU-Microcode-Updates, erkennbar daran, dass es in /var/install/initrd keine initrd.gz.without.ucode gibt:
    # cp /boot/initrd.gz /tmp
    # gzip -d /tmp/initrd.gz

2. Auspacken der initramfs

# mkdir /initramfs
# cd /initramfs
# cpio -i < /tmp/initrd

3. Bearbeiten der initramfs

Nun kann man sich das Verzeichnis /initramfs näher ansehen. Das Äquivalent zur linuxrc des initrd-Formats ist jetzt die Datei init. Am Anfang stehen die Lade-Befehle der Module (nur für Kernel 3.16.x), danach kommt das Skelett von init.

Hier können nun also Änderungen an der Datei init vorgenomen werden und gegebenenfalls auch Dateien z. B. Kernelmodule (nur für Kernel 3.16.x) hinzugefügt werden.

Achtung: Immer komplette Pfade beim Starten von Befehlen verwenden! Sollen Kernelmodule der initramfs hinzugefügt werden, dann sind diese auch in den Verzeichniszweig /lib/modules/<kernelversion>/ zu kopieren. Im Init-Skript können keine Pfade auf das Modulverzeichnis des installierten Systems benutzt werden, da das Root-Device zu diesem Bootzeitpunkt noch nicht zur Verfügung steht.

4. Einpacken der initramfs

  • Es sind CPU-Microcode-Updates vorhanden:
    # cd /initramfs
    # find . | cpio -o -H newc --quiet | gzip -9 > /var/install/initrd/initrd.gz.self
  • Es gibt keine CPU-Microcode-Updates, danach weiter bei 7.:
    # cd /initramfs
    # find . | cpio -o -H newc --quiet | gzip -9 > /tmp/initrd.gz
    # cp /tmp/initrd.gz /boot

5. Kombinieren der neuen initramfs mit den Microcodes

cat /var/install/initrd/ucode.img /var/install/initrd/initrd.gz.self > /var/install/initrd/initrd.gz.with.ucode

6. Kopieren der initramfs ins Bootverzeichnis

# Kopieren der initramfs mit Microcode-Updates
# cp /var/install/initrd/initrd.gz.with.ucode /boot/initrd.gz
#
# oder
#
# Kopieren der initramfs ohne Microcode-Updates
# cp /var/install/initrd/initrd.gz.self /boot/initrd.gz

7. Aktivieren der neuen initramfs

# lilo

Achtung: Wird der Aufruf von lilo unterlassen, ist der Server über den Standard-Eintrag „eis“ im Bootmenü nicht mehr bootbar, sondern nur noch über weitere Einträge des Bootmenüs z. B. „oldeis“, solange diese funktionstüchtig sind.

8. Aufräumen

# cd /
# rm -rf /initramfs
# rm -f /tmp/initrd.gz
# rm /tmp/initrd