Zum Inhalt

Kategorie: Raspberry Pi

SD Karte vom Raspberry Pi auf kleinere SD Karte klonen

Folgende Situation: Die 16GB SD Karte in meinem Raspberry Pi zickt in letzter Zeit regelmäßig wegen defekten Sektoren rum. Diverse Programme starten z.B. nicht mehr und mussten erneut installiert werden. Ärgerlich. Da ich zusätzlich noch einen 32GB USB Stick angeschlossen haben und auch ein NAS im Netzwerk zur Verfügung steht, dachte ich mir, ersetze ich die alte 16GB SD Karte einfach durch eine neue. Leider ist die neue SD Karte ein paar wenige MB kleiner als die alte, daher war eine einfache Prozedur à la Image erstellen (entweder mit Win32 Disk Imager unter Windows oder dd unter Linux) und zurückspielen keine Möglichkeit, selbst wenn die 16GB Speicherplatz auf der SD Karte alles andere als ausgenutzt wurden.

Folgende Prozedur hat nun scheinbar Erfolg gebracht. Alle Schritte habe ich auf einem Notebook mit SD Kartenleser durchgeführt.

Schritt 1: Partitionen verkleinern

  1. Die root Partition auf der alten SD Karte verkleinern, in meinem Fall großzügig um 1GB.
  2. Auch die erweiterte Partition um 1GB verkleinern. Dieser Schritt ist wichtig!

Schritt 2: Image mit dd erstellen

  1. sudo dd if=/dev/mmcblk1 of=~/raspi.img
    Hierbei wird die komplette SD Karte als Image gespeichert, d.h die Datei ist anschließend ca. 16GB groß.

Schritt 3: Image verkleinert auf die neue SD Karte schreiben

  1. Mit sudo fdisk -l ~/raspi.img die Größe der Partitionen anzeigen lassen:
    dennis@MSI-GE60:~$ sudo fdisk -l ~/raspi.img
    Medium raspi.img: 14,5 GiB, 15523119104 Bytes, 30318592 Sektoren
    Einheiten: sectors von 1 * 512 = 512 Bytes
    Sektorengröße (logisch/physisch): 512 Bytes / 512 Bytes
    I/O Größe (minimal/optimal): 512 Bytes / 512 Bytes
    Typ der Medienbezeichnung: dos
    Medienkennung: 0x000b2b81
    
    Gerät Boot Start Ende Sektoren Größe Id Typ
    raspi.img1 8192 2289062 2280871 1,1G e W95 FAT16 (LBA)
    raspi.img2 2289063 28221439 25932377 12,4G 5 Erweiterte
    raspi.img5 2293760 2359293 65534 32M 83 Linux
    raspi.img6 2359296 2488319 129024 63M c W95 FAT32 (LBA)
    raspi.img7 2490368 28221439 25731072 12,3G 83 Linux
  2. Hier sind raspi.img2 und raspi.img7 relevant: Die erweiterte und die root Partition:
    Beide haben als Ende 28221439. Ohne die Verkleinerungen aus dem ersten Schritt waren es in meinem Fall 30318591.
  3. Und so landet das erstelle Image auf der neuen SD Karte:
    sudo dd if=~/raspi.img of=/dev/mmcblk1 bs=1024 count=28221439
  4. Der Vorgang dauert sehr lange und es kommt am Ende eine Fehlermeldung, die neue SD Karte sei zu klein. Das ist korrekt und kann ignoriert werden, da dieser Bereich außerhalb der Partitionen liegt und damit keine Daten betroffen sind.
  5. (optional) Die Partionen können mit gparted wieder auf maximale Größe erweitert werden.
  6. Von der neuen SD Karte kann der Raspberry Pi nun booten.

Ach ja, der ganze Spaß hat 5 oder 6 Anläufe an mehreren Abenden benötigt. Adhoc hat das leider nicht funktioniert.

Datenbanken auf dem Raspberry Pi 3?

Ist es eine gute Idee, Datenbanken auf dem Raspberry Pi 3 zu betreiben? Nach meinen Erfahrungen der letzten Wochen, rate ich davon ab. Jedenfalls von größeren Datenbanken. Auf meinem Raspberry Pi 3 läuft eine PostgreSQL, die für kleine Datenmengen ausreichend ist, z.B. für Gogs (Git Repository). Zusätzlich liefen für ca. 1,5 Jahre Messdaten via FHEM in die Datenbank, was zu ca. 2,5 Millionen Datensätzen geführt hat. Und damit ist der Raspberry Pi 3 definitiv überfordert. Davor lagen diese Messdaten in einer SQLite Datenbank, die eine noch schlechtere Performance bot. Eine Java Applikation, die ebenfalls auf dem Raspberry Pi 3 läuft, hat für das Laden und Aufbereiten der Daten ca. 30 Minuten gebraucht. Die (momentane) Lösung ist, dass ich die Messdaten nun in einer MySQL Datenbank speichere, die auf einem vServer bei Host Europe läuft. Die Tabellen haben eine etwas andere Struktur, da ich direkt nach dem INSERT von neuen FHEM Messdaten diese via Trigger aufbereitet in eine andere Tabelle ablege. Der Start der Java Applikation hat sich auf ca. 30 Sekunden (nicht mehr Minuten!) reduziert. Der Zugriff auf die MySQL Datenbank erfolgt via SSH Tunnel, um die MySQL Datenbank auf dem vServer nicht direkt im Internet verfügbar zu machen.

nginx startet nicht mehr

Nach einem Reboot startete nginx auf meinem Raspberry Pi 3 nicht mehr. Es kam nur folgende Meldung:

pi@raspberrypi:/etc/nginx » sudo service nginx start
Job for nginx.service failed. See 'systemctl status nginx.service' and 'journalctl -xn' for details.

