<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hardware | przeqpiciel's site</title><link>https://przeqpiciel.com/tags/hardware/</link><description>Blog techniczny o homelabie, Linuxie i innych ciekawych tematach</description><generator>Hugo</generator><language>pl</language><managingEditor>przeqpiciel</managingEditor><webMaster>przeqpiciel</webMaster><lastBuildDate>Mon, 20 Jul 2026 15:22:16 +0200</lastBuildDate><atom:link href="https://przeqpiciel.com/tags/hardware/index.xml" rel="self" type="application/rss+xml"/><item><title>Fingerprint reader on ThinkPad T480s</title><link>https://przeqpiciel.com/posts/fingerprint-reader-thinkpad-t480s/</link><pubDate>Mon, 20 Jul 2026 00:00:00 +0000</pubDate><author>przeqpiciel</author><guid>https://przeqpiciel.com/posts/fingerprint-reader-thinkpad-t480s/</guid><description>&lt;h2 id="wstęp"&gt;Wstęp&lt;/h2&gt;
&lt;p&gt;ThinkPad T480s ma wbudowany czytnik linii papilarnych Synaptics o ID &lt;code&gt;06cb:009a&lt;/code&gt; (&amp;ldquo;Metallica MIS&amp;rdquo;, match-in-sensor). Domyślny &lt;code&gt;libfprint&lt;/code&gt; w Ubuntu 26.04 go nie obsługuje — &lt;code&gt;fprintd&lt;/code&gt; i &lt;code&gt;libpam-fprintd&lt;/code&gt; są zainstalowane fabrycznie, ale bez pasującego sterownika nic nie wykryją. Poniżej cała ścieżka, która faktycznie zadziałała, razem z dwoma pułapkami po drodze (autosuspend USB i globalny &lt;code&gt;common-auth&lt;/code&gt;), na które warto się przygotować od razu, zamiast dochodzić do nich metodą prób i błędów.&lt;/p&gt;
&lt;h2 id="krok-1-potwierdź-model-czytnika"&gt;Krok 1: Potwierdź model czytnika&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsusb | grep -i synaptics
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Szukamy ID &lt;code&gt;06cb:009a&lt;/code&gt;. Dla tego właśnie modelu standardowy &lt;code&gt;libfprint&lt;/code&gt; nie ma sterownika — jedyna działająca opcja to reverse-engineered &lt;code&gt;python-validity&lt;/code&gt;.&lt;/p&gt;</description><content:encoded>&lt;h2 id="wstęp"&gt;Wstęp&lt;/h2&gt;
&lt;p&gt;ThinkPad T480s ma wbudowany czytnik linii papilarnych Synaptics o ID &lt;code&gt;06cb:009a&lt;/code&gt; (&amp;ldquo;Metallica MIS&amp;rdquo;, match-in-sensor). Domyślny &lt;code&gt;libfprint&lt;/code&gt; w Ubuntu 26.04 go nie obsługuje — &lt;code&gt;fprintd&lt;/code&gt; i &lt;code&gt;libpam-fprintd&lt;/code&gt; są zainstalowane fabrycznie, ale bez pasującego sterownika nic nie wykryją. Poniżej cała ścieżka, która faktycznie zadziałała, razem z dwoma pułapkami po drodze (autosuspend USB i globalny &lt;code&gt;common-auth&lt;/code&gt;), na które warto się przygotować od razu, zamiast dochodzić do nich metodą prób i błędów.&lt;/p&gt;
&lt;h2 id="krok-1-potwierdź-model-czytnika"&gt;Krok 1: Potwierdź model czytnika&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lsusb | grep -i synaptics
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Szukamy ID &lt;code&gt;06cb:009a&lt;/code&gt;. Dla tego właśnie modelu standardowy &lt;code&gt;libfprint&lt;/code&gt; nie ma sterownika — jedyna działająca opcja to reverse-engineered &lt;code&gt;python-validity&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="krok-2-podmień-sterownik-na-python-validity"&gt;Krok 2: Podmień sterownik na python-validity&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt remove -y fprintd libpam-fprintd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo add-apt-repository -y ppa:ubuntuhandbook1/open-fprintd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt install -y open-fprintd fprintd-clients python3-validity
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now python3-validity.service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now open-fprintd-resume.service open-fprintd-suspend.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="krok-3-wyłącz-usb-autosuspend-dla-czytnika"&gt;Krok 3: Wyłącz USB autosuspend dla czytnika&lt;/h2&gt;
&lt;p&gt;Bez tego czytnik po ~2 sekundach bezczynności usypia na poziomie USB, a &lt;code&gt;python-validity&lt;/code&gt; nie budzi go automatycznie (usługi resume/suspend z kroku 2 reagują tylko na pełne uśpienie systemu, nie na zwykły autosuspend). Objaw: czytnik w ogóle nie reaguje, a w logu &lt;code&gt;journalctl -u open-fprintd&lt;/code&gt; widać w pętli &lt;code&gt;The service is suspended / offline, delay the call&lt;/code&gt;.&lt;/p&gt;
&lt;div class="hint hint--warning"&gt;
 &lt;span class="hint-icon"&gt;⚠️&lt;/span&gt;
 &lt;div class="hint-content"&gt;
 &lt;strong&gt;Autosuspend USB&lt;/strong&gt;
Sprawdź to od razu, zanim zaczniesz enrollować palec — inaczej łatwo pomylić brak reakcji sensora z błędną instalacją sterownika.
 &lt;/div&gt;
