Fragen, Anregungen usw bitte im Diskussions-Thread stellen!
Das ständige Schreiben in /var/log/ kann die Lebenszeit einer SD negativ beeinflussen, insbesondere wenn man den Mini-Rechner permanent laufen lässt - deshalb würde ich hier gerne einige Möglichkeit vorstellen um /var/log in ein sogenannten tmpfs Bereich auszulagern
sowie ein paar weitere Modifikationen um nicht unbedingt alles zu loggen (teilweise wird auch einiges doppelt geloggt)
Allerdings hat tmpfs für /var/log/ auch einige Nachteile:
- tmpfs liegt im RAM, wovon der RaspberryPI nicht allzuviel hat - es verbraucht aber nur soviel Ram wie tatsächlich belegt ist (Vorteil gegenüber ramfs) wenn allerdings kein freier Ram mehr zur Verfügung steht würde tmpfs auf den SWAP ausweichen und der wiederum befindet sich auf der SD..
- tmpfs ist flüchtig - das heisst die Daten sind nach dem ausschalten oder reboot komplett weg.. Das mag für manche nicht schlimm sein, allerdings gibt es in /var/log/ einige Dateien und Verzeichnisse die nicht automatisch erzeugt aber von einigen Diensten benötigt werden - da müsste es also ein Script geben was sich bei Systemstart darum kümmert...
Desweiteren wird es bei einem ungewollten Neustart schwer irgendwelche Probleme dann noch nachzuvollziehen - also bräuchte man eigentlich auch ein Script was /var/log/ regelmässig sichert
Einfach nur über /etc/fstab ein tmpfs für /var/log/ zu erzeugen ist keine gute Idee, da dann keine Verzeichnisse angelegt werden die aber von einigen Diensten benötigt werden um Logfiles schreiben zu können - auch Dateirechte sind wichtig damit einige Dienste überhaupt ihre Logs beschreiben; es gibt sogar 2 Dienste die ihre Logfiles nicht selber erstellen und somit zum Beispiel die "zuletzt angemeldeten Benutzer" nicht mehr protokolliert werden würden.
Deshalb wäre es sinnvoller mein weiter unten gezeigtes varlog Script zu verwenden.
Nun gibt es bekanntlich mehrere Wege etwas umzusetzen, ich gehe erstmal nur auf einen ein (da ich auch gleich Zubett mus :D)
Ich gehe nun erst mal davon aus das ihr Raspbian nutzt - inwiefern das hier auch für OpenELEC oder Raspbmc zutrifft müsste erst noch herrausgefunden werden
Also zunächst müsste man sich darüber im klaren werden wann bzw wie oft man /var/log/ sichert.
Ich denke das ein mal jeden Tag reichen sollte - zusätzlich richten wir aber auch ein Script ein was beim herunterfahren ebenfalls eine Sicherung erstellt sowie beim hochfahren die Sicherung von /var/log/ wiederherstellt..
- Script erstellen:
nano /etc/init.d/varlogBash
Display More#!/bin/bash ### BEGIN INIT INFO # Provides: varlog # Required-Start: $local_fs # Required-Stop: $local_fs # X-Start-Before: $syslog # X-Stop-After: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop tmpfs logfile saving ### END INIT INFO # # varlog This init.d script is used to start tmpfs logfile saving and restore. # varlogSave=/var/save.log/ [ ! -d $varlogSave ] && mkdir -p $varlogSave PATH=/sbin:/usr/sbin:/bin:/usr/bin function _save() { if [ -x "$(which rsync)" ]; then rsync -a --delete /var/log/ ${varlogSave} else cp -Rpu /var/log/* $varlogSave fi sync } case $1 in start) echo "*** Starting tmpfs file restore: varlog." if [ -z "$(grep /var/log /proc/mounts)" ]; then echo "*** mounting /var/log" _save varlogsize=$(grep /var/log /etc/fstab|awk {'print $4'}|cut -d"=" -f2) [ -z "$varlogsize" ] && varlogsize="70M" mount -t tmpfs tmpfs /var/log -o defaults,size=$varlogsize chmod 775 /var/log fi cp -Rpu ${varlogSave}* /var/log/ ;; stop) echo "*** Stopping tmpfs file saving: varlog." _save umount -f /var/log/ ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac exit 0
Bash
Display More#!/bin/bash ### BEGIN INIT INFO # Provides: varlog # Required-Start: $local_fs # Required-Stop: $local_fs # X-Start-Before: $syslog # X-Stop-After: $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start/stop logfile saving ### END INIT INFO # # varlog This init.d script is used to start logfile saving and restore. # varlogSave=/var/save.log/ [ ! -d $varlogSave ] && mkdir -p $varlogSave PATH=/sbin:/usr/sbin:/bin:/usr/bin case $1 in start) echo "*** Starting tmpfs file restore: varlog." if [ -z "$(grep /var/log /proc/mounts)" ]; then echo "*** mounting /var/log" cp -Rpu /var/log/* $varlogSave varlogsize=$(grep /var/log /etc/fstab|awk {'print $4'}|cut -d"=" -f2) [ -z "$varlogsize" ] && varlogsize="70M" mount -t tmpfs tmpfs /var/log -o defaults,size=$varlogsize chmod 755 /var/log fi cp -Rpu ${varlogSave}* /var/log/ ;; stop) echo "*** Stopping tmpfs file saving: varlog." #[ -n $varlogSave ] && rm -rf ${varlogSave}* #[ ! -d $varlogSave ] && mkdir -p $varlogSave cp -Rpu /var/log/* $varlogSave >/dev/null 2>&1 sync umount -f /var/log/ ;; *) echo "Usage: $0 {start|stop}" ;; esac exit 0
- Script ausführbar machen:
- Script bei Systemstart so früh und beim herunterfahren so spät wie möglich ausführen:
- Für ein Linux älter als Jessie: Script in den Runlevel eintragen sodass es bei starten und herunterfahren des Systems ausgeführt wird:
- Für Jessie oder neuer => Beitrag#49
- Für ein Linux älter als Jessie: Script in den Runlevel eintragen sodass es bei starten und herunterfahren des Systems ausgeführt wird:
- Nun sorgen wir dafür das /var/log/ erstmalig gesichert wird:
- Bevor wir nun "start" ausführen eine kurze Erklärung was /etc/init.d/varlog macht:
Durch den " stop " Parameter werden alle Dateien und Verzeichnisse inkl. deren Datei-Rechte/Besitzer von /var/log/ nach /var/save.log/ kopiert.
Durch den " start " Parameter wird erst geprüft ob tmpfs bereits für /var/log gemounted wurde und falls nicht wird /var/log/* nach /var/save.log/ kopiert und /var/log/ als tmpfs mit 70M (Megabyte) eingehängt (über das vorhandene)..
Anschliesend werden alle Dateien und Verzeichnisse inkl. deren Datei-Rechte/Besitzer von /var/save.log/ nach /var/log/ kopiert.Man kann auch in /etc/fstab eine Zeile einfügen worüber die maximale Grösse fürs tmpfs von /var/log festgelegt wird, das würde das Script dann auch auslesen:
Nun starten wir das Script damit tmpfs für /var/log eigehängt wird:
Somit würde nun die SD schon mal (vorallem im Dauerbetrieb) entlastet werden
Wichtig hierbei ist allerdings dass wenn der RPI crashen sollte, also nicht regulär herunter fährt, sämtliche neu geschriebenen Daten weg sind - tmpfs ist flüchtig. Also wenn möglich das System immer normal herunter fahren ( halt oder poweroff oder shutdown -r now oder reboot usw)
Nun zu dem Problem das der RaspberryPI nicht immer sauber herunter gefahren wird - sondern oft einfach nur der Netzstecker gezogen wird:
Dazu erstellen wir uns einen crontab Eintrag - da gäbe es nun 2 Möglichkeiten:
- Entweder es wird die crontab des root Benutzers verwendet: sudo crontab -e
#varlog - Taeglich um 05:00
0 5 * * * /etc/init.d/varlog stop && sleep 2 && /etc/init.d/varlog start >/dev/null 2>&1
- Oder es wird die System-Crontab verwendet: nano /etc/crontab
#varlog - Taeglich um 05:00
0 5 * * * root /etc/init.d/varlog stop && sleep 2 && /etc/init.d/varlog start >/dev/null 2>&1
ACHTUNG: Auf diese Anpassung würde ich aber wenn möglich verzichten da dass kontraproduktiv wäre, das würde die SD wieder nur unnötig belasten!
Optimierungen:
Jetzt gäbe es noch ein paar weitere Probleme, das aber nicht unbedingt nur tmpfs betrifft:
- Der syslog Daemon schreibt einige Log-Dateien sofort und andere wiederrum Zeitverzögert. Der Sinn ist, dass Systemrelevante Informationen sofort in Stein gemeißelt werden (Debugging Informationen) während unwichtigere Infos ruhig verzögert geschrieben werden können..
Welche Log-Datei wie behandelt wird erkennt man in der /etc/syslog.conf an dem führenden "–" vor der Log-Datei. Alle Dateien mit "–" werden verzögert geschrieben.
- (r)Syslogd generiert auch regelmässig 'MARK' timestamp Einträge in den Logs was man auch abschalten kann/sollte und zwar über die Datei /etc/default/syslogd (oder /etc/default/rsyslog) indem man den einen Eintrag ergänzt zu:
- Zum einen ist (zumindest Debian bzw Raspbian) standardmässig so konfiguriert das die letzten 4 Logdateien behalten werden, das letzte ungepackt mit Dateiendung ".0" und alle älteren werden mit gzip gepackt. Das kann bei einer begrenzten Grösse für /var/log/ problematisch werden..
Das wird über die Datei /etc/logrotate.d/rsyslog geregelt aber ausserdem wird über die Datei auch festgelegt was in welche Logdatei geschrieben werden soll, was auch den eingangs erwähnten doppelten Eintrag verursacht und zwar beinhaltet /var/log/messages , /var/log/syslog sowie /var/log/kern.log nahezu identisch Einträge.
Über die Datei kann auch eingestellt werden wieviele Backup Dateien behalten werden sollen usw.
Weitere Details kann man sich über die manual-pages anzeigen lassen ( man logrotate ) oder hier nachlesen: http://wiki.ubuntuusers.de/Logdateien
- Eine weitere Optimierung wäre auch /etc/fstab um folgende Optionen zu erweitern: noatime,nodiratime,commit=120 sodass es zum Beispiel so aussehen würde:Code
proc /proc proc defaults 0 0 /dev/mmcblk0p1 /boot vfat defaults,noatime,nodiratime,commit=120 0 2 /dev/mmcblk0p2 / ext4 defaults,noatime,nodiratime,commit=120 0 1 # a swapfile is not a swap partition, so no using swapon|off from here on, use dphys-swapfile swap[on|off] for that
- Eine weitere Optimierung bzw Reduzierung der Schreibzugriffe wäre für /tmp/ ebenfalls tmpfs zu erzeugen, da dort zum Beispiel bei jedem SSH Zugriff eine temporäre Datei erzeugt wird, aber auch weitere Dateien ausgelagert werden.. Das aktiviert man ebenfalls über /etc/default/tmpfs:
- Dann müssen wir noch RamRun und RamLock aktivieren:Code
sed -i /etc/default/rcS -e "s/RAMRUN=no/RAMRUN=yes/" sed -i /etc/default/rcS -e "s/RAMLOCK=no/RAMLOCK=yes/"
RAMRUN bewirkt dass beim Bootvorgang alles in /var/run/ belassen wird und nicht aufgeräumt, und /var/run wird dadurch auch in tmpfs abgelegt
Das gleiche gilt auch für RAMLOCK bezüglich /var/lock/
RAMRUN/RAMLOCK Hintergrund:Adding RAMRUN=yes and RAMLOCK=yes to /etc/default/rcS will make Debian put your /var/run and /var/lock in a tmpfs instead of on disk.
RAMRUN:
Make /var/run/ available as a ram file system (tmpfs).
Will also disable cleaning of /var/run/ during boot.
Set to 'yes' to enable, to 'no' to disable.
The size of the tmpfs can be controlled using TMPFS_SIZE and RUN_SIZE in /etc/defaults/tmpfs.RAMLOCK:
Make /var/lock/ available as a ram file system (tmpfs).
Will also disable cleaning of /var/lock/ during boot.
Set to 'yes' to enable, to 'no' to disable.
The size of the tmpfs can be controlled using TMPFS_SIZE and LOCK_SIZE in /etc/defaults/tmpfsGuck auch mal in die Datei /etc/default/tmpfs , da kannste auch noch ein paar Sachen einstellen
Weitere Optimierungen (auch bezüglich Logrotate) findet ihr > hier <
Bekannte Probleme:
Seltsamerweise kommt es auf manchen Systemen vor das apache2 früher gestartet wird als varlog aber das dann nicht funktioniert weil für apache2 einige Verzeichnisse fehlen..
Ein Workaround wäre folgendes:
#apache2 fix
for i in $(ls /etc/rc?.d/S??apache2) ; do mv -f $i $(dirname $i)/S99apache2; done
#varlog fix
for i in $(ls /etc/rc?.d/S??varlog) ; do mv -f $i $(dirname $i)/S01varlog; done
Links:
http://wiki.ubuntuusers.de/SSD/Auslagerung
https://help.ubuntu.com/community/SwapFaq
Changelog:
12.08.2014: Crontabeintrag für "varlog start" angepasst