❌

Lese-Ansicht

CrossPoint: Bluetooth-Fernbedienung hinzufügen

Mit der kommenden Version 2.0.0 wird CrossPoint, eine Custom Firmware für Mini E-Book-Reader, Bluetooth-Fernbedienungen (Bluetooth Page Turner) unterstützen. In diesem Beitrag zeige ich euch, wie ihr diese verbinden könnt.

  •  

Eine OpenPGP-Smartcard, ein ThinkPad, GnuPG, Fedora und ich

Mit diesem Beitrag teile ich meine Erfahrungen mit der Inbetriebnahme einer OpenPGP–Smartcard und des Smartcard-Leser in meinem ThinkPad T14s Gen1. Ihr erfahrt, was alles zu tun war und was ich davon halte. Aber beginnen wir doch ganz am Anfang.

Motivation

Es war einmal die FrOSCon 2026. Dort sah ich am Merchandise-Stand im Foyer diese schicken OpenPGP-Smartcards und einige Karten-Lese/Schreib-Geräte ausliegen.

Ich sprach meine Bekannten auf ihre Erfahrungen mit diesen Karten und GnuPG an, welche überwiegend mit Kopfschütteln und Stöhnen reagierten. Offenbar sind sie nicht so leicht für etwas zu interessieren wie ich. Doch schien mir das Thema für den Moment weniger reizvoll und ich habe das Thema erstmal vertagt.

Das Thema ließ mich jedoch nicht los und so habe ich auf der Zugfahrt nach Hause nochmal nachgelesen, was es mit GnuPG und OpenPGP auf sich hat. Denn dass ich mich zuletzt damit beschäftigt hatte, war schon eine Weile her.

Mein ThinkPad T14s Gen1 besitzt einen Smartcard-Leser, den ich bisher noch nie verwendet hatte. Dieser lachte mich geradezu an und vielleicht half noch der ein oder andere Satz von Christian und ich bestellte mir die OpenPGP Smart Card V3.4 + MiFare DESFire im FLOSS-Shop.

Inbetriebnahme von Kartenleser und Erkennen der Karte

Das kann doch nicht so schwer sein. Das ist doch schnell erledigt.

Berühmte letzte Worte unbekannter Herkunft.
~]$ gpg --card-status
gpg: selecting card failed: No such device
gpg: OpenPGP card not available: No such device

Vorstehender Code-Block zeigt, dass es nicht auf Anhieb klappte. Dann halt erstmal Fehlersuche bzw. die Suche nach Dokumentation und Anleitungen.

Der erste Fehler war schnell gefunden. Der Smartcard-Leser war im UEFI noch deaktiviert. Ich habe die Angewohnheit, alle Geräte, die ich nicht regelmäßig verwende, dort abzuschalten. Nachdem der Kartenleser aktiviert war, wurde er auch von Linux erkannt – von gpg jedoch nicht.

Auf der Produktseite wird folgende URL zu Anleitungen und Erklärungen zu GnuPG, Kartenlesern mit und ohne Pinpad und zur Einrichtung und Verwendung der OpenPGP-Karte verlinkt: https://wiki.datenkollektiv.net/public/gnupg/gnupg-card-howto. Leider lieferte dieser Link einen HTTP-502-Fehler zurück, als ich die Seite gebraucht hätte. Also habe ich das Sprachmodell meiner Wahl um Rat gebeten, welches mir geraten hat, doch erstmal die erforderlichen Treiber und Tools zur Nutzung des Kartenlesers zu installieren. Na gut:

~]$ sudo dnf install pcsc-lite pcsc-lite-ccid pcsc-tools
~]$ sudo systemctl enable --now pcscd.service

Leider war es damit noch nicht getan und das Sprachmodell fing langsam das Halluzinieren an. Also bediente ich mich der Suchmaschine meines geringsten Misstrauens und recherchierte auf althergebrachte Weise. Ich war schon ziemlich genervt, als ich endlich einen passenden Hinweis in der Nitrokey-Dokumentation fand. Nachdem ich diese durchgearbeitet hatte, war ich einen großen Schritt weiter:

~]$ gpg --card-status
Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Die Karte wird von gpg erkannt, ist wie erwartet noch leer und kann nun endlich benutzt werden. Die Karte ist mit einer PIN und einer Admin-PIN versehen, welche bei bestimmten Operationen bzw. zum Entsperren der Karte abgefragt werden. Beide PINs sind auf individuelle PINs zu ändern. Sonst ist das Ganze sinnlos (siehe --change-pin).

GPG-Schlüssel auf der Karte generieren

Ab hier hilft die Manpage gpg(1) weiter. Der folgende Code-Block zeigt die Abfolge von Befehlen zur Generierung von GPG-Schlüsseln auf der Karte:

~]$ gpg --edit-card

Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card> admin
Admin commands are allowed

gpg/card> generate
Make off-card backup of encryption key? (Y/n) Y

Please note that the factory settings of the PINs are
   PIN = '123456'     Admin PIN = '12345678'
You should change them using the command --change-pin

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: Bob
Email address: bob@example.com
Comment: der Baumeister
You selected this USER-ID:
    "Bob (der Baumeister) <bob@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
