Kitty hat zu viel Baldrian gefressen

Da denkt man sich nichts böses… macht einfach ein Linux-Update und startet neu und anschließend geht eines der wichtigsten Werkzeuge nicht mehr… Neovim :)
Neeeein…

Also an sich ging es schon noch, es ging auf und zeigte Text an, aber Enter und Backspace (wahrscheinlich noch andere Tasten) wurden alle mehrfach registriert.
Statt also einen Zeilenumbruch hatte man gleich 3 oder löschte gleich 3 Zeichen.

IPU (Invisible Pink Unicorn) sei Dank bin ich immer etwas langsam ;) und andere sind auch schon über das Problem gestolpert.
Und tatsächlich besteht das Problem nicht nur bei Kitty, sondern auch bei foot, und Alacritty (und ist auch dort in den neueren Versionen gefixt). Ein Treffen der coolen Terminals und alle haben das gleiche Problem.

Wahrscheinlich eine Änderung auf Seiten Neovim, aber ein Fehlverhalten all dieser Terminals, hier ist der Bugreport bei Neovim:
https://github.com/neovim/neovim/issues/31806

Lösung: Update des Terminals auf eine neue Version (Kitty funktioniert mit spätestens 0.42.1).
Hier die Anleitung für Kitty: https://sw.kovidgoyal.net/kitty/binary/

Brücken bauen mit Hindernissen

Einrichten einer Bridge unter Debian-Linux.

/etc/network/interfaces editieren
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# Setting all being part of the bridge to manual to avoid configuration conflicts

iface enp1s0 inet manual
iface enp2s0 inet manual
iface enp3s0 inet manual
iface enp4s0 inet manual
iface enp5s0 inet manual
iface enp6s0 inet manual

# Bridge config
auto br0
iface br0 inet static
	bridge_ports enp1s0 enp2s0 enp3s0 enp4s0 enp5s0 enp6s0
	address 192.168.178.183
	broadcast 192.168.178.255
	gateway 192.168.178.1
	netmask 255.255.255.0

# The primary network interface
#allow-hotplug enp1s0
#iface enp1s0 inet dhcp
  • Zeile 3-8 verhindern das die Interfaces durch irgendeinen Dienst aktiviert werden

  • Zeile 11 definiert das br0 (das Bridge-Interface) automatisch aktiviert wird

  • Zeile 12-17 definiert die Netzwerkschnittstellen die Teil der Bridge werden und die IP-Adresse die die br0 bekommen soll

    • br0 ist im Prinzip das virtuelle Netzwerkinterface über welchen der Host (also das System selbst) Zugang zum Netzwerk bekommt

  • Zeile 19 ist die ursprüngliche (kommentierte) Netzwerkkonfiguration des Systems

Danach hat man wahrscheinlich das Problem das man zwar das System erreichen kann, aber die Bridge nicht funktioniert.
Das liegt daran das für Bridge-Interfaces per Default in neueren Kernel-Versionen Netfilter (die Firewall in Linux) aktiv ist und das weiterleiten verhindert.

/etc/sysctl.conf hinzufügen
net.bridge.bridge-nf-call-arptables = 0
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0

Danach wird es wahrscheinlich immer noch nicht funktionieren und man wird folgendes im syslog finden:

Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-arptables', ignoring: No such file or directory
Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-ip6tables', ignoring: No such file or directory
Mar 12 20:05:34 vp-2 systemd-sysctl[273]: Couldn't write '0' to 'net/bridge/bridge-nf-call-iptables', ignoring: No such file or directory

Der Grund ist das zum Zeitpunkt wo sysctl aufgerufen wird um die Parameter zu setzen das Netzwerk noch nicht gestartet wurde.
Dadurch sind die Module bridge und br_netfilter noch nicht geladen und daher existieren die Dateien (in /proc/net/bridge-nf-call usw.) nicht.

/etc/modules hinzufügen
bridge
br_netfilter

Obiges lädt die Module bridge und br_netfilter beim Systemstart und damit vor sysctl und damit sind die entsprechenden Dateien beim Aufruf von sysctl vorhanden.

AppAmor vs Docker

Beobachtet auf einer Installation von Debian 12 bei Hetzner nach der Installation von docker.

Tritt auf wenn ein Kernel mit AppAmor aktiv genutzt wird; scheinbar ist das bei Hetzner der Fall

docker run --name postgres --network postgres -e POSTGRES_PASSWORD=bubu#db --restart unless-stopped -v postgres:/var/lib/postgresql/data -d postgres

