Benutzer-Werkzeuge

Webseiten-Werkzeuge


Übersetzungen dieser Seite:
de:koarrl_alzraspi

koarrl: Alzheim-RaspberryPi 2 oder 3

(last edit: 2019-07-27) - BAUSTELLE .. wird aber bald fertig …

Neuerdings läuft das Ding unter Raspbian-10, aber ohne systemd.
Warum? Siehe https://ihatesystemd.com/

---- Debian-stable (Raspbian 10 - buster) installieren ----

Ziel des Projektes ist ein schlankes System ohne Grafik, zugänglich über ssh -
- über die eth-Schnittstelle (Wartung, Debugging) oder WLAN (der RPi soll als access point arbeiten).
Es genügt dafür eine 2GB-SDcard (Raspbian9) bzw. für Raspbian 10 „mindestens“ eine 8GB-Karte.
Je schneller und je verläßlicher, je besser. Der Zweck?
Ein standalone-Gerät mitten im Wald, ohne Internet-Anbindung, mit einem Handy-Browser abfragbar.
Ein Lowcost-Datenlogger, dessen Hardwarekomponenten möglichst über Jahre hinaus verfügbar sein sollen.
Und eine RTC brauchen wir auch noch, da im Wald kein ntp-Server erreichbar ist :-)

2G-SDcard von Image erzeugen

Minimalistisches SDcard-Image hier downloaden: http://www.raspberrypi.org/downloads/raspbian/

Die SHA256-sum vom image.zip sicherheitshalber vor Dekomprimieren checken!

root@host:~# wget https://downloads.raspberrypi.org/raspbian_lite_latest

Dekomprimieren per commandline (mc versagt bei sehr großen Files)

root@host:~# unzip 2018-11-13-raspbian-stretch-lite.zip

Image auf eine möglichst schnelle SDcard übertragen

root@host:~# dd bs=4M if=2018-11-13-raspbian-stretch-lite.img of=/dev/sdc status=progress conv=fsync

Sofort den Netzwerk-Zugang vorbereiten (Default-IP ist 192.168.1.1)
Es gibt eine kleine FAT-Partition mit vielen Einstellmöglichkeiten für Anfänger…
„touch ssh“ z.B. bewegt den Pi, ssh-Zugangsversuche zu akzeptieren :-)

root@host:~# mount /dev/sdc1 /mnt root@host:~# cd /mnt root@host:~# touch ssh root@host:~# umount /mnt

Image betrachten (wer das will)

root@host:~# losetup -P /dev/loop0 2018-11-13-raspbian-stretch-lite.img root@host:~# fdisk -l /dev/loop0 Disk /dev/loop0: 1,8 GiB, 1866465280 bytes, 3645440 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x7ee80803 Device Boot Start End Sectors Size Id Type /dev/loop0p1 8192 98045 89854 43,9M c W95 FAT32 (LBA) /dev/loop0p2 98304 3645439 3547136 1,7G 83 Linux

ACHTUNG! 2G-SD-Karten sind evtl. leicht verschieden groß, der Versuch, ein zu großes Image per dd zu kopieren, endet mit einem korrupten Filesystem!

/dev/loop0p1 bzw. /dev/loop0p2 können einfach auf /mnt eingebunden werden.

SDcard-Backup machen

root@host:~# dd bs=4M if=/dev/sdb of=mypi.img status=progress conv=fsync

Boot-Partition mit Label versehen

root@host:~# fatlabel /dev/sdc1 "BOOT"

Die kurze UUID kann nur beim Neuformatieren vergeben werden, ist aber hier ziemlich egal.
Kontrolle:

root@host:~# blkid /dev/sdc1 /dev/sdc1: LABEL="BOOT" UUID="9304-D9FD" TYPE="vfat" PARTUUID="a6924f9f-01"

Root-Partition mit Label versehen

root@host:~# e2label /dev/sdc2 "MYOWNPI"

UUID der Root-Partition unique machen

Sonst gibt es Schwierigkeiten, mehrere SD-Karten abwechselnd auf einem Host-PC zu mounten und zu editieren.

root@host:~# tune2fs /dev/sdc2 -U `uuid`

Das Tool „uuid“ generiert eine Random-Zahl im passenden Format.

SDcard einsetzen, Raspberry Pi einschalten

