Heute würde ich euch gerne eins meiner Weekend Projects vorstellen. Ich nenne es:
„Ser2net Console Server Appliance“ kurz S2S-CSA 🙂
The Background:
Ich bin ein bequemer Mensch, ein Mensch der gerne arbeiten vor seinem 28″ Widescreen Monitor erledigt. Des öfteren ergibt sich die Situation, dass ich mehre Switches für ein Projekt Stagen müsste. Üblicherweise erfolgt die Erstkonfiguration über den seriellen Port einem nach dem anderen. Da ich meinen Arbeitskollegen im Grossraumbüro den Lärmpegel von 8 aufgetürmten Switchen nicht an tuhen möchte, habe ich mich nach alternativen umgeschaut. Dabei bin ich auf ein kleines Linuxtool names „ser2net“ gestossen
http://www.nwlab.net/tutorials/ser2net/konsolenserver-linux.html ser2net bietet genau die Lösung dafür. Ein kleines Tool was es ermöglicht einen seriellen Port auf ein TCP Port zu mappen, um aus der Ferne darauf zugreifen zu können.
Nun hab ich aber keinen Server mit 8 Serielen Ports… hmm
Kein Problem, USB2Serial Adapter von ebay für 2$/pcs kombiniert mit einem 10 Port USB Hub:
Ich arbeite zwar in einem Atomstromkonzern aber Energiesparen ist mit wichtig, daher reut es mich einen vollwertigen Server dafür einzusetzen. Ein schlanker Raspberry PI müsste doch für die Zwecke genügen:
Nun bin ich kein Fan von fliegenden Kabeln und wackligen Verbindungen, so ein Console Server sollte Hand und Fuss haben und mehr in Form einer Appliance daher kommen. Also hab ich Ausschau nach einem passenden Gehäuse gehalten. Kriterium dabei war, dass USB Hub und Rasbperry PI direkt über ein 5V Netzteil gespiesen werden. Die Erfahrung hat gezeigt, dass wenn man den USB Hub über den USB Port des Rasbperry speisst, die ganze Sache teils instabil läuft.
POC 1:
In unserem refurbished Fundus fand ich einen alten Tele Allysis 12 Switch, welcher ein integriertes Netzteil mit, unteranderem 5V Ausgangsleistung besass. Das gehäuse schien perfekt.
Powersupply:
Topview:
Sogar Lüfter wären schon vorhanden:
Um die USB to Console Ports nach aussen zuführen, benutze ich RJ45 Kupplungen, welche ich mit etwas Bastelei relativ gut befestigen konnte.
Der erste Entwurf war gut aber nicht perfekt, alles noch etwas wackelig und für all die Kabel war ein 1HA Gehäuse zu eng.
Lesson learned, 1HE zu klein, alles zu Wackelig.
POC2 – Lets start from the beginning:
Was ich brauchte war ein Gehäuse, wo die RJ45 Kupplungen schon fest montiert waren. Warum das Rad neu erfinden, wenn es schon etwas pfannenfertiges gibt:
19″ Panel, 2HE mit 24x RJ45 Kupplungen:
Mit 4 Schrauben eine passende 19″ Schublade daran befestigt und um darin Platz zu sparen, die Console Cables gleich gekürzt:
Da mir nun 24 Ports zur Verfügung standen, bot sich die Gelegenheit das ganze etwas Multivendor- haft zu gestalten.
Cisco verwendet sogenannte Rollovercables, dabei sind die Pins quasi 180 Grad verkreuzt. Alcatel Lucent verwendet staightrogh cables, wo die Pins 1:1 durchgeschalten sind. Da ich die Kabel eh kürzen musste, hab ich gleich die obere Reihe 1:1 gecrimped, damit diese für Alcatel Lucent Switche verwendet werden können. Um das ganze zu Speisen habe ich ein altes 5V Netzteil mit 1.9W gebraucht.
Rollover (cisco) | Straight Trough (Alcatel) |
Bei der Anzahl Console Ports habe ich mich auf 8 Stück beschränkt und dazu jeweils einen seperaten 10 Port USB Hub verbaut:
Ziel der ganzen Sache war von Anfang an, das ganze als eine Box Lösung zu designen, daher war es für mich essentiell, dass auch von aussen Zugriff auf den Raspberry PI habe, ohne das Gehäuse zu öffnen, somit war es notwendig, die entsprechenden Peripherie- Schnittstellen nach aussen zu führen:
The Configuration:
Auf dem Rasbperry PI läuft ein simples Raspbian, einzige Erweiterung ist „ser2net“
root@combox:~# apt-get install ser2net
ser2net besitzt ein configfile in /etc/ser2net.conf, darin ändernt man lediglich den gewünschten Telnet Port und Pfad auf die /dev/ttyUSBx Devices.
Die Standard Konfig sieht dabei etwa so aus:
4001:telnet:3600:/dev/ttyUSB1:9600 8DATABITS NONE 1STOPBIT banner 4002:telnet:3600:/dev/ttyUSB2:9600 8DATABITS NONE 1STOPBIT banner 4003:telnet:3600:/dev/ttyUSB3:9600 8DATABITS NONE 1STOPBIT banner 4004:telnet:3600:/dev/ttyUSB4:9600 8DATABITS NONE 1STOPBIT banner 4005:telnet:3600:/dev/ttyUSB5:9600 8DATABITS NONE 1STOPBIT banner 4006:telnet:3600:/dev/ttyUSB6:9600 8DATABITS NONE 1STOPBIT banner 4007:telnet:3600:/dev/ttyUSB7:9600 8DATABITS NONE 1STOPBIT banner 4008:telnet:3600:/dev/ttyUSB8:9600 8DATABITS NONE 1STOPBIT banner
Angeschlossene USB Devices ermittelt man am einfachsten mit „lsusb“
root@combox:~# lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/3p, 480M |__ Port 1: Dev 3, If 0, Class=vend., Driver=smsc95xx, 480M |__ Port 2: Dev 4, If 0, Class=hub, Driver=hub/7p, 480M |__ Port 1: Dev 6, If 0, Class=vend., Driver=pl2303, 12M |__ Port 2: Dev 7, If 0, Class=vend., Driver=pl2303, 12M |__ Port 4: Dev 26, If 0, Class=hub, Driver=hub/4p, 480M |__ Port 3: Dev 27, If 0, Class=vend., Driver=pl2303, 12M |__ Port 4: Dev 28, If 0, Class=vend., Driver=pl2303, 12M |__ Port 5: Dev 9, If 0, Class=vend., Driver=pl2303, 12M |__ Port 6: Dev 10, If 0, Class=vend., Driver=pl2303, 12M |__ Port 7: Dev 11, If 0, Class=vend., Driver=pl2303, 12M |__ Port 3: Dev 5, If 0, Class=hub, Driver=hub/7p, 480M |__ Port 1: Dev 12, If 0, Class=vend., Driver=pl2303, 12M |__ Port 2: Dev 13, If 0, Class=vend., Driver=pl2303, 12M |__ Port 4: Dev 14, If 0, Class=hub, Driver=hub/4p, 480M |__ Port 2: Dev 23, If 0, Class=vend., Driver=pl2303, 12M |__ Port 3: Dev 24, If 0, Class=vend., Driver=pl2303, 12M |__ Port 4: Dev 25, If 0, Class=vend., Driver=pl2303, 12M |__ Port 5: Dev 15, If 0, Class=vend., Driver=pl2303, 12M |__ Port 7: Dev 20, If 0, Class=vend., Driver=pl2303, 12M root@combox:~#
Das Problem ist, dass /dev/ttyUSB im Hintergrund ein eigentlicher Symlink ist, der dynamisch auf den jeweiligen Hardware Pfad des USB Ports zeigt.
Konkret heisst das, dass das Mapping von Port 4001 auf ttyUSB1 konstant ist, jedoch ttyUSB1 nach einem Neustart ggF. auf einen anderen USB Port zeigt.
Um dieses Problem zu lösen, habe ich eigenen Symlinks angelegt, die jeweils auf den eindeutigen physical Port des USB Hubs zeigen:
Zum ermitteln der Pfade:
root@combox:~# ls /dev/serial/by-path/platform-bcm2708_usb-usb-0\:1. platform-bcm2708_usb-usb-0:1.2.1:1.0-port0 platform-bcm2708_usb-usb-0:1.2.4.3:1.0-port0 platform-bcm2708_usb-usb-0:1.2.5:1.0-port0 platform-bcm2708_usb-usb-0:1.2.7:1.0-port0 platform-bcm2708_usb-usb-0:1.3.2:1.0-port0 platform-bcm2708_usb-usb-0:1.3.4.3:1.0-port0 platform-bcm2708_usb-usb-0:1.3.5:1.0-port0 platform-bcm2708_usb-usb-0:1.2.2:1.0-port0 platform-bcm2708_usb-usb-0:1.2.4.4:1.0-port0 platform-bcm2708_usb-usb-0:1.2.6:1.0-port0 platform-bcm2708_usb-usb-0:1.3.1:1.0-port0 platform-bcm2708_usb-usb-0:1.3.4.2:1.0-port0 platform-bcm2708_usb-usb-0:1.3.4.4:1.0-port0 platform-bcm2708_usb-usb-0:1.3.7:1.0-port0
durch ein und Ausstecken, der Reihe nach, konnte ich ermitteln welcher Port am USB Hub auf welchen Pfad verweist, danach habe ich Symlinks von 1-8 erstellt:
lrwxrwxrwx 1 root root 62 Oct 1 16:32 d1 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.2:1.0-port0 lrwxrwxrwx 1 root root 62 Oct 1 16:32 d2 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.1:1.0-port0 lrwxrwxrwx 1 root root 62 Oct 1 16:32 d3 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.5:1.0-port0 lrwxrwxrwx 1 root root 62 Oct 1 16:33 d4 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.6:1.0-port0 lrwxrwxrwx 1 root root 62 Oct 1 16:33 d5 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.7:1.0-port0 lrwxrwxrwx 1 root root 64 Oct 1 16:33 d6 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.4:1.0-port0 lrwxrwxrwx 1 root root 64 Oct 1 16:33 d7 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.3:1.0-port0 lrwxrwxrwx 1 root root 64 Oct 1 16:34 d8 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.2:1.0-port0
entsprechend war ich nun in der Lage in der ser2net.conf eigens erstellten Symlinks angegeben:
4001:telnet:3600:/etc/ser2net-symlinks/d1:9600 8DATABITS NONE 1STOPBIT banner 4002:telnet:3600:/etc/ser2net-symlinks/d2:9600 8DATABITS NONE 1STOPBIT banner 4003:telnet:3600:/etc/ser2net-symlinks/d3:9600 8DATABITS NONE 1STOPBIT banner 4004:telnet:3600:/etc/ser2net-symlinks/d4:9600 8DATABITS NONE 1STOPBIT banner 4005:telnet:3600:/etc/ser2net-symlinks/d5:9600 8DATABITS NONE 1STOPBIT banner 4006:telnet:3600:/etc/ser2net-symlinks/d6:9600 8DATABITS NONE 1STOPBIT banner 4007:telnet:3600:/etc/ser2net-symlinks/d7:9600 8DATABITS NONE 1STOPBIT banner 4008:telnet:3600:/etc/ser2net-symlinks/d8:9600 8DATABITS NONE 1STOPBIT banner
Diese verweisen auf eindeutige Hardware Pfade und bleiben persistent nach einem Neustart.
Connected man nun auf einen der Ports, antwortet ser2net, ist ein Gerät angeschlossen, hat man vollen Consolen Zugriff, hier als Beispiel der Bootprocess eines 2940 Cisco Catalyst:
ser2net port 4001 device /etc/ser2net-symlinks/d1 [9600 N81] (Debian GNU/Linux) @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ File "flash:c2960-lanbase-mz.122-35.SE/c2960-lanbase-mz.122-35.SE.bin" uncompressed and installed, entry point: 0x3000 executing... Restricted Rights Legend
Hallo Samuel Heinrich,
super gelungen. Danke erst mal dafür. Der bester Artikel, den ich bisher gefunden habe. Ich arbeite schon länger an dem Projekt. Kannst Du noch die Modell-Numern (Switche) nenen, die du für deinen Umbau benutzt hast. Für den Nachbau wäre das sicherlich interessant. Auch welche RJ45 Kuplungen du benutzt hast.
Ich arbeite an dem Projekt speziell an folgenden Themen:
– Sym-Links über udev rules mit Hilfe der Serial Number (nicht bei allen USB Adaptern vorhanden)
– Angepasstes banner Login in ser2net
– ser2net trace /log file für jede Verbindung
– Für Cisco -RTSCTS -XONXOFF implementieren
– Härtung das telnet nur über einen loalen login auf dem Server erreicht wird. Ziel: Von Außen muss
man eine SSH Session aufbauen und wird automatisch über den Login user local auf telnet gemappt.
– Ich hatte bei mehren parallelen telnet Login Sessions die gleichzeitig als Verbindungsanfrage auf den Raspberry tragen Probleme mit der Stabilität des Raspberrys. Er friert ein.
Die Versorgung des Raspberrys erfolgte über einen USB Hub, wie auch über ein eigenes Netzteil – Kein Unterschied.
Nun starte ich erneut, mit einer frischen Installation und parallel mit dem Nachfolge-Modell.
Vielleicht hast Du / sie ein paar hilfreiche Tipps.
viele Grüße
Florian Prillwitz