rogpg: Note: backup of card key saved to '/home/jkastning/.gnupg/sk_9C88B267003429CB.gpg'
gpg: revocation certificate stored as '/home/jkastning/.gnupg/openpgp-revocs.d/2B3FFC727504AFFAEF0C50C080B662D727FEFF5F.rev'
public and secret key created and signed.

pub   rsa2048 2026-10-23 [SC]
      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F
uid                      Bob (der Baumeister) <bob@example.com>
sub   rsa2048 2026-10-23 [A]
sub   rsa2048 2026-10-23 [E]


gpg/card> list

Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 4
KDF setting ......: off
Signature key ....: 2B3F FC72 7504 AFFA EF0C  50C0 80B6 62D7 27FE FF5F
      created ....: 2026-10-23 18:42:38
Encryption key....: 35CD 7AA9 CADB CA74 6103  C261 9C88 B267 0034 29CB
      created ....: 2026-10-23 18:42:38
Authentication key: 04C5 D0D4 E501 B90A 51BF  85FE B6C6 967B EFF5 5EF9
      created ....: 2026-10-23 18:42:38
General key info..: 
pub  rsa2048/80B662D727FEFF5F 2026-10-23 Bob (der Baumeister) <bob@example.com>
sec>  rsa2048/80B662D727FEFF5F  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26
ssb>  rsa2048/B6C6967BEFF55EF9  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26
ssb>  rsa2048/9C88B267003429CB  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26

gpg/card>

Fertig. Auf der Karte befinden sich nun je ein Schlüsselpaar zum Signieren, Ver- und Entschlüsseln und für die Authentisierung (z.B. an einem SSH-Dienst). Ein Backup und ein Widerrufszertifikat wurden in folgenden Pfaden gespeichert:

  • Backup: .gnupg/sk_9C88B267003429CB.gpg
  • Widerrufszertifikat: .gnupg/openpgp-revocs.d/2B3FFC727504AFFAEF0C50C080B662D727FEFF5F.rev

Das Off-Card-Backup enthält nur den Encryption Key, nicht aber den Primärschlüssel. Ich empfehle, beide Dateien sicher und offline aufzubewahren. Sie sollten nicht auf dem Host verbleiben, wo sie kompromittiert werden können. Die Schaltkreise auf der Smartcard verhindern, dass der geheime/private Schlüssel von der Karte ausgelesen werden kann. So ist auch eine nachträgliche Erstellung einer weiteren Sicherheitskopie nicht möglich. Achtung: Mit dem Off-Card-Backup können nicht alle Schlüssel wiederhergestellt werden. Dies wird in meinen Augen im GnuPG HOWTO nicht deutlich.

Mir ist bei der Generierung aufgefallen, dass ich weder das Verfahren noch die Schlüssellänge auswählen konnte. Es wurde RSA 2048 Bit gewählt. Das ist mir ehrlich gesagt zu kurz. Leider gibt weder gpg(1) noch das GnuPG Smartcard HOWTO Hinweise, ob sich die Schlüssellänge beeinflussen lässt. Erst durch Suchen und Ausprobieren habe ich herausgefunden, dass man diese Parameter mit dem Admin-Befehl key-attr ändern kann. Der folgende Code-Block zeigt den Weg dorthin:

~]$ gpg --edit-card
…
gpg/card> admin
Admin commands are allowed

gpg/card> key-attr
Changing card key attribute for: Signature key
Please select what kind of key you want:
   (1) RSA
   (2) ECC
Your selection? 2
Please select which elliptic curve you want:
   (1) Curve 25519 *default*
   (4) NIST P-384
   (6) Brainpool P-256
Your selection? 
The card will now be re-configured to generate a key of type: ed25519
Note: There is no guarantee that the card supports the requested
      key type or size.  If the key generation does not succeed,
      please check the documentation of your card to see which
      key types and sizes are supported.
Changing card key attribute for: Encryption key
Please select what kind of key you want:
   (1) RSA
   (2) ECC
Your selection?

Für die folgenden Beispiele nutze ich jedoch weiterhin den bereits erstellten rsa2048-Schlüssel.

Im Schlüsselbund des Hosts werden die Schlüssel wie folgt dargestellt:

~]$ gpg --list-keys
pub   rsa2048 2026-10-23 [SC]
      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F
uid           [ultimate] Bob (der Baumeister) <bob@example.com>
sub   rsa2048 2026-10-23 [A]
sub   rsa2048 2026-10-23 [E]

~]$ gpg --list-secret-keys
sec>  rsa2048 2026-10-23 [SC]
      2B3FFC727504AFFAEF0C50C080B662D727FEFF5F
      Card serial no. = 0005 0000DA26
uid           [ultimate] Bob (der Baumeister) <bob@example.com>
ssb>  rsa2048 2026-10-23 [A]
ssb>  rsa2048 2026-10-23 [E]

Zuerst werden die öffentlichen Schlüssel angezeigt, die im Schlüsselbund des Hosts gespeichert sind. Ich empfehle, diese ebenfalls zu sichern und auf einem anderen Medium aufzubewahren. Gehen sie verloren, können sie nicht mithilfe der Smartcard rekonstruiert werden. Anschließend werden Informationen zu den privaten Schlüsseln ausgegeben. Das ‚>‘ hinter den Schlüsseln zeigt an, dass sich die geheimen/privaten Schlüssel auf einer Smartcard befinden und nicht im Schlüsselbund vorliegen.

