VMware tickt falsch

VMware und die liebe Zeit - 2 Welten treffen aufeinander.

Ob Antidepressiva, homöopatischer Quatsch oder einfach Placebos, die Gastsysteme sind einfach von der Rolle. Beim Thema Zeit tickt das Ganze dann wirklich total daneben, denn wenn ich guten Willens die Zeit per ntpdate einstellen lasse, geht das blödsinnige Gastsystem um 10 Sekunden nach, als hätte es sich ein Köpfchen schwarzer Afghane reingeknallt. Ein Setup mit ntp - was man ja eigentlich auf jedem Server installiert hat - bringt auch keine Abhilfe.

Die vServer lassen sich einfach nicht in den Griff kriegen.

Keine Ahnung, was das alles soll, aber nach 5 Tagen Tortur kapiert man sowieso nicht mehr wirklich, was eigentlich in der Welt so vor sich geht. Das schrie wieder nach meiner Genialität, die es dann schließlich auch hinbekam, einen Hack zu schreiben, der die Uhr(en) auf den vServern auf maximal 3sek nachgehen peitscht.

Zuerst habe ich das Hostsystem zum NTP Server erkoren. Das einzelne Gastsystem kann so die aktuelle Zeit von diesem Hostsystem beziehen. Im Moment lasse ich jedes Gastsystem die aktuelle Zeit alle 3 Sekunden abgleichen. Eigens dafür habe ich einen Daemon in Bash gescriptet, der über ein Startscript gesteuert wird.

Der Hack als Deamon in Bash. Dieses Skript habe ich als /usr/sbin/cntpd gespeichert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# This is a simple daemon shell script.
#
# Traps:
# signal HUP (1) read config file again
# signal QUIT (3) delete temp files
# signal TERM (15) delete temp files
 
conf=/etc/cntp.conf
source $conf
pidfile=/var/run/cntp.pid
touch $pidfile
echo $$ > $pidfile
 
# set traps
trap 'source $conf' 1
trap 'rm -f $pidfile; exit' 0
trap 'rm -f $pidfile; exit' 3
trap 'rm -f $pidfile; exit' 15
 
# loop forever
while :
do
  /usr/sbin/ntpdate ${SERVER} > /dev/null
  sleep $SLEEPT
done

Das Startscript habe ich unter /etc/init.d/cntp gespeichert.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#!/bin/sh
. /etc/rc.status
# The echo return value for success (defined in /etc/rc.config).
 
CNTP=/usr/sbin/cntpd
 
return=$rc_done
case "$1" in
  start)
    echo -n "Starting service cntpd"
    startproc -l /var/log/ntp.out $CNTP || return=$rc_failed
    echo -e "$return"
  ;;
  stop)
    echo -n "Shutting down service cntpd"
    killproc $CNTP || return=$rc_failed
    echo -e "$return"
  ;;
  restart)
    $0 stop && $0 start || return=$rc_failed
  ;;
  status)
    echo -n "Checking for service cntpd: "
    if checkproc $CNTP; then
      return=$rc_running
      echo $return
    else
      return=$rc_unused
      echo $return
    fi
  ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac
 
# Inform the caller not only verbosely and set an exit status.
test "$return" = "$rc_done" || exit 1
exit 0

Wie man schon im Quellcode erkennen kann, ist das Skript für den Deamon unter /usr/sbin abgelegt. Das Startskript habe ich unter /etc/init.d/ abgelegt. Das ist bei einem SuSE System der allgemein übliche Platz. Bei anderen Distributionen ist wohl das Verzeichnis /etc/rc.d eher der richtige Ort. Wie auch immer, damit der Deamon beim Start des Systems automatisch gestartet wird, muss ein entsprechender Softlink in das Verzeichnis /etc/init.d/rc3.d angelegt werden. Und um den Deamonbeim runterfahren sauber zu beenden muss ebenfalls ein Softlink in das Verzeichnis /etc/init.d/rc3.d. Und damit das alles professioneller wird, auch noch die für SuSE bekannten RC-Skripte.

1
2
3
4
5
6
7
bash# cp cntpd /usr/sbin/
bash# cp cntp /etc/init.d/
bash# cd /etc/init.d/rc3.d
bash# ln -s ../cntp S06cntp
bash# ln -s ../cntp K16cntp
bash# cd /usr/sbin
bash# ln -s /etc/init.d/cntp rccntpd

Nun lässt sich der neue CustomNTPClient einfach über rccntpd starten und stoppen. Und bei einem Systemstart wird er ebenfalls automatisch gestartet.

sonnige Grüße

HahPeh

2 Comments so far

  1. Martin on February 9th, 2007

    Habe das gleiche Problem mit SUSE 10.1 unter VMWare 4.5, nur dass die Uhr vor geht. Mit der SUSE 8.3 auf dem gleichen Wirtssystem bestand das Problem nicht.
    Habe bisher rausfinden können, das das Problem schlimmer ist, wenn auf dem Wirtssystem Hyperthreading an ist.
    Mit HT an hab ich eine Abweichung von ca. 10 Sek pro Minute. Ohne HT “nur” noch etwa 4 Minuten auf 2 Stunden (2 Sek pro Minute).
    Ich habe im Netz einen eigenen NTP Server mit DFC Uhr, doch leider gleicht das Gastsystem (über ntpd) mit diesem nicht ab, da der Jitter nach einigen Sekunden bereits einen Wert von 10.000 und größer erreicht. Ich habe es Momentan so gelöst, dass der ntpd über einen cron Job regelmässig neu gestartet wird. Beim Neustart holt der ntpd einmalig die richtige Zeit.

    Hat schon jemand eine Ursache/Lösung für dieses Problem gefunden?

    Martin

  2. Tom on March 9th, 2007

    Hatte das gleiche Problem mit SuSE 10.1 & VMware Server 1.0.2 und habe mittlerweile eine Lösung gefunden, die für mich funktioniert.
    Kurze Beschreibung unter:
    http://tom.knaupp.com/?p=28

    Etwas genauer ist das im VMware Diskussions-Forum beschrieben:
    http://www.vmware.com/community/thread.jspa?threadID=51781&tstart=0

    Hoffe, ich konnte helfen.
    Tom

Leave a reply


« ältere Beiträge

neuere Beiträge »