Hack: Bessere fake-hwclock für den Pi

Nicht jeder will oder kann die fehlende Echtzeituhr im Raspberry Pi mit der Raspbian-Lösung fake-hwclock kompensieren. Eine Alternative ist es, die aktuelle Zeit beim Systemstart mittels SSH von einem anderen Gerät im Netzwerk zu beziehen. Am besten von einem, das immer läuft und eine eigene eingebaute Uhr besitzt. In unserem Fall ist das ein Qnap-NAS. Dieses wird der Pi mit Hilfe eines Systemstart-Cronjobs als „Zeitansage“ „mißbrauchen“. Und das geht so:

Zuerst erstellen wir auf dem Pi ein SSH-Schlüsselpaar, und zwar eins ohne Paßwort. Dann kopieren wir von Hand (mit Paßworteingabe) den öffentlichen Schlüssel auf das NAS, fügen ihn zu dessen autorisierten Schlüsseln hinzu und löschen die Datei wieder vom NAS. Bitte im folgenden Code qnapnas durch den Hostnamen oder die IP des eigenen NAS ersetzen und deshalb ausnahmsweise nicht in einem Rutsch in die Shell einfügen:

cd ~; [ -d .ssh ] || mkdir .ssh; cd .ssh
ssh-keygen -b 2048 -f pi_timekey -N ""
scp pi_timekey.pub admin@qnapnas:~/
ssh admin@qnapnas
[ -d ~/.ssh ] || mkdir -p ~/.ssh
cat ~/pi_timekey.pub >> ~/.ssh/authorized_keys
rm ~/pi_timekey.pub
exit

Mit diesem Schlüsselpaar kann sich der Pi ab jetzt eigenmächtig mit dem NAS verbinden und dort Befehle ausführen. Jetzt fehlt noch der entsprechende Cronjob. Im Folgenden bitte dieses Mal die IP-Adresse des NAS vervollständigen und nicht den Hostnamen eintragen. Der Befehl muß ja ohne DNS-Abfrage auskommen:

newcron="@reboot newdate=\$(ssh -i /root/.ssh/pi_timekey admin@192.168.x.y "date"); date -s "\$newdate""
(crontab -l; echo "$newcron") | crontab -

Ob der Cronjob übernommen wurde, läßt sich mittels crontab -l prüfen. Die letzte Zeile muß jetzt etwa so aussehen:

  1. #
  2. # ... andere existierende Einträge ...
  3. #
  4. @reboot newdate=$(ssh -i /root/.ssh/pi_timekey admin@192.168.x.y "date"); date -s "$newdate"