Eine Datei signieren

Schlüsseloperationen funktionieren wie gewohnt. Statt der Passphrase wird man nach der PIN der Smartcard gefragt. Im folgenden Beispiel signiere ich eine Textdatei, wobei ich explizit angebe, welche User-ID für die Signatur benutzt werden soll. Anschließend verifiziere ich die Signatur:

~]$ gpg --sign --local-user bob@example.com datei
~]$ gpg --verify datei
datei      datei.gpg  
[jkastning@t14s ~]$ gpg --verify datei.gpg 
gpg: Signature made Fr 23 Okt 2026 21:31:44 CEST
gpg:                using RSA key 4384D92F686DC876A3CFF458E8AF43DE9E151FF3
gpg:                issuer "bob@example.com"
gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u
gpg: next trustdb check due at 2030-06-22
gpg: Good signature from "Bob (der Baumeister) <bob@example.com>" [ultimate]

Die Karte auf Werkseinstellungen zurücksetzen

Soll das Schlüsselmaterial von der Karte entfernt werden, z.B. weil man sie weitergeben möchte, kann sie wie folgt auf Werkseinstellungen zurückgesetzt werden:

~]$ gpg --edit-card

Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 5
KDF setting ......: off
Signature key ....: 4384 D92F 686D C876 A3CF  F458 E8AF 43DE 9E15 1FF3
      created ....: 2026-10-23 19:29:37
Encryption key....: 245E CD79 8DF9 D0FE 233B  9C95 D955 9262 22CF B708
      created ....: 2026-10-23 19:29:37
Authentication key: 7C86 CC37 9C74 776B 162E  AE31 FD5C 43DB 9DCD 233E
      created ....: 2026-10-23 19:29:37
General key info..: 
pub  rsa2048/E8AF43DE9E151FF3 2026-10-23 Bob (der Baumeister) <bob@example.com>
sec>  rsa2048/E8AF43DE9E151FF3  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26
ssb>  rsa2048/FD5C43DB9DCD233E  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26
ssb>  rsa2048/D955926222CFB708  created: 2026-10-23  expires: never     
                                card-no: 0005 0000DA26

gpg/card> admin
Admin commands are allowed

gpg/card> factory-reset
gpg: OpenPGP card no. D27600012401030400050000DA260000 detected

gpg: Note: This command destroys all keys stored on the card!

Continue? (y/N) y
Really do a factory reset? (enter "yes") yes

gpg/card> list

Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card>

Bitte denkt dran, auch die entsprechenden Schlüssel aus dem Schlüsselbund eures Hosts zu entfernen. Damit ist der saubere Ausgangszustand wiederhergestellt.

Vorhandene Schlüssel auf die Smartcard verschieben

Bitte erstellt ein Backup des .gnupg-Verzeichnisses, denn eure privaten Schlüssel werden auf die Karte verschoben (nicht kopiert). Ihr könnt sie anschließend von der Karte nicht zurückholen.

Ich demonstriere hier, wie Beispiel-Schlüssel auf die Karte verschoben werden und werfe anschließend alles weg. Der folgende Code-Block zeigt den Vorgang:

~]$ gpg --edit-key B5248E9B6E71B11BD9B979E996E2980D6CF4189E
gpg (GnuPG) 2.4.9; Copyright (C) 2025 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   1  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: depth: 1  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 1f, 0u
gpg: next trustdb check due at 2030-06-22
sec  brainpoolP256r1/96E2980D6CF4189E
     created: 2026-10-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  brainpoolP256r1/2403FEED88DD3FE9
     created: 2026-10-24  expires: never       usage: E   
[ultimate] (1). Kim <kim@example.com>

gpg> key 1

sec  brainpoolP256r1/96E2980D6CF4189E
     created: 2026-10-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* brainpoolP256r1/2403FEED88DD3FE9
     created: 2026-10-24  expires: never       usage: E     
[ultimate] (1). Kim <kim@example.com>

gpg> keytocard
Please select where to store the key:
   (2) Encryption key
Your selection? 2

sec  brainpoolP256r1/96E2980D6CF4189E
     created: 2026-10-24  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* brainpoolP256r1/2403FEED88DD3FE9
     created: 2026-10-24  expires: never       usage: E     
[ultimate] (1). Kim <kim@example.com>

Note: the local copy of the secret key will only be deleted with "save".
gpg> save

Ich habe zuvor lokal einen GPG-Schlüssel mit dem Algorithmus Brainpool P-256 erstellt und anschließend den Encryption Key mit keytocard in den Encryption-Slot auf der Karte verschoben. Nicht im Code-Block zu sehen ist, wie ich den Hauptschlüssel in den Signatur-Slot der Karte verschoben habe. Die privaten Schlüssel von Kim befinden sich nun auf der Karte, was sich mit gpg --card-status überprüfen lässt:

