BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT

Samstag, 6. Juni 2015

Hands On: Ein GPS-Zeitserver unter Linux (CentOS) - für keine 20 Euro...

Quelle: Wikipedia
Jeder in Serverumgebungen kennt das Problem: Die liebe Zeit.

Lokale PC-Uhren sind gern etwas ungenau; und das oft nicht nur ein paar Millisekunden - sondern gar gleich um etliche Sekunden, Minuten, Stunden. Folgefehler sind somit leider recht unausweichlich.

Was also tun?
Wir bauen uns einen Zeitempfänger.
[ Hier geht's weiter. ]




Man könnte das gute alte DCF77-Signal nutzen, welches in Deutschland die genaue Atom-Zeit via Radiosignal aussendet. Aber auch dieses unterliegt leider immer wieder einmal Änderungen im Protokoll: Neuerdings werden z.B. Wetterinformationen im Signal mit bereit gestellt und viele "alte" Empfänger, die nun jahrelang problemlos ihren Dienst getan haben, laufen nun in Probleme.

Auch kosten solche Zeitempfänger nicht gerade wenig Geld:
Bei einem einiger maßen passablen USB-DCF77-Empfänger geht es los bei 100 € (Stand 2015-06). "Schätzeisen" als Bausätze gibt es schon ab 20 Euro -
doch die sind mit "Frickelei" verbunden: Justieren, ein Gehäuse, die Zeit zum Bauen, etc. pp. - das lohnt kaum.
Zudem hat das DCF77-Signal einen kleinen Nachteil:
Es ist generell nur ~ 1.500 Kilometer um Deutschland herum empfangbar.
Im Normalfall wird niemand einen Server spazieren fahren -
doch vielleicht sollte uns das auf eine Idee bringen.
Denn wie lokalisiert man eigentlich bei beweglichen Systemem die Uhrzeit....?

Genau!
Es gibt doch GPS!
Dort ist im Sendesignal neben den Koordinaten auch die Zeit versteckt.

Fertige GPS-Empfänger die für das Preis-Leistungsverhältnis eine sehr gute Empfangsqualität besitzten, werden z.B. in einem Online-Auktionshaus für keine 20 Euro inkl. Versand angeboten.

Ich persönlich habe mir den GPS/Glonass-Empfänger "U-blox7 G-7020" von "U-blox" genauer angesehen: Dieser wurde im Online-Kaufhaus meiner Wahl für keine 16 € Angeboten -
und dazu habe ich mir noch ein USB-Verlängerungskabel für 2 € dazu bestellt.

Und wie aktiviere ich das ganze nun auf einem CentOS 6.5 Linux?
Nichts einfacher als das....

  1. Benötigte Quellen: gpsd

    Der GPS-deamon entlockt unserem GPS-Empfänger seine Daten.
    Das Paket kann auf der gpsd-Projektseite befindet sich unter:

    https://savannah.nongnu.org/projects/gpsd/

    bzw. kann der Quellcode in Version 3.15 hier herunter geladen werden:

    http://download.savannah.gnu.org/releases/gpsd/gpsd-3.15.tar.gz

    gpsd ist kompatibel mit folgenden Chipsätzen:

    Generic NMEA, Ashtech, San Jose Navigation FV18, Furuno Electric GH-79L4, Garmin Serial, Delorme TripMate, Delorme EarthMate (pre-2003, Zodiac chipset), Zodiac binary, Navcom binary, uBlox UBX, Garmin, USB binary, Garmin Serial binary, SiRF binary, Trimble TSIP, EverMore binary, iTalk binary, RTCM104, Garmin Simple Text

    bzw. mit folgenden GPS-Empfängern:

    NaviLock NL-202U, NaviLock NL-302U (läuft sofort unter /dev/ttyUSB0), NaviLock NL-402U (starten mit gpsd -b /dev/ttyACM0), NaviLock NL-409TE (läuft sofort unter /dev/ttyUSB0), NaviLock NL-454US (sofort mit gpsd /dev/ttyUSB0), Holux GM210 USB (Modul pl2303), iGPS-M Pro USB (wird als CP2101 erkannt, Modul cp2101, läuft sofort mit /dev/ttyUSB0), QSTARZ BT-Q818, TomTom wireless GPS MkII, No-Name Produkt mit Sirf III Chipsatz (läuft sofort mit /dev/ttyUSB0), GlobalSat BU-353 (läuft sofort mit /dev/ttyUSB0), Garmin eTrex Legend® HCx (Modul garmin_gps, /dev/ttyUSB0), Garmin GPSMap 60CSx (Modul garmin_gps, /dev/ttyUSB0), Mainnav-GPS (über Bluetooth), Fortuna Clip-On (über Bluetooth)
  2. Benötigte Quellen: scons

    Scons ist eine Art Builder - denn das gpsd-Team bereitet seine Files nicht mit dem üblichen "make" vor. Die Projektseite von scons lautet:

    http://www.scons.org/

    Um den Aufwand zu minimieren, kann ein fertiges rpm-paket der Version 2.3.4  herunter geladen werden.

    http://prdownloads.sourceforge.net/scons/scons-2.3.4-1.noarch.rpm

    Der Quellcode - sofern für Enthusiasten benötigt, die selber compilieren möchten - befindet sich hier:

    http://prdownloads.sourceforge.net/scons/scons-2.3.4.zip
  3. Benötigte Quellen: ntpd und ntpdate

    Der ntp-deamon synchronisiert die lokale PC-Uhr mit den empfangenen Werten.
    Die Projektwebseite befindet sich unter:

    http://www.ntp.org/downloads.html

    Glücklicher Weise beifnden sich die Pakete für den ntp-deamon bereits in CentOS im Standard-umfang bzw. können über "yum" problemlos installiert werden.
    Anderenfalls können die benötigten Pakete hier herunter geladen werden:

    http://mirror.centos.org/centos/6/os/x86_64/Packages/ntp-4.2.6p5-1.el6.centos.x86_64.rpm
    http://mirror.centos.org/centos/6/os/x86_64/Packages/ntpdate-4.2.6p5-1.el6.centos.x86_64.rpm
  4. Benötigte Quellen: gcc, ncurses ncurses-devel, phyton-devel

    Die besagten Pakete sollten - wie der ntpd - wirklich von der CentOS-Community bezogen und nicht wirklich selbst angepasst werden.... das kann nur schief gehen...

  5. Installation: Vorbereiten der Umgebung; Installation der vorgefertigten Pakete

    Pro forma installieren wir Pakete, die eigentlich schon vorhanden sein sollten...

    yum install gcc ncurses ncurses-devel ntpd
  6. PPS im Kernel aktivieren

    Um das Timing des gpsd auch verarbeiten zu können, benötigen wir das Kernel-Modul pps_core, welches natürlich bei jedem Systemstart auch geladen werden sollte.

    Erstellen der Datei  /etc/sysconfig/modules/ntp.modules

    #!/bin/sh
    modprobe -b  pps_core > /dev/null 2>&1
    exit 0

    und setzen der Berechtigungen

    chown root:root /etc/sysconfig/modules/ntp.modules
    chmod 755 /etc/sysconfig/modules/ntp.modules
  7. Installation: Scons

    Das oben genannte und herunter geladene rpm-Paket scons-2.3.4-1.noarch.rpm wird nun wie üblich über rpm installiert.

    rpm -ivh scons-2.3.4-1.noarch.rpm
  8. Compilieren von gpsd

    tar -zxvf gpsd-3.15.tar.gz
    cd gpsd-3.15

    scons
    scons check
    scons install
    scons udev-install

    cp gpsd /usr/sbin/
    cp xgpsd /usr/sbin/
    cp gpxlogger /usr/sbin/
    cp ntpshmmon /usr/sbin/

    cp packaging/rpm/gpsd.init /etc/init.d/gpsd
    chmod 755 /etc/init.d/gpsd
    cp packaging/rpm/gpsd.sysconfig /etc/sysconfig/gpsd
    chmod 644 /etc/sysconfig/gpsd 
    Nun muss der gpsd noch auf unsere GPS-Maus konfiguriert werden.
  9. Finden unseres USB-GPS-Gerätes

    Mit "dmesg" zeigen wir uns einmal an, was denn aktuell am usb-Port eingesteckt wurde:

    # dmesg
    ...
    usb 5-1.1.2: new full speed USB device number 4 using ohci_hcd
    usb 5-1.1.2: New USB device found, idVendor=1546, idProduct=01a7
    usb 5-1.1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
    usb 5-1.1.2: Product: u-blox 7 - GPS/GNSS Receiver
    usb 5-1.1.2: Manufacturer: u-blox AG - www.u-blox.com
    usb 5-1.1.2: configuration #1 chosen from 1 choice
    cdc_acm 5-1.1.2:1.0: ttyACM0: USB ACM device
    #

    Unser Gerät ist angeschlossen und hat also den Gerätenamen /dev/ttyACM0
  10. Konfigurieren und testen des gpsd-Dienstes.

    Editieren wir die Datei /etc/sysconfig/gpsd
    Folgende Konfiguration habe ich fpr die GPS-Maus names U-Blox7 gewählt.

    vi /etc/sysconfig/gpsd

    # OPTIONS="-n"
    # USBAUTO="true"
    OPTIONS="-b -n"
    DEVICE="/dev/ttyACM0"

    Wenn wir nun den gpsd mit
    gpsd -b -n -N -D5  /dev/ttyACM0
    starten, sollten kene bösen Fehlermeldungen erscheinen.

    Update: Es gibt wohl hin und wieder Probleme von gpsd beim initialisieren der Mouse.
    Den deamon unter /etc/rc.d/init.d/gpsd entsprechend erweitern:
    Anschließend sind wir mit 9600 Baud 8,n,1 immer gut dabei...

    [...]
    start() {
        [ "$EUID" != "0" ] && exit 4
        echo -n $"Starting $prog: "
            # /dev/ttyACM0 identified as type NMEA0183, 0 sec @ 9600bps
            # setserial $DEVICE low_latency
            stty -F $DEVICE  9600 raw cs8 parenb -cstopb -clocal
    [...]
  11. Konfigurieren von ntpd

    Anbei eine sehr sehr rudimentäre Konfiguration der Datei /etc/ntp.conf ...

    # files
    driftfile /var/lib/ntp/drift
    statsdir /var/log/ntpstats/
    includefile /etc/ntp/crypto/pw
    keys /etc/ntp/keys
    # fw
    # ggf. hier noch das lokale Netz frei nehmen...
    # restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery
    restrict 127.0.0.1
    restrict -6 ::1

    # GPS_NMEA Type 20
    server 127.127.20.0 prefer
    # fudge 127.127.20.0 flag1 1 time2 0.400
    fudge 127.127.20.0 flag1 1

    # Shared Memory Driver (pushed by gpsd) Type 28
    server 127.127.28.0 minpoll 4 maxpoll 4 prefer
    fudge 127.127.28.0

    # ntp-pool
    # ggf. andere Server wie nist, uni, btp ergänzen
    server 0.de.pool.ntp.org
    server 1.de.pool.ntp.org
    server 2.de.pool.ntp.org
    server 3.de.pool.ntp.org
    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst

    Update:
    # GPS_NMEA Type 20
    server 127.127.20.0 mode 16 prefer
    fudge 127.127.20.0 flag1 1 time2 0.400

    # Shared Memory Driver (pushed by gpsd) Type 28
    # server 127.127.28.0 prefer
    # fudge 127.127.28.0 refid SHM

    server 127.127.28.0 minpoll 4 maxpoll 4
    fudge 127.127.28.0 time1 0.535
    # server 127.127.28.1 minpoll 4 maxpoll 4 prefer
    # fudge 127.127.28.1 refid PPS

  12. Fallstricke: SELinux...

    Wir erstellen die Datei "ntpd-2015-06-05.te"

    module ntpd-2015-06-05 1.1;

    require {
            type ntpd_t;
            type initrc_state_t;
            type initrc_t;
            class shm { unix_read read write unix_write associate };
            class file { read write };
            class capability sys_admin;
    }

    #============= ntpd_t ==============
    allow ntpd_t initrc_state_t:file { read write };
    allow ntpd_t initrc_t:shm { unix_read read write unix_write associate };
    allow ntpd_t self:capability sys_admin;

    Und machen diese zu einem festen Regelwerk

    checkmodule -M -m -o ntpd-2015-06-05.mod ntpd-2015-06-05.te
    semodule_package -o ntpd-2015-06-05.pp -m ntpd-2015-06-05.mod
    semodule -i ntpd-2015-06-05.pp

    Sonstig - viel Spaß....
  13. Dauerhaftes aktivieren von gpsd und ntpd als Systemdienst

    chkconfig gpsd on
    service gpsd restart
    chkconfig ntpd on
    service ntpd restart
  14. Das war's....

    Am Rande sei erwähnt, dass aber schon jetzt so eine USB-DCF77-Uhr für gute 60 Euro bzw. eine GPS-Uhr für 200 Euro aufwärts eingespart wird.

    ...natürlich kann man so eine Lösung nicht gerade mit einer Uhr aus Horn Bad-Meinberg vergleichen - aber für den "kleinen Mann" erfüllt diese durchaus die Norm.

Keine Kommentare:

Aktuelles