Systemd unint erstellen die nach dem Unmount zum Shutzdown aufgeführt wird

Hallo!

Ich möchte auf meinem Computer eine Art RAM-Disk nachahmen, wie ich sie vom Amiga damals kenne. tmpfs im RAM kann ich dafür nicht verwenden, weil dazu zu viele Daten anfallen. Damit meine ich, dass der Inhalt zweier Ordner (Desktop und Downloads) auf SSD liegt, aber bei jedem Reboot oder shutdown gelöscht wird, als würden die dortigen Dateien im RAM liegen - was sie aber real nicht tun, weil der RAM zu klein ist.

Dazu muss die entsprechende Partition die beide Ordner enthält also bei jedem Reboot und Shutdown formatiert werden (weil eine Formatierung deutlich schneller geht, als zigtausende Dateien zu löschen).
Wie muss ich eine Unit definieren, dass sie ausgeführt wird, nachdem systemd die Partitionen beim Neustart/Shutdown bereits unmounted hat?
Danke!

Verwende als Dateisystem tmpfs in der fstab.
Das verschwindet beim shutdown automatisch (weil es eine RAM-Disk ist :rofl: ).
:mag: tmpfs
:mag: systemd :teapot:

Ja, der Grund, dass ich es anders lösen möchte ist ntürlich der, dass ich keine Hunderte Gigabyte an RAM habe, was aber in den entsprechenden Ordnern schon gelegentlich anfällt. Durch die im Verhältnis zu den Resourcen überproportional gestiegenen Datenmengen geht das nicht mehr so. (Ich editiere das mal oben rein).

Ich sehe tausende Fragezeichen bei jedem der das liest. :grinning:
Tasten wir uns mal heran.
Schau mal hier
https://wiki.ubuntuusers.de/RAM-Disk_erstellen/
aber erst mal nur schauen ! und verrate uns welche Methode du bevorzugst.
Wie viel RAM hast du denn ?

Ich glaube du willst so was in der Art ?

Ich habe den ersten Post noch einmal bearbeitet. Hoffe ich konnte nun erklären, was ich erreichen möchte.

Ich möchte keine RAM-Disk und kein tmpfs verwenden - ich möchte, dass sich zwei Ordner, die sich auf einer SSD-Partition befinden aber genauso verhalten als wären sie eine RAM-Disk, indem sie bei jedem Reboot und Shutdow automatisch gelöscht werden (bzw. die zu Grunde liegende Partition formatiert wird, weil das wesentlich schneller und SSD-schonender geht als zigtausende Dateien zu löschen.) Eine echte RAM-Disk kann ich nicht verwenden, weil in diesen Ordnern des Öfteren mehrere Hundert Gigabyte an Daten liegen, und dafür mein RAM-Speicher natürlich nicht ausreicht.
:slight_smile:

Ah, es wird. Also soll

  1. Beim booten 2 Ordner angelegt werden
  2. Anschliessend der Inhalt von 2 Ordnern in diese 2 Ordner kopiert werden
  3. Beim herunter fahren diese 2 Ordner wieder gelöscht werden

Näher dran, aber nicht ganz: :slight_smile:
Das Ziel ist es nicht Daten zu sichern oder zurückzukopieren, sondern im Gegenteil, “Datenmüll” der sich in den beiden Ordnern “Downloads” und “Desktop” (also der Ordner, der den Inhalt der Arbeitsfläche mit den Desktopsymbolen enthält) ansammelt, automatisch zu löschen (als würden sich beide Ordner auf einer RAM-Disk befinden). Eine echte RAM-Disk kann nicht verwendet werden, weil dort gelegentlich einige hundert Gigabyte an Daten liegen.

  1. Beim Boot sollen zwei (leere) Ordner (“Desktop” und “Downloads”) von der Partition /dev/sdb5 per bind-mount nach /home/user/Schreibtisch (der Pfad ist ja im deutschsprachigen XFCE eingedeutscht) und /home/user/Downloads gemountet werden.

  2. So werden die beiden Ordner dann entsprechend ihres Pfades verwendet: Downloads aus Firefox bzw. Chrome landen in “Downloads” und der Inhalt des Ordners “Schreibtisch” entspricht den “Desktopsymbolen” von Caja (ja, ich habe aus Gründen von Thuna zu Caja gewechelt, aber das ist ja dabei nicht entscheidend)

  3. Wenn der Computer heruntergefahren oder rebootet wird, soll sdb5 formatiert werden, und anschließend die beiden Ordner Downloads und Desktop darauf neuerstellt werden, damit beide Ordner nach dem Reboot/Kaltstart wieder leer zum erneuten bind-mount zur Verfügung stehen.

x-systemd.makefs