~]$ gpg --card-status
Reader ...........: Alcor Micro AU9540 00 00
Application ID ...: D27600012401030400050000DA260000
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: ZeitControl
Serial number ....: 0000DA26
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: brainpoolP256r1 brainpoolP256r1 rsa4096
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
KDF setting ......: off
Signature key ....: B524 8E9B 6E71 B11B D9B9  79E9 96E2 980D 6CF4 189E
      created ....: 2026-10-24 18:20:39
Encryption key....: 203F 7E4C 23A0 BB06 DB51  B3E9 2403 FEED 88DD 3FE9
      created ....: 2026-10-24 18:20:39
Authentication key: [none]
General key info..: pub  brainpoolP256r1/96E2980D6CF4189E 2026-10-24 Kim <kim@example.com>
sec>  brainpoolP256r1/96E2980D6CF4189E  created: 2026-10-24  expires: never     
                                        card-no: 0005 0000DA26
ssb>  brainpoolP256r1/2403FEED88DD3FE9  created: 2026-10-24  expires: never     
                                        card-no: 0005 0000DA26
ssb   brainpoolP256r1/5B658E197413BAE0  created: 2026-10-24  expires: never

Die Ausgabe von gpg --list-secret-keys zeigt ebenfalls durch das ‚>‘-Zeichen an, dass die privaten Schlüssel auf einer Smartcard liegen:

~]$ gpg --list-secret-keys
sec>  brainpoolP256r1 2026-10-24 [SC]
      B5248E9B6E71B11BD9B979E996E2980D6CF4189E
      Card serial no. = 0005 0000DA26
uid           [ultimate] Kim <kim@example.com>
ssb>  brainpoolP256r1 2026-10-24 [E]

Tut euch selbst einen Gefallen und prüft im Vorfeld, welche Algorithmen ihr für eure Schlüssel verwendet und welche von eurer Smartcard unterstützt werden. Versucht ihr, Schlüssel auf die Karte zu verschieben, die von der Smartcard nicht unterstützt werden, schlägt dies mit kryptischen Fehlermeldungen fehl. Diese sind so irreführend, dass ich ein Sprachmodell um Rat bitten musste, um meinem Fehler auf die Spur zu kommen. Ich hatte zuerst versucht, Schlüssel mit dem Algorithmus Curve 25519 auf die Karte zu verschieben. Dieser wird von der Karte nicht unterstützt. Die Fehlermeldung behauptete jedoch, ich hätte die Admin-PIN falsch eingegeben.

Ähnliche Erfahrungen habe ich gemacht, als ich mit dem Befehl key-attr die Einstellungen für die Key-Slots auf Parameter ändern wollte, welche von der Karte nicht unterstützt werden. Auch hier deutete die Fehlermeldung auf eine falsche Admin-PIN hin.

Fazit

Mit 22,00 Euro zzgl. Versandkosten ist die OpenPGP Smart Card V3.4 + MiFare DESFire erschwinglich, sieht schick aus und passt gut ins Portemonnaie. Darüber hinaus passt sie selbstverständlich auch gut in die Smartcard-Leser, die in vielen ThinkPad-Modellen (und ebenfalls in Business-Laptops anderer Hersteller) verbaut sind.

GnuPG-Dokumentation und -Howto sind zum Thema Smartcard alt und lückenhaft. Es bedarf eines gewissen technischen Interesses und Durchhaltewillens, um hier bis ans Ziel zu kommen. Aus meiner Sicht ist dies klar ein Nischenthema für Nerds und Menschen, die zur Nutzung dieser Technologie gezwungen sind.

Ich selbst bevorzuge, ein Offline-Backup meiner Schlüssel sicher aufzubewahren und vorhandene Schlüssel auf die Smartcard zu verschieben. Denn so kann ich meine GnuPG-Konfiguration wiederherstellen, falls die Smartcard kaputtgeht oder ich zukünftig ein Endgerät ohne Smartcard-Slot verwende.

Links zu verwandten Beiträgen

  •  

Gelöst: Intel e1000e „Detected Hardware Unit Hang“

Dieser Post umfasst eine kurze Problembeschreibung und verweist auf die Lösung, die ich dazu im Internet gefunden und implementiert habe.

Er dient mir als Dokumentation und ich freue mich, wenn er euch ebenfalls hilft, wenn ihr von dem gleichen Problem betroffen seid.

Problembeschreibung

Ein Server mit einer Intel-Netzwerkkarte, welche den Treiber e1000e nutzt, verliert plötzlich die Netzwerkanbindung. Im Protokoll des Servers finden sich dazu wiederholt folgende Meldungen:

kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang:

Remote-Verbindungen werden unterbrochen und es ist nur noch ein Zugriff über eine lokale Konsole möglich. Das kann unpraktisch sein, wenn sich der Server in einem hunderte Kilometer entfernten Standort befindet.

Lösung

Die Lösung habe ich bei der Internetrecherche im Blog von Ruhani Rabin gefunden: https://rabin.blog/fix-intel-e1000e-detected-hardware-unit-hang-on-proxmox/#solution-summary-proxmox-intel-e1000e-hardware-unit-hang-fix

Ruhani hat eine systemd.unit erstellt, welche die problematischen Funktionen des Treibers deaktiviert. Zusätzlich wird ein Watchdog eingerichtet, welcher helfen soll, das Problem bei erneutem Auftreten selbst zu lösen.