(Beim ersten Booten bläst sich die Root-Partition auf den maximal verfügbaren Platz der SDcard auf!)
ACHTUNG! Nicht alle 2G-SD-Karten sind genau gleich groß, etwas zu große Images auf kleinere Karten zurückzuspielen macht später Ärger.

Erster login - z.B. von einem Laptop mit zurechtgebogener eth-Schnittstelle.

root@host:~# ifconfig eth0 192.168.1.2

Default-User: pi (pwd: raspberry - sofort das User-Passwort ändern!)

root@host:~# ssh 192.168.1.1 -l pi

root werden mit …

pi@raspberrypi:~# sudo su

… und auch hier ein Root-Passwort definieren.
Es empfiehlt sich, nun gleich mit dem Lieblings-Paketmanager das System zu aktualisieren! Z.B.:

root@raspberrypi:~# apt-get update

Netzwerk-Konfiguration

Die wlan0-Schnittstelle wird erst später gebraucht. Über die kann später der Webserver per Handy angebrowst werden. Geduld bitte, mehr dazu siehe weiter unten.

ACHTUNG, NEU! Nicht mehr /etc/config/network, sondern /etc/dhcpcd.conf editieren - untenstehendes anhängen!
(vorher Backup machen auf *.ORIG!)

.... # ~~~~ from here: added by koarrl ~~~~ interface eth0 static ip_address=172.16.1.13/24 static domain_name_servers=192.168.1.1 8.8.8.8

Dazu passend am Host-Rechner (eth-IP: 172.16.1.3) das IP-Forwarding einrichten (vorerst per commandline)

root@host:~# ifconfig eth0 172.16.1.3 root@host:~# iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE root@host:~# iptables -A FORWARD -i eth0 -j ACCEPT root@host:~# echo 1 > /proc/sys/net/ipv4/ip_forward

NEU: dgl. für Debian Buster … Erst einmal der Ethernet-Schnittstelle mit GUI-Bordmitteln ihre statische IP zuweisen. Dann:

root@host:~# iptables -t nat -A POSTROUTING -o wlp1s0 -j MASQUERADE root@host:~# iptables -A FORWARD -i enp3s0 -j ACCEPT

und in /etc/sysctl.conf diese Zeile einkommentieren!

.... #net.ipv4.ip_forward=1

Den Pi wieder rebooten. Das Einsteigen geht ab jetzt so:

root@host:~# ssh 172.16.1.13 -l pi

Wenn der ssh-Zugang vom Host verweigert wird:

user@host:~$ rm ~/ssh/.known_hosts

Nun dem Pi einen Internet-Zugang über den Host-Rechner ermöglichen:

root@raspberrypi:~# route add default gw 172.16.1.3

Pakete aktualisieren und dazuinstallieren

root@raspberrypi:~# apt-get update root@raspberrypi:~# apt-get install dselect mc minicom chkconfig

Anm.: Das Paket „ntp“ ist bereits installiert, womit der ntp-Daemon immer für eine richtige Uhrzeit sorgt.
Das ist wichtig für die Ablaufdaten diverser Sicherheitszertifikate.
Der Raspberry Pi hat KEINE RTC mit Batterybackup!

GANZ WICHTIG: dselect in Profi-Modus versetzen :-)

root@raspberrypi:~# echo expert >> /etc/dpkg/dselect.cfg

Zwischendurch: Kleinkram, Hardwaretests

minicom mit FTDI-Modul testen:

root@raspberrypi:~# minicom -c on -D /dev/ttyS0

Handshake → none und local echo → yes setzen –> Zeichen erscheinen doppelt, wenn TX-Rx-Jumper gesteckt

raspi-config starten:

root@raspberrypi:~# raspi-config

Einstellungen ändern:

Hostname: mypi
default locale: de_AT.UTF8
timezone Europe/Vienna

… und wieder rebooten! …

Nützliche Tools für Startskripte

Anzeige aktiver Startskripte:

root@raspberrypi:~# service --status-all

Ein Multi-Tool, mit dem SysV-Startscripte vom neuen ach so tollen systemd (würg!) angenommen werden - siehe manpage:

root@raspberrypi:~# chkconfig

Alle Startscripte neu anwerfen:

root@raspberrypi:~# systemctl daemon-reload

my_startscript anwerfen:

root@raspberrypi:~# systemctl start my_startscript

my_startscript dauerhaft (über reboot) installieren:

root@raspberrypi:~# systemctl enable my_startscript

