Contact us
Leave a message

Bitte benutzen:

Mein öffentlicher Kryptographie-Schlüssel


Mitglied bei

Sei nett zu Deines RasPis SD-Karte!

Man hört oft, dass SD-Karten irgendwann den Geist aufgeben, wenn sie in einem RasPi stecken, der 24/7 betrieben wird. Besonders, wenn z. B. für einen Dienst eine hohe Log-Stufe eingestellt ist, kommt es zu vielen Schreiboperationen in Verzeichnissen wie /var/log, was das Wear-Leveling der Karte offenbar schnell an seine Grenzen bringt. Daher wird empfohlen, solche stark beschriebenen Verzeichnisse als RAM-Disks zu (re)mounten, um sie vor dem Schreibstress zu schützen.

Leider haben viele der diesbezüglich im Internet kursierenden Tipps bei mir nicht funktioniert, da der Remount-Vorgang von /var/log dabei immer erst vorgenommen wurde, nachdem der Syslog-Daemon und/oder andere Dienste schon begonnen hatten, nach /var/log zu schreiben. Das Ergebnis war, dass entweder einige Dienste nicht mehr geloggt haben, nachdem ihr ursprüngliches Logfile verschwunden zu sein schien, oder dass das Remounten gar nicht funktionierte, sondern mit einem "device busy"-Fehler abgebrochen wurde.

Folgendes hat dann aber doch funktioniert:

So früh wie möglich remounten

Der Trick bestand darin, die fraglichen Verzeichnisse so früh wie möglich zu re-mounten -- also bevor es überhaupt zu größeren Schreibvorgängen kommt. So ruft das folgende systemd-Service-File ein Remount-Skript auf, noch bevor syslog startet:

[Unit]
Description=Convert heavily-used directories to RAM disks
Before=syslog.service

[Service]
Type=simple
ExecStart=/usr/local/sbin/mkramdisks

[Install]
WantedBy=default.target
/etc/systemd/system/ramdisks.service

Das mkramdisks script, welches von der Service-Unit aufgerufen wird, definiert alle Verzeihnisse, die ins RAM umgesiedelt werden sollen:

#!/bin/sh

/usr/local/sbin/convert2ramdisk /tmp
/usr/local/sbin/convert2ramdisk /var/log
/usr/local/sbin/convert2ramdisk /var/spool
/usr/local/sbin/convert2ramdisk /var/tmp
/usr/local/sbin/mkramdisks

Nicht verlieren, was man schon hat

Das eigentliche Arbeitspferd des mkramdisks-Skripts ist der folgende Code, der ein gegebenes Verzeichnis nicht nur als RAM-Disk remounted, sondern auch noch den gesamten Verzeichnisinhalt dorthin kopiert. Eine temporäre RAM-Disk dient dabei als, nun ja, temporärer Speicher während der Remount-Prozedur:

#!/bin/sh

SIZE=100m
TMPMP=/mnt/tmpramdisk
UMOUNT=

printUsage() {
    cat << EOT
convert2ramdisk - Move a directory to a RAM filesystem
-----------------------------------------------------------------------
Usage: convert2ramdisk [options] <dir>
with possible options:
m <path> : Temporary mountpoint. [$TMPMP]
s <size> : RAM disk size. [$SIZE]
u        : Unmount RAM disk.
EOT
}

while getopts "s: u ?" option; do
    case $option in
        s)  SIZE=${OPTARG};;
        u)  UMOUNT=1;;
        \?) printUsage
            exit 0;;
        * ) printUsage
            exit 1;;
    esac
done

shift $((OPTIND-1))
OPTIND=1

if [ $# -ne 1 ]; then printUsage; exit 1; fi

if [ ! -e "$TMPMP" ]; then
    mkdir -p "$TMPMP"
fi

DIR=$(readlink -f "$1")

if [ -z "$UMOUNT" ]; then

    mount -t tmpfs -o defaults,noatime,nosuid,mode=0755,size=$SIZE tmpfs "$TMPMP"
    cp -a "$DIR/." "$TMPMP"
    mount -t tmpfs -o defaults,noatime,nosuid,mode=0755,size=$SIZE tmpfs "$DIR"
    cp -a "$TMPMP/." "$DIR"
    umount "$TMPMP"

else

    mount -t tmpfs -o defaults,noatime,nosuid,mode=0755,size=$SIZE tmpfs "$TMPMP"
    cp -a "$DIR/." "$TMPMP"
    umount "$DIR"
    cp -a "$TMPMP/." "$DIR"
    umount "$TMPMP"

fi
/usr/local/sbin/mkramdisks