Bitte schaut in Ruhanis Blog-Artikel für alle Details zur Lösung. Er hat diese wirklich gut beschrieben.

Ich dokumentiere in den folgenden Code-Blöcken lediglich die systemd.units, die ich auf meinem Host implementiert habe:

# /etc/systemd/system/disable-nic-offload-eno1.service

[Unit]
Description=Disable NIC offloading for Intel e1000e interface eno1
After=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/sbin/ethtool -K eno1 gso off gro off tso off tx off rx off rxvlan off txvlan off sg off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Und der Watchdog:

# /etc/systemd/system/e1000e-eno1-watchdog.timer
[Unit]
Description=Run e1000e eno1 watchdog every 2 minutes

[Timer]
OnBootSec=2min
OnUnitActiveSec=2min
AccuracySec=30s
Unit=e1000e-eno1-watchdog.service

[Install]
WantedBy=timers.target

# /etc/systemd/system/e1000e-eno1-watchdog.service
[Unit]
Description=Watch for Intel e1000e hardware hangs and reset eno1
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/e1000e-eno1-watchdog

Watchdog-Skript:

#!/usr/bin/env bash
set -u
set -o pipefail

IFACE="eno1"
LOOKBACK="5 minutes ago"
LOCK="/run/e1000e-${IFACE}-watchdog.lock"
STAMP="/run/e1000e-${IFACE}-last-reset"
MIN_RESET_INTERVAL_SECONDS=600

exec 9>"$LOCK"
flock -n 9 || exit 0

if ! journalctl -k --since "$LOOKBACK" --no-pager \
  | grep -Eqi "e1000e .*${IFACE}: Detected Hardware Unit Hang|Detected Hardware Unit Hang"; then
  exit 0
fi

now="$(date +%s)"
last=0
[ -f "$STAMP" ] && last="$(cat "$STAMP" 2>/dev/null || echo 0)"

if [ $((now - last)) -lt "$MIN_RESET_INTERVAL_SECONDS" ]; then
  logger -t e1000e-watchdog "hardware hang detected on ${IFACE}, but reset suppressed by rate limit"
  exit 0
fi

logger -t e1000e-watchdog "hardware hang detected on ${IFACE}; resetting NIC"

if ! ip link set "$IFACE" down; then
  logger -t e1000e-watchdog "failed to bring ${IFACE} down; NIC reset incomplete"
  exit 1
fi

sleep 2

if ! ip link set "$IFACE" up; then
  logger -t e1000e-watchdog "failed to bring ${IFACE} up; NIC reset incomplete"
  exit 1
fi

# Re-apply the offload mitigation after link reset, just in case.
ethtool -K "$IFACE" gso off gro off tso off tx off rx off rxvlan off txvlan off sg off 2>/dev/null || \
  logger -t e1000e-watchdog "warning: unable to re-apply offload mitigation on ${IFACE}"

date +%s >"$STAMP"

logger -t e1000e-watchdog "NIC reset completed for ${IFACE}"

Bugtracker

Laut des KI-Agenten meines geringsten Misstrauens ist das Problem in folgenden Trackern dokumentiert:

Zum Erscheinungsdatum dieses Beitrags befinden sich beide im Status ‚NEW‘.

  •  

Erster Eindruck: Xteink X4 Pro

Smartphones verführen ständig zur Ablenkung. Um im Alltag wieder mehr Bücher zu lesen und meine Zeit am Smartphone zu verringern, habe ich mir den kompakten Xteink X4 Pro geholt.

  •  

2. Erfahrungsbericht zum Reise-Router GL.iNet GL-A1300 mit OpenWrt und Travelmate

Ein Wohnmobil, drei Reisende, vier Tage und fünf internetfähige Geräte (von denen wir wissen). Diese bilden den Rahmen für den zweiten Erfahrungsbericht zu meinem Reise-Router GL.iNet GL-A1300 mit OpenWrt und Travelmate.

Nach unserem Kurzurlaub habe ich meine Frau gefragt, ob sie den kleinen Reise-Router nützlich fand. Die Antwort war ein klares Ja. Es hat ihr gefallen, dass wir den kleinen Router nur mit einem USB-Anschluss versorgen und mit einem Uplink verbinden mussten und alle unsere internetfähigen Geräte waren ohne weitere Konfiguration wieder online. Das freut mich sehr, denn genau dies war der erhoffte Effekt.

Mir ist aufgefallen, dass ich das LuCI-Webinterface nicht mit den Webbrowsern meines Android-Smartphones aufrufen kann, mit denen meines Android-Tablets aber schon. Ich nutze auf beiden Firefox und Firefox Klar. Falls jemand eine Erklärung, für dieses Mysterium hat, freue ich mich über einen Kommentar.

AdBlock Fast klemmte zu Beginn. Ein apk update gefolgt von einem apk upgrade auf der CLI löste das Problem jedoch schnell in Luft auf.