&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#a5d6ff"&gt;&amp;#39;ACTION==&amp;#34;add&amp;#34;, SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTR{idVendor}==&amp;#34;06cb&amp;#34;, ATTR{idProduct}==&amp;#34;009a&amp;#34;, TEST==&amp;#34;power/control&amp;#34;, ATTR{power/control}=&amp;#34;on&amp;#34;&amp;#39;&lt;/span&gt; | sudo tee /etc/udev/rules.d/99-fprint-no-autosuspend.rules
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo udevadm control --reload-rules
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo udevadm trigger --subsystem-match&lt;span style="color:#ff7b72;font-weight:bold"&gt;=&lt;/span&gt;usb
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart python3-validity.service open-fprintd.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="krok-4-zarejestruj-odcisk"&gt;Krok 4: Zarejestruj odcisk&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fprintd-enroll
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Domyślnie zapisuje prawy wskazujący. Żeby wskazać inny palec:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fprintd-enroll -f left-thumb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Dostępne nazwy: &lt;code&gt;left-thumb&lt;/code&gt;, &lt;code&gt;left-index-finger&lt;/code&gt;, &lt;code&gt;left-middle-finger&lt;/code&gt;, &lt;code&gt;left-ring-finger&lt;/code&gt;, &lt;code&gt;left-little-finger&lt;/code&gt; i analogicznie dla &lt;code&gt;right-*&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Test bez logowania:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fprintd-verify
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="krok-5-włącz-odcisk-w-pam--ale-ostrożnie"&gt;Krok 5: Włącz odcisk w PAM — ale ostrożnie&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pam-auth-update --enable fprintd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To dopisuje &lt;code&gt;pam_fprintd.so&lt;/code&gt; do &lt;code&gt;/etc/pam.d/common-auth&lt;/code&gt;, czyli pliku dołączanego przez &lt;strong&gt;wszystkie&lt;/strong&gt; usługi PAM w systemie — także &lt;code&gt;gdm-password&lt;/code&gt;, &lt;code&gt;sudo&lt;/code&gt;, &lt;code&gt;su&lt;/code&gt;. Efekt uboczny: GDM ma już własną, dedykowaną ścieżkę &lt;code&gt;gdm-fingerprint&lt;/code&gt; z wpisanym na stałe &lt;code&gt;pam_fprintd.so&lt;/code&gt;, więc odcisk na ekranie blokady działał od razu. Ale wpisywanie &lt;strong&gt;hasła&lt;/strong&gt; też zaczęło przechodzić przez &lt;code&gt;common-auth&lt;/code&gt;, a więc też robiło pełną, do 10-sekundową próbę odczytu palca (&lt;code&gt;max_tries=1 timeout=10&lt;/code&gt;), zanim w ogóle sprawdziło hasło. Tyle samo dotyczyło &lt;code&gt;sudo&lt;/code&gt; w terminalu.&lt;/p&gt;
&lt;div class="hint hint--danger"&gt;
 &lt;span class="hint-icon"&gt;🚨&lt;/span&gt;
 &lt;div class="hint-content"&gt;
 &lt;strong&gt;Nie zostawiaj fprintd w common-auth, jeśli GDM już ma gdm-fingerprint&lt;/strong&gt;
Sprawdź &lt;code&gt;cat /etc/pam.d/gdm-fingerprint&lt;/code&gt; — jeśli tam już jest &lt;code&gt;pam_fprintd.so&lt;/code&gt;, to wpis w &lt;code&gt;common-auth&lt;/code&gt; jest zbędny i tylko spowalnia każde logowanie hasłem w systemie.
 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Rozwiązanie — usunąć fprintd z globalnego stosu:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo pam-auth-update --remove fprintd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Po tym odcisk na ekranie blokady dalej działa (bo &lt;code&gt;gdm-fingerprint&lt;/code&gt; ma go zaszytego na stałe), a wpisywanie hasła — w GDM i w &lt;code&gt;sudo&lt;/code&gt; — znowu jest natychmiastowe.&lt;/p&gt;
&lt;h2 id="zarządzanie-odciskami"&gt;Zarządzanie odciskami&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#e6edf3;background-color:#0d1117;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fprintd-list &lt;span style="color:#79c0ff"&gt;$USER&lt;/span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# lista zarejestrowanych odcisków&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fprintd-delete &lt;span style="color:#79c0ff"&gt;$USER&lt;/span&gt; &lt;span style="color:#8b949e;font-style:italic"&gt;# usuń wszystkie odciski danego użytkownika&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="podsumowanie"&gt;Podsumowanie&lt;/h2&gt;
&lt;p&gt;Dla Synaptics 06cb:009a na ThinkPadzie T480s: &lt;code&gt;python-validity&lt;/code&gt; + &lt;code&gt;open-fprintd&lt;/code&gt; zamiast domyślnego &lt;code&gt;fprintd&lt;/code&gt;, wyłączony USB autosuspend dla urządzenia, i &lt;strong&gt;odcisk włączony wyłącznie tam, gdzie faktycznie ma sens&lt;/strong&gt; — nie przez globalny &lt;code&gt;common-auth&lt;/code&gt;, tylko przez dedykowaną ścieżkę GDM (&lt;code&gt;gdm-fingerprint&lt;/code&gt;), która i tak już go obsługuje.&lt;/p&gt;</content:encoded></item></channel></rss>