<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on T.本秋的自留地</title>
    <link>https://blog.texsd.eu.org/tags/linux/</link>
    <description>Recent content in Linux on T.本秋的自留地</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>Copyright© 2026 T.本秋. Licensed under CC BY-NC-SA 4.0.</copyright>
    <lastBuildDate>Tue, 05 May 2026 16:49:51 +0800</lastBuildDate><atom:link href="https://blog.texsd.eu.org/tags/linux/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>简单了解和手动使用 TPM</title>
      <link>https://blog.texsd.eu.org/posts/tpm/</link>
      <pubDate>Tue, 05 May 2026 16:49:51 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/tpm/</guid>
      <description>&lt;p&gt;最近疯狂迷恋 tpm，这个小玩意究竟是怎么实现基于设备的安全的？&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;tpm 的相关属性
    &lt;div id=&#34;tpm-的相关属性&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#tpm-%e7%9a%84%e7%9b%b8%e5%85%b3%e5%b1%9e%e6%80%a7&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;第一步，我们先看下 tpm 有什么变量是可以被改变的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tpm2_getcap properties-variable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;第一组：永久属性组 (PT -&amp;gt; Property)
    &lt;div id=&#34;第一组永久属性组-pt---property&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ac%ac%e4%b8%80%e7%bb%84%e6%b0%b8%e4%b9%85%e5%b1%9e%e6%80%a7%e7%bb%84-pt---property&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_PERMANENT:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ownerAuthSet:              &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 所有者鉴权密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  endorsementAuthSet:        &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 背书鉴权密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  lockoutAuthSet:            &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 锁定鉴权密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  reserved1:                 &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  disableClear:              &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  inLockout:                 &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  tpmGeneratedEPS:           &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  reserved2:                 &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;第二组：启动时状态
    &lt;div id=&#34;第二组启动时状态&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ac%ac%e4%ba%8c%e7%bb%84%e5%90%af%e5%8a%a8%e6%97%b6%e7%8a%b6%e6%80%81&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_STARTUP_CLEAR:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  phEnable:                  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 平台层级，也就是你可以在系统里面清除tpm所有信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  shEnable:                  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 存储层级，其实跟owner是一样的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ehEnable:                  &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 背书层级&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  phEnableNV:                &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  reserved1:                 &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  orderly:                   &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;第三组：句柄资源 (HR -&amp;gt; Handle Resource)
    &lt;div id=&#34;第三组句柄资源-hr---handle-resource&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ac%ac%e4%b8%89%e7%bb%84%e5%8f%a5%e6%9f%84%e8%b5%84%e6%ba%90-hr---handle-resource&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_NV_INDEX: 0x5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_LOADED: 0x0 &lt;span class=&#34;c1&#34;&gt;# 当前已加载密钥&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_LOADED_AVAIL: 0x3 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_ACTIVE: 0x0 &lt;span class=&#34;c1&#34;&gt;# 已激活的会话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_ACTIVE_AVAIL: 0x40 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_TRANSIENT_AVAIL: 0x3 &lt;span class=&#34;c1&#34;&gt;# 临时会话，从存储读入内存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_PERSISTENT: 0x0 &lt;span class=&#34;c1&#34;&gt;# 可以永久存储的槽位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_HR_PERSISTENT_AVAIL: 0x2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;第四组：锁定相关配置
    &lt;div id=&#34;第四组锁定相关配置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ac%ac%e5%9b%9b%e7%bb%84%e9%94%81%e5%ae%9a%e7%9b%b8%e5%85%b3%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_LOCKOUT_COUNTER: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_MAX_AUTH_FAIL: 0xC8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_LOCKOUT_INTERVAL: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_LOCKOUT_RECOVERY: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;第五组：杂项
    &lt;div id=&#34;第五组杂项&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ac%ac%e4%ba%94%e7%bb%84%e6%9d%82%e9%a1%b9&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_NV_COUNTERS: 0x0 &lt;span class=&#34;c1&#34;&gt;# 非易失标志位&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_NV_COUNTERS_AVAIL: 0x8
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_ALGORITHM_SET: 0xFFFFFFFF
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_LOADED_CURVES: 0x3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_AUDIT_COUNTER_0: 0x0 &lt;span class=&#34;c1&#34;&gt;# 审计日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TPM2_PT_AUDIT_COUNTER_1: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;

&lt;h3 class=&#34;relative group&#34;&gt;不同层级
    &lt;div id=&#34;不同层级&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e4%b8%8d%e5%90%8c%e5%b1%82%e7%ba%a7&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Owner Hierarchy&lt;/strong&gt;: 你平时用来创建密钥、存储数据的权限。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Endorsement Hierarchy&lt;/strong&gt;: 涉及设备隐私和证书的权限。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lockout Hierarchy&lt;/strong&gt;: “锁定控制”权限，用于控制锁定策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;允许多少次普通密码尝试后进入锁定模式 (TPM2_PT_MAX_AUTH_FAIL)&lt;/li&gt;
&lt;li&gt;被记录下连续失败后，过多久次数才能减一 (TPM2_PT_LOCKOUT_INTERVAL)&lt;/li&gt;
&lt;li&gt;进入锁定模式后，过多久才能解锁 (TPM2_PT_LOCKOUT_RECOVERY)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️注意：如果你是在验证以上三种层级的管理密码，比如用 tpm2_clear -C o -c -p &lt;password&gt;的时候，只有一次机会，失败立即进入锁定模式。&lt;/p&gt;
&lt;p&gt;你将被限制到 TPM2_PT_LOCKOUT_RECOVERY 的时间秒数之后才能解锁。
这两个时间设成 0，永远解不了，只能清除。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Platform Hierarchy&lt;/strong&gt;: 唯一不受 DA 限制的密码尝试。但是就算你拿到了权限，除了能够清除所有的密钥和密码，没有任何别的权限。&lt;/p&gt;
&lt;hr&gt;

&lt;h3 class=&#34;relative group&#34;&gt;初始化自己的 tpm 配置
    &lt;div id=&#34;初始化自己的-tpm-配置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%9d%e5%a7%8b%e5%8c%96%e8%87%aa%e5%b7%b1%e7%9a%84-tpm-%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;清除&lt;/strong&gt;：&lt;code&gt;tpm2_clear&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;有的平台可以直接用&lt;code&gt;tpm2_clear -c p&lt;/code&gt;清掉，有的不行只能到 bios 里面清。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;修改锁定设置&lt;/strong&gt;：&lt;code&gt;tpm2_dictionarylockout&lt;/code&gt; (也叫 DA，dictionary attack)&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 分别对应上面的“锁定层级”的三个变量，下例为windows标准设置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tpm2_dictionarylockout -s -n &lt;span class=&#34;m&#34;&gt;32&lt;/span&gt; -t &lt;span class=&#34;m&#34;&gt;7200&lt;/span&gt; -l &lt;span class=&#34;m&#34;&gt;86400&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;修改密码&lt;/strong&gt;：&lt;code&gt;tpm2_changeauth&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tpm2_changeauth -c lockout &amp;lt;new_password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里有个彩蛋，windows 一开始看到新的 tpm，跟我们一样改完了，直接把钥匙扔了，惊喜吧？&lt;/p&gt;
&lt;p&gt;所以你只能重置，然后自己设个密码，好在 windows 不会改你的密码回去。&lt;/p&gt;
&lt;hr&gt;

&lt;h2 class=&#34;relative group&#34;&gt;开始使用
    &lt;div id=&#34;开始使用&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%bc%80%e5%a7%8b%e4%bd%bf%e7%94%a8&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;创建主密钥，得到一个 tpm 的内存快照，这个主密钥，相比于密钥的说法，其实更是一个 token，因为是由 TPM 这一个生命周期的种子派生的，所以每次用同样的输入得到同样的输出，这里不是指的 ctx 的 hash 相同，而是每次读取的公钥相同。&lt;/p&gt;
&lt;p&gt;如果还原了 tpm，签名会变，ctx 永远不再可用。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创一个新的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_createprimary -C o -c primary2.ctx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name-alg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: sha256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0xb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;attributes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: fixedtpm&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;fixedparent&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;sensitivedataorigin&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;userwithauth&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;restricted&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;decrypt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x30072
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: rsa
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;exponent: &lt;span class=&#34;m&#34;&gt;65537&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bits: &lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheme:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheme-halg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;null&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-alg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: aes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-mode:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: cfb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x43
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-keybits: &lt;span class=&#34;m&#34;&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsa: c26b4cbadd50e487645f22d72f378953282d9a95036f09815fd91b2fd360f85517e730b19c1ba5668452b4ceca94a38aa6883ba6204f1ea4f72bd644190186fd1806f486e0e9de1ebe4fd64f618a0aac2d120e766bd0575f19b0ecce6ff55df47bacdffb8a431ac8d75cadff88ec62f149ae99ea210da4ba315b2d849b1e2b9196f7baac40ee34382f063e69af448b0c5812319b1efaa7cdffe50d3e4c396e427b270c95676b48168b2b90de555dd1cb46cbdeaed6c4f5c8466fa6a977af67a70efdf673a05b3fe7577bfb7d55991a0b7e94e917fc2533975c13c26231b3d2f6e990c395f963728f3dcaecd8f656f4a5a709fbd5c7edbda773ce960d0c9076c3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 读一个之前创的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_readpublic -c primary.ctx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: 000bf2c2daef8da6f674f7cdd47edb780e14baec9ed14a212904d79ca92c93e05c7c
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;qualified name: 000b8a569c59019bf73a23befe7aeb9e54c74470737c0288f63d2481324388e1edfb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name-alg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: sha256
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0xb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;attributes:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: fixedtpm&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;fixedparent&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;sensitivedataorigin&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;userwithauth&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;restricted&lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;decrypt
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x30072
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: rsa
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;exponent: &lt;span class=&#34;m&#34;&gt;65537&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bits: &lt;span class=&#34;m&#34;&gt;2048&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheme:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: null
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;scheme-halg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;null&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-alg:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: aes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x6
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-mode:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  value: cfb
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  raw: 0x43
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sym-keybits: &lt;span class=&#34;m&#34;&gt;128&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rsa: c26b4cbadd50e487645f22d72f378953282d9a95036f09815fd91b2fd360f85517e730b19c1ba5668452b4ceca94a38aa6883ba6204f1ea4f72bd644190186fd1806f486e0e9de1ebe4fd64f618a0aac2d120e766bd0575f19b0ecce6ff55df47bacdffb8a431ac8d75cadff88ec62f149ae99ea210da4ba315b2d849b1e2b9196f7baac40ee34382f063e69af448b0c5812319b1efaa7cdffe50d3e4c396e427b270c95676b48168b2b90de555dd1cb46cbdeaed6c4f5c8466fa6a977af67a70efdf673a05b3fe7577bfb7d55991a0b7e94e917fc2533975c13c26231b3d2f6e990c395f963728f3dcaecd8f656f4a5a709fbd5c7edbda773ce960d0c9076c3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;加密文字
    &lt;div id=&#34;加密文字&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%8a%a0%e5%af%86%e6%96%87%e5%ad%97&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;在主密钥下面创建一个子密钥：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;hello&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tpm2_create -C primary.ctx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -u key.pub -r key.priv &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -i- &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;123456&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成一个 tpm 的内存快照：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tpm2_load -C primary.ctx -u key.pub -r key.priv -c key.ctx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;把它持久化到 tpm 的对象里面：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tpm2_evictcontrol -C o -c key.ctx 0x81010002
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;blockquote&gt;
&lt;p&gt;有点乱？总结一下&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;命令&lt;/strong&gt;说明：
tpm2_create 指的是创建一个&amp;quot;密封信件&amp;quot;,这个信件有公钥来标识身份，有加密 blob 来给 tpm 读。
tpm2_load 则是让 tpm 读取这个密封信件，他生成一个内存快照 (token)，这个东西可以持久化来被 tpm 引用（成为永久句柄）。
tpm2_evictcontrol 如果-c 加的是文件，然后再跟上地址，语义就是把这个文件持久化到 tpm 的一个句柄中；如果-c 加的是一个地址，那么则是把这个持久句柄驱逐。&lt;/p&gt;
&lt;p&gt;对这里出现的&lt;strong&gt;文件&lt;/strong&gt;进行说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;key.pub 可以开放给别人看&lt;/li&gt;
&lt;li&gt;key.priv 是被 tpm 加密的对象，只有 tpm 才能解密&lt;/li&gt;
&lt;li&gt;key.ctx 是 tpm 的内存快照，和 0x 开头的是同一个类型的东西，都可以被&lt;code&gt;-c&lt;/code&gt;加载&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;所以我们给他解个密：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_unseal -c key.ctx -p &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello%
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_unseal -c 0x81010002 -p &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;hello%  
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;验证签名
    &lt;div id=&#34;验证签名&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%aa%8c%e8%af%81%e7%ad%be%e5%90%8d&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;既然懂了一些，我们就不要用 rsa 了，用 ecc，只需把所有的创建密钥的过程加&lt;code&gt;-G ecc&lt;/code&gt;就行。&lt;/p&gt;
&lt;p&gt;如果要删除之前的，善用 evictcontrol。&lt;/p&gt;
&lt;p&gt;重新创建 ecc 的主密钥：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tpm2_createprimary -C o -G ecc -c ecc_primary.ctx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;创建一个签名的对象：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tpm2_create &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -C ecc_primary.ctx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -G ecc256:ecdsa &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -u ecc.pub &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -r ecc.priv &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -p &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加载：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tpm2_load &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -C ecc_primary.ctx &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -u ecc.pub &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -r ecc.priv &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c ecc.ctx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;持久化：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo tpm2_evictcontrol -C o -c ecc.ctx 0x81020000
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成一个固定的挑战，用于验证（其实真正的过程中，每次都是不同的）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;head -c &lt;span class=&#34;m&#34;&gt;32&lt;/span&gt; /dev/urandom &amp;gt; challenge.bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 tpm 自带的工具验证：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_sign &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c 0x81020000 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -g sha256 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -s ecdsa &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -o sig.tss &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -p &lt;span class=&#34;m&#34;&gt;123456&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  challenge.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ tpm2_verifysignature &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -c 0x81020000 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -g sha256 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -s sig.tss &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -m challenge.bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 返回0，通过&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;

&lt;h2 class=&#34;relative group&#34;&gt;整活
    &lt;div id=&#34;整活&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%95%b4%e6%b4%bb&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;接下来把这个接入 pam。&lt;/p&gt;
