Wie debuggt man eine Schleife in systemd-shutdown / initrd? (Arch Linux)

Wie debuggt man eine Schleife in systemd-shutdown / initrd? (Arch Linux)

Ich habe vor Kurzem Arch Linux auf einer virtuellen Festplatte installiert, unter einer benutzerdefinierten Konfiguration für Root auf ZFS. Dabei verwendete ich einige Skripte, die ich für die Verwaltung einer Multiboot-Konfiguration mit separaten Boot- und Root-Pools zusammengestellt habe, die jeweils sowohl für Arch als auch für FreeBSD verwendet werden können. Derzeit wurde die ZFS-Poolkonfiguration mit FreeBSD unter einer VM erstellt. Die Arch Linux-Installation wurde dann von einer anderen VM aus erstellt, wo Arch auf einer Ext4-Partition installiert wurde. Nachdem Arch auf der Boot/Root-ZFS-Konfiguration installiert wurde und nach einigen Konfigurationen für Grub, bootet die Arch-Installation auf ZFS nun erfolgreich.

Derzeit läuft die virtuelle Festplatte mit den ZFS-Pools unter einer separaten virtuellen Maschine. Arch Linux ist derzeit das einzige Betriebssystem, das auf der virtuellen Festplatte dieser Maschine installiert ist. Es bootet jetzt erfolgreich mit einer entsprechenden Grub2-Konfiguration. Allerdings stelle ich beim Herunterfahren eine Schleife fest.

[ 1561.324253] systemd-shutdown[1]: Sending SIGKILL to remaining processes...
[ 1561.336930] systemd-shutdown[1]: Unmounting file systems.
[ 1561.341650] [563]: Remounting '/var' read-only in with options 'noxattr,noacl'.
[ 1561.783555] [564]: Unmounting '/var'.
[ 1561.790194] [565]: Remounting '/usr' read-only in with options 'noxattr,noacl'.
[ 1561.796853] [566]: Remounting '/' read-only in with options 'noxattr,noacl'.
[ 1561.803420] systemd-shutdown[1]: All filesystems unmounted.
[ 1561.809423] systemd-shutdown[1]: Deactivating swaps.
[ 1561.813672] systemd-shutdown[1]: All swaps deactivated.
[ 1561.818688] systemd-shutdown[1]: Detaching loop devices.
[ 1561.824354] systemd-shutdown[1]: All loop devices detached.
[ 1561.829085] systemd-shutdown[1]: Stopping MD devices.
[ 1561.833346] systemd-shutdown[1]: All MD devices stopped.
[ 1561.837982] systemd-shutdown[1]: Detaching DM devices.
[ 1561.842299] systemd-shutdown[1]: All DM devices detached.
[ 1561.847501] systemd-shutdown[1]: All filesystems, swaps, loop devices, MD devices and DM devices detached.
[ 1561.856852] systemd-shutdown[1]: Successfully changed into root pivot.
[ 1561.863478] systemd-shutdown[1]: Returning to initrd...
[ 1562.306958] shutdown[1]: Syncing filesystems and block devices.
[ 1562.311377] shutdown[1]: Sending SIGTERM to remaining processes...
[ 1562.316903] shutdown[1]: Sending SIGKILL to remaining processes...
[ 1562.329374] shutdown[1]: Unmounting file systems.
[ 1562.334319] sd-remou[569]: Remounting '/' read-only in with options 'noxattr,noacl'.
[ 1562.346902] sd-umoun[570]: Unmounting '/oldroot/sys/kernel/config'.
[ 1562.354595] sd-umoun[571]: Unmounting '/oldroot/sys/fs/fuse/connections'.
[ 1562.361525] sd-umoun[572]: Unmounting '/oldroot/sys/kernel/tracing'.
[ 1562.368232] sd-umoun[573]: Unmounting '/oldroot/sys/kernel/debug'.
[ 1562.373715] sd-umoun[574]: Unmounting '/oldroot/dev/mqueue'.
[ 1562.380105] sd-umoun[575]: Unmounting '/oldroot/dev/hugepages'.
[ 1562.386843] sd-umoun[576]: Unmounting '/oldroot/sys/fs/bpf'.
[ 1562.391984] sd-umoun[577]: Unmounting '/oldroot/sys/fs/pstore'.
[ 1562.397417] sd-umoun[578]: Unmounting '/oldroot/sys/fs/cgroup'.
[ 1562.404234] audit: type=1334 audit(1635363440.667:81): prog-id=8 op=UNLOAD
[ 1562.410100] sd-umoun[579]: Unmounting '/oldroot/dev/pts'.
[ 1562.414579] audit: type=1334 audit(1635363440.667:82): prog-id=6 op=UNLOAD
[ 1562.420101] sd-umoun[580]: Unmounting '/oldroot/dev/shm'.
[ 1562.426852] sd-umoun[581]: Unmounting '/oldroot/sys/kernel/security'.
[ 1562.432165] sd-umoun[582]: Unmounting '/oldroot/usr'.
[ 1562.443869] sd-remou[583]: Remounting '/oldroot/run' read-only in with options 'noxattr,noacl'.
[ 1562.456905] sd-umoun[584]: Unmounting '/oldroot/run'.
[ 1562.461323] sd-umoun[585]: Unmounting '/oldroot'.
[ 1562.466800] sd-umoun[585]: Failed to unmount /oldroot: Device or resource busy
[ 1562.473458] sd-umoun[586]: Unmounting '/oldroot/dev'.
[ 1562.478395] sd-umoun[587]: Unmounting '/oldroot/sys'.
[ 1562.483288] sd-umoun[588]: Unmounting '/oldroot/proc'.
[ 1562.488082] sd-umoun[589]: Unmounting '/oldroot'.
[ 1562.493279] shutdown[1]: All filesystems unmounted.
[ 1562.498851] shutdown[1]: Deactivating swaps.
[ 1562.502456] shutdown[1]: All swaps deactivated.
[ 1562.506839] shutdown[1]: Detaching loop devices.
[ 1562.511505] shutdown[1]: All loop devices detached.
[ 1562.515404] shutdown[1]: Stopping MD devices.
[ 1562.520083] shutdown[1]: All MD devices stopped.
[ 1562.523666] shutdown[1]: Detaching DM devices.
[ 1562.527617] shutdown[1]: All DM devices detached.
[ 1562.531822] shutdown[1]: All filesystems, swaps, loop devices, MD devices and DM devices detached.
[ 1562.540145] shutdown[1]: Successfully changed into root pivot.
[ 1562.544940] shutdown[1]: Returning to initrd...

