Use systemd services instead of sleep hooks.

This commit is contained in:
ghost 2025-07-13 20:57:38 +02:00
parent 86cfe8af58
commit afebe67937

View File

@ -14,6 +14,16 @@ In diesem Artikel wird beschrieben, wie CIFS-Netzwerkfreigaben mit Hilfe von sys
Dies wird am Beispiel eines `SMB` Servers im lokalen Netzwerk erleutert.
> [!NOTE]
> Diese Anleitung berücksichtigt unveränderliche (immutable) Distributionen wir SteamOS oder Fedora Atomic Desktops.
> Daher werden ausschließlich systemd Services genutzt und auf systemd Hooks verzichtet, da diese in immutablen Verzeichnissen definiert werden.
> Die Verwendung einer immutable Distribution führt in einigen Fällen zu einer anderen Verzeichnisstruktur. Diese werden in dieser Anleitung verwendet.
> Die folgenden Pfade würden bei einer traditionellen Distribution abweichen:
> | Immutable | Standard |
> | ----------------------- | ----------------------- |
> | /var/mnt | /mnt |
> | /var/usrlocal/bin | /usr/local/bin |
## Anleitung
### Schritt 1: Anmeldedaten sicher speichern
@ -182,7 +192,7 @@ exit 0
Das Skript ausführbar machen:
```bash
sudo chmod +x /usr/local/bin/mounts-connect.sh
sudo chmod +x /var/usrlocal/bin/mounts-connect.sh
```
@ -222,6 +232,7 @@ sudo systemctl daemon-reload
sudo systemctl enable mounts-connect.service
```
## CIFS/SMB Mounts und Standby
Nach dem Standby (Suspend-to-RAM) verlieren die Mounts manchmal die Verbindung, was dazu führt, dass Dolphin und andere Programme beim Zugriff „einfrieren“ und die Verbindung zu den SMB-Shares schließlich fehlschlägt.
@ -230,34 +241,66 @@ Während des Standbys wird die Netzwerkverbindung getrennt. Nach dem Aufwachen i
Systemd-automount erkennt den Verbindungsverlust nicht immer und versucht weiterhin, den Mount zu nutzen, was zu langen Timeouts führt
### Lösung:
Die robusteste Methode ist, die Mounts beim Suspend automatisch auszuhängen und nach dem Resume neu einzuhängen. Dies kann mit `systemd-Sleep-Hooks` erreicht werden.
Das systemd-Subsystem `system-sleep` führt bei bestimmten Energiezustandswechseln des Systems alle Skripte im Ordner `/usr/lib/systemd/system-sleep/` (bzw. auf manchen Systemen `/lib/systemd/system-sleep/`) automatisch aus.
Die robusteste Methode ist, die Mounts beim Suspend automatisch auszuhängen und nach dem Resume neu einzuhängen. Hierzu können systemd Services als trigger das `suspend.target` verwenden. Hierzu müssen zwei Services erstellt werden:
- Unmount-Service mit `Before=suspend.target`
- Mount-Service mit `After=suspend.target`
Zum Wiederverbinden der Mounts verwenden wir das bereits zuvor erstellte `mounts-connect.sh` Skript.
```bash
sudo nano /usr/lib/systemd/system-sleep/mounts-reconnect.sh
```
```sh
#!/bin/bash
case "$1" in
pre)
umount -l /var/mnt/Dokumente
# weitere Mounts ergänzen
;;
post)
/var/usrlocal/bin/mounts-connect.sh
;;
esac
```
Das Skript ausführbar machen:
### Schritt 1: Unmount Service erstellen
```bash
sudo chmod +x /usr/lib/systemd/system-sleep/mounts-reconnect.sh
sudo nano /etc/systemd/system/mounts-disconnect.service
```
```ini
[Unit]
Description=Disconnect CIFS mounts before suspend
Before=suspend.target
[Service]
Type=oneshot
ExecStart=/usr/bin/umount -l /var/mnt/Dokumente
#ExecStart=/usr/bin/umount -l (weitere...)
[Install]
WantedBy=suspend.target
```
### Schritt 2: Bestehenden Trigger-Service erweitern
Der bestehende `mounts-connect.service` kann um den `After=suspend.target` Trigger erweitert werden:
```ini
[Unit]
Description=Trigger CIFS Automounts for Dolphin
-- After=network-online.target
++ After=network-online.target suspend.target
Wants=network-online.target
Before=graphical.target
[Service]
Type=oneshot
ExecStart=/var/usrlocal/bin/mounts-connect.sh
User=root
RemainAfterExit=yes
TimeoutStartSec=60
[Install]
-- WantedBy=multi-user.target
++ WantedBy=multi-user.target suspend.target
```
### Schritt 3: Services neu laden und aktivieren
```bash
sudo systemctl daemon-reload
sudo systemctl enable mounts-disconnect.service
sudo systemctl enable mounts-connect.service
```