System time

Det er absolutt best at hardware-klokka settes til UTC (GMT) og at Linux får beskjed om dette i sin timeconfig. Det er faktisk mulig å gi Windows beskjed om dette også slik at en slipper at klokka er 1-2 timer for sein i Windows ved dual-boot. Opprett en ny verdi i Windows (2000) registry:

HKEY_LOCAL_MACHINE\CurrentControlSet\Control\TimeZoneInformation\
   RealTimeIsUniversal
Denne opprettes som DWORD og settes til verdien '1' - restart Windows og Voila!

Det er flere løsninger for å holde systemklokka på rett kjøl. Fra det mest primitive (rdate) til noe mer presist (NTP). Ulempen med NTP er at det i praksis krever fast tilknytning til internett for best utbytte. For de fleste med oppringt samband er chrony antakelig det ideelle alternativet. Jeg har brukt NTP en tid, men har nå installert chrony.

rdate

Jeg skulle gjerne har stilt alle klokkene i maskina til riktig tid. Etter det jeg forstår så er det to klokker i maskina. En system klokke (Linux) og en CMOS/BIOS/Windows klokke. Det jeg lurer på er hvordan jeg kan stille klokka mi når jeg logger på Internett slik at alle klokkene blir stilt riktig? Og hva skal stå i /etc/sysconfig/clock? (RedHat 5.1)

Legg f.eks inn

  # Synkroniserer systemklokken
  /usr/bin/rdate -s login.sol.no

  # Skriver systemklokken til BIOS
  /sbin/clock -w
i rc.local.


chrony

Programmet hentes hos sunsite.dk. Gjeldende versjon (september 2003) er 1.19.99.2 (1.20 testrelease 2).

Installasjon

Last ned filen chrony-1.19.99.2.tar.gz og kjør disse kommandoene:

  tar -zxvf chrony-1.19.99.2.tar.gz
  cd chrony-1.19.99.2
  ./configure
  make
  su root
  make install
configure går usannsynlig kjapt, men så er det lite som testes (om noe i det hele tatt). Jeg oppdaget at jeg måtte installere readline-devel og libncurses5-devel-pakkene fordi chrony trengte et par header-filer (MDK 9.2).

Konfigurasjon

Opprett følgende filer med angitt innhold. chrony.conf og chrony.keys skal opprettes på klienten(e) også.

/etc/rc.d/init.d/chrony
Dokumentasjonen viser et par eksempler. For Mandrake (Red Hat) har jeg laget et chrony oppstartsscript som er en ren avskrift av NTP oppstartsscript.

/etc/crony.conf (server)
# chrony.conf - LAN-server
#
server fartein.ifi.uio.no offline
server ntp.online.no offline
maxupdateskew 100
keyfile /etc/chrony.keys
commandkey 1
driftfile /etc/chrony.drift
allow 192.168.1
dumponexit
dumpdir /var/log/chrony
local stratum 7
rtcfile /etc/chrony.rtc
rtconutc
(Se under NTP for liste over flere NTP-servere. Styr unna stratum 1 servere, da det er helt unødvendig å belaste disse. Stratum 2 og 3 holder i massevis.)

/etc/chrony.conf (client)
# chrony.conf - LAN-client
#
server 192.168.1.201
maxupdateskew 100
keyfile /etc/chrony.keys
commandkey 1
driftfile /etc/chrony.drift
dumponexit
dumpdir /var/log/chrony
rtcfile /etc/chrony.rtc
# HW-clock uses UTC
rtconutc
'rtconutc' må settes hvis hardwareklokka er satt til UTC (GMT). Dette er anbefalt fordi sommertid og vintertid da handteres helt uproblematisk.

/etc/chrony.keys
1 hemmelig
(Dette betyr at vi benyttes passordet 'hemmelig'.)

chrony-online
/usr/local/bin/chronyc <<EOF
password hemmelig
online
EOF
chrony-offline
/usr/local/bin/chronyc <<EOF
password hemmelig
offline
dump
writertc
EOF
chrony-online og chrony-offline er to script som jeg kaller fra oppkoblingsscriptet mitt. Kallet til chrony-online plasseres så tidlig som mulig i scriptet, og chrony-offline tilsvarende til slutt i scriptet.

Nå skal det være klart til å sette tingene i drift. Som root kan oppstart av chrony settes med kommandoen chkconfig --level 2345 chrony on. Dette gjøres både på server og klient.

Oppstart

Første gangs oppstart av chrony bør gjøres manuelt. Kople opp linje til internett og start chrony med kommandoen /etc/rc.d/init.d/chrony start. Start deretter klientprogrammet /usr/local/bin/chronyc og utfør denne sesjonen (rød skrift er dine kommandoer):

  chronyc> password
  Password: hemmelig
  200 OK
  chronyc> online
  200 OK
  chronyc> sources
  MS Name/IP address               Stratum Poll LastRx Last sample
  ==================================================================================
  ^~ fartein.ifi.uio.no                2    6      5    +24ms[  +24ms] +/-  141ms
  chronyc> offline
  200 OK
  chronyc> exit
Legg merke til tilde-tegnet på begynnelsen av linjen for serverlisten. Etter et par minutter vil denne endres til en stjerne og synkronisering starter. Vent til klokken begynner å bli noenlunde riktig før du gir kommandoen offline og avslutter. For ettertiden vil justering av tiden foregå via chrony-online/-offline scriptene.

