<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>維運 on KnightLi的博客</title>
        <link>https://knightli.com/zh-tw/categories/%E7%B6%AD%E9%81%8B/</link>
        <description>Recent content in 維運 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Sat, 30 May 2026 16:14:19 +0800</lastBuildDate><atom:link href="https://knightli.com/zh-tw/categories/%E7%B6%AD%E9%81%8B/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>用 NAS 自建 Git Server 同步本地 Markdown 筆記</title>
        <link>https://knightli.com/zh-tw/2026/05/30/nas-git-server-local-notes-sync/</link>
        <pubDate>Sat, 30 May 2026 16:14:19 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/30/nas-git-server-local-notes-sync/</guid>
        <description>&lt;p&gt;如果已經有一台本地 NAS，又希望筆記盡量保存在自己手裡，可以把 Markdown 筆記放進 NAS 上的 Git Server，再用 Android 和 Windows 用戶端同步。這個方案不依賴公共雲碟，適合 Obsidian、Markor、VS Code、Typora 這類以本地 Markdown 檔案為核心的筆記工具。&lt;/p&gt;
&lt;p&gt;它的基本思路很簡單：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NAS 上建立一個 Git 裸倉庫，作為筆記的中央倉庫。&lt;/li&gt;
&lt;li&gt;Windows 端 clone 倉庫，用常見編輯器寫筆記。&lt;/li&gt;
&lt;li&gt;Android 端 clone 同一個倉庫，用 Git 用戶端拉取和推送。&lt;/li&gt;
&lt;li&gt;每次換裝置前先 &lt;code&gt;pull&lt;/code&gt;，寫完後再 &lt;code&gt;commit&lt;/code&gt; 和 &lt;code&gt;push&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這種方式不是最傻瓜的同步方案，但可控性很好，歷史版本也清楚。只要養成提交習慣，就能把筆記、設定、圖片附件都放在自己的 NAS 上長期保存。&lt;/p&gt;
&lt;h2 id=&#34;方案適合誰&#34;&gt;方案適合誰
&lt;/h2&gt;&lt;p&gt;這套方案適合下面幾類人：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;家裡或辦公室已經有 NAS。&lt;/li&gt;
&lt;li&gt;筆記主要是 Markdown 檔案。&lt;/li&gt;
&lt;li&gt;希望筆記資料保存在本地網路裡，而不是只放在商業雲碟上。&lt;/li&gt;
&lt;li&gt;需要 Windows 和 Android 多裝置同步。&lt;/li&gt;
&lt;li&gt;能接受 Git 的基本操作，例如 &lt;code&gt;clone&lt;/code&gt;、&lt;code&gt;pull&lt;/code&gt;、&lt;code&gt;commit&lt;/code&gt;、&lt;code&gt;push&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你希望完全自動、完全無感同步，Syncthing、WebDAV 或筆記軟體自帶同步可能更省心。Git 更適合重視版本歷史、可回滾、可遷移和可控性的筆記庫。&lt;/p&gt;
&lt;h2 id=&#34;一在-nas-上安裝-git-server&#34;&gt;一、在 NAS 上安裝 Git Server
&lt;/h2&gt;&lt;p&gt;不同 NAS 系統的入口不一樣，但目標都一樣：讓 NAS 提供一個可以透過 SSH 存取的 Git 倉庫。&lt;/p&gt;
&lt;p&gt;常見做法有三種：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方式&lt;/th&gt;
          &lt;th&gt;適合場景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;NAS 套件中心安裝 Git Server&lt;/td&gt;
          &lt;td&gt;群暉、威聯通等成品 NAS，想少折騰&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Docker 部署 Gitea&lt;/td&gt;
          &lt;td&gt;想要 Web 介面、帳號管理和更完整的 Git 服務&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;直接用 SSH + 裸倉庫&lt;/td&gt;
          &lt;td&gt;只給自己用，追求簡單穩定&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果只是個人筆記同步，SSH + 裸倉庫已經夠用。假設 NAS 上有一個專門的 Git 使用者 &lt;code&gt;git&lt;/code&gt;，倉庫存放目錄為 &lt;code&gt;/volume1/git&lt;/code&gt;，可以在 NAS 終端機裡執行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;mkdir -p /volume1/git/notes.git
&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;cd&lt;/span&gt; /volume1/git/notes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init --bare
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;裸倉庫不直接編輯檔案，只作為同步中心。實際寫筆記的目錄在 Windows 或 Android 本地。&lt;/p&gt;
&lt;p&gt;接著確認 SSH 可以存取 NAS：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ssh git@192.168.1.10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果 NAS 支援 SSH 公鑰登入，建議設定公鑰，避免每次推送都輸入密碼。Windows 和 Android 可以分別產生自己的 SSH key，再把公鑰加入 NAS 的 &lt;code&gt;authorized_keys&lt;/code&gt; 或 Git Server 使用者設定裡。&lt;/p&gt;
&lt;h2 id=&#34;二windows-端設定&#34;&gt;二、Windows 端設定
&lt;/h2&gt;&lt;p&gt;Windows 端建議安裝 Git for Windows，然後選擇一個本地目錄存放筆記，例如 &lt;code&gt;D:\Notes&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;首次 clone：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;@192&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;168&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;volume1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;D:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Notes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;進入目錄後，可以建立基本結構：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;D:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Notes&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;n&#34;&gt;mkdir&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inbox&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;daily&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;projects&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resources&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後用 Obsidian、VS Code、Typora 或其他 Markdown 編輯器打開 &lt;code&gt;D:\Notes&lt;/code&gt;。寫完第一批筆記後提交：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;p&#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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;commit&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-m&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 class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;push&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;origin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果倉庫預設分支是 &lt;code&gt;master&lt;/code&gt;，就把命令裡的 &lt;code&gt;main&lt;/code&gt; 換成 &lt;code&gt;master&lt;/code&gt;。也可以統一改成 &lt;code&gt;main&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;branch&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-M&lt;/span&gt; &lt;span class=&#34;n&#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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;push&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-u&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;origin&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日常使用時，Windows 端可以保持這個節奏：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pull&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-rebase&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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;p&#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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;commit&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-m&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 class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;三android-端設定&#34;&gt;三、Android 端設定
&lt;/h2&gt;&lt;p&gt;Android 端可以使用支援 Git 的用戶端來同步本地 Markdown 目錄。常見選擇包括：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;工具&lt;/th&gt;
          &lt;th&gt;用法&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Termux&lt;/td&gt;
          &lt;td&gt;最靈活，接近 Linux 命令列&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;MGit&lt;/td&gt;
          &lt;td&gt;圖形介面 Git 用戶端，適合不想敲太多命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GitJournal&lt;/td&gt;
          &lt;td&gt;更像筆記應用，適合簡單 Markdown 筆記&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果選擇 Termux，可以先安裝 Git 和 OpenSSH：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;pkg update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pkg install git openssh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;產生 SSH key：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;ssh-keygen -t ed25519 -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;android-notes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;把產生的公鑰加入 NAS 的 Git 使用者授權裡。然後在手機本地選擇一個目錄 clone 倉庫：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;git clone git@192.168.1.10:/volume1/git/notes.git ~/notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果想讓普通 Android 編輯器存取這個目錄，可以把倉庫放到共享儲存目錄，例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cd&lt;/span&gt; /sdcard
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone git@192.168.1.10:/volume1/git/notes.git Notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;之後可以用 Markor、Obsidian Android 或其他 Markdown 編輯器打開 &lt;code&gt;/sdcard/Notes&lt;/code&gt;。手機端修改後，再回到 Termux 執行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cd&lt;/span&gt; /sdcard/Notes
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git pull --rebase
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &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;git push
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Android 上最容易出問題的是權限和路徑。Termux 自己的家目錄更穩定，但部分編輯器不一定能直接存取；&lt;code&gt;/sdcard&lt;/code&gt; 方便編輯器存取，但權限、檔案監聽和效能可能受系統限制。可以先用少量筆記測試，再決定最終目錄。&lt;/p&gt;
&lt;h2 id=&#34;四obsidian-和-joplin-怎麼落地&#34;&gt;四、Obsidian 和 Joplin 怎麼落地
&lt;/h2&gt;&lt;p&gt;NAS Git Server 只解決「檔案放在哪裡、怎麼同步」的問題。真正寫筆記時，還需要選擇筆記應用。這裡可以分成 Obsidian 方案和 Joplin 方案。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方案&lt;/th&gt;
          &lt;th&gt;同步方式&lt;/th&gt;
          &lt;th&gt;適合人群&lt;/th&gt;
          &lt;th&gt;注意點&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Obsidian + Git&lt;/td&gt;
          &lt;td&gt;筆記目錄就是 Git 倉庫，Windows 和 Android 都拉取同一個倉庫&lt;/td&gt;
          &lt;td&gt;想要雙鏈、知識圖譜、外掛生態和純 Markdown 檔案的人&lt;/td&gt;
          &lt;td&gt;Android 上最好先測試 Git 用戶端和 Obsidian 對同一目錄的存取權限&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Joplin + Git&lt;/td&gt;
          &lt;td&gt;不建議直接把 Joplin 資料庫放進 Git；更適合用 Joplin 自帶同步，或定期匯出 Markdown 到 Git&lt;/td&gt;
          &lt;td&gt;想要網頁剪藏、端到端加密、傳統筆記本結構的人&lt;/td&gt;
          &lt;td&gt;Joplin 的本地資料不是普通 Markdown 資料夾，不適合直接當 Git 筆記庫同步&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;obsidian-方案&#34;&gt;Obsidian 方案
&lt;/h3&gt;&lt;p&gt;Obsidian 最適合這套 NAS Git 同步方案。原因是它的 vault 本質上就是一個普通資料夾，裡面是 Markdown 檔案、圖片附件和設定檔。你可以直接把 &lt;code&gt;D:\Notes&lt;/code&gt; 或 &lt;code&gt;/sdcard/Notes&lt;/code&gt; 作為 Obsidian vault。&lt;/p&gt;
&lt;p&gt;Windows 端流程：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;@192&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;168&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;volume1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;notes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;D:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;\&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Notes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後在 Obsidian 裡打開 &lt;code&gt;D:\Notes&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Android 端流程：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;cd&lt;/span&gt; /sdcard
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone git@192.168.1.10:/volume1/git/notes.git Notes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後在 Obsidian Android 裡打開 &lt;code&gt;/sdcard/Notes&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;Obsidian 方案建議：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;單人使用時，可以提交 &lt;code&gt;.obsidian/&lt;/code&gt;，讓主題、外掛和部分設定在多裝置間同步。&lt;/li&gt;
&lt;li&gt;如果 Android 和 Windows 外掛差異很大，可以只提交筆記正文，不提交 &lt;code&gt;.obsidian/workspace.json&lt;/code&gt; 這類裝置狀態檔。&lt;/li&gt;
&lt;li&gt;圖片附件建議統一放到 &lt;code&gt;attachments/&lt;/code&gt;，避免散落在各級目錄裡。&lt;/li&gt;
&lt;li&gt;每次打開 Obsidian 前先 &lt;code&gt;git pull --rebase&lt;/code&gt;，寫完後再 &lt;code&gt;commit&lt;/code&gt; 和 &lt;code&gt;push&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以準備一個 &lt;code&gt;.gitignore&lt;/code&gt;，減少裝置狀態檔造成的衝突：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.obsidian/workspace.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.obsidian/workspace-mobile.json
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.trash/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;joplin-方案&#34;&gt;Joplin 方案
&lt;/h3&gt;&lt;p&gt;Joplin 的思路和 Obsidian 不一樣。它雖然使用 Markdown 語法，但本地資料主要由應用資料庫管理，不是一個可以直接拿來 Git 同步的普通 Markdown 資料夾。因此，不建議把 Joplin 的設定目錄或資料庫目錄直接放進 Git 倉庫。&lt;/p&gt;
&lt;p&gt;如果你更喜歡 Joplin，有兩種更穩的做法：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;做法&lt;/th&gt;
          &lt;th&gt;說明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;使用 Joplin 自帶同步&lt;/td&gt;
          &lt;td&gt;透過 WebDAV、Nextcloud、Joplin Cloud、Dropbox、OneDrive 等方式同步，NAS 可以提供 WebDAV 或 Nextcloud&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;定期匯出 Markdown 到 Git&lt;/td&gt;
          &lt;td&gt;Joplin 作為主力筆記應用，定期把筆記匯出為 Markdown，再提交到 NAS Git 倉庫做備份&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;如果 NAS 上已經有 WebDAV 或 Nextcloud，Joplin 直接連 NAS 同步會比 Git 更順滑。它還可以啟用端到端加密，適合不想處理 Git 衝突、但又希望資料盡量在自己控制範圍內的人。&lt;/p&gt;
