chroot in das Raspberry-Pi-System benötigt.
## Installation des Grundsystems
-Herunterladen und in temporäres Dateisystem entpacken:
+Image-Datei einrichten und mounten:
+```console
+$ cd /tmp/
+$ fallocate -l 4G 20YY-MM-DD-controlpi-generic.img
+$ sudo losetup --find --show 20YY-MM-DD-controlpi-generic.img
+$ sudo parted --script /dev/loop0 mklabel msdos
+$ sudo parted --script /dev/loop0 mkpart primary fat32 0% 100M
+$ sudo parted --script /dev/loop0 mkpart primary ext4 100M 100%
+$ sudo mkfs.vfat -F32 /dev/loop0p1
+$ sudo mkfs.ext4 -F /dev/loop0p2
+$ sudo mount /dev/loop0p2 /mnt/
+$ sudo mkdir /mnt/boot
+$ sudo mount /dev/loop0p1 /mnt/boot/
+```
+
+Arch Linux ARM herunterladen und entpacken:
```console
-$ cd /tmp
$ wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-armv7-latest.tar.gz
-$ sudo mkdir controlpi
-$ sudo mount -t tmpfs none controlpi/
-$ sudo tar xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C controlpi/
+$ sudo tar xpf ArchLinuxARM-rpi-armv7-latest.tar.gz -C /mnt/
```
-In chroot wechseln und erstes Upgrade:
+In chroot wechseln und Paket-Schlüssel einrichten:
```console
$ TERM=xterm sudo arch-chroot controlpi/
# pacman-key --init
# pacman-key --populate archlinuxarm
-# pacman -Syu
```
Pakete entfernen und hinzufügen bis folgendes Minimalsystem erreicht ist:
gcc
git
i2c-tools
-jq
inetutils
+jq
linux-rpi
make
openssh
sudo
swig
vim
+# pacman -Syu
```
Das Journal soll nicht auf der SD-Karte gespeichert werden:
## Konfiguration aus git-Repository aufspielen
Von außerhalb des chroot:
```console
-$ sudo rsync -rlp etc /tmp/controlpi/
-$ sudo rsync -rlp boot /tmp/controlpi/
-$ rsync -rlp home/pi /tmp/controlpi/home/
+$ sudo rsync -rlp etc /mnt/
+$ sudo rsync -rlp boot /mnt/
+$ rsync -rlp home/pi /mnt/home/
```
Innerhalb des chroot eventuell Berechtigungen und Eigentürmer reparieren:
hinterlegt sein, die initial Zugriff per SSH haben sollen, da die
Konfiguration das Einloggen mit Passwort komplett unterbindet.
-## Image erstellen und aufspielen
+## Image schließen und aufspielen
Von außerhalb des chroot:
```console
-$ sudo tar czf controlpi.tar.gz -C controlpi/ .
-$ fallocate -l 4G 20YY-MM-DD-controlpi-arch.img
-$ sudo losetup --find --show 20YY-MM-DD-controlpi-arch.img
-$ sudo parted --script /dev/loop0 mklabel msdos
-$ sudo parted --script /dev/loop0 mkpart primary fat32 0% 100M
-$ sudo parted --script /dev/loop0 mkpart primary ext4 100M 100%
-$ sudo mkfs.vfat -F32 /dev/loop0p1
-$ sudo mkfs.ext4 -F /dev/loop0p2
-$ sudo mount /dev/loop0p2 /mnt
-$ sudo mkdir /mnt/boot
-$ sudo mount /dev/loop0p1 /mnt/boot
-$ sudo tar xpf controlpi.tar.gz -C /mnt/
-$ sudo umount /mnt/boot
-$ sudo umount /mnt
+$ sudo umount /mnt/boot/
+$ sudo umount /mnt/
$ sudo losetup --detach /dev/loop0
-$ sudo dd if=20YY-MM-DD-controlpi-arch.img of=/dev/mmcblk0 bs=1M oflag=sync status=progress
+$ sudo dd if=20YY-MM-DD-controlpi-generic.img of=/dev/sdx bs=1M oflag=sync status=progress
```
## Spezialisierte Images
* [MaschinenplatzPi](graphit/controlpi-image/maschinenplatzpi.md)
+* [UniPi](graphit/controlpi-image/unipi.md)
Dies kann in einem nächsten Schritt durch eine von der lokal laufenden
ControlPi-Instanz generierte Oberfläche geändert werden.
+Dadurch, dass die grafische Oberfläche mit der Einstellung
+`export XKB_DEFAULT_OPTIONS="numpad:mac"` gestartet wird, gibt es für die
+numerische Tastatur keinen Unterschied, ob Num-Lock ein- oder ausgeschaltet
+ist.
+Es werden immer die Nummern gesendet, was für unsere Anwendungen am Kiosk
+gewünscht ist.
+
## Anpassungen gegenüber dem generischen Image
-`chrony` (der NTP-Server für das interne Netzwerk) und `cage` (der
-Kiosk-Wayland-Compositor) können direkt aus den Arch-Linux-ARM-Repositories
-installiert werden:
+Öffnen einer Kopie des generischen Images:
```console
-# pacman -S chrony cage
+$ sudo losetup --find --show 20YY-MM-DD-controlpi-maschinenplatzpi.img
+$ sudo partprobe /dev/loop0
+$ sudo mount /dev/loop0p2 /mnt/
+$ sudo mount /dev/loop0p1 /mnt/boot/
+$ TERM=xterm sudo arch-chroot /mnt/
```
-Zum Zeitpunkt des Schreibens muss wegen eines Bugs (`qt5-webengine` nach
-Update von Abhängigkeiten nicht selbst geupdatet) noch `qt5-webengine`
-selbst gebaut werden (Achtung! Dauert sehr lange!):
+`chrony` (der NTP-Server für das interne Netzwerk), `cage` (der
+Kiosk-Wayland-Compositor) und `cmake` (zum Kompilieren des von `qiosk`)
+können direkt aus den Arch-Linux-ARM-Repositories installiert werden:
```console
-# pacman -S bison flex pkgconf debugedit
-# su - pi
-$ git clone https://github.com/archlinuxarm/PKGBUILDs.git
-$ cd PKGBUILDs/extra/qt5-webengine/
-$ makepkg -sA
-$ mv qt5-webengine-5.15.11-3-armv7h.pkg.tar.xz ~/
-$ cd ~/
-$ rm -r PKGBUILDs/
-$ exit
-# pacman -U /home/pi/qt5-webengine-5.15.11-3-armv7h.pkg.tar.xz
+# pacman -S chrony cage cmake
```
-Jetzt kann `qiosk` kompiliert und installiert werden:
+`qiosk` wird kompiliert und installiert:
```console
# su - pi
$ git clone https://github.com/Salamek/qiosk.git
# pacman -U /home/pi/qiosk-1.1.16-1-armv7h.pkg.tar.xz
```
+Wie auch beim generischen Image wird der Paket-Cache nach allen
+Installationen geleert, um möglichst Platz zu sparen:
+```console
+# paccache -rk0
+```
+
Die Konfigurations-Dateien werden – wie auch beim generischen Image – aus
diesem git-Repository synchronisiert:
```console
└── index.html
```
-Das Erstellen und Aufspielen des Images funktioniert dann genau wie für das
-[generische Image](graphit/controlpi-image).
+Die bisherige Default-Einstellung für die Netwerkschnittstelle wird im
+chroot entfernt:
+```console
+# rm /etc/systemd/network/eth0.network
+```
+
+Das Schließen und Aufspielen des Images funktioniert dann genau wie für das
+[generische Image](graphit/controlpi-image):
+```console
+$ sudo umount /mnt/boot/
+$ sudo umount /mnt/
+$ sudo losetup --detach /dev/loop0
+$ sudo dd if=20YY-MM-DD-controlpi-maschinenplatzpi.img of=/dev/sdx bs=1M oflag=sync status=progress
+```
--- /dev/null
+# Zusätzliche Konfiguration für UniPi
+Für den Betrieb von [UniPi](https://www.unipi.technology/)-Geräten sind
+einige Anpassungen des generischen Images notwendig.
+
+## UniPi-Kernel-Modul
+Der Hersteller stellt unter
+[https://github.com/UniPiTechnology/unipi-kernel-modules-v1](https://github.com/UniPiTechnology/unipi-kernel-modules-v1)
+ein Kernel-Modul zur Verfügung.
+
+Dieses haben wir unter
+[https://git.graph-it.com/?p=graphit/unipi-kernel.git](https://git.graph-it.com/?p=graphit/unipi-kernel.git)
+so angepast, dass es auf aktuellen Kernel-Versionen kompiliert werden kann.
+
+## Konfiguration aus Hersteller-Image
+Außerdem stellt der Hersteller unter
+[https://kb.unipi.technology/en:hw:02-neuron:download-image:03-opensource](https://kb.unipi.technology/en:hw:02-neuron:download-image:03-opensource)
+ein Debian-basiertes Betriebssytem-Image zur Verfügung.
+
+Dieses können wir mounten, um die Konfiguration näher zu untersuchen:
+```console
+$ unzip neuron-opensource-os_image-20220607.0.zip
+$ sudo losetup --find --show neuron-opensource-os_image-20220607.0.img
+$ sudo partprobe /dev/loop0
+$ sudo mount /dev/loop0p2 /mnt/
+$ sudo mount /dev/loop0p1 /mnt/boot/
+```
+
+## Anpassungen gegenüber dem generischen Image
+Öffnen einer Kopie des generischen Images:
+```console
+$ sudo losetup --find --show 20YY-MM-DD-controlpi-unipi.img
+$ sudo partprobe /dev/loop0
+$ sudo mount /dev/loop0p2 /mnt/
+$ sudo mount /dev/loop0p1 /mnt/boot/
+$ TERM=xterm sudo arch-chroot /mnt/
+```
+
+Abhängigkeiten installieren:
+```console
+# pacman -S linux-rpi-headers dtc
+```
+
+Kompilieren und installieren von Kernel und Device-Tree:
+```console
+# su - pi
+$ git clone git://git.graph-it.com/graphit/unipi-kernel.git
+$ cd unipi-kernel/
+$ export LINUX_DIR_PATH=/lib/modules/5.15.90-1-rpi-ARCH/build
+$ make
+$ sudo -E make install
+$ cd device_tree/
+$ dtc -O dtb -@ -o neuron-spi-new.dtbo neuron-spi-new-overlay.dts
+$ sudo cp neuron-spi-new.dtbo /boot/overlays/
+$ cd ~/
+$ rm -r unipi-kernel/
+$ exit
+```
+
+Wie auch beim generischen Image wird der Paket-Cache nach allen
+Installationen geleert, um möglichst Platz zu sparen:
+```console
+# paccache -rk0
+```
+
+Installieren des ControlPi-Plugins:
+```console
+# su - pi
+$ source controlpi-venv/bin/activate
+$ pip install git+git://git.graph-it.com/graphit/controlpi-unipi.git
+$ exit
+```
+
+Die Konfigurations-Dateien werden – wie auch beim generischen Image – aus
+diesem git-Repository synchronisiert:
+```console
+$ sudo rsync -rlp unipi/boot /mnt/
+$ rsync -rlp unipi/home/pi /mnt/home/
+```
+
+Im Einzelnen sind dies:
+```console
+unipi/
+├── boot
+│ └── config.txt
+└── home
+ └── pi
+ └── conf.json
+```
+
+Das Schließen und Aufspielen des Images funktioniert dann genau wie für das
+[generische Image](graphit/controlpi-image):
+```console
+$ sudo umount /mnt/boot/
+$ sudo umount /mnt/
+$ sudo losetup --detach /dev/loop0
+$ sudo dd if=20YY-MM-DD-controlpi-unipi.img of=/dev/sdx bs=1M oflag=sync status=progress
+```
then
export WLR_LIBINPUT_NO_DEVICES=1
export XKB_DEFAULT_OPTIONS="numpad:mac"
- exec cage qiosk file:///home/pi/index.html
+ cage qiosk file:///home/pi/index.html
fi
--- /dev/null
+dtparam=i2c_arm=on
+dtoverlay=i2c-rtc,mcp7941x
+dtoverlay=neuron-spi-new
+
+initramfs initramfs-linux.img followkernel
--- /dev/null
+{
+ "Debug": {
+ "plugin": "WSServer",
+ "web": {
+ "/": {
+ "module": "controlpi_plugins.wsserver",
+ "location": "Debug"
+ }
+ }
+ },
+ "Log": {
+ "plugin": "Log",
+ "filter": [{}]
+ },
+ "UniPi": {
+ "plugin": "UniPi"
+ }
+}