Bash | Erkennung von RAM-Disk | Pfad zur RAM-Disk finden

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo!

    Ich schreibe gerade an einem Bashscript und möchte eine eventuell vorhandene RAM-Disk im System erkennen, die man sich erstellt hat.

    Mein 1. Weg:

    Code
    df | grep tmpfs | grep -v "/dev\|/sys\|/run\|log" | awk '{print $6}'

    Übrig bleibt die eventuell vorhandene RAM-Disk oder als Ausgabe halt nichts. Ich weiß aber nicht, ob es noch andere Konstellationen als dev | sys | run | log für Einträge einer RAM-Disk gibt. In einem solchen Fall würde das dann (ungewollt) mit angezeigt werden.

    Mein 2. Weg:

    Code
    cat /etc/fstab | grep tmpfs | awk '{print $2}'

    Das halte ich im Moment für die bessere Variante.

    Verbesserungsvorschläge?

    Seht ihr noch andere Möglichkeiten um sicher zum Ziel zu kommen?

    Viele Grüße,

    Peter

  • Bash | Erkennung von RAM-Disk | Pfad zur RAM-Disk finden? Schau mal ob du hier fündig wirst!

  • Am besten einfach ausschließlich die Einträge filtern, die mit tmpfs anfangen.

    Mit egrep kann man reguläre Ausdrücke verwenden.

    Das Zeichen ^ steht für den Anfang.

    Wenn man also eine Zeile sucht, die mit tmpfs anfängt:

    Code: tmpfs - vorhanden
    cat /etc/fstab | egrep ^tmpfs | awk '{print $2}'

    Bei mir gibt es keine Ausgabe, da ich kein mountpoint mit tmpfs in meiner fstab habe. Aber:

    Code: tmpfs - aktuell eingehangen
    cat /proc/self/mounts | egrep ^tmpfs | awk '{print $2}'

    Ausgabe auf einem Arch Linux (kein RPI):

    Zitat

    /dev/shm

    /tmp

    /run/user/1000

    Beim RPI werden sich die aktiven mounts unterscheiden.

    Wollte jetzt keinen RPI booten, um das zu testen.

    Bei mir wird z.B. durch systemd /tmp eingehängt.

    Code
    /lib/systemd/system/tmp.mount

    Nach Durchsicht der Dokumentation bin ich noch drauf gekommen, dass bei der fstab die Zeile mit none anfängt, wenn es sich um tmpfs handelt.

    Code: Beispiel
    none    /tmp    tmpfs   size=1g            0 0

    Dann bin ich zu folgendem regex gekommen:

    Code
    cat /proc/self/mounts | egrep "^(tmpfs|none.+tmpfs)" | awk '{print $2}'

    Useless use of ? has been detected.

    grep akzeptiert nach dem Muster einen Pfad zu einer Datei.

    Deswegen braucht man nicht unbedingt cat, es seiden man will zur BSD kompatibel sein.

    Bin mir nicht so sicher, ob das bei der bsd-Version auch funktioniert.

    Code
    egrep "^(tmpfs|none.+tmpfs)" /proc/self/mounts | awk '{print $2}'

    Mit der fstab geht es auch.

    AWK kann bestimmt auch regex.

    Code
    awk '/^(tmpfs|none.+tmpfs)/ {print $2}' /proc/self/mounts
    awk '/^(tmpfs|none.+tmpfs)/ {print $2}' /etc/fstab

    Man könnte jetzt noch die Ergebnisse in einem Array speichern, aber das scheint in der Bash eine Art Wissenschaft zu sein.

    Hier schreibt jemand sehr viel darüber: https://stackoverflow.com/questions/1058…201229#45201229

    Einer der Gründe, wieso ich Python gelernt habe.

  • Ich würde da vermutlich über mount oder findmnt "greppen", denn in der fstab oder andere Wege muss das Laufwerk ja nicht zwangsläufig eingehängt sein.

    Das aber nur falls das eine Rolle spielen sollte.

  • der Vollständigkeit halbe sei noch gesagt, dass man auch RAM-Disks mit anderen Dateisystemen als tmpfs erstellen kann, siehe Link.

    Ich finde Methode 3 (ramfs) praktisch und habe mir eine Desktop Datei in das Autostart Verzeichnis gelegt, welche eine ramfs RAM-Disk anmeldet. Über Swap brauche ich mir keine sorgen machen, da deaktiviert. In der RAM-Disk landen i.d.R. temporäre Downloads, die (wenn nötig) auch dort entpackt werden. Das ist schnell und schont die SD Karte. Allerdings bin ich die RAM-Disk von Amiga OS gewöhnt und brauche sie vielleicht deshalb. :)

    Ich würde da vermutlich über mount oder findmount "greppen"

    Oder einfach findmnt device|mountpoint? Hier wird 0 oder 1 zurückgegeben, wenn angemeldet oder nicht. Da braucht man dann nichts weiter machen, wenn ich es richtig sehe.

  • Vielen Dank für die Vorschläge und Ideen. Ich habe alles mal durchprobiert.

    Bei den Wegen über mount und findmnt habe ich das gleiche Problem wie über meinen Weg1 (mit df), sprich es kommen noch weitere Einträge (z.B. /dev/shm, /run, usw). Die kann man zwar greppen, aber da könnten sich andere Varianten druntermischen, die ich nicht kenne bzw. neu hinzukommen.

    Ich habe mich daher für den Weg über die fstab entschieden.

    Am einfachsten fand ich vom User Tell die Version mit awk:

    Code
    awk '/tmpfs/ {print $2}' /etc/fstab

    Das sollte ein Großteil abdecken. Im schlimmsten Fall wird die RAM-Disk halt nicht erkannt. Das ist mir lieber als wenn was falsch erkannt wird.

    daxb

    ramfs wäre auch möglich, aber wohl eher selten anzufinden. ramfs hatte auch den Nachteil, dass die RAM-Disk keine feste Größe hat, was beim Raspberry schnell nach hinten losgehen kann.

    Viele Grüße,

    Peter

    Einmal editiert, zuletzt von Peter0311 (15. Juni 2022 um 14:20)

  • daxb So oder z.B. findmnt -t tmpfs sollte auch funktionieren, kann das aber gerade nicht testen.

    Da werden alle tmpfs gelistet. Aber das will Peter0311 nicht, wenn ich es richtig verstanden habe. findmnt mountpoint hingegen fragt nur den Mountpunkt ab und gibt hier 0 oder 1 zurück (echo $?). Je nachdem ob die Ram-Disk angemeldet ist, oder nicht.

    Der Mountpunkt und die Anmeldung der Ram-Disk liegt ja voll in der Hand (Kontrolle) von Peter0311. Es muss also nur das abgefragt werden und nicht eine Liste aller tmpfs. Welche dann umständlich untersucht werden muss.

    Peter0311 Mein Hinweis auf ramfs sollte keine Empfehlung für dich sein. Was du benutzt sei natürlich dir überlassen. Es kommt ja immer drauf an, welchen Anwendungszweck man verfolgt.

  • Wenn der Mountpoint bekannt ist, dann ist es ja witzlos, weil man da ja weiß wo man suchen muss. Aber die Quelle würde funktionieren, also findmnt none. :)

    Die Suche mit awk '/tmpfs/ {print $2}' /etc/fstab ist m.M.n. auch nicht besoners zuverlässig, weil man damit nur die /etc/fstab durchsucht und die anderen Möglichkeiten zu mounten vernachlässigt.

    framp Das wird so nicht funktionieren, bzw. wird genau das ausgelassen, was man eigentlich haben will. Mit ... | grep ^none statt grep ^tmpfs würde es wieder passen. ;)


    //Edit

    Das muss ich doch gleich mal testen.

  • Oh! Am Ende sogar findmnt mit bestem Ergebnis! 8o

    //Edit Mit tmpfs als SOURCE funktioniert das nun wieder nicht. :shy:

  • Wenn der Mountpoint bekannt ist, dann ist es ja witzlos, weil man da ja weiß wo man suchen muss.

    Eben. Wenn man die RAM-Disk selber anlegt, dann ist der Mountpunkt bekannt. Und genau das ist doch der Fall, wenn ich den ersten Satz (Beitrag 1) richtig verstanden habe:

    Ich schreibe gerade an einem Bashscript und möchte eine eventuell vorhandene RAM-Disk im System erkennen, die man sich erstellt hat.

    Und das "eventuell vorhanden" heisst für mich, dass es "nur" darum geht, zu erkennen ob die RAM-Disk angemeldet ist, oder nicht. Vielleicht kann Peter0311 hier aufklären.

  • Peter0311 hier aufklären

    Ob RAM-Disk und wenn ja, wo gemountet, ist nicht bekannt.

    Das Script schreibe ich zwar für mich, wollte es aber hier im Forum veröffentlichen, damit es auch andere bei Bedarf nutzen können. Und daher versuche ich das Script so zu schreiben, dass es vieles im System selbst erkennt und der User nicht fummeln muss.

    Kurz zum Hintergrund:

    Das Script zeigt beim Einloggen über SSH sehr gebündelt die Eckdaten vom Raspberry an, sowie überprüft, ob Werte zu hoch (z.B. CPU-Temperatur, Load, belegter RAM und Speicher) sind.

    So sieht die Ausgabe auf einem frisch installierten System (Pi4 m. 4GB RAM, SD-Karte, WLAN) aus:

    Und so auf einem System (Pi4 m. 8GB RAM, SSD, LAN) mit 3. Partition, RAM-Disk, usw., sowie Pi-Hole installiert ist:

    Es ist das gleiche Script, sprich es passt sich an.

    Testen kann ich nur auf einem Pi4 (2GB, 4GB u. 8GB) und einem Zero2. Ältere Pis habe ich leider nicht mehr.

    Viele Grüße,

    Peter

    5 Mal editiert, zuletzt von Peter0311 (16. Juni 2022 um 14:20)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!