&lt;p&gt;Joplin + NAS 的推薦路線是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;NAS 上開啟 WebDAV 或部署 Nextcloud。&lt;/li&gt;
&lt;li&gt;Joplin Windows 端設定同一個同步目標。&lt;/li&gt;
&lt;li&gt;Joplin Android 端設定同一個同步目標。&lt;/li&gt;
&lt;li&gt;需要版本備份時，再定期匯出 Markdown 到 Git 倉庫。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;簡單判斷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;想要「本地 Markdown 資料夾 + 雙鏈 + Git 歷史」，選 Obsidian。&lt;/li&gt;
&lt;li&gt;想要「傳統筆記應用 + 網頁剪藏 + 加密同步」，選 Joplin。&lt;/li&gt;
&lt;li&gt;想把 NAS Git Server 作為主同步中心，Obsidian 更合適。&lt;/li&gt;
&lt;li&gt;想把 NAS 當成私有雲同步後端，Joplin 更合適。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;五推薦的筆記目錄結構&#34;&gt;五、推薦的筆記目錄結構
&lt;/h2&gt;&lt;p&gt;筆記庫不要一開始就設計得太複雜。可以先用下面這種結構：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;Notes/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  inbox/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  daily/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  projects/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  resources/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  attachments/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  README.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含義很直觀：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;inbox/&lt;/code&gt; 放臨時記錄。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;daily/&lt;/code&gt; 放日記、日誌和每日流水。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;projects/&lt;/code&gt; 放專案筆記。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;resources/&lt;/code&gt; 放長期資料。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attachments/&lt;/code&gt; 放圖片、PDF 和其他附件。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果使用 Obsidian，可以把這個目錄直接作為 vault。&lt;code&gt;.obsidian/&lt;/code&gt; 設定是否提交，要看個人習慣。單人多裝置使用時可以提交；如果不同裝置外掛差異很大，也可以只提交部分設定。&lt;/p&gt;
&lt;h2 id=&#34;六避免同步衝突&#34;&gt;六、避免同步衝突
&lt;/h2&gt;&lt;p&gt;Git 同步筆記的關鍵不是命令多複雜，而是習慣要穩定。&lt;/p&gt;
&lt;p&gt;建議遵守幾條規則：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;換裝置寫筆記前，先執行 &lt;code&gt;git pull --rebase&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;寫完一輪後，及時 &lt;code&gt;commit&lt;/code&gt; 和 &lt;code&gt;push&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;不要在兩台裝置上同時長時間編輯同一個檔案。&lt;/li&gt;
&lt;li&gt;圖片和大附件不要無限塞進 Git 倉庫。&lt;/li&gt;
&lt;li&gt;定期在 NAS 外再備份一份倉庫。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果出現衝突，Git 會標出衝突檔案。Markdown 文字衝突通常不難處理，但手機上處理體驗比較差，所以盡量在 Windows 上解決衝突。&lt;/p&gt;
&lt;h2 id=&#34;七是否需要自動同步&#34;&gt;七、是否需要自動同步
&lt;/h2&gt;&lt;p&gt;可以給 Windows 寫一個簡單腳本，把 &lt;code&gt;pull&lt;/code&gt;、&lt;code&gt;add&lt;/code&gt;、&lt;code&gt;commit&lt;/code&gt;、&lt;code&gt;push&lt;/code&gt; 串起來。但筆記同步不建議完全無腦自動提交，因為誤刪、空提交、衝突和大附件都可能被自動推上去。&lt;/p&gt;
&lt;p&gt;更穩妥的方式是半自動：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打開筆記前先手動拉取。&lt;/li&gt;
&lt;li&gt;寫完後執行一個腳本提交。&lt;/li&gt;
&lt;li&gt;每次提交訊息簡單說明這次改了什麼。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如 Windows 可以準備一個 &lt;code&gt;sync-notes.ps1&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pull&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;-rebase&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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;p&#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;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;commit&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-m&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 class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;push&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果沒有變更，&lt;code&gt;git commit&lt;/code&gt; 會提示 nothing to commit，這不是問題。&lt;/p&gt;
&lt;h2 id=&#34;八這個方案的優缺點&#34;&gt;八、這個方案的優缺點
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;方面&lt;/th&gt;
          &lt;th&gt;說明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;優點&lt;/td&gt;
          &lt;td&gt;資料在本地 NAS，版本歷史清晰，可回滾，可遷移，適合 Markdown&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;缺點&lt;/td&gt;
          &lt;td&gt;需要理解 Git，衝突需要手動處理，移動端體驗不如雲同步順滑&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;適合&lt;/td&gt;
          &lt;td&gt;技術使用者、本地優先筆記、個人知識庫、專案文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;不適合&lt;/td&gt;
          &lt;td&gt;完全不想接觸命令列、需要多人即時協作、頻繁同步大附件&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;我的建議&#34;&gt;我的建議
&lt;/h2&gt;&lt;p&gt;如果只是想在 Android 和 Windows 之間同步普通 Markdown 筆記，可以先從最小方案開始：NAS 上一個裸倉庫，Windows 上 Git for Windows，Android 上 Termux 或 MGit。不要一開始就引入複雜權限、自動化腳本和過度分類。&lt;/p&gt;
&lt;p&gt;等這套流程跑順以後，再考慮 Gitea、自動備份、SSH key 分裝置管理、附件分倉庫、定時任務等擴展。筆記系統最重要的是長期穩定可用，而不是第一天就把所有功能堆滿。&lt;/p&gt;
&lt;p&gt;一句話：NAS Git Server 適合把 Markdown 筆記做成本地優先、可追溯、可遷移的個人資料庫；它不如雲同步省心，但控制權更清楚。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>2026 年 Linux 伺服器發行版怎麼選：Debian、Rocky Linux、AlmaLinux 和 Ubuntu Server 對比</title>
        <link>https://knightli.com/zh-tw/2026/05/07/linux-server-distro-comparison-2026/</link>
        <pubDate>Thu, 07 May 2026 21:03:12 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/07/linux-server-distro-comparison-2026/</guid>
        <description>&lt;p&gt;2026 年選 Linux 伺服器發行版，核心問題不是「哪個最好」，而是「哪個最適合你的維運模型」。&lt;/p&gt;
&lt;p&gt;如果你需要最穩的社群發行版，Debian 仍然是首選之一。如果你需要 RHEL 相容生態，但不想直接購買 RHEL，Rocky Linux 和 AlmaLinux 是 CentOS 之後最自然的替代者。如果你重視雲端映像、文件、快速部署和新軟體包，Ubuntu Server 仍然最省事。&lt;/p&gt;
&lt;p&gt;下面按伺服器場景做一次實用對比。&lt;/p&gt;
&lt;h2 id=&#34;快速結論&#34;&gt;快速結論
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;發行版&lt;/th&gt;
          &lt;th&gt;最適合&lt;/th&gt;
          &lt;th&gt;主要優點&lt;/th&gt;
          &lt;th&gt;主要注意點&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Debian&lt;/td&gt;
          &lt;td&gt;長期穩定、自託管、基礎服務&lt;/td&gt;
          &lt;td&gt;穩定、簡潔、社群強、自由軟體傳統深&lt;/td&gt;
          &lt;td&gt;預設軟體版本偏保守，企業商業支援不如 RHEL/Ubuntu 明確&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Rocky Linux&lt;/td&gt;
          &lt;td&gt;RHEL 相容生產環境&lt;/td&gt;
          &lt;td&gt;接近 RHEL 使用習慣，適合企業遷移 CentOS&lt;/td&gt;
          &lt;td&gt;軟體包更新節奏保守，桌面/新技術體驗不是重點&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AlmaLinux&lt;/td&gt;
          &lt;td&gt;RHEL 相容生產環境、雲和企業替代&lt;/td&gt;
          &lt;td&gt;RHEL 相容、社群活躍、生命週期清楚&lt;/td&gt;
          &lt;td&gt;與 RHEL 仍有少量差異，要關注 release notes&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Ubuntu Server&lt;/td&gt;
          &lt;td&gt;雲伺服器、容器、開發部署&lt;/td&gt;
          &lt;td&gt;雲平台支援好，資料多，部署快，LTS 週期長&lt;/td&gt;
          &lt;td&gt;Snap、內核/HWE、PPA 等機制需要團隊統一規範&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;一句話：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最穩妥通用&lt;/strong&gt;：Debian。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;企業 RHEL 生態替代&lt;/strong&gt;：Rocky Linux / AlmaLinux。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;雲端和開發效率優先&lt;/strong&gt;：Ubuntu Server。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;debian堅如磐石的穩定性&#34;&gt;Debian：堅如磐石的穩定性
&lt;/h2&gt;&lt;p&gt;截至 2026 年 5 月，Debian 當前 stable 是 Debian 13 &lt;code&gt;trixie&lt;/code&gt;。Debian 12 &lt;code&gt;bookworm&lt;/code&gt; 已經進入 oldstable 階段，仍有安全和 LTS 支援，但新部署伺服器更建議優先看 Debian 13。&lt;/p&gt;
&lt;p&gt;Debian 的特點一直很清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;預設包選擇保守；&lt;/li&gt;
&lt;li&gt;系統結構乾淨；&lt;/li&gt;
&lt;li&gt;不強綁定商業廠商；&lt;/li&gt;
&lt;li&gt;社群治理成熟；&lt;/li&gt;
&lt;li&gt;適合長期運行的基礎服務。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你的伺服器主要跑這些東西，Debian 很舒服：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nginx / Apache；&lt;/li&gt;
&lt;li&gt;PostgreSQL / MariaDB / Redis；&lt;/li&gt;
&lt;li&gt;Docker / Podman；&lt;/li&gt;
&lt;li&gt;WireGuard / Tailscale；&lt;/li&gt;
&lt;li&gt;檔案服務、備份服務、監控服務；&lt;/li&gt;
&lt;li&gt;小型自託管應用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debian 的優勢不是「最新」，而是「少折騰」。很多伺服器裝好之後，幾年內只需要正常安全更新和小版本維護。&lt;/p&gt;
&lt;p&gt;適合 Debian 的場景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你希望系統盡量樸素，不想被發行版廠商策略影響太多。&lt;/li&gt;
&lt;li&gt;你熟悉 &lt;code&gt;apt&lt;/code&gt;、systemd、Debian 檔案布局。&lt;/li&gt;
&lt;li&gt;你可以接受軟體版本不是最新。&lt;/li&gt;
&lt;li&gt;你更重視穩定、安全更新和可預期升級。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不太適合 Debian 的場景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你需要某些廠商只認證 RHEL 或 Ubuntu。&lt;/li&gt;
&lt;li&gt;你需要企業級商業支援 SLA。&lt;/li&gt;
&lt;li&gt;你依賴最新內核、最新 GPU 棧或新硬體支援。&lt;/li&gt;
&lt;li&gt;團隊內部已經全面圍繞 RHEL 系生態寫了維運規範。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我的判斷：個人伺服器、自託管、輕量 SaaS、小團隊基礎服務，Debian 仍然非常值得優先考慮。&lt;/p&gt;
&lt;h2 id=&#34;rocky-linuxcentos-之後的穩健替代&#34;&gt;Rocky Linux：CentOS 之後的穩健替代
&lt;/h2&gt;&lt;p&gt;Rocky Linux 的定位很明確：面向需要 RHEL 相容生態的使用者，延續過去 CentOS Linux 在企業生產環境中的角色。&lt;/p&gt;
&lt;p&gt;2026 年，Rocky Linux 9 和 Rocky Linux 10 都在支援週期內。Rocky Linux 9 適合更保守的生產環境，Rocky Linux 10 則適合新專案、新硬體和更長未來週期。&lt;/p&gt;
&lt;p&gt;Rocky Linux 適合這些場景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;原來跑 CentOS 7 / CentOS 8 的企業環境；&lt;/li&gt;
&lt;li&gt;需要 RHEL 系目錄結構、包名和維運習慣；&lt;/li&gt;
&lt;li&gt;依賴 &lt;code&gt;dnf&lt;/code&gt;、RPM、SELinux、firewalld；&lt;/li&gt;
&lt;li&gt;軟體供應商明確支援 RHEL-compatible 發行版；&lt;/li&gt;
&lt;li&gt;內部自動化腳本圍繞 Enterprise Linux 編寫。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;它的優點是遷移阻力小。很多團隊過去多年圍繞 CentOS 積累了 Ansible playbook、監控規則、審計腳本和安全基線。換到 Rocky Linux，整體心智負擔比遷到 Debian 或 Ubuntu 小很多。&lt;/p&gt;
&lt;p&gt;Rocky Linux 的注意點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;包版本偏保守，這是 Enterprise Linux 的設計目標，不是缺點。&lt;/li&gt;
&lt;li&gt;如果你需要非常新的使用者態元件，可能要依賴 EPEL、第三方倉庫或容器。&lt;/li&gt;
&lt;li&gt;RHEL 相容不等於所有商業軟體廠商都自動提供正式支援，要看廠商認證列表。&lt;/li&gt;
&lt;li&gt;Rocky Linux 10 對硬體基線和第三方生態會有新的要求，新上生產前要驗證。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我的判斷：如果你的伺服器環境本來就是 CentOS / RHEL 系，Rocky Linux 是非常自然的替代方案，尤其適合穩定生產環境和企業內部服務。&lt;/p&gt;
&lt;h2 id=&#34;almalinux更主動的-rhel-相容路線&#34;&gt;AlmaLinux：更主動的 RHEL 相容路線
&lt;/h2&gt;&lt;p&gt;AlmaLinux 也是 CentOS 之後的重要替代者，定位同樣是企業級、長期支援、RHEL 相容。&lt;/p&gt;
&lt;p&gt;它和 Rocky Linux 的共同點很多：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;都面向 RHEL 相容生態；&lt;/li&gt;
&lt;li&gt;都適合伺服器生產環境；&lt;/li&gt;
&lt;li&gt;都有 8、9、10 代長期支援路線；&lt;/li&gt;
&lt;li&gt;都適合從 CentOS 遷移；&lt;/li&gt;
&lt;li&gt;都能使用大量 Enterprise Linux 生態工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不同點在於，AlmaLinux 在 RHEL 相容之外，會更主動記錄和處理上游差異。例如 AlmaLinux 10 提供了面向舊硬體的 &lt;code&gt;x86-64-v2&lt;/code&gt; 架構選擇，並在 release notes 中明確說明與 RHEL 的差異。&lt;/p&gt;
&lt;p&gt;這對一部分使用者很有用：他們既想留在 RHEL 生態，又希望社群發行版能在硬體支援、包構建、EPEL 相容等問題上更靈活。&lt;/p&gt;
&lt;p&gt;適合 AlmaLinux 的場景：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你需要 RHEL 相容，但不想完全被 RHEL 發布策略限制。&lt;/li&gt;
&lt;li&gt;你重視社群治理和透明 release notes。&lt;/li&gt;
&lt;li&gt;你在雲平台、容器映像、企業工作負載中需要穩定基礎系統。&lt;/li&gt;
&lt;li&gt;你想從 CentOS 或舊 Enterprise Linux 平滑遷移。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;需要注意的是，AlmaLinux 不是「閉眼等於 RHEL」。對嚴格合規、廠商認證、資料庫認證、硬體認證場景，仍然要檢查軟體供應商是否明確支援 AlmaLinux。&lt;/p&gt;
&lt;p&gt;我的判斷：Rocky Linux 和 AlmaLinux 都能作為 CentOS 替代。更保守、更貼近傳統 CentOS 敘事，可以看 Rocky；更重視社群透明和相容路線靈活性，可以看 AlmaLinux。&lt;/p&gt;
&lt;h2 id=&#34;ubuntu-server雲端支援和部署效率最好&#34;&gt;Ubuntu Server：雲端支援和部署效率最好
&lt;/h2&gt;&lt;p&gt;Ubuntu Server 的優勢很現實：雲平台、文件、社群教程、映像、自動化工具和開發者生態都很強。&lt;/p&gt;
&lt;p&gt;2026 年伺服器新部署，主力仍然是 Ubuntu 24.04 LTS。Ubuntu LTS 通常有 5 年標準支援，並可透過 ESM 延長支援週期。對雲伺服器、容器宿主機、開發環境、CI/CD 節點來說，Ubuntu Server 往往是最快上手的選擇。&lt;/p&gt;
&lt;p&gt;Ubuntu Server 適合這些場景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AWS、Azure、Google Cloud、Oracle Cloud、阿里雲、騰訊雲等雲伺服器；&lt;/li&gt;
&lt;li&gt;Docker、Kubernetes、GitLab Runner、CI/CD；&lt;/li&gt;
&lt;li&gt;AI / GPU / CUDA 開發環境；&lt;/li&gt;
&lt;li&gt;需要大量教程和社群方案的團隊；&lt;/li&gt;
&lt;li&gt;開發與生產都希望盡量一致的環境。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 的優點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;雲映像品質高；&lt;/li&gt;
&lt;li&gt;官方和第三方文件多；&lt;/li&gt;
&lt;li&gt;新硬體支援通常更積極；&lt;/li&gt;
&lt;li&gt;LTS 節奏清楚；&lt;/li&gt;
&lt;li&gt;開發者工具鏈更新更方便；&lt;/li&gt;
&lt;li&gt;很多商業軟體會優先給 Ubuntu 安裝說明。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 的注意點：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Snap 在伺服器上不是所有團隊都喜歡，是否使用要提前規範。&lt;/li&gt;
&lt;li&gt;PPA 很方便，但生產環境濫用會增加維護風險。&lt;/li&gt;
&lt;li&gt;HWE 內核、雲內核、標準內核之間要選清楚。&lt;/li&gt;
&lt;li&gt;對極簡穩定派來說，Ubuntu 預設系統元件會比 Debian「更熱鬧」。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我的判斷：如果你主要跑雲伺服器、容器、開發部署、AI 工具鏈，Ubuntu Server 通常是效率最高的選擇。它不是最「純」的發行版，但它能讓很多事情少查資料、少踩坑。&lt;/p&gt;
&lt;h2 id=&#34;四者怎麼選&#34;&gt;四者怎麼選
&lt;/h2&gt;&lt;h3 id=&#34;個人-vps--自託管&#34;&gt;個人 VPS / 自託管
&lt;/h3&gt;&lt;p&gt;優先推薦 Debian 或 Ubuntu Server。&lt;/p&gt;
&lt;p&gt;如果你想穩定、省心、少折騰，選 Debian。如果你經常照著教程部署新專案，或者需要較新的軟體棧，選 Ubuntu Server。&lt;/p&gt;
&lt;h3 id=&#34;企業生產環境&#34;&gt;企業生產環境
&lt;/h3&gt;&lt;p&gt;優先推薦 Rocky Linux、AlmaLinux 或 RHEL。&lt;/p&gt;
&lt;p&gt;如果公司過去使用 CentOS，遷移到 Rocky / Alma 成本最低。如果涉及商業資料庫、硬體認證、安全合規和廠商支援，要優先確認認證清單。&lt;/p&gt;
&lt;h3 id=&#34;雲原生和容器宿主機&#34;&gt;雲原生和容器宿主機
&lt;/h3&gt;&lt;p&gt;Ubuntu Server、Debian、Rocky / Alma 都能勝任。&lt;/p&gt;
&lt;p&gt;如果團隊偏開發效率，選 Ubuntu Server。如果追求極簡穩定，選 Debian。如果企業標準圍繞 RHEL 系，選 Rocky / Alma。&lt;/p&gt;
&lt;h3 id=&#34;ai--gpu-伺服器&#34;&gt;AI / GPU 伺服器
&lt;/h3&gt;&lt;p&gt;優先看 Ubuntu Server，其次看 Rocky / Alma。&lt;/p&gt;
&lt;p&gt;原因很簡單：NVIDIA、CUDA、PyTorch、TensorFlow、驅動安裝教程和社群經驗裡，Ubuntu 通常最多。企業 GPU 叢集如果已經圍繞 RHEL 生態建設，則可以選 Rocky / Alma，但要提前驗證驅動、CUDA、容器運行時和監控工具。&lt;/p&gt;
&lt;h3 id=&#34;傳統業務系統&#34;&gt;傳統業務系統
&lt;/h3&gt;&lt;p&gt;優先看 Rocky Linux / AlmaLinux。&lt;/p&gt;
&lt;p&gt;傳統 Java、資料庫、中介軟體、商業軟體、審計和維運規範往往更偏 RHEL 系。此時選擇 Rocky / Alma，會比 Debian / Ubuntu 更容易貼合舊體系。&lt;/p&gt;
&lt;h2 id=&#34;選擇時看這幾個指標&#34;&gt;選擇時看這幾個指標
&lt;/h2&gt;&lt;p&gt;不要只看發行版名字。伺服器選型時，建議按下面幾個問題判斷：&lt;/p&gt;
&lt;ol&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;li&gt;&lt;strong&gt;安全更新&lt;/strong&gt;：安全公告、補丁節奏、CVE 處理是否清楚？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬體支援&lt;/strong&gt;：CPU、網卡、RAID、GPU、儲存控制器是否驗證過？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;團隊經驗&lt;/strong&gt;：團隊熟悉 &lt;code&gt;apt&lt;/code&gt; 還是 &lt;code&gt;dnf&lt;/code&gt;？熟悉 Debian 系還是 RHEL 系？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;廠商認證&lt;/strong&gt;：業務軟體是否明確支援該發行版？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自動化資產&lt;/strong&gt;：現有 Ansible、Terraform、映像構建腳本是否可重複使用？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;真正決定成本的，往往不是安裝 ISO，而是後續五年的升級、審計、排障和交接。&lt;/p&gt;
&lt;h2 id=&#34;我的推薦組合&#34;&gt;我的推薦組合
&lt;/h2&gt;&lt;p&gt;如果讓我給 2026 年伺服器選型一個預設建議：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;場景&lt;/th&gt;
          &lt;th&gt;推薦&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;個人 VPS、自託管&lt;/td&gt;
          &lt;td&gt;Debian 13&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;雲伺服器、快速部署&lt;/td&gt;
          &lt;td&gt;Ubuntu Server 24.04 LTS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;CentOS 遷移&lt;/td&gt;
          &lt;td&gt;Rocky Linux 9 / AlmaLinux 9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;新企業專案&lt;/td&gt;
          &lt;td&gt;Rocky Linux 10 / AlmaLinux 10，先驗證生態&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;AI / GPU 開發&lt;/td&gt;
          &lt;td&gt;Ubuntu Server 24.04 LTS&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;強合規商業生產&lt;/td&gt;
          &lt;td&gt;RHEL，或確認廠商支援後使用 Rocky / Alma&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;簡短結論&#34;&gt;簡短結論
&lt;/h2&gt;&lt;p&gt;Debian 的關鍵詞是穩定、簡潔、社群和自由軟體傳統。它適合長期運行的基礎伺服器。&lt;/p&gt;
&lt;p&gt;Rocky Linux 和 AlmaLinux 的關鍵詞是 RHEL 相容、企業生產和 CentOS 替代。它們適合已有 Enterprise Linux 維運體系的團隊。&lt;/p&gt;
&lt;p&gt;Ubuntu Server 的關鍵詞是雲端、文件、開發效率和生態完整。它適合快速部署、容器、AI/GPU 和雲伺服器。&lt;/p&gt;
&lt;p&gt;沒有永遠正確的發行版，只有和團隊、業務、硬體、生命週期最匹配的發行版。伺服器上最好的選擇，通常不是最熱門的那個，而是五年後你還願意維護的那個。&lt;/p&gt;
&lt;h2 id=&#34;相關連結&#34;&gt;相關連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;Debian Releases：&lt;a class=&#34;link&#34; href=&#34;https://www.debian.org/releases/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.debian.org/releases/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Releases：&lt;a class=&#34;link&#34; href=&#34;https://releases.ubuntu.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://releases.ubuntu.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rocky Linux Release and Version Guide：&lt;a class=&#34;link&#34; href=&#34;https://wiki.rockylinux.org/rocky/version/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://wiki.rockylinux.org/rocky/version/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AlmaLinux Release Notes：&lt;a class=&#34;link&#34; href=&#34;https://wiki.almalinux.org/release-notes/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://wiki.almalinux.org/release-notes/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Nginx 限速設定：對高頻 404、400 掃描請求加 rate limit</title>
        <link>https://knightli.com/zh-tw/2026/05/01/nginx-rate-limit-404-400-scan-requests/</link>
        <pubDate>Fri, 01 May 2026 05:41:31 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/05/01/nginx-rate-limit-404-400-scan-requests/</guid>
        <description>&lt;p&gt;網站日誌裡如果突然出現大量 &lt;code&gt;404&lt;/code&gt;、&lt;code&gt;400&lt;/code&gt;，常見原因不是正常使用者點錯連結，而是自動掃描器在探測 &lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;.git&lt;/code&gt;、&lt;code&gt;wp-admin&lt;/code&gt;、&lt;code&gt;phpmyadmin&lt;/code&gt;、&lt;code&gt;xmlrpc.php&lt;/code&gt; 這類路徑。&lt;/p&gt;
