Die SD-Karte beim Raspberry Pi schonen
Die SD-Karte beim Raspberry Pi schonen ist eine gute Idee, führen doch viele Schreibzugriffe dazu, dass sich die Lebensdauer der SD-Karte verkürzt. Da der Raspberry Pi eine SD-Karte als Festplatte einsetzt, die bspw. zum Schreiben der Logfiles oder beim Update der Zeitstempel des letzten Zugriffs für Dateien des darauf laufenden Linux Betriebssystems mächtig strapaziert wird, haben sich findige Köpfe ein Verfahren überlegt, die Logfiles in den Arbeitsspeicher zu verschieben und reduzieren damit die Anzahl der Schreibzugriffe deutlich. Bei meinem Raspberry Pi hatte ich anfänglich alle vier Monate die Aufgabe die SD-Karte zu erneuern. Einen sehr schöner Artikel über die im Folgenden beschriebenen Verfahren gibt es bei Lexxi.
Zeitstempel für den letzten Lesezugriff nicht mehr schreiben
Um das Schreiben der Zeitstempel für den letzten Lesezugriff abzustellen, editiert man die Datei /etc/fstab und ergänzt dort die Attribute ’nodiratime‘ und ’noatime‘.
/dev/mmcblk0p2 / ext4 defaults,nodiratime,noatime 0 1
Logdateien in den Arbeitsspeicher verlegen
Um Schreibzugriffe für die Logfiles deutlich zu reduzieren wird das Verzeichnis /var/log (dort stehen ja bekanntlich fast alle Logfiles) in einer Ramdisk verlegt. Damit wird die Anzahl der Schreibzugriffe reduziert, weil nur noch beim Herunterfahren die SD-Karte aktualisiert wird, die bringt aber auch den Nachteil mit sich, das bei einem Absturz des Raspberry Pi keine Log-Informationen zur Verfügung stehen, um diesen zu analysieren, denn diese Daten waren ja zuvor im Arbeitsspeicher.
Zur Einrichtung müssen folgende Pakete installiert werden:
sudo apt-get install rsync lsof
wget http://www.tremende.com/ramlog/download/ramlog_2.0.0_all.deb
sudo dpkg -i ramlog_2.0.0_all.deb
Die Konfiguration erfolgt in drei Schritten:
1. Editieren der Datei /etc/default/ramlog: Dort gibt man an wie viel Speicher für die Logfiles verwendet werden soll. Ich habe erst mal 20 MegaByte eingestellt (TMPFS_RAMFS_SIZE=20m). Da ich keine Datenbanken oder sonstige schwergewichtige Anwendungen auf dem Raspberry Pi betreibe scheint das zu reichen.
2. Verhalten des Syslog Daemons verändern: Damit der Syslog Daemon nicht zu früh startet ändern wir die Abhängigkeiten für den Start in dem wir in der Datei /etc/init.d/rsyslog ganz oben die Zeilen wie folgt ändern: # Required-Start: $remote_fs $time ramlog
Damit diese Einstellungen auch berücksichtigt werden führen wir einmal
# Required-Stop: umountnfs $time ramlogdpkg-reconfigure insserv
aus.
3. Starten des ramlog Dienstes und Reboot: Mit /etc/init.d/ramlog enable starten wir jetzt den ramlog Dienst. Gemäß Aussage des Autors sollte man zweimal neu starten bis sich ramlog eingerichtet hat. Dabei bitte die Ausgaben prüfen, ob es noch irgendwelche Fehler gibt.
Bei mir hat das alles wie am Schnürchen geklappt.
Hallo, vielen Dank für die Anleitung! Beim Anwenden ist mir Folgendes aufgefallen: Das aktuelle Raspian Stretch hat den Zeitstempel für den letzten Lesezugriff bereits deaktiviert, wobei die Angabe noatime bereits nodiratime beinhaltet (https://wiki.archlinux.org/index.php/fstab#atime_options).
Viele Grüße,
Reinhard
Hallo Reinhard,
danke für den Hinweis.
Viele Grüße, Hans
Hallo,
danke für die Anleitung!
Ich habe alles wie beschrieben gemacht, dazu hätte ich zwei Fragen:
Wie kann ich überprüfen, dass die log-files jetzt in einem RAM-Verzeichnis liegen (ich sehe keine Änderung in der /etc/fstab)?
Ich möchte mir während einer Testphase die log-files durch ein python-Skript regelmäßig perMail schicken, wo stehen diese Dateien im Verzeichnisbaum?
Mit freundlichen Grüßen
Uli
Hallo Uli,
in der Manpage steht
How it works and what it does:
1.
Ramlog starts among the first daemons (it depends on other daemons you have installed).
2.
Directory /var/log.hdd is created and hardlinked to /var/log.
3.
In case tmpfs (default) or ramfs is used, it is mounted over /var/log
If kernel ramdisk is used, ramdisk created in /dev/ram9 and it is mounted to /var/log, by default ramlog takes all ramdisk memory specified by kernel argument „ramdisk_size“.
5.
All other daemons are started and all logs are updated in ramdisk. Logrotate works on ramdisk as well.
6.
In case ramlog is restarted (by default it is one time per day), directory /var/log.hdd is synchronized with /var/log using rsync. Frequency of the automatic log saves can be controller via cron, by default, the ramlog file is placed into /etc/cron.daily
7.
On shutdown ramlog shuts among the last daemons.
8.
During ramlog stop phase files from /var/log.hdd are synchronized with /var/log
Then /var/log is unmounted, /var/log.hdd is unmounted as well and empty directory /var/log.hdd is deleted.
Hoffe das hilft Dir.
Gruß, Hans
hallo Hans, Danke für den Artikel!
ergänze bitte noch ein paar „sudo“ dann funktioniert das auch mit dem user pi. s. unten
Ich frage mich, wenn das system läuft kann ich ja auf der Ramdisk nach mögl. Fehlern im Log suchen. Vielleicht brauch ich das zurückschreiben der logs auf die sdcard nicht. Wie kann man das zurückschreiben verhindern?
Ich hab mir gleich mal ein script für die Einrichtung geschrieben.
#!/bin/bash
# filename : install_00_sdcardsave.sh
###########################################################
# Maßnahmen um die lebensdauer der SD-card zu verlängern
############################################################
#0. System aktualisieren
sudo apt-get update && sudo apt-get upgrade -y
############################################################
#1. Zeitstempel für den letzten Lesezugriff nicht mehr schreiben
#Achtung!
# – die Datei-/Ordnereigenschaft „Access-Zeitstempel“ kann dann nicht mehr für Auswertungen genutzt werden.
# – Erstellung-/Änderungszeitstempel werden aber weiterhin gesetzt
sudo sed -i ’s|^\/dev\/mmcblk0p2.*$|\/dev\/mmcblk0p2 \/ ext4 defaults,nodiratime,noatime 0 1|g‘ /etc/fstab
############################################################
#2. Logdateien in den Arbeitsspeicher verlegen
#- Nachteil: Pi muss immer sauber herunterfahren, damit die Log-Dateien wieder auf die SD-Card geschrieben werden
#2.1. Pakete installieren
sudo apt-get install rsync lsof -y
cd /var/install
wget http://www.tremende.com/ramlog/download/ramlog_2.0.0_all.deb
sudo dpkg -i ramlog_2.0.0_all.deb
#2.2.1 Editieren der Datei /etc/default/ramlog // RAM-Größe auf 20MB einstellen
sudo sed -i ’s|^TMPFS_RAMFS_SIZE=|TMPFS_RAMFS_SIZE=20m|g‘ /etc/default/ramlog
#2.2.2 Verhalten des Syslog Daemons verändern (/etc/init.d/rsyslog ramlog ergänzen),damit der Syslog Daemon nicht zu früh startet
sudo sed -i ’s|# Required-Start:.*$|# Required-Start: $remote_fs $time ramlog|g‘ /etc/init.d/rsyslog
sudo sed -i ’s|# Required-Stop:.*$|# Required-Stop: umountnfs $time ramlog|g‘ /etc/init.d/rsyslog
sudo dpkg-reconfigure insserv
#2.2.3. Starten des ramlog Dienstes und Reboot
sudo /etc/init.d/ramlog enable
#3. automatische Überprüfung mittels e2fsck nach x Tagen und y Mounts abschalten
# parameter s. „man tune2fs“
sudo tune2fs -i0 -c0 /dev/mmcblk0p2
#4. neustarten (evtl. dann noch ein zweitesmal!?)
sudo reboot
Hallo Michael,
danke für den Hinweis. Habe es ergänzt. Und danke für das Skript ist sicherlich hilfreich. Wenn Du die Logs nicht zurückschreiben willst, dann wäre es sicherlich eine Option einfach das Verzeicnis mit einem Schreibschutz zu versehen. Einen Parameter kenne ich nicht.
Hallo,
ich habe die Schritte einzeln durchgeführt und es scheint nicht so zu klappen wie gedacht. Auch nach mehrmaligen Neustarts leider nicht, siehe hier:
—————–%<—————–
pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/ramlog enable
[….] Enabling ramlog…update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
. ok
pi@raspberrypi:/etc/init.d $ sudo /etc/init.d/ramlog status
● ramlog.service – LSB: moves /var/log into ramdisk
Loaded: loaded (/etc/init.d/ramlog)
Active: failed (Result: exit-code) since Mon 2016-02-08 16:17:43 CET; 5min ago
Feb 08 16:17:42 raspberrypi ramlog[396]: ramlog: Previous shutdown/restart was unclean, some logs may be lost. … (warning).
Feb 08 16:17:43 raspberrypi ramlog[396]: ramlog: Previous shutdown/restart was unclean, some logs may be lost.Starting ramlog-tmpfs 2.0.0: /bin/cp: ‘/var/log.hdd/.’ and ‘/var/log/.’ are the same file
Feb 08 16:17:43 raspberrypi ramlog[396]: failed!
Feb 08 16:17:43 raspberrypi systemd[1]: ramlog.service: control process exited, code=exited status=1
Feb 08 16:17:43 raspberrypi systemd[1]: Failed to start LSB: moves /var/log into ramdisk.
Feb 08 16:17:43 raspberrypi systemd[1]: Unit ramlog.service entered failed state.
—————–%<—————–
Hat jemand einen Tipp wie ich es beheben und dann auch prüfen kann ob es funktioniert?
Danke und Gruß
Rene
Hallo Rene,
kannst Du uns noch ein bisschen mehr über Deine Systemugebung erzählen. Welches OS in welcher Version auf welchem Gerät.
Danke, Hans
Hallo Hans,
klar, gern.
—————–%<—————–
PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
NAME="Raspbian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=raspbian
ID_LIKE=debian
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
Linux version 4.1.17-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 – Linaro GCC 2014.03) ) #834 SMP Mon Feb 1 15:17:54 GMT 2016
—————–%<—————–
—————–%<—————–
———————————————–
RASPBERRY PI 2 SYSTEM INFORMATION
———————————————–
CPU current Frequency..: frequency(45)=600000000
CORE current Frequency.: frequency(1)=250000000
CORE current Voltage…: volt=1.2000V
SD-RAM CORE Voltage…: volt=1.2000V
SD-RAM IO Voltage…: volt=1.2000V
SD-RAM PHY Voltage…: volt=1.2250V
CPU current Temperature: temp=37.9'C
CODECS:
H264=enabled
MPG2=disabled
WVC1=disabled
Firmware Version…….: Feb 1 2016 17:51:17
Copyright (c) 2012 Broadcom
version b3dc56931507f355d503ea69397778643f7a3dc3 (clean) (release)
—————–%<—————–
Spannend waere auch zu wissen wie ich bei Bedarf ramlog erfolgreich entfernen kann, denn das habe ich bisher auch nicht hinbekommen.
—————–%<—————–
pi@raspberrypi:~ $ sudo service ramlog stop
pi@raspberrypi:~ $ sudo service ramlog disable
/etc/init.d/ramlog: 470: /etc/init.d/ramlog: nfo: not found
[FAIL] ramlog: get_state error: Multiple devices running at the same time. failed!
pi@raspberrypi:~ $ sudo apt-get remove ramlog
Reading package lists… Done
Building dependency tree
Reading state information… Done
The following packages will be REMOVED:
ramlog
0 upgraded, 0 newly installed, 1 to remove and 6 not upgraded.
1 not fully installed or removed.
After this operation, 299 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database … 36862 files and directories currently installed.)
Removing ramlog (2.0.0) …
/etc/init.d/ramlog: 470: /etc/init.d/ramlog: nfo: not found
[FAIL] ramlog: get_state error: Multiple devices running at the same time. failed!
dpkg: error processing package ramlog (–remove):
subprocess installed post-removal script returned error exit status 152
Errors were encountered while processing:
ramlog
E: Sub-process /usr/bin/dpkg returned an error code (1)
—————–%<—————–
Danke und Gruß
Rene
Hallo Rene,
schau mal bei https://www.raspberrypi.org/forums/viewtopic.php?f=36&t=12747&start=25 rein. Dort hatte jemand das gleiche Problem und die Konfig-Datei lag wohl im falschen Verzeichnis.
Gruß, Hans
Hi,
I don’t understand how to extract setsebool from package
policycoreutils_2.1.10-9_armhf.deb
Any advice would be appreciated.
THX
When installing package ramlog_2.0.0_all.deb I get this error:
root@raspberrypi:/tmp# dpkg -i ramlog_2.0.0_all.deb
Selecting previously unselected package ramlog.
(Reading database … 24036 files and directories currently installed.)
Unpacking ramlog (from ramlog_2.0.0_all.deb) …
Setting up ramlog (2.0.0) …
ramlog err in tfdv: setsebool – Wrong path or file(s) /usr/sbin/setsebool not found!
dpkg: error processing ramlog (–install):
subprocess installed post-installation script returned error exit status 252
Errors were encountered while processing:
ramlog
Any idea what is causing this?
Hello Thomas,
please try „sudo apt-get install policycoreutils“ this sould install the missing tool.
Cheers, Hans
Hello Hans,
when I try to install package „policycoreutils“, the installer wants to install more packages. And I don’t have sufficient freespace for all packages.
0 upgraded, 87 newly installed, 0 to remove and 0 not upgraded.
1 not fully installed or removed.
Need to get 31.6 MB of archives.
After this operation, 158 MB of additional disk space will be used.
Is there any other solution?
THX
Thomas
You can try to extract setsebool from the .deb package and see if it works. Google is your friend on how to do this.
Cheers, Hans
I have moved file
setsebool
from package
policycoreutils_2.1.10-9_armhf.deb
to /usr/sbin.
However, now I get a different error:
Setting up ramlog (2.0.0) …
ramlog err in tfdv: getsebool – Wrong path or file(s) /usr/sbin/getsebool not found!
dpkg: error processing ramlog (–configure):
subprocess installed post-installation script returned error exit status 252
Errors were encountered while processing:
ramlog
E: Sub-process /usr/bin/dpkg returned an error code (1)
Hello Thomas,
you should be able to extract getsebool from the policycoreutils package too.
I checked all files in package „policycoreutils_2.1.10-9_armhf.deb“ but there’s no file „getsebool“ included.
Any other idea where this binary is included?
Hello Thomas, please look in the selinux-utils Package
Hi,
I have now extracted all dependencies and put them on Raspi.
However, starting ramlog now fails with a another error related to the binary.
root@pc7-raspi:/tmp# /etc/init.d/ramlog start
Segmentation fault
/etc/init.d/ramlog: 306: [: -eq: unexpected operator
[FAIL] Starting ramlog-tmpfs 2.0Error: /var/log is in use… failed!
Any idea?
Mhm,…it is not a problem in the inary but with a shell skript obviously the -eq operator is not supported. Which distribution you have and what shell is used?
Hi,
I’m running Moebius image (http://moebiuslinux.sourceforge.net/) and I assume it uses bash shell.
Thomas
Sorry, I have no knowledge about moebius distribution. I think it is a minimal distribution. Maybe something is missing.
True.
I’ve contacted the owner of this distribution asking for support.
Pingback: simpleNewz - Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed for 2014-10-18
Pingback: simpleNewz - Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed for 2014-10-17
Pingback: simpleNewz - Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed for 2014-10-13
Pingback: simpleNewz - Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed for 2014-10-12
Pingback: simpleNewz - Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed for 2014-10-09
Mit „tune2fs -i0 -c0 /dev/mmcblk0p2“ (-c -i ) schaltest du die automatische Überprüfung mittels e2fsck nach x Tagen und y Mounts ab. Zwar bist du dann für den Check selbst zuständig, aber die SD lebt somit sicherlich länger…
Danke für den Hinweis. Ich werde es probieren.
Pingback: Tuxlog - WordPress & Linux » Tuxlog - WordPress & Linux RSS Feed
Eventuell laufen auf dem Raspberry noch weitere Dienste, die zwingend nach ramlog gestartet werden müssen. Diese lassen sich wie folgt herausfinden:
/etc/init.d/ramlog teststartstop
Ich persönlich musste ramlog auch noch im samba, im openvpn und im wicd eintragen. Parallel dazu hilft auch noch ein Blick auf das Änderungsdatum der Dateien in /var/log. Alles, was größer als 0 Byte ist, sollte zumindest einmal „angeguckt werden“.
Wenn ramlog nach diversen Experimenten mit den Abhängigkeiten korrekt eingebunden ist und dennoch nicht „anspringt“, hilft i.d.R. folgende Vorgehensweise:
/etc/init.d/ramlog disable
[neu booten]
/etc/init.d/ramlog enable
[zwei mal neu booten]
Gruß,
der Altmetaller
http://www.altmetaller.de/
Hallo Jörg,
danke, für diese Ergänzung.
Gruß, Hans
Hi,
danke für diese Infos.
Btw: Das Files liegt in /etc/default/ramlog, nicht in /etc/defaults/ramlog
Grüße
der_vitti
Hallo vitte, danke für den Hinweis, habe es korrigiert.