Straks server har fått skikk på klokka, kan chronyd startes på klientene og de vil synkronisere mot server.


NTP (Network Time Protocol)

Skandinaviske timeservere:

Denne siden forteller det meste: http://www.eecis.udel.edu/~mills/ntp/ Liste over 'public' time-servere: http://www.eecis.udel.edu/~mills/ntp/servers.html

Server

  • ntp.uio.no
  • fartein.ifi.uio.no (virker ikke når jeg prøvde)
  • ntp.uit.no
  • time.service.uit.no

    Kikk på http://www.eecis.udel.edu/~ntp/ , der finner du også en liste.

    Alle de andre som har svart til nå, har sagt noe om ntp. Personlig fant jeg ut at jeg syntes ntp var overkill. Klokken på min boks holder seg sånn nogenlunde, og jeg trenger ikke ekstrem presisjon.

    Jeg bruker derfor en kombinasjon av 'rdate' og 'hwclock' for å stille klokken i linux, og synce bios-klokken[0]. Jeg har en cronjobb som går én gang i døgnet som ser slik ut:

    #!/bin/sh
    # Fetch correct date and set system clock
    /usr/bin/rdate -s ntp.uio.no
     
    #Adjust hardware clock to match
    UTC=0
    if [ -f /etc/sysconfig/clock ]; then
            . /etc/sysconfig/clock
    fi
    if [ $UTC = "true" ]; then
            OPTS="-u"
    fi
    /sbin/hwclock --systohc $OPTS
    

    Denne funker for meg på (for dette formålet) en standard RedHat 5.0 boks. YMMV. både rdate og hwclock kan naturligvis brukes manuelt.

    ...Peder...

    [0] Jeg fant ut at biosklokken hadde mye større drift enn klokken i linux. Det hadde litt rare konsekvenser da boksen bootet pga. strømbrudd etter ca 100 dager. Før strømbruddet gikk klokken omtrent riktig, etter at boksen bootet, var den flere timer feil.

    ntp er ordentlig, solid etc, rdate er et hack. Man bruker ikke et hack som rdate når ntpdate er like enkelt å sette opp. Det du trenger er:

            ntpdate  && clock -u -w
    i crontab.

    echo -n "Setting time from NTP server ... "
    if ntpdate -s <server>; then
      hwclock --utc --systohc
      echo "done."
    else
    
     echo "failed."
    fi
    

    NTP - mitt oppsett

    Følgende oppsett er laget for hjemmenett med Linux server og Linux arbeidsstasjon. Opprettet også filen /etc/ntp.drift, men vet ikke om NTP bruker denne (ser ikke slik ut hittil)... Etter at jeg endret stratum til 5 (fra default 10), tror jeg at det funker! Filen /etc/ntp/step-tickers gjør at oppstartsscriptet /etc/rc.d/init.d/xntpd kjører ntpdate mot serverne angitt i denne filen før xntpd startes.


    NTP server

    /etc/ntp.conf

         #peer 192.168.1.1	# another machine on the LAN
         server  127.127.1.0     # local clock
         fudge   127.127.1.0 stratum 5  # Sett en høy nok stratum for at andre
                                                   # maskiner på LAN'et godtar server
         driftfile /etc/ntp/drift
         multicastclient                 # listen on default 224.0.1.1
         broadcastdelay  0.008
         authenticate no
    

    /etc/ntp/step-tickers

         fartein.ifi.uio.no time1.powertech.no aun.uninett.no
    

    NTP client

    /etc/ntp.conf

         server server.acme.com	# server on the LAN
         driftfile /etc/ntp/drift
         multicastclient                 # listen on default 224.0.1.1
         broadcastdelay  0.008
         authenticate no
    

    /etc/ntp/step-tickers

         server.acme.com  # eller IP.adressen
    

    I tillegg er det bare å starte xntp ved boot (S55xntp, K10xntp eksisterer antakelig allerede). Men jeg vet ikke helt hvor fornuftig dette oppsettet er...

    NTP test

    ntpq> host tid
    current host set to tid.uio.no
    ntpq> peers
         remote           refid      st t when poll reach   delay   offset    disp
    ==============================================================================
    *ulrik.uio.no    benoni.Uit.No    2 u  378 1024  377     0.92    5.401    1.54
    +tag.uio.no      ulrik.uio.no     3 u  220 1024  377     0.95    8.563    1.62
    +pierot.uio.no   ulrik.uio.no     3 u  414 1024  377     1.08    5.778    1.39
    +morgoth.uio.no  ulrik.uio.no     3 u  648 1024  377     0.98   15.635    4.70
    
    tid synkroniserer altså mot ulrik (== ntp.uio.no), som igjen snakkar
    med ei maskin i Tromsø (benoni.Uit.No == time.service.uit.no)

    Gammelt notat

    cat adjclock.sh:
    ================
    #!/bin/sh 
    
    # Show system time and hardware clock
    date
    clock --show
    
    #echo -n "Stiller klokka fra sol.no ... "
    #rdate -s login.sol.no
    
    echo -n "Stiller klokka fra uio.no ... "
    if ntpdate -s fartein.ifi.uio.no; then
      hwclock --utc --systohc
      echo "done."
    else
      echo "failed."
    fi
    
    # Show system time and hardware clock
    date
    hwclock --show