&lt;p&gt;這類請求會帶來幾個問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;access log 被快速刷大&lt;/li&gt;
&lt;li&gt;錯誤日誌裡充滿無意義記錄&lt;/li&gt;
&lt;li&gt;靜態網站或反代服務被大量無效請求占用連線&lt;/li&gt;
&lt;li&gt;真正的問題被掃描噪音淹沒&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nginx 可以用 &lt;code&gt;limit_req&lt;/code&gt; 和 &lt;code&gt;limit_conn&lt;/code&gt; 做限制。不過要先說明一點：Nginx 原生不能直接按「回應狀態碼是 404 或 400」再限速，因為限速發生在回應產生之前。&lt;/p&gt;
&lt;p&gt;實際做法是：對容易產生 &lt;code&gt;404&lt;/code&gt; / &lt;code&gt;400&lt;/code&gt; 的掃描路徑、異常來源和全站高頻請求提前限速。&lt;/p&gt;
&lt;h2 id=&#34;基本思路&#34;&gt;基本思路
&lt;/h2&gt;&lt;p&gt;推薦先分成三層：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;全站溫和限速，避免單個 IP 高频刷站。&lt;/li&gt;
&lt;li&gt;對常見掃描路徑嚴格限速，並直接返回 &lt;code&gt;404&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;對單 IP 併發連線數做限制。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更穩妥的上線順序是：先加掃描路徑規則和 &lt;code&gt;access_log off&lt;/code&gt;，觀察一天；如果還有大量隨機路徑 &lt;code&gt;404&lt;/code&gt;，再加全站 &lt;code&gt;limit_req&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;先在-http-裡定義限速池&#34;&gt;先在 http 裡定義限速池
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;limit_req_zone&lt;/code&gt; 和 &lt;code&gt;limit_conn_zone&lt;/code&gt; 必須放在 &lt;code&gt;http {}&lt;/code&gt; 裡，不能放進單個站點的 &lt;code&gt;server {}&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;可以直接寫到 &lt;code&gt;/etc/nginx/nginx.conf&lt;/code&gt; 的 &lt;code&gt;http {}&lt;/code&gt; 中：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;http&lt;/span&gt; &lt;span class=&#34;p&#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;# 按客户端 IP 限速，普通页面请求
&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;kn&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=5r/s&lt;/span&gt;&lt;span class=&#34;p&#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;    &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;kn&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=1r/s&lt;/span&gt;&lt;span class=&#34;p&#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;    &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;kn&#34;&gt;limit_conn_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=addr_conn:20m&lt;/span&gt;&lt;span class=&#34;p&#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;    &lt;span class=&#34;kn&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/etc/nginx/conf.d/*.conf&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/etc/nginx/sites-enabled/*&lt;/span&gt;&lt;span class=&#34;p&#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;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;也可以新建一個檔案：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 nano /etc/nginx/conf.d/limit-zones.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;寫入：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=5r/s&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=1r/s&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;limit_conn_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=addr_conn:20m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;前提是你的 &lt;code&gt;nginx.conf&lt;/code&gt; 裡確實在 &lt;code&gt;http {}&lt;/code&gt; 中包含了：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;include&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;/etc/nginx/conf.d/*.conf&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;再在-server-裡使用限速池&#34;&gt;再在 server 裡使用限速池
&lt;/h2&gt;&lt;p&gt;站點設定檔一般在 &lt;code&gt;/etc/nginx/sites-enabled/www.example.com&lt;/code&gt;，裡面通常是 &lt;code&gt;server {}&lt;/code&gt;。這裡不能再寫 &lt;code&gt;limit_req_zone&lt;/code&gt;，只能使用前面已經定義好的 zone。&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#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;kn&#34;&gt;root&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/srv/www/example.com&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;index.html&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;example.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;www.example.com&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;access_log&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/var/log/nginx/example.com.access.log&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;error_log&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/var/log/nginx/example.com.error.log&lt;/span&gt;&lt;span class=&#34;p&#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;    &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;kn&#34;&gt;limit_req&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;burst=30&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;nodelay&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;limit_conn&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;addr_conn&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#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;    &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;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;^/(\.env|\.git|\.svn|wp-|wp/|adminer|phpmyadmin|pma|vendor|backup|config|server-status|cgi-bin|xmlrpc\.php)&lt;/span&gt; &lt;span class=&#34;p&#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;kn&#34;&gt;access_log&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;off&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;limit_req&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;burst=5&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;nodelay&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#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;p&#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;    &lt;span class=&#34;c1&#34;&gt;# 你原来的 location /、listen ssl 等配置继续放这里
&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;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果擔心全站限速誤傷，可以先只加掃描路徑這一段：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;~&lt;/span&gt;&lt;span class=&#34;sr&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;^/(\.env|\.git|\.svn|wp-|wp/|adminer|phpmyadmin|pma|vendor|backup|config|server-status|cgi-bin|xmlrpc\.php)&lt;/span&gt; &lt;span class=&#34;p&#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;kn&#34;&gt;access_log&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;off&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;limit_req&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;burst=5&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;nodelay&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;404&lt;/span&gt;&lt;span class=&#34;p&#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;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;這些參數是什麼意思&#34;&gt;這些參數是什麼意思
&lt;/h2&gt;&lt;p&gt;這一行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=5r/s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含義如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_req_zone&lt;/code&gt;：定義請求限速用的計數池。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$binary_remote_addr&lt;/code&gt;：按客戶端 IP 做限速 key，比 &lt;code&gt;$remote_addr&lt;/code&gt; 更省記憶體。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zone=perip_general:20m&lt;/code&gt;：建立名為 &lt;code&gt;perip_general&lt;/code&gt; 的共享記憶體區，大小為 &lt;code&gt;20m&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rate=5r/s&lt;/code&gt;：每個 IP 平均每秒允許 5 個請求。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這一行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=1r/s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;和上面類似，只是更嚴格：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;perip_scan&lt;/code&gt;：專門給疑似掃描路徑使用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rate=1r/s&lt;/code&gt;：每個 IP 每秒只允許 1 個請求。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這一行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_conn_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=addr_conn:20m&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含義如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_conn_zone&lt;/code&gt;：定義併發連線限制用的計數池。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$binary_remote_addr&lt;/code&gt;：仍然按客戶端 IP 統計。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zone=addr_conn:20m&lt;/code&gt;：建立名為 &lt;code&gt;addr_conn&lt;/code&gt; 的連線計數共享記憶體區。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;真正限制併發連線數的是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_conn&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;addr_conn&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;20&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;意思是：每個 IP 同時最多 20 個連線。&lt;/p&gt;
&lt;h2 id=&#34;burst-和-nodelay-怎麼理解&#34;&gt;burst 和 nodelay 怎麼理解
&lt;/h2&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;limit_req&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;burst=30&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;nodelay&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以這樣理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rate=5r/s&lt;/code&gt;：長期平均速率是每秒 5 個請求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;burst=30&lt;/code&gt;：允許短時間多出來 30 個請求。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nodelay&lt;/code&gt;：超過平均速率但還沒超過 &lt;code&gt;burst&lt;/code&gt; 時，不排隊等待，直接處理；超過 &lt;code&gt;burst&lt;/code&gt; 才拒絕。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;沒有 &lt;code&gt;nodelay&lt;/code&gt; 時，Nginx 會嘗試把部分請求排隊延遲處理。對普通網頁來說，&lt;code&gt;nodelay&lt;/code&gt; 通常更直觀；對 API 或特別敏感的介面，可以按實際情況調整。&lt;/p&gt;
&lt;h2 id=&#34;常見錯誤limit_req_zone-放錯位置&#34;&gt;常見錯誤：limit_req_zone 放錯位置
&lt;/h2&gt;&lt;p&gt;如果看到這樣的報錯：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;2026/04/30 21:33:48 [emerg] 2290771#2290771: &amp;#34;limit_req_zone&amp;#34; directive is not allowed here in /etc/nginx/sites-enabled/example.com:9
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;意思就是：&lt;code&gt;limit_req_zone&lt;/code&gt; 寫進了不允許的位置。&lt;/p&gt;
&lt;p&gt;常見錯誤寫法是把它放在 &lt;code&gt;server {}&lt;/code&gt; 裡：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#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;kn&#34;&gt;root&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/srv/www/example.com&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;index.html&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;example.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;www.example.com&lt;/span&gt;&lt;span class=&#34;p&#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;    &lt;span class=&#34;kn&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_general:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=5r/s&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;limit_req_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=perip_scan:20m&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;rate=1r/s&lt;/span&gt;&lt;span class=&#34;p&#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;kn&#34;&gt;limit_conn_zone&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$binary_remote_addr&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;zone=addr_conn:20m&lt;/span&gt;&lt;span class=&#34;p&#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;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這不行。&lt;/p&gt;
&lt;p&gt;一句話記憶：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_req_zone&lt;/code&gt; 是「定義池子」，放 &lt;code&gt;http {}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limit_req&lt;/code&gt; 是「使用池子」，放 &lt;code&gt;server {}&lt;/code&gt; 或 &lt;code&gt;location {}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limit_conn_zone&lt;/code&gt; 是「定義連線池子」，放 &lt;code&gt;http {}&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;limit_conn&lt;/code&gt; 是「使用連線池子」，放 &lt;code&gt;server {}&lt;/code&gt; 或 &lt;code&gt;location {}&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;臨時封禁明顯異常-ip&#34;&gt;臨時封禁明顯異常 IP
&lt;/h2&gt;&lt;p&gt;如果日誌裡已經確認某幾個 IP 持續刷請求，也可以先臨時封掉：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;45.95.42.164&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;185.177.72.51&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;185.177.72.5&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;185.177.72.56&lt;/span&gt;&lt;span class=&#34;p&#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;k&#34;&gt;deny&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;185.177.72.58&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這類 &lt;code&gt;deny&lt;/code&gt; 可以放在 &lt;code&gt;server {}&lt;/code&gt; 裡，也可以放在具體 &lt;code&gt;location {}&lt;/code&gt; 裡。是否長期保留，要看誤傷風險和存取來源。&lt;/p&gt;
&lt;h2 id=&#34;檢查並重載&#34;&gt;檢查並重載
&lt;/h2&gt;&lt;p&gt;改完先檢查設定：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;沒有問題再重載：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 reload nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不要直接重啟服務。&lt;code&gt;reload&lt;/code&gt; 會讓 Nginx 平滑載入新設定，風險更小。&lt;/p&gt;
&lt;h2 id=&#34;推薦參數&#34;&gt;推薦參數
&lt;/h2&gt;&lt;p&gt;如果只是普通個人網站或靜態網站，可以先用下面這組：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通頁面：&lt;code&gt;rate=5r/s&lt;/code&gt; 到 &lt;code&gt;10r/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;掃描路徑：&lt;code&gt;rate=1r/s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;掃描路徑 &lt;code&gt;burst=5&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;全站 &lt;code&gt;burst=30&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;單 IP 併發：&lt;code&gt;10&lt;/code&gt; 到 &lt;code&gt;20&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果正常使用者流量很小，參數可以更嚴格；如果網站有大量圖片、腳本、介面請求，普通頁面限速要放寬一些，避免誤傷真實存取。&lt;/p&gt;
&lt;p&gt;最穩的處理方式是分階段上線：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先對掃描路徑 &lt;code&gt;access_log off&lt;/code&gt; + &lt;code&gt;return 404&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;再加 &lt;code&gt;perip_scan&lt;/code&gt; 嚴格限速。&lt;/li&gt;
&lt;li&gt;觀察一天日誌。&lt;/li&gt;
&lt;li&gt;如果隨機路徑 404 仍然很多，再開啟全站溫和限速。&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Ubuntu 26.04 LTS 的 GPU 與硬體支援更新：CUDA、ROCm、DPC&#43;&#43; 和更多平台變化</title>
        <link>https://knightli.com/zh-tw/2026/04/26/ubuntu-26-04-lts-gpu-hardware-ai-updates/</link>
        <pubDate>Sun, 26 Apr 2026 19:35:57 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/26/ubuntu-26-04-lts-gpu-hardware-ai-updates/</guid>
        <description>&lt;p&gt;如果上一篇比較像是 &lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 的桌面總覽，那這篇可以看作它在硬體與算力側的補充版。官方在這一輪 &lt;code&gt;26.04&lt;/code&gt; 裡，把不少和 AI、GPU 計算、平台相容性直接相關的內容都推進了主倉庫或正式支援範圍。&lt;/p&gt;