An Plätzen, an denen kein Uplink-WLAN verfügbar war, habe ich den mobilen Hostspot meines Smartphones als Uplink benutzt. Auch dies hat gut funktioniert. Da sich das Smartphone meist in meiner Hosentasche befindet, habe ich mich einige Male damit aus der Reichtweite des Reise-Routers entfernt. Dramatisch war auch dies nicht, wurde jedoch umgehend durch humanoide Überwachungssysteme angezeigt. ;-)

Natürlich hat GL.iNet mit dem Mudi 7 (GL-E5800) auch für dieses Luxusproblem eine Lösung im Angebot. Allerdings sind mir die ca. 425 Euro für diesen Luxus etwas zu viel. Kennt ihr Alternativen, die über ähnliche Funktionen verfügen? Also klein, kompakt und fähig eine SIM-Karte zu tragen? Dann teilt diese doch bitte in den Kommentaren.

Der Reise-Router hat sich während einer Dienstreise und einer viertägigen Urlaubsreise bewährt und wird uns bzw. mich auch zukünftig auf diesen Reisen begleiten.

  •  

HP stärkt das LVFS Projekt und setzt ein wichtiges Zeichen für Linux

Die Linux Firmware Landschaft erhält neuen Rückenwind. HP unterstützt nun als weiterer Premier Sponsor den Linux Vendor Firmware Service (LVFS) und reiht sich damit neben Dell und Lenovo ein. Das Projekt gewinnt damit einen weiteren großen Hersteller, der die Zukunft sicherer Firmware Updates auf Linux Systemen aktiv mitgestaltet. Hinter dem Dienst steht die bekannte fwupd […]

Der Beitrag HP stärkt das LVFS Projekt und setzt ein wichtiges Zeichen für Linux erschien zuerst auf fosstopia.

  •  

Erfahrungsbericht: Firmware-Update für GL.iNet GL-A1300 mit OpenWrt

Ich nutze einen GL.iNet GL-A1300 als Reise-Router. Bei diesem führe ich ein Firmware-Update durch und berichte hier von meiner Erfahrung damit.

Es handelt sich dabei um kein Tutorial oder eine Schritt-für-Schritt-Anleitung, sondern eher um eine persönliche Bewertung. Der Text enthält Links zu den verwendeten Quellen.

Warnung: Ein fehlgeschlagenes Firmware-Update kann euer Gerät unbenutzbar machen. Ich gehe in diesem Text nicht darauf ein, wie man ein Gerät nach einem fehlgeschlagenen Firmware-Update wiederherstellt. Wenn ihr diesem Artikel folgt, tut ihr dies auf eigene Gefahr.

IST-Zustand

Aktuell läuft mein Reise-Router mit der Firmware OpenWrt 24.10.5 r29087-d9c5716d1d / LuCI openwrt-24.10 branch 25.340.26705~d88390b. Zu dem Zeitpunkt, wo ich diesen Text schreibe, ist das Release 25.12.2 aktuell, welches am 27. März 2026 veröffentlicht wurde.

Die Geräteseite im OpenWrt-Wiki weist für mein Modell noch die 24.10.5 als aktuelle Firmware aus. Jedoch haben mich zwei meiner Arbeitskollegen darauf hingewiesen, dass ich besser den Firmware Selector verwenden solle, da dieser aktuelle Informationen beinhaltet, während das Wiki etwas hinterher hängt.

SOLL-Zustand

Die Ergebnisseite des OpenWrt Firmware Selector zeigt für mein Gerät an, dass die Firmware-Version 25.12.2 unterstützt wird.

Ergebnisseite des Firmware Selector für das Gerät GL.iNet GL-A1300.
Firmware-Version 25.12.2 untersützt den GL.iNet GL-A1300.

Dann soll dies die neue Firmware für meinen Reise-Router werden.

Meine Erwartungshaltung

Ich erwarte keinerlei Probleme, sodass ich nach den folgenden 5 Schritten fertig bin.

  1. Ich lade das Sysupgrade für mein Modell herunter.
  2. Ich lade das Sysupgrade im LuCI Web Interface hoch und starte das Firmware-Update.
  3. Der Reise-Router startet neu und lädt die neue Firmware-Version.
  4. Meine Konfiguration wird übernommen.
  5. Ich melde mich mit den bekannten Zugangsdaten an.

Der tatsächliche Verlauf

„Ich mach noch kurz ein Firmware-Update.“

Berühmte letzte Worte eines unbekannten Sysadmins.

Da es mir die Seite im folgenden Bild anbietet, erstelle ich vor dem Update noch ein Backup. Hierbei wird ein TAR-Archiv erzeugt, welches ich auf meinem Laptop speichere.

Seite im LuCI Web Interface für Flash operations. Die Seite bietet Optionen zum Erstellen eines Backups, zum Restore eines zuvor erstellten Backups und zum Upload eines Firmware-Images.
Seite im LuCI Web Interface zur Erstellung von Backups und Durchführung von Firmware-Updates.

Das folgende Bild zeigt den Dialog, der erscheint, nachdem das Firmware-Image hochgeladen wurde. Ich habe diesen einfach mit einem Klick auf Continue bestätigt.

Bestätigungsdialog zum Start des Firmware-Updates.

