Franks Raspberry Pi
Ein twitternder Raspberry Pi
aus Altlußheim am Rhein

Log-Dateien in eine Ramdisk! Teil 2

Das Verlagern des Verzeichnisses /var/log in eine tmpfs-Ramdisk wie im ersten Teil beschrieben funktioniert zuverlässig, das manuelle Anpassen des init-Scripts ist aber wenig elegant. Insbesondere wenn neue Dienste installiert werden, darf das Anpassen nicht vergessen werden. Es wäre doch schön, wenn sich das Script beim Herunterfahren des Raspberry Pi merken könnte, welche Verzeichnisse vorhanden sind und diese beim Start einfach wieder anlegen würde.
 
Die Betonung liegt dabei auf "Verzeichnisse", denn die Dateien darin möchte ich eigentlich nicht wieder haben. Ein einfaches "tar" fällt also aus, oder habe ich einen speziellen Parameter übersehen, der alle Dateien weglässt und nur die Verzeichnisstruktur in das Archiv übernimmt? "tar" an sich wäre eigentlich gut geeignet, denn - als root gestartet - übernimmt es automatisch Eigentümer und Berechtigungen von Verzeichnissen, sowohl beim Erstellen des Archivs als auch beim Auspacken.
 
Irgendwann bin ich dann über einen Forumsbeitrag gestolpert, der erklärte, wie man mittels rsync nur die Verzeichnisstruktur kopiert, die Dateien aber nicht. Heureka, die Zeile wird sofort geklaut...
 
Das neue init-Script kopiert beim Herunterfahren das Verzeichnis /var/log und alle Verzeichnisse darunter - ohne Dateien - in das Verzeichnis /tmp und baut dann aus der nun leeren Verzeichnisstruktur ein tar-Archiv. Beim Start wird dieses Archiv einfach nach /var ausgepackt, damit sind alle Verzeichnisse so wie vor dem Herunterfahren wieder vorhanden. Da die Verzeichnisstruktur nun bei jedem Herunterfahren gesichert wird, kann man auch neue Dienste installieren, die sich bei der Installation ein Verzeichnis in /var/log anlegen (in der Ramdisk) und dieses bei Start wieder erwarten...

Alles wieder zurück auf Los

Sollte die Lösung aus dem ersten Teil schon aktiv sein, dann wieder deaktiveren:
In /etc/fstab die Zeile für /var/log wieder auskommentieren
# tmpfs for some dirs
#tmpfs           /var/log        tmpfs   defaults,noatime,mode=0755 0       0
und die Verwendung des bisherigen ramlog-Scripts stoppen
root@rpi1:/etc/init.d# update-rc.d ramlog remove
Dann neu booten, damit ist /var/log wieder auf der SD-Karte.

Das neue Script

Das neue Script sieht nun so aus
#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          ramlog
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# X-Start-Before:    rsyslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Create directories in /var/log
# Description:       Create directories in /var/log
### END INIT INFO

TARFILE="log.tar"
VARPATH="/var"

case "$1" in
start)
        cd $VARPATH
        if [ -f $TARFILE ]; then
                tar xf $TARFILE
        fi
        ;;

stop)
        cd $VARPATH
        /usr/bin/rsync -a -f"+ */" -f"- *" log/ /tmp/log
        cd /tmp
        /bin/tar cf $VARPATH'/'$TARFILE log/
        rm -r log
        ;;

*)
        echo "Usage: /etc/init.d/ramlog {start|stop}"
        exit 1
        ;;
esac

exit 0
Die Abhängigkeitserklärung ist auf den rsyslogd reduziert, der wird sowieso von fast allem und jedem gebraucht, wenn das Script vor diesem ausgeführt wird, dann sollte das funktionieren. Jetzt wieder dem init das Script beibringen
root@rpi1:/etc/init.d# update-rc.d ramlog defaults
und die Zeile für /var/log in /etc/fstab wieder aktivieren
# tmpfs for some dirs
tmpfs           /var/log        tmpfs   defaults,noatime,mode=0755 0       0
und schon ist alles fertig. Noch ist /var/log auf der SD-Karte, beim Herunterfahren wird die Verzeichnisstruktur gesichert und dann beim nächsten Start in die dann vorhandene Ramdisk in /var/log entpackt.

Kommentare und Meinungen sind herzlich willkommen, bitte via Twitter.

Impressum & Datenschutzerklärung