&lt;p&gt;先說結論：這次最值得關注的，不只是桌面和核心升級，而是 &lt;strong&gt;Ubuntu 正在把 Intel、NVIDIA、AMD 三家的 GPU 計算堆疊，更系統地納入發行版生態&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;1-intel-dpc-與相關元件進入-ubuntu-archive&#34;&gt;1. Intel DPC++ 與相關元件進入 Ubuntu Archive
&lt;/h2&gt;&lt;p&gt;從 &lt;code&gt;26.04&lt;/code&gt; 開始，Intel 開源的 &lt;code&gt;oneAPI DPC++&lt;/code&gt; 編譯器已經可以直接從 Ubuntu Archive 取得，用來建構 &lt;code&gt;SYCL&lt;/code&gt; 程式碼。其執行階段也包含面向 Intel GPU 的配接器。&lt;/p&gt;
&lt;p&gt;同時進入 Ubuntu 倉庫的，還有兩個相關元件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;oneDPL&lt;/code&gt;，也就是 DPC++ library，提供更高生產力的開發介面&lt;/li&gt;
&lt;li&gt;&lt;code&gt;oneDNN&lt;/code&gt;，而且是基於 &lt;code&gt;dpclang-6&lt;/code&gt; 建構，可在 Intel GPU 上運行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這代表如果你本來就在看 &lt;code&gt;SYCL&lt;/code&gt;、異質運算，或是 Intel GPU 上的 AI 工作負載，Ubuntu 現在給出的路徑會直接很多，不再需要完全依賴一套獨立維護的外部環境。&lt;/p&gt;
&lt;p&gt;官方也特別提醒一點：如果要實際調用這些 Intel GPU 相關能力，使用者需要加入 &lt;code&gt;render&lt;/code&gt; 群組。&lt;/p&gt;
&lt;h2 id=&#34;2-nvidia-cuda-toolkit-現在也能直接-apt-install&#34;&gt;2. NVIDIA CUDA toolkit 現在也能直接 &lt;code&gt;apt install&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;對很多開發者和維運人員來說，這可能是這份更新裡最實用的一條。&lt;/p&gt;
&lt;p&gt;從 &lt;code&gt;26.04&lt;/code&gt; 開始，&lt;code&gt;NVIDIA CUDA toolkit&lt;/code&gt; 已經可以直接透過 Ubuntu Archive 安裝。命令就是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 apt install cuda-toolkit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這背後的意義，不只是「少打幾條指令」。&lt;/p&gt;
&lt;p&gt;對以 Ubuntu 為目標平台發佈軟體的開發者來說，新的模式意味著可以直接宣告對 &lt;code&gt;CUDA runtime&lt;/code&gt; 的依賴，後續安裝與相容性由 Ubuntu 在發行版層面處理。這會讓 CUDA 在 Ubuntu 上更容易取得，也更接近系統原生能力，而不是額外疊上一層需要單獨維護的外部軟體堆疊。&lt;/p&gt;
&lt;h2 id=&#34;3-amd-rocm-710-進入-universe&#34;&gt;3. AMD ROCm 7.1.0 進入 Universe
&lt;/h2&gt;&lt;p&gt;AMD 這邊，Ubuntu Universe 現在已經包含 &lt;code&gt;ROCm 7.1.0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這套函式庫主要提供的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;面向 AMD GPU 的 AI 訓練與推論後端能力&lt;/li&gt;
&lt;li&gt;機器學習與高效能運算相關的軟體基礎設施&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;官方還提到，Canonical 會在自己的 CI/CD 流程裡持續測試 ROCm 相關元件。除了 &lt;code&gt;autopkgtests&lt;/code&gt;，也覆蓋了一些使用者態應用，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;llama.cpp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pytorch&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Blender&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Lemonade Server&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這條資訊其實很關鍵，因為它說明 Ubuntu 不是單純「把套件放進倉庫」，而是把 ROCm 當成一套可維護的軟體堆疊來驗證。&lt;/p&gt;
&lt;h2 id=&#34;4-這一輪真正的重點是三家-gpu-生態都在落地&#34;&gt;4. 這一輪真正的重點，是三家 GPU 生態都在落地
&lt;/h2&gt;&lt;p&gt;把 &lt;code&gt;DPC++&lt;/code&gt;、&lt;code&gt;CUDA&lt;/code&gt; 和 &lt;code&gt;ROCm&lt;/code&gt; 放在一起看，會更容易理解 &lt;code&gt;26.04&lt;/code&gt; 的方向：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel：推進 &lt;code&gt;SYCL&lt;/code&gt; / &lt;code&gt;oneAPI&lt;/code&gt; 相關能力進入官方倉庫&lt;/li&gt;
&lt;li&gt;NVIDIA：讓 &lt;code&gt;CUDA toolkit&lt;/code&gt; 具備發行版級的安裝路徑&lt;/li&gt;
&lt;li&gt;AMD：把 &lt;code&gt;ROCm 7.1.0&lt;/code&gt; 納入 Universe，並持續做測試&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你平常會在 Ubuntu 上碰到這些場景，這一輪更新會比較有感：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;本地大模型推論&lt;/li&gt;
&lt;li&gt;GPU 加速訓練或微調&lt;/li&gt;
&lt;li&gt;Blender、科學運算、HPC&lt;/li&gt;
&lt;li&gt;需要在多種 GPU 平台之間切換的開發環境&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;換句話說，Ubuntu 現在不只是「能裝顯卡驅動」，而是開始更完整地承接 &lt;strong&gt;AI 與 GPU 計算所需的使用者態軟體堆疊&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;5-nvidia-dynamic-boost-預設啟用&#34;&gt;5. NVIDIA Dynamic Boost 預設啟用
&lt;/h2&gt;&lt;p&gt;從 &lt;code&gt;25.04&lt;/code&gt; 開始，支援的 NVIDIA 筆電已經預設啟用 &lt;code&gt;Dynamic Boost&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這個功能的邏輯很直接：系統會根據當前負載，在 CPU 和 GPU 之間動態分配功耗。對遊戲場景來說，常見收益就是在需要時把更多功率給 GPU，以換取更高效能。&lt;/p&gt;
&lt;p&gt;不過它有兩個前提：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;裝置接上交流電&lt;/li&gt;
&lt;li&gt;GPU 負載夠高&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在電池供電狀態下，它不會介入。&lt;/p&gt;
&lt;h2 id=&#34;6-intel-新一代內顯與獨顯支援持續往前推進&#34;&gt;6. Intel 新一代內顯與獨顯支援持續往前推進
&lt;/h2&gt;&lt;p&gt;Ubuntu 這一輪也把對新 Intel GPU 的支援繼續往前推，重點包括：&lt;/p&gt;
&lt;p&gt;整合顯示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Intel Core Ultra Xe2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Core Ultra Xe3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;獨立顯示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Intel Arc 5 B570&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Arc 5 B580&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Arc Pro B50&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Arc Pro B60&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Arc Pro B65&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Intel Arc Pro B70&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;圍繞這批裝置，官方也列出了一些已經到位的特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基於 Intel Embree 的 GPU 與 CPU 光線追蹤渲染效能提升，像 &lt;code&gt;Blender 4.2+&lt;/code&gt; 這類應用可受益&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Battlemage&amp;rdquo; 裝置支援 &lt;code&gt;AVC&lt;/code&gt;、&lt;code&gt;JPEG&lt;/code&gt;、&lt;code&gt;HEVC&lt;/code&gt; 和 &lt;code&gt;AV1&lt;/code&gt; 的硬體視訊編碼&lt;/li&gt;
&lt;li&gt;Intel Compute Runtime 引入新的 &lt;code&gt;CCS&lt;/code&gt; 最佳化&lt;/li&gt;
&lt;li&gt;已啟用 Intel Xe GPU 偵錯支援&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你更關注後續版本，&lt;code&gt;25.10&lt;/code&gt; 還會繼續帶進一些新能力，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;借助 &lt;code&gt;Linux kernel 6.17&lt;/code&gt; 初步支援代號 &lt;code&gt;Panther Lake&lt;/code&gt; 的下一代 Intel 用戶端平台&lt;/li&gt;
&lt;li&gt;改進 IOMMU、PCIe 子系統與多 GPU 支援&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mesa 25.2.3&lt;/code&gt; 為 Battlemage 和 Panther Lake 啟用 &lt;code&gt;VK_KHR_shader_bfloat16&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intel-media-driver 25.3.0&lt;/code&gt; 增加 Panther Lake 解碼與 &lt;code&gt;VP9&lt;/code&gt; 編碼支援&lt;/li&gt;
&lt;li&gt;&lt;code&gt;intel-compute-runtime 25.31&lt;/code&gt; 調整 Level Zero 的 &lt;code&gt;USM&lt;/code&gt; 池與本地顯存事件配置策略&lt;/li&gt;
&lt;li&gt;&lt;code&gt;level-zero 1.24&lt;/code&gt; 與 &lt;code&gt;level-zero-raytracing 1.1.0&lt;/code&gt; 帶來更完整的規範與 RTAS 擴充支援&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7-nvidia-桌機的掛起恢復也更穩定了&#34;&gt;7. Nvidia 桌機的掛起恢復也更穩定了
&lt;/h2&gt;&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始，Ubuntu 在專有 &lt;code&gt;Nvidia&lt;/code&gt; 驅動中啟用了掛起恢復支援，以減少桌機喚醒後的損毀與卡死問題。&lt;/p&gt;
&lt;p&gt;這類改動不算「看得見的新功能」，但對實際日常穩定性很重要，尤其是長時間開機、經常掛起恢復的桌面環境。&lt;/p&gt;
&lt;h2 id=&#34;8-arm樹莓派risc-v-和-ibm-z-也有硬性門檻變化&#34;&gt;8. ARM、樹莓派、RISC-V 和 IBM Z 也有硬性門檻變化
&lt;/h2&gt;&lt;p&gt;除了 GPU 軟體堆疊，這份發行說明裡還有幾條平台層面的變化很值得單獨記一下。&lt;/p&gt;
&lt;h3 id=&#34;arm64-桌面平台&#34;&gt;ARM64 桌面平台
&lt;/h3&gt;&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始，&lt;code&gt;linux-generic&lt;/code&gt; 的 &lt;code&gt;ARM64&lt;/code&gt; 核心會提供更廣泛的桌面相容性，覆蓋那些使用 &lt;code&gt;UEFI&lt;/code&gt; 開機的 ARM64 桌面平台。&lt;/p&gt;
&lt;h3 id=&#34;raspberry-pi-新開機配置&#34;&gt;Raspberry Pi 新開機配置
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;25.10&lt;/code&gt; 引入、&lt;code&gt;26.04&lt;/code&gt; 持續調整的一個變化，是樹莓派開機分割區的新配置。&lt;/p&gt;
&lt;p&gt;它的目標是提升開機可靠性：新寫入的開機資源會先被「測試」，確認沒問題後才會提交為新的 &amp;ldquo;known good&amp;rdquo; 集合。&lt;/p&gt;
&lt;p&gt;這裡最需要注意的是韌體時間要求：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Pi 3 / 3+ / CM3+ / Zero 2W&lt;/code&gt;：不需要額外操作，開機韌體就在映像檔內&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pi 4 / 400 / CM4&lt;/code&gt;：開機韌體日期不得早於 &lt;code&gt;2022-11-25&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Pi 5 / 500 / CM5&lt;/code&gt;：開機韌體日期不得早於 &lt;code&gt;2025-02-11&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;檢查命令是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 rpi-eeprom-update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果韌體太舊，而且你使用的是 &lt;code&gt;Ubuntu 24.04 LTS&lt;/code&gt; 或更新版本，可以這樣更新：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 rpi-eeprom-update -a
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;raspberry-pi-桌面映像改用-desktop-minimal&#34;&gt;Raspberry Pi 桌面映像改用 desktop-minimal
&lt;/h3&gt;&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始，樹莓派版 Ubuntu Desktop 映像改為基於 &lt;code&gt;desktop-minimal&lt;/code&gt;，而不是完整的 &lt;code&gt;desktop&lt;/code&gt; seed。&lt;/p&gt;
&lt;p&gt;官方給出的收益很明確：預設安裝的應用更少，未壓縮映像與實際系統都能節省大約 &lt;code&gt;777MB&lt;/code&gt; 空間。&lt;/p&gt;
&lt;p&gt;如果升級後想批次移除這批預設應用，可以使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 apt purge ubuntu-desktop --autoremove
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你想保留其中某些應用，先用 &lt;code&gt;apt&lt;/code&gt; 把它們標記為手動安裝即可。&lt;/p&gt;
&lt;h3 id=&#34;樹莓派-swap-改由-cloud-init-處理&#34;&gt;樹莓派 swap 改由 cloud-init 處理
&lt;/h3&gt;&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始，樹莓派桌面映像裡的 swap 檔建立改由 &lt;code&gt;cloud-init&lt;/code&gt; 負責。&lt;br&gt;
如果你想在首次開機前自訂 swap 大小，可以直接修改開機分割區上的 &lt;code&gt;user-data&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;risc-v-門檻上調&#34;&gt;RISC-V 門檻上調
&lt;/h3&gt;&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始，&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 的 &lt;code&gt;RISC-V&lt;/code&gt; 版本要求硬體實作 &lt;code&gt;RVA23S64 ISA profile&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;不符合這個要求的裝置，已經不能執行 &lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt;。如果你手上還是較早的 &lt;code&gt;RVA20&lt;/code&gt; 處理器板卡，那就得繼續留在 &lt;code&gt;Ubuntu 24.04 LTS&lt;/code&gt; 這一代支援線上。&lt;/p&gt;
&lt;p&gt;按照官方說明，截至 &lt;code&gt;2026 年 4 月&lt;/code&gt;，現實裡還沒有可用的 &lt;code&gt;RVA23S64&lt;/code&gt; 硬體，因此目前唯一受支援的平台，其實是基於 &lt;code&gt;QEMU&lt;/code&gt; 並使用 &lt;code&gt;-cpu rva23s64&lt;/code&gt; 配置的虛擬化環境。&lt;/p&gt;
&lt;h3 id=&#34;ibm-z-最低要求提高到-z15&#34;&gt;IBM Z 最低要求提高到 z15
&lt;/h3&gt;&lt;p&gt;從 &lt;code&gt;26.04&lt;/code&gt; 開始，&lt;code&gt;s390x&lt;/code&gt; 架構最低要求提高到 &lt;code&gt;z15&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;這意味著：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;z14&lt;/code&gt; / &lt;code&gt;LinuxONE II&lt;/code&gt; 以及更早的平台，已經不能安裝 &lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z15&lt;/code&gt; / &lt;code&gt;LinuxONE III&lt;/code&gt; 以及更新平台，會有更好的效能表現&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;9-哪些人更適合先看這篇&#34;&gt;9. 哪些人更適合先看這篇
&lt;/h2&gt;&lt;p&gt;如果你屬於下面這些場景，這篇會比桌面總覽更值得優先看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 Ubuntu 上做 &lt;code&gt;CUDA&lt;/code&gt;、&lt;code&gt;ROCm&lt;/code&gt;、&lt;code&gt;SYCL&lt;/code&gt; 或本地 AI 推論&lt;/li&gt;
&lt;li&gt;用 Intel、NVIDIA、AMD GPU 做開發或計算任務&lt;/li&gt;
&lt;li&gt;維護 Raspberry Pi、ARM64、RISC-V、IBM Z 等非標準 x86 平台&lt;/li&gt;
&lt;li&gt;對升級後的驅動、執行時、倉庫可用性和平台門檻更敏感&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;10-一句話總結&#34;&gt;10. 一句話總結
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 在硬體與 AI 軟體堆疊上的重點，不是哪一家顯卡單獨增強了什麼，而是 &lt;strong&gt;Intel 的 DPC++、NVIDIA 的 CUDA、AMD 的 ROCm，都開始以更官方、更多倉庫內、也更可維護的方式進入 Ubuntu 生態&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你過去把 Ubuntu 當成「先裝系統，再自己拼 GPU 環境」的底座，那從 &lt;code&gt;26.04&lt;/code&gt; 開始，它已經更像一個願意主動承接 AI 與異質運算工作負載的發行版了。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Ubuntu 26.04 LTS 發布：桌面大更新，GNOME 50 和 Linux 7.0 全來了</title>
        <link>https://knightli.com/zh-tw/2026/04/26/ubuntu-26-04-lts-release-notes/</link>
        <pubDate>Sun, 26 Apr 2026 16:10:25 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/26/ubuntu-26-04-lts-release-notes/</guid>
        <description>&lt;p&gt;&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 已在 &lt;strong&gt;2026 年 4 月 23 日&lt;/strong&gt; 發布，代號是 &lt;code&gt;Resolute Raccoon&lt;/code&gt;。這次是新的長期支援版，官方支援週期到 &lt;strong&gt;2031 年 4 月&lt;/strong&gt;；如果使用 &lt;code&gt;Ubuntu Pro&lt;/code&gt;，安全維護可延長到 &lt;strong&gt;10 年&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;如果你是從 &lt;code&gt;Ubuntu 24.04 LTS&lt;/code&gt; 升級上來，這一版不只是一次常規更新，而是把 &lt;code&gt;24.10&lt;/code&gt;、&lt;code&gt;25.04&lt;/code&gt;、&lt;code&gt;25.10&lt;/code&gt; 之間的主要變化一起帶了進來。所以這篇更適合當成一份「升級前先看什麼」的快速摘要。&lt;/p&gt;