LED-Ansteuerung über bash

Hier verstecken sich beim RPi2 die LEDs:
/sys/class/leds/led0 (grün)
/sys/class/leds/led1 (rot)

z.B. „grün ein“:

root@raspberrypi:~# echo default-on > /sys/class/leds/led0/trigger

z.B. „rot aus“:

root@raspberrypi:~# echo none > /sys/class/leds/led1/trigger

Die Mutter aller I/O-Libraries (und mehr)

Siehe: http://abyz.me.uk/rpi/pigpio/download.html - Unbedingt holen und builden!
Am besten die C-Library verwenden, dann ist kein Daemon vonnöten.
Wunderschön gemachte Doku dazu: http://abyz.me.uk/rpi/pigpio/cif.html

pi@raspberrypi:~ $ wget abyz.me.uk/rpi/pigpio/pigpio.tar pi@raspberrypi:~ $ tar xf pigpio.tar pi@raspberrypi:~ $ cd PIGPIO pi@raspberrypi:~/PIGPIO $ make pi@raspberrypi:~/PIGPIO $ sudo make install

nfs-Server aufsetzen

Das ist für Debugging und Editieren mit den Bordmitteln des Host-PC sehr nützlich. Paket holen …

root@raspberrypi:~# apt-get install nfs-kernel-server

… und /etc/exports editieren:

/home/pi 172.16.1.3(rw,sync,no_subtree_check)

… und schließlich:

root@raspberrypi:~# service nfs-kernel-server reload

autofs+nfs: das Homedir vom Pi erscheint am Entwickler-PC

Es empfiehlt sich hier nicht der Ansatz über eine Zeile in /etc/fstab, weil dann der Pi beim Ausschalten, sofern sein nfs-Export noch am Entwickler-PC gemountet ist, jenen zum laaaaaangen Warten verdammt.
Besser: die etwas undurchschaubare autofs-Methode. Auf RPi-Seite muß dazu der nfs-Kernel-Server installiert sein und /etc/exports wie oben beschrieben aussehen.

Auf der Host-Seite (Entwickler-PC) braucht man autofs. Dafür (1) /etc/auto.master editieren:

... /var/autofs/nfs /etc/auto.nfs --timeout=100 ...

Das bedeutet, daß später, nach Neustart des autofs-Dienstes am Hostrechner, ein Ordner /var/autofs/nfs angelegt wird.
Und dann noch (2) /etc/auto.nfs editieren bzw. neu anlegen:

pi -fstype=nfs,rw,soft,intr 172.16.1.13:/home/pi

Nun den autofs-Dienst mit „service autofs restart“ neu starten. Damit wird ein Ordner /var/autofs/nfs/pi angelegt.
Erst ein lesender Zugriff auf diesen Ordner -z.B. „ls /var/autofs/nfs/pi“ oder über ein symlink aus user's home - initiiert dann den eigentlichen Mountvorgang. Nach 100 Sekunden Inaktivität (Beispiel!) verschwindet der Spuk wieder.
Sobald der RPi ausgeschaltet wird, ist das nfs-share natürlich unerreichbar. Das nervt, weil das der Host erst nach einer Handvoll Sekunden erkennt. Abhilfe:

# umount -fl /var/autofs/nfs

Vor einem neuerlichen autofs-Zugriff auf dieses nfs-share muß dann folgendes geschehen:

# service autofs restart

Dank gebührt den Schreibern von https://wiki.archlinux.org/index.php/Autofs .

Minimalistischen cgi-fähigen Webserver aufsetzen

Wir nehmen, da es kein Debian-Paket mehr gibt, die Sourcen, um thttpd im Letztstand zu bauen, von hier:
https://acme.com/software/thttpd/thttpd-2.29.tar.gz

Davon gibt es eine Koarl-mod: thttpd-2.29c (kleine Umbauten)

  • Makefile.in modifiziert
  • verwendet user:group www-data:www-data
  • server root = /var/www
  • initscript dazu: thttpd.sh

Einfach auf dem Pi compilieren (Achtung, ARM-Architektur, am Host würde man die gnu-eabi-Toolchain brauchen):

pi@raspberrypi:~ $ ./configure --prefix=/usr/local pi@raspberrypi:~ $ make pi@raspberrypi:~ $ sudo make install

Ja, das dauert ein Weilchen. Ungeduldige starten den Webserver dann mit folgender Commandline:

root@raspberrypi:~# /usr/local/sbin/thttpd -d /var/www -c "**"

Oder besser und dauerhaft per initscript (dieses thttpd.sh hier ist beigepackt in V2.29d)

#!/bin/sh ### BEGIN INIT INFO # Provides: thttpd webserver # Required-Start: # Required-Stop: umountroot # Should-Stop: # X-Start-Before: checkroot # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: handle thttp daemon (locally built version 2.29d needed!) # Description: ### END INIT INFO set -e # Include core init functions if needed . /lib/lsb/init-functions # server config might be found here ... CONFIGFILE=/etc/default/thttpd SRV_VER=`/usr/local/sbin/thttpd -V` case "${1:-}" in start) echo "Starting thttpd webserver $SRV_VER" if [ -f $CONFIGFILE ]; then /usr/local/sbin/thttpd -C $CONFIGFILE else /usr/local/sbin/thttpd -d /var/www -c "**" fi ;; stop) PID=`pidof thttpd` echo "Stopping thttpd webserver" [ -n "$PID" ] && kill -9 $PID ;; restart | force-reload) $0 stop $0 start ;; status) echo -n "thttpd webserver" [ -z "`pidof thttpd`" ] && echo -n " NOT" echo " running!" exit 0 ;; *) echo "Usage: ${0:-} {start|stop|restart|force-reload|status}" >&2 exit 1 ;; esac

NEU: der hungrige systemd muß nun gefüttert werden, das Initscript ist im alten LSB-Stil. Siehe https://wiki.debian.org/LSBInitScripts

root@raspberrypi:~# cp thttpd.sh /etc/init.d/thttpd root@raspberrypi:~# chown root:root /etc/init.d/thttpd root@raspberrypi:~# chkconfig -add thttpd

Kontrolle: wird das thttpd-Initscript in den Runlevels 2,3,4,5 gestartet? (welche runlevels? Siehe Kommentar-Header im Startscript)

root@raspberrypi:~# chkconfig -l ..... thttpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off S:on ....

Und nun? Das Server-Root-Verzeichnis mit anzeigbaren Test-Files befüllen (index.html, cgi-bin/helloCGI, …)
Damit werden statische HTML-Seiten und beliebige cgi-scripts geliefert (Sicherheit = egal!)
Der Webserver wird ab jetzt nach jedem Reboot gemäß dem Initscript gestartet!

Headless-System weiter abschlanken

Unnötige Pakete und Dienste können nun nach Geschmack deinstalliert werden (so vorhanden) …

  • raspi-config
  • triggerhappy
  • ntp
  • dbus (nur für Dektop environment)
  • console-kit-daemon (nur für Dektop environment)
  • polkitd
  • gvfsd
  • dbus-daemon
  • dbus-launch

System noch schneller machen

root@raspberrypi:~# echo -n performance | tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

---- WLAN-AccessPoint einrichten ----

WLAN-Hardware organisieren/verstehen

Beim RPi2 braucht man einen WLAN-Stick, der RPi3 hat die Hardware schon onboard.
Proprietäre Firmware sollte schon vorinstalliert sein.

https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md

https://wiki.debianforum.de/WLAN-Access-Point_mit_hostapd_und_USB-Stick

https://www.elektronik-kompendium.de/sites/raspberry-pi/2002171.htm

Zeige angesteckten USB-WLAN-Stick an:

root@raspberrypi:~# iwconfig

Zeige Fähigkeiten des Sticks:

root@raspberrypi:~# iw list

Zeige existente WLANs an:

root@raspberrypi:~# iwlist wlan0 scan | grep ESSID

Host Access Point Daemon (hostapd) einrichten

Siehe: https://www.raspberrypi.org/documentation/configuration/wireless/access-point.md
Paket installieren und dann den Dienst gleich einmal stoppen.

root@raspberrypi:~# apt-get install hostapd root@raspberrypi:~# systemctl stop hostapd

Am besten das Configfile /etc/hostapd/hostapd.conf neu anlegen.
ACHTUNG!!
1. Der verblödete Parser interpretiert (manchmal?) Kommentare in derselben Zeile als Argumente.
2. wpa_passphrase muß mindestens 9 Zeichen lang sein.
3. beacon_int muß zwischen 15 und 65535 [Sekunden] betragen.
Dieses kommentarbereinigte, minimalistische File hier läuft am RPi3:

# edited by koarrl (ultimate) # DONTUSE Tab chars and comments behind non-empty lines! interface=wlan0 driver=nl80211 ssid=rpi3-wlan hw_mode=g channel=4 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=abcdefghi wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP rsn_pairwise=CCMP

Und dann im File /etc/default/hostapd den Verweis auf das eben erstellte Configfile anlegen,
dafür die Zeile mit DAEMON_CONF=… einkommentieren, also

.... DAEMON_CONF="/etc/hostapd/hostapd.conf" ....

Nun den den Dienst wieder starten bzw. für die Zukunft dauerhaft enablen.

root@raspberrypi:~# systemctl enable hostapd

DHCP-Server aufsetzen

ggfs Paket installieren und dann den Dienst gleich einmal stoppen. Originales Configfile sichern.

root@raspberrypi:~# apt-get install dhcpcd root@raspberrypi:~# systemctl stop dhcpcd root@raspberrypi:~# mv /etc/dhcpcd.conf /etc/dhcpcd.conf.ORIG

File /etc/dhcpcd.conf editieren.
Dazu am Ende Folgendes anfügen:

.... # ~~~~ from here: added by koarrl ~~~~ interface eth0 static ip_address=172.16.1.13/24 static domain_name_servers=192.168.1.1 8.8.8.8 interface wlan0 static ip_address=192.168.4.1/24 nohook wpa-supplicant

Neues, minimalistisches File /etc/dnsmasq.conf anlegen.
Es soll für den DHCP-Server nur die WLAN-Schnittstelle verfügbar sein.

interface=wlan0 no-dhcp-interface=eth0 dhcp-range=interface:wlan0,192.168.4.2,192.168.4.3,infinite

Nun den den Dienst wieder starten bzw. für die Zukunft dauerhaft enablen.

root@raspberrypi:~# systemctl enable dnsmasq

Nun (bzw. auch nach jedem weiteren reboot) sollte ein WLAN mit der oben definierten SSID sichtbar sein, und nach Einklinken in dieses WLAN und Zuweisung einer IP-Adresse per DHCP sollte man über die oben definierte IP-Adresse die von thttpd präsentierte Webseite sehen können.

Echtzeituhr anschließen

Der Pi hat leider keine RTC. Sofern er offline läuft und Daten loggen soll, wäre also ein DS1994 fein.
Hardwaremäßig sind für den Onewire-Bus nur 3 Drähte anzuschließen:

  • Masse an Steckerleiste - pin 9
  • +3,3V an Steckerleiste - pin 1
  • Onewire-Bus an Steckerleiste - z.B. den pin 7 („BCM 4“)

Und dazu ein 2K7-Pullup-Widerstand zwischen Onewire-Bus und +3,3V.

Nun muß zunächst einmal der Kerneltreiber für den Onewire-Bus aktiviert werden - einfach durch Anhängen dieser Zeilen an /boot/config.txt …

.... # Uncomment this for Dallas-Maxim OneWireBus dtoverlay=w1-gpio,gpiopin=4

.. und rebooten. Alles findet sich dann unter /sys/bus/w1/devices/~unique_num~

Wer es eilig hat, bestellt ein Chinesenmodul mit Li-Batterie und einem DS3232.
Diese RTC wird über I2C angebunden und sollte out of the box laufen und den date-Befehl unterstützen.

(wird nach Lieferung fortgesetzt …)

owfs installieren

Der Dallas-Baustein kann dadurch als Baumstruktur unter einem Mountpoint abgebildet werden.

Installieren:

  • owfs + Abhängigkeiten (fuse etc.)
  • libowcapi-3.1.5

Hardware:

  • Dallas-RTC DS1994 mit 2K7-pullup anschließen.

In /sys/bus/w1/devices erscheinen nun zwei Ordner - für den Busmaster und den DS1994 (Typcode-unique number), z.B. also:

root@Pi:/sys/bus/w1/devices# ls -l
insgesamt 0
lrwxrwxrwx 1 root root 0 Apr 18 19:28 04-0000005d660f -> ../../../devices/w1_bus_master1/04-0000005d660f
lrwxrwxrwx 1 root root 0 Apr 18 19:25 w1_bus_master1 -> ../../../devices/w1_bus_master1

Mountpoint definieren:

# mkdir /media/owfs

Editieren von /etc/owfs.conf - der Nettoinhalt:

! server: server = localhost:4304
mountpoint = /media/owfs
allow_other
server: w1 = all
server: port = localhost:4304

Auch /etc/fuse.conf muß editiert werden:

...
# This is needed for owfs!
user_allow_conf

Nun (nach reboot) der Mountvorgang für (alle bzw. hier - nur der DS1994) Devices:
Mittels Aufruf von /usr/bin/owfs, die Parameter werden aus obenerwähntem configfile übernommen.

# owfs

Wir sehen jetzt eine Baumstruktur unter dem Mountpoint, Datum und Uhrzeit finden sich darin.

# cd /media/owfs/04.0F665D000000
# cat date
  Sat Mar 14 16:40:40 1953
# cat date
  Sat Mar 14 16:40:44 1953
     

Ähem. Die Uhr läuft, gehört aber eingestellt. Jetzt wird es trickreich.
Defaultmäßig ist die Uhr nicht schreibbar. Entgegen der Doku unter http://owfs.org/index.php?page=ds1994 wird der Schreibschutz aufgehoben durch:

# echo 1 > /media/owfs/04.0F665D000000/readonly/clock

Nun kann die Uhr mit einem gleichformatigen Datestring beschrieben werden, oder noch einfacher - auf die Systemzeit gesetzt mit einem Leerstring!

# echo > /media/owfs/04.0F665D000000/date

Nun die Uhr besser wieder schreibschützen:

# echo 0 > /media/owfs/04.0F665D000000/readonly/clock

Kontrolle: RPi shutdown, ausschalten, Dallas-Uhr ab-/an-stecken, einschalten, rebooten, und …

# owfs
# cat /media/owfs/04.0F665D000000/date
  Thu Apr 18 21:51:36 2019
  

Funktioniert, hurra! Zeitzone und Sommerzeit: später mal, weiterer Forschungsbedarf!

Zusammenfassung der Zeitfunktionen

owfs muß hier bereits gestartet sein und der Dallas-TIC DS1994 gemountet.

Tipp: Systemuhr im Epoch-Format (Sekunden seit 1.1.1970, 0:00:00) ausgeben

# date +%s
 

Irgendeinen DS1994 mit der Systemuhr synchronisieren:

# echo 1 > /media/owfs/04.????????????/readonly/clock
# echo > /media/owfs/04.????????????/date
# echo 0 > /media/owfs/04.????????????/readonly/clock

Die Systemuhr mit (irgendeiner) TIC-Zeit synchronisieren:
Das ist die Funktion, die beim Startup statt dem script „fake-hwclock“ ausgeführt werden sollte. –> stattdessen wird ein modifiziertes script „TIC-hwclock“ eingeführt.

# date -s @`cat /media/owfs/04.????????????/udate`

ACHTUNG! Defekte oder nicht vorhandene TICs können beim Zugriff keine Rückmeldung liefern.
Es gibt aber ein Timeout (wo definiert?)

Nur zum Testen - TIC-Zeit auf 1.4.2019, 02:00 CEST setzen:

# echo 1 > /media/owfs/04.????????????/readonly/clock; echo "1554076800" > /media/owfs/04.????????????/udate; echo 0 > /media/owfs/04.????????????/readonly/clock

TIC-Zeit abfragen:

# cat  /media/owfs/04.????????????/date

Das Startscript TIC-hwclock

ACHTUNG! der LSB-Header ist noch zweifelhaft. Funktion sonst OK.
Abgesehen davon, daß der owfs-Baum world-writable ist … für dieses RPi-Projekt ist das egal.