&lt;p&gt;导出公钥：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tpm2_readpublic -c 0x81020000 -f pem -o /etc/tpm-ecc.pub.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod &lt;span class=&#34;m&#34;&gt;644&lt;/span&gt; /etc/tpm-ecc.pub.pem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用我这个&lt;a
  href=&#34;https://github.com/minortex/tpm_auth&#34;
    target=&#34;_blank&#34;
  &gt;项目&lt;/a&gt;试试，仅供娱乐：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#%PAM-1.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       required                    pam_faillock.so      preauth
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;3&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ignore&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;  pam_tpm_ecc.so       &lt;span class=&#34;nv&#34;&gt;key_handle&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;0x81020000 &lt;span class=&#34;nv&#34;&gt;pubkey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/etc/tpm-ecc.pub.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;-auth      &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ignore&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;  pam_systemd_home.so
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;success&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bad&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;     pam_unix.so          try_first_pass nullok
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;die&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;               pam_faillock.so      authfail
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       optional                    pam_permit.so
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       required                    pam_env.so
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;auth       required                    pam_faillock.so      authsucc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;polkit
    &lt;div id=&#34;polkit&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#polkit&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;这玩意，搞那么复杂的权限管理，还用模板，没折腾死我。&lt;/p&gt;
&lt;p&gt;他每次授权的时候启动一个 helper，这个 helper 有 root 权限，但是启动的时候被 systemd 限制了一大堆特权，我们得用 drop-in 给他加回来：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl edit polkit-agent-helper@
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Editing /etc/systemd/system/polkit-agent-helper@.service.d/override.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;[Service]                        &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;DeviceAllow&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/dev/tpmrm0 rw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;BindPaths&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/dev/tpmrm0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 class=&#34;relative group&#34;&gt;彩蛋
    &lt;div id=&#34;彩蛋&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%bd%a9%e8%9b%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;一发入魄&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ sudo tpm2_dictionarylockout -s -n &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; -t &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; -l &lt;span class=&#34;m&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WARNING:esys:src/tss2-esys/api/Esys_DictionaryAttackParameters.c:310:Esys_DictionaryAttackParameters_Finish&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; Received TPM Error 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR:esys:src/tss2-esys/api/Esys_DictionaryAttackParameters.c:108:Esys_DictionaryAttackParameters&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; Esys Finish ErrorCode &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x0000098e&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Esys_DictionaryAttackParameters&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x98E&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; - tpm:session&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;:the authorization HMAC check failed and DA counter incremented
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Failed DictionaryLockout Setup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Unable to run tpm2_dictionarylockout
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ sudo tpm2_dictionarylockout -s -n &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; -t &lt;span class=&#34;m&#34;&gt;600&lt;/span&gt; -l &lt;span class=&#34;m&#34;&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;WARNING:esys:src/tss2-esys/api/Esys_DictionaryAttackParameters.c:310:Esys_DictionaryAttackParameters_Finish&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; Received TPM Error 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR:esys:src/tss2-esys/api/Esys_DictionaryAttackParameters.c:108:Esys_DictionaryAttackParameters&lt;span class=&#34;o&#34;&gt;()&lt;/span&gt; Esys Finish ErrorCode &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x00000921&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Esys_DictionaryAttackParameters&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;0x921&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; - tpm:warn&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;2.0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;: authorizations &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; objects subject to DA protection are not allowed at this &lt;span class=&#34;nb&#34;&gt;time&lt;/span&gt; because the TPM is in DA lockout mode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Failed DictionaryLockout Setup
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ERROR: Unable to run tpm2_dictionarylockout
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      
    </item>
    
    <item>
      <title>UPS 折腾记</title>
      <link>https://blog.texsd.eu.org/posts/ups/</link>
      <pubDate>Wed, 22 Apr 2026 23:00:09 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/ups/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;最近我突然有了两台 ups 的管理权，一台工作室的 APC Smart-UPS SPRM1K，另一台家里的 APC BACK-UPS BK650。由于手边只有前者，先更新前者的研究成果，后者择日更新。&lt;/p&gt;
&lt;p&gt;管理带通信的 UPS 的配套软件其实就两种，这里主要讲解 NUT，而 apcupsd 配置很简单，而且也可以作为 NUT 的驱动，这里不再详述。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;NUT 的配置
    &lt;div id=&#34;nut-的配置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#nut-%e7%9a%84%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;要理解 NUT，首先要明白几个概念：driver、monitor(client)、server（可选），三个服务都要单独启用。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;驱动层
    &lt;div id=&#34;驱动层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%a9%b1%e5%8a%a8%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;driver 其实就是对接各种奇奇怪怪 ups 的，这里我这两台一个用的是串口（apcsmart）,另一个是 usbhid-ups，这里主要是以前者讲解的。&lt;/p&gt;
&lt;p&gt;配置 ups 驱动：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/ups.conf &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 根据需要填写,可用nut-scanner -U获取驱动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;driver&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; apcsmart 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; /dev/ups 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;cable&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 940-0024 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ignorelb &lt;span class=&#34;c1&#34;&gt;# 手动指定阈值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    override.battery.charge.low &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;70&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    override.battery.runtime.low &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动服务：&lt;code&gt;upsdrvctl start&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里有个小插曲，串口可能提示权限不够：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@pve:/etc/nut# upsdrvctl start
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Network UPS Tools - UPS driver controller 2.8.1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Network UPS Tools - Generic HID driver 0.52 &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;2.8.1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;USB communication driver &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;libusb 1.0&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; 0.46
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;libusb1: Could not open any HID devices: insufficient permissions on everything
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;No matching HID UPS found
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsnotify: notify about state &lt;span class=&#34;m&#34;&gt;4&lt;/span&gt; with libsystemd: was requested, but not running as a service unit now, will not spam more about it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsnotify: failed to notify about state 4: no notification tech defined, will not spam more about it
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Driver failed to start &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;status&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用 udev 规则，给 nut 权限：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; &amp;gt; /etc/udev/rules.d/99-nut-ups.rules
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;SUBSYSTEM==&amp;#34;usb&amp;#34;, ATTR{idVendor}==&amp;#34;051d&amp;#34;, ATTR{idProduct}==&amp;#34;0002&amp;#34;, MODE=&amp;#34;0660&amp;#34;, GROUP=&amp;#34;nut&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;udevadm control --reload-rules
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;udevadm trigger
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再次启动：&lt;code&gt;upsdrvctl start&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;服务层
    &lt;div id=&#34;服务层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%9c%8d%e5%8a%a1%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;nut 其实 c/s 架构很分明，如果只有一台机子，也得启动一个服务器。但是这也为拓展型带来了便利。&lt;/p&gt;
&lt;p&gt;如果你只有一台机子，用 standalone 即可，作为“吹哨人”，用 netserver，接收命令关闭自己的机器，用 netclient。&lt;/p&gt;
&lt;p&gt;我这里改成服务器：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/nut.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 服务器模式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;MODE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;netserver
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/upsd.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 加上这一行，给局域网里面的设备提供服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 如果你是pve而且路由器不接ups，建议自己建一个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 自定义交换机&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;LISTEN 0.0.0.0 &lt;span class=&#34;m&#34;&gt;3493&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置用户，monuser 最好有，因为群晖用这个而且不能更改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## /etc/nut/upsd.users&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;monuser&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; secret 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    upsmon slave 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;admin&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &amp;lt;your_password&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    upsmon master 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;actions&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; SET
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;instcmds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; ALL
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动服务：&lt;code&gt;systemctl enable --now nut-server&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;客户端/监视层
    &lt;div id=&#34;客户端监视层&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%ae%a2%e6%88%b7%e7%ab%af%e7%9b%91%e8%a7%86%e5%b1%82&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;配置 nut-monitor 以便自动关机：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MONITOR ups@localhost &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; monuser secret master &lt;span class=&#34;c1&#34;&gt;# slave也可以，后文（关机过程）讲&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以看到，最下面有个&lt;code&gt;shutdown&lt;/code&gt;命令，这个只要 monitor 服务启动了，在遇到低电量阈值的时候，就一定会执行的。&lt;/p&gt;
&lt;p&gt;启动服务：&lt;code&gt;systemctl enable --now nut-monitor&lt;/code&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;关机过程
    &lt;div id=&#34;关机过程&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%b3%e6%9c%ba%e8%bf%87%e7%a8%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;断开电源，nut 检测到电池供电，其他客户端收到信号。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对于群晖这种设置了 upssched 的机子，他可以在检测到断电之后的一定时间开启安全模式（umount 所有分区，只保留必须的 nut 监听服务和关机逻辑），如果在此期间市电恢复，重新检测到后会进行自动重启。&lt;/p&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;电池到达所给定的阈值（电量/剩余事件/电池供电时间），发出警告信号。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这时候服务器自己会开始关机（执行 shutdown），其他客户端会收到信号，开始进行关机。&lt;/p&gt;
&lt;p&gt;在关机最后一刻，有一个有意思的脚本想和大家分享。&lt;/p&gt;
&lt;p&gt;这个脚本是 systemd 在关机的最后时刻执行的，位于&lt;code&gt;/usr/lib/systemd/system-shutdown/nutshutdown&lt;/code&gt;。我们来看看他的结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# This script requires both nut-server (drivers)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# and nut-client (upsmon) to be present locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# and on mounted filesystems&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sbin/upsmon&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -x &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sbin/upsdrvctl&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; /sbin/upsmon -K &amp;gt;/dev/null 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;1&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# The argument may be anything compatible with sleep&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;# (not necessarily a non-negative integer)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;wait_delay&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;`/bin/sed -ne &amp;#39;s#^ *POWEROFF_WAIT= *\(.*\)&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$#&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\1#p&amp;#39; /etc/nut/nut.conf`&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;wait_delay&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /sbin/upsdrvctl shutdown
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$wait_delay&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /bin/sleep &lt;span class=&#34;nv&#34;&gt;$wait_delay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# We need to pass --force twice here to bypass systemd and execute the&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# reboot directly ourself.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    /bin/systemctl reboot --force --force
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以注意到经过一系列的判断，如果是真的断电（发出警告后）&lt;code&gt;upsmon -K&lt;/code&gt;会返回 1，那么就会使用&lt;code&gt;upsdrvctl shutdown&lt;/code&gt;来命令 ups 在一定时间后断电。&lt;/p&gt;
&lt;p&gt;但是这时候，系统已经解除了所有的磁盘 rw 的挂载，执行完脚本的下一步其实就是给 acpi 电源发送 S5 信号并断电，速度很快，其实断不断电也无所谓了。&lt;/p&gt;
&lt;p&gt;一般的断电延时 20s 绰绰有余。至于断电时间的设置，高级的 ups 可以设置（见后文&lt;code&gt;upsrw&lt;/code&gt;），普通的不可以。&lt;/p&gt;
&lt;p&gt;所以如果这是最后一个“吹哨人”执行的 killpower（让 ups 等会断电），最好关闭的时候要尽量比 slave 关得晚，否则就得尽量延长 ups 的延迟时间。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;常用命令
    &lt;div id=&#34;常用命令&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%b8%b8%e7%94%a8%e5%91%bd%e4%bb%a4&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;

&lt;h3 class=&#34;relative group&#34;&gt;upscmd：执行一些驱动预设的指令
    &lt;div id=&#34;upscmd执行一些驱动预设的指令&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#upscmd%e6%89%a7%e8%a1%8c%e4%b8%80%e4%ba%9b%e9%a9%b1%e5%8a%a8%e9%a2%84%e8%ae%be%e7%9a%84%e6%8c%87%e4%bb%a4&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@SAST-Docker:~# upscmd -l ups
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Instant commands supported on UPS &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bypass.start - Put the UPS in bypass mode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bypass.stop - Take the UPS out of bypass mode
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;load.off - Turn off the load immediately
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;load.on - Turn on the load immediately
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shutdown.return - Turn off the load and &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; when power is back
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;shutdown.stayoff - Turn off the load and remain off
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.battery.start - Start a battery &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.battery.stop - Stop the battery &lt;span class=&#34;nb&#34;&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.failure.start - Start a simulated power failure
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;test.panel.start - Start testing the UPS pane
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;upsrw：用于读写 eeprom 的
    &lt;div id=&#34;upsrw用于读写-eeprom-的&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#upsrw%e7%94%a8%e4%ba%8e%e8%af%bb%e5%86%99-eeprom-%e7%9a%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;upsrw -l &amp;lt;upsname&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;控制响声、复电延迟启动、复电要求电池水平、关电延迟停止 ups。&lt;/p&gt;
&lt;p&gt;比如我们工作室的 SPRM1K 可以设置的东西就很多，还贴心的用了 enum 告诉你：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;root@SAST-Docker:/etc/nut# upsrw -l ups
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.alarm.threshold&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Battery alarm threshold
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;L&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;N&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.charge.restart&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Minimum battery level &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; restart after power off &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;percent&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;00&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;15&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;50&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;90&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;battery.date&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Battery change date
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: STRING
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maximum length: &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Value: 12/30/25
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;input.transfer.high&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;High voltage transfer point &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;231&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;242&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;253&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;264&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;input.transfer.low&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Low voltage transfer point &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;187&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;176&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;165&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;154&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;output.voltage.nominal&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Nominal output voltage &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;V&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;220&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;230&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;240&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.delay.shutdown&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval to &lt;span class=&#34;nb&#34;&gt;wait&lt;/span&gt; after shutdown with delay &lt;span class=&#34;nb&#34;&gt;command&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;020&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;180&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;300&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;600&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.delay.start&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval to &lt;span class=&#34;nb&#34;&gt;wait&lt;/span&gt; before &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;re&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;starting the load &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;060&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;180&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;300&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.id&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UPS system identifier
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: STRING
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Maximum length: &lt;span class=&#34;m&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Value: UPS_IDEN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;ups.test.interval&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Interval between self tests &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;seconds&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Type: ENUM NUMBER
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;1209600&amp;#34;&lt;/span&gt; SELECTED
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;604800&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Option: &lt;span class=&#34;s2&#34;&gt;&amp;#34;0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我在这里改了&lt;code&gt;ups.delay.shutdown&lt;/code&gt;，原因很尴尬，esxi 只支持客户端模式的 nut，服务端只能用一台虚拟机来实现。那么希望在服务端发出 killpower 后，还能等待 esxi 关闭，这个时间就不可避免的延长。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我还改了&lt;code&gt;ups.delay.start&lt;/code&gt;，这个参数很有意思，他没有注释，根据字面意思理解，应该是断电之后延迟启动吧？&lt;/p&gt;
&lt;p&gt;但是不是这个意思。他指的是如果你发出了 killpower 的命令后中途来电，他断电后，应该在多少秒后开机？&lt;/p&gt;
&lt;p&gt;我觉得这句话得细品。&lt;/p&gt;
&lt;p&gt;对于我这台 SPRM1K 来说，发送 killpower 指令后，首先是等待&lt;code&gt;ups.delay.shutdown&lt;/code&gt;的时间，然后切断输出，然后过了硬编码的 1 分钟，关闭 ups 自己。&lt;/p&gt;
&lt;p&gt;那么就有几种情况：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在等待&lt;code&gt;ups.delay.shutdown&lt;/code&gt;时，市电恢复。&lt;/li&gt;
&lt;li&gt;在等待硬编码的 1 分钟的时候，市电恢复。&lt;/li&gt;
&lt;li&gt;ups 关机之后，市电恢复。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三种情况中前两者会等待&lt;code&gt;ups.delay.start&lt;/code&gt;的时间，最后一种不会等待，初始化之后直接开机。&lt;/p&gt;
&lt;p&gt;我想应该是&lt;a
  href=&#34;https://www.chiphell.com/forum.php?mod=viewthread&amp;amp;tid=2605539&amp;amp;extra=page%3D1&amp;amp;mobile=no&#34;
    target=&#34;_blank&#34;
  &gt;这篇文章&lt;/a&gt;里面提到的问题，作者说如果断电的时间太短，那么 After AC Loss 就算设置为 Power On，也不一定能自动开机。所以才有这么一个选项。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;btw: 我并不太赞同链接里面的方案，复杂度太高了很难维护，其实里面很多东西厂家已经做好了。（排除 UPS 不够高端的问题，这个等我回去测试一下我的 BK650 再下定论）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 class=&#34;relative group&#34;&gt;奇怪的 bug
    &lt;div id=&#34;奇怪的-bug&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%a5%87%e6%80%aa%e7%9a%84-bug&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;根据 &lt;code&gt;man 8 usbhid-ups&lt;/code&gt; 中的说明，可以直接在 ups.conf 里面配置 &lt;code&gt;allow_killpower&lt;/code&gt; 来在启动的时候生效，但是&lt;a
  href=&#34;https://github.com/networkupstools/nut/issues/2605&#34;
    target=&#34;_blank&#34;
  &gt;这个 issue&lt;/a&gt; 说 &lt;code&gt;allow_killpower&lt;/code&gt; 在 2.8.3 之后才修复启动的时候硬编码的 0 会覆盖回去的问题，然而 trixie 是 2.8.1，就很难受。&lt;/p&gt;
&lt;p&gt;能用点 hack 的办法，启动的时候修改。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;systemctl edit nut-driver@ups.service
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 写入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;Service&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 延迟几秒确保驱动已经完全初始化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;ExecStartPost&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/bin/sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;sleep 5 &amp;amp;&amp;amp; /usr/bin/upsrw -s driver.flag.allow_killpower=1 -u admin -p &amp;lt;你的密码&amp;gt; ups&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是这台设备不再身边，所以我还是选择了保守的 apcupsd 方案关机+nut 桥接给群晖，这篇文章之后还会更新的。&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Dbus 探索</title>
      <link>https://blog.texsd.eu.org/posts/dbus_discovering/</link>
      <pubDate>Fri, 21 Nov 2025 17:56:21 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/dbus_discovering/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;之前想使用 &lt;code&gt;syfs&lt;/code&gt; 监听电量变化失败，原因是 &lt;code&gt;sysfs&lt;/code&gt; 不支持 &lt;code&gt;epoll&lt;/code&gt; 之类的高级特性，所以还得隔几秒轮询，这对于精确度要求高的我来说是没法接受的，所以我不得不望向一个很熟悉但是陌生的东西————&lt;code&gt;Dbus&lt;/code&gt;。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;概念
    &lt;div id=&#34;概念&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%a6%82%e5%bf%b5&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;感觉 &lt;code&gt;Dbus&lt;/code&gt; 是有点点像 &lt;code&gt;MQTT&lt;/code&gt;，你看 &lt;code&gt;broker&lt;/code&gt; 都出来了，都有订阅这一说法，但是又有点不同。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;总线&lt;/strong&gt;: 包括系统总线和用户总线。前者可以报告系统状态，硬件上的状态（正是我们需要的）；后者则在 &lt;code&gt;KDE&lt;/code&gt; 的通知和特效之类上面大量使用，比如录屏的时候静音之类。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;总线名称&lt;/strong&gt;: 一个跟 &lt;code&gt;Dbus&lt;/code&gt; 有关的服务启动了，这个服务下面提供的各种对象，全都是挂在这个总线名称下的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对象路径&lt;/strong&gt;: 服务提供的某些功能/实例，有点像 &lt;code&gt;unix&lt;/code&gt; 的路径但是完全不一样，组织成面向对象的层次结构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接口名称&lt;/strong&gt;: 一个服务可以有多个接口，在不同的接口名称定义对象提供的方法、属性和信号。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方法&lt;/strong&gt;: 客户端向服务端发起的同步请求，要求服务执行请求/获取状态然后返回请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性&lt;/strong&gt;: 客户端向服务端可以获取到的状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信号&lt;/strong&gt;: 服务向总线上面发送通知，告知感兴趣的客户端某个事件发生了。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;订阅&lt;/strong&gt;: 客户端告诉总线对服务上面的某个对象的某个信号感兴趣。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;systemd&lt;/code&gt; 和 &lt;code&gt;Dbus&lt;/code&gt; 集成挺好的，可以监听某个总线上面的连接，如果客户端发出了请求但是服务没有启动，那么就会自动启动服务。这就像普通的服务上面的 &lt;code&gt;socket&lt;/code&gt; 按需启动一样，也是把这套思路应用到了 &lt;code&gt;Dbus&lt;/code&gt; 上面。&lt;/p&gt;
&lt;p&gt;一般来说约定名字和对象路径中间的 &lt;code&gt;.&lt;/code&gt; 和 &lt;code&gt;/&lt;/code&gt; 对应，但是当然可以不遵守。&lt;/p&gt;
&lt;p&gt;客户端可以手动向服务查询，对于用户，可以手动通过命令行获取信息；也可以由服务通过信号推送得到信息，这样就避免轮询造成的性能开销。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;命令行使用
    &lt;div id=&#34;命令行使用&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%91%bd%e4%bb%a4%e8%a1%8c%e4%bd%bf%e7%94%a8&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;systemd&lt;/code&gt; 的 &lt;code&gt;busctl&lt;/code&gt; 比较好理解，以这个工具为例。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;busctl&lt;/code&gt; 无非就那几个参数，总线名称，对象路径，接口名称，然后按需调用/获取对应的对象。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;自省
    &lt;div id=&#34;自省&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%87%aa%e7%9c%81&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busctl introspect &amp;lt;busName&amp;gt; &amp;lt;path&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个路径下的对象允许被自省的话，比如说 &lt;code&gt;UPower&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;❯ busctl introspect org.freedesktop.UPower /org/freedesktop/UPower
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NAME                                TYPE      SIGNATURE RESULT/VALUE FLAGS       
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;org.freedesktop.DBus.Introspectable interface -         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.Introspect                         method    -         s            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;org.freedesktop.DBus.Peer           interface -         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.GetMachineId                       method    -         s            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.Ping                               method    -         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;org.freedesktop.DBus.Properties     interface -         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.Get                                method    ss        v            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.GetAll                             method    s         a&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;sv&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;        -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.Set                                method    ssv       -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.PropertiesChanged                  signal    sa&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;sv&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;as  -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;org.freedesktop.UPower              interface -         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.EnumerateDevices                   method    -         ao           -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.GetCriticalAction                  method    -         s            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.GetDisplayDevice                   method    -         o            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.DaemonVersion                      property  s         &lt;span class=&#34;s2&#34;&gt;&amp;#34;1.90.10&amp;#34;&lt;/span&gt;    emits-change
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.LidIsClosed                        property  b         &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;        emits-change
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.LidIsPresent                       property  b         &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;         emits-change
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.OnBattery                          property  b         &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;        emits-change
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.DeviceAdded                        signal    o         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.DeviceRemoved                      signal    o         -            -           
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;调用方法
    &lt;div id=&#34;调用方法&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%b0%83%e7%94%a8%e6%96%b9%e6%b3%95&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;那么显而易见了，直接调用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busctl call &amp;lt;busName&amp;gt; &amp;lt;path&amp;gt; &amp;lt;interface&amp;gt; &amp;lt;object&amp;gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;param&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;得是 &lt;code&gt;method&lt;/code&gt; 才能被调用，有的方法需要参数才能调用。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;属性
    &lt;div id=&#34;属性&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%b1%9e%e6%80%a7&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;属性既可以获取，在有权限的情况下可以设置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busctl get-property &amp;lt;busName&amp;gt; &amp;lt;path&amp;gt; &amp;lt;interface&amp;gt; &amp;lt;object&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;busctl set-property &amp;lt;busName&amp;gt; &amp;lt;path&amp;gt; &amp;lt;interface&amp;gt; &amp;lt;object&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;签名
    &lt;div id=&#34;签名&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ad%be%e5%90%8d&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;获取对象或者调用方法传参的时候，要求签名匹配。这里其实是一些数据类型，根据对应的英文简称：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt;: 字符串&lt;/li&gt;
&lt;li&gt;&lt;code&gt;b&lt;/code&gt;: 布尔&lt;/li&gt;
&lt;li&gt;&lt;code&gt;i&lt;/code&gt;: 整形&lt;/li&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt;: 无符号整形&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt;: 双精度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(a)o&lt;/code&gt;: （数组式的）对象路径，用于查看其他对象。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;传入参数是这样的，先输入类型，然后跟上你的数据，比如：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;s &amp;quot;hello&amp;quot; i 32&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;简单的电量检测小工具
    &lt;div id=&#34;简单的电量检测小工具&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ae%80%e5%8d%95%e7%9a%84%e7%94%b5%e9%87%8f%e6%a3%80%e6%b5%8b%e5%b0%8f%e5%b7%a5%e5%85%b7&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;让 Gemini 用 QT 写了一个简单的电量监测系统，仅用于我这一台 chromebook：&lt;/p&gt;
&lt;p&gt;&lt;a
  href=&#34;https://github.com/minortex/BatteryService&#34;
    target=&#34;_blank&#34;
  &gt;BatteryService&lt;/a&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>Linux Swap：ZRAM、ZSWAP 与内存策略</title>
      <link>https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/</link>
      <pubDate>Sat, 01 Nov 2025 21:57:31 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;引子
    &lt;div id=&#34;引子&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%bc%95%e5%ad%90&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;无论在哪个安装 Arch 的教程里面，你都能看到要求你设置一个 &lt;code&gt;swap&lt;/code&gt; 分区，但是，这个分区真的那么有必要吗？&lt;/p&gt;
&lt;p&gt;我最早听到 &lt;code&gt;swap&lt;/code&gt; 这个字，大概是安卓 2.3-4.0 时代吧。那时候的 CPU 性能不行，存储性能也很差，但是人们却执着于把 &lt;code&gt;swap&lt;/code&gt; 放在存储卡上面，总共 &lt;code&gt;128M&lt;/code&gt; 的内存，要在卡上放 &lt;code&gt;64M&lt;/code&gt; 进行交换。不过对于本来就慢的安卓手机，能够有更大的内存以便运行大型一点的游戏，就算慢一点，也比较值得。&lt;/p&gt;
&lt;p&gt;然而在现代系统上面，手机厂商又把这个“内存拓展”拿出来，许多人对此嗤之以鼻，然而这完全不是一回事。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;把内存变小，而不是放到低速存储上面
    &lt;div id=&#34;把内存变小而不是放到低速存储上面&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%8a%8a%e5%86%85%e5%ad%98%e5%8f%98%e5%b0%8f%e8%80%8c%e4%b8%8d%e6%98%af%e6%94%be%e5%88%b0%e4%bd%8e%e9%80%9f%e5%ad%98%e5%82%a8%e4%b8%8a%e9%9d%a2&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;首先，能够实现这一切的前提，是内存虚拟化。&lt;/p&gt;
&lt;p&gt;一个程序看到的大量的地址空间，其实并不是 1:1 的映射到物理内存上面的。通过系统调用 &lt;code&gt;mmap&lt;/code&gt;，操作系统记录了一个程序看到的内存是怎么对应到物理内存上去，但是，为什么一定是物理内存上面呢？&lt;/p&gt;
&lt;p&gt;于是有了 &lt;code&gt;swap&lt;/code&gt;，当我内存不够的时候，直接把程序运行时的内存（匿名页）驱逐到 &lt;code&gt;swap&lt;/code&gt; 上面，然后往映射表记录，当再次需要访问他的时候，触发一个“缺页中断”，就把 &lt;code&gt;swap&lt;/code&gt; 的内存重新搬回物理内存上面，这一切对于程序来说都是透明的。&lt;/p&gt;
&lt;p&gt;随着性能的发展，人们发现，这个把匿名页搬回物理内存的过程实在是太慢了，浪费了大量的 CPU 时间，那么为什么不让做点事情？于是，内存压缩出现了。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;ZRAM
    &lt;div id=&#34;zram&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#zram&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ZRAM&lt;/code&gt;，顾名思义，就是把内存压缩。&lt;/p&gt;
&lt;p&gt;不过，人们用的还是 &lt;code&gt;swap&lt;/code&gt; 的那套思路，把内存中的一部分划分出来，然后创建一个块设备，然后需要的时候，把内存压缩进去，这就是 &lt;code&gt;ZRAM&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我们可以通过 &lt;code&gt;swappiness&lt;/code&gt; 参数，控制操作系统内核把内存压缩进入 &lt;code&gt;swap&lt;/code&gt; 的激进性，现在的值取 &lt;code&gt;0-200&lt;/code&gt; 了，值越高，越倾向于把内存放入交换分区。如果是传统的 &lt;code&gt;swap&lt;/code&gt;，那么我们希望不要那么激进，因为磁盘总归是慢的；但是对于一个压缩的内存块来说，应该把这个值取很高，因为对于 &lt;code&gt;zstd&lt;/code&gt; 和 &lt;code&gt;lz4&lt;/code&gt; 这样的算法来说，压缩/解压的速度非常快。&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;存到极限
    &lt;div id=&#34;存到极限&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%ad%98%e5%88%b0%e6%9e%81%e9%99%90&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;如果内存的压力持续增大，&lt;code&gt;ZRAM&lt;/code&gt; 会有用完的时候。这又分为两种情况：&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;1. &lt;code&gt;ZRAM&lt;/code&gt; 达到了设置的压缩前的数据的最大值。
    &lt;div id=&#34;1-zram-达到了设置的压缩前的数据的最大值&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-zram-%e8%be%be%e5%88%b0%e4%ba%86%e8%ae%be%e7%bd%ae%e7%9a%84%e5%8e%8b%e7%bc%a9%e5%89%8d%e7%9a%84%e6%95%b0%e6%8d%ae%e7%9a%84%e6%9c%80%e5%a4%a7%e5%80%bc&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;这时候如果没有配置回写块的时候，系统就会去寻找一个优先级更低的 &lt;code&gt;swap&lt;/code&gt; 了。如果没有，那么就很可能触发 &lt;code&gt;OOM&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;配置了回写块的话，&lt;code&gt;ZRAM&lt;/code&gt; 会把其中最少使用的数据驱逐到回写块中。这个回写块跟 &lt;code&gt;swap&lt;/code&gt; 是不相容的，只能用于一种用途。&lt;/p&gt;
&lt;p&gt;如果这时候需要提取写入到回写块中的数据，那么就直接从磁盘解压到物理内存中，因为是压缩的数据，不仅减少了对磁盘的读写，还不让 CPU 闲着。&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;2. &lt;code&gt;ZRAM&lt;/code&gt; 还没满，但是物理内存就要满了
    &lt;div id=&#34;2-zram-还没满但是物理内存就要满了&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#2-zram-%e8%bf%98%e6%b2%a1%e6%bb%a1%e4%bd%86%e6%98%af%e7%89%a9%e7%90%86%e5%86%85%e5%ad%98%e5%b0%b1%e8%a6%81%e6%bb%a1%e4%ba%86&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;这种情况一般是 &lt;code&gt;ZRAM&lt;/code&gt; 块最大值太高了。&lt;/p&gt;
&lt;p&gt;同样也会造成 &lt;code&gt;ZRAM&lt;/code&gt; 往回写块驱逐匿名页，但是如果回写块写入很慢造成了阻塞，同时内存占用还在增加，那么操作系统可能就触发 &lt;code&gt;OOM&lt;/code&gt; 开始杀进程了。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;ZSWAP
    &lt;div id=&#34;zswap&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#zswap&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;还有另外一种技术，但是我之前都没听说过。&lt;/p&gt;
&lt;p&gt;这项技术配置起来感觉更加 native 一点，因为是直接往内核参数里面写。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ZSWAP&lt;/code&gt; 其实不会创建一个块，但是需要 &lt;code&gt;swap&lt;/code&gt; 的存在，当系统打算往 &lt;code&gt;swap&lt;/code&gt; 里面写入数据的时候，&lt;code&gt;ZSWAP&lt;/code&gt; 会拦截写入，然后进行压缩到内存中的一部分区域。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ZSWAP&lt;/code&gt; 同样会在内存压力高的时候驱逐匿名页到 &lt;code&gt;swap&lt;/code&gt; 中，这一点跟 &lt;code&gt;ZRAM&lt;/code&gt; 不一样，因为如果长期 &lt;code&gt;ZRAM&lt;/code&gt; 占满，那么系统就会转而使用磁盘 &lt;code&gt;SWAP&lt;/code&gt; 交换，此时变慢会变得很明显（尤其是磁盘速度较慢的时候）。&lt;/p&gt;
&lt;p&gt;从 &lt;code&gt;Linux 6.8&lt;/code&gt; 开始，支持禁用回写块，仅仅用作内存压缩。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;所以你会发现，&lt;code&gt;ZRAM&lt;/code&gt; 加上了回写块，那么就是普通的 &lt;code&gt;ZSWAP&lt;/code&gt;；如果 &lt;code&gt;ZSWAP&lt;/code&gt; 禁用了回写块，那么就相当于一个普通的 &lt;code&gt;ZRAM&lt;/code&gt;，从使用的角度，确实是这样的。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;如何选择
    &lt;div id=&#34;如何选择&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%a6%82%e4%bd%95%e9%80%89%e6%8b%a9&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;既然这两者都可以在使用时相互替代，那么究竟如何选择呢？&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;桌面环境
    &lt;div id=&#34;桌面环境&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%a1%8c%e9%9d%a2%e7%8e%af%e5%a2%83&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;如果内存足够，更推荐使用 &lt;code&gt;ZSWAP&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如要使用休眠，可以考虑禁用回写块。这样 &lt;code&gt;swap&lt;/code&gt; 就专注于配置休眠，但这样负载高了就更容易出现 &lt;code&gt;OOM&lt;/code&gt;，这点需要权衡，一般也不会跑大型任务的时候考虑休眠吧？&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;其他环境
    &lt;div id=&#34;其他环境&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%b6%e4%bb%96%e7%8e%af%e5%a2%83&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;小内存的设备，比如安卓，更加倾向于 &lt;code&gt;ZRAM&lt;/code&gt;。原因是 &lt;code&gt;ZSWAP&lt;/code&gt; 要求真实的 &lt;code&gt;SWAP&lt;/code&gt; 设备，但是闪存一般来说没那么耐写。&lt;/p&gt;
&lt;p&gt;服务器可以使用 &lt;code&gt;ZRAM&lt;/code&gt; 加上一个小 &lt;code&gt;SWAP&lt;/code&gt;，这样可以很好的避免了内存使用的尖锋，也享受了内存压缩的红利。&lt;/p&gt;
&lt;p&gt;不推荐同时使用 &lt;code&gt;ZSWAP&lt;/code&gt; 和 &lt;code&gt;ZRAM&lt;/code&gt;，这样会造成冲突。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;两者有什么优势呢？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ZSWAP&lt;/code&gt;：管理起来更直观，对于桌面体验来说更加友好。因为是钩子，所以不会出现一个 &lt;code&gt;swap&lt;/code&gt; 块。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ZRAM&lt;/code&gt;：更适合小内存闪存不可多写的设备。不仅仅是内存压缩，实际上块设备可以格式化来存东西。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;观察
    &lt;div id=&#34;观察&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%a7%82%e5%af%9f&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
    class=&#34;my-0 rounded-md&#34;
    loading=&#34;lazy&#34;
    decoding=&#34;async&#34;
    fetchpriority=&#34;auto&#34;
    alt=&#34;zswap&#34;
    width=&#34;1137&#34;
    height=&#34;58&#34;
    src=&#34;https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/zswap_hu_bfe93907a86b0fb5.webp&#34;
    srcset=&#34;https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/zswap_hu_bfe93907a86b0fb5.webp 800w, https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/zswap.webp 1280w&#34;
    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;
    data-zoom-src=&#34;https://blog.texsd.eu.org/posts/linux-swap-zram-zswap/zswap.webp&#34;&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;这是一个 &lt;code&gt;ZSWAP&lt;/code&gt; 的 &lt;code&gt;htop&lt;/code&gt; 图，&lt;code&gt;compressed&lt;/code&gt; 和 &lt;code&gt;frontswap&lt;/code&gt; 就是 &lt;code&gt;ZSWAP&lt;/code&gt; 工作的事实。&lt;/p&gt;
&lt;p&gt;通过简单的计算可以得到压缩率是 26.3%，这也是配置 &lt;code&gt;zstd&lt;/code&gt; 的典型压缩率范围。&lt;/p&gt;
&lt;p&gt;前置压缩虽然其实占用的是内存中的空间，但是这里算在 &lt;code&gt;swap&lt;/code&gt; 里面了， &lt;code&gt;used&lt;/code&gt; 里面的 &lt;code&gt;457M&lt;/code&gt; 不包括前置交换，由于使用 &lt;code&gt;systemd&lt;/code&gt; 禁用了 &lt;code&gt;ZSWAP&lt;/code&gt; 使用系统交换空间，所以这里面的内容其实是内核使用的交换空间。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;如果是一个 &lt;code&gt;ZRAM&lt;/code&gt; 的设备，那么 &lt;code&gt;htop&lt;/code&gt; 甚至可以单独调出一条来显示它，从观察角度来说，&lt;code&gt;ZRAM&lt;/code&gt; 相对方便一些。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;参考
    &lt;div id=&#34;参考&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%8f%82%e8%80%83&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;(电源管理/挂起与休眠 - Arch Linux 中文维基)[https://wiki.archlinuxcn.org/wiki/%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86/%E6%8C%82%E8%B5%B7%E4%B8%8E%E4%BC%91%E7%9C%A0#Disable_zswap_writeback_to_use_the_swap_space_only_for_hibernation]&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>防火墙：iptables、nftables 与 firewalld</title>
      <link>https://blog.texsd.eu.org/posts/firewall-1-iptables-nftables/</link>
      <pubDate>Fri, 25 Apr 2025 21:46:16 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/firewall-1-iptables-nftables/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;其实防火墙这玩意，我三年前就接触过。那时候在用 iptables 来配置路由器的&lt;code&gt;ipv6&lt;/code&gt;转发，照着教程抄完了也不知所云。&lt;/p&gt;
&lt;p&gt;如今过去了那么久，知识储备多了那么一点点，正好有需求，就重新了解了一下。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;iptables
    &lt;div id=&#34;iptables&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#iptables&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;iptables，这玩意算是个古董了，大概在 21 世纪初就有了。不过毕竟是老东西，现在大部分旧设备都是用的它，很多软件在修改防火墙规则的时候也只改它。&lt;/p&gt;
&lt;p&gt;提起&lt;code&gt;iptables&lt;/code&gt;，我们也许会想到五链四表，不过一般来说，知道&lt;code&gt;nat&lt;/code&gt;和&lt;code&gt;filter&lt;/code&gt;表就已经足够完成 80% 的工作了（&lt;code&gt;ipv4&lt;/code&gt;），我在&lt;a
  href=&#34;https://wiki.archlinuxcn.org/wiki/Iptables&#34;
    target=&#34;_blank&#34;
  &gt;archwiki 的 iptables&lt;/a&gt;章节翻到这张图，也许能够有助于理解：&lt;/p&gt;

&lt;div class=&#34;no-limit-code&#34;&gt; 
     
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                               XXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                             XXX     Network    XXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                               XXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                       +
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                       |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                       v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; +-------------+              +------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; |table: filter| &amp;lt;---+        | table: nat       |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; |chain: INPUT |     |        | chain: PREROUTING|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; +-----+-------+     |        +--------+---------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       |             |                 |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       v             |                 v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; [local process]     |           ****************          +--------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       |             +---------+ Routing decision +------&amp;gt; |table: filter |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       v                         ****************          |chain: FORWARD|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;****************                                           +------+-------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Routing decision                                                  |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;****************                                                  |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       |                                                          |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;       v                        ****************                  |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-------------+       +------&amp;gt;  Routing decision  &amp;lt;---------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;|table: nat   |       |         ****************
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;|chain: OUTPUT|       |               +
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+-----+-------+       |               |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      |               |               v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      v               |      +-------------------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+--------------+      |      | table: nat        |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;|table: filter | +----+      | chain: POSTROUTING|
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;|chain: OUTPUT |             +--------+----------+
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+--------------+                      |
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                                      v
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                               XXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                             XXX    Network     XXX
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                               XXXXXXXXXXXXXXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这里的 Network，指的就是不同的网卡接口。&lt;/p&gt;
&lt;p&gt;接着我来说说自己的理解：&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;啥表啥链？
    &lt;div id=&#34;啥表啥链&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%95%a5%e8%a1%a8%e5%95%a5%e9%93%be&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;filter&lt;/strong&gt;表 最简单，也是默认的表。它只有&lt;code&gt;OUTPUT&lt;/code&gt;，&lt;code&gt;INPUT&lt;/code&gt;，&lt;code&gt;FORWARD&lt;/code&gt;链。这几个顾名思义，分别是来源本机，目标本机，经过本机的数据包。
一般来说，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OUTPUT&lt;/strong&gt; 的默认规则是&lt;code&gt;ACCEPT&lt;/code&gt;，也就是允许所有来源本机的数据包发出。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INPUT&lt;/strong&gt; 的默认规则是&lt;code&gt;DROP&lt;/code&gt;，也就是不允许外来的数据包访问本机。我们一般监听的端口需要配置例外的规则，否则就无法被访问。&lt;/li&gt;
&lt;li&gt;*&lt;em&gt;FORWARD&lt;/em&gt; *也是&lt;code&gt;DROP&lt;/code&gt;。默认不允许不同网络接口之间的数据包转发。想要转发不仅仅需要手动放行，还得开启内核的 IP 转发。
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 临时启用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -w net.ipv4.ip_forward&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 永久启用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;net.ipv4.ip_forward=1&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sysctl -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;举个例子：
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    1    52 ACCEPT     all  --  wg0    *       0.0.0.0/0            0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;nat&lt;/strong&gt;表 这个表有四条链，不过我一般只用其中的两条：&lt;code&gt;PREROUTING&lt;/code&gt;和&lt;code&gt;POSTROUTING&lt;/code&gt;，分别处理端口映射以及 ip 伪装。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PREROUTING&lt;/strong&gt; 这一个链其实我接触得不多，因为基本都是在 ui 上面设置的。但是摸过 SAST 的 RouterOS 之后，那个 ui 配置起来就像是手搓&lt;code&gt;iptables&lt;/code&gt;一样，我就马上理解了。
一个例子就像这样：
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Chain PREROUTING (policy ACCEPT 2885K packets, 212M bytes)
 pkts bytes target     prot opt in     out     source               destination
16   952 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22345 to:192.168.123.2:22
## 这里因为涉及到自定义链，我就直接合并了。
&lt;/code&gt;&lt;/pre&gt;你会注意到，&lt;code&gt;policy&lt;/code&gt;为什么是&lt;code&gt;ACCEPT&lt;/code&gt;？我觉得是因为如果不给你规则，路由也不会帮你转发，所以大家都说&lt;code&gt;ipv4&lt;/code&gt;的&lt;code&gt;nat&lt;/code&gt;安全，原来是这个意思。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;POSTROUTING&lt;/strong&gt; 你是否想过，&lt;code&gt;nat&lt;/code&gt;后的主机，是如何用路由器的 ip 进行通信的？
这条链改写了对应目标的源 ip 地址和端口，然后再发出去。规则 SNAT 需要指定 ip，但是在家庭环境中，ip 通常是变化的，这时候神器&lt;code&gt;MASQUERADE&lt;/code&gt;出现了，它可以动态的获取出口网卡的 ip 地址，把 ip 改写再发出去。至于出口怎么决定，那就是路由表的事情了。
例子：
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Chain POSTROUTING (policy ACCEPT 804K packets, 60M bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  all  --  *      ppp0    0.0.0.0/0            0.0.0.0/0
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class=&#34;relative group&#34;&gt;命令
    &lt;div id=&#34;命令&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%91%bd%e4%bb%a4&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;iptables&lt;/code&gt;的命令非常的精简，看多了倒还不错，不过现在的风格倒变成自然语言了，像&lt;code&gt;ip&lt;/code&gt;和&lt;code&gt;nft&lt;/code&gt;之流。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -t nat -nvL &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;CHAIN-NAME&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;#看 nat 表的规则，链名是可选的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -nvL --line-numbers &lt;span class=&#34;c1&#34;&gt;#看 filter 表的规则，filter 默认可以省略；--line-numbers 用于显示编号。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一些我常用的就一起放在这了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ip6tables -A INPUT -p udp --dport &lt;span class=&#34;m&#34;&gt;26741&lt;/span&gt; -j ACCEPT &lt;span class=&#34;c1&#34;&gt;# ip6tables 是用于控制 ipv6 的防火墙，我目前只接触了 filter 表，NPT 还不会...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -A INPUT -i wg0 -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -A FORWARD -i wg0 -j ACCEPT
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;iptables -t nat -A POSTROUTING -o ppp0 -s 10.0.8.0/24 -j MASQUERADE --mode fullcone
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-A&lt;/code&gt;是&lt;code&gt;Append&lt;/code&gt;，&lt;code&gt;-I&lt;/code&gt;是&lt;code&gt;Insert&lt;/code&gt;，&lt;code&gt;-D&lt;/code&gt;是&lt;code&gt;Delete&lt;/code&gt;，据此可以精确的删除规则。&lt;/p&gt;
&lt;p&gt;用行号也可以：&lt;code&gt;iptables -D INPUT 2&lt;/code&gt;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;补充
    &lt;div id=&#34;补充&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%a1%a5%e5%85%85&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;还有子链和其他表等其他内容，等到后面有时间再写吧。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;nftables + firewalld
    &lt;div id=&#34;nftables--firewalld&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#nftables--firewalld&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nftables&lt;/code&gt;是一个新的&lt;code&gt;netfilter&lt;/code&gt;工具，&lt;code&gt;firewalld&lt;/code&gt;是 RedHat 开发的一个防火墙前端。&lt;code&gt;firewalld&lt;/code&gt;的默认后端是&lt;code&gt;nft&lt;/code&gt;，这两者一般来说会配合起来使用。&lt;/p&gt;
&lt;p&gt;直接操作底层的&lt;code&gt;nft&lt;/code&gt;命令对我来说还是有点困难，这里就简单讲讲他们的结合使用吧。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么选择 firewalld 而不是选择 ufw 呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;firewalld&lt;/code&gt;对于动态网络（比如笔记本在不同的热点之间切换）有很好的适配，具体体现在与&lt;code&gt;NetworkManager&lt;/code&gt;之间的配合，使得不同的热点能够应用在不同的区域中，后面会讲讲配置过程。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;永久和非永久配置
    &lt;div id=&#34;永久和非永久配置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%b0%b8%e4%b9%85%e5%92%8c%e9%9d%9e%e6%b0%b8%e4%b9%85%e9%85%8d%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;firewalld&lt;/code&gt;在设置防火墙的时候，默认是临时配置立即生效。如果想要配置永久规则，加上&lt;code&gt;--permanent&lt;/code&gt;参数即可，记得使用&lt;code&gt;firewall-cmd&lt;/code&gt;重新加载规则生效。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;启动
    &lt;div id=&#34;启动&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%90%af%e5%8a%a8&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;一行命令就好：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl &lt;span class=&#34;nb&#34;&gt;enable&lt;/span&gt; --now nftables firewalld
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样，系统就为我们配置了一个默认的防火墙，默认所有的网卡会在&lt;code&gt;public&lt;/code&gt;区域，现在只有 22 入站才被允许。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;区域
    &lt;div id=&#34;区域&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%8c%ba%e5%9f%9f&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;你应该发现，新的防护墙工具多了一个新概念叫作区域，不同的网卡可以分配到不同的区域。&lt;/p&gt;
&lt;p&gt;先来看看有什么区域？&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewalld --list-all-zones
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;部分输出：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;...

home 
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client mdns samba-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

...

public (default, active)
  target: default
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

trusted 
  target: ACCEPT
  ingress-priority: 0
  egress-priority: 0
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  forward: yes
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

...
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;如果设置了&lt;code&gt;tun&lt;/code&gt;模式，你会发现它无法联网了。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;将网卡分配到区域
    &lt;div id=&#34;将网卡分配到区域&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%b0%86%e7%bd%91%e5%8d%a1%e5%88%86%e9%85%8d%e5%88%b0%e5%8c%ba%e5%9f%9f&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;

&lt;h4 class=&#34;relative group&#34;&gt;分配 tun
    &lt;div id=&#34;分配-tun&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%86%e9%85%8d-tun&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;我们使用&lt;code&gt;firewalld&lt;/code&gt;来配置规则。&lt;/p&gt;
&lt;p&gt;通过上面的输出可以知道，&lt;code&gt;trusted&lt;/code&gt;区域是允许所有流量的，我们把&lt;code&gt;Mihomo&lt;/code&gt;加到&lt;code&gt;trusted&lt;/code&gt;区域：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firewall-cmd --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;trusted --add-interface&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Mihomo --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;firewall-cmd --get-zone-of-interface&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Mihomo &lt;span class=&#34;c1&#34;&gt;## 返回 trusted&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这里有个小坑，我加入之后发现还是不行，一看日志发现数据包全被丢弃了。&lt;del&gt;折腾半天发现重启解决了，我：？？？&lt;/del&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;真正的隐藏 boss 在后面！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a
  href=&#34;#rpfilter&#34;&gt;反向路径过滤&lt;/a&gt;&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;分配 wlan0
    &lt;div id=&#34;分配-wlan0&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%88%86%e9%85%8d-wlan0&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;如果是便携的设备，我们会连接到不同的热点，有公用的也有家里的，家里可以开放多一点权限，而公用的则不需要。&lt;/p&gt;
&lt;p&gt;这一部分由 NetworkManager 配置：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nmcli connection modify &lt;span class=&#34;s2&#34;&gt;&amp;#34;SAST&amp;#34;&lt;/span&gt; connection.zone &lt;span class=&#34;s2&#34;&gt;&amp;#34;home&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 验证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo nmcli connection show SAST &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep connection.zone
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 返回&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;connection.zone:                        home
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这样只有连接到指定的热点名称的时候，才会切换 wlan0 到 home 区域，其他都是 public 区域。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;开放特定服务和端口
    &lt;div id=&#34;开放特定服务和端口&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%bc%80%e6%94%be%e7%89%b9%e5%ae%9a%e6%9c%8d%e5%8a%a1%e5%92%8c%e7%ab%af%e5%8f%a3&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;firewalld 事先定义了一些服务需要的端口，可以在&lt;code&gt;/usr/lib/firewalld/services/&lt;/code&gt;找到，这些配置文件以&lt;code&gt;xml&lt;/code&gt;格式存储。&lt;/p&gt;
&lt;p&gt;添加服务和端口的时候，别忘了指定当前区域。如果不指定，那么默认是在 public 区域添加规则的。&lt;/p&gt;
&lt;p&gt;如果你需要的服务恰好在里面，就可以很方便的添加：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;home --add-service&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;kdeconnect --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果这个端口是你自己定义的，可以这样子：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --add-port&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;8000/tcp --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;home --permanent
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后查看：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --zone&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;home --list-all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;## 输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;home &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;active&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  target: default
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ingress-priority: &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  egress-priority: &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  icmp-block-inversion: no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  interfaces: wlan0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  sources: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  services: dhcpv6-client kdeconnect mdns samba-client ssh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ports: 8000/tcp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  protocols: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  forward: yes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  masquerade: no
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  forward-ports: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  source-ports: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  icmp-blocks: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  rich rules:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;反向路径过滤
    &lt;div id=&#34;rpfilter&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#rpfilter&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;反向路径过滤，简称 rpfilter。这一个功能在 ipv4 时代，是由内核实现的。在&lt;a
  href=&#34;https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt&#34;
    target=&#34;_blank&#34;
  &gt;内核文档&lt;/a&gt;中是这么写的：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/proc/sys/net/ipv4/* Variables:

rp_filter - INTEGER
	0 - No source validation.
	1 - Strict mode as defined in RFC3704 Strict Reverse Path
	    Each incoming packet is tested against the FIB and if the interface
	    is not the best reverse path the packet check will fail.
	    By default failed packets are discarded.
	2 - Loose mode as defined in RFC3704 Loose Reverse Path
	    Each incoming packet&amp;#39;s source address is also tested against the FIB
	    and if the source address is not reachable via any interface
	    the packet check will fail.

	Current recommended practice in RFC3704 is to enable strict mode
	to prevent IP spoofing from DDos attacks. If using asymmetric routing
	or other complicated routing, then loose mode is recommended.

	The max value from conf/{all,interface}/rp_filter is used
	when doing source validation on the {interface}.

	Default value is 0. Note that some distributions enable it
	in startup scripts.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;顺带一提，&lt;code&gt;ip_forward&lt;/code&gt;也是在这个地方配置的。&lt;/p&gt;
&lt;p&gt;这里告诉我们，&lt;code&gt;0&lt;/code&gt;禁用反向路径过滤，&lt;code&gt;1&lt;/code&gt;开启严格的反向路径过滤（反向路径必须是最佳路由），&lt;code&gt;2&lt;/code&gt;开启宽松的反向路径过滤（只要反向路径路由可达即可）。&lt;/p&gt;
&lt;p&gt;默认是不开启反向过滤的，但是似乎防火墙会给每个网卡加上一个&lt;code&gt;2&lt;/code&gt;？由于目前手上没有无防火墙的机器，暂时无法验证&amp;hellip;&lt;/p&gt;
&lt;p&gt;但是如果你装的是&lt;code&gt;firewalld&lt;/code&gt;，默认的反向过滤是全部严格的。这时得到&lt;code&gt;/etc/firewalld/firewalld.conf&lt;/code&gt;改成这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;IPv6_rpfilter&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;loose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;才能禁用反向路径过滤。由于&lt;code&gt;firewalld&lt;/code&gt;在 nft 中配置的表是只读的，只能由它改写，所以去删掉它的规则或者尝试绕过都是没用的。&lt;del&gt;别骂了别骂了&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Mihomo&lt;/code&gt;会导致出现很多的&lt;code&gt;drop&lt;/code&gt;数据包，其中一部分就是&lt;code&gt;rpfilter&lt;/code&gt;引起的，日志类似这样：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;5月 18 23:18:08 texsd-spin kernel: rpfilter_DROP: IN=Mihomo OUT= MAC= SRC=2a01:04f9:3081:4e4b:0000:0000:0000:0002 DST=fdfe:dcba:9876:0000:0000:0000:0000:0001 LEN=80 TC=0 HOPLIMIT=64 FLOWLBL=1037094 PROTO=TCP SPT=443 DPT=22000 WINDOW=64260 RES=0x00 ACK SYN URGP=0 
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;导致所有的&lt;code&gt;ipv6&lt;/code&gt;能&lt;code&gt;ping&lt;/code&gt;通但是无法访问，改成宽松后解决。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;管理
    &lt;div id=&#34;管理&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ae%a1%e7%90%86&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;

&lt;h4 class=&#34;relative group&#34;&gt;禁用日志
    &lt;div id=&#34;禁用日志&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%a6%81%e7%94%a8%e6%97%a5%e5%bf%97&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;这是一个标准选项，所以不需要加&lt;code&gt;--permanent&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我比较建议把日志调成&lt;code&gt;unicast&lt;/code&gt;。否则如果你局域网中广播的设备很多的话，&lt;code&gt;journalctl&lt;/code&gt;会被淹没。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo firewall-cmd --set-log-denied&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;unicast
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4 class=&#34;relative group&#34;&gt;其他
    &lt;div id=&#34;其他&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%b6%e4%bb%96&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;我觉得&lt;code&gt;firewalld&lt;/code&gt;的 man page 写得很清晰，去看它是一个很好的选择。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;man &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; firewall-cmd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 class=&#34;relative group&#34;&gt;总结
    &lt;div id=&#34;总结&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%80%bb%e7%bb%93&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;目前来说个人主机拥抱 firewalld + nftables 更加合适，因为它们提供了更灵活的规则，也拥有更高效的性能。但是服务器上不建议安装 firewalld，因为很多软件是直接通过添加 nftables 规则的，还有很大一部分老软件会添加 iptables 规则。当然 nftables 也做了兼容，&lt;code&gt;iptables-nft&lt;/code&gt;这个包会把 iptables 类的指令自动翻译成 nftables 规则进行加载。此外，&lt;code&gt;iptables-translate&lt;/code&gt;可以把 iptables 指令翻译成 nftables，便于学习和迁移。&lt;/p&gt;
&lt;p&gt;nftables 是未来的防火墙！&lt;del&gt;但是目前直接使用的真的太少了&lt;/del&gt;&lt;/p&gt;
</description>
      
    </item>
    
    <item>
      <title>字形、字体以及我的配置</title>
      <link>https://blog.texsd.eu.org/posts/fonts-settings/</link>
      <pubDate>Fri, 18 Apr 2025 23:38:19 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/fonts-settings/</guid>
      <description>&lt;p&gt;终于受不了终端里那丑得要死的宋体了，开干！XML？拿来把你！&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;衬线，无衬线，等宽
    &lt;div id=&#34;衬线无衬线等宽&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%a1%ac%e7%ba%bf%e6%97%a0%e8%a1%ac%e7%ba%bf%e7%ad%89%e5%ae%bd&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;这大概是三种最常见的字形了。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;衬线（Serif)
    &lt;div id=&#34;衬线serif&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%a1%ac%e7%ba%bfserif&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;简单来说，就是字体有小学练字的时候的老师要求你有的那种笔锋。&lt;/p&gt;
&lt;p&gt;对于英文版来说，很常见的是&lt;code&gt;Times New Roman&lt;/code&gt; ，需要注意的是这是一个版权字体。&lt;/p&gt;
&lt;p&gt;而对于中文版，衬线字体一般跟宋体都是同一个意思了。不过名字还是会有区分：宋体，仿宋（这个公文用的很多）,楷体，这些字体的版权都是归属于中易中标，得小心。还有一部分宋体是方正的，名字就是方正 xx。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;无衬线（Sans-Serif）
    &lt;div id=&#34;无衬线sans-serif&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%97%a0%e8%a1%ac%e7%ba%bfsans-serif&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;人们发现，衬线字体虽然打印出来显示效果不错，但是在屏幕上，每个字是由像素点组成的，在早期分辨率差的屏幕上，衬线字体的各种装饰部分显示效果也很差。于是就出现了无衬线的字体，简化了装饰部分，使得在屏幕上更易读。&lt;/p&gt;
&lt;p&gt;中文，微软雅黑，算是一个历史包袱非常重的字体了，在 windows 上几乎是独占，效果也比其他字体好，后面还出现了一个等线，在雅黑的基础上简化了。微软名字命名的，优化好点也正常吧（？但是这是微软的小动作！&lt;/p&gt;
&lt;p&gt;英文，Arial，这个字体名字不怎么出名，但是你在显示器上看到的，基本都是它。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;等宽（monospace）
    &lt;div id=&#34;等宽monospace&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%ad%89%e5%ae%bdmonospace&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;这一种字体是专为代码显示设计的，因为缩进的时候能够更好的对齐，在终端中，也能让 Tab 更好的对齐；而且易于分辨&lt;code&gt;I l&lt;/code&gt;以及&lt;code&gt;O 0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;我感觉中文和英文的这些名字，常人应该很少能听到吧？只怪 Windows 和生态的软件把用户驯化得太好了，如果不是用 Arch，我可能也不会去了解这些内容。&lt;/p&gt;
&lt;p&gt;你问我现在用的什么字体呢？&lt;code&gt;FiraMono Nerd Font&lt;/code&gt;以及&lt;code&gt;Noto Sans Mono CJK SC&lt;/code&gt;，这两种字体都是开源的，接下来讲一下他们。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;开源字体
    &lt;div id=&#34;开源字体&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%bc%80%e6%ba%90%e5%ad%97%e4%bd%93&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;对于英文字体来说，有一套字体叫做&lt;code&gt;liberation&lt;/code&gt;，全面实现了对 Windows 上面的常见字体的兼容，这套字体是红帽开发的。&lt;/p&gt;
&lt;p&gt;而对于中文，则是思源/Noto&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么要 Adobe 和 Google 要开发思源字体/Noto CJK 呢？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Google 在 Android 4.4 之前使用的字体问题很多，不支持的字符有 fallback，导致显示效果不一致。而 Adobe 的软件使用字体会造成版权争议，同时有自己的字体部门。两家公司一拍即合，由 Google 出资、提供建议，Adobe 设计字体，最终出现了这套字体。这套字体可以说是开源的大胜利了，后面还有以此衍生的更纱黑体。&lt;/p&gt;
&lt;p&gt;还有别的开源字体，霞鹜文楷，得意黑什么的，就不一一介绍了。&lt;/p&gt;
&lt;p&gt;值得一提的是，这不是第一套中文的开源字体。在 AUR 上你还能看到文泉驿这款字体，至今有二十年了。虽然它的名字很诗意，但是在 Noto 之后，已经鲜有人用了，也没人维护了。&lt;/p&gt;
&lt;p&gt;思源黑体极大的提高了 Linux 图形界面上面的字体显示体验，不过我早期使用的时候没注意，从 AUR 下载了 Windows 的兼容字体，使得终端一直在随意 fallback 一些奇怪的字体（捂脸），最近才决定了解一下，从而有了这篇东西。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;系统字体调优
    &lt;div id=&#34;系统字体调优&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%b3%bb%e7%bb%9f%e5%ad%97%e4%bd%93%e8%b0%83%e4%bc%98&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;

&lt;h3 class=&#34;relative group&#34;&gt;Arch
    &lt;div id=&#34;arch&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#arch&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;管理字体，现代的 Linux 系统基本都是 fontconfig 了。我们主要是用&lt;code&gt;fc-cache&lt;/code&gt;,&lt;code&gt;fc-match&lt;/code&gt;两个命令。&lt;/p&gt;
&lt;p&gt;先看看你的三种字体会匹配什么？&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fc-match serif &lt;span class=&#34;c1&#34;&gt;# 添加-a 参数可以显示依次匹配的字体&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fc-match sans-serif
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fc-match monospace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我的是这样的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;texsd@texsd-spin ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;$ fc-match sans-serif
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NotoSansCJK-Regular.ttc: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Noto Sans CJK SC&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Regular&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;texsd@texsd-spin ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;$ fc-match serif
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NotoSerifCJK-Regular.ttc: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Noto Serif CJK SC&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Regular&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;texsd@texsd-spin ~&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;$ fc-match monospace
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;FiraMonoNerdFontMono-Regular.otf: &lt;span class=&#34;s2&#34;&gt;&amp;#34;FiraMono Nerd Font Mono&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Regular&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果群魔乱舞的话，还是先去装一个&lt;code&gt;noto-cjk&lt;/code&gt;包吧。&lt;/p&gt;
&lt;p&gt;安装字体包在&lt;code&gt;/usr/share/fonts&lt;/code&gt;目录，安装时会自动执行&lt;code&gt;fc-cache -fv&lt;/code&gt;来刷新字体缓存，你也可以手动来刷新它们。&lt;/p&gt;
&lt;p&gt;我还额外安装了&lt;code&gt;otf-firamono-nerd&lt;/code&gt;来实现 shell 的 emoji 图标，记住不！要！安！装！nerd-fonts 包集！那总共有&lt;code&gt;7GiB+&lt;/code&gt;！&lt;/p&gt;
&lt;p&gt;我是强烈推荐去修改默认字体配置文件的，虽然 xml 的可读性确实不怎么样，但是根据别人的改嘛，查找替换也不算太难。这里就贴一下我的方案吧：
&lt;code&gt;~/.config/fontconfig/conf.d/99-notocjk.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 在每个字体最后都配置了emoji，使得使用rime的时候候选框显示正确的emoji --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;`&lt;span class=&#34;cp&#34;&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&amp;lt;!DOCTYPE fontconfig SYSTEM &amp;#39;urn:fontconfig:fonts.dtd&amp;#39;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;fontconfig&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 配置黑体--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;target=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;compare=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;contains&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;lang&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zh&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;qual=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;sans-serif&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;edit&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;binding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;strong&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Sans CJK SC&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Color Emoji&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 配置宋体--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;target=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;compare=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;contains&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;lang&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;zh&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;qual=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;serif&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;edit&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;binding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;strong&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Serif CJK SC&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Color Emoji&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;target=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;pattern&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;test&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;qual=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;any&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;monospace&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/test&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;edit&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;binding=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;strong&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;prepend&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;family&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;c&#34;&gt;&amp;lt;!-- 这里等宽配置了两个字体，原因是FiraMono没有中文的等宽字体，下面写上Noto的等宽字体就可以自动fallback了--&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;FiraMono Nerd Font Mono&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Sans Mono CJK SC&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;string&amp;gt;&lt;/span&gt;Noto Color Emoji&lt;span class=&#34;nt&#34;&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;target=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;font&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;edit&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hinting&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;assign&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;bool&amp;gt;&lt;/span&gt;true&lt;span class=&#34;nt&#34;&gt;&amp;lt;/bool&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;match&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;target=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;font&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;edit&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;hintstyle&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;mode=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;assign&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;nt&#34;&gt;&amp;lt;const&amp;gt;&lt;/span&gt;hintfull&lt;span class=&#34;nt&#34;&gt;&amp;lt;/const&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;/edit&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;/match&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; &lt;span class=&#34;nt&#34;&gt;&amp;lt;dir&amp;gt;&lt;/span&gt;~/.local/share/fonts&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dir&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/fontconfig&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;总共三段内容，分别对应衬线，无衬线，等宽，按照自己的喜好修改即可。不知道字体名字可以用&lt;code&gt;fc-match -a&lt;/code&gt;查看引号内的字体名称，或者看桌面设置里面的字体选项。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;Win
    &lt;div id=&#34;win&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#win&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;Windows 中文版默认是使用微软雅黑的，修改需要改注册表。所以一般来说我们都会在软件里面单独修改，像 Firefox，Windows Terminal，VSCode 都支持。而其他的应用我选择用微软雅黑，因为 Windows 运行的旧应用很多都是硬编码微软雅黑的，调整他们会导致一些奇怪的问题，下面说说。&lt;/p&gt;
&lt;p&gt;这是个版权字体（属于方正）正因为如此应该不少人吃了官司吧（？&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;点阵字体和矢量字体
    &lt;div id=&#34;点阵字体和矢量字体&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%82%b9%e9%98%b5%e5%ad%97%e4%bd%93%e5%92%8c%e7%9f%a2%e9%87%8f%e5%ad%97%e4%bd%93&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;点阵字体是以前低分辨率的时代使用的，现在已经基本淘汰了。但是你可能偶尔还能看到有人发那些锯齿感字体非常严重的图片，那大概就是用 xp 截图出来的。&lt;/p&gt;
&lt;p&gt;现代系统基本都是矢量字体，这些字体是通过贝塞尔曲线画出来的。Windows 为了兼容旧的程序和低分屏，要求字体都要支持 Hinting。而自带的微软雅黑对此有优化，别的字体就不太行。但是微软雅黑尽力了，没法避免 100% 下的字体发虚。所以还是换 4K 屏吧，200% 的比例放大下，字体渲染还是可以的。&lt;/p&gt;
&lt;p&gt;想了解这篇细节，可以看看&lt;a
  href=&#34;https://www.bilibili.com/opus/856322865719410692&#34;
    target=&#34;_blank&#34;
  &gt;Windows 的字体渲染的一些鸟事&lt;/a&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;参考
    &lt;div id=&#34;参考&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%8f%82%e8%80%83&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a
  href=&#34;https://github.com/oodzchen/dotfiles/blob/main/dot_config/fontconfig/fonts.conf&#34;
    target=&#34;_blank&#34;
  &gt;https://github.com/oodzchen/dotfiles/blob/main/dot_config/fontconfig/fonts.conf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      
    </item>
    
    <item>
      <title>我的 ArchLinux 折腾记录</title>
      <link>https://blog.texsd.eu.org/posts/customizing-my-own-archlinux/</link>
      <pubDate>Mon, 09 Dec 2024 15:42:53 +0800</pubDate>
      
      <guid>https://blog.texsd.eu.org/posts/customizing-my-own-archlinux/</guid>
      <description>
&lt;h2 class=&#34;relative group&#34;&gt;前言
    &lt;div id=&#34;前言&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%89%8d%e8%a8%80&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;暑假的时候在我的掠夺者·擎 neo 上面第一次纯手动安装了 Arch，过程很有意思，但是后面烂到家的 NV 驱动让我受不了。&lt;/p&gt;
&lt;p&gt;我在 win 下喜欢开独显直连模式，但是在 arch 下就有很大问题：每次睡眠，内建显示器的亮度都会自动开到最大。&lt;/p&gt;
&lt;p&gt;&lt;del&gt;我试过很多办法，都很难实现记忆之前的亮度。只有在 BIOS 里面开启混合模式才会出现 intel_backlight，这真是太折磨了。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;&lt;del&gt;最后，我的评价是，别在日用的电脑上面用 n 卡和 linux！&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;其实是有办法的，给睡眠加个钩子保存亮度，然后唤醒的时候读取文件并还原亮度。也是勉强能用的。（果然水平提高了就有新办法&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;物色新机
    &lt;div id=&#34;物色新机&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%89%a9%e8%89%b2%e6%96%b0%e6%9c%ba&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;作为一个穷学生，已经花了大几千实现臭打游戏的目标，无论怎么说都不太好再拿出几千买电脑。开始我把目标锁定在 3k 左右，然后降到 2k，最后 1k。&lt;/p&gt;
&lt;p&gt;正好这段时间有国补，就在看鸡哥的 14x，但是各种说品控差让我望而却步。后面又看火影的 6800 二手，感觉周边又差一点。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;怎么，你又开始后悔没有买 6800 以上的 u 了？！其实只是舍不得出那么多钱罢了！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;几番挑选，我决定捡洋垃圾，目光投向了 chromebook。这样，就有了这篇文章的主角：Acer Spin713 二代 (cp713-2w)。在海鲜市场的 js 以 1050 的价格拿下。&lt;/p&gt;
&lt;p&gt;配置是 i5-10210u，马甲什么的我不是很在意。我在意的是这块屏幕好像是夏老师之前提到的&lt;a
  href=&#34;https://zhuanlan.zhihu.com/p/570757067&#34;
    target=&#34;_blank&#34;
  &gt;网格纱窗屏&lt;/a&gt;，凑近看确实观感不太好，其实，我根本不需要触摸屏的，但是换不得呀！&lt;/p&gt;
&lt;p&gt;默念 1050&amp;hellip;默念 1050&amp;hellip;默念 1050&amp;hellip;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;安装过程
    &lt;div id=&#34;安装过程&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%ae%89%e8%a3%85%e8%bf%87%e7%a8%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;用 Arch 怎么能不手动安装呢？&lt;/p&gt;
&lt;p&gt;但是 ArchInstall 真的太香了！连好网络分好区，设置好一些东西，直接重启就看到 sddm 了。&lt;/p&gt;
&lt;p&gt;然而，像装黑苹果一样，大家都是装完了然后开系统信息截屏。装完 Arch 你也可以&lt;code&gt;fastfetch&lt;/code&gt;，然而，这一切仅仅是个开始&amp;hellip;&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;输入法设置
    &lt;div id=&#34;输入法设置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e8%be%93%e5%85%a5%e6%b3%95%e8%ae%be%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;首先得有输入法吧？&lt;/p&gt;
&lt;p&gt;我用的是 fcitx5 + rime + 雾凇拼音的组合，最终效果还不错。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先安装 fcitx5、rime 和雾凇拼音：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;paru -S fcitx5 fcitx5-rime rime-ice-git &lt;span class=&#34;c1&#34;&gt;## 可以用archlinuxcn源的&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;根据&lt;a
  href=&#34;https://github.com/iDvel/rime-ice&#34;
    target=&#34;_blank&#34;
  &gt;雾凇拼音的配置方案&lt;/a&gt;，把这段配置加入 rime 输入法：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# $HOME/.local/share/fcitx5/rime/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;patch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 仅使用「雾凇拼音」的默认配置，配置此行即可&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;__include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;rime_ice_suggestion:/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 以下根据自己所需自行定义，仅做参考。&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 针对对应处方的定制条目，请使用 &amp;lt;recipe&amp;gt;.custom.yaml 中配置，例如 rime_ice.custom.yaml&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;__patch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;key_binder/bindings/+&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 开启逗号句号翻页&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- {&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when: paging, accept: comma, send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Page_Up }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- {&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;when: has_menu, accept: period, send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Page_Down }&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;
&lt;p&gt;进入设置里面，输入与输出 - 键盘 - 虚拟键盘把 fcitx5 打开，这时候才会在语言和时间下面出现输入法。如果因为 kde 的 bug 出不来的话，重启或者重装吧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输入法 - 添加输入法，选择中州韵。这里建议点击中州韵的配置，然后把“切换输入法的行为”修改成“提交原始字符串”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基本完成了。不过如果没有配置字体，会导致 emoji 显示空白。可以参考我的&lt;a
  href=&#34;https://blog.texsd.eu.org/p/%E5%AD%97%E5%BD%A2%E5%AD%97%E4%BD%93%E4%BB%A5%E5%8F%8A%E6%88%91%E7%9A%84%E9%85%8D%E7%BD%AE/#%E7%B3%BB%E7%BB%9F%E5%AD%97%E4%BD%93%E8%B0%83%E4%BC%98&#34;
    target=&#34;_blank&#34;
  &gt;字体方案&lt;/a&gt;来解决问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果想要让 fcitx5 符合 breeze 的外观，可以安装这个包：&lt;code&gt;fcitx5-breeze&lt;/code&gt;，然后在输入法 - 配置附加组件 - 经典用户界面 - 主题里面修改成 KDE Plasma 来实现。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 class=&#34;relative group&#34;&gt;Locale 设置
    &lt;div id=&#34;locale-设置&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#locale-%e8%ae%be%e7%bd%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;默认在安装的时候大家都会选择&lt;code&gt;en_US.UTF-8&lt;/code&gt;，这是为了避免 tty 不支持中文显示。不过在安装完毕后，一般都会重新编译&lt;code&gt;zh_CN.UTF-8&lt;/code&gt;的语言支持。&lt;/p&gt;
&lt;p&gt;这里我选用了一些特殊的设置方式，而不是直接设置&lt;code&gt;LC_ALL&lt;/code&gt;。原因是让各种工具提示的信息和显示的日志为英文，同时让单位之类的显示符合国内的习惯。&lt;/p&gt;
&lt;p&gt;配置像这样：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# /etc/locale.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LANG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;zh_CN.UTF-8           &lt;span class=&#34;c1&#34;&gt;# 默认界面语言为中文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LC_MESSAGES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;en_US.UTF-8    &lt;span class=&#34;c1&#34;&gt;# 强制日志和错误信息用英文&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LC_PAPER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;en_SG.UTF-8       &lt;span class=&#34;c1&#34;&gt;# 纸张尺寸 A4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LC_MEASUREMENT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;en_SG.UTF-8 &lt;span class=&#34;c1&#34;&gt;# 公制单位（米、升、℃）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LC_TIME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;en_SG.UTF-8        &lt;span class=&#34;c1&#34;&gt;# 24 小时制时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考&lt;a
  href=&#34;https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97#%E5%8C%BA%E5%9F%9F%E5%92%8C%E6%9C%AC%E5%9C%B0%E5%8C%96%E8%AE%BE%E7%BD%AE&#34;
    target=&#34;_blank&#34;
  &gt;archwikicn-安装教程&lt;/a&gt;&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;对 chromebook 的折腾过程
    &lt;div id=&#34;对-chromebook-的折腾过程&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%af%b9-chromebook-%e7%9a%84%e6%8a%98%e8%85%be%e8%bf%87%e7%a8%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;

&lt;h3 class=&#34;relative group&#34;&gt;声音驱动
    &lt;div id=&#34;声音驱动&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%a3%b0%e9%9f%b3%e9%a9%b1%e5%8a%a8&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;众所周知，Chromebook 很多型号的声音驱动一直是个大问题，windows 上面甚至得付费才有驱动，而我装好一进来也是没有声音的。&lt;/p&gt;
&lt;p&gt;很幸运的，在 Chrultrabook 上面提示 Linux 是完全支持的。然后我就找到了这个项目：&lt;/p&gt;
&lt;div class=&#34;github-card-wrapper&#34;&gt;
    &lt;a id=&#34;github-c1d2cc0f99d274d966106b16b267712a&#34; target=&#34;_blank&#34; href=&#34;https://github.com/WeirdTreeThing/chromebook-linux-audio&#34; class=&#34;cursor-pointer&#34;&gt;
      &lt;div
        class=&#34;w-full md:w-auto p-0 m-0 border border-neutral-200 dark:border-neutral-700 border rounded-md shadow-2xl&#34;&gt;&lt;div class=&#34;w-full nozoom&#34;&gt;
            &lt;img
              src=&#34;https://opengraph.githubassets.com/0/WeirdTreeThing/chromebook-linux-audio&#34;
              alt=&#34;GitHub Repository Thumbnail&#34;
              class=&#34;nozoom mt-0 mb-0 w-full h-full object-cover&#34;&gt;
          &lt;/div&gt;&lt;div class=&#34;w-full md:w-auto pt-3 p-5&#34;&gt;
          &lt;div class=&#34;flex items-center&#34;&gt;
            &lt;span class=&#34;text-2xl text-neutral-800 dark:text-neutral me-2&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg  xmlns=&#34;http://www.w3.org/2000/svg&#34;  width=&#34;24&#34;  height=&#34;24&#34;  viewBox=&#34;0 0 24 24&#34;  fill=&#34;none&#34;  stroke=&#34;currentColor&#34;  stroke-width=&#34;2&#34;  stroke-linecap=&#34;round&#34;  stroke-linejoin=&#34;round&#34;  class=&#34;icon icon-tabler icons-tabler-outline icon-tabler-brand-github&#34;&gt;&lt;path stroke=&#34;none&#34; d=&#34;M0 0h24v24H0z&#34; fill=&#34;none&#34;/&gt;&lt;path d=&#34;M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5&#34; /&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div
              id=&#34;github-c1d2cc0f99d274d966106b16b267712a-full_name&#34;
              class=&#34;m-0 font-bold text-xl text-neutral-800 decoration-primary-500 hover:underline hover:underline-offset-2 dark:text-neutral&#34;&gt;
              WeirdTreeThing/chromebook-linux-audio
            &lt;/div&gt;
          &lt;/div&gt;

          &lt;p id=&#34;github-c1d2cc0f99d274d966106b16b267712a-description&#34; class=&#34;m-0 mt-2 text-md text-neutral-800 dark:text-neutral&#34;&gt;
            Script that enables audio support on many Chrome devices running various Linux distros
          &lt;/p&gt;

          &lt;div class=&#34;m-0 mt-2 flex items-center&#34;&gt;
            &lt;span class=&#34;mr-1 inline-block h-3 w-3 rounded-full language-dot&#34; data-language=&#34;Python&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              Python
            &lt;/div&gt;

            &lt;span class=&#34;text-md mr-1 text-neutral-800 dark:text-neutral&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M287.9 0C297.1 0 305.5 5.25 309.5 13.52L378.1 154.8L531.4 177.5C540.4 178.8 547.8 185.1 550.7 193.7C553.5 202.4 551.2 211.9 544.8 218.2L433.6 328.4L459.9 483.9C461.4 492.9 457.7 502.1 450.2 507.4C442.8 512.7 432.1 513.4 424.9 509.1L287.9 435.9L150.1 509.1C142.9 513.4 133.1 512.7 125.6 507.4C118.2 502.1 114.5 492.9 115.1 483.9L142.2 328.4L31.11 218.2C24.65 211.9 22.36 202.4 25.2 193.7C28.03 185.1 35.5 178.8 44.49 177.5L197.7 154.8L266.3 13.52C270.4 5.249 278.7 0 287.9 0L287.9 0zM287.9 78.95L235.4 187.2C231.9 194.3 225.1 199.3 217.3 200.5L98.98 217.9L184.9 303C190.4 308.5 192.9 316.4 191.6 324.1L171.4 443.7L276.6 387.5C283.7 383.7 292.2 383.7 299.2 387.5L404.4 443.7L384.2 324.1C382.9 316.4 385.5 308.5 391 303L476.9 217.9L358.6 200.5C350.7 199.3 343.9 194.3 340.5 187.2L287.9 78.95z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div id=&#34;github-c1d2cc0f99d274d966106b16b267712a-stargazers&#34; class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              486
            &lt;/div&gt;

            &lt;span class=&#34;text-md mr-1 text-neutral-800 dark:text-neutral&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M80 104c13.3 0 24-10.7 24-24s-10.7-24-24-24S56 66.7 56 80s10.7 24 24 24zm80-24c0 32.8-19.7 61-48 73.3V192c0 17.7 14.3 32 32 32H304c17.7 0 32-14.3 32-32V153.3C307.7 141 288 112.8 288 80c0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V192c0 53-43 96-96 96H256v70.7c28.3 12.3 48 40.5 48 73.3c0 44.2-35.8 80-80 80s-80-35.8-80-80c0-32.8 19.7-61 48-73.3V288H144c-53 0-96-43-96-96V153.3C19.7 141 0 112.8 0 80C0 35.8 35.8 0 80 0s80 35.8 80 80zm208 24c13.3 0 24-10.7 24-24s-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24zM248 432c0-13.3-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24s24-10.7 24-24z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div id=&#34;github-c1d2cc0f99d274d966106b16b267712a-forks&#34; class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              79
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      
      
      &lt;script
        async
        type=&#34;text/javascript&#34;
        src=&#34;https://blog.texsd.eu.org/js/fetch-repo.min.dc5533c50cefd50405344b235937142271f26229fe39cbee27fd4960e8bb897a0beebfad77a1091ca91cd0d1fb14e70fc37cc114dd9674fb2c32e0ab512ec8a4.js&#34;
        integrity=&#34;sha512-3FUzxQzv1QQFNEsjWTcUInHyYin&amp;#43;OcvuJ/1JYOi7iXoL7r&amp;#43;td6EJHKkc0NH7FOcPw3zBFN2WdPssMuCrUS7IpA==&#34;
        data-repo-url=&#34;https://api.github.com/repos/WeirdTreeThing/chromebook-linux-audio&#34;
        data-repo-id=&#34;github-c1d2cc0f99d274d966106b16b267712a&#34;&gt;&lt;/script&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;p&gt;直接一键部署，太舒服了！不过似乎不支持 Ubuntu。&lt;/p&gt;
&lt;p&gt;后来，在 alsa 的一次更新后，我的喇叭不出声了，翻了下 issue，&lt;a
  href=&#34;https://github.com/WeirdTreeThing/chromebook-linux-audio/issues/185&#34;
    target=&#34;_blank&#34;
  &gt;这里&lt;/a&gt;提到重新安装加上这个参数就可以了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./setup-audio --branch syntax-7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 class=&#34;relative group&#34;&gt;按键映射
    &lt;div id=&#34;按键映射&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%8c%89%e9%94%ae%e6%98%a0%e5%b0%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;Chromebook 的键盘比较特殊，没有&lt;kbd&gt;Del&lt;/kbd&gt;，没有&lt;kbd&gt;Ins&lt;/kbd&gt;。原来&lt;kbd&gt;Capslock&lt;/kbd&gt;的位置现在变成了&lt;kbd&gt;Meta&lt;/kbd&gt;(&lt;kbd&gt;Win&lt;/kbd&gt;) 键。而左&lt;kbd&gt;Alt&lt;/kbd&gt;和&lt;kbd&gt;Ctrl&lt;/kbd&gt;就变得非常大。&lt;/p&gt;
&lt;p&gt;写声音脚本的这位兄弟顺手写了个按键映射：&lt;/p&gt;
&lt;div class=&#34;github-card-wrapper&#34;&gt;
    &lt;a id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f&#34; target=&#34;_blank&#34; href=&#34;https://github.com/WeirdTreeThing/cros-keyboard-map&#34; class=&#34;cursor-pointer&#34;&gt;
      &lt;div
        class=&#34;w-full md:w-auto p-0 m-0 border border-neutral-200 dark:border-neutral-700 border rounded-md shadow-2xl&#34;&gt;&lt;div class=&#34;w-full nozoom&#34;&gt;
            &lt;img
              src=&#34;https://opengraph.githubassets.com/0/WeirdTreeThing/cros-keyboard-map&#34;
              alt=&#34;GitHub Repository Thumbnail&#34;
              class=&#34;nozoom mt-0 mb-0 w-full h-full object-cover&#34;&gt;
          &lt;/div&gt;&lt;div class=&#34;w-full md:w-auto pt-3 p-5&#34;&gt;
          &lt;div class=&#34;flex items-center&#34;&gt;
            &lt;span class=&#34;text-2xl text-neutral-800 dark:text-neutral me-2&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg  xmlns=&#34;http://www.w3.org/2000/svg&#34;  width=&#34;24&#34;  height=&#34;24&#34;  viewBox=&#34;0 0 24 24&#34;  fill=&#34;none&#34;  stroke=&#34;currentColor&#34;  stroke-width=&#34;2&#34;  stroke-linecap=&#34;round&#34;  stroke-linejoin=&#34;round&#34;  class=&#34;icon icon-tabler icons-tabler-outline icon-tabler-brand-github&#34;&gt;&lt;path stroke=&#34;none&#34; d=&#34;M0 0h24v24H0z&#34; fill=&#34;none&#34;/&gt;&lt;path d=&#34;M9 19c-4.3 1.4 -4.3 -2.5 -6 -3m12 5v-3.5c0 -1 .1 -1.4 -.5 -2c2.8 -.3 5.5 -1.4 5.5 -6a4.6 4.6 0 0 0 -1.3 -3.2a4.2 4.2 0 0 0 -.1 -3.2s-1.1 -.3 -3.5 1.3a12.3 12.3 0 0 0 -6.2 0c-2.4 -1.6 -3.5 -1.3 -3.5 -1.3a4.2 4.2 0 0 0 -.1 3.2a4.6 4.6 0 0 0 -1.3 3.2c0 4.6 2.7 5.7 5.5 6c-.6 .6 -.6 1.2 -.5 2v3.5&#34; /&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div
              id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f-full_name&#34;
              class=&#34;m-0 font-bold text-xl text-neutral-800 decoration-primary-500 hover:underline hover:underline-offset-2 dark:text-neutral&#34;&gt;
              WeirdTreeThing/cros-keyboard-map
            &lt;/div&gt;
          &lt;/div&gt;

          &lt;p id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f-description&#34; class=&#34;m-0 mt-2 text-md text-neutral-800 dark:text-neutral&#34;&gt;
            Utility to generate keyd configurations for use on Chromebooks
          &lt;/p&gt;

          &lt;div class=&#34;m-0 mt-2 flex items-center&#34;&gt;
            &lt;span class=&#34;mr-1 inline-block h-3 w-3 rounded-full language-dot&#34; data-language=&#34;Python&#34;&gt;&lt;/span&gt;
            &lt;div class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              Python
            &lt;/div&gt;

            &lt;span class=&#34;text-md mr-1 text-neutral-800 dark:text-neutral&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M287.9 0C297.1 0 305.5 5.25 309.5 13.52L378.1 154.8L531.4 177.5C540.4 178.8 547.8 185.1 550.7 193.7C553.5 202.4 551.2 211.9 544.8 218.2L433.6 328.4L459.9 483.9C461.4 492.9 457.7 502.1 450.2 507.4C442.8 512.7 432.1 513.4 424.9 509.1L287.9 435.9L150.1 509.1C142.9 513.4 133.1 512.7 125.6 507.4C118.2 502.1 114.5 492.9 115.1 483.9L142.2 328.4L31.11 218.2C24.65 211.9 22.36 202.4 25.2 193.7C28.03 185.1 35.5 178.8 44.49 177.5L197.7 154.8L266.3 13.52C270.4 5.249 278.7 0 287.9 0L287.9 0zM287.9 78.95L235.4 187.2C231.9 194.3 225.1 199.3 217.3 200.5L98.98 217.9L184.9 303C190.4 308.5 192.9 316.4 191.6 324.1L171.4 443.7L276.6 387.5C283.7 383.7 292.2 383.7 299.2 387.5L404.4 443.7L384.2 324.1C382.9 316.4 385.5 308.5 391 303L476.9 217.9L358.6 200.5C350.7 199.3 343.9 194.3 340.5 187.2L287.9 78.95z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f-stargazers&#34; class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              119
            &lt;/div&gt;

            &lt;span class=&#34;text-md mr-1 text-neutral-800 dark:text-neutral&#34;&gt;
              &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M80 104c13.3 0 24-10.7 24-24s-10.7-24-24-24S56 66.7 56 80s10.7 24 24 24zm80-24c0 32.8-19.7 61-48 73.3V192c0 17.7 14.3 32 32 32H304c17.7 0 32-14.3 32-32V153.3C307.7 141 288 112.8 288 80c0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V192c0 53-43 96-96 96H256v70.7c28.3 12.3 48 40.5 48 73.3c0 44.2-35.8 80-80 80s-80-35.8-80-80c0-32.8 19.7-61 48-73.3V288H144c-53 0-96-43-96-96V153.3C19.7 141 0 112.8 0 80C0 35.8 35.8 0 80 0s80 35.8 80 80zm208 24c13.3 0 24-10.7 24-24s-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24zM248 432c0-13.3-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24s24-10.7 24-24z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;
            &lt;/span&gt;
            &lt;div id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f-forks&#34; class=&#34;m-0 mr-5 text-md text-neutral-800 dark:text-neutral&#34;&gt;
              28
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      
      
      &lt;script
        async
        type=&#34;text/javascript&#34;
        src=&#34;https://blog.texsd.eu.org/js/fetch-repo.min.dc5533c50cefd50405344b235937142271f26229fe39cbee27fd4960e8bb897a0beebfad77a1091ca91cd0d1fb14e70fc37cc114dd9674fb2c32e0ab512ec8a4.js&#34;
        integrity=&#34;sha512-3FUzxQzv1QQFNEsjWTcUInHyYin&amp;#43;OcvuJ/1JYOi7iXoL7r&amp;#43;td6EJHKkc0NH7FOcPw3zBFN2WdPssMuCrUS7IpA==&#34;
        data-repo-url=&#34;https://api.github.com/repos/WeirdTreeThing/cros-keyboard-map&#34;
        data-repo-id=&#34;github-4f7ee459704e5f8a6b41a219a1514b5f&#34;&gt;&lt;/script&gt;
    &lt;/a&gt;
  &lt;/div&gt;
&lt;p&gt;这个工具映射了上面的功能按键，让&lt;kbd&gt;Meta&lt;/kbd&gt;+功能键可以实现原来的功能，然后单独按下功能键就是&lt;kbd&gt;F1&lt;/kbd&gt;-&lt;kbd&gt;F10&lt;/kbd&gt;。调节键盘背光，则是按下&lt;kbd&gt;leftAlt&lt;/kbd&gt;+亮度按键。&lt;/p&gt;
&lt;p&gt;我手动对这台笔记本的按键进行定制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;让锁屏按键变成&lt;kbd&gt;Del&lt;/kbd&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;kbd&gt;rightAlt&lt;/kbd&gt;加上锁屏按键变成&lt;kbd&gt;F11&lt;/kbd&gt;，加上&lt;kbd&gt;Backspace&lt;/kbd&gt;变成&lt;kbd&gt;F12&lt;/kbd&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除了一些冗余的配置，避免了之前为了通用一刀切导致的物理音量键变成&lt;kbd&gt;F8&lt;/kbd&gt;/&lt;kbd&gt;F9&lt;/kbd&gt;的 bug&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[ids]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;k:0001:0001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[main]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f13&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;rightalt&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;layer(rightalt)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[meta]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f1&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;back&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f2&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;forward&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f3&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;refresh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f4&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;f11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f5&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;scale&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;brightnessdown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f7&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;brightnessup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f8&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;mute&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f9&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;volumedown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f10&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;volumeup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;backspace&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;f12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[alt]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;kbdillumdown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f7&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;kbdillumup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[rightalt]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;kbdillumdown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f7&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;kbdillumup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;backspace&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;f12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f13&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;f11&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[control+alt]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;f13&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;C-A-delete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;另外值得一提的就是，键盘上面所有的英文全部都是小写的。&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;充电
    &lt;div id=&#34;充电&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%85%e7%94%b5&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;

&lt;h4 class=&#34;relative group&#34;&gt;充电限制
    &lt;div id=&#34;充电限制&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%85%85%e7%94%b5%e9%99%90%e5%88%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;首先需要安装 ectool，这一个工具可以在 aur 的&lt;code&gt;fw-ectool-git&lt;/code&gt;下载，fw 代表的是 framework book，这个笔记本使用的是开源的 ec，正好 chromebook 也是这个，所以可以通用。&lt;/p&gt;
&lt;p&gt;ectool 可以控制系统的充电情况。不过可惜我这一台是 10 代的，不支持 sustainer，也就是说 ec 不能实现在某个区间自动断电。所以只能写一个脚本来控制系统的充电情况。尽管这样还是有一些限制，比如说关机充电可能就会充到满。&lt;/p&gt;
&lt;p&gt;接下来我会对我使用的&lt;a
  href=&#34;https://gist.github.com/minortex/0fe6c1098ec8a4f879fa9315d216a957&#34;
    target=&#34;_blank&#34;
  &gt;一些脚本&lt;/a&gt; 进行解释。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;charge_control.sh&lt;/strong&gt;：这是主要进行控制的脚本，里面有两个功能，一个是&lt;code&gt;--check-battery&lt;/code&gt;，这个参数会检测电池电量，如果超过了 78，就会自动设置成 idle 模式，同时关闭计时器，避免进行无谓的计时；另一个是&lt;code&gt;--connect-charger&lt;/code&gt;，这个用于 udev 的控制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;check-battery.service(timer)&lt;/strong&gt;：尝试一下 systemd-timer，为后续的启动和停用计时器做准备。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;control_systemd_battery_timer.sh&lt;/strong&gt;：这是一个用于设置上述服务的脚本。主要是用于给 udev 触发使用。(在 rules 里面写这么多太不优雅了)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;99-battery.rules&lt;/strong&gt;：这就是 udev 触发的规则了。在插上电源的时候检测一次电池电量，大于 78 就 idle，小于就开始充电。同时开启计时器，每三分钟检测一次电池。如果拔掉电源，那么就停止计时器。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;值得小心的是，需要把 service 设置成 enabled，这样当电量达到 78，同时插着电源并开启 idle 模式的时候重启电脑，才会保持这个电量，因为重启会重置限制充电的状态；同时也把 timer 设置成 enabled，这样在电池没到 78，同时冲着电的时候重启电脑，才能在到达 78 的时候检测到从而开启 idle 模式。&lt;/p&gt;
&lt;p&gt;写了那么多，看起来还是有点臃肿的感觉！不过功能总算是实现了。&lt;/p&gt;

&lt;h4 class=&#34;relative group&#34;&gt;缓解 kde 的电量显示的 bug
    &lt;div id=&#34;缓解-kde-的电量显示的-bug&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e7%bc%93%e8%a7%a3-kde-%e7%9a%84%e7%94%b5%e9%87%8f%e6%98%be%e7%a4%ba%e7%9a%84-bug&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h4&gt;
&lt;p&gt;我到手没几天，就发现 kde 报告的电池状态有 bug。当拔下充电器后，显示已连接充电器，但仍在放电。短暂插入充电器然后拔出，会有概率避免这个问题；睡眠再唤醒也能避免这个问题。&lt;/p&gt;
&lt;p&gt;经过一系列的排查，发现问题出现在&lt;code&gt;upower&lt;/code&gt;上，upower 报告了错误的电池状态。&lt;code&gt;power_supply&lt;/code&gt;总共有三个对象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AC&lt;/li&gt;
&lt;li&gt;CROS_USBPD_CHARGER0&lt;/li&gt;
&lt;li&gt;CROS_USBPD_CHARGER1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然在 sysfs 里面报告的&lt;code&gt;online&lt;/code&gt;状态是正确的，来到&lt;code&gt;upower&lt;/code&gt;就不对了。&lt;code&gt;AC online&lt;/code&gt;的状态和充电器的状态是相反的。重启&lt;code&gt;upower&lt;/code&gt;服务可以让状态正确，但是已经被&lt;code&gt;powerdevil&lt;/code&gt;接收了，所以无济于事。我寻找了很多办法，最终在&lt;code&gt;upower&lt;/code&gt;的 gitlab 上面的&lt;a
  href=&#34;https://gitlab.freedesktop.org/upower/upower/-/issues/232&#34;
    target=&#34;_blank&#34;
  &gt;issue&lt;/a&gt;看到了解决方案：&lt;/p&gt;
&lt;p&gt;覆写&lt;code&gt;upower&lt;/code&gt;的 systemd 服务，把它访问 AC 的 sysfs 禁用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;### Editing /etc/systemd/system/upower.service.d/override.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;### Anything between here and the comment below will become the contents of the drop-in file&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;InaccessiblePaths&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/sys/class/power_supply/AC /sys/devices/pci0000:00/0000:00:1f.0/PNP0C09:00/ACPI0003:00/power_supply/AC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;### Edits below this comment will be discarded&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;虽然方法很暴力，但是它有效啊！&lt;/p&gt;

&lt;h3 class=&#34;relative group&#34;&gt;风扇控制
    &lt;div id=&#34;风扇控制&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e9%a3%8e%e6%89%87%e6%8e%a7%e5%88%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h3&gt;
&lt;p&gt;理论上，其他的 chromebook 可以直接通过 aur 安装&lt;code&gt;fw-fanctrl&lt;/code&gt;来安装一个用 python 写的脚本来控制。&lt;/p&gt;
&lt;p&gt;不过我这台 spin713 比较特殊，使用&lt;code&gt;ectool&lt;/code&gt;来查看温度是这样的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sudo ectool temps all
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;--sensor name -------- temperature -------- ratio &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;fan_off and fan_max&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt; --
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp1                 &lt;span class=&#34;m&#34;&gt;318&lt;/span&gt; K &lt;span class=&#34;o&#34;&gt;(=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;45&lt;/span&gt; C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;          66% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;298&lt;/span&gt; K and &lt;span class=&#34;m&#34;&gt;328&lt;/span&gt; K&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp2                 &lt;span class=&#34;m&#34;&gt;324&lt;/span&gt; K &lt;span class=&#34;o&#34;&gt;(=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;51&lt;/span&gt; C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;          86% &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;298&lt;/span&gt; K and &lt;span class=&#34;m&#34;&gt;328&lt;/span&gt; K&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp3                 &lt;span class=&#34;m&#34;&gt;314&lt;/span&gt; K &lt;span class=&#34;o&#34;&gt;(=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;41&lt;/span&gt; C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;        N/A &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;fan_off&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; K, &lt;span class=&#34;nv&#34;&gt;fan_max&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; K&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而&lt;code&gt;lm-sensors&lt;/code&gt;的输出：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ sensors &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt;sed -n &lt;span class=&#34;s2&#34;&gt;&amp;#34;/coretemp-/,/Temp3/p&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;coretemp-isa-0000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Adapter: ISA adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Package id 0:  +76.0°C  &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;high&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C, &lt;span class=&#34;nv&#34;&gt;crit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Core 0:        +59.0°C  &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;high&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C, &lt;span class=&#34;nv&#34;&gt;crit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Core 1:        +76.0°C  &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;high&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C, &lt;span class=&#34;nv&#34;&gt;crit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Core 2:        +57.0°C  &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;high&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C, &lt;span class=&#34;nv&#34;&gt;crit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Core 3:        +61.0°C  &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;high&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C, &lt;span class=&#34;nv&#34;&gt;crit&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; +100.0°C&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cros_ec-isa-0000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Adapter: ISA adapter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fan1:        &lt;span class=&#34;m&#34;&gt;1641&lt;/span&gt; RPM
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp1:        +42.9°C  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp2:        +43.9°C  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Temp3:        +39.9°C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以发现，ectool 并没有读取到 cpu 的温度，而是其他部分的温度，这个温度会比 cpu 负载高的时候的温度低很多，当 cpu 温度降下来后，又会比 cpu 温度高。而&lt;code&gt;fw-fanctrl&lt;/code&gt;默认是取&lt;code&gt;ectool&lt;/code&gt;里面最高的温度，这就会导致风扇控制不灵敏，&lt;del&gt;目前办法还在想&amp;hellip;&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;已经找到解决办法了：安装旧版的&lt;code&gt;fw-fanctrl&lt;/code&gt;。在 24 年 5 月之后，这个工具读取温度的数据源从&lt;code&gt;lm-sensors&lt;/code&gt;切换到了&lt;code&gt;ectool&lt;/code&gt;，原因是他们认为这样更加准确。但是我的本子 ectool 无法读取到 cpu 的温度，用着旧版就可以了。&lt;/p&gt;

&lt;h2 class=&#34;relative group&#34;&gt;小结..
    &lt;div id=&#34;小结&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;
    
    &lt;span
        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;
        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e5%b0%8f%e7%bb%93&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;
    &lt;/span&gt;
    
&lt;/h2&gt;
&lt;p&gt;Arch 确实不算是一个能让人省心的系统，但是折腾的过程还是回味无穷的，paru 和 aur 配合在一起的包管理也非常好用。另外折腾的东西，等到以后再补充吧。&lt;/p&gt;
</description>
      
    </item>
    
  </channel>
</rss>