&lt;p&gt;如果只看這版最核心的更新，可以先記住四件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GNOME 50&lt;/code&gt; 進入 LTS，桌面體驗和顯示支援明顯往前走了一步&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Linux kernel 7.0&lt;/code&gt; 成為新基線，底層硬體支援和後續維護週期一起更新&lt;/li&gt;
&lt;li&gt;Ubuntu Desktop 正式全面轉向 &lt;code&gt;Wayland&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;預設應用集體換新，&lt;code&gt;Firefox&lt;/code&gt;、&lt;code&gt;LibreOffice&lt;/code&gt;、&lt;code&gt;Thunderbird&lt;/code&gt;、&lt;code&gt;GIMP&lt;/code&gt; 都是大版本更新&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-重點更新先看這幾項&#34;&gt;1. 重點更新先看這幾項
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 是長期支援版，標準支援到 &lt;code&gt;2031-04&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;桌面環境升級到 &lt;code&gt;GNOME 50&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;通用核心升級到 &lt;code&gt;Linux kernel 7.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ubuntu Desktop 工作階段現在只提供 &lt;code&gt;Wayland&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;從更舊版本升級時，不能直接跨太多版本跳到 &lt;code&gt;26.04&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你現在還在 &lt;code&gt;Ubuntu 22.04 LTS&lt;/code&gt; 或 &lt;code&gt;25.04&lt;/code&gt;，官方建議先升到 &lt;code&gt;Ubuntu 24.04 LTS&lt;/code&gt; 或 &lt;code&gt;25.10&lt;/code&gt;，再繼續升級到 &lt;code&gt;26.04 LTS&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;2-最大變化一gnome-50-進-lts-了&#34;&gt;2. 最大變化一：GNOME 50 進 LTS 了
&lt;/h2&gt;&lt;p&gt;這次桌面側最明顯的變化，是 &lt;code&gt;GNOME 50&lt;/code&gt; 終於進了 LTS。對一般使用者來說，它帶來的不是某一個單點新功能，而是整套桌面體驗一起變順了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;小螢幕裝置和窄視窗的可用性更好&lt;/li&gt;
&lt;li&gt;通知支援按應用分組&lt;/li&gt;
&lt;li&gt;HDR、VRR、分數縮放這些顯示相關能力持續完善&lt;/li&gt;
&lt;li&gt;遠端桌面、Wayland、NVIDIA 驅動下的流暢度和穩定性都在往前走&lt;/li&gt;
&lt;li&gt;無障礙支援繼續增強，&lt;code&gt;Orca&lt;/code&gt; 螢幕閱讀器也有明顯更新&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ubuntu 自己也補了一些更實用的改動：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GNOME Shell 全域搜尋可以直接搜可用的 &lt;code&gt;snap&lt;/code&gt; 應用&lt;/li&gt;
&lt;li&gt;也可以在搜尋裡直接發起網頁搜尋&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Yaru&lt;/code&gt; 主題繼續向上游 GNOME 風格靠攏&lt;/li&gt;
&lt;li&gt;&lt;code&gt;snap&lt;/code&gt; 應用和桌面的權限、檔案存取、拖放體驗更自然&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你平時主要用桌面版，這一代 LTS 的重點其實不是「樣子大變」，而是很多過去零散的小摩擦在這一版裡一起被磨平了。&lt;/p&gt;
&lt;h2 id=&#34;3-最大變化二預設應用大面積換新&#34;&gt;3. 最大變化二：預設應用大面積換新
&lt;/h2&gt;&lt;p&gt;和 &lt;code&gt;24.04 LTS&lt;/code&gt; 相比，&lt;code&gt;26.04 LTS&lt;/code&gt; 內建應用整體更新幅度不小：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Firefox&lt;/code&gt; 升到 &lt;code&gt;150&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LibreOffice&lt;/code&gt; 從 &lt;code&gt;24.2&lt;/code&gt; 升到 &lt;code&gt;25.8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Thunderbird&lt;/code&gt; 升到 &lt;code&gt;140&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GIMP&lt;/code&gt; 從 &lt;code&gt;2.10&lt;/code&gt; 跨到 &lt;code&gt;3.2&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外還有幾項和日常使用關係很大的替換：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PDF 檢視器改為 &lt;code&gt;Papers&lt;/code&gt;，取代 &lt;code&gt;Evince&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;圖片檢視器改為 &lt;code&gt;Loupe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;終端機改為 &lt;code&gt;Ptyxis&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;系統監視器改為 &lt;code&gt;Resources&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;預設影片播放器改為 &lt;code&gt;Showtime&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這些變化背後的共同方向很明確：Ubuntu 正在更徹底地擁抱新一代 &lt;code&gt;GTK4&lt;/code&gt;、&lt;code&gt;libadwaita&lt;/code&gt; 和部分以 Rust 重寫過的 GNOME 應用堆疊。&lt;/p&gt;
&lt;h2 id=&#34;4-最大變化三wayland-成了唯一桌面工作階段&#34;&gt;4. 最大變化三：Wayland 成了唯一桌面工作階段
&lt;/h2&gt;&lt;p&gt;這一條對很多老使用者最關鍵。&lt;/p&gt;
&lt;p&gt;從 &lt;code&gt;25.10&lt;/code&gt; 開始的變化，在 &lt;code&gt;26.04 LTS&lt;/code&gt; 上正式落穩：Ubuntu Desktop 現在只執行在 &lt;code&gt;Wayland&lt;/code&gt; 後端上，因為 &lt;code&gt;GNOME Shell&lt;/code&gt; 已經不能再作為 &lt;code&gt;X.org&lt;/code&gt; 工作階段執行。&lt;/p&gt;
&lt;p&gt;這不等於老應用全都不能用了。官方說明裡明確提到，面向 &lt;code&gt;X.org&lt;/code&gt; 的應用仍然可以透過 &lt;code&gt;XWayland&lt;/code&gt; 相容層繼續執行。但如果你的工作流裡還依賴某些老顯示卡驅動、遠端桌面方式、錄影工具或輸入法細節，這一條仍然值得你在升級前先確認。&lt;/p&gt;
&lt;h2 id=&#34;5-最大變化四linux-kernel-70-和底層堆疊一起升級&#34;&gt;5. 最大變化四：Linux kernel 7.0 和底層堆疊一起升級
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 的 GA generic 堆疊從 &lt;code&gt;Linux 6.8&lt;/code&gt; 升到 &lt;code&gt;Linux 7.0&lt;/code&gt;，HWE 堆疊也統一到 &lt;code&gt;7.0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;官方點到的幾項底層變化裡，比較值得一般使用者和維運注意的是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;桌面版和伺服器版預設啟用 crash dump&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sched_ext&lt;/code&gt; 帶來新的排程擴充機制，方便開發者用 eBPF 方式實作排程策略&lt;/li&gt;
&lt;li&gt;&lt;code&gt;linux-lowlatency&lt;/code&gt; 二進位套件退出，改由 &lt;code&gt;linux-generic&lt;/code&gt; 配合 &lt;code&gt;lowlatency-kernel&lt;/code&gt; 使用者空間套件實現低延遲調校&lt;/li&gt;
&lt;li&gt;&lt;code&gt;amd64v3&lt;/code&gt; 架構變體可選啟用，但預設仍然是 opt-in&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你機器比較新，&lt;code&gt;amd64v3&lt;/code&gt; 是一個可以關注的點。官方給出的啟用方式是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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; &lt;span class=&#34;s1&#34;&gt;&amp;#39;APT::Architecture-Variants &amp;#34;amd64v3&amp;#34;;&amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sudo tee /etc/apt/apt.conf.d/99enable-amd64v3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不過這項能力預設不會自動打開，Ubuntu 仍然優先把相容性放在第一位。&lt;/p&gt;
&lt;h2 id=&#34;6-硬體需求和安裝門檻&#34;&gt;6. 硬體需求和安裝門檻
&lt;/h2&gt;&lt;p&gt;官方給出的 Ubuntu Desktop 26.04 LTS 建議底線是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;2 GHz&lt;/code&gt; 雙核心處理器或更高&lt;/li&gt;
&lt;li&gt;至少 &lt;code&gt;6 GB RAM&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;至少 &lt;code&gt;25 GB&lt;/code&gt; 可用儲存空間&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果機器配置偏低，官方更建議考慮 &lt;code&gt;Xubuntu&lt;/code&gt;、&lt;code&gt;Lubuntu&lt;/code&gt; 這類官方風味版本。&lt;br&gt;
伺服器版門檻更低，文件裡提到可以低到 &lt;code&gt;1.5 GB RAM&lt;/code&gt; 和 &lt;code&gt;4 GB&lt;/code&gt; 儲存起步，具體還是要看你的服務負載。&lt;/p&gt;
&lt;h2 id=&#34;7-這版適合誰優先升級&#34;&gt;7. 這版適合誰優先升級
&lt;/h2&gt;&lt;p&gt;如果你現在就在 &lt;code&gt;24.04 LTS&lt;/code&gt;，而且想要這些東西，&lt;code&gt;26.04 LTS&lt;/code&gt; 會很值得看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更新一代完整桌面堆疊，而不只是補丁修修補補&lt;/li&gt;
&lt;li&gt;更成熟的 &lt;code&gt;Wayland&lt;/code&gt; 和顯示支援&lt;/li&gt;
&lt;li&gt;更新的預設應用生態&lt;/li&gt;
&lt;li&gt;新一代核心與更長的後續支援週期&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但如果你高度依賴老 &lt;code&gt;X11&lt;/code&gt; 工作流、特殊驅動、客製桌面外掛，或者你現在的生產環境對「能跑就別動」非常敏感，那升級前最好還是先過一輪相容性驗證。&lt;/p&gt;
&lt;h2 id=&#34;8-一句話總結&#34;&gt;8. 一句話總結
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Ubuntu 26.04 LTS&lt;/code&gt; 的價值，不在於某一個特別炸眼的新功能，而在於它把過去兩年的桌面、核心、應用和相容性演進，一次性沉澱進了新的 LTS 基線裡。&lt;/p&gt;
&lt;p&gt;如果你要找一句最簡短的判斷，那就是：&lt;strong&gt;這是一版偏「整體變穩、整體變新」的 Ubuntu LTS，而不是只靠單個賣點撐起來的版本。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;相關連結&#34;&gt;相關連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;官方發行說明：&lt;code&gt;https://documentation.ubuntu.com/release-notes/26.04/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;LTS 使用者摘要：&lt;code&gt;https://documentation.ubuntu.com/release-notes/26.04/summary-for-lts-users/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>理解 nftables 框架：表、鏈、規則和集合</title>
        <link>https://knightli.com/zh-tw/2026/04/18/nftables-framework-concepts/</link>
        <pubDate>Sat, 18 Apr 2026 10:31:12 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/18/nftables-framework-concepts/</guid>
        <description>&lt;p&gt;學習 &lt;code&gt;nftables&lt;/code&gt; 時，容易一開始就陷入命令細節：怎麼新增規則、怎麼刪除 handle、怎麼寫連接埠匹配。命令當然重要，但如果先把框架概念理清楚，後面讀規則、排查問題和設計規則集都會輕鬆很多。&lt;/p&gt;
