Hallo Leute,
meine ThinClients laden per PXE das initrd.img und damit wird dann übers Netzwerk das Root-Filesystem per nbd-client eingebunden. Wenn nun aber das Netzwerk aus irgendeinem Grund ausfällt und das Root-Filesystem damit weg ist, ist der ThinClient auch tot und man muss das Gerät von Hand neu starten.
Ich stelle mir nun vor, dass ein Script immer im Hintergrund läuft und beim Verbindungsverlust das Gerät automatisch neu startet. Genauso sollte beim Booten auch ein Neustart stattfinden, wenn die Verbindung nicht hergestellt werden kann.
Hat jemand eine Idee, wie man das bewerkstelligen kann? Also beim Booten die Verbindung zu prüfen ist ja noch recht einfach machbar aber wie soll das im Betrieb gehen? Sobald nämlich das Root-Filesystem weg ist, komme ich auch nicht mehr an shutdown oder reboot oder sonst ein Kommando ran.
Absicherung gegen Netzausfälle
Re: Absicherung gegen Netzausfälle
hi,
nur mal ein paar wirre Gedanken: warum ist es einfacher, beim booten die Verbindung zu prüfen? Ohne Verbindung kannst du auch "ping" nicht benutzen, genauso wenig wie "shutdwon". Du kannst ja nichtmal ein Script starten. Wie funktioniert der Trick?
Gehen wir erstmal davon aus, dass alles normal läuft. Dann könntest du eine Ramdisk anlegen (tmpfs) und ping, shutdown und was man sonst so braucht (libs?!) da reinkopieren und von da aus ausführen. Evt. ist ja /tmp oder /var/run sowieso schon als tmpfs gemountet. Allerdings dürfte es ziemlich aufwendig sein, eine shell, mit allem was dazu gehört, zum Laufen zu bringen. Ein kleines C-Programm, evt. statisch gelinkt, ist wohl einfacher.
Die nächste Aufgabe ist, zuverlässig festzustellen, ob ein Neustart wirklich nötig ist. Immerhin bedeutet das in der Regel Datenverlust. Aber das kann man auch positiv sehen: wenn das Netz wirklich weg ist, ist sowieso alles zu spät. Also braucht man auch kein "shutdown" mehr, sondern kann direkt einen (Soft-)Reset erzeugen. Das geht per reboot(2) oder so:
(Vorsicht, Datenverlust!)
nur mal ein paar wirre Gedanken: warum ist es einfacher, beim booten die Verbindung zu prüfen? Ohne Verbindung kannst du auch "ping" nicht benutzen, genauso wenig wie "shutdwon". Du kannst ja nichtmal ein Script starten. Wie funktioniert der Trick?
Gehen wir erstmal davon aus, dass alles normal läuft. Dann könntest du eine Ramdisk anlegen (tmpfs) und ping, shutdown und was man sonst so braucht (libs?!) da reinkopieren und von da aus ausführen. Evt. ist ja /tmp oder /var/run sowieso schon als tmpfs gemountet. Allerdings dürfte es ziemlich aufwendig sein, eine shell, mit allem was dazu gehört, zum Laufen zu bringen. Ein kleines C-Programm, evt. statisch gelinkt, ist wohl einfacher.
Die nächste Aufgabe ist, zuverlässig festzustellen, ob ein Neustart wirklich nötig ist. Immerhin bedeutet das in der Regel Datenverlust. Aber das kann man auch positiv sehen: wenn das Netz wirklich weg ist, ist sowieso alles zu spät. Also braucht man auch kein "shutdown" mehr, sondern kann direkt einen (Soft-)Reset erzeugen. Das geht per reboot(2) oder so:
(Vorsicht, Datenverlust!)
Code: Alles auswählen
echo b > /proc/sysrq-trigger
Beware of programmers who carry screwdrivers.
Re: Absicherung gegen Netzausfälle
Na in der initrd-Umgebung habe ich ja einige Befehle zur Verfügung. Da kann ich im init-Script auch prüfen, ob die Verbindung aufgebaut werden konnte. Wenn PXE schon nicht geht, dann bringt das alles natürlich nichts aber das ist eine andere Sache
Es braucht ja nur der Fehlercode von nbd-client geprüft werden oder nach dem Befehl ob /rofs leer ist (der mountpoint).
Ein kleines C-Programm wäre da wohl wirklich sinnvoller. Das könnte ich direkt ins initrd reinpacken und da mit ausführen. Es braucht ja nur alle 5 Sekunden prüfen, ob die Verbindung noch steht. Theoretisch müsste es ja auch mit einem Shellscript gehen, dass nur inbuilt Befehle nutzt. Die Shell wäre ja dann schon im Arbeitsspeicher geladen und könnte auf seine eigenen Befehle zugreifen (denke ich zumindest). Aber bei genauerem Überlegen dürfte es da zumindest auch mit fehlenden libs Probleme geben.
Datenverlust ist auf dem Client selber egal. Auf dem RootFS kann er eh nur lesen. Die Nutzer arbeiten dann in einer RDP-Sitzung auf den Windows-Servern. Wenn das Netz also komplett ausfällt, ist diese Verbindung auch weg. Ansonsten könnte ja noch eine Warnmeldung und ein Timeout eingebaut werden, damit wenn möglich der Nutzer noch was Sichern kann.
Es würde vielleicht auch reichen, wenn das Prüfprogramm dann versucht die Verindung wieder aufzubauen aber ich weiß nicht, ob sich irgendwelche laufenden Programme davor schon so abschießen, dass es dann eh ncihts bringen würde. Und die ganze hin und her mounterei beim Booten müsste ja auch wiederholt werden. Und komme ich überhaupt an "mount" noch ran? Also ich denke ein einfacher Neustart wäre da die sicherste Lösung.
Es braucht ja nur der Fehlercode von nbd-client geprüft werden oder nach dem Befehl ob /rofs leer ist (der mountpoint).
Ein kleines C-Programm wäre da wohl wirklich sinnvoller. Das könnte ich direkt ins initrd reinpacken und da mit ausführen. Es braucht ja nur alle 5 Sekunden prüfen, ob die Verbindung noch steht. Theoretisch müsste es ja auch mit einem Shellscript gehen, dass nur inbuilt Befehle nutzt. Die Shell wäre ja dann schon im Arbeitsspeicher geladen und könnte auf seine eigenen Befehle zugreifen (denke ich zumindest). Aber bei genauerem Überlegen dürfte es da zumindest auch mit fehlenden libs Probleme geben.
Datenverlust ist auf dem Client selber egal. Auf dem RootFS kann er eh nur lesen. Die Nutzer arbeiten dann in einer RDP-Sitzung auf den Windows-Servern. Wenn das Netz also komplett ausfällt, ist diese Verbindung auch weg. Ansonsten könnte ja noch eine Warnmeldung und ein Timeout eingebaut werden, damit wenn möglich der Nutzer noch was Sichern kann.
Es würde vielleicht auch reichen, wenn das Prüfprogramm dann versucht die Verindung wieder aufzubauen aber ich weiß nicht, ob sich irgendwelche laufenden Programme davor schon so abschießen, dass es dann eh ncihts bringen würde. Und die ganze hin und her mounterei beim Booten müsste ja auch wiederholt werden. Und komme ich überhaupt an "mount" noch ran? Also ich denke ein einfacher Neustart wäre da die sicherste Lösung.
Re: Absicherung gegen Netzausfälle
aha, für irgendwas ist diese initrd also doch gut
Ein C-Programm ist insofern einfacher, weil ich ziemlich genau weiß, was wirklich gebraucht wird. Und ich kann alle Kernel-Funktionen direkt aufrufen, z.B. auch mount. Der mount-Aufruf ist genauso einfach, wie auf der Kommandozeile, braucht aber keinen Plattenzugriff.
Es könnte aber auch mit einem Shell Script funktionieren, wenn du zum prüfen der Verbindung auf Dateien im Netzwerk zugreifst. Das geht ja mit Shell-eigenen Befehlen, während ping usw. externe Programme sind. Alle Teile der Shell und alle libs, die innerhalb der 5-Sekunden-Schleife gebraucht werden, werden ja automatisch geladen. Dadurch, dass sie alle 5 Sekunden gebraucht werden, dürften sie auch nie wieder ausgelagert werden. Man darf nur für den Reboot keinen anderen Befehl brauchen, aber echo ist ja auch eingebaut.
Das Problem bei Datei-Operationen ist der Cache, man muss irgendwas machen, was auch wirklich übers Netzwerk läuft, vielleicht eine Log-Datei auf dem Server lesen, keine Ahnung.
Ich würde auf jeden Fall einen Neustart machen, damit gibt's alles gratis. Eine "Reparatur" ist den Aufwand nicht wert, ich hab' ja auf dem Client nichts zu verlieren. Es könnte z.B. daran scheitern, dass ein Programm endlos auf's Netz wartet und sich nicht beenden läßt; das passiert hier mit NFS manchmal.
Ein C-Programm ist insofern einfacher, weil ich ziemlich genau weiß, was wirklich gebraucht wird. Und ich kann alle Kernel-Funktionen direkt aufrufen, z.B. auch mount. Der mount-Aufruf ist genauso einfach, wie auf der Kommandozeile, braucht aber keinen Plattenzugriff.
Es könnte aber auch mit einem Shell Script funktionieren, wenn du zum prüfen der Verbindung auf Dateien im Netzwerk zugreifst. Das geht ja mit Shell-eigenen Befehlen, während ping usw. externe Programme sind. Alle Teile der Shell und alle libs, die innerhalb der 5-Sekunden-Schleife gebraucht werden, werden ja automatisch geladen. Dadurch, dass sie alle 5 Sekunden gebraucht werden, dürften sie auch nie wieder ausgelagert werden. Man darf nur für den Reboot keinen anderen Befehl brauchen, aber echo ist ja auch eingebaut.
Das Problem bei Datei-Operationen ist der Cache, man muss irgendwas machen, was auch wirklich übers Netzwerk läuft, vielleicht eine Log-Datei auf dem Server lesen, keine Ahnung.
Ich würde auf jeden Fall einen Neustart machen, damit gibt's alles gratis. Eine "Reparatur" ist den Aufwand nicht wert, ich hab' ja auf dem Client nichts zu verlieren. Es könnte z.B. daran scheitern, dass ein Programm endlos auf's Netz wartet und sich nicht beenden läßt; das passiert hier mit NFS manchmal.
Beware of programmers who carry screwdrivers.