Während die Firmware auf das Gerät geflasht wird, blinkt die LED des GL-A1300 schnell. Leuchtet sie wieder dauerhaft, ist das Firmware-Update beendet. Ich verbinde mich erneut mit dem WLAN des Reise-Routers und lade die Seite neu.

Zwar läuft mein Reise-Router jetzt mit der neuen Firmware 25.12.2, jedoch sind die beiden Pakete Travelmate und AdBlock-Fast nicht mehr installiert. Ich vermute, dass dies damit zusammenhängt, dass sich bei dieser Firmware-Verstion der Paketmanager von opkg zu apk geändert hat. Ich verbinde mich daher per SSH zu meinem Router und installiere die Pakete über die Kommandozeile neu:

root@bifrost:~# apk add travelmate luci-app-travelmate luci-app-travelmate
…
root@bifrost:~# apk add gawk grep sed coreutils-sort

Nach einem anschließenden Neustart ist auch das Top-Level-Menü „Services“ im LuCI Web Interface wieder vorhanden. Und nicht nur der Menüpunkt auch die Konfiguration der Services ist noch vorhanden. Welch ein Glück.

Vielleicht aktiviere ich beim nächsten Firmware-Update die Option Include in backup a list of current installed packages at /etc/backup/installed_packages.txt. Dies kann mir ggf. die Neuinstallation erleichtern.

Fazit

Die Vorgehensweise beim Firmware-Update ist bei diesem Gerät in meinen Augen nicht ganz so einfach wie bei den gängigen Geräten der Internetdiensteanbieter aber auch kein Hexenwerk.

Ob es mit dem Wechsel des Paketmanagers zusammenhängt, dass ich die Pakete Travelmate und AdBlock-Fast neu installieren musste, kann ich nicht mit Sicherheit sagen. Ich werde das bei zukünftigen Updates mal im Auge behalten.

Nun werde ich erstmal die restlichen Geräte der Familie für die Nutzung des Reise-Routers konfigurieren.

  •  

Erfahrungsbericht: Reise-Router GL.iNet GL-A1300 mit OpenWrt

In diesem Artikel erfahrt ihr, warum ich einen Reise-Router haben möchte, welchen ich aktuell mit welcher Firmware und zusätzlichen Paketen nutze und wie zufrieden ich damit bin.

Ich erhalte weder vom Hardwarehersteller noch von den verwendeten Projekten Zuwendungen irgendwelcher Art für diesen Bericht. Er gibt ausschließlich meine persönliche Meinung wieder.

Motivation

Wir sind eine kleine Familie mit einer ganzen Menge an WLAN-Geräten. Diese Geräte begleiten uns zu Hause wie unterwegs.

Daheim kümmerten sich in der Vergangenheit Pi-hole und heute OPNsense darum, dass wir von Werbung auf unseren Geräten so gut es geht verschont bleiben.

Erst, wenn wir unterwegs sind und z.B. Hotel-WLAN oder öffentliche Hotspots nutzen, fällt uns auf, wie kaputt das Internet eigentlich ist. Unser Kind findet vor lauter Werbung die Spiele auf dem Tablet nicht wieder und der übermäßige Werbemüll vermiest uns jeden Medienkonsum.

Ich habe keine Lust, jedes Gerät einzeln zu konfigurieren, um der Werbeindustrie Widerstand zu leisten. Daher möchte ich einen Reise-Router zu Hilfe nehmen. Die Idee ist, dass ich einen kleinen Router mit dem Hotel-WLAN verbinde, welcher dann für unsere Geräte ein WLAN aufspannt. Dieser Router stellt Dienste wie DHCP, DNS und einen Werbeblocker bereit, welche von allen verbundenen Geräten genutzt werden können.

Zusätzlich lässt sich mit dem Reise-Router auch die Einschränkung in manchen Hotels umgehen, wo sich nur ein einziges Gerät mit den bereitgestellten Zugangsdaten gleichzeitig mit dem Hotel-WLAN verbinden darf.

Dies kommt mir auch beruflich zugute, wo ich meist mit Handy und Laptop reise. So kann ich meine Geräte durch die im Reise-Router integrierte Firewall zusätzlich schützen. Ich kann sogar eine kleine, mobile Laborumgebung mithilfe des Routers aufbauen.

Slate Plus (GL-A1300)

Ich habe auf Mastodon um Empfehlungen gebeten und mit Kollegen gesprochen. Danke euch allen für eure Unterstützung. Am Ende habe ich mich für den Slate Plus (GL-A1300) von GL.iNet entschieden:

Erworben habe ich diesen bei einem großen Online-Gemischtwarenhändler für 76,99 Euro. Anschließend habe ich OpenWrt 24.10.5 via SSH darauf installiert. Das OpenWrt-Projekt ist ein Linux-Betriebssystem für eingebettete Systeme, wie den hier genannten GL-A1300.

Um OpenWrt auf einem Router zu installieren, sind fortgeschrittene Kenntnisse im Bereich der Systemadministration erforderlich. Es besteht trotz guter Software und Dokumentation die Gefahr, dass man sein Gerät bei diesem Vorgang unbrauchbar macht (bricked). Ich beschreibe die Installation hier nicht im Einzelnen und verweise auf das OpenWrt Wiki.

Travelmate, ein Verbindungsmanager für Reise-Router