&lt;p&gt;可以把 nftables 理解成一套分層結構：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table&lt;/code&gt; 負責隔離規則空間。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;family&lt;/code&gt; 決定規則處理哪類網路協定。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chain&lt;/code&gt; 決定規則在什麼階段執行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rule&lt;/code&gt; 負責具體匹配和動作。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;set&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt;、&lt;code&gt;verdict map&lt;/code&gt; 用來減少重複規則，讓規則集更易維護。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面按概念逐層說明。&lt;/p&gt;
&lt;h2 id=&#34;table規則的命名空間&#34;&gt;table：規則的命名空間
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;table&lt;/code&gt; 是 nftables 裡最外層的規則容器。不同 table 之間相互隔離，因此常見做法是把一組相關規則放進同一個 table。&lt;/p&gt;
&lt;p&gt;例如，你可以把過濾規則、NAT 規則或自訂測試規則分開放。這樣做的好處是邊界清楚：除錯時知道自己在改哪一組規則，清理時也不容易誤刪無關內容。&lt;/p&gt;
&lt;p&gt;table 本身不會直接處理封包。真正參與封包處理的是 table 裡面的 chain 和 rule。&lt;/p&gt;
&lt;h2 id=&#34;family規則面對哪類協定&#34;&gt;family：規則面對哪類協定
&lt;/h2&gt;&lt;p&gt;建立 table 時需要選擇 &lt;code&gt;family&lt;/code&gt;。它決定這張表裡的規則適用於哪類封包。&lt;/p&gt;
&lt;p&gt;常見 family 可以這樣理解：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip&lt;/code&gt;：只處理 IPv4。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip6&lt;/code&gt;：只處理 IPv6。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inet&lt;/code&gt;：同時處理 IPv4 和 IPv6。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;arp&lt;/code&gt;：處理 ARP。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bridge&lt;/code&gt;：處理橋接層流量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;netdev&lt;/code&gt;：更靠近網路設備入口，適合較早階段處理流量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;日常寫普通防火牆規則時，&lt;code&gt;inet&lt;/code&gt; 很常用。它可以把 IPv4 和 IPv6 規則放在同一個 table 裡，避免維護兩套結構相似的規則。&lt;/p&gt;
&lt;h2 id=&#34;chain規則執行的位置&#34;&gt;chain：規則執行的位置
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;chain&lt;/code&gt; 是 rule 的列表。封包進入某個 hook 後，會按順序經過 chain 裡的規則。&lt;/p&gt;
&lt;p&gt;chain 大致可以分為兩類：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;基本 chain：掛到核心網路路徑的某個 hook 上，會被封包流程主動呼叫。&lt;/li&gt;
&lt;li&gt;常規 chain：不直接掛 hook，需要被其他規則跳轉呼叫。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本 chain 通常會指定幾個關鍵屬性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt;：這條 chain 的用途，例如 &lt;code&gt;filter&lt;/code&gt;、&lt;code&gt;nat&lt;/code&gt;、&lt;code&gt;route&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hook&lt;/code&gt;：掛在哪個處理階段，例如 &lt;code&gt;prerouting&lt;/code&gt;、&lt;code&gt;input&lt;/code&gt;、&lt;code&gt;forward&lt;/code&gt;、&lt;code&gt;output&lt;/code&gt;、&lt;code&gt;postrouting&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;priority&lt;/code&gt;：同一個 hook 上有多條 chain 時，誰先執行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;policy&lt;/code&gt;：沒有規則匹配時的預設動作，常見是 &lt;code&gt;accept&lt;/code&gt; 或 &lt;code&gt;drop&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;理解 chain 的關鍵是：規則不是「隨便寫在哪裡都能生效」。同一條規則放在 &lt;code&gt;input&lt;/code&gt;、&lt;code&gt;forward&lt;/code&gt; 或 &lt;code&gt;output&lt;/code&gt;，含義完全不同。&lt;/p&gt;
&lt;h2 id=&#34;rule匹配條件加動作&#34;&gt;rule：匹配條件加動作
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;rule&lt;/code&gt; 是 nftables 裡真正做判斷的地方。它通常由兩部分組成：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;匹配條件：例如來源 IP、目標 IP、協定、連接埠、介面、連線狀態。&lt;/li&gt;
&lt;li&gt;動作：例如 &lt;code&gt;accept&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt;、&lt;code&gt;reject&lt;/code&gt;、&lt;code&gt;counter&lt;/code&gt;、&lt;code&gt;jump&lt;/code&gt;、&lt;code&gt;return&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;規則會按順序求值。封包命中某條會終止流程的動作後，就不會繼續執行後面的規則。沒有命中時，則繼續往下走，直到 chain 結束或觸發預設策略。&lt;/p&gt;
&lt;p&gt;這也是為什麼規則順序很重要：更具體的規則通常要放在更寬泛的規則前面，否則可能永遠沒有機會被執行。&lt;/p&gt;
&lt;h2 id=&#34;set把一組值放在一起&#34;&gt;set：把一組值放在一起
&lt;/h2&gt;&lt;p&gt;如果有很多 IP、連接埠或介面需要匹配，直接寫多條規則會很難維護。&lt;code&gt;set&lt;/code&gt; 用來把一組同類型的值集中管理。&lt;/p&gt;
&lt;p&gt;例如，一組可信 IP、一組禁止存取的連接埠、一組需要限速的位址，都可以放進 set。規則只需要判斷某個值是否屬於這個 set。&lt;/p&gt;
&lt;p&gt;set 的好處是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;規則數量更少。&lt;/li&gt;
&lt;li&gt;可讀性更好。&lt;/li&gt;
&lt;li&gt;後續增刪元素更方便。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;當規則裡出現大量重複條件時，通常就該考慮用 set。&lt;/p&gt;
&lt;h2 id=&#34;map把匹配值映射成結果&#34;&gt;map：把匹配值映射成結果
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;map&lt;/code&gt; 可以理解成「查表」。它根據一個輸入值返回一個結果。&lt;/p&gt;
&lt;p&gt;例如，不同連接埠映射到不同標記，不同位址映射到不同處理參數，都可以透過 map 表達。相比寫多條 if/else 式規則，map 更集中，也更容易維護。&lt;/p&gt;
&lt;p&gt;set 關心的是「是否在集合裡」，map 關心的是「這個值對應什麼結果」。&lt;/p&gt;
&lt;h2 id=&#34;verdict-map把匹配值映射成動作&#34;&gt;verdict map：把匹配值映射成動作
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;verdict map&lt;/code&gt; 是 map 的一個重要用法：它把匹配值映射成 verdict，也就是規則動作。&lt;/p&gt;
&lt;p&gt;例如，不同 IP 段可以對應 &lt;code&gt;accept&lt;/code&gt;、&lt;code&gt;drop&lt;/code&gt; 或跳轉到不同 chain。這樣可以把很多分支判斷壓縮到一個結構裡。&lt;/p&gt;
&lt;p&gt;當規則集開始變複雜時，verdict map 很有用。它能減少重複規則，也能把策略表達得更像一張表，而不是一長串判斷語句。&lt;/p&gt;
&lt;h2 id=&#34;從概念看規則設計&#34;&gt;從概念看規則設計
&lt;/h2&gt;&lt;p&gt;設計 nftables 規則時，可以按這個順序思考：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先確定規則屬於哪個 &lt;code&gt;family&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;再決定放進哪個 &lt;code&gt;table&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;然後選擇合適的 &lt;code&gt;hook&lt;/code&gt; 和 &lt;code&gt;chain&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;最後編寫具體 &lt;code&gt;rule&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如果重複條件很多，再引入 &lt;code&gt;set&lt;/code&gt;、&lt;code&gt;map&lt;/code&gt; 或 &lt;code&gt;verdict map&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;這樣寫出來的規則會更容易維護，也更容易排錯。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;nftables 的概念並不複雜，但層級很重要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;table 管規則邊界。&lt;/li&gt;
&lt;li&gt;family 管協定範圍。&lt;/li&gt;
&lt;li&gt;chain 管執行位置。&lt;/li&gt;
&lt;li&gt;rule 管匹配和動作。&lt;/li&gt;
&lt;li&gt;set、map、verdict map 管複雜度。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先理解這些概念，再去看具體命令，會比直接背命令更穩。尤其是在規則集變多以後，概念清楚能幫助你判斷：問題到底出在協定範圍、執行階段、規則順序，還是匹配條件本身。&lt;/p&gt;
&lt;h2 id=&#34;參考&#34;&gt;參考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/10/html/configuring_firewalls_and_packet_filters/concepts-in-the-nftables-framework&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/10/html/configuring_firewalls_and_packet_filters/concepts-in-the-nftables-framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>nftables 快速入門：表、鏈、規則和常用操作</title>
        <link>https://knightli.com/zh-tw/2026/04/18/nftables-quick-start/</link>
        <pubDate>Sat, 18 Apr 2026 10:22:07 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/18/nftables-quick-start/</guid>
        <description>&lt;p&gt;&lt;code&gt;nftables&lt;/code&gt; 是 Linux 上常用的封包過濾和防火牆規則管理工具。如果只是做設備連線控制、流量統計、連接埠匹配或簡單限速，不需要一開始就把完整規則體系全部學完，先理解三個概念就夠了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;table&lt;/code&gt;：規則的容器。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chain&lt;/code&gt;：規則執行的位置，通常會掛到某個 hook 上。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rule&lt;/code&gt;：真正的匹配條件和動作。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面整理一套最小可用的入門流程，適合先在測試環境裡做實驗。&lt;/p&gt;
