[gelöst] Fehlermeldungen von mdadm

Probleme mit Samba, NFS, FTP und Co.
Antworten
Pontus
Beiträge: 21
Registriert: 17.12.2019 23:18:27

[gelöst] Fehlermeldungen von mdadm

Beitrag von Pontus » 04.07.2023 02:04:17

Moin, zusammen.

Wenn ich bei einem frisch von DEBIAN 11 zu DEBIAN 12 upgeradeten
System diesen Befehl ausführe

cat /var/log/syslog | grep mdadm

lese ich diese Meldungen. Worauf deuten diese hin?

Code: Alles auswählen

2023-07-02T00:57:01.073503+02:00 srv-cloud CRON[19129]: (root) CMD (if [ -x /usr/share/mdadm/checkarray ] && [ $(date +%d) -le 7 ]; then /usr/share/mdadm/checkarray --cron --all --idle --quiet; fi)
2023-07-02T12:54:29.179553+02:00 srv-cloud mdadm[381]: mdadm: Unknown keyword mdadm
2023-07-02T12:54:29.179558+02:00 srv-cloud mdadm[381]: mdadm: Unknown keyword mdadm
2023-07-02T12:54:29.179785+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
2023-07-02T14:57:07.423082+02:00 srv-cloud mdadm[400]: mdadm: Unknown keyword mdadm
2023-07-02T14:57:07.423088+02:00 srv-cloud mdadm[400]: mdadm: Unknown keyword mdadm
2023-07-02T14:57:07.426845+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
2023-07-02T17:59:45.787121+02:00 srv-cloud mdadm[384]: mdadm: Unknown keyword mdadm
2023-07-02T17:59:45.787125+02:00 srv-cloud mdadm[384]: mdadm: Unknown keyword mdadm
2023-07-02T17:59:45.787350+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
2023-07-02T23:34:53.063848+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
2023-07-02T23:44:31.863540+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
2023-07-03T11:28:35.818694+02:00 srv-cloud systemd[1]: mdadm-shutdown.service - Prepare mdadm shutdown initramfs was skipped because of an unmet condition check (ConditionFileIsExecutable=/usr/bin/dracut).
Die Datei /usr/bin/dracut existiert nicht.

Ich vermute, dass dies nichts mit dem Upgrade zu tun hat - sicher bin ich mir natürlich nicht.

Das RAID1 ist der Speicherplatz für einen kleinen Dateiserver im heimischen Netzwerk
und funktioniert.

Hat jemand einen (oder mehrere) Vorschläge, wie an die Ursache dieser Meldungen gelange?

Vielen Dank bis hierher und viele Grüße
Zuletzt geändert von Pontus am 06.07.2023 13:00:11, insgesamt 1-mal geändert.

Benutzeravatar
Blackbox
Beiträge: 4289
Registriert: 17.09.2008 17:01:20
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Fehlermeldungen von mdadm

Beitrag von Blackbox » 04.07.2023 13:51:28

Kannst du bitte einmal deine RAID-Geometrie zeigen, damit man sich ein Bild deines Setups machen kann?
Eigenbau PC: Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14

Freie Software unterstützen, Grundrechte stärken!

Pontus
Beiträge: 21
Registriert: 17.12.2019 23:18:27

Re: Fehlermeldungen von mdadm

Beitrag von Pontus » 05.07.2023 02:42:41

Moin, Blackbox.

Ja, Asche auf mein Haupt! Darauf hätte ich natürlich auch selbst kommen können. Hier, bitte:

Code: Alles auswählen

