Nachdem ich mein Gemüt mit einem Kaffee beruhigt habe, ist mir auch eine kleine Erleuchtung gekommen wie es zum tragischen Verlust meiner Aufzeichnungen gekommen sein muss: Bei meiner letzten Installation wurde ich mit einem zärtlichen aber fordernden „Papaaa …..“ abrupt aus meinem Tunnel geworfen. Da meine Tochter lernfähig ist und schon weiß das ein „gleich“ bei mir alles bedeuten kann, gesellten sich zwei kleine Hände zu meiner Tastatur und dort muss es dann eben passiert sein: Strg+a, Entf, Strg+s.
Egal... Meine Tochter war glücklich und muss mich nun auf das besinnen, was in meiner Vorlage so enthalten war – Fangen wir an:
Schritt 1
Im ersten Schritt müssen wir den I2C- Bus beim Systemstart aktivieren. Hierzu ändern wir die Datei /boot/config.txt entsprechend ab.>> sudo nano /boot/config.txt dtparam=i2c_arm=on #dtparam=i2s=on #dtparam=spi=on dtoverlay=i2c-rtc,ds3231
Mit Strg+s, Y, Enter, verlassen wir den Editor.
Schritt 2
Darauffolgend installieren wir die i2c-tools und entfernen den fake-hwclock, der beim Herunterfahren des Systems lediglich die Zeit in einer Datei speichert und beim Starten wieder einliest.
>> sudo -s >> apt-get install -y i2c-tools >> echo 'i2c-dev' >> /etc/modules >> apt-get purge -y fake-hwclock >> apt-get remove fake-hwclock -y >> dpkg --purge fake-hwclock
Schritt 3
Damit die Systemzeit beim erstmaligen Aktivieren des RTC’s nicht aus dem Takt gerät, löschen wir vorsichtshalber die Datei /etc/adjtime, in der alle Zeitkorrekturen eingetragen sind. Diese wird später vom System wieder neu angelegt und somit brauchen wir uns damit nicht weiter auseinanderzusetzen.
Nachfolgend bestimmen wir unsere Zeitzone über die Datei /etc/localtime, damit die UTC- Zeit vom System richtig ermittelt werden kann (OK, eigentlich läuft es genau anderes herum).
Bei Fragen rund um das Thema Zeit, finde ich im übrigen folgende Seite sehr informativ: https://linux-club.de/wiki/opensuse/Uhrzeit_Korrektur
>> rm -f /etc/adjtime. >> cp /usr/share/zoneinfo/Europe/Vienna /etc/localtime
Schritt 4
Nachdem alles vorbereitet ist, starten wir einfachhalber das System neu und überprüfen im Anschluss ob der RTC über I2C angesprochen werden kann.
>> reboot >> i2cdetect -y 1
Der letzte Befehl sollte folgendes zu Tage fördern
0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
Mit einem
>> hwclock -w >> hwclock -r
setzen wir schließlich die aktuelle Systemzeit im RTC und lesen diese im Nachhinein gleich wieder aus.
Glückwunsch – Das Schwierigste wäre geschafft.
Schritt 5
Damit die RTC- Zeit nicht allzu stark von der NTP- Zeit abweicht, sollte diese wenn nötig synchronisiert werden. Hierzu verwende ich ein kleines Phython- Skript, welches in unzähligen Abwandlungen im www zu finden ist, das Verhalten aber nahezu identisch ist:
Bei bestehender NTP- Verbindung und bei einer Abweichung von x Zeiteinheiten, update die RTC- Zeit mit der der NTP- Zeit.
Diese Routine lasse ich alle 24h einmal aufrufen, was aus meiner Sicht mehr als genügen sollte.
>> mkdir /home/openhabian/_scripts >> mkdir /home/openhabian/_log >> touch /home/openhabian/_scripts/ntp2hwclock.sh >> chmod +x /home/openhabian/_scripts/ntp2hwclock.sh >> ln -s /home/openhabian/_scripts/ntp2hwclock.sh /etc/cron.daily/ntp2hwclock
Meine ntp2hwclock.sh sieht im Übrigen wie folgt aus:
#!/bin/bash # Location of logfile LOGFILE="/home/openhabian/_log/ntp2hwclock.log" if [ ! -f $LOGFILE ]; then touch $LOGFILE fi # Set the maximum allowed difference in seconds between Hw-Clock and Sys-Clock maxDiffSec="2" msgNoConnection="No connection to time-server" msgConnection="Connection to time-server" # Check for NTP connection if ( ntpq -p | grep -q "^*" ); then echo $msgConnection echo "---------------------------------" secHwClock=$(sudo hwclock --verbose | grep "^Hw clock time" | awk '{print $(NF-3)}') echo "HwClock: $secHwClock sec" secSysClock=$(date +"%s") echo "SysClock: $secSysClock sec" echo "---------------------------------" secDiff=$(($secHwClock-$secSysClock)) # Compute absolute value if ( echo $secDiff | grep -q "-" ); then secDiff=$(echo $secDiff | cut -d "-" -f 2) fi echo "Difference: $secDiff sec" msgDiff="HwClock difference: $secDiff sec" if [ "$secDiff" -gt "$maxDiffSec" ] ; then echo "---------------------------------" echo "The difference between Hw- and Sys-Clock is more than $maxDiffSec sec." echo "Hw-Clock will be updated" # Update hwclock from system clock sudo hwclock -w msgDiff="$msgDiff --> HW-Clock updated." fi if !(awk '/./{line=$0} END{print line}' $LOGFILE | grep -q "$msgConnection") || [ "$secDiff" -gt "$maxDiffSec" ]; then echo $(date)": "$msgConnection". "$msgDiff fi else # No NTP connection echo $msgNoConnection if !(awk '/./{line=$0} END{print line}' $LOGFILE | grep -q "$msgNoConnection"); then echo $(date)": $msgNoConnection" >> $LOGFILE fi fi
Schritt 6
Damit sichergestellt ist, dass bei einem Neustart auch wirklich die RTC- Zeit als Systemzeit verwendet wird, adaptieren wir ein klein wenig die Datei /etc/rc.local. Vor dem Befehl exit fügen wir eine while-Schleife eine, die solange ausgeführt wird bis die Zeit des RTC-Moduls mit der lokalen Systemzeit überschrieben worden ist.
>> sudo nano /etc/rc.local while ! hwclock -s do echo "Failed to sync RTC to local time." done echo "Successfully synced RTC to local time"
Schritt 7
Nach einem weiteren Neustart sollte in der Datei /var/log/boot.log nun folgender Eintrag zu finden sein "Successfully synced RTC to local time"
Anmerkung
Ich hoffe mir sind keine Fehler unterlaufen, wenn doch, lasst es mich wissen.