<?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/categories/%E8%BF%90%E7%BB%B4/</link>
        <description>Recent content in 运维 on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sat, 30 May 2026 16:14:19 +0800</lastBuildDate><atom:link href="https://knightli.com/categories/%E8%BF%90%E7%BB%B4/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>用 NAS 自建 Git Server 同步本地 Markdown 笔记</title>
        <link>https://knightli.com/2026/05/30/nas-git-server-local-notes-sync/</link>
        <pubDate>Sat, 30 May 2026 16:14:19 +0800</pubDate>
        
        <guid>https://knightli.com/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 端克隆仓库，用常见编辑器写笔记。&lt;/li&gt;
&lt;li&gt;Android 端克隆同一个仓库，用 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;首次克隆：&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 用户授权里。然后在手机本地选择一个目录克隆仓库：&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/2026/05/07/linux-server-distro-comparison-2026/</link>
        <pubDate>Thu, 07 May 2026 21:03:12 +0800</pubDate>
        
        <guid>https://knightli.com/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/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/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/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/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 不是单纯“把包放进仓库”，而是在按一个可维护的软件栈去验证它。&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;“Battlemage” 设备支持 &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;它的目标是提升启动可靠性：新写入的启动资源会先被“测试”，确认没问题后才会提交为新的 “known good” 集合。&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/2026/04/26/ubuntu-26-04-lts-release-notes/</link>
        <pubDate>Sun, 26 Apr 2026 16:10:25 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/04/18/nftables-framework-concepts/</link>
        <pubDate>Sat, 18 Apr 2026 10:31:12 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/04/18/nftables-quick-start/</link>
        <pubDate>Sat, 18 Apr 2026 10:22:07 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/04/11/go2rtc-xiaomi-rtsp-nvr-homekit-frigate/</link>
        <pubDate>Sat, 11 Apr 2026 08:14:47 +0800</pubDate>
        
        <guid>https://knightli.com/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/2026/04/09/windows-task-manager-data-paused/</link>
        <pubDate>Thu, 09 Apr 2026 18:15:53 +0800</pubDate>
        
        <guid>https://knightli.com/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;
</description>
        </item>
        <item>
        <title>远程访问飞牛 NAS 的两种方式与对比</title>
        <link>https://knightli.com/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/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的场景，需要在路由器中配置端口转发。
之后在浏览器或飞牛 App 中，输入公网 IPv4/IPv6 地址和端口号即可访问。
也可以进一步使用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/2026/04/02/certbot-auto-renew-nginx/</link>
        <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://knightli.com/2026/04/02/certbot-auto-renew-nginx/</guid>
        <description>&lt;p&gt;Let&amp;rsquo;s Encrypt 证书有效期只有 90 天，线上站点必须配置自动续期，避免证书过期导致 HTTPS 报错。&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 --pre-hook &lt;span class=&#34;s2&#34;&gt;&amp;#34;systemctl stop nginx&amp;#34;&lt;/span&gt; --post-hook &lt;span class=&#34;s2&#34;&gt;&amp;#34;systemctl start nginx&amp;#34;&lt;/span&gt; --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;
</description>
        </item>
        
    </channel>
</rss>