#!/bin/sh ### BEGIN INIT INFO # Provides: TIC-hwclock # Required-Start: # Required-Stop: umountroot # Should-Stop: # X-Start-Before: checkroot # Default-Start: S # Default-Stop: 0 1 6 # Short-Description: Restore / save the current clock from file or Dallas TIC DS1994 (if available) # Description: ### END INIT INFO set -e # Include core init functions if needed . /lib/lsb/init-functions PARAM=/etc/default/fake-hwclock if [ -f $PARAM ]; then . "$PARAM" fi # start owfs & mount TIC here if not already done [ -z "`ls /media/owfs`" ] && /usr/bin/owfs # determine if exactly one Dallas TIC is connected (owfs must already be running and TIC must be mounted) HWCLOCK=FAKE # default: fake clock needed if [ -d /media/owfs/04.???????????? ]; then # are there any TICs? NUMOFTICS=`ls -1 /media/owfs | grep 04. | wc -l` # yes, so count them, expect one if [ $NUMOFTICS -eq 1 ]; then APRIL_1_2019=1554076800 # a running TIC must have passed this past point in time SEC1=`cat /media/owfs/04.????????????/udate` # what's the time now? sleep 2 SEC2=`cat /media/owfs/04.????????????/udate` # what's the time now, a bit later? [ $((SEC2-SEC1)) != 0 ] && [ $SEC1 -gt $APRIL_1_2019 ] && HWCLOCK=TIC # Yippie, we have a running TIC! fi fi echo "*** "$HWCLOCK" ***" case "${1:-}" in stop|reload|restart|force-reload) if [ "$HWCLOCK" = "TIC" ]; then echo "Stopping TIC-hwclock: nothing to do!" else echo "Stopping fake-hwclock: saving system time to file " fake-hwclock save fi ;; start) if [ "$HWCLOCK" = "TIC" ]; then echo "Starting TIC-hwclock: sync system time with TIC" date -s @`cat /media/owfs/04.????????????/udate` else echo "Starting fake hwclock: loading last known system time from file." fake-hwclock load $FORCE fi ;; *) echo "Usage: ${0:-} {start|stop|status|restart|reload|force-reload}" >&2 exit 1 ;; esac

Dieses script ersetzt das Startscript „fake-hwclock“.
Dafür muß man folgendes tun:

  • TIC-hwclock nach /etc/init.d kopieren
# systemctl disable fake-hwclock
# systemctl enable TIC-hwclock

Unnötiges weg:

# systemctl disable owftpd
# systemctl disable owhttpd

Ein besseres Startscript

Es gibt obskure Probleme mit dem LSB-Kommentarheader bei der Installation des Initscripts „TIC-hwclock“.
Lesen und verstehen: https://wiki.debian.org/LSBInitScripts/
Besser wäre es vielleicht, das uralte und bewährte Initscript „hwclock.sh“ zu modifizieren …

TIC-Testtool

Damit kann man alte DS1994 funktionsprüfen.
Leider hängt sich manchmal beim Umstecken etwas auf, dann hilft nur noch reboot.

#!/bin/bash # **************************************************************************** # # tict: a tool for old Dallas DS1994 checking # # by koarrl 2019-04-24 # # **************************************************************************** usage() { echo "usage: `basename $0` { r | s | t }" echo " r .. read time & date from TIC" echo " s .. write system time to TIC & start it, report success or failure" echo " t .. halt TIC internal clock (save battery)" } waittic() { NOWTIC=`ls -1 /media/owfs | grep 04.` if [ -z "$NOWTIC" ]; then echo -n "Insert TIC please " while ((1)); do sleep 0.5 NOWTIC=`ls -1 /media/owfs | grep 04.` [ -n "$NOWTIC" ] && { echo; break; } echo -n "." done fi echo "TIC found: "$NOWTIC } getstate() { SEC1=`cat $TICMOUNT/$NOWTIC/udate` sleep 1.1 SEC2=`cat $TICMOUNT/$NOWTIC/udate` if [ $((SEC2-SEC1)) != 0 ]; then STATE=running else STATE=stopped fi } # **** MAIN ****************************************************************** TICMOUNT="/media/owfs" [ -z $1 ] && { usage; exit; } [ -d $TICMOUNT ] || { echo "owfs needed, but not found! Sorry."; exit; } [ -n `ls -1 $TICMOUNT | grep 04.` ] && waittic case "$1" in r) echo "Reading time from TIC ..." getstate echo "TIC ...... "`cat $TICMOUNT/$NOWTIC/date`" ($STATE)" echo "System ... "`date` ;; s) echo "Setting time and starting TIC ..." echo 1 > $TICMOUNT/$NOWTIC/readonly/clock echo > $TICMOUNT/$NOWTIC/date echo 0 > $TICMOUNT/$NOWTIC/readonly/clock echo 1 > $TICMOUNT/$NOWTIC/running getstate echo "TIC ...... "`cat $TICMOUNT/$NOWTIC/date`" ($STATE)" echo "System ... "`date` ;; t) echo "Stopping TIC ..." echo 0 > $TICMOUNT/$NOWTIC/running ;; *) ;; esac

de/koarrl_alzraspi.txt · Zuletzt geändert: 2019/07/27 21:31 von koarrl