Raspberrypi.led-md: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Root (Diskussion | Beiträge) (→Ziel) |
Root (Diskussion | Beiträge) |
||
(32 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 6: | Zeile 6: | ||
* Sie werden so plaziert dass klar wird welche LED für welche Festplatte zuständig ist | * Sie werden so plaziert dass klar wird welche LED für welche Festplatte zuständig ist | ||
* Hintergund: Im Service-Fall muss man wissen WELCHE Festplatte zu tauschen ist, das soll optisch angezeigt werden (FAIL-Farbe) | * Hintergund: Im Service-Fall muss man wissen WELCHE Festplatte zu tauschen ist, das soll optisch angezeigt werden (FAIL-Farbe) | ||
* Die Steuerung der | * Die Steuerung der LEDs erfolgt durch einen Raspberry Pi (Zero oder normaler) | ||
* Der Raspberry Pi ist durch Dauer 5v+ des Netzteils dauerversorgt | * Der Raspberry Pi ist durch Dauer 5v+ des ATX-Netzteils dauerversorgt | ||
* ev. auch durch eine 5 V USB Schnittstelle, das ist noch fraglich | * ev. auch durch eine 5 V USB Schnittstelle, das ist noch fraglich | ||
* Auf dem Server ist ein RAID 6 Array in Betrieb mit 4 bis 10 Platten | * Auf dem Server ist ein RAID 6 Array in Betrieb mit 4 bis 10 Platten | ||
Zeile 16: | Zeile 16: | ||
* der Server betreibt ein OpenSuse 15.1 | * der Server betreibt ein OpenSuse 15.1 | ||
* Ein kleines Programm auf dem Server gibt die Festplattenaktivität und md-Status an den Rasp weiter (über UART) | * Ein kleines Programm auf dem Server gibt die Festplattenaktivität und md-Status an den Rasp weiter (über UART) | ||
** njmon: https://www.youtube.com/watch?v=wN5GNc9HH7Y | |||
** njmon -> JSON -> rasp.py -> UART | |||
=== Disk Stats === | |||
* https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats | |||
* https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/iostats.rst | |||
** im Prinzip: <code>cat /proc/diskstats</code> | |||
** ev. auch <code>cat /proc/partitions</code> | |||
# zentrale Berechnungen | |||
# aus nmon (c) Nigel Griffiths | |||
# | |||
# | |||
# "xfers" Begriff | |||
# | |||
p->dk[i].dk_xfers = p->dk[i].dk_reads + p->dk[i].dk_writes; | |||
# | |||
# "busy" Begriff | |||
# | |||
/* assume a disk does 200 op per second */ | |||
fudged_busy = (p->dk[i].dk_reads + p->dk[i].dk_writes) / 2; | |||
if (fudged_busy > 100 * elapsed) | |||
p->dk[i].dk_time += 100 * elapsed; | |||
p->dk[i].dk_time = fudged_busy; | |||
# | |||
# Disk Write per Time | |||
# | |||
if (NEWDISKGROUP(i)) { | |||
fprintf(fp, "\nDISKWRITES%s,%s", dskgrp(i), | |||
LOOP); | |||
} | |||
disk_write = DKDELTA(dk_writes); | |||
fprintf(fp, ",%.1f", disk_write / elapsed); | |||
* https://unix.stackexchange.com/questions/225095/how-to-get-total-read-and-total-write-iops-in-linux | * https://unix.stackexchange.com/questions/225095/how-to-get-total-read-and-total-write-iops-in-linux | ||
Zeile 61: | Zeile 100: | ||
https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c | https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c | ||
== PC == | |||
=== Supermicro JCOM2 === | |||
[[Datei:Ezgif-5-b79866dcbc8e.gif]] | |||
* Bei meinen Supermicro Mainboards (X11SSL-F, X10SLH-F, X11SCL-F) brauche ich eine zusätzliche LED, die mir einen Fehlerstatus anzeigt | |||
* Ich habe mich für die Verwendung einer der COM Schnittstellen entschieden (Seriell Schnittstelle, RS 232) | |||
* Die sind leicht per C-Programm ansteuerbar und haben +12V Pegel den man per Widerstand leicht runterregeln kann | |||
* die Pins sind leicht an der Rückseite (COM1) und/oder auf dem Mainboard (JCOM2) zugänglich | |||
* Ich brauche nur einen 1 kOhm Widerstand und eine LED mit einer Farbe die zum Thema passt | |||
* Wir verwenden nur die Pins | |||
** "-" = GND = Pin5 | |||
** RTS = Pin7 | |||
{| | |||
|externer Anschluss | |||
|interner Anschluss auf dem Board | |||
|- | |||
|[[Datei:Db9-pinout.png]] | |||
|[[Datei:JCOM2-Pinout.png]] | |||
|} | |||
* Installiere dir einen C-Compiler | |||
zypper install gcc | |||
* Sehe nach, wie deine seriellen Schnittstellen heissen | |||
dmesg | grep ttyS | |||
* Löte einen 1 kOhm Widerstand in Reihe an eine LED | |||
* der Kurze Pin der LED ist "-" | |||
PIN RTS(7) <---> 1 kOhm <---> +LED- <---> PIN GND(5) | |||
* Schliesse es (richtig rum) an PIN 5 und PIN 7 an | |||
* Kopiere Dir dieses Programm in den Editor, als Dateiname z.B. <code>rs232_to_led.c</code> | |||
// rs232_to_led.c | |||
// e.boelen 5 Mar 2002 | |||
// Andreas Filsinger 05 Nov 2020 | |||
// | |||
// a small c program that will blink RTS (Pin 7) on a rs232 port | |||
// C library headers | |||
#include <stdio.h> | |||
#include <string.h> | |||
// Linux headers | |||
#include <fcntl.h> // Contains file controls like O_RDWR | |||
#include <errno.h> // Error integer and strerror() function | |||
#include <termios.h> // Contains POSIX terminal control definitions | |||
#include <unistd.h> // write(), read(), close() | |||
#include <stdlib.h> | |||
#include <sys/ioctl.h> | |||
void main() | |||
{ | |||
int fd,pin; | |||
fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); | |||
if (fd == -1) { | |||
perror("open error"); | |||
exit(1); | |||
} | |||
pin=TIOCM_RTS; // RTS (pin 7) | |||
while (1) { | |||
ioctl(fd, TIOCMBIS,&pin); // ON | |||
sleep(1); | |||
ioctl(fd, TIOCMBIC,&pin); // OFF | |||
sleep(1); | |||
} | |||
} | |||
* Kompiliere es | |||
gcc rs232_to_led.c | |||
* Starte es | |||
./a.out | |||
== Aufgaben == | |||
=== (1) === | |||
* schreibe ein Python Programm das 10 LEDs symbolisiert | |||
** https://tutorials-raspberrypi.de/programmieren-lernen-am-raspberry-pi-teil-3-gui-erstellen/ | |||
* In ein Eingabefeld kann man einen Wert eingeben, je nach Wert werden dann die LEDs entsprechend eingefärbt | |||
** "1G" bedeutet: 1. LED wird grün | |||
** "5R" schaltet die 5. LED auf rot | |||
** usw. | |||
* mit einem "Start" Button wird ein Datei gelesen und interprätiert, dabei sind 10 Bytes immer für 250 ms gültig | |||
== Meilensteine == | |||
=== 10.03.2020 === | |||
* Gehäuse beschafft, HDD Tray bestückt | |||
[[Datei:Fractal define 7 storage hdd trays.jpg|210px]] | |||
[[Datei:Fractal define 7 front storage.jpg|210px]] |
Aktuelle Version vom 6. November 2020, 18:39 Uhr
Ziel
- In einem Server-Gehäuse (NAS mit vielen Festplatten) werden 10 RGB LED plaziert
- Sie werden so plaziert dass klar wird welche LED für welche Festplatte zuständig ist
- Hintergund: Im Service-Fall muss man wissen WELCHE Festplatte zu tauschen ist, das soll optisch angezeigt werden (FAIL-Farbe)
- Die Steuerung der LEDs erfolgt durch einen Raspberry Pi (Zero oder normaler)
- Der Raspberry Pi ist durch Dauer 5v+ des ATX-Netzteils dauerversorgt
- ev. auch durch eine 5 V USB Schnittstelle, das ist noch fraglich
- Auf dem Server ist ein RAID 6 Array in Betrieb mit 4 bis 10 Platten
- Die LED spiegeln die Festplatten-Aktivität des RAID Verbundes wieder
Server Software
- der Server betreibt ein OpenSuse 15.1
- Ein kleines Programm auf dem Server gibt die Festplattenaktivität und md-Status an den Rasp weiter (über UART)
- njmon: https://www.youtube.com/watch?v=wN5GNc9HH7Y
- njmon -> JSON -> rasp.py -> UART
Disk Stats
- https://www.kernel.org/doc/Documentation/ABI/testing/procfs-diskstats
- https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/iostats.rst
- im Prinzip:
cat /proc/diskstats
- ev. auch
cat /proc/partitions
- im Prinzip:
# zentrale Berechnungen # aus nmon (c) Nigel Griffiths # # # "xfers" Begriff # p->dk[i].dk_xfers = p->dk[i].dk_reads + p->dk[i].dk_writes; # # "busy" Begriff # /* assume a disk does 200 op per second */ fudged_busy = (p->dk[i].dk_reads + p->dk[i].dk_writes) / 2; if (fudged_busy > 100 * elapsed) p->dk[i].dk_time += 100 * elapsed; p->dk[i].dk_time = fudged_busy; # # Disk Write per Time # if (NEWDISKGROUP(i)) { fprintf(fp, "\nDISKWRITES%s,%s", dskgrp(i), LOOP); } disk_write = DKDELTA(dk_writes); fprintf(fp, ",%.1f", disk_write / elapsed);
- "So" ähnlich könnte es aussehen:
Server Gehäuse
- Es ist ein weißes Fractal Define 7 für den B-Server
- Es ist ein schwarzes Fractal Define 7 für den A-Server
- 20 HDD Trays wurden angeschafft (nur 2 lieferbar!)
- https://www.youtube.com/watch?v=orRp-B2u-4o
Raspi Software
- Der Rasp empfängt über UART einen Datenstrom mit Festplatteninfo
- Dies setzt er in die Steuersignale für die bunten LED um
- kommt es zum Abbruch der Datenverbindung wird dieser "Status" auch angezeigt
UART Hardware
UART Setup
Server
- USB Stecker wird automatisch erkannt
- Unter /dev gibt es dann plotzlich einen neuen Device
minicom -b 115200 -D /dev/ttyUSB0 -o
Raspi
- "serielle Console" muss mit raspi-config aktiviert werden, wenn man sich darüber einloggen will, wir wollen aber damit programmieren
- https://asciich.ch/wordpress/uart-mit-minicom-auf-dem-raspberrypi-nutzen/
UART Programmierung
Server
Raspi
https://www.electronicwings.com/raspberry-pi/raspberry-pi-uart-communication-using-python-and-c
PC
Supermicro JCOM2
- Bei meinen Supermicro Mainboards (X11SSL-F, X10SLH-F, X11SCL-F) brauche ich eine zusätzliche LED, die mir einen Fehlerstatus anzeigt
- Ich habe mich für die Verwendung einer der COM Schnittstellen entschieden (Seriell Schnittstelle, RS 232)
- Die sind leicht per C-Programm ansteuerbar und haben +12V Pegel den man per Widerstand leicht runterregeln kann
- die Pins sind leicht an der Rückseite (COM1) und/oder auf dem Mainboard (JCOM2) zugänglich
- Ich brauche nur einen 1 kOhm Widerstand und eine LED mit einer Farbe die zum Thema passt
- Wir verwenden nur die Pins
- "-" = GND = Pin5
- RTS = Pin7
externer Anschluss | interner Anschluss auf dem Board |
- Installiere dir einen C-Compiler
zypper install gcc
- Sehe nach, wie deine seriellen Schnittstellen heissen
dmesg | grep ttyS
- Löte einen 1 kOhm Widerstand in Reihe an eine LED
- der Kurze Pin der LED ist "-"
PIN RTS(7) <---> 1 kOhm <---> +LED- <---> PIN GND(5)
- Schliesse es (richtig rum) an PIN 5 und PIN 7 an
- Kopiere Dir dieses Programm in den Editor, als Dateiname z.B.
rs232_to_led.c
// rs232_to_led.c // e.boelen 5 Mar 2002 // Andreas Filsinger 05 Nov 2020 // // a small c program that will blink RTS (Pin 7) on a rs232 port // C library headers #include <stdio.h> #include <string.h> // Linux headers #include <fcntl.h> // Contains file controls like O_RDWR #include <errno.h> // Error integer and strerror() function #include <termios.h> // Contains POSIX terminal control definitions #include <unistd.h> // write(), read(), close() #include <stdlib.h> #include <sys/ioctl.h> void main() { int fd,pin; fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY); if (fd == -1) { perror("open error"); exit(1); } pin=TIOCM_RTS; // RTS (pin 7) while (1) { ioctl(fd, TIOCMBIS,&pin); // ON sleep(1); ioctl(fd, TIOCMBIC,&pin); // OFF sleep(1); } }
- Kompiliere es
gcc rs232_to_led.c
- Starte es
./a.out
Aufgaben
(1)
- schreibe ein Python Programm das 10 LEDs symbolisiert
- In ein Eingabefeld kann man einen Wert eingeben, je nach Wert werden dann die LEDs entsprechend eingefärbt
- "1G" bedeutet: 1. LED wird grün
- "5R" schaltet die 5. LED auf rot
- usw.
- mit einem "Start" Button wird ein Datei gelesen und interprätiert, dabei sind 10 Bytes immer für 250 ms gültig
Meilensteine
10.03.2020
- Gehäuse beschafft, HDD Tray bestückt