root@myserver:~# mdadm --detail /dev/md/0
/dev/md/0:
           Version : 1.2
     Creation Time : Thu Mar 23 19:08:09 2023
        Raid Level : raid1
        Array Size : 4000653312 (3.73 TiB 4.10 TB)
     Used Dev Size : 4000653312 (3.73 TiB 4.10 TB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Wed Jul  5 02:33:43 2023
             State : active
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : myserver:0  (local to host myserver)
              UUID : 8bc4083f:89a4d247:fcd65b61:78e8ce92
            Events : 4643

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
Solltest du darüber hinaus noch Informationen benötigen, lasse es mich wissen.

Danke für deine Unterstützung.

Viele Grüße

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Fehlermeldungen von mdadm

Beitrag von Livingston » 05.07.2023 10:18:48

Die Erwähnung von dracut macht mich stutzig. Debiandracut dient dazu, die initrd selbst zu bauen, und selbst zu kontrollieren, was in die initrd/initramfs rein soll.
Ist das Paket installiert? Offenbar wird ja in mdadm-shutdown.service die ausführbare Datei /usr/bin/dracut vermisst.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Pontus
Beiträge: 21
Registriert: 17.12.2019 23:18:27

Re: Fehlermeldungen von mdadm

Beitrag von Pontus » 06.07.2023 04:41:29

Moin, Livingston.

Vielen Dank für deinen Beitrag.

Deine Anmerkung zu dracut habe ich zum Anlass genommen nachzuschauen, ob dieses Paket installiert ist. Dem war nicht so.

Daraufhin habe ich also dracut hinzugefügt. Und siehe da! Die Meldung taucht nicht mehr auf!

Code: Alles auswählen

root@srv-cloud:~# cat /var/log/syslog | grep mdadm
2023-07-06T04:19:41.406085+02:00 srv-cloud systemd[1]: Started mdadm-last-resort@md0.timer - Timer to wait for more drives before activating degraded array md0..
2023-07-06T04:19:41.406110+02:00 srv-cloud systemd[1]: mdadm-last-resort@md0.timer: Deactivated successfully.
2023-07-06T04:19:41.406118+02:00 srv-cloud systemd[1]: Stopped mdadm-last-resort@md0.timer - Timer to wait for more drives before activating degraded array md0..
2023-07-06T04:19:41.406289+02:00 srv-cloud systemd[1]: Starting mdadm-shutdown.service - Prepare mdadm shutdown initramfs...
2023-07-06T04:19:41.406342+02:00 srv-cloud systemd[1]: Finished mdadm-shutdown.service - Prepare mdadm shutdown initramfs.
Stellt sich für mich jetzt nur noch die Frage, nach dem Grund für die Meldung:

Code: Alles auswählen

Started mdadm-last-resort@md0.timer - Timer to wait for more drives before activating degraded array md0.
Laut mdadm --detail /dev/md/0 scheint das Array ja fehlerfrei zu sein:

Code: Alles auswählen

mdadm --detail /dev/md/0
/dev/md/0:
           Version : 1.2
     Creation Time : Thu Mar 23 19:08:09 2023
        Raid Level : raid1
        Array Size : 4000653312 (3.73 TiB 4.10 TB)
     Used Dev Size : 4000653312 (3.73 TiB 4.10 TB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

     Intent Bitmap : Internal

       Update Time : Thu Jul  6 04:19:41 2023
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : bitmap

              Name : srv-cloud:0  (local to host srv-cloud)
              UUID : 8bc4083f:89a4d247:fcd65b61:78e8ce92
            Events : 4658

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8        1        1      active sync   /dev/sda1
Aber wohl nichts, worüber ich mir weitere Gedanken machen müsste. Oder?

Auf jeden Fall bedanke ich mich bei

@Blackbox und
@Livingston

für die hilfreiche Unterstützung.

Viele Grüße

Benutzeravatar
Blackbox
Beiträge: 4289
Registriert: 17.09.2008 17:01:20
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Fehlermeldungen von mdadm

Beitrag von Blackbox » 06.07.2023 06:28:53

Pontus hat geschrieben: ↑ zum Beitrag ↑
06.07.2023 04:41:29
Laut mdadm --detail /dev/md/0 scheint das Array ja fehlerfrei zu sein: Aber wohl nichts, worüber ich mir weitere Gedanken machen müsste. Oder?
Dein Raid-Array sieht fehlerfrei aus.

Es wäre schön, wenn du diesen Thread noch als [gelöst] markieren könntest.
Einfach den ersten Post dieses Threads editieren und den Betreff entsprechend ergänzen.
Eigenbau PC: Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14

Freie Software unterstützen, Grundrechte stärken!

Benutzeravatar
Livingston
Beiträge: 1454
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: Fehlermeldungen von mdadm

Beitrag von Livingston » 06.07.2023 09:01:04

Was die Fehlermeldung
Started mdadm-last-resort@md0.timer - Timer to wait for more drives before activating degraded array md0.
angeht: Da gibt's ein paar ältere Bugreports, in denen darüber gerätselt wird. Am ehesten trifft wohl das da zu: https://utcc.utoronto.ca/~cks/space/blo ... blySystemd
Ich kann jetzt aber auch spontan nicht sagen, wie damit umzugehen ist.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Pontus
Beiträge: 21
Registriert: 17.12.2019 23:18:27

Re: [gelöst] Fehlermeldungen von mdadm

Beitrag von Pontus » 06.07.2023 14:06:57

Moin, zusammen.

@Livingston

Ich habe den von dir genannten Bug-Report einmal mit DeepL übersetzt und weiter unten angehängt.

Mir stellte sich daraufhin die Frage, ob das als "degraded" deklarierte Array dann nicht auch jedesmal wieder reorganisiert müsste? Aber das ist offensichtlich nicht erforderlich. Denn wenn ich unmittelbar nach einem Neustart
mdadm --detail /dev/md/0
aufrufe, hat das Raid-Array den Status "clean".

Aber damit wäre das Thema für mich erst einmal abgehakt - getreu dem Motto "do not fix what's not broken".

Viele Grüße

Wie Linux Nicht-System-Software-RAID-Arrays beim Booten unter systemd startet
April 15, 2019

Theoretisch muss sich der Benutzer nicht darum kümmern, wie Linux-Software-RAID-Arrays beim Booten zusammengesetzt und gestartet werden, weil alles einfach funktioniert. In der Praxis ist das manchmal der Fall, und bei einem modernen systemd-basierten Linux scheint dies eine ungewöhnlich verworrene Situation zu sein. Hier ist also, was ich bisher darüber herausgefunden habe, wie es mit Software-RAID-Arrays funktioniert, die außerhalb des initramfs zusammengebaut und gestartet werden, nachdem das System das echte Root-Dateisystem gemountet hat und von diesem aus läuft.

(Wie die Dinge beim Starten von Software-RAID-Arrays im initramfs funktionieren, ist von Linux-Distribution zu Linux-Distribution sehr unterschiedlich. Es gibt sogar einige Unterschiede zwischen den Distributionen, was das Booten nach dem initramfs betrifft, aber heutzutage liefert die Master-Version von mdadm kanonische udev- und systemd-Skripte, Dienste usw. aus, und ich denke, die meisten Distributionen verwenden sie fast unverändert).

Wie schon seit einiger Zeit üblich, wird die grundlegende Arbeit durch udev-Regeln erledigt. Auf einem typischen Linux-System heißt die wichtigste udev-Regeldatei für die Assemblierung etwa 64-md-raid-assembly.rules und ist im Grunde die Upstream-Version von mdadm. Udev selbst identifiziert Blockgeräte, die potenziell Linux-RAID-Mitglieder sind (wahrscheinlich hauptsächlich aufgrund des Vorhandenseins von RAID-Superblöcken), und die udev-Regeln von mdadm führen mdadm dann in einem speziellen inkrementellen Assemblierungsmodus auf ihnen aus. Um die Manpage zu zitieren:

Dieser Modus ist dafür gedacht, in Verbindung mit einem Geräteerkennungssystem verwendet zu werden. Wenn Geräte in einem System gefunden werden, können sie an mdadm --incremental übergeben werden, um einem entsprechenden Array hinzugefügt zu werden.

Wenn Array-Komponenten für udev sichtbar werden und es veranlassen, mdadm --incremental auf ihnen auszuführen, fügt mdadm sie schrittweise dem Array hinzu. Wenn das letzte Gerät hinzugefügt ist, startet mdadm das Array. Dies macht das Software-RAID-Array und seinen Inhalt für udev und systemd sichtbar, wo es verwendet wird, um Abhängigkeiten für Dinge wie /etc/fstab-Einhängungen zu erfüllen und sie somit auszulösen.

(Es gibt zusätzliche mdadm-udev-Regeln für die Einrichtung von Gerätenamen, den Start der mdadm-Überwachung und so weiter. Und dann gibt es noch eine ganze Sammlung allgemeiner udev-Regeln und anderer Aktivitäten, um Dinge wie das Lesen der UUIDs von Dateisystemen aus neuen Blockgeräten zu erledigen).

All dies geschieht jedoch nur, wenn alle Geräte der Array-Komponenten in udev auftauchen (und schnell genug auftauchen); wenn nur einige der Geräte auftauchen, wird das Software-RAID teilweise von mdadm --incremental zusammengestellt, aber nicht gestartet, weil es nicht vollständig ist. Um mit dieser Situation umzugehen und schließlich Software-RAID-Arrays im degradierten Modus zu starten, starten die udev-Regeln von mdadm eine systemd-Timer-Unit, wenn genügend Geräte des Arrays vorhanden sind, um es degradiert laufen zu lassen, speziell die Template-Timer-Unit mdadm-last-resort@.timer (für md0 ist die spezifische Unit also mdadm-last-resort@md0.timer). Wenn das RAID-Array nicht zusammengebaut ist und der Timer abläuft, wird die entsprechende systemd-Diensteinheit mit mdadm-last-resort@.service ausgelöst, die 'mdadm --run' auf dem degradierten Array ausführt, um es zu starten.

(Die Timer-Einheit wird nur gestartet, wenn die inkrementelle Assemblierung von mdadm zurückmeldet, dass es "unsicher" ist, das Array zu assemblieren, im Gegensatz zu "unmöglich". Mdadm meldet dies erst, wenn genügend Komponentengeräte vorhanden sind, um das Array in einem degradierten Modus zu betreiben; wie viele Geräte benötigt werden (und welche Geräte), hängt vom jeweiligen RAID-Level ab. RAID-1-Arrays zum Beispiel benötigen nur ein Komponentengerät, um "unsicher" zu sein).

Da es hier ein offensichtliches Wettrennen gibt, arbeiten sowohl der systemd-Timer als auch der Dienst hart daran, nicht zu handeln, wenn das RAID-Array tatsächlich vorhanden und bereits gestartet ist. Der Timer kollidiert mit 'sys-devices-virtual-block-<array>.device', der systemd-Geräteeinheit, die das RAID-Array repräsentiert, und als zusätzliche Sicherheitsmaßnahme weigert sich der Dienst, zu laufen, wenn das RAID-Array in /sys/devices vorhanden zu sein scheint. Darüber hinaus wird die udev-Regel, die systemd dazu veranlasst, die Timer-Unit zu starten, nur auf Software-RAID-Geräte wirken, die zu diesem System zu gehören scheinen, entweder weil sie in Ihrer mdadm.conf aufgelistet sind oder weil ihr Heimathost dieser Host ist.

(Dies ist die MD_FOREIGN-Übereinstimmung in den udev-Regeln. Die Umgebungsvariablen stammen aus der --export-Option von mdadm, die während der inkrementellen Assemblierung von udev verwendet wird. Mdadms Code für die inkrementelle Assemblierung, der auch diese Umgebungsvariablen erzeugt, befindet sich in Incremental.c. Die wichtige enough()-Funktion ist in util.c.)

Soweit ich weiß, ist nichts davon dokumentiert oder offiziell; es ist nur die Art und Weise, wie sich mdadm, udev und systemd im Moment verhalten und interagieren. Allerdings scheint dies ziemlich stabil und langjährig zu sein, so dass es wahrscheinlich auch in Zukunft so sein wird.

PS: Soweit ich das beurteilen kann, bedeutet all dies, dass es keine echte, vom Benutzer erreichbare Kontrolle darüber gibt, ob degradierte Software-RAID-Arrays beim Booten gestartet werden oder nicht. Wenn Sie speziell den Start von degradierten RAID-Arrays blockieren wollen, könnte es funktionieren, den Last-Resort-Timer oder die Service-Unit für das Array mit 'systemctl mask' zu maskieren. Wenn Sie degradierte Arrays immer starten wollen, dann ist die gute Nachricht, dass dies automatisch geschehen soll.

Kommentare zu dieser Seite:
Von x am 2022-10-13 18:12:22:

Noch mehr "Spaß" gibt es mit Software-Raids. Angenommen, ein Software-Raid besteht aus ein paar Festplatten, die an einen KVM-VM angeschlossen sind und dort zu einem Array zusammengesetzt werden.

systemd/udev/mdadm auf dem Host wird ... dieses Array ebenfalls zusammen.

Wie auch immer werden dabei die Dateisysteme auf dem Array nicht beschädigt (was überrascht).
Das Original in English:
How Linux starts non-system software RAID arrays during boot under systemd
April 15, 2019

In theory, you do not need to care about how your Linux software RAID arrays get assembled and started during boot because it all just works. In practice, sometimes you do, and on a modern systemd-based Linux this seems to be an unusually tangled situation. So here is what I can determine so far about how it works for software RAID arrays that are assembled and started outside of the initramfs, after your system has mounted your real root filesystem and is running from it.

(How things work for starting software RAID arrays in the initramfs is quite varied between Linux distributions. There is some distribution variation even for post-initramfs booting, but these days the master version of mdadm ships canonical udev and systemd scripts, services, and so on and I think most distributions use them almost unchanged.)

As has been the case for some time, the basic work is done through udev rules. On a typical Linux system, the main udev rule file for assembly will be called something like 64-md-raid-assembly.rules and be basically the upstream mdadm version. Udev itself identifies block devices that are potentially Linux RAID members (probably mostly based on the presence of RAID superblocks), and mdadm's udev rules then run mdadm in a special incremental assembly mode on them. To quote the manpage:

This mode is designed to be used in conjunction with a device discovery system. As devices are found in a system, they can be passed to mdadm --incremental to be conditionally added to an appropriate array.

As array components become visible to udev and cause it to run mdadm --incremental on them, mdadm progressively adds them to the array. When the final device is added, mdadm will start the array. This makes the software RAID array and its contents visible to udev and to systemd, where it will be used to satisfy dependencies for things like /etc/fstab mounts and thus trigger them happening.

(There are additional mdadm udev rules for setting up device names, starting mdadm monitoring, and so on. And then there's a whole collection of general udev rules and other activities to do things like read the UUIDs of filesystems from new block devices.)

However, all of this only happens if all of the array component devices show up in udev (and show up fast enough); if only some of the devices show up, the software RAID will be partially assembled by mdadm --incremental but not started because it's not complete. To deal with this situation and eventually start software RAID arrays in degraded mode, mdadm's udev rules start a systemd timer unit when enough of the array is present to let it run degraded, specifically the templated timer unit mdadm-last-resort@.timer (so for md0 the specific unit is mdadm-last-resort@md0.timer). If the RAID array isn't assembled and the timer goes off, it triggers the corresponding templated systemd service unit, using mdadm-last-resort@.service, which runs 'mdadm --run' on your degraded array to start it.

(The timer unit is only started when mdadm's incremental assembly reports back that it's 'unsafe' to assemble the array, as opposed to impossible. Mdadm reports this only once there are enough component devices present to run the array in a degraded mode; how many devices are required (and what devices) depends on the specific RAID level. RAID-1 arrays, for example, only require one component device to be 'unsafe'.)

Because there's an obvious race potential here, the systemd timer and service both work hard to not act if the RAID array is actually present and already started. The timer conflicts with 'sys-devices-virtual-block-<array>.device', the systemd device unit representing the RAID array, and as an extra safety measure the service refuses to run if the RAID array appears to be present in /sys/devices. In addition, the udev rule that triggers systemd starting the timer unit will only act on software RAID devices that appear to belong to this system, either because they're listed in your mdadm.conf or because their home host is this host.

(This is the MD_FOREIGN match in the udev rules. The environment variables come from mdadm's --export option, which is used during udev incremental assembly. Mdadm's code for incremental assembly, which also generates these environment variables, is in Incremental.c. The important enough() function is in util.c.)

As far as I know, none of this is documented or official; it's just how mdadm, udev, and systemd all behave and interact at the moment. However this appears to be pretty stable and long standing, so it's probably going to keep being the case in the future.

PS: As far as I can tell, all of this means that there are no real user-accessible controls for whether or not degraded software RAID arrays are started on boot. If you want to specifically block degraded starts of some RAID arrays, it might work to 'systemctl mask' either or both of the last-resort timer and service unit for the array. If you want to always start degraded arrays, well, the good news is that that's supposed to happen automatically.


Comments on this page:
By x at 2022-10-13 18:12:22:

There is more "fun" with software raids. Assume software raid on few disks that are passed to KVM VM and assembled there as an array.

systemd/udev/mdadm on host will ... also assemble this array.

Somehow that doesn't corrupt filesystems on it (which is surprising).

Antworten