&lt;h2 id=&#34;基礎結構&#34;&gt;基礎結構
&lt;/h2&gt;&lt;p&gt;先準備幾個變數，後面的命令會重複使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;table&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;customtable
&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;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;custom_control
&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;target&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;drop
&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;ip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.18.251
&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;mac&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;00:00:01:02:03:04
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;建立一個同時支援 IPv4 和 IPv6 的 &lt;code&gt;inet&lt;/code&gt; table：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add table inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再建立一條掛在 &lt;code&gt;forward&lt;/code&gt; 階段的 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; filter hook forward priority 0&lt;span class=&#34;se&#34;&gt;\;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這裡的 &lt;code&gt;type filter&lt;/code&gt; 表示做過濾規則，&lt;code&gt;hook forward&lt;/code&gt; 表示處理經過轉發的封包。&lt;/p&gt;
&lt;h2 id=&#34;常見匹配方式&#34;&gt;常見匹配方式
&lt;/h2&gt;&lt;p&gt;按來源 IP 匹配，通常可以理解為設備上傳方向：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip saddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按目標 IP 匹配，通常可以理解為設備下載方向：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip daddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按 MAC 位址匹配時，可以用 &lt;code&gt;ether saddr&lt;/code&gt; 控制上行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ether saddr &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;需要注意的是，在經過橋接、轉發或位址轉換的網路裡，下行封包未必能可靠用目標 MAC 過濾。實際做設備連線控制時，優先從 &lt;code&gt;ether saddr&lt;/code&gt; 或 IP 規則開始驗證。&lt;/p&gt;
&lt;p&gt;匹配連接埠時，可以同時覆蓋 TCP 和 UDP：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;{&lt;/span&gt; tcp, udp &lt;span class=&#34;o&#34;&gt;}&lt;/span&gt; dport &lt;span class=&#34;m&#34;&gt;22&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果要匹配連接埠範圍，可以使用比較表達式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; tcp dport &lt;span class=&#34;se&#34;&gt;\&amp;gt;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1024&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;統計單個設備流量&#34;&gt;統計單個設備流量
&lt;/h2&gt;&lt;p&gt;如果只是想統計某個 IP 的上下行流量，可以用 &lt;code&gt;counter return&lt;/code&gt;。這樣命中後記錄計數並返回，後面還有其他統計規則時，能減少繼續匹配的開銷。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip saddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; counter &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ip daddr &lt;span class=&#34;nv&#34;&gt;$ip&lt;/span&gt; counter &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查看統計結果：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果需要看到每條規則的 &lt;code&gt;handle&lt;/code&gt;，加上 &lt;code&gt;-a&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft -a list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;handle&lt;/code&gt; 很重要，因為 nftables 刪除單條規則時通常要靠它定位。&lt;/p&gt;
&lt;h2 id=&#34;簡單限速&#34;&gt;簡單限速
&lt;/h2&gt;&lt;p&gt;限速可以用 &lt;code&gt;limit rate over&lt;/code&gt;。例如按 MAC 位址限制超過指定速率的流量：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;rate&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;10&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;unit&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;mbytes
&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;nft add rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; ether saddr &lt;span class=&#34;nv&#34;&gt;$mac&lt;/span&gt; limit rate over &lt;span class=&#34;nv&#34;&gt;$rate&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$unit&lt;/span&gt;/second drop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這裡的 &lt;code&gt;mbytes&lt;/code&gt;、&lt;code&gt;kbytes&lt;/code&gt; 可以按日常理解的 M、K 來看，不需要再手動做 8 倍換算。實際使用時建議先用較寬鬆的值測試，確認命中方向和效果後再收緊。&lt;/p&gt;
&lt;h2 id=&#34;刪除和清理規則&#34;&gt;刪除和清理規則
&lt;/h2&gt;&lt;p&gt;先查看帶 &lt;code&gt;handle&lt;/code&gt; 的規則：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft -a list chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再按 handle 刪除某條規則：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete rule inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt; handle &amp;lt;handle&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;清空某條 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft flush chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;刪除 chain：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete chain inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$chain&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;刪除整個 table：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nft delete table inet &lt;span class=&#34;nv&#34;&gt;$table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日常除錯時，建議先只清理自己建立的 table，不要直接改系統或其他服務自動生成的 table。這樣即使規則寫錯，也更容易回滾。&lt;/p&gt;
&lt;h2 id=&#34;使用建議&#34;&gt;使用建議
&lt;/h2&gt;&lt;p&gt;使用 nftables 時，可以優先自己建立獨立的 table 和 chain。這樣做有兩個好處：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不容易和系統已有規則混在一起。&lt;/li&gt;
&lt;li&gt;除錯、清空和刪除都更安全。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外，規則寫完後一定要用 &lt;code&gt;nft list chain&lt;/code&gt; 看實際命中情況。尤其是 MAC、介面、連接埠和限速規則，不同設備、橋接方式和系統版本下表現可能不同，先小範圍測試比一次性寫複雜規則更穩。&lt;/p&gt;
&lt;h2 id=&#34;參考&#34;&gt;參考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.right.com.cn/forum/thread-8369750-1-1.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://www.right.com.cn/forum/thread-8369750-1-1.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>go2rtc 直連小米攝影機 RTSP：接入 NVR、HomeKit、Frigate</title>
        <link>https://knightli.com/zh-tw/2026/04/11/go2rtc-xiaomi-rtsp-nvr-homekit-frigate/</link>
        <pubDate>Sat, 11 Apr 2026 08:14:47 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/11/go2rtc-xiaomi-rtsp-nvr-homekit-frigate/</guid>
        <description>&lt;p&gt;這篇整理如何用 &lt;code&gt;go2rtc&lt;/code&gt; 直接拉取小米攝影機串流，並同時供 NVR、HomeKit、Frigate 使用。&lt;/p&gt;
&lt;h2 id=&#34;docker-部署範例&#34;&gt;Docker 部署範例
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;nt&#34;&gt;services&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;go2rtc&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;container_name&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;go2rtc&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;image&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;alexxit/go2rtc:master-hardware&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;restart&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;always&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;network_mode&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;host&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;privileged&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;kc&#34;&gt;true&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;environment&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;l&#34;&gt;TZ=Asia/Shanghai&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;volumes&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;l&#34;&gt;/vol1/1000/docker/go2rtc:/config&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;go2rtc 後台位址：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;http://192.168.3.217:1984/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;串流設定範例&#34;&gt;串流設定範例
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;nt&#34;&gt;streams&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;micam1&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;l&#34;&gt;xiaomi://xxx&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;#H265转H264,Homekit预览会用到&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;#micam1_h264:&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;#- ffmpeg:micam1#video=h264#width=1280#height=720#hardware#raw=-r 15&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;micam2&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;l&#34;&gt;xiaomi://xxx&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;micam3&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;l&#34;&gt;xiaomi://xxx&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;RTSP 串流位址格式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;rtsp://192.168.3.217:8554/micam1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;畫質與參數&#34;&gt;畫質與參數
&lt;/h2&gt;&lt;p&gt;畫質可用 &lt;code&gt;0&lt;/code&gt; 到 &lt;code&gt;5&lt;/code&gt; 指定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0&lt;/code&gt; 通常代表自動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;1&lt;/code&gt; 代表 &lt;code&gt;sd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;2&lt;/code&gt; 代表 &lt;code&gt;hd&lt;/code&gt;（go2rtc 預設）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;部分新款攝影機的 HD 可能對應 &lt;code&gt;3&lt;/code&gt;。舊款在 &lt;code&gt;3&lt;/code&gt; 可能出現編解碼異常，因此不建議所有設備都用同一數值。&lt;/p&gt;
&lt;p&gt;可用 &lt;code&gt;subtype=hd/sd/auto/0-5&lt;/code&gt; 指定畫質：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;nt&#34;&gt;streams&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;xiaomi1&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;xiaomi://***&amp;amp;subtype=sd&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;雙鏡頭可使用第二通道 &lt;code&gt;channel=2&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;nt&#34;&gt;streams&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;xiaomi1&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;xiaomi://***&amp;amp;channel=2&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;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;把 go2rtc 放在前面統一拉流後，一路 RTSP 就能同時服務 NVR 錄影、Frigate 分析、HomeKit 預覽，管理會更簡單。&lt;/p&gt;
&lt;h2 id=&#34;參考連結&#34;&gt;參考連結
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;攝影機支援列表：https://github.com/AlexxIT/go2rtc/issues/1982&lt;/li&gt;
&lt;li&gt;官方說明出處：https://github.com/AlexxIT/go2rtc/blob/master/internal/xiaomi/README.md&lt;/li&gt;
&lt;li&gt;Docker 映像：https://hub.docker.com/r/alexxit/go2rtc&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Windows 工作管理員資料暫停不更新，通常是更新速度被設為已暫停</title>
        <link>https://knightli.com/zh-tw/2026/04/09/windows-task-manager-data-paused/</link>
        <pubDate>Thu, 09 Apr 2026 18:15:53 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/09/windows-task-manager-data-paused/</guid>
        <description>&lt;p&gt;有時候打開 Windows 工作管理員，會發現「處理程序」或「效能」頁面中的資料像是卡住了一樣，CPU、記憶體、磁碟或網路數值長時間沒有變化。乍看之下很像系統異常，但實際上正在執行的程式、網路傳輸和資源占用仍然都在正常變化。&lt;/p&gt;
&lt;p&gt;這種情況通常不是系統真的停住了，而是工作管理員的更新頻率被改成了「已暫停」。&lt;/p&gt;
&lt;h2 id=&#34;現象&#34;&gt;現象
&lt;/h2&gt;&lt;p&gt;常見表現包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;「處理程序」頁的 CPU、記憶體等資料不再跳動&lt;/li&gt;
&lt;li&gt;「效能」頁的曲線長時間不更新&lt;/li&gt;
&lt;li&gt;明明還有程式在執行，但工作管理員看起來像是靜止狀態&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是問題出現時的介面示例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://knightli.com/2026/04/09/windows-task-manager-data-paused/1.png&#34;
	width=&#34;639&#34;
	height=&#34;546&#34;
	srcset=&#34;https://knightli.com/2026/04/09/windows-task-manager-data-paused/1_hu_b54b1db143639c67.png 480w, https://knightli.com/2026/04/09/windows-task-manager-data-paused/1_hu_133bff4e7ebfe2ef.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;工作管理員資料不更新示例&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;117&#34;
		data-flex-basis=&#34;280px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;原因&#34;&gt;原因
&lt;/h2&gt;&lt;p&gt;工作管理員支援調整「更新速度」，可以設定為高、正常、低，或者直接暫停。&lt;/p&gt;
&lt;p&gt;如果這裡被設成了「已暫停」，介面上的各項統計資料就不會繼續更新，因此看起來就像 CPU、記憶體或網路資訊全部停住了一樣。&lt;/p&gt;
&lt;p&gt;如下圖所示，這個選項通常可以在工作管理員上方選單中的「檢視」裡找到：&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://knightli.com/2026/04/09/windows-task-manager-data-paused/2.png&#34;
	width=&#34;642&#34;
	height=&#34;547&#34;
	srcset=&#34;https://knightli.com/2026/04/09/windows-task-manager-data-paused/2_hu_3020d576b0c86412.png 480w, https://knightli.com/2026/04/09/windows-task-manager-data-paused/2_hu_9f84b87ce1e21e95.png 1024w&#34;
	loading=&#34;lazy&#34;
	
		alt=&#34;工作管理員更新速度被設為已暫停&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;117&#34;
		data-flex-basis=&#34;281px&#34;
	
&gt;&lt;/p&gt;
&lt;h2 id=&#34;解決方法&#34;&gt;解決方法
&lt;/h2&gt;&lt;p&gt;按下面的步驟檢查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打開工作管理員&lt;/li&gt;
&lt;li&gt;點擊上方選單「檢視」&lt;/li&gt;
&lt;li&gt;找到「更新速度」&lt;/li&gt;
&lt;li&gt;檢查目前是否被設為「已暫停」&lt;/li&gt;
&lt;li&gt;將其改回「正常」或「高」&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;修改之後，再觀察「處理程序」或「效能」頁面，資料一般就會恢復正常更新。&lt;/p&gt;
&lt;h2 id=&#34;補充說明&#34;&gt;補充說明
&lt;/h2&gt;&lt;p&gt;如果你改回「正常」之後仍然沒有刷新，再繼續檢查下面幾項：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是否使用了某些系統精簡工具或第三方效能監控工具&lt;/li&gt;
&lt;li&gt;是否透過遠端方式連線到系統，導致介面更新異常&lt;/li&gt;
&lt;li&gt;是否是工作管理員本身卡死，此時可以關閉後重新打開&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不過在大多數情況下，這類問題就是「更新速度」被誤設為暫停導致的，優先檢查這一項通常最快。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>遠端訪問飛牛 NAS 的兩種方式與對比</title>
        <link>https://knightli.com/zh-tw/2026/04/04/fnos-remote-access-public-ip-vs-fn-connect/</link>
        <pubDate>Sat, 04 Apr 2026 11:00:00 +0800</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/04/fnos-remote-access-public-ip-vs-fn-connect/</guid>
        <description>&lt;p&gt;飛牛 NAS 常見的遠端訪問方式主要有兩種：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;公網 IP 直連&lt;/li&gt;
&lt;li&gt;FN Connect 遠端訪問服務&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面按「怎麼用 + 注意點 + 適用場景」做一個可直接參考的整理。&lt;/p&gt;
&lt;h2 id=&#34;方式一公網-ip-直連&#34;&gt;方式一：公網 IP 直連
&lt;/h2&gt;&lt;p&gt;適用於家用網路有公網 IP 的場景，需要在路由器中配置連接埠轉發。&lt;br&gt;
之後在瀏覽器或飛牛 App 中，輸入公網 IPv4/IPv6 位址與連接埠即可訪問。&lt;br&gt;
也可以進一步使用 DDNS，然後透過網域訪問。&lt;/p&gt;
&lt;h3 id=&#34;注意事項&#34;&gt;注意事項
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;飛牛私有雲 fnOS 預設連接埠：
&lt;code&gt;HTTP = 8000&lt;/code&gt;，&lt;code&gt;HTTPS = 8001&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;若已配置連接埠轉發，訪問位址必須帶連接埠號，否則無法正確訪問飛牛 NAS。&lt;/li&gt;
&lt;li&gt;公網 IP 直連通常沒有額外中繼，速度折損更小。&lt;/li&gt;
&lt;li&gt;若未正確配置安全憑證，HTTP 為明文傳輸，請僅在可信網路環境使用。&lt;/li&gt;
&lt;li&gt;許多寬頻會封鎖常用連接埠如 80、8080 等，若常用連接埠無法連通，可嘗試冷門連接埠。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;方式二fn-connect-遠端訪問服務&#34;&gt;方式二：FN Connect 遠端訪問服務
&lt;/h2&gt;&lt;p&gt;FN Connect 是飛牛提供的遠端訪問服務。&lt;br&gt;
使用後你會獲得唯一的 FN ID，用於標識你的飛牛 NAS，並透過其對應方式進行遠端訪問。&lt;/p&gt;
&lt;h3 id=&#34;注意事項-1&#34;&gt;注意事項
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;使用 FN Connect 需要註冊或登入飛牛帳號。&lt;/li&gt;
&lt;li&gt;FN Connect 會為你的 FN ID 對應子網域提供 SSL 憑證，可透過 HTTPS 安全訪問。&lt;/li&gt;
&lt;li&gt;FN Connect 會根據目前網路環境自動選擇更優連線方式。&lt;/li&gt;
&lt;li&gt;當可公網直連時，網頁端可選擇是否使用公網 IP 直連。&lt;/li&gt;
&lt;li&gt;FN Connect 的中繼轉發會產生流量成本，因此存在限速策略。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;兩種方式對比&#34;&gt;兩種方式對比
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;維度&lt;/th&gt;
          &lt;th&gt;公網 IP 直連&lt;/th&gt;
          &lt;th&gt;FN Connect&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;上手難度&lt;/td&gt;
          &lt;td&gt;需要公網 IP + 路由器連接埠轉發&lt;/td&gt;
          &lt;td&gt;登入帳號後依引導配置，門檻更低&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;訪問速度&lt;/td&gt;
          &lt;td&gt;通常更快、鏈路更直接&lt;/td&gt;
          &lt;td&gt;直連時接近直連；中繼時可能限速&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;安全性&lt;/td&gt;
          &lt;td&gt;取決於你自己的憑證與暴露策略&lt;/td&gt;
          &lt;td&gt;預設支援憑證，HTTPS 更省心，依賴飛牛本身的安全&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;維護成本&lt;/td&gt;
          &lt;td&gt;需自行維護網路與安全配置&lt;/td&gt;
          &lt;td&gt;日常維護成本較低&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;適合人群&lt;/td&gt;
          &lt;td&gt;有網路配置經驗、追求效能&lt;/td&gt;
          &lt;td&gt;追求易用與穩定的一般使用者&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;選擇建議&#34;&gt;選擇建議
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;若你熟悉網路配置、希望更高頻寬與更低延遲，優先考慮公網 IP 直連。&lt;/li&gt;
&lt;li&gt;若你更重視易用性與安全接入體驗，優先考慮 FN Connect。&lt;/li&gt;
&lt;li&gt;實際使用可混合：預設 FN Connect，條件允許時切換為公網 IP 直連。&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Ubuntu 自動更新 Let&#39;s Encrypt 憑證（Certbot &#43; Nginx）</title>
        <link>https://knightli.com/zh-tw/2026/04/03/certbot-auto-renew-nginx/</link>
        <pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://knightli.com/zh-tw/2026/04/03/certbot-auto-renew-nginx/</guid>
        <description>&lt;p&gt;Let&amp;rsquo;s Encrypt 憑證有效期只有 90 天，正式站點一定要配置自動續期，避免憑證過期導致 HTTPS 報錯。&lt;/p&gt;
&lt;p&gt;如果你已經用 Certbot 申請過憑證，通常只差兩件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;配置定時任務&lt;/li&gt;
&lt;li&gt;驗證續期流程是否真的可用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;先確認-certbot-是否已自帶定時任務&#34;&gt;先確認 Certbot 是否已自帶定時任務
&lt;/h2&gt;&lt;p&gt;在不同系統中，Certbot 可能已經自動安裝定時任務（例如 &lt;code&gt;systemd timer&lt;/code&gt; 或 &lt;code&gt;/etc/cron.d/certbot&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;可以先檢查：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 list-timers &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep certbot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果已經有有效定時器，一般不需要再重複加 crontab。&lt;/p&gt;
&lt;h2 id=&#34;手動新增-crontab推薦範例&#34;&gt;手動新增 crontab（推薦範例）
&lt;/h2&gt;&lt;p&gt;如果你希望自己明確管理續期任務，可用 root 使用者新增：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;加入下面這一行（每天凌晨 3 點執行一次）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;0 3 * * * certbot renew --pre-hook &amp;#34;systemctl stop nginx&amp;#34; --post-hook &amp;#34;systemctl start nginx&amp;#34; &amp;gt;&amp;gt; /tmp/certbot-renew.log 2&amp;gt;&amp;amp;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這條命令的含義：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;0 3 * * *&lt;/code&gt;：每天 03:00 執行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;certbot renew&lt;/code&gt;：檢查並續期即將過期的憑證（不會每天都實際續期）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--pre-hook&lt;/code&gt;：續期前停止 Nginx，避免 80/443 連接埠衝突（常見於 standalone 模式）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--post-hook&lt;/code&gt;：續期後啟動 Nginx&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;gt;&amp;gt; /tmp/certbot-renew.log 2&amp;gt;&amp;amp;1&lt;/code&gt;：將日誌追加寫入，方便排查&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;建議先做一次模擬續期&#34;&gt;建議先做一次模擬續期
&lt;/h2&gt;&lt;p&gt;定時任務加好後，先手動驗證流程是否可用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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 certbot renew --dry-run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看到模擬續期成功，再交給定時任務長期運行。&lt;/p&gt;
&lt;h2 id=&#34;常見注意點&#34;&gt;常見注意點
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;如果你使用的是 &lt;code&gt;webroot&lt;/code&gt; 或 &lt;code&gt;nginx&lt;/code&gt; 插件，很多情況不需要停 Nginx，可改為續期後重載：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#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;certbot renew --deploy-hook &lt;span class=&#34;s2&#34;&gt;&amp;#34;systemctl reload nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;certbot renew&lt;/code&gt; 只會在憑證接近過期時才進行實際續期，因此每天跑一次是正常且常見做法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建議把日誌改到可長期追蹤的位置（例如 &lt;code&gt;/var/log/letsencrypt/&lt;/code&gt;），更利於維運。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;總結&#34;&gt;總結
&lt;/h2&gt;&lt;p&gt;憑證自動續期的關鍵不是「把命令寫上去」，而是「確認命令能完整跑通」。&lt;/p&gt;
&lt;p&gt;你只要完成這三步，通常就能穩定運行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;確認是否已有系統自帶定時任務&lt;/li&gt;
&lt;li&gt;按需新增 crontab 並保留日誌&lt;/li&gt;
&lt;li&gt;用 &lt;code&gt;--dry-run&lt;/code&gt; 做一次完整驗證&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        
    </channel>
</rss>