Travelmate läuft auf OpenWrt und stellt eine Verbindung (Uplink) zum WLAN-Zugangspunkt/Hotspot z.B. des Hotels, der Ferienunterkunft her. Travelmate wird dann zum Zugangspunkt (Access Point) für unsere Geräte und bietet uns einen sicheren Zugang zum Internet.

Travelmate verwaltet alle Netzwerkeinstellungen, Firewall-Einstellungen, Verbindungen zum WLAN usw. und stellt automatisch eine (erneute) Verbindung zu konfigurierten APs/Hotspots her, sobald diese verfügbar sind.

Hilfe zur Installation und Konfiguration bietet die Travelmate-Seite im OpenWrt Wiki. Nach der Installation habe ich Travelmate genutzt, um meinen Reise-Router mit meinem WLAN zu Hause zu verbinden. Dies geht genauso einfach, wie einen Laptop in das WLAN zu integrieren.

Während ich die Zeilen für diesen Abschnitt schreibe, bin ich mit meinem Laptop mit dem WLAN des GL-A1300 verbunden, welcher über mein Heim-WLAN mit dem Internet verbunden ist. Das folgende Bild dient der Veranschaulichung des Testaufbaus:

Das Bild zeigt von links nach rechts die Symbole für einen Laptop, einen WLAN-Router der den Reise-Router GL-A1300 repräsentiert, ein WLAN-Symbol für das Heimnetzwerk, eine Firewall und ein Symbol für das Internet.
Testaufbau mit dem Reise-Router GL-A1300

AdBlock-Fast

AdBlock-Fast ist ein leistungsstarker Werbeblocker-Dienst für OpenWrt, der sich in Dnsmasq, SmartDNS und Unbound integrieren lässt. Er unterstützt das parallele Herunterladen und Verarbeiten von Remote-Block- und Allow-Listen und optimiert diese in effiziente, mit Resolvern kompatible Formate.

Die Installation verlief wie beschrieben. Ich habe wahllos einige Block-Listen heruntergeladen und aktiviert. Einen Test werde ich auf meiner nächsten Dienstreise durchführen.

Erster Einsatz im Hotel

Der erste Praxistest erfolgte auf Dienstreise im Hotel.

Im Hotelzimmer wird der Reise-Router über ein USB-C-Kabel und ein Standards-USB-Ladegerät mit Strom versorgt. Ich starte meinen Laptop und verbinde mich mit dem WLAN des Reise-Routers. Anschließend öffne ich das Webinterface des Reise-Routers in meinem Webbrowser. Die Standards-IP-Adresse von OpenWrt lautet 192.168.1.1. Unter Services/Travelmate/Wireless Stations scanne ich nach verfügbaren Netzwerken und stelle eine Verbindung zum offenen Hotel-WLAN her.

Das Hotel bietet ein offenes WLAN ohne Authentifizierung an. Um in das Internet zu gelangen, muss man jedoch zuerst die Nutzungsbedingungen auf einer Portalseite bestätigen. Dies erledige ich über mein Telefon, welches ich mit dem WLAN des Reise-Routers verbinde. Die Bestätigungsseite wird hier einmalig angezeigt. Alle weiteren Geräte können das Internet nutzen, ohne dies nochmals separat bestätigen zu müssen. Denn aus Sicht des Hotel-WLANs ist nur ein WLAN-Client verbunden.

Um den AdBlocker zu testen, habe ich eine Runde in meiner Skat-App gespielt. Ohne AdBlocker sieht man hier sein Blatt vor lauter Werbung nicht. Auch hier funktioniert alles wie gewünscht.

Fazit

Einzig die Firmware auf die Hardware zu flashen erfordert fortgeschrittene Kenntnisse. Die anschließende Nutzung des Reise-Routers ist unkompliziert.

Die Stromversorgung über USB macht das Gerät einfach und flexibel einsetzbar. Die Verbindungsqualität ist gut und der Werbeblocker arbeitet wie erwartet. Evtl. werde ich noch das Wireguard-VPN testen. Dies könnte nützlich sein, um mich zu meinem Heimlabor zu verbinden.

Als nächstes werde ich alle unsere WLAN-Gräte für die Nutzung des Reise-Routers konfigurieren, so dass wir das nicht unterwegs tun müssen.

  •  

Outdoor-Smartphone Volla Phone Plinius

Der in Remscheid angesiedelte Hersteller Volla stellt mit dem Volla Phone Plinius einen Nachfolger für das robuste Volla Phone X23 vor. Im Sinne der Nachhaltigkeit verfügt es über einen austauschbaren Akku.

  •  

TUXEDO InfinityBook Max 15 – Intel

Das InfinityBook Max erweitert die InfinityBook-Pro-Reihe von TUXEDO um grafisch leistungsstarke, leichte und mobile Businessnotebooks. Jetzt kommt das TUXEDO InfinityBook Max 15 Intel hinzu.

  •  

Neues Jolla-Phone im Crowdfunding

Das finnische Technologieunternehmen Jolla versucht sich neben Sailfish OS wieder an der Produktion von Hardware. Das Jolla Phone kann jetzt im Crowdfunding vorbestellt werden.

  •  
❌