Status: Downloaded newer image for postgres:latest
4ac3ffe1d811a7c897390b8c9f07a283c4e1ef506dc1987a8b4a9a48367bfed8
Resultiert in
docker: Error response from daemon: AppArmor enabled on system but the docker-default profile could not be loaded: running `apparmor_parser apparmor_parser --version` failed with output:
error: exec: "apparmor_parser": executable file not found in $PATH.
Lösung
apt install apparmor

Von Identitätsverwirrung, nordischen Göttern und Abstammung

Ziel war es über Linux (Mint) Lineage OS auf ein Samsung Galaxy Tab S5e zu flashen.

Lineage ist eine Distribution des OpenSource Android Betriebssystem (also ohne google-Modifikationen). Hier zu finden: https://lineageos.org/

Samsung Galaxy Tab S5e ist ein leichtgewichtiges 10-Zoll-Tablet.
Es ist schon 2019 erschienen, hat aber eine gute Akkulaufzeit (mehrere Stunden Nutzung), für den üblichen Nutzer ausreichend RAM 4 oder 6 GB, eine hinreichende Kamera (8 oder 13 MP), 64 oder 128 GB eingebauten Speicher, so wie Unterstützung von SD-Karten bis 512 GB.
Die CPU ist ebenfalls für normale Nutzung völlig hinreichend (2 Kerne mit 2.0 GHz und 6 mit 1.7 GHz Taktung - 64 Bit ARM).
Die Geräte sind gebraucht günstig zu bekommen (um die 150 Euro, teilweise darunter).
Samsung erlaubt das einfache entsperren des Bootloaders, was die ganze Prozedure erheblich vereinfacht.

Das entsperren des Bootloaders führt zum Verlust der Garantie. Das kann NICHT rückgängig gemacht werden.

Namen - Schall und Rauch

Es gibt 2 Varianten des Galaxy Tab S5e, eine mit LTE, die andere unterstützt nur WiFI (aka. WLAN, die mit LTE hat natürlich auch WLAN).

Weiterlesen…

Sich in den Fuß taggern

Zum Zweck alle möglichen Maschinen nach der Installation mit einer Grundkonfiguration auszustatten habe ich ein Playbook.
Im Prinzip wird das nur einmal nach der Installation ausgeführt und soll für alle möglichen Installationen vom Spielserver, produktive Server, bis hin zu Arbeitssystemen genutzt werden. Ein Teil dieser Systeme wird danach nicht mehr per Ansible betreut.

Um verschiedene Konfigurationen zu erlauben benutze ich Tags.

Auszug des Plays:
      - name: htop installed
        ansible.builtin.apt:
          name: htop
          state: present
      - name: zsh installed
        ansible.builtin.apt:
          name: zsh
          state: latest
      - name: zshrc copied
        become: false
        tags:
        - mod_user
        ansible.builtin.copy:
          src: ~/.zshrc
          dest: "{{ ansible_user_dir }}/.zshrc"
      - name: Copy vim config
        become: false
        tags:
        - mod_user
        ansible.builtin.copy:
          src: ./init.lua
          dest: "{{ ansible_user_dir }}/.config/nvim/"
      - name: "{{ ansible_user }}'s shell is zsh"
        tags:
        - mod_user
        block:
        - name: Get installed packages
          ansible.builtin.package_facts:
            manager: apt
        - name: "Default shell zsh for {{ ansible_user }}"
          when: ansible_facts.packages['zsh'] is defined
          ansible.builtin.user:
            name: "{{ ansible_user }}"
            shell: /usr/bin/zsh

Der Aufruf sieht dann z.B. so aus:

ansible-playbook -t mod_user,server -i 192.168.127.48,  primer.yml -u someone

Weiterlesen…

404 Module not Found

couldn’t resolve module/action 'ansible.builtin.systemd_service'.

ERROR! couldn't resolve module/action 'ansible.builtin.systemd_service'. This often indicates a misspelling, missing collection, or incorrect module path.

The error appears to be in '/somewhere/primer.yml': line 123, column 9, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

          dest: /etc/systemd/logind.conf.d/
      - name: Reload logind config
        ^ here

Tätsächlich heißt das Modul in älteren Version ansible.builtin.systemd .
In neueren Versionen funktioniert der alte Name weiterhin.

Nicht einschlafen

Ich habe einen alten Laptop als Spielserver aufgesetzt.
Leider geht selbiger in den Standby-Modus sobald man den Deckel/Bildschirm schließt.

Eigentlich hatte ich erwartet das auf dem System ein acpid läuft der auf die APCI-Ereignisse reagiert - so war das jedenfalls als ich "jung" war ;)
Ich musste aber feststellen das das nicht der Fall ist. Worauf mich gleich das Gefühl beschlich das man den bestimmt durch irgendein systemd-Etwas ersetzt hat - heute ist schließlich alles systemd.
Und tatsächlich macht es ein systemd-Dienst - systemd-logind - ist ja auch naheliegend, er reagiert auf acpi-Events, also heißt er systemd-ac… ohh wait…

