Montag, 24. November 2008

Xen und falsche tcp-checksums

Das Wichtigste zuerst - bei Problemen mit tcp-Checksums:
 # ethtool -K eth0  rx off tx off 
und wenn sich das Teil beschwert, es könne das für rx nicht ändern:
 # ethtool -K eth0  tx off 

Der Hintergrund:

Ich betreibe einen kleinen Xen-Server mit 2 virtuellen Maschinen als Router und Arbeitsgruppenserver. Heute wollte ich eine dritte Maschine installieren, ein Debian.

Das erste Problem: Nach dem debootstrap habe ich im chroot brav ein aptitude gemacht und diverse Dienste installiert die ich brauchte. Großer Fehler! Debian startet die nämlich dann auch sofort - was in einem chroot auf einer laufenden dom0 super toll kommt.

Das Ergebnis waren jedenfalls diverse Prozesse wie apache, ssh und postfix die da so halb am laufen waren. Leider wusste ich natürlich nicht, welche innerhalb und welche ausserhalb des chroot liefen. Also: reboot.

Nach den Dateisystemchecks (..has not been checked for 208 days...) schien auch alles zu laufen.

Leider falsch gedacht: einer der virtuellen Server machte nur Probleme. Ich konnte mich zwar einloggen, aber der Apache antwortete nur sporadisch, der irc-bouncer kam nicht ins Netz und ich konnte mich nicht mit dem Bouncer verbinden.

Was macht man also: wireshark

Die Wireshark-Katastrophe

Mein erster Gedanke: Huch - warum ist denn da soviel rot?

Ah - checksum offloading. Offenbar kann die Netzwerkkarte in meinem neuen Notebook die tcp-Checksumme in Hardware berechnen. Die Folge ist aber, dass die Pakete keine gültige Checksumme haben, bevor ich sie an die Karte sende. Also deaktiviere ich das mal schnell...

 $ ethtool -K eth0  rx off tx off 

Gut. Neuer Versuch. Immer noch alles rot. *grummel*

Vielleicht auf dem xen-server dasselbe machen. Mist, die Netzwerkkarten unterstützen das nicht. also liegt es nicht daran. Hmmm. Ausserdem müssten dann doch beide domU's spinnen...?

Nach etlichen Reboots der nicht funktionierenden domU einfach mal das ethtool in der domU installiert und gestartet:

# ethtool -k eth0
Offload parameters for eth0:
Cannot get device rx csum settings: Operation not supported
Cannot get device udp large send offload settings: Operation not supported
rx-checksumming: off
tx-checksumming: on
[...]

Hmm - warum steht da on?

Ende gut, alles gut...

Ich hatte dann natürlich versucht rx und tx gleichzeitig auf off zu setzen, weil ich den Befehl noch im Buffer hatte. Da aber rx nicht von der 'Hardware' unterstützt wurde schlug der gesamte Aufruf fehl. Die Lösung: das tx einzeln setzen!

 # ethtool -K eth0  tx off 

Das Ergebnis: Im Wireshark verschwand das rot - und der bouncer konnte sich wieder mit den IRC-Servern verbinden. puh!

Ergebnis: ein paar ausgerissene Haare, einige Erkenntnisse mehr und drei Stunden verlorene Arbeitszeit :(

Keine Kommentare: