20 Apr 2020

FreeBSD Boot: Dirbad Panic / Mangled Entry / Endless reboot

Auch unter FreeBSD gibt es ernsthafte Dateisystem-Fehler, die dazu führen, dass der Server nicht mehr bootet, oder in einem Endlos-Reboot-Intervall verharrt.

Ursache: Stromausfall?

Deshalb schildere ich jetzt hier ein Szenario, und wie ich das behoben habe. Das kommt nur in sehr seltenen Fällen vor, meist liegt eine Kombination von Stromausfall und/oder Harddisk-Problemen zugrunde. Genauer kann ich das aber nicht eingrenzen. Es ist nur mit UFS+Softupdates bisher passiert.

defekten Inode lokalisieren

Wenn der Server immer wieder von selbst rebootet, muss man einen Montior anschließen, und den Boot-Prozess filmen. Diesen Film kann man dann gegen Ende Frame für Frame ansehen, und die Stelle mit der Panic identifizieren. Hier war es diese:

dirbad1 dirbad1

  • Wichtig sind diese Zeilen:
    find: /var/spool/postfix/defer/A/AD5F892446CA: Bad file descriptor
    panic: ufs_dirbad: / : bad dir ino 153375075 at offset 512: mangled entry
    

Analysieren

  • Eine Datei des Mail-Servers postfix im Spooling-Directory ist defekt. Und es handelt sich genau um den Inode 153375075. Diesen müssen wir jetzt löschen, es gibt keine andere möglichkeit, das System zum booten zu bringen.

Fehler beheben

  • Dazu gehen wir beim nächsten Boot in den Single-User-Mode. Dort starten wir den File System Debugger auf das korrekte Device:
    # fsdb /dev/ad0s1a
    ** /dev/ad0s1a
    Editing file system '/dev/ad1s1a'
    [...]
    
  • Dort kucken wir uns den schlechten Inode an:
    fsdb (inum: 2)> inode 153375075
    current inode: directory
    [...]
    
  • Egal wie sehr es uns betrüben mag, wir müssen ihn löschen, und dann können wird den debugger verlassen.
    fsdb (inum:153375075)> clri 153375075
    fsdb (inum:153375075)> quit
    
  • es wird uns jetzt mitgeteilt, dass das Filesystem immer noch dirty ist, usw. Das kann ja später gecheckt werden, ein
    # reboot
    

sollte erst mal wieder möglich sein.

Vielen Dank an phaq