Egal, die Lösung ist recht einfach:

/etc/systemd/logind.conf
[Login]
#NAutoVTs=6
#ReserveVT=6
#KillUserProcesses=no
#KillOnlyUsers=
#KillExcludeUsers=root
#InhibitDelayMaxSec=5
#UserStopDelaySec=10
#HandlePowerKey=poweroff
#HandlePowerKeyLongPress=ignore
#HandleRebootKey=reboot
#HandleRebootKeyLongPress=poweroff
#HandleSuspendKey=suspend
#HandleSuspendKeyLongPress=hibernate
#HandleHibernateKey=hibernate
#HandleHibernateKeyLongPress=ignore
#HandleLidSwitch=suspend
#HandleLidSwitchExternalPower=suspend

Weiterlesen…

Mach mich Wurzel

Ziel/Problem

Ich habe ein Ansible-Playbook welches ich beim Aufsetzen von Servern (oder auch anderen Maschinen) nutze.

Nutzt man ein Standard-Debian-Image legt man einen Nicht-Root-User bei der Installation an der sich per ssh einglogen kann.
Allerdings ist per Default kein sudo installiert und der Nicht-Root-Nutzer ist nicht in den sudoer-Dateien, kann also keine Befehle per sudo ausführen.

Man kann also nicht per ansible root-Befehle ausführen ohne ein Passwort hinterlegen/angeben zu müssen.

Ziel ist es das zu ändern:

  • Sicherstellen das sudo installiert ist

  • Festellen ob sudo (ohne Passwort) für den Nicht-Root-Nutzer funktioniert

    • ggf. ihn in die sudoers einzutragen

    • wenn notwendig interaktiv einmalig das root-Passwort abfragen

Weiterlesen…

Keine Magie - Certbot mit Webserver, ohne Plugin

Als ich das Blog eingerichtet habe, musste ich auch SSL konfigurieren.
Wie viele benutze ich dafür Letsencrypt über Certbot.

Damit certbot ein Zertifikat ausstellen kann muss nachgewiesen werden das man die praktische Verfügungsgewalt über die Domain hat für die man ein Zertifikat ausgestellt bekommen möchte. Das geht u.a. in dem man den Response für eine Challenge die man gesendet bekommt entweder als DNS-Eintrag hinterlegt, auf der Maschine die über den DNS-Namen erreichbar ist einen Standalone-Webserver starten lässt (certbot bringt den mit) oder in einem vorhandenen Webserver auf jener Maschine ihn in einer Datei hinterlegt.

Der Weg per Domain-Eintrag war mir zu umständlich, ein Standalone-Webserver geht nicht, weil auf dem System schon apache2 läuft der das Blog ausliefern soll und damit die notwendigen Ports belegt sind.
Verblieb also der Weg per vorhandenem Webserver.
Dafür bringt certbot Plugins für apache2 und nginx mit, die Magie machen.

Magie mag ich nicht, jedenfalls nicht wenn ich sie nicht verstehe oder selbst gemacht habe (was nicht zwangsläufig das Gleiche ist ;)).
Sie hat immer den Nachteil das im unwahrscheinlichen Fall eines Druckabfalls… ähh… auftreten eines Problems hat man keine Ahnung was abgeht.

Im folgenden also die Lösung wie man es manuell macht.

Problem

Certbot per Schreiben in das Webroot ermöglichen den Response auf die Challenge für die Zertifikatserstellung zu schreiben. Gleichzeitig Zugriff auf das Blog nur über TLS zulassen.

Weiterlesen…

Registrieren einer neuen Domain bei Hetzner

Eine Domain registrieren sollte eigentlich ganz einfach sein, zumal bei einem Hoster wie Hetzner.
Einfach gewünschten, freien Domainnamen eingeben paar Klicks und fertig.

Sollte so sein… ist es aber nur wenn man weiß wo man die Klicks bei Hetzner machen muss und welche Stolpersteine es gibt.

Ich brauchte eine neue Domain für dieses Blog und den restlichen Kram den ich beruflich tue.
Es hat mich über 30 Minuten gedauert herauszufinden wo ich die Klicks machen muss.
Die Domain verweist über 24 Stunden danach immer noch nicht auf den Server wo es hinverweisen soll, was daran liegt das per Default keine DNS-Server (also auch nicht die von Hetzner, was naheliegend wäre) bei der Registrierung der Domain hinterlegt werden. Das das nicht automatisch passiert habe ich erst später festgestellt.

User Registrieren

Weiterlesen…