Ich habe dies nur bei der Arch Linux-Installation auf ZFS festgestellt. Wenn ich dieselben Versionen von systemd, mkinitcpio, linux und zfs-linux unter einer anderen VM-Installation verwende, mit Arch auf einer Ext4-Partition, tritt beim Herunterfahren auf dieser Maschine keine solche Schleife auf. Kann es an der Root-Konfiguration auf ZFS liegen?

Ich bin ratlos, wie ich diese Schleife weiter debuggen kann.

Meiner Vermutung nach hängt dies möglicherweise mit einem Skript für systemd-shutdown auf mkinticpio zusammen, das 2013 eingeführt wurde (Bächler2013).

Der Hauptcode des mkinitcpio-generate-shutdown-ramfsDienstes, der zu dieser Zeit eingeführt wurde, scheint ein Auszug aus/usr/lib/systemd/system/mkinitcpio-generate-shutdown-ramfs.service

[Service]
Type=oneshot
# /tmp could be umounted at this point
# use /run as temporary directory
Environment=TMPDIR=/run
ExecStart=/usr/bin/mkinitcpio -A sd-shutdown -k none -c /dev/null -d /run/initramfs

Darüber hinaus ist der Inhalt der Datei/usr/lib/initcpio/install/sd-shutdown

#!/bin/bash

build() {
    add_binary /usr/lib/systemd/systemd-shutdown /shutdown

    if type -P kexec >/dev/null; then
        add_binary kexec
    fi
}

help() {
    cat <<HELPEOF
This hook adds systemd-shutdown to the initramfs. This is only
if the image is extracted to /run/initramfs before shutdown.
HELPEOF
}

# vim: set ft=sh ts=4 sw=4 et:

Ich bin nicht sicher, ob das tatsächlich in den Herunterfahrvorgang der VM einfließt – möglicherweise erfüllt das System die angegebenen Voraussetzungen dafür nicht.

Ich habe versucht, den mkinitcpio-generate-shutdown-ramfsDienst unter systemd zu maskieren, ihn dann mkinitcpio -Perneut auszuführen und neu zu starten … und beim Herunterfahren des Systems tritt er immer noch in diese Schleife ein.

Das System ist unter der VM-Installation noch nutzbar – zumindest bis zu diesem Zeitpunkt beim Herunterfahren, als die Maschine beginnt, endlos zu schleifen. Idealerweise möchte ich diesen Knoten aus der Konfiguration entfernen können, bevor ich etwas anderes als Arch installiere oder dies auf die interne Festplatte einer Maschine speichere.

Ich bin nicht sicher, was die Ursache für diese Meldung sein könnte Failed to unmount /oldroot: Device or resource busy. Vielleicht hat es etwas mit dem Root bei der ZFS-Installation zu tun? Aber das ist wirklich nur eine Vermutung.

Meiner Meinung nach läuft der systemd-Shutdown-Prozess unter initrd, wenn man der Konsolenausgabe Glauben schenkt? Ich glaube, dass das Debuggen an diesem Punkt nicht trivial ist.

Ich bin sicher, dass ich Arch weiterhin verwenden könnte, um die Grub-Konfiguration auf dem neuesten Stand zu halten, nachdem ich FreeBSD neben Arch in der ZFS-Poolkonfiguration unter der virtuellen Festplatte der VM installiert habe. Wenn es jedoch möglich ist, dieses Problem mit der Shutdown-Schleife unter Arch zu beheben, möchte ich die Arch-Installation als funktionierendes Desktop-System beibehalten können – in der VM-Installation oder schließlich auf der Festplatte des PCs.

Während ich nicht weiß, wie ich diese Schleife weiter debuggen kann, gibt es für die Schleife während des Herunterfahrens vielleicht einen Patch, den ich bisher nur noch nicht gefunden habe?

Aktualisieren

Ich habe gefundenQuellcodefür systemd-shutdown, in der Version, die unter Arch Linux verwendet wird. Ich denke, es sieht nach ziemlich unkompliziertem Code aus. Es steht dort möglicherweise nicht viel über den Einhängepunkt „oldroot“ oder darüber, wie dieser unter systemd-shutdown nicht einhängbar werden könnte.

Es scheint nicht an der Protokollierung zu liegen. Ich habe einen einmaligen systemd-Dienst Storage=volatileeingerichtet und erstellt, der nach dem Booten ausgeführt wird. Das Dateisystem wird jetzt erfolgreich ausgehängt und ich glaube nicht, dass ich bei Neustarts alle Protokolldaten verliere./etc/systemd/journald.conf/usr/bin/journalctl --flush/var/

Die Schleife tritt jedoch beim Herunterfahren weiterhin auf, zusammen mit der Meldung Failed to unmount /oldroot...von systemd-shutdown. Gibt es etwas, das es als Nebeneffekt aufhält?

verwandte Informationen