<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Linux — mizore / notes</title>
    <link>https://mizore.blog/en/tags/linux/</link>
    <link xmlns="http://www.w3.org/2005/Atom" href="https://mizore.blog/en/tags/linux/feed.xml" rel="self" type="application/rss+xml"></link>
    <description>2 posts</description>
    <language>en</language>
    <lastBuildDate>Sun, 10 May 2026 00:00:00 +0000</lastBuildDate>
    <item>
      <title>Fixing Obsidian Web Clipper Not Working on KDE Plasma Wayland</title>
      <link>https://mizore.blog/en/posts/kde-plasma-obsidian-web-clipper/</link>
      <description>&lt;p&gt;While using Obsidian on Plasma Wayland, I noticed that whenever Obsidian was already open, clicking &lt;strong&gt;Add to Obsidian&lt;/strong&gt; in Chrome&#39;s &lt;strong&gt;Obsidian Web Clipper&lt;/strong&gt; extension created a completely blank note.&lt;/p&gt;&#xA;&lt;p&gt;The content would only show up properly if I closed Obsidian completely before clipping from Web Clipper.&lt;/p&gt;&#xA;&lt;h2 id=&#34;cause&#34;&gt;Cause&lt;/h2&gt;&#xA;&lt;p&gt;This isn&#39;t because Web Clipper failed to capture the page—it&#39;s because KDE prevented the already-running Obsidian instance from properly receiving focus.&lt;/p&gt;&#xA;&lt;p&gt;When Web Clipper hands page content over to Obsidian, Obsidian needs to be raised and focused properly to read the incoming data. Under KDE&#39;s default window management rules, an Obsidian instance running in the background can be blocked from stealing focus, so the clipped content is never written and you end up with an empty note.&lt;/p&gt;&#xA;&lt;h2 id=&#34;analysis&#34;&gt;Analysis&lt;/h2&gt;&#xA;&lt;p&gt;The key symptoms are:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Clipping works normally when Obsidian is closed;&lt;/li&gt;&#xA;&lt;li&gt;Clipping produces an empty note when Obsidian is already open;&lt;/li&gt;&#xA;&lt;li&gt;This means the browser extension itself is working fine;&lt;/li&gt;&#xA;&lt;li&gt;The failure happens when Obsidian is already running and KDE prevents it from responding properly to Web Clipper&#39;s activation request.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;So this is a window focus and activation permission issue in KDE, not a misconfiguration in your Obsidian vault, templates, or Chrome extension.&lt;/p&gt;&#xA;&lt;h2 id=&#34;solution&#34;&gt;Solution&lt;/h2&gt;&#xA;&lt;p&gt;Add a window rule for Obsidian in KDE: open &lt;code&gt;System Settings → Window Management → Window Rules&lt;/code&gt; and configure it as shown below.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://mizore.blog/images/639f87fb1000edf73702913b297ee8295880b29d636cd55533af044ea6b0d2c5.webp&#34; alt=&#34;Obsidian window rule configuration in KDE System Settings&#34; decoding=&#34;async&#34; fetchpriority=&#34;high&#34; width=&#34;1600&#34; height=&#34;1167&#34; srcset=&#34;https://mizore.blog/images/605a9074e4b97eb9a9e494b9842199c8879802dcf3e731bd960c1ecd3a66dc58.webp 720w, https://mizore.blog/images/639f87fb1000edf73702913b297ee8295880b29d636cd55533af044ea6b0d2c5.webp 1600w&#34; sizes=&#34;(max-width: 760px) calc(100vw - 64px), 704px&#34;&gt;&lt;/p&gt;&#xA;</description>
      <category>Tinkering</category>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mizore.blog/en/posts/kde-plasma-obsidian-web-clipper/</guid>
    </item>
    <item>
      <title>Xiaomi Book Pro 14 on Linux</title>
      <link>https://mizore.blog/en/posts/xiaomi-book-pro-14/</link>
      <description>&lt;p&gt;The reason I picked up this Xiaomi Book Pro 14 is quite simple: I already have a MacBook Pro that works great for my daily needs, but there are always things that a Mac either can&#39;t do or does awkwardly. I needed an x86 thin-and-light to handle the tasks that are &amp;quot;best done on x86.&amp;quot;&lt;/p&gt;&#xA;&lt;p&gt;As someone who can&#39;t stand leaving things stock, the first order of business with a new machine was, naturally, installing Arch Linux. I ran into a few pitfalls along the way and thoroughly dug into the fingerprint feature—something I’d never used before. I’m documenting it all here as a record for myself and a reference for anyone who encounters similar issues.&lt;/p&gt;&#xA;&lt;p&gt;First, here are the specs of my unit:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;SoC:&lt;/strong&gt; Intel Ultra X7 358H&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;RAM:&lt;/strong&gt; 32GB LPDDR5x 9600MT/s (Soldered)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;GPU:&lt;/strong&gt; Intel Arc B390&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://mizore.blog/images/b5d09a616b4aa066b319f1f0025d0b697b73dd46c282c049256b89395a24afb6.webp&#34; alt=&#34;Xiaomi Book Pro 14 running Arch Linux, with fastfetch system information in the terminal&#34; decoding=&#34;async&#34; fetchpriority=&#34;high&#34; width=&#34;1600&#34; height=&#34;1200&#34; srcset=&#34;https://mizore.blog/images/7ca7c73067278d7a82fe9e0e1a8ae3a98b66a535ce28bf1b4b2af3bd29ab5c10.webp 720w, https://mizore.blog/images/b5d09a616b4aa066b319f1f0025d0b697b73dd46c282c049256b89395a24afb6.webp 1600w&#34; sizes=&#34;(max-width: 760px) calc(100vw - 64px), 704px&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;problem-1-screen-artifacts&#34;&gt;Problem 1: Screen Artifacts&lt;/h2&gt;&#xA;&lt;p&gt;Right after the installation, the screen was glitching out. After some digging, the culprit turned out to be Intel&#39;s Panel Self Refresh technology.&lt;/p&gt;&#xA;&lt;p&gt;The fix is straightforward—just add this line to your kernel parameters:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;xe.enable_psr=0&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;h2 id=&#34;problem-2-keyboard-not-recognized&#34;&gt;Problem 2: Keyboard Not Recognized&lt;/h2&gt;&#xA;&lt;p&gt;This one was even weirder: the keyboard worked perfectly in the BIOS and GRUB, but became completely unresponsive as soon as the system booted. Getting stuck here during the installation process is incredibly frustrating.&lt;/p&gt;&#xA;&lt;p&gt;The solution, again, is to add kernel parameters:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;i8042.nopnp=1 i8042.dumbkbd=1&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Once the screen and keyboard were sorted out, the system was basically usable. What follows is the part I spent the most time on—the fingerprint reader.&lt;/p&gt;&#xA;&lt;h2 id=&#34;fingerprint-the-main-event&#34;&gt;Fingerprint: The Main Event&lt;/h2&gt;&#xA;&lt;p&gt;Honestly, I&#39;d never used a device with a fingerprint reader before, so I explored this area quite meticulously and hit many snags. It deserves its own write-up.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-doesnt-sudo-pop-up-a-fingerprint-gui-like-macos&#34;&gt;Why doesn&#39;t &lt;code&gt;sudo&lt;/code&gt; pop up a fingerprint GUI like macOS?&lt;/h3&gt;&#xA;&lt;p&gt;This was the most irritating part of the whole ordeal. On macOS, &lt;code&gt;sudo&lt;/code&gt; can use Touch ID. Why not on Linux?&lt;/p&gt;&#xA;&lt;p&gt;It&#39;s not that &amp;quot;no one thought of it&amp;quot;; it&#39;s that the architectures are fundamentally different.&lt;/p&gt;&#xA;&lt;p&gt;The authentication chain for &lt;code&gt;sudo&lt;/code&gt; looks like this:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;sudo → PAM → Terminal session or askpass&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;The beautiful KDE fingerprint authentication dialog, on the other hand, follows a different path:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;App → Polkit → KDE Polkit Agent → PAM → fprintd&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;That GUI is provided by the Polkit agent. It doesn&#39;t spring forth from PAM itself, nor is it part of &lt;code&gt;sudo&lt;/code&gt;. The PAM module can only participate in the authentication flow; it can&#39;t magically transform a terminal-based &lt;code&gt;sudo&lt;/code&gt; prompt into a KDE-style identity verification pop-up.&lt;/p&gt;&#xA;&lt;p&gt;Using &lt;code&gt;sudo -A&lt;/code&gt; with &lt;code&gt;SUDO_ASKPASS&lt;/code&gt; can indeed pop up a graphical password box, but that&#39;s still on &lt;code&gt;sudo&lt;/code&gt;&#39;s own askpass track, which is separate from the KDE Polkit agent. So, at best, it makes the &amp;quot;enter password&amp;quot; step a GUI, but it can&#39;t bring over the fingerprint experience.&lt;/p&gt;&#xA;&lt;p&gt;macOS can do it because Apple integrated &lt;code&gt;sudo&lt;/code&gt;, PAM, Touch ID, the Secure Enclave, and LocalAuthentication at the system level right from the start. On Linux, these components belong to different projects and thus have no natural path to a unified experience.&lt;/p&gt;&#xA;&lt;h3 id=&#34;a-key-limitation-of-pam_fprintd-the-pam-stack-is-serial&#34;&gt;A Key Limitation of &lt;code&gt;pam_fprintd&lt;/code&gt;: The PAM Stack is Serial&lt;/h3&gt;&#xA;&lt;p&gt;There&#39;s another fundamental limitation with &lt;code&gt;pam_fprintd&lt;/code&gt;: in a standard PAM stack, it and password authentication execute in series.&lt;/p&gt;&#xA;&lt;p&gt;My initial ideal experience was something like this:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;For a single sudo prompt, it would simultaneously wait for my password and my fingerprint, using whichever was provided first.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;But in reality, this isn&#39;t possible. A login manager can use more complex methods to fire up multiple PAM sessions to simulate concurrency, but a regular &lt;code&gt;sudo&lt;/code&gt; won&#39;t do that.&lt;/p&gt;&#xA;&lt;p&gt;So, the real-world choices are limited to the following experiences:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Option A:&lt;/strong&gt; Fingerprint first, fallback to password on failure.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Option B:&lt;/strong&gt; Password first, fallback to fingerprint if you press Enter with an empty field.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Option C:&lt;/strong&gt; Only use the Polkit GUI, don&#39;t force fingerprint on sudo.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Option D:&lt;/strong&gt; Use a third-party hack module (not recommended—don&#39;t mess around with root authentication).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I eventually settled on Option B, but I tried Option A first. Let me explain why it flopped.&lt;/p&gt;&#xA;&lt;h3 id=&#34;option-a-fingerprint-first-fallback-to-password-post-mortem&#34;&gt;Option A: Fingerprint First, Fallback to Password (Post-Mortem)&lt;/h3&gt;&#xA;&lt;p&gt;My initial, intuitive configuration was this, in &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;#%PAM-1.0&#xA;&#xA;auth        sufficient  pam_fprintd.so max-tries=3 timeout=8&#xA;auth        include     system-auth&#xA;account     include     system-auth&#xA;session     include     system-auth&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Logically, this looks fine: try the fingerprint first. If it succeeds, great; if not, it&#39;ll ask for a password.&lt;/p&gt;&#xA;&lt;p&gt;But in practice, it broke. I deliberately let the fingerprint recognition fail, then typed the correct password, but &lt;code&gt;sudo&lt;/code&gt; still would not let me through. The logs showed entries like this:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;pam_unix(sudo:auth): conversation failed&#xA;pam_unix(sudo:auth): auth could not identify password for [...]&#xA;pam_faillock(sudo:auth): Consecutive login failures ... account temporarily locked&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Meanwhile, &lt;code&gt;fprintd&lt;/code&gt; was also complaining:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;Device was already claimed&#xA;Verification was in progress, stopping it&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;It seems the interaction between &lt;code&gt;sudo&lt;/code&gt;, the terminal PAM conversation, &lt;code&gt;pam_fprintd&lt;/code&gt;, and the subsequent password stack gets into a messy state. After the fingerprint failed, the password fallback didn&#39;t take over cleanly, and it also increased the &lt;code&gt;faillock&lt;/code&gt; failure count, temporarily locking my account.&lt;/p&gt;&#xA;&lt;p&gt;The biggest danger with this kind of problem is that you&#39;re modifying the root privilege escalation entry point. If you bork &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt; and don&#39;t have another root channel, it&#39;s easy to lock yourself out.&lt;/p&gt;&#xA;&lt;p&gt;My recovery method at that time was using a still-functional Polkit:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;pkexec sh -c &lt;span class=&#34;s1&#34;&gt;&amp;#39;cat &amp;gt; /etc/pam.d/sudo &amp;lt;&amp;lt;EOF&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;#%PAM-1.0&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;auth        include     system-auth&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;account     include     system-auth&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;session     include     system-auth&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;EOF&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;faillock --user username --reset&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;systemctl restart fprintd&lt;/span&gt;&#xA;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;span class=&#34;lang&#34;&gt;bash&lt;/span&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;I suggest keeping this rollback method in mind: first, revert sudo to Arch&#39;s default password-only path, then clear &lt;code&gt;faillock&lt;/code&gt;, and finally restart &lt;code&gt;fprintd&lt;/code&gt; to release any lingering device claims. It&#39;s a lifesaver in critical moments.&lt;/p&gt;&#xA;&lt;h3 id=&#34;option-b-password-first-empty-enter-for-fingerprint-my-current-setup&#34;&gt;Option B: Password First, Empty Enter for Fingerprint (My Current Setup)&lt;/h3&gt;&#xA;&lt;p&gt;I later switched to a different approach: the system presents a normal sudo password prompt, but if you just press Enter (submitting an empty password), it falls back to fingerprint verification.&lt;/p&gt;&#xA;&lt;p&gt;My current configuration in &lt;code&gt;/etc/pam.d/sudo&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;#%PAM-1.0&#xA;&#xA;# Prompt for password first; an empty password triggers a fingerprint attempt&#xA;auth        sufficient  pam_unix.so try_first_pass likeauth nullok&#xA;&#xA;# Prevent fingerprint prompts in non-tty background sudo processes&#xA;auth        [success=1 default=ignore] pam_succeed_if.so service in sudo:su:su-l tty in :unknown&#xA;-auth       sufficient  pam_fprintd.so max-tries=3 timeout=8&#xA;&#xA;# Arch&amp;#39;s default fallback&#xA;auth        include     system-auth&#xA;account     include     system-auth&#xA;session     include     system-auth&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;The interactive flow goes like this:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;[sudo] password for user:&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;If you want to enter a password, just type it. If you want to use your fingerprint, press Enter on an empty field, and it will switch to:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;Place your right index finger on the fingerprint reader&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;This approach feels more intuitive in the terminal than &amp;quot;fingerprint first,&amp;quot; but it has its own little quirks.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-catch-with-option-b-empty-enter-can-leave-a-failure-record&#34;&gt;The Catch with Option B: Empty Enter Can Leave a Failure Record&lt;/h3&gt;&#xA;&lt;p&gt;That &amp;quot;empty Enter&amp;quot; step inherently goes through &lt;code&gt;pam_unix.so&lt;/code&gt; first. From &lt;code&gt;pam_unix&lt;/code&gt;&#39;s perspective, an empty string is not a correct password, so it registers an authentication failure before the PAM flow moves on to &lt;code&gt;pam_fprintd&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When you check &lt;code&gt;faillock&lt;/code&gt;, you might see a record like this:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;user:&#xA;When                Type  Source       Valid&#xA;2026-05-08 ...      TTY   /dev/pts/1   V&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;This means that even if the subsequent fingerprint authentication is successful, that initial empty Enter step might still be logged as a failed attempt.&lt;/p&gt;&#xA;&lt;p&gt;So, if you go with this option, keep a few things in mind:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Don&#39;t set &lt;code&gt;faillock&lt;/code&gt;&#39;s failure threshold too low.&lt;/li&gt;&#xA;&lt;li&gt;Always leave a working root backdoor while debugging PAM, like a currently functional &lt;code&gt;pkexec&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;After consecutive failures, remember to check:&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;faillock --user &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;span class=&#34;lang&#34;&gt;bash&lt;/span&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;And manually reset it if necessary:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;faillock --user &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; --reset&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;span class=&#34;lang&#34;&gt;bash&lt;/span&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;Also, a side note: if you want the most stable graphical privilege escalation experience, it&#39;s best to just prefer Polkit for daily use and not force everything through &lt;code&gt;sudo&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h3 id=&#34;kwallet-why-you-cant-unlock-it-with-a-fingerprint&#34;&gt;KWallet: Why You Can&#39;t Unlock It with a Fingerprint&lt;/h3&gt;&#xA;&lt;p&gt;This is another common point of confusion.&lt;/p&gt;&#xA;&lt;p&gt;The role of &lt;code&gt;kwallet-pam&lt;/code&gt; is, when you log in with your password, to pass that login password to KWallet, allowing the wallet to be automatically unlocked with the same credentials.&lt;/p&gt;&#xA;&lt;p&gt;There&#39;s a line in the logs that says it all:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;pam_kwallet5(plasmalogin-autologin:auth): Empty or missing password, doing nothing&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;This line makes the problem crystal clear: an automatic or fingerprint-based login does not provide the plaintext &amp;quot;user password,&amp;quot; so KWallet doesn&#39;t get the key it needs.&lt;/p&gt;&#xA;&lt;p&gt;A fingerprint authentication only answers one question:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Is this person who they claim to be?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;KWallet&#39;s decryption requires an answer to a different question:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;What is the key or password used to open the wallet?&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The fingerprint device won&#39;t spit out your login password; it only tells the system if the authentication was successful. Therefore, KWallet has no way to decrypt using a fingerprint alone.&lt;/p&gt;&#xA;&lt;p&gt;There are a few ways to handle this:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Disable automatic login, log in with your password, and keep your KWallet password synchronized with your login password.&lt;/li&gt;&#xA;&lt;li&gt;Accept reality and manually enter your KWallet password once after reaching the desktop.&lt;/li&gt;&#xA;&lt;li&gt;Reduce wallet security, for instance, by using a wallet with an empty password—but this is absolutely not recommended, especially if you&#39;re storing important keys.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;So, this isn&#39;t a case of KDE failing to connect things; it&#39;s that &amp;quot;authentication&amp;quot; and &amp;quot;decryption&amp;quot; are fundamentally two different things.&lt;/p&gt;&#xA;&lt;h3 id=&#34;fprintd-device-contention-issues&#34;&gt;&lt;code&gt;fprintd&lt;/code&gt; Device Contention Issues&lt;/h3&gt;&#xA;&lt;p&gt;During my tinkering, I also encountered this error:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;Device was already claimed&#xA;Verification was in progress, stopping it&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;This usually means a previous verification didn&#39;t terminate cleanly, or several authentication requests are simultaneously trying to claim the same fingerprint device.&lt;/p&gt;&#xA;&lt;p&gt;The fix is simple:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;systemctl restart fprintd&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;span class=&#34;lang&#34;&gt;bash&lt;/span&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;If you lack sufficient user permissions, use your confirmed-working Polkit backdoor:&lt;/p&gt;&#xA;&lt;figure class=&#34;code&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;pkexec systemctl restart fprintd&lt;/code&gt;&lt;/pre&gt;&lt;span class=&#34;code-tools&#34;&gt;&lt;span class=&#34;lang&#34;&gt;bash&lt;/span&gt;&lt;button class=&#34;copy&#34; type=&#34;button&#34;&gt;copy&lt;/button&gt;&lt;/span&gt;&lt;/figure&gt;&#xA;&lt;p&gt;This is also why I don&#39;t recommend configuring too many authentication entry points to automatically grab the fingerprint reader. The device can serve only one verification request at a time. When multiple PAM or Polkit requests compete for it, the resulting experience becomes incredibly erratic.&lt;/p&gt;&#xA;&lt;h2 id=&#34;final-state-summary&#34;&gt;Final State Summary&lt;/h2&gt;&#xA;&lt;p&gt;After all that tinkering, here&#39;s the current fingerprint and authentication configuration for this machine:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;fprintd:&lt;/strong&gt; Correctly identifies the Goodix device. I have enrolled my right index finger.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;KDE User Settings:&lt;/strong&gt; Fingerprint can be managed through &lt;code&gt;kcm_users&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Polkit:&lt;/strong&gt; Prioritizes fingerprint, falls back to password on failure.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;kio-admin:&lt;/strong&gt; Installed, allowing graphical root file operations via the &lt;code&gt;admin://&lt;/code&gt; protocol.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;sudo:&lt;/strong&gt; Asks for password first; pressing Enter on empty triggers a fingerprint attempt (max 3 tries).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Plasma Login Manager:&lt;/strong&gt; PAM is configured for fingerprint, but auto-login bypasses it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;KWallet:&lt;/strong&gt; Cannot be unlocked with a fingerprint alone.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;&#xA;&lt;p&gt;The Linux compatibility of this Xiaomi Book Pro 14 is far better than I imagined. The few issues I faced all had clear causes and solutions, and in general, it&#39;s been a very smooth experience.&lt;/p&gt;&#xA;&lt;p&gt;Another feeling I have is that tinkering with systems is much faster than it used to be. In the past, I&#39;d have to dig through piles of ArchWiki entries and man pages for a problem. Now, you can just ask ChatGPT &amp;quot;how to fix xxx,&amp;quot; and the efficiency is on a whole different level. This time, I even used OpenAI Codex, making the overall debugging process smoother by orders of magnitude.&lt;/p&gt;&#xA;</description>
      <category>Tinkering</category>
      <pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate>
      <guid>https://mizore.blog/en/%E6%8A%98%E8%85%BE/xiaomi-book-pro-14/</guid>
    </item>
  </channel>
</rss>