Raspberrypi.led-md: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
 
(35 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 LED erfolgt durch einen Raspberry Pi (Zero oder normaler)
* 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
* Die LED spieglen die Festplatten-Aktivität des RAID Verbundes wieder
* Die LED spiegeln die Festplatten-Aktivität des RAID Verbundes wieder


== Server Software ==
== Server Software ==
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 46: Zeile 85:
* USB Stecker wird automatisch erkannt
* USB Stecker wird automatisch erkannt
* Unter /dev gibt es dann plotzlich einen neuen Device
* Unter /dev gibt es dann plotzlich einen neuen Device
minicom -b 115200 -D /dev/ttyUSB0 -o


=== Raspi ===
=== Raspi ===


* "serielle Console" muss mit raspi-config aktiviert werden
* "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 ==
== UART Programmierung ==
Zeile 58: 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)

Disk Stats

    • im Prinzip: cat /proc/diskstats
    • ev. auch cat /proc/partitions
# 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

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

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)

Meilensteine

10.03.2020

  • Gehäuse beschafft, HDD Tray bestückt