Auch der Hinweis auf systemctl status nginx.service brachte keine Erkenntnis:

pi@raspberrypi:/etc/nginx » sudo systemctl status nginx.service
? nginx.service - A high performance web server and a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
   Active: failed (Result: signal) since Mo 2017-08-14 14:34:39 CEST; 6s ago
  Process: 17080 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=killed, signal=SEGV)

Aug 14 14:34:39 raspberrypi systemd[1]: nginx.service: control process exited, code=killed status=11
Aug 14 14:34:39 raspberrypi systemd[1]: Failed to start A high performance web server and a reverse proxy server.
Aug 14 14:34:39 raspberrypi systemd[1]: Unit nginx.service entered failed state.

Die letztendliche Lösung bestand aus dem Entfernen und der erneuten Installtion von nginx:

pi@raspberrypi:/etc/nginx » sudo apt-get remove nginx nginx-common
...
pi@raspberrypi:/etc/nginx » sudo apt-get install nginx
...

Verstanden habe ich Problem und Ursache nicht. Ich hoffe allerdings, dass das nicht die ersten Anzeichen sind, das sich die Speicherkarte im meinem Raspberry Pi ihrem Lebensende neigt.

 

SD Card Performance beim Raspberry Pi

Es gibt zwei praktische Scripte, um die Performance der SD Card im Raspberry Pi zu messen:

Leider ist die Performance meiner Sandisk SD Card überschaubar:

CONFIG:
CLOCK : 50.000 MHz
CORE : 400 MHz, turbo=
DATA : 512 MB, /root/test.dat

HDPARM:
======
Timing O_DIRECT disk reads: 64 MB in 3.03 seconds = 21.13 MB/sec
Timing O_DIRECT disk reads: 54 MB in 3.07 seconds = 17.60 MB/sec
Timing O_DIRECT disk reads: 64 MB in 3.05 seconds = 21.01 MB/sec

WRITE:
=====
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 106,699 s, 5,0 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 102,108 s, 5,3 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 96,1672 s, 5,6 MB/s

READ:
====
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 42,0239 s, 12,8 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 40,9591 s, 13,1 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 38,3425 s, 14,0 MB/s

RESULT (AVG):
============
Overlay config core_freq turbo overclock_50 WRITE READ HDPARM
400 0 50.000 MHz inf MB/s inf MB/s 19.90 MB/s

Update vom 02.10.2017: Hier meine neue Toshiba SD Karte mit etwas besserer Performance:


CONFIG:
CLOCK : 50.000 MHz
CORE : 400 MHz, turbo=
DATA : 512 MB, /root/test.dat

HDPARM:
======
Timing O_DIRECT disk reads: 66 MB in 3.06 seconds = 21.54 MB/sec
Timing O_DIRECT disk reads: 66 MB in 3.06 seconds = 21.59 MB/sec
Timing O_DIRECT disk reads: 66 MB in 3.07 seconds = 21.47 MB/sec

WRITE:
=====
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 66,0162 s, 8,1 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 63,7488 s, 8,4 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 66,6666 s, 8,1 MB/s

READ:
====
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 24,804 s, 21,6 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 24,687 s, 21,7 MB/s
512+0 Datensätze ein
512+0 Datensätze aus
536870912 Bytes (537 MB) kopiert, 24,8026 s, 21,6 MB/s

RESULT (AVG):
============
Overlay config core_freq turbo overclock_50 WRITE READ HDPARM
400 0 50.000 MHz inf MB/s inf MB/s 21.55 MB/s

Raspberry Pi verschickt keine eMails

Mein Raspberry Pi verschickt eigentlich über den Mailserver dieser Domain eMails, aber von einem Tag auf den anderen Tag kamen keine eMails mehr an. Via mailq habe ich diesen Fehler entdeckt:

C6B178081D 761 Mon Aug 22 18:04:43 raspi@mydomain.de
(Host or domain name not found. Name service error for name=smtp.mydomain.de type=MX: Host not found, try again)

Die DNS Auflösung für smtp.mydomain.de hat nicht funktioniert. Der Befehl

sudo service postfix check

hat mir dann verraten, dass es Unterschiede zwischen /var/spool/postfix/etc/resolv.conf und /etc/resolv.conf gibt.

diff /var/spool/postfix/etc/resolv.conf /etc/resolv.conf

Warum Postfix eine eigene resolv.conf nutzt, weiß ich nicht. Dort habe ich dann den Inhalt aus /etc/resolv.conf eingefügt:

# Generated by resolvconf
nameserver 192.168.1.1

Und dann noch ein

sudo service postfix restart
sudo service postfix flush

und schon klappt der eMail Versand wieder.

Update vom 25.10.2016.

Diese kleine Script erledigt alles automatisch:

echo 'nameserver 192.168.1.1' | sudo tee --append /var/spool/postfix/etc/resolv.conf > /dev/null
sudo service postfix restart
sudo service postfix flush

SQLite und Java auf dem Raspberry Pi 3

Es ist nicht ganz so einfach, auf dem Raspberry Pi 3 unter Linux mit Java auf eine SQLite Datenbank zuzugreifen, musste ich feststellen. Scheinbar muss eine passende Version von libsqlitejdbc.so für ARM vorhanden sein, was nicht immer der Fall ist. Ansonsten fliegen z.B. Exceptions à la

Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so

oder

java.lang.UnsatisfiedLinkError: org.sqlite.core.NativeDB._open(Ljava/lang/String;I)V

Funktioniert hat bei mir letztendlich die Version 3.8.10.2, die es hier zum Download gibt, oder so via Dependency in der pom.xml eingebunden werden kann:

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.8.10.2</version>
</dependency>