From b05fa5e02e5a1a7a08957465b0c1b4532fdd4515 Mon Sep 17 00:00:00 2001 From: Benjamin Braatz Date: Wed, 1 Feb 2023 06:09:55 +0100 Subject: [PATCH] Add UniPi image, streamline generic and MaschinenplatzPi image. --- doc/index.md | 55 ++++++++------- doc/maschinenplatzpi.md | 58 +++++++++------ doc/unipi.md | 97 ++++++++++++++++++++++++++ maschinenplatzpi/home/pi/.bash_profile | 2 +- unipi/boot/config.txt | 5 ++ unipi/home/pi/conf.json | 18 +++++ 6 files changed, 187 insertions(+), 48 deletions(-) create mode 100644 doc/unipi.md create mode 100644 unipi/boot/config.txt create mode 100644 unipi/home/pi/conf.json diff --git a/doc/index.md b/doc/index.md index e0991f7..a0b387a 100644 --- a/doc/index.md +++ b/doc/index.md @@ -5,21 +5,32 @@ Die Pakete `binfmt-qemu-static` und `qemu-user-static` werden für das 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: @@ -31,8 +42,8 @@ fakeroot gcc git i2c-tools -jq inetutils +jq linux-rpi make openssh @@ -46,6 +57,7 @@ rsync sudo swig vim +# pacman -Syu ``` Das Journal soll nicht auf der SD-Karte gespeichert werden: @@ -104,9 +116,9 @@ $ exit ## 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: @@ -119,26 +131,15 @@ In `/home/pi/.ssh/authorized_keys` sollten die Public-Keys derjenigen 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) diff --git a/doc/maschinenplatzpi.md b/doc/maschinenplatzpi.md index 2f23df2..dcef5b5 100644 --- a/doc/maschinenplatzpi.md +++ b/doc/maschinenplatzpi.md @@ -61,31 +61,31 @@ weiterleiten). 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 @@ -98,6 +98,12 @@ $ exit # 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 @@ -134,5 +140,17 @@ maschinenplatzpi/ └── 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 +``` diff --git a/doc/unipi.md b/doc/unipi.md new file mode 100644 index 0000000..0f91a2e --- /dev/null +++ b/doc/unipi.md @@ -0,0 +1,97 @@ +# 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 +``` diff --git a/maschinenplatzpi/home/pi/.bash_profile b/maschinenplatzpi/home/pi/.bash_profile index a143129..f6d50bb 100644 --- a/maschinenplatzpi/home/pi/.bash_profile +++ b/maschinenplatzpi/home/pi/.bash_profile @@ -9,5 +9,5 @@ if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ] 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 diff --git a/unipi/boot/config.txt b/unipi/boot/config.txt new file mode 100644 index 0000000..45f33a5 --- /dev/null +++ b/unipi/boot/config.txt @@ -0,0 +1,5 @@ +dtparam=i2c_arm=on +dtoverlay=i2c-rtc,mcp7941x +dtoverlay=neuron-spi-new + +initramfs initramfs-linux.img followkernel diff --git a/unipi/home/pi/conf.json b/unipi/home/pi/conf.json new file mode 100644 index 0000000..a645e73 --- /dev/null +++ b/unipi/home/pi/conf.json @@ -0,0 +1,18 @@ +{ + "Debug": { + "plugin": "WSServer", + "web": { + "/": { + "module": "controlpi_plugins.wsserver", + "location": "Debug" + } + } + }, + "Log": { + "plugin": "Log", + "filter": [{}] + }, + "UniPi": { + "plugin": "UniPi" + } +} -- 2.34.1