The file system will be initialized on the device. If the device is not “empty”, i.e. it contains any signature, the operation will be skipped. It is hence expected that this option remains set even after the device has been initialized.

Note that this option can only be used in /etc/fstab, and will be ignored when part of the Options= setting in a unit file.

See systemd-makefs@.service(8).

wipefs(8) may be used to remove any signatures from a block device to force x-systemd.makefs to reinitialize the device.

systemd.mount

Also setzt du das und damit systemd es wieder initialisiert bei Start, musst du einen Service erstellen, der die Signatur beim Herunterfahren löscht. Siehe wipefs.

Hoffe, es hilft :wink:

So wie ich das verstanden habe, willst Du die Schreibvorgänge auf die SSD minimieren
indem Du die Dateien nicht einfach löschst oder unlink(st) - das ist Dir zu schreibaufwändig.

Statt dessen möchtest Du das Dateisystem selbt jedes mal neu erstellen.

Ich bin mir fast sicher, daß das ungefähr auf die gleiche oder sogar noch wesentlich größere Anzahl von Schreibvorgängen hinausläuft.
… zumindest wenn Du ext2/3/4 benutzt → das Dateisystem selbst zu erstellen erfordert so einige Schreibvorgänge …

Schau Dir mal im verbose Modus an was passiert, wenn Du ein ext… Dateisystem erstellst.

Ich weiß nicht ob Du durch die hier dargestellte Prozedur, die sich ja wohl doch als etwas sperrig zu implementieren erweist, irgendetwas sparst oder Deiner SSD wohler tust als mit simplem löschen.
Intuitiv sehe ich da keinen Vorteil.
Ich an Deiner Stelle würde das aber gern wissen bevor ich mir die Arbeit mache.

1 Like

Da kann ich mich anschließen, wenn es um das Ext-Dateisystem geht. Es wird jedes Mal komplett neu initialisiert, was bedeutet, dass das gesamte Schema neu angelegt wird, da EXT4 kein COW ist.

@Rekord
Sinnvoller wäre es vfat, exfat oder f2fs zu verwenden.

Geeigneter halte ich aber ein btrfs mit entsprechenden Subvolumes. Die Subvolumes können erstellt und eingehängt werden. Dann ein Service erstellen, der beim Herunterfahren das Subvolme löscht und neu erstellt. Man kann es mit wipefs vergleichen: Wenn ein Subvolume gelöscht wird, dann nur das Schema, nicht die Daten an sich. Die Daten werden einfach zum Überschreiben freigeben.
Aber das ist meine persönliche Meinung.

1 Like

Die Details darüber welches Filesystem, ob formatieren oder löschen usw. brauche ich nicht, das weiß ich selbst schon, danke.

Die Frage die ich beantwortet brauche ist:
Wie erstelle ich ein unit file so, dass es das darin angegebene Script started, sobald die Partitionen beim herunterfahren unmounted wurden. Ich habe ja bereits etwas experimentiert, aber merwürdiger Weise funktioniert es nur “manchmal”. Bei den meisten Reboots will es einfach nicht:

[Unit]
Description=Delete contents of deskdown for simulating Ramdisk

DefaultDependencies=no
Before=shutdown.target halt.target

# If your script requires any mounted directories, add them below: 
#RequiresMountsFor=/home /home/ladmin /deskdown /deskdown/downloads /deskdown/desktop

[Service]
Type=oneshot
#RemainAfterExit=true
#ExecStart=/bin/true
#ExecStop=/opt/scripts/cleardeskdown.sh
ExecStart=/opt/scripts/cleardeskdown.sh

[Install]
#WantedBy=multi-user.target
WantedBy=halt.target shutdown.target

Das ist gut! :sunglasses:

Könntest Du bitte Details teilen?

Vielleicht ist das die falsche Frage?

Vielleicht ist es einfacher, die Partition neu anzulegen und zu formatieren
wenn das System hochgefahren wird.

… statt sie zu löschen und neu anzulegen während das system runtergefahren wird

im übrigen wäre ich auch interessiert an Details zu:

… ich weiß das nämlich nicht - ich habe das nur vermutet und versucht herzuleiten :man_shrugging:

Ist neu anlegen des Dateisystems wirklich effektiver als löschen und wieder verwenden?

Du weißt das, sagst Du.
Ich weiß das nicht.

Kannst Du mir das was Du weißt erklären?

it may not be systemd’s task to on the fly delete and re create filesystems that it subsequently needs to operate - but which do not actually exist before it wants or needs to use them.

Nur ein Vorschlag, aber vielleicht schaust du dir mal systemd-tmpfiles an.

So eine Konfiguration würde dann so aussehen:

#Type Path                Mode User Group Age Argument
D     /deskdown/downloads 755  user user  -   -
D     /deskdown/desktop   755  user user  -   -

Im Grunde erstellt es den Ordner, falls nicht da und löscht den Inhalt des Ordners. Im Service müsstest du bei ExecStart systemd-tmpfiles --clean --remove ausführen. Das wäre die einfachste Methode, die mir einfallen würde. Aber ja, du willst ja “formatieren”, was aber keinen erwiesenen Mehrwert hat. :roll_eyes:

PS: versuch mal zusätzlich mit After=umount.target. Willst ja das ganze formatieren oder?

Um deine Neugier zu befriedigen: :slight_smile:
Ich verwende für die Partition f2fs mit folgenden Mountoptions:

(rw,noatime,lazytime,background_gc=on,discard,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6,alloc_mode=default,checkpoint_merge,fsync_mode=posix,discard_unit=block)

Das Löschen von einegen zigtausend bis hunderttausenden Files dauert manchmal locker eine halbe Stunde, die ich das Gerät dann beim Herunterfahren im Textmode warten lässt. Wegen der dabei anfallenden Schreiblast und der langen Dauern möchte ich die Partition lieber formatieren und die Ordner neu anlegen anstatt die Dateien zu löschen. Deshalb lasse ich sie lieber formatieren.

Dass es beim Herunterfahren erfolgen soll anstatt beim Hochfahren hat zwei Gründe:
-Einmal, damit das Hochfahren schneller geht, weil das ja wichtiger ist. Wenn man das Gerät einschaltet, dann möchte man es ja auch möglichst schnell verwenden und nicht unnötig lange warten.
-Und ausserdem geht es um den “Fatalismus”: ich habe nach Jahren der Nuztung moderen Betriebssysteme immer wieder gemerkt, dass sich bei mir inzwischen Terabytes an “Datenmüll” angesammelt haben, weil ich, wie noch damals vom Amiga gewohnt, auf dem Desktop arbeite. Ich arbeite sehr viel mit Modifikationen von Hardware, also custom BIOS, Firmware, Flashes, Hacks und Mods verschiedenster Geräte, von PCs, über Spielkonsolen, Router, IoT-Hardwares, bis hin zu etlichen obskuren Adaptern um zB C64-FloppyDrives am PC anzuschließen und eine Menge andere Teile in Bezg auf Retro-Hardware.
Dabei fallen haufenweise konvertierte und veränderte Dateien an. Wenn man dann nach ein paar Wochen seinen Desktop betrachtet haben sich schon wieder etliche Gigabytes an “Zwischenstadien” angesammelt, die man eigentlich nicht braucht.

Man kann dies ja theoretisch auf zwei Weisen angehen:
-Entweder man arbeitet ganz ordentlich und aufwendig, indem man genau hinschaut und überlegt was man noch braucht und was nicht, und räumt nach jeder Aktion immer händisch auf und löscht Alles, das man nicht mehr benötigt selbst.

-Oder aber, man kopiert einfach nur die Dinge die man für wirklich wichtig hält an einen “sicheren” Ort und verlässt sich darauf, dass der ganze Rest sich sowieso von selbst erledigt. Dies ist genau die Arbeitsweise, wie ich sie damals vom Amiga noch in mir habe, weil ich dort stets in der RAM-Disk gearbeitet habe. Letztere Arbeitsweise gefällt mir und erspart mir die ständige schwierige Entscheidung, welche Daten nun aufgehoben werden sollen und welche nicht - Alles was ich nicht wirklich für so wichtig halte, dass ich es selbst direkt nach einer Arbeit an einen sicheren Ort kopier eist weg. Und so funktioniert es für mich am Besten. Genau diesen Zustand möchte ich nun auch auf meinem Linux-Notebook wiederherstellen.
Im Gegensatz zu damals fallen aber heute beim Arbeiten halt Datenmengen an, die mein RAM nicht mehr aufnehmen kann. Der konsequente Vollzug dieser Arbeitsweise beinhaltet die Gewissheit, dass die Daten bereits nach dem Herunterfahren/Reboot weg sind - und nicht erst
nach dem nächsten Boot - das ist mir wichtig, denn sonst könnte man noch auf “verrückte” Ideen kommen, wie z.B. von einem anderen Bootdevice zu booten, um Daten die noch nicht gelöscht wurden zu “retten” bevor sie dann beim nächsten Boot doch gelöscht werden. Dies würde meinen Entscheidungsprozess und somit den gesamten Arbeitsablauf negativ beeinflussen. Dabei spielen noch eine Details eine Rolle um das Ganze logisch schlüssig zu machen, aber das wäre zu viel für hier und jetzt. Ich brauche es so um vernünftig weiterarbeiten zu können. Aber schon die sehr lange Wartedauer die ein Löschen der Dateien alleine dauert, macht es notwendig dies beim Herunterfahren zu erledigen, oder besser zu formatieren. :slight_smile:

Aber bitte nur zu, Stillen deiner Neugier verwenden :wink:
Ich möchte meine eigentliche Frage, die dieser Thread ja hoffentich lösen wird, nicht in einer Diskussion über Filesystem, Arbeitsweise usw. untergehen lassen!

Danke! Das schaue ich mir nachher mal an. Muss nun leider noch einmal ausser Haus!

Wenn du jetzt jeden Tag die SSD neu formatierst dann altern ja alle Flash Zellen gleich schnell.
Die SSD ist doch aber nicht immer voll.
Wear Leveling sorgt dafür das die Flash Zellen beim löschen und wieder beschreiben ein ausgeglichenes Verhältnis entsteht. Soll heissen es sorgt dafür das nicht eine Zelle nur 1x und die andere 1000x beschrieben wird. Es sorgt für ein 50/50 Verhältnis.
Was ich damit sagen will: Mit löschen anstatt formatieren erhöhst du die Lebensdauer deiner SSD erheblich.

das ist nur rhetorisch - keine Antwort nötig, aber:
auf einer SSD kann sowas SO lange dauern? … o.k. - hätt ich nicht gedacht

… so viel Zeug kann sich in so kurzer Zeit ansammeln? … Meine Güte … :slightly_smiling_face:

Ich stelle Deine Herangehensweise (in Anlehnung an die frühere Amiga RAM Disk) nicht (mehr) in Frage.
Obwohl die prime time des Amiga jetzt wohl schon einige Dekaden zurück liegt und man in der Zwischenzeit andere workflows … aber was rede ich :nerd_face:

Ich kann Dir aber auch bei der Umsetzung Deines Plans nicht helfen.

Cheers!

Bisher habe ich die Dateien löschen lassen. Da dies aber ewigst dauert, möchte ich auf Formatieren umstellen. Deshalb ist eine Änderung meiner vorhandenen Unit nötig um sie erst nach dem Unmounten auszuführen. Wäre toll, wenn das klappt mit " After=umount.target".

Woher hast du das denn eigentlich? Ich hatte schon Gegoogelt um eine Art “Ablaufplan” von systemd zu finden, welches Target wann stattfindet, aber nichts Passendes gefunden.

Da wirst du auch nichts finden, da sich alles auf deinem Rechner befindet. Was du “googlen” kannst, ist, wie man die Informationen findet.

$ systemctl list-dependencies systemd-poweroff.service 
systemd-poweroff.service
● ├─system.slice
○ ├─final.target
○ ├─shutdown.target
○ │ └─mkinitcpio-generate-shutdown-ramfs.service
○ └─umount.target
$ systemctl cat systemd-poweroff.service                                                                                                                                                                                                                                                                          ✔ 
# /usr/lib/systemd/system/systemd-poweroff.service
#  SPDX-License-Identifier: LGPL-2.1-or-later
#
#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[Unit]
Description=System Power Off
Documentation=man:systemd-poweroff.service(8)
DefaultDependencies=no
Requires=shutdown.target umount.target final.target
After=shutdown.target umount.target final.target
SuccessAction=poweroff-force

Im Grunde sind die Targets die Schritte, die abgelaufen werden. Und jedes Target hat Abhängigkeiten, die parallel abgearbeitet werden. Du musst einfach die Abhängigkeiten so setzten, sodass es im richtigen Zeitpunkt ausgeführt wird.

[Unit]
Requires=umount.target
After=umount.target
Before=shutdown.target final.target
#ExecStart=/usr/bin/wipefs --all /dev/sdXY
#Besser wäre (bin mir aber nicht sicher ob die UUID bestehen bleibt nach einem Wipe, aber sdXY kann sich bei jedem Start ändern):
ExecStart=/usr/bin/wipefs --all /dev/disk/by-uuid/<UUID>

In deiner fstab gibst du dann einfach die Option x-systemd.makefs mit an, damit systemd das besagte Dateisystem erstellt, falls nicht vorhanden.

Um die Ordner zu erstellen, nimmst du systemd-tmpfiles.

#Type Path                Mode User Group Age Argument
d     /deskdown/downloads 755  user user  -   -
d     /deskdown/desktop   755  user user  -   -

Dann hast du bei jedem Start ein frisches Dateisystem und Ordner werden erstellt.

Aber wie gesagt, regelmäßiges Formatieren einer SSD; davon ist generell abzuraten, auch wenn es schneller geht.

1 Like