<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>thun888</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.hzchu.top/</id>
  <link href="https://blog.hzchu.top/" rel="alternate"/>
  <link href="https://blog.hzchu.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, thun888</rights>
  <subtitle>夏日当空，心如深渊 | 还看（；´д｀）ゞ</subtitle>
  <title>Thun888</title>
  <updated>2026-10-02T11:31:13.000Z</updated>
  <entry>
    <author>
      <name>thun888</name>
    </author>
    <category term="技术类" scheme="https://blog.hzchu.top/categories/%E6%8A%80%E6%9C%AF%E7%B1%BB/"/>
    <category term="数据储存" scheme="https://blog.hzchu.top/tags/%E6%95%B0%E6%8D%AE%E5%82%A8%E5%AD%98/"/>
    <content>
      <![CDATA[<h2 id="引言"><a class="markdownIt-Anchor" href="#引言"></a> 引言</h2><p>之前网站用的一直是储存在<code>Onedrive</code>上，再通过<a href="https://github.com/qkqpttgf/OneManager-php">OneManager</a>挂载，提供文件直链后经过自己写的一个中间件处理，转换格式。在过去两年提供了快且相对稳定的文件托管服务。</p><p>但是，存在不少问题：</p><ol><li><a href="https://github.com/gographics/imagick">gographics/imagick</a>存在内存泄漏——定时重启，后改用<a href="https://docs.imgproxy.net/">Imgproxy</a>过渡</li><li>未使用CDN——使用的是家里公网IP直接提供服务，而现在好几家都提供了免费国内CDN，有点跟不上潮流了</li><li>大小文件储存过于分散——原先架构不适合缓存大文件，需要使用大文件的情况要经过另外一个<code>Cloudflare Worker</code>再请求<code>OneManager</code>。同时还有部分文件备份用<code>Openlist</code>对外暴露<code>Webdav</code>端点，该部分数据缺乏冗余</li><li><code>Serverless</code>额度消耗——并且由于分散在<code>Cloudflare</code>和<code>Vercel</code>，一次请求消耗两倍额度。尤其是<code>Vercel</code></li><li>本站前端降级组件——不太优雅，一直计划去除</li><li>…</li></ol><p>最近的话首先就是Nginx漏洞了，因为当时用的<a href="https://blog.hzchu.top/2026/haozi-openresty-build/">耗子面板</a>本身就停止了更新软件源，换到<code>1panel</code>时考虑到本身架构就问题不少，索性将请求全部回源至<code>Cloudflare Worker</code>，速度降了不少。而后来微软再<span class="annotated" data-tippy-content="Onedrive E5订阅规则更改导致单账号储存配额超标">背刺一手</span>，不行了，必须得迁移了<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/EveOneCat2/7.png"></span></p><p>本文一共两部分：</p><ol><li>搭建Garage储存集群：<a href="https://garagehq.deuxfleurs.fr/documentation/cookbook/real-world/">官方文档</a>已经相当详尽了，仅作记录。同时参考了<a href="https://keke.su/posts/2026-01-25-new-1.html">快速搭建&amp;迁移S3 —— 手把手教你从MinIO迁移到Garage</a>一文，重复部分省略</li><li><a href="https://github.com/thun888/filegate">FileGate</a>处理中间件配置——为了兼容旧储存，同时规范链接结构，我参考BiliBili的图片链接格式化参数重新写了一套中间件，并添加了许多新功能，<del>我不想再重构了😭</del></li></ol><h2 id="需求"><a class="markdownIt-Anchor" href="#需求"></a> 需求</h2><p>常规的单点（主从）储存架构是单节点承载所有储存压力，其他节点顶多同步相同副本，起到冗余和备份作用（主从复制），无法真正实现“共享储存”。而我手上大多数服务器资源都是硬盘大小不一，性能差异大，不太稳定的炸弹。哪怕只是为了容灾，也得写好复杂的备份脚本，意义不大。</p><p>理想情况下是将这些存储统一为一个分布式对象存储池，由集群统一管理对象数据，节点间做好数据同步和冗余。同时我希望使用兼容S3标准的储存后端以便其他程序快速接入。有很多这类型的程序，比如MinIO、RustFS等等</p><p>但……他们都太吃性能了，或者说我对访问性能的要求不高，没必要耗费过多的性能在这些服务上。而且一个停更，一个爆漏洞，着实是不太敢用<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatneutral.png"></span></p><p>而本文的主角——<a href="https://git.deuxfleurs.fr/Deuxfleurs/garage">Garage</a>，是由<a href="https://deuxfleurs.fr/">Deuxfleurs</a>开发的“专为中小规模的自托管场景而设计的 S3 兼容的分布式对象存储服务”，具备轻量，方便部署，容灾能力强等优点。符合我对这个服务的所有要求</p><h2 id="集群结构"><a class="markdownIt-Anchor" href="#集群结构"></a> 集群结构</h2><div class="md-table-scroll"><table><thead><tr><th>服务器</th><th>系统</th><th>容量</th></tr></thead><tbody><tr><td>家里云</td><td>Linux</td><td>350GB</td></tr><tr><td>Oracle</td><td>Linux</td><td>120GB</td></tr><tr><td>学校宿舍小主机</td><td>Windows</td><td>500GB</td></tr><tr><td>阿里云</td><td>Linux</td><td>10GB</td></tr><tr><td><em>神秘设备</em></td><td>Linux</td><td>400GB</td></tr></tbody></table></div><blockquote><p>Garage作者曾尝试过<a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/536">交叉编译到Windows</a>，但失败了，因此没有提供Windows的版本<br>本文通过WSL1部署其Linux版本</p></blockquote><h2 id="搭建-garage"><a class="markdownIt-Anchor" href="#搭建-garage"></a> 搭建 Garage</h2><h3 id="准备工作"><a class="markdownIt-Anchor" href="#准备工作"></a> 准备工作</h3><p>编写配置文件<code>garage.toml</code></p><blockquote><p>对于二进制运行情况，应放置在<code>/etc/garage.toml</code></p></blockquote><figure class="highlight toml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="comment"># 基础存储路径配置</span></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="attr">metadata_dir</span> = <span class="string">"/var/lib/garage/meta"</span> <span class="comment"># Garage 元数据存放目录</span></span><br><span class="line"><span class="attr">data_dir</span> = <span class="string">"/var/lib/garage/data"</span> <span class="comment"># 对象数据（真正文件内容）存放目录，大文件、静态资源都在这里</span></span><br><span class="line"><span class="attr">db_engine</span> = <span class="string">"lmdb"</span> <span class="comment"># 可选：sqlite / lmdb</span></span><br><span class="line"><span class="attr">metadata_auto_snapshot_interval</span> = <span class="string">"6h"</span> <span class="comment"># 如果设置此值，Garage 将定期自动对元数据数据库文件进行快照</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="comment"># 数据可靠性与性能</span></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="attr">replication_factor</span> = <span class="number">3</span> <span class="comment"># 副本数量，即一个对象会被存几份，比如：3 表示：允许同时坏 2 个节点而不丢数据</span></span><br><span class="line"><span class="attr">compression_level</span> = <span class="number">9</span> <span class="comment"># 数据压缩级别（0~9），比如：2：轻量压缩，CPU 开销低，性价比高</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="comment"># 集群 RPC 通信（3901）</span></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="attr">rpc_bind_addr</span> = <span class="string">"[::]:3901"</span></span><br><span class="line"><span class="attr">rpc_public_addr</span> = <span class="string">"100.xx.xx.xx:3901"</span> <span class="comment"># 对外公布的 RPC 地址，单机可用 localhost，多机必须填真实 IP:3901</span></span><br><span class="line"><span class="attr">rpc_secret</span> = <span class="string">"用openssl rand -hex 32生成"</span> <span class="comment"># RPC 通信密钥，用于集群节点之间认证，各节点保持一致</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="comment"># S3 相关</span></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="section">[s3_api]</span></span><br><span class="line"><span class="attr">s3_region</span> = <span class="string">"garage"</span> <span class="comment"># S3 区域名（随便写，但要统一）</span></span><br><span class="line"><span class="attr">api_bind_addr</span> = <span class="string">"[::]:3900"</span></span><br><span class="line"><span class="attr">root_domain</span> = <span class="string">".s3.api.hzchu.top"</span> <span class="comment"># S3 API 使用的域名后缀</span></span><br><span class="line"></span><br><span class="line"><span class="section">[s3_web]</span></span><br><span class="line"><span class="attr">bind_addr</span> = <span class="string">"[::]:3902"</span></span><br><span class="line"><span class="attr">root_domain</span> = <span class="string">".oss.hzchu.top"</span> <span class="comment"># Web 访问域名后缀，&lt;bucket&gt;.web.domain.com</span></span><br><span class="line"><span class="attr">index</span> = <span class="string">"index.html"</span> <span class="comment"># 默认首页文件，访问 bucket 根目录时返回这个文件，常用于 Hugo / 静态站点</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="comment"># 管理接口（3903）</span></span><br><span class="line"><span class="comment"># ========================</span></span><br><span class="line"><span class="section">[admin]</span> <span class="comment"># Required</span></span><br><span class="line"><span class="attr">api_bind_addr</span> = <span class="string">"[::]:3903"</span></span><br><span class="line"><span class="attr">admin_token</span> = <span class="string">"用openssl rand -base64 32生成"</span> <span class="comment"># 管理接口访问 Token，用于 garage 命令或 HTTP 管理 API，可以</span></span><br><span class="line"><span class="attr">metrics_token</span> = <span class="string">"用openssl rand -base64 32生成"</span> <span class="comment"># 指标接口 Token，用于 Prometheus / metrics 拉取</span></span><br></pre></td></tr></tbody></table></figure><p>配置用意如下：</p><ol><li><code>replication_factor</code>: <span class="or-item">副本因子</span><span class="or-sep">/</span><span class="or-item">数据副本总数</span><span class="or-sep">/</span><span class="or-item">集群冗余度</span>，在经过连丢数据后实在是不敢相信自己的运气了，一个副本不太妥，那就再来一个，一共3个</li><li><code>compression_level</code>: 数据压缩等级，我这里一方面大部分数据是备份存档，另一方面对读取性能要求也不高，因此设为最高的压缩等级。当然对已经压缩过的文件，进一步压缩通常收益有限，可以根据 CPU 与存储空间需求选择较低的压缩等级。</li><li><code>rpc_public_addr</code>: 该节点对其他节点宣称的自身<code>IP</code>地址，作为分布式储存节点，节点之间两两相互连接，可以看作是网状拓扑，这个<code>IP</code>地址需要能够被其他节点直接访问。显然，搞来这么多公网地址还是太奢侈了，我这里使用<code>tailscale</code>来进行虚拟组网，填写自身分配到的 IP</li></ol><blockquote><p>replication_factor = 3 表示对象最多保存 3 份副本。结合不同 Zone 的布局，可以提高节点故障时的数据可靠性；但它并不意味着任意情况下同时失效 2 个节点都能保证服务完全正常。</p></blockquote><p>如需要配置多个储存位置，可以参考<a href="https://garagehq.deuxfleurs.fr/documentation/operations/multi-hdd/">多硬盘支持</a></p><h4 id="部署"><a class="markdownIt-Anchor" href="#部署"></a> 部署</h4><div class="tag-plugin tabs" align="center" id="tab_9"><div class="nav-tabs"><div class="tab active"><a href="#tab_9-1">Docker</a></div><div class="tab"><a href="#tab_9-2">二进制文件</a></div><div class="tab"><a href="#tab_9-3">Windows</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_9-1"><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">garage:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">dxflrs/garage:v2.3.0</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">garage</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">"host"</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./garage_data/garage.toml:/etc/garage.toml</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./garage_data/meta:/var/lib/garage/meta</span> <span class="comment"># 存储元数据的目录 建议ssd</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./garage_data/data:/var/lib/garage/data</span> <span class="comment"># 存储对象数据块的目录 建议大容量硬盘</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shanghai</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">webui:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">khairul169/garage-webui:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">garage-webui</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./garage_data/garage.toml:/etc/garage.toml:ro</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">3909</span><span class="string">:3909</span> <span class="comment"># 第三方webui</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">API_BASE_URL:</span> <span class="string">"http://garage:3903"</span></span><br><span class="line">      <span class="attr">S3_ENDPOINT_URL:</span> <span class="string">"http://garage:3900"</span></span><br><span class="line">      <span class="comment"># 面板密码，使用 htpasswd -nbBC 10 "YOUR_USERNAME" "YOUR_PASSWORD" 生成</span></span><br><span class="line">      <span class="comment"># 注意，由于docker-compose会将所有 $ 符号展开为内部变量，所以$要改写成$$</span></span><br><span class="line">      <span class="attr">AUTH_USER_PASS:</span> <span class="string">"YOUR_USERNAME:$$2y$$10$$UX/dcbFO9QGVpv9gLn1doeD5OJtJ.g6l8YkFwdpBXN2rA9m3O2sQC"</span></span><br></pre></td></tr></tbody></table></figure><blockquote><ol><li>network_mode默认是bridge，在使用虚拟组网工具时可能存在问题</li><li>我只在一台节点上部署了webui作为“主节点”，其他节点可以去掉这部分</li></ol></blockquote><p>用以下别名来在宿主机中直接使用容器内garage实例</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> garage=<span class="string">"docker exec -ti garage /garage"</span></span><br></pre></td></tr></tbody></table></figure></div><div class="tab-pane" id="tab_9-2"><p>可以通过<a href="https://garagehq.deuxfleurs.fr/documentation/cookbook/binary-packages/">包管理器</a>获取，也可以直接<a href="https://git.deuxfleurs.fr/Deuxfleurs/garage/releases">下载二进制文件</a></p><p>随后可以通过<a href="https://garagehq.deuxfleurs.fr/documentation/cookbook/systemd/">systemd</a>持久化运行</p></div><div class="tab-pane" id="tab_9-3"><p>考虑到小主机内存空间比较小，<code>WSL2</code>会在后台启动一个有真正的<code>Linux</code>内核的虚拟机，比较占用性能，同时，WSL2 在访问宿主机硬盘时是通过基于网络的<a href="https://blog.csdn.net/ProceNest/article/details/154874122">9P协议</a>来访问的。在访问小文件时效率不行。并且在我这里，元数据跟储存是不在同一个盘上，也不好直接放在内置的虚拟硬盘镜像内，故采用<code>WSL1</code>来运行</p><blockquote><p><code>WSL1</code>不是真正的Linux，简单来说，它是一个兼容层，将程序运行时调用的<code>Linux</code>系统调用转译为适用于<code>Windows NT</code>内核上的。</p></blockquote><div class="tag-plugin colorful folders"><details class="folder" index="0"><summary><p>没装WSL先装下</p></summary><div class="body"><figure class="highlight bash"><figcaption><span>powershell</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart</span><br></pre></td></tr></tbody></table></figure></div></details></div><p>重启后，设置默认版本为WSL1</p><figure class="highlight bash"><figcaption><span>powershell</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wsl --set-default-version 1</span><br></pre></td></tr></tbody></table></figure><p>随后在微软商店搜索喜欢的发行版下载，我这里选择<code>Debian</code></p><p>其他的像更换软件源的操作就不重复了</p><p>安装大体上与在 Linux 上使用二进制发行一致，部分区别如下：</p><ol><li>WSL1不支持使用<code>systemd</code>管理服务，因此需要在<code>Windows</code>下开机自动唤醒<code>WSL</code>并在里面启动<code>Garage</code>。</li><li>WSL内Windows文件路径会被挂载到<code>/mnt/{盘符}</code>下，根据需要配置合适路径</li></ol><p>Windows下常用NSSM来注册应用为服务，但我尝试了很多次，使用System账户登陆时无法使用，指定以普通用户登陆又一直提醒“账户密码错误”，索性改用Windows的任务计划程序。</p><blockquote><p>Windows下服务由服务控制管理器管理，通过服务控制接口与Windows服务程序交互，对于没有实现这类接口的普通应用程序，NSSM可作为中介来响应并控制程序行为</p></blockquote><p>先将启动参数保存到一个sh脚本里，随后可以通过<code>wsl.exe -d Debian -u root -- /mnt/c/garage/start-garage.sh</code>来以root身份执行。在任务计划程序里添加一个启动时执行的任务</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:927/305;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234727907.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234727907.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234727907.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1442/959;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234800794.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234800794.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234800794.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:892/1001;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234909624.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234909624.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260826234909624.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>然后不出意外就又出意外了，保存时也是一直提示密码错误，不得不感叹Windows的账户机制之精妙<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/bili_tv/流汗.webp"></span><br>我这里使用管理员权限用命令创建任务</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 操作：执行 WSL 脚本</span></span><br><span class="line"><span class="variable">$action</span> = New-ScheduledTaskAction -Execute <span class="string">"wsl.exe"</span> -Argument <span class="string">"-d Debian -u root -- /mnt/c/garage/start-garage.sh"</span></span><br><span class="line"><span class="comment"># 触发器：计算机启动时运行</span></span><br><span class="line"><span class="variable">$trigger</span> = New-ScheduledTaskTrigger -AtStartup</span><br><span class="line"><span class="comment"># 定义安全设置：使用 S4U 模式实现无需登录即可运行，并开启最高权限</span></span><br><span class="line"><span class="variable">$principal</span> = New-ScheduledTaskPrincipal -UserId <span class="string">"thun888"</span> -LogonType S4U -RunLevel Highest</span><br><span class="line"><span class="comment"># 注册任务</span></span><br><span class="line">Register-ScheduledTask -TaskName <span class="string">"GarageService"</span> -Action <span class="variable">$action</span> -Trigger <span class="variable">$trigger</span> -Principal <span class="variable">$principal</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight sh"><figcaption><span>/mnt/c/garage/start-garage.sh</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">export</span> LANG=C.UTF-8</span><br><span class="line"><span class="built_in">export</span> LC_ALL=C.UTF-8</span><br><span class="line"><span class="built_in">export</span> NO_COLOR=1</span><br><span class="line"><span class="built_in">export</span> RUST_LOG_STYLE=never</span><br><span class="line"><span class="built_in">export</span> TERM=dumb</span><br><span class="line"></span><br><span class="line"><span class="built_in">exec</span> /mnt/c/garage/garage server &gt;&gt; /mnt/c/garage/garage.log 2&gt;&amp;1</span><br></pre></td></tr></tbody></table></figure></div></div></div><h4 id="配置反向代理"><a class="markdownIt-Anchor" href="#配置反向代理"></a> 配置反向代理</h4><p>参考：<a href="https://keke.su/posts/2026-01-25-new-1.html#%E6%94%B6%E5%B0%BE%E5%B7%A5%E4%BD%9C">快速搭建&amp;迁移S3 —— 手把手教你从MinIO迁移到Garage</a></p><p>可能用的上的：</p><figure class="highlight nginx"><figcaption><span>允许所有来源访问</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Origin *;</span><br><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Methods *;</span><br><span class="line"><span class="attribute">add_header</span> Access-Control-Allow-Headers *;</span><br></pre></td></tr></tbody></table></figure><h3 id="管理"><a class="markdownIt-Anchor" href="#管理"></a> 管理</h3><h3 id="添加新节点"><a class="markdownIt-Anchor" href="#添加新节点"></a> 添加新节点</h3><p>如果部署了webui，可以使用你设定的面板账密登录<code>http://{服务器ip}:3909</code>，切换到<code>Cluster</code>页面，并点击<code>Connect</code>连接其他节点</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2549/1352;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231637084.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231637084.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231637084.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>面板提供了获取其他节点ID的命令，如果是Docker部署的可以直接运行。二进制方式部署的可以运行<code>garage node id</code></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1659/457;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231948038.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231948038.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260827231948038.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin colorful note" color="cyan"><div class="title"><strong><p>Tip</p></strong></div><div class="body"><p><code>webui</code>中的<code>node id</code>不严谨。<code>garage node id</code>输出为<code>node_id_hex@ip:port</code>，整体为该节点的连接参数，<code>node_id</code>是节点初始化时生成的<code>Ed25519</code>公钥（<code>meta/node_key.pub</code>），编码为十六进制后输出，可以通过<code>cat meta/node_key.pub | od -A n -t x1 | tr -d ' \n'</code>查看</p><p>这里，应填写这个整体，或者直接使用命令行<code>garage [-c &lt;config file path&gt;] node connect &lt;node_id_hex@ip:port&gt;</code></p></div></div><p>在任意节点添加新节点后，新节点信息会被广播到其他节点，不需要在其他节点重复操作</p><h3 id="配置储存池"><a class="markdownIt-Anchor" href="#配置储存池"></a> 配置储存池</h3><p>选中某节点，为其分配角色</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1570/891;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161307817.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161307817.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161307817.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>角色包括节点的<code>Zone</code>（区域）、<code>Capacity</code>（容量）和 <code>Tags</code>（标签）</p><p>标签仅用于标识，主要是区域，相同区域内的节点会视为同一个储存池，数据不会在这里面的节点上复制多份。我这里5个节点都在不同区域。</p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:930/863;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161625037.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161625037.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828161625037.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><p>在完成配置后应用</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1548/327;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828164403925.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828164403925.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828164403925.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>配置完成后会输出集群状态，可见该集群有400GiB+的可用空间</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">aaa@aaa:/<span class="comment"># garage stats</span></span><br><span class="line">...</span><br><span class="line">==== CLUSTER STATISTICS ====</span><br><span class="line">Storage nodes:</span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">Estimated available storage space cluster-wide (might be lower <span class="keyword">in</span> practice):</span><br><span class="line">  data: 437.1 GiB</span><br><span class="line">  metadata: 16.1 GiB</span><br></pre></td></tr></tbody></table></figure><h3 id="创建存储桶和key"><a class="markdownIt-Anchor" href="#创建存储桶和key"></a> 创建存储桶和Key</h3><p>名字随意，后续更名可以添加一个Alias（别称）再删掉原来的</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>等价于<code>garage key create &lt;name&gt;</code>，</p><blockquote><p>默认不含创建存储桶权限，需使用<code>garage key allow &lt;name&gt; --create-bucket</code>赋予权限（使用<code>garage key deny &lt;name&gt; --create-bucket</code> 撤销权限）</p></blockquote>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2059/939;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828231937105.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828231937105.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828231937105.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>等价于<code>garage bucket create &lt;name&gt;</code></p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2021/877;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232005970.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232005970.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232005970.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>在创建的存储桶里为刚才创建的key赋予权限</p><blockquote><p><code>owner</code>权限可以管理桶，比如删除桶操作，小心使用</p></blockquote><p>等价于<code>garage bucket allow &lt;bucket-name&gt; --key &lt;key-name&gt; --read --write --owner</code></p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2050/738;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232049023.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232049023.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260828232049023.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><h2 id="外围应用"><a class="markdownIt-Anchor" href="#外围应用"></a> 外围应用</h2><p>作为一个 S3 储存服务，它可以接入到大多数软件中。可以分为两部分：</p><ol><li>原生支持 S3 标准的软件</li><li>不支持 S3 标准的软件，其需要使用别的服务进行中转，转成 <code>WebDAV</code> 或别的协议</li></ol><h3 id="图片储存及管理"><a class="markdownIt-Anchor" href="#图片储存及管理"></a> 图片储存及管理</h3><h4 id="图床"><a class="markdownIt-Anchor" href="#图床"></a> 图床</h4><p>过去我一直使用<a href="https://github.com/lsky-org/lsky-pro">兰空图床(Lsky Pro)</a>上传图片和管理图片，但它的开源版本已经好久没有更新了。安装起来也麻烦，挑<code>PHP</code>版本，又要挑数据库版本。放到今天性能也算不上多优秀。</p><p>本来我是想着直接改一下<a href="https://github.com/GoodBoyboy666/perfect-pic">GoodBoyboy666/perfect-pic</a>用的，实现一些更契合我文件格式转换的链接格式，可仔细一想，我需要的只是一个上传工具，没必要非得用在线形式，<del>跨平台兼容性</del>，干脆就用<a href="https://picgo.app/">PicGo</a>了</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1991/1127;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901201548414.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901201548414.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901201548414.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><blockquote><p>太久没用了，装下来发现样式变化好大<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatshocked.png"></span></p></blockquote><p>直接在插件商店里安装 S3，或者在插件目录手动执行 <code>npm install picgo-plugin-s3</code></p><p>随后按照图中所示配置</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2007/1135;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222259288.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222259288.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222259288.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2007/1135;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222309459.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222309459.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260930222309459.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><h4 id="chronoframe"><a class="markdownIt-Anchor" href="#chronoframe"></a> Chronoframe</h4><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>早就想搞相册了，但一直没有合适的存储后端就没搞，直接这样配置就行。</p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:651/1491;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901200056105.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901200056105.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260901200056105.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><h4 id="artalk-评论"><a class="markdownIt-Anchor" href="#artalk-评论"></a> Artalk 评论</h4><p><code>Artalk</code>使用<a href="https://github.com/pluveto/upgit">upgit</a>作为外置的上传器</p><p>安装<code>upgit</code></p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载本体</span></span><br><span class="line">wget https://github.com/pluveto/upgit/releases/download/v0.2.25/upgit_linux_amd64</span><br><span class="line"><span class="built_in">mv</span> upgit_linux_amd64 /usr/bin/upgit</span><br><span class="line"><span class="built_in">chmod</span> +x /usr/bin/upgit</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载配置</span></span><br><span class="line">curl https://github.com/pluveto/upgit/raw/refs/heads/main/config.sample.zh-CN.toml -o /usr/bin/config.toml</span><br></pre></td></tr></tbody></table></figure><p>配置：</p><figure class="highlight toml"><figcaption><span>/usr/bin/config.toml</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">default_uploader</span> = <span class="string">"s3"</span></span><br><span class="line"><span class="attr">rename</span> = <span class="string">"images/{year}/{month}/{unix_ts}{ext}"</span></span><br><span class="line"></span><br><span class="line"><span class="section">[uploaders.s3]</span></span><br><span class="line"><span class="attr">region</span> = <span class="string">"garage"</span></span><br><span class="line"><span class="attr">bucket_name</span> = <span class="string">"artalk"</span></span><br><span class="line"><span class="attr">access_key</span> = <span class="string">"xxx"</span></span><br><span class="line"><span class="attr">secret_key</span> = <span class="string">"xxxxxx"</span></span><br><span class="line"><span class="attr">endpoint</span> = <span class="string">"https://s3.api.hzchu.top"</span></span><br><span class="line"><span class="attr">url_format</span> = <span class="string">"https://gate.assets.hzchu.top/fs/garage-artalk/public/{path}@!comment"</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p><code>url_format</code>指的是输出链接格式，我这里是接入了其他服务。按照刚刚的配置，应填写为<code>https://artalk.oss.hzchu.top/{path}</code></p></blockquote><p>测试上传</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">upgit --application-path /upgit_data --config-file /usr/bin/config.toml 1.png</span><br></pre></td></tr></tbody></table></figure><blockquote><p><code>application-path</code>是相对于当前运行目录的，用于存放历史和日志文件</p></blockquote><p>Artalk里：<code>upgit -c /usr/bin/config.toml --application-path /data</code></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1737/946;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260830225435070.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260830225435070.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/08/20260830225435070.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><h3 id="文件储存"><a class="markdownIt-Anchor" href="#文件储存"></a> 文件储存</h3><h4 id="文件管理"><a class="markdownIt-Anchor" href="#文件管理"></a> 文件管理</h4><p>可以使用<a href="https://s3browser.com/">S3 browser</a></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2062/1167;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001160607507.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001160607507.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001160607507.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><h4 id="中转成webdav协议"><a class="markdownIt-Anchor" href="#中转成webdav协议"></a> 中转成WebDav协议</h4><p><code>WebDav</code>主要用来备份，以往使用<a href="https://github.com/OpenListTeam/OpenList">OpenList</a>的时候是直接在根目录新建一个文件夹，以待备份的程序命名，再在程序里填写用户信息和备份路径</p><p>但是很麻烦的一点是，我要为每个程序都去新建文件夹，有的时候程序还不支持配置备份路径。再者说，这么多程序共用一个用户，其实还是不太安全的。</p><p>所以我希望的一点是能够创建多个用户，用户的用户名就以这个程序来命名，每个用户有自己的储存目录，且彼此不可见。这样子即便不支持调整路径的应用，也可以被正确储存到对应的分类中</p><p>官方用的是<a href="https://git.deuxfleurs.fr/Deuxfleurs/bagage">Bagage</a>，但好久没更新了，<a href="https://github.com/OpenListTeam/OpenList">OpenList</a>又太重了，干脆替换成<a href="https://github.com/drakkan/sftpgo">drakkan/sftpgo</a></p><p>使用Docker部署</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">sftpgo:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">drakkan/sftpgo:v2.7.5</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">sftpgo</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"6180:8080"</span>   <span class="comment"># WebAdmin</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"6181:6181"</span>   <span class="comment"># WebDAV</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./data:/srv/sftpgo</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./config:/var/lib/sftpgo</span></span><br><span class="line"></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="attr">SFTPGO_WEBDAVD__BINDINGS__0__PORT:</span> <span class="string">"6181"</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 禁用 FTP</span></span><br><span class="line">      <span class="attr">SFTPGO_FTPD__BINDINGS__0__PORT:</span> <span class="string">"-1"</span></span><br><span class="line"></span><br><span class="line">      <span class="comment"># 禁用 SFTP</span></span><br><span class="line">      <span class="attr">SFTPGO_SFTPD__BINDINGS__0__PORT:</span> <span class="string">"-1"</span></span><br><span class="line">    <span class="comment"># 指向本机，通过它访问本机garage实例</span></span><br><span class="line">    <span class="attr">extra_hosts:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">"host.docker.internal:host-gateway"</span></span><br></pre></td></tr></tbody></table></figure><p>创建虚拟文件夹</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1907/564;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163826495.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163826495.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163826495.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1508/763;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163915961.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163915961.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163915961.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1515/197;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163920840.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163920840.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001163920840.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>最主要是<code>Key Prefix</code>，这里配置为<code>%username%/</code>，为每个用户储存的文件都添上它所属用户名的前缀，也就是实现了上文提到的分类和隔离</p><p>接着是创建用户组，并配置虚拟文件夹</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1519/457;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001164225270.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001164225270.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261001164225270.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>前者为挂载路径，后者为对应的文件夹，这里直接挂载到根目录</p><p>随后再创建用户，添加到刚才新建的组里</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261002120641448.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261002120641448.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/10/20261002120641448.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><blockquote><p>创建用户时也可以配置用户级的虚拟文件夹，但不支持<code>%username%</code>占位符</p></blockquote><p>至于<code>File system</code>，在挂载根目录以后，就不会再往默认的本地磁盘储存写入文件了，不用管</p><h2 id="维护"><a class="markdownIt-Anchor" href="#维护"></a> 维护</h2><p>更多参考<a href="https://garagehq.deuxfleurs.fr/documentation/operations/">官方文档</a></p><h3 id="元数据存储空间"><a class="markdownIt-Anchor" href="#元数据存储空间"></a> 元数据存储空间</h3><p>在线页面看到的只有<code>data_dir</code>的可用空间，但是在实际部署时元数据储存位置通常放在速度更快的SSD上，如果容量较小的话还是要注意下的。以下输出表明 <code>47.5GiB</code> 空间里还有 <code>13.2 GiB</code> 空间可用，剩余 <code>27.8%</code> 的空间</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">aaa@aaa:~<span class="comment"># garage stats</span></span><br><span class="line">...</span><br><span class="line">==== CLUSTER STATISTICS ====</span><br><span class="line">Storage nodes:</span><br><span class="line">  ID                Hostname        Zone         Capacity   Part.  DataAvail</span><br><span class="line">  2676a67bbb3d346e  0654d8408568    home         326.0 GiB  209    432.0 GiB/457.4 GiB (94.4%)  13.2 GiB/47.5 GiB (27.8%)</span><br><span class="line">...</span><br></pre></td></tr></tbody></table></figure><h3 id="修改集群冗余度"><a class="markdownIt-Anchor" href="#修改集群冗余度"></a> 修改集群冗余度</h3><p>如果在集群初始化后想修改集群冗余度，需要清除所有节点的拓扑结构</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 关闭garage，其他方式部署的自行关闭</span></span><br><span class="line">systemctl stop garage</span><br><span class="line"><span class="comment"># 进入你配置的元数据目录</span></span><br><span class="line"><span class="built_in">cd</span> /var/lib/garage/meta  <span class="comment"># 替换为你的真实路径</span></span><br><span class="line"><span class="built_in">mv</span> cluster_layout cluster_layout_bak <span class="comment"># 备份</span></span><br></pre></td></tr></tbody></table></figure><blockquote><p>清除拓扑结构不会丢失文件，但最好做好备份</p></blockquote><p>随后修改<code>config.toml</code>里的<code>replication_factor</code>为想要的数值</p><p>启动各个节点，重新为节点分配角色、容量和区域</p>]]>
    </content>
    <id>https://blog.hzchu.top/2026/garage/</id>
    <link href="https://blog.hzchu.top/2026/garage/"/>
    <published>2026-10-02T11:31:13.000Z</published>
    <summary>从 OneDrive 搬家到 Garage</summary>
    <title>搭建Garage储存集群</title>
    <updated>2026-10-02T11:31:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>thun888</name>
    </author>
    <category term="技术类" scheme="https://blog.hzchu.top/categories/%E6%8A%80%E6%9C%AF%E7%B1%BB/"/>
    <category term="学校" scheme="https://blog.hzchu.top/tags/%E5%AD%A6%E6%A0%A1/"/>
    <category term="linux" scheme="https://blog.hzchu.top/tags/linux/"/>
    <content>
      <![CDATA[<h2 id="背景"><a class="markdownIt-Anchor" href="#背景"></a> 背景</h2><p>实验室里用的路由器是千兆的，但也仅限于有线，无线大概极限在四百兆，导致在传送数据时部分损坏。</p><p>损坏还是有点难绷的。丢几张还是小事，但因为我偷懒没写错误处理，后端直接崩了，队列里压了两百多个任务，某对应该一一对应的ID直接相差出200+<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatcomftears.png"></span></p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>处理完问题后，我在想能不能搞个更快的网路，现在的情况下千兆也是勉强够用，保底2.5g才能满足要求，正好在<span class="annotated" data-tippy-content="其实是里面只剩这个，学长太狠了">旁边工控机拆出来一块万兆网卡</span>，那就用它来负责单独一路传输吧</p><blockquote><p>当时没拍全貌，芯片如图</p></blockquote>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1536/1651;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/IMG_20260314_110117_1773557114515edit-69b655c7aac1b.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/IMG_20260314_110117_1773557114515edit-69b655c7aac1b.jpg@!normal" alt="芯片" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="芯片" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/IMG_20260314_110117_1773557114515edit-69b655c7aac1b.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">芯片</span></div></div>    </div>    </div><h2 id="需求"><a class="markdownIt-Anchor" href="#需求"></a> 需求</h2><ol><li>Linux上使用：服务器系统是Ubuntu</li><li>自动分配IP：即插即用，不要手动设置</li></ol><h2 id="安装"><a class="markdownIt-Anchor" href="#安装"></a> 安装</h2><h3 id="windows"><a class="markdownIt-Anchor" href="#windows"></a> Windows</h3><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>Linux下我想都不用想绝对比Windows下麻烦，而且也不清楚好坏，所以先用Windows试了下，在<a href="https://cn.lekuo.com/list.php?pid=2&amp;ty=10">官网</a>下载驱动（9710）直接安装即可</p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1080/1920;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/image-69b6576ac3417.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/image-69b6576ac3417.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/03/image-69b6576ac3417.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    </div><h3 id="linux"><a class="markdownIt-Anchor" href="#linux"></a> Linux</h3><p>刚刚下载的压缩包里有linux的驱动，理论上来说直接编译安装就行了，但问题是这个古董驱动适配的内核范围在<code>2.6.32 - 4.15</code>，服务器上是<code>6.18</code>，一番搜索后找到了<a href="https://github.com/acooks/tn40xx-driver">acooks/tn40xx-driver</a></p><p>运行以下命令来安装。</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 卸载旧驱动，可选</span></span><br><span class="line">sudo rmmod tn40xx</span><br><span class="line"><span class="comment"># 清除清除构建缓存</span></span><br><span class="line">sudo make clean</span><br><span class="line"><span class="comment"># 编译，且指定内置该物理层芯片的固件</span></span><br><span class="line">sudo make MV88X3310=YES -j$(<span class="built_in">nproc</span>)</span><br><span class="line"><span class="comment"># 安装</span></span><br><span class="line">sudo make install</span><br><span class="line"><span class="comment"># 更新模块依赖并加载驱动</span></span><br><span class="line">sudo depmod -a</span><br><span class="line">sudo modprobe tn40xx</span><br></pre></td></tr></tbody></table></figure><p>在加载内核以后，可以通过<code>sudo dmesg | grep -C 5 "tn40xx"</code>来查询系统日志</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:754/168;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df2eb73e76e.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df2eb73e76e.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df2eb73e76e.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>发现弹出了<code>PHY init failed</code>。等等，什么是<code>PHY</code>？<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatneutral.png"></span></p><p><code>PHY</code>是<code>Physical Layer</code>的缩写，相对应的还有<code>MAC</code>(<span class="annotated" data-tippy-content="Media Access Control Layer 介质访问控制层，属于OSI模型中数据链路层下层子层">Media Access Control</span>)，控制器。两者功能不同，同时还有发热量不同、电路性质不同等因素，故在工程上是模块化的。而为了可以热修复bug，物理层芯片的固件是没有固化在内部的，需要由驱动推流给芯片</p><p>而现在安装的这个驱动程序正是控制器的驱动程序，装上驱动后，电脑知道如何与控制器沟通，但控制器不知道为物理层芯片提供什么固件，导致出现这个问题</p><p>看了一眼旧驱动的<code>Readme</code>，里面有提到了这部分内容</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">Special notes for Marvell PHYs:</span><br><span class="line">===============================</span><br><span class="line">This driver package does not include Marvell PHY firmware files. If you own a TN9210 or TN9710 NIC based on Marvell PHY, you will need to obtain the firmware file in .hdr format prior to compiling this driver</span><br><span class="line"></span><br><span class="line">For TN9210 (DeviceID 4024) please extract the file 88X3140-FW-R02-06-03.hdr from 88X3140-FW-R02-06-03.zip</span><br><span class="line">For TN9710P (DeviceID 4027) please obtain the file x3310fw_0_3_3_0_9374.hdr</span><br><span class="line">For TN9710Q (DeviceID 4527) please obtain the file e2010fw_0_3_3_0_9374.hdr</span><br><span class="line"></span><br><span class="line">If you are missing these exact files, the driver will compile without support for these PHYs</span><br><span class="line"></span><br><span class="line">        ********************************* Important ***************************************</span><br><span class="line">        xxd is required for compiling TN9210 and TN9710 drivers. On some distributions such as Fedora, it is not installed by default and build will fail. Please make sure xxd is installed prior to building the driver</span><br><span class="line">        ***********************************************************************************</span><br></pre></td></tr></tbody></table></figure><p>估计是版权问题，这破驱动也太不省心了，上哪去找这个老古董的hdr(Header File)<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>啊</p><p>不过好在有大佬提供了这些文件：<a href="https://github.com/acooks/tn40xx-driver/issues/3">Problem with .hdr file versions · Issue #3 · acooks/tn40xx-driver</a>，我下载了<code>x3310fw_0_3_10_0_10860.hdr</code>这个版本，同时也有大佬提供了一个解包<code>Windows</code>驱动程序来得到固件的<a href="https://github.com/acooks/tn40xx-driver/issues/3#issuecomment-869197855">程序</a>，<del>我顺便也提取了一份9374版本的，但文件丢了🥲</del></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2087/885;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_15-32-18-69df3580b69ac.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_15-32-18-69df3580b69ac.jpg@!normal" alt="提取" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="提取" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_15-32-18-69df3580b69ac.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">提取</span></div></div><p>放置到驱动程序同级目录下，调整<code>Makefile</code>里面的路径变量，随后再执行编译</p><figure class="highlight diff"><figcaption><span>Makefile:27</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">- MV88X3310_HDR := x3310fw_0_3_4_0_9445.hdr</span></span><br><span class="line"><span class="addition">+ MV88X3310_HDR := x3310fw_0_3_10_0_10860.hdr</span></span><br></pre></td></tr></tbody></table></figure><p>重新下载驱动以后，发现还不行。那只能看一下是不是它驱动本身有问题了，在代码里定位到物理层的初始化函数</p><figure class="highlight c"><figcaption><span>tn40.c</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="keyword">enum</span> PHY_TYPE <span class="title function_">bdx_phy_init</span><span class="params">(<span class="keyword">struct</span> bdx_priv *priv)</span></span><br><span class="line">{</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">pci_dev</span> *<span class="title">pdev</span> =</span> priv-&gt;pdev;</span><br><span class="line"><span class="class"><span class="keyword">enum</span> <span class="title">PHY_TYPE</span> <span class="title">phy_type</span>;</span></span><br><span class="line">u32 phy_id;</span><br><span class="line"><span class="type">char</span> *desc;</span><br><span class="line"></span><br><span class="line">phy_type =</span><br><span class="line">    bdx_get_phy_by_id(pdev-&gt;vendor, pdev-&gt;device,</span><br><span class="line">      pdev-&gt;subsystem_device);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (phy_type == PHY_TYPE_NA)</span><br><span class="line"><span class="keyword">return</span> PHY_TYPE_NA;<span class="comment">/* NIC definition has no PHY. */</span></span><br><span class="line"></span><br><span class="line">bdx_mdio_set_speed(priv-&gt;pBdxRegs, MDIO_SPEED_1MHZ);</span><br><span class="line"></span><br><span class="line">phy_id = bdx_mdio_scan_phy_id(priv);<span class="comment">/* set phy_mdio_port */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!priv-&gt;phy_mdio_port)</span><br><span class="line"><span class="keyword">return</span> PHY_TYPE_NA;<span class="comment">/* No PHY detected on MDIO bus. */</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* register the PHY-specific callbacks */</span></span><br><span class="line">priv-&gt;phy_type = bdx_phy_register(priv, phy_id, &amp;desc);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (priv-&gt;phy_type == PHY_TYPE_NA) {</span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev, <span class="string">"Unsupported PHY ID=%X"</span>, phy_id);</span><br><span class="line"><span class="keyword">return</span> PHY_TYPE_NA;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (phy_type != priv-&gt;phy_type)</span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev,</span><br><span class="line"> <span class="string">"SVID PHY type %u; MDIO scan Found %u\n"</span>, phy_type,</span><br><span class="line"> priv-&gt;phy_type);</span><br><span class="line"></span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev, <span class="string">"PHY detected ID=%X - %s\n"</span>, phy_id, desc);</span><br><span class="line"></span><br><span class="line">bdx_mdio_set_speed(priv-&gt;pBdxRegs, priv-&gt;phy_ops.mdio_speed);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (priv-&gt;phy_ops.mdio_reset(priv, <span class="number">1</span>, priv-&gt;phy_type))</span><br><span class="line"><span class="keyword">return</span> PHY_TYPE_NA;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> phy_type;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>可以看出来，初始化时分为多个阶段。首先根据<code>PCI信息</code>来获取<code>phy_type</code>，然后扫描<code>MDIO</code>总线<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>获取与芯片型号对应的<code>phy_id</code>，随后根据<code>phy_id</code>再次查表来确定<code>phy_type</code>对不对的上，最后发送复位请求。整个流程有多处判断是否正常，若不正常则返回<code>PHY_TYPE_NA</code>，故可以以此判断究竟是在哪一步出的问题</p><p>考虑到搭一个完整的调试环境时间成本太大了，我直接代码里插了几行<code>pr_info</code>打印输出调试信息</p><figure class="highlight diff"><figcaption><span>tn40.c</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">static u32 bdx_mdio_scan_phy_id(struct bdx_priv *priv)</span><br><span class="line">{</span><br><span class="line">int i;</span><br><span class="line">u16 phy_id_hi, phy_id_lo;</span><br><span class="line">u16 phy_id_addr_hi = 0x0002;</span><br><span class="line">u16 phy_id_addr_lo = 0x0003;</span><br><span class="line"></span><br><span class="line">for (i = 0; i &lt; 32; i++) {</span><br><span class="line">phy_id_hi = bdx_mdio_read(priv, 1, i, phy_id_addr_hi);</span><br><span class="line"><span class="addition">+   pr_info("MDIO SCAN: addr %d, read value: 0x%04x\n", i, phy_id_hi);</span></span><br><span class="line">if (phy_id_hi != 0xFFFF &amp;&amp; phy_id_hi != 0) {</span><br><span class="line">phy_id_lo = bdx_mdio_read(priv, 1, i, phy_id_addr_lo);</span><br><span class="line"><span class="addition">+   pr_info("FOUND PHY at addr %d: HI=0x%04x, LO=0x%04x\n", i, phy_id_hi, phy_id_lo);</span></span><br><span class="line">break;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">msleep(10);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">if (i == 32) {</span><br><span class="line">dev_err(&amp;priv-&gt;pdev-&gt;dev, "no PHY found\n");</span><br><span class="line">return 0;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">priv-&gt;phy_mdio_port = i;</span><br><span class="line"></span><br><span class="line">return phy_id_hi &lt;&lt; 16 | phy_id_lo;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>日志如下：</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[ 2316.710987] tn40xx: Driver unloaded</span><br><span class="line">[ 2322.327862] tn40xx: Tehuti Network Driver from https://github.com/acooks/tn40xx-driver, linux-6.7.y-1</span><br><span class="line">[ 2322.327866] tn40xx: Supported phys :  MV88X3310      </span><br><span class="line">[ 2322.328082] tn40xx 0000:07:00.0: srom 0x0 HWver 16 build 0 lane# 4 max_pl 0x1 mrrs 0x2</span><br><span class="line">[ 2322.436830] tn40xx: MDIO SCAN: addr 0, read value: 0x002b</span><br><span class="line">[ 2322.436990] tn40xx: FOUND PHY at addr 0: HI=0x002b, LO=0x09ab</span><br><span class="line">[ 2322.436998] tn40xx 0000:07:00.0: PHY init failed</span><br></pre></td></tr></tbody></table></figure><p>可以看到，能够正常扫描到物理层芯片，且<code>MDIO</code>总线物理地址是&nbsp;<code>0</code></p><p>那不是巧了吗，<code>bdx_phy_init</code>里有一行<code>if (!priv-&gt;phy_mdio_port)</code>，直接就把这个当成错误处理掉了。而根据<a href="https://ieeexplore.ieee.org/document/9844436">IEEE 802.3 标准</a>，<code>MDIO</code>总线的<code>PHY</code>地址段是&nbsp;<code>0 - 31</code>，<code>0</code>是一个合法的地址<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>。源代码在遍历32个地址仍然找不到<code>PHY</code>时，会将地址置为<code>0</code>，相当于非<code>0</code>才正常。旧驱动中的实现是置为<code>-1</code>，在初始化时判断地址是否大于等于<code>0</code>。</p><div class="tag-plugin colorful folders"><details class="folder" index="0"><summary><p>旧驱动</p></summary><div class="body"><figure class="highlight c"><figcaption><span>tn40.c</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="title function_">bdx_mdio_look_for_phy</span><span class="params">(<span class="keyword">struct</span> bdx_priv *priv, <span class="type">int</span> port)</span></span><br><span class="line">{</span><br><span class="line">    <span class="type">int</span> phy_id, i;</span><br><span class="line">    <span class="type">int</span> rVal = <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line">    i=port;</span><br><span class="line">    setMDIOSpeed(priv, MDIO_SPEED_1MHZ);</span><br><span class="line"></span><br><span class="line">    phy_id = bdx_mdio_read(priv, <span class="number">1</span>, i, <span class="number">0x0002</span>); <span class="comment">// PHY_ID_HIGH</span></span><br><span class="line">    phy_id &amp;=<span class="number">0xFFFF</span>;</span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="number">32</span>; i++)</span><br><span class="line">{</span><br><span class="line">msleep(<span class="number">10</span>);</span><br><span class="line">DBG(<span class="string">"LOOK FOR PHY: port=0x%x\n"</span>,i);</span><br><span class="line">phy_id  = bdx_mdio_read(priv, <span class="number">1</span>, i, <span class="number">0x0002</span>); <span class="comment">// PHY_ID_HIGH</span></span><br><span class="line">phy_id &amp;=<span class="number">0xFFFF</span>;</span><br><span class="line"><span class="keyword">if</span> (phy_id!=<span class="number">0xFFFF</span> &amp;&amp; phy_id!= <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">rVal = i;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">    <span class="keyword">if</span> (rVal == <span class="number">-1</span>)</span><br><span class="line">    {</span><br><span class="line">    ERR(<span class="string">"PHY not found\n"</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> rVal;</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">...省略...</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">int</span> __init <span class="title function_">bdx_mdio_phy_search</span><span class="params">(<span class="keyword">struct</span> bdx_priv *priv, <span class="type">void</span> __iomem * regs, <span class="type">int</span> *<span class="type">port_t</span>, <span class="type">unsigned</span>  <span class="type">short</span> *<span class="type">phy_t</span>)</span></span><br><span class="line">{</span><br><span class="line">    <span class="type">int</span> i, phy_id;</span><br><span class="line">    <span class="type">char</span> *s;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (bdx_force_no_phy_mode)</span><br><span class="line">    {</span><br><span class="line">    ERR(<span class="string">"Forced NO PHY mode\n"</span>);</span><br><span class="line">    i = <span class="number">0</span>;</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    {</span><br><span class="line">    i = bdx_mdio_look_for_phy(priv,*<span class="type">port_t</span>);</span><br><span class="line"><span class="keyword">if</span> (i &gt;= <span class="number">0</span>)  <span class="comment">// PHY  found</span></span><br><span class="line">{</span><br><span class="line">*<span class="type">port_t</span> = i;</span><br><span class="line">phy_id  = bdx_mdio_read(priv, <span class="number">1</span>, *<span class="type">port_t</span>, <span class="number">0x0002</span>); <span class="comment">// PHY_ID_HI</span></span><br><span class="line">i       = phy_id &lt;&lt; <span class="number">16</span>;</span><br><span class="line">phy_id  = bdx_mdio_read(priv, <span class="number">1</span>, *<span class="type">port_t</span>, <span class="number">0x0003</span>); <span class="comment">// PHY_ID_LOW</span></span><br><span class="line">phy_id &amp;=<span class="number">0xFFFF</span>;</span><br><span class="line">i      |= phy_id;</span><br><span class="line">}</span><br><span class="line">    }</span><br><span class="line">    ...</span><br></pre></td></tr></tbody></table></figure></div></details></div><p>同时，下面还有一行<code>if (priv-&gt;phy_ops.mdio_reset(priv, 1, priv-&gt;phy_type))</code>，写死了向地址<code>1</code>发送复位请求，也是离谱，改成<code>if (priv-&gt;phy_ops.mdio_reset(priv, priv-&gt;phy_mdio_port, priv-&gt;phy_type))</code></p><div class="tag-plugin colorful folders"><details class="folder" index="0"><summary><p>完整更改</p></summary><div class="body"><figure class="highlight diff"><figcaption><span>tn40.c</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br></pre></td><td class="code"><pre><span class="line">static u32 bdx_mdio_scan_phy_id(struct bdx_priv *priv)</span><br><span class="line">{</span><br><span class="line">int i;</span><br><span class="line">u16 phy_id_hi, phy_id_lo;</span><br><span class="line">u16 phy_id_addr_hi = 0x0002;</span><br><span class="line">u16 phy_id_addr_lo = 0x0003;</span><br><span class="line"></span><br><span class="line">for (i = 0; i &lt; 32; i++) {</span><br><span class="line">phy_id_hi = bdx_mdio_read(priv, 1, i, phy_id_addr_hi);</span><br><span class="line">if (phy_id_hi != 0xFFFF &amp;&amp; phy_id_hi != 0) {</span><br><span class="line">phy_id_lo = bdx_mdio_read(priv, 1, i, phy_id_addr_lo);</span><br><span class="line">break;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">msleep(10);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">if (i == 32) {</span><br><span class="line">dev_err(&amp;priv-&gt;pdev-&gt;dev, "no PHY found\n");</span><br><span class="line"><span class="deletion">-   return 0;</span></span><br><span class="line"><span class="addition">+   return -1;</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">priv-&gt;phy_mdio_port = i;</span><br><span class="line"></span><br><span class="line">return phy_id_hi &lt;&lt; 16 | phy_id_lo;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">...省略...</span><br><span class="line"></span><br><span class="line">static enum PHY_TYPE bdx_phy_init(struct bdx_priv *priv)</span><br><span class="line">{</span><br><span class="line">struct pci_dev *pdev = priv-&gt;pdev;</span><br><span class="line">enum PHY_TYPE phy_type;</span><br><span class="line">u32 phy_id;</span><br><span class="line">char *desc;</span><br><span class="line"></span><br><span class="line">phy_type =</span><br><span class="line">    bdx_get_phy_by_id(pdev-&gt;vendor, pdev-&gt;device,</span><br><span class="line">      pdev-&gt;subsystem_device);</span><br><span class="line"></span><br><span class="line">if (phy_type == PHY_TYPE_NA)</span><br><span class="line">return PHY_TYPE_NA;/* NIC definition has no PHY. */</span><br><span class="line"></span><br><span class="line">bdx_mdio_set_speed(priv-&gt;pBdxRegs, MDIO_SPEED_1MHZ);</span><br><span class="line"></span><br><span class="line">phy_id = bdx_mdio_scan_phy_id(priv);/* set phy_mdio_port */</span><br><span class="line"></span><br><span class="line"><span class="deletion">-   if (!priv-&gt;phy_mdio_port)</span></span><br><span class="line"><span class="addition">+   if (priv-&gt;phy_mdio_port &lt; 0)</span></span><br><span class="line">return PHY_TYPE_NA;/* No PHY detected on MDIO bus. */</span><br><span class="line"></span><br><span class="line">/* register the PHY-specific callbacks */</span><br><span class="line">priv-&gt;phy_type = bdx_phy_register(priv, phy_id, &amp;desc);</span><br><span class="line"></span><br><span class="line">if (priv-&gt;phy_type == PHY_TYPE_NA) {</span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev, "Unsupported PHY ID=%X", phy_id);</span><br><span class="line">return PHY_TYPE_NA;</span><br><span class="line">}</span><br><span class="line">if (phy_type != priv-&gt;phy_type)</span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev,</span><br><span class="line"> "SVID PHY type %u; MDIO scan Found %u\n", phy_type,</span><br><span class="line"> priv-&gt;phy_type);</span><br><span class="line"></span><br><span class="line">dev_info(&amp;priv-&gt;pdev-&gt;dev, "PHY detected ID=%X - %s\n", phy_id, desc);</span><br><span class="line"></span><br><span class="line">bdx_mdio_set_speed(priv-&gt;pBdxRegs, priv-&gt;phy_ops.mdio_speed);</span><br><span class="line"></span><br><span class="line"><span class="deletion">-   if (priv-&gt;phy_ops.mdio_reset(priv, 1, priv-&gt;phy_type))</span></span><br><span class="line"><span class="addition">+   if (priv-&gt;phy_ops.mdio_reset(priv, priv-&gt;phy_mdio_port, priv-&gt;phy_type))</span></span><br><span class="line">return PHY_TYPE_NA;</span><br><span class="line"></span><br><span class="line">return phy_type;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></div></details></div><p>再次编译后可以正常驱动</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1117/327;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df467c5fd16.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df467c5fd16.png@!normal" alt="日志输出" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="日志输出" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df467c5fd16.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">日志输出</span></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:664/113;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_18-13-55-69df47a4c27c5.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_18-13-55-69df47a4c27c5.jpg@!normal" alt="网卡状态" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="网卡状态" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-03-14_18-13-55-69df47a4c27c5.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">网卡状态</span></div></div><h2 id="配置dhcp"><a class="markdownIt-Anchor" href="#配置dhcp"></a> 配置DHCP</h2><p>我这里使用<code>nmcli</code>配置网络，连上网线后网卡状态不再是<code>unavailable</code>（物理层连接后才可配置，无法逻辑启用），可以配置连接</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:905/124;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df47f4c28fa.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df47f4c28fa.png@!normal" alt="网卡状态" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="网卡状态" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69df47f4c28fa.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">网卡状态</span></div></div><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 设置分享模式并固定 IP </span></span><br><span class="line">sudo nmcli connection modify <span class="string">"Wired connection 1"</span> \</span><br><span class="line">    ipv4.method shared \</span><br><span class="line">    ipv4.addresses 10.42.0.1/24 \</span><br><span class="line">    connection.autoconnect <span class="built_in">yes</span> \</span><br><span class="line">    ipv4.route-metric 200 <span class="comment"># 降低路由优先级（数字越小越优先，可通过ip route或route -n查看）</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重新激活配置</span></span><br><span class="line">sudo nmcli connection modify <span class="string">"Wired connection 1"</span> connection.id <span class="string">"shared-net"</span></span><br><span class="line">sudo nmcli connection up <span class="string">"Wired connection 1"</span></span><br></pre></td></tr></tbody></table></figure><p>同时，在防火墙里放行相关端口</p><div class="md-table-scroll"><table><thead><tr><th>端口</th><th>协议</th><th>作用</th></tr></thead><tbody><tr><td>53</td><td>UDP</td><td>DNS查询，<code>NetworkManager</code> 会启动一个 <code>dnsmasq</code> 进程来转发DNS请求</td></tr><tr><td>67</td><td>UDP</td><td>DHCP服务，服务器通过这个端口接收处理<code>DHCP Discover</code>（发现包）和<code>DHCP Request</code>（请求包）</td></tr></tbody></table></div><p>或者可以直接配置为本地链路模式</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo nmcli connection modify <span class="string">"Wired connection 2"</span> ipv4.method link-local sudo nmcli connection up <span class="string">"Wired connection 2"</span></span><br></pre></td></tr></tbody></table></figure><h2 id="测试"><a class="markdownIt-Anchor" href="#测试"></a> 测试</h2><p>笔记本（螃蟹2.5G网卡）使用网线直连，笔记本上传到服务器可以跑满 2.5G 带宽，下行跑不满，应该是笔记本问题</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1850/1011;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-44-47.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-44-47.jpg@!normal" alt="上行" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="上行" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-44-47.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">上行</span></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1850/1011;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-47-12.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-47-12.jpg@!normal" alt="下行" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="下行" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/Snipaste_2026-09-24_16-47-12.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">下行</span></div></div><p>在实际采集时观察到大量错误</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2048/1536;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/IMG20260813205814.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/IMG20260813205814.jpg@!normal" alt="内核日志" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="内核日志" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/IMG20260813205814.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">内核日志</span></div></div><p>嗯。。刚买的超六类线，应该不是线的问题；一个合格的厂商应该不至于做出来这么烂的产品，所以可能还是驱动某些逻辑问题，根据报错码<code>0x10</code>可以定位到属于<code>TCP checksum error</code>，具体的可以看AI解析，<del>因为我复现不出来了，没法调试🥲</del></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1565/337;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260924182938120.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260924182938120.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/20260924182938120.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>如果碰到类似问题，或许可以尝试关闭 Rx/Tx 校验和卸载</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 关闭 Rx/Tx 校验和卸载 </span></span><br><span class="line">sudo ethtool -K &lt;网卡名&gt; rx off tx off tso off gso off</span><br><span class="line"><span class="comment"># 查看状态</span></span><br><span class="line">sudo ethtool -S &lt;网卡名&gt; </span><br></pre></td></tr></tbody></table></figure><p>顺便吐槽一下鸡哥这个网口：</p><div class="ds-livephoto" data-image="https://gate.assets.hzchu.top/fs/garage/blog/images/2026/09/IMG20260924162745.jpg" data-width="384px" data-height="512px" data-alt="no description" style="width:384px; height:512px;"></div><p>不过无所谓，鸽了半年才发出来，现在已经不用我们这边协助采集数据了，实在要用也可以限制协商速率为1G，再<a href="https://github.com/Hypostasis-Cat/HypoMux">多网卡分流</a></p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>头文件 (Header File)，固件是二进制文件，构建时转为一维数组，以头文件形式嵌入驱动。（也有在运行时由系统动态加载，但这个不是，/lib/firmware目录下没有对应文件） <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>MDIO（Management Data Input/Output，管理数据输入/输出）是一种双线串行总线协议，专门用于以太网 <code>MAC</code>对<code>PHY</code>进行状态监控、参数配置和故障诊断，属于控制和管理总线 <a href="#fnref2" class="footnote-backref">↩︎</a></p></li><li id="fn3" class="footnote-item"><p><a href="https://ieeexplore.ieee.org/document/9844436">IEEE 802.3 标准</a>里<code>22.2.4.5.5 PHYAD (PHY Address)</code>小节：<code>The PHY Address is five bits, allowing 32 unique PHY addresses. The first PHY address bit transmitted and received is the MSB of the address. A PHY that is connected to the station management entity via the mechanical interface defined in 22.6 shall always respond to transactions addressed to PHY Address zero &lt;00000&gt;. A station management entity that is attached to multiple PHYs has to have prior knowledge of the appropriate PHY Address for each PHY. </code>。由于要求必须响应<code>0</code>，可以说<code>0</code>是“广播地址”，实际通常以<strong>1 到 31</strong> 作为有效设备地址 <a href="#fnref3" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://blog.hzchu.top/2026/install-tn9710p-10gbe-nic-on-linux/</id>
    <link href="https://blog.hzchu.top/2026/install-tn9710p-10gbe-nic-on-linux/"/>
    <published>2026-09-23T19:00:53.000Z</published>
    <summary>加装了一块乐扩IO-PCE9710-GLAN万兆网卡，想让这老古董在新内核上跑起来得费点功夫</summary>
    <title>Linux上安装TN9710P万兆网卡</title>
    <updated>2026-09-24T23:18:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>thun888</name>
    </author>
    <category term="瞎折腾" scheme="https://blog.hzchu.top/categories/%E7%9E%8E%E6%8A%98%E8%85%BE/"/>
    <category term="学校" scheme="https://blog.hzchu.top/tags/%E5%AD%A6%E6%A0%A1/"/>
    <category term="网工" scheme="https://blog.hzchu.top/tags/%E7%BD%91%E5%B7%A5/"/>
    <content>
      <![CDATA[<h2 id="前言"><a class="markdownIt-Anchor" href="#前言"></a> 前言</h2><p>实验室网络的布局大概长这样：</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1137/1200;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg@!normal" alt="原网络拓扑" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="原网络拓扑" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">原网络拓扑</span></div></div><p>别问，问就是硬件条件制约，一堆百兆网线，少数几根千兆网线还不够长，实际布局更离谱<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatcomftears.png"></span></p><p>后来在角落里发现了前辈遗留下来的一台中新网安的防火墙，全千兆的接口，那就利用这个来改进一下实验室的网络吧</p><p>首先，最大的硬件制约在于——接入层交换机是两个千兆的上联口、24个百兆的下联口。上联线路是千兆的，但是内网被百兆锁死了。（所以说才接了那么多交换机，那些交换机都是千兆的，方便内网传数据）</p><p>最激进的方案就是直接替换掉这个百兆的接入层交换机。但是这样子的话改动有点大。所以我想了想，干脆将其中的一个上联口通过调整配置改为下联口，再接入到另外一台千兆交换机，就可以达到近似千兆的效果了。</p><p>同时这样也不用手动配置端口模式和vlan那些，让原来的交换机负责</p><p>接上<code>console</code>线，试了一下常见的弱密码，发现都不行。所以需要想办法绕过密码。</p><blockquote><p>这个交换机也是个老古董，部分实现在新型号上可能有所差异，仅供参考。</p></blockquote><h2 id="获取交换机密码"><a class="markdownIt-Anchor" href="#获取交换机密码"></a> 获取交换机密码</h2>    <div class="divider-container">      <div class="divider-line"></div>      <span class="divider-text">下文来自<a target="_blank" href="/wiki/more/实验室网络/获取锐捷交换机的特权密码/">「获取锐捷交换机的特权密码」</a></span>      <div class="divider-line"></div>    </div>  <h3 id="引导模式下去掉配置"><a class="markdownIt-Anchor" href="#引导模式下去掉配置"></a> 引导模式下去掉配置</h3><p>在接上<code>console</code>线的情况下，断电重启。</p><blockquote><p>注意，在没进入特权模式下，是没有办法执行<code>reload</code>重启的</p></blockquote><p>重启后可以看到，<code>Press Ctrl+B to enter Boot Menu</code>，尽快按下<kbd class="tag-plugin kbd">Ctrl</kbd> + <kbd class="tag-plugin kbd">B</kbd>，进入引导菜单。</p><p><img src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69d9aeb734672.png" alt="image.png"></p><p>随后按下1进入Ctrl模式，在读条完成后，需要按下<kbd class="tag-plugin kbd">Ctrl</kbd> + <kbd class="tag-plugin kbd">C</kbd>二次确定</p><blockquote><p>若长期无响应，可以尝试按下回车，查看前面是否出现了<code>Ctrl&gt;</code>的提示符</p></blockquote><p>在进入该调试环境后，可以使用<code>dir</code>列出文件目录。在列出文件目录后，可以看到有一个<code>config.text</code>文件，储存了交换机的配置</p><p>使用<code>rename config.text config.bak</code>将该文件重命名，随后执行<code>reload</code>重启，进入主系统</p><p>在主系统下使用<code>enable</code>进入特权模式，随后执行<code>copy config.bak config.text</code>将配置文件改回去</p><p>执行<code>copy startup-config running-config</code>应用配置</p><blockquote><p>可以使用<code>show running-config</code>查看配置</p></blockquote><p>随后，趁交换机<span class="annotated" data-tippy-content="仍处于特权模式下">“不注意”</span>，设置一下密码覆盖掉配置里原有的设置</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 进入全局配置模式</span></span><br><span class="line">configure terminal</span><br><span class="line"><span class="comment"># 启用密码加密功能</span></span><br><span class="line">service password-encryption</span><br><span class="line"><span class="comment"># 设置管理账号</span></span><br><span class="line">username admin password yourpassword</span><br><span class="line"><span class="comment"># 设置特权模式密码</span></span><br><span class="line"><span class="built_in">enable</span> password yourpassword</span><br></pre></td></tr></tbody></table></figure><h3 id="查看配置文件并反解密码"><a class="markdownIt-Anchor" href="#查看配置文件并反解密码"></a> 查看配置文件并反解密码</h3><p>直接改人家密码，终归是不太好。既然我们都能够读出配置文件了，能不能直接反解出密码呢？看了一眼配置文件，使用的是<code>Type 7</code>加密形式来保存密码，这种加密也和明文差不多了。</p><p>在网上查多数是思科的交换机的资料，锐捷交换机的也有：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">选择明文攻击</span></span><br><span class="line"><span class="string">根据已有密码和算法计算xlat</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">getxlat</span>(<span class="params">enc_pw,dec_pw</span>):</span><br><span class="line">xlat = [<span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>,<span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>,<span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>,<span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>]</span><br><span class="line"><span class="comment">#seed为enc_pw的前两个字母</span></span><br><span class="line">seed = <span class="built_in">int</span>(enc_pw[<span class="number">0</span>:<span class="number">2</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">"seed:"</span>,seed)</span><br><span class="line">val = <span class="number">0</span></span><br><span class="line"><span class="comment">#enc_pw中的每两个字母对应一个明文字母</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,<span class="built_in">len</span>(enc_pw)):</span><br><span class="line"><span class="built_in">print</span>(i)</span><br><span class="line"><span class="keyword">if</span> i%<span class="number">2</span> == <span class="number">0</span> <span class="keyword">and</span> i &gt;<span class="number">2</span> :</span><br><span class="line">seed = seed +<span class="number">1</span></span><br><span class="line">xlat[seed] = val ^ <span class="built_in">ord</span>(dec_pw[<span class="built_in">int</span>(i/<span class="number">2</span> - <span class="number">2</span>)])</span><br><span class="line"></span><br><span class="line">val = <span class="number">0</span></span><br><span class="line"><span class="built_in">print</span>(seed,xlat[seed])</span><br><span class="line">val = val *<span class="number">16</span></span><br><span class="line">tmp = enc_pw[i].upper()</span><br><span class="line"><span class="keyword">if</span> tmp &gt;= <span class="string">'0'</span> <span class="keyword">and</span>  tmp &lt;= <span class="string">'9'</span> :</span><br><span class="line">val = val  + <span class="built_in">ord</span>(tmp) - <span class="built_in">ord</span>(<span class="string">'0'</span>)</span><br><span class="line"><span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> tmp &gt;= <span class="string">'A'</span> <span class="keyword">and</span>  tmp &lt;= <span class="string">'F'</span> : </span><br><span class="line">val = val + <span class="built_in">ord</span>(tmp) - <span class="built_in">ord</span>(<span class="string">'A'</span>) + <span class="number">10</span>;</span><br><span class="line"><span class="keyword">continue</span></span><br><span class="line"><span class="built_in">print</span>(xlat)</span><br><span class="line"><span class="keyword">return</span> xlat</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decode</span>(<span class="params">xlat,enc_pw</span>):</span><br><span class="line">test_pw = <span class="string">''</span></span><br><span class="line">seed = <span class="built_in">int</span>(enc_pw[<span class="number">0</span>:<span class="number">2</span>])</span><br><span class="line"><span class="built_in">print</span>(<span class="string">"seed:"</span>,seed)</span><br><span class="line">val = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>,<span class="built_in">len</span>(enc_pw)):</span><br><span class="line"><span class="built_in">print</span>(i)</span><br><span class="line"><span class="keyword">if</span> i%<span class="number">2</span> == <span class="number">0</span> <span class="keyword">and</span> i &gt;<span class="number">2</span> :</span><br><span class="line">seed = seed +<span class="number">1</span></span><br><span class="line">test_pw_char = <span class="built_in">chr</span>(val ^xlat[seed])</span><br><span class="line">test_pw += test_pw_char</span><br><span class="line">val = <span class="number">0</span></span><br><span class="line"><span class="built_in">print</span>(seed,xlat[seed],test_pw_char)</span><br><span class="line">val = val *<span class="number">16</span></span><br><span class="line">tmp = enc_pw[i].upper()</span><br><span class="line"><span class="keyword">if</span> tmp &gt;= <span class="string">'0'</span> <span class="keyword">and</span>  tmp &lt;= <span class="string">'9'</span> :</span><br><span class="line">val = val  + <span class="built_in">ord</span>(tmp) - <span class="built_in">ord</span>(<span class="string">'0'</span>)</span><br><span class="line"><span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> tmp &gt;= <span class="string">'A'</span> <span class="keyword">and</span>  tmp &lt;= <span class="string">'F'</span> : </span><br><span class="line">val = val + <span class="built_in">ord</span>(tmp) - <span class="built_in">ord</span>(<span class="string">'A'</span>) + <span class="number">10</span>;</span><br><span class="line"><span class="keyword">continue</span></span><br><span class="line"><span class="built_in">print</span>(test_pw)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span> :</span><br><span class="line">enc_pw = <span class="string">'1100320c1843080143797f'</span>+<span class="string">'\0'</span></span><br><span class="line">dec_pw = <span class="string">'ruijie@123'</span></span><br><span class="line">xlat = getxlat(enc_pw,dec_pw)</span><br><span class="line"></span><br><span class="line">xlat = [<span class="number">9999</span>, <span class="number">42</span>,   <span class="number">64</span>,   <span class="number">35</span>,   <span class="number">35</span>,   <span class="number">87</span>,   <span class="number">120</span>,  <span class="number">102</span>,  <span class="number">94</span>,   <span class="number">99</span>,   <span class="number">79</span>,   <span class="number">117</span>,  <span class="number">114</span>, <span class="number">71</span>, <span class="number">101</span>, <span class="number">114</span>, <span class="number">42</span>, <span class="number">109</span>, <span class="number">65</span>, <span class="number">114</span>, <span class="number">75</span>, <span class="number">76</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>, <span class="number">9999</span>]</span><br><span class="line">enc_pw = <span class="string">'1100320c1843080143797f'</span>+<span class="string">'\0'</span></span><br><span class="line">decode(xlat,enc_pw)</span><br></pre></td></tr></tbody></table></figure><p>enc_pw来自配置文件里这些部分后的内容：</p><ol><li>username admin password 7 {enc_pw}</li><li>enable password 7 {enc_pw}</li></ol><blockquote><p>来自：<a href="https://www.cnblogs.com/dongpohezui/p/16065709.html">锐捷password 7 解密 - 东坡何罪 - 博客园</a></p></blockquote><h3 id="参考资料"><a class="markdownIt-Anchor" href="#参考资料"></a> 参考资料</h3><ol><li><a href="https://image.ruijie.com.cn/Upload/Article/c15d3e02-0e6a-4e5a-b9da-1a21f200871e/%E9%94%90%E6%8D%B7%E4%BA%A4%E6%8D%A2%E6%9C%BA%E4%BA%A7%E5%93%81%E7%BA%BF%E9%97%AE%E9%A2%98%E4%B8%80%E6%9C%AC%E9%80%9A%EF%BC%88V1.0%EF%BC%89/%E4%BA%A4%E6%8D%A2%E6%9C%BA%E4%BA%A7%E5%93%81%E7%BA%BF%E9%97%AE%E9%A2%98%E4%B8%80%E6%9C%AC%E9%80%9AV1.0/5d55c674-53bc-4f82-8b7f-b411a9f1eb32.htm">01 日常维护</a></li><li><a href="https://www.cnblogs.com/dongpohezui/p/16065709.html">锐捷password 7 解密 - 东坡何罪 - 博客园</a></li><li><a href="https://insecure.org/sploits/cisco.passwords.html">Cisco password decryption</a></li><li><a href="https://blog.csdn.net/andy891218/article/details/89446176">锐捷交换机-管理密码清除-Uboot层不支持“main_config_password_clear”命令恢复_xmodem utilities-CSDN博客</a></li></ol>  <div class="divider-container">    <div class="divider-line"></div>    <span class="divider-text">外部引用截止</span>    <div class="divider-line"></div>  </div>  <h2 id="修改配置"><a class="markdownIt-Anchor" href="#修改配置"></a> 修改配置</h2><p>交换机接口没有物理上“上下联”的区别，这里的情况是两个配置为<code>trunk</code>模式，其他为<code>access</code>模式，将其中一个改为<code>access</code>模式</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">enable</span></span><br><span class="line">configure terminal</span><br><span class="line">interface GigabitEthernet 0/25</span><br><span class="line"><span class="comment"># 关闭DHCP分配和ARP的信任</span></span><br><span class="line">no ip dhcp snooping trust</span><br><span class="line">no ip arp inspection trust</span><br><span class="line"><span class="comment"># 改为access模式</span></span><br><span class="line">switchport mode access</span><br><span class="line"><span class="comment"># 设置对应的vlan</span></span><br><span class="line">switchport access vlan 11111</span><br><span class="line">end</span><br><span class="line">write</span><br></pre></td></tr></tbody></table></figure><p>什么？你说为什么不直接把新交换机的其中一个网口也设为中继模式，然后直接接过来。这样子确实更好一点，但是它好处我用不上也没权限用，干脆改完以后一劳永逸。</p><h2 id="将防火墙变为普通交换机"><a class="markdownIt-Anchor" href="#将防火墙变为普通交换机"></a> 将“防火墙”变为“普通交换机”</h2>    <div class="divider-container">      <div class="divider-line"></div>      <span class="divider-text">下文来自<a target="_blank" href="/wiki/more/实验室网络/配置中新网安防火墙/">「配置中新网安防火墙为普通交换机」</a></span>      <div class="divider-line"></div>    </div>  <p>说是防火墙，但我需要的更多是它的交换功能。</p><p>首先连接0号网口，再配置电脑IP为<code>192.168.1.2</code>，默认路由<code>192.168.1.1</code>。随后访问<code>https://192.168.1.1</code>。</p><blockquote><p>注意，默认不开放80端口访问</p></blockquote><p>使用默认账号密码（admin/admin）访问，在接口设置中将全部接口并入网桥（我这里保留了一个接口用于管理）</p><p><img src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69d9db9b246db.png@!normal" alt="image.png"></p><p><img src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69d9dbdb0cddf.png@!normal" alt="image.png"></p><p>随后在<code>console</code>执行以下命令，开启IPv6支持，然后就可以把线全部接过去了</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ZX-NGFW-6130&gt; enable</span><br><span class="line">ZX-NGFW-6130# configure terminal</span><br><span class="line">ZX-NGFW-6130(config)# ipv6 enable</span><br><span class="line">ZX-NGFW-6130(config)# end</span><br><span class="line">ZX-NGFW-6130# save config </span><br><span class="line">Building configuration...</span><br><span class="line"></span><br><span class="line">Save configuration ok !</span><br></pre></td></tr></tbody></table></figure>  <div class="divider-container">    <div class="divider-line"></div>    <span class="divider-text">外部引用截止</span>    <div class="divider-line"></div>  </div>  <p>当然，实际上还是不能和二层交换机划等号</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>利用多余的千兆口，绕开原有的百兆口限制</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1137/1200;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg@!normal" alt="原网络拓扑" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="原网络拓扑" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_09-50-47-69dafa7d409d9.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">原网络拓扑</span></div></div>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1046/1228;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_15-54-34-69da03c64fbcb.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_15-54-34-69da03c64fbcb.jpg@!normal" alt="新网络拓扑" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="新网络拓扑" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_15-54-34-69da03c64fbcb.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">新网络拓扑</span></div></div>    </div>    </div><p>实际效果（ipv6，ipv4上游有限速；上传也有几百兆）：</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1876/1056;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69db048a29f90.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69db048a29f90.png@!normal" alt="image.png" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="image.png" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69db048a29f90.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">image.png</span></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1650/146;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69e5f30b4f3f1.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69e5f30b4f3f1.png@!normal" alt="image.png" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="image.png" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/image-69e5f30b4f3f1.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">image.png</span></div></div><p>内网测速：</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1232/547;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_11-42-57-69db1b0b84ca2.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_11-42-57-69db1b0b84ca2.jpg@!normal" alt="Snipaste_2026-04-12_11-42-57.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-04-12_11-42-57.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-12_11-42-57-69db1b0b84ca2.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-04-12_11-42-57.jpg</span></div></div><p>此前传大文件还要跑去接网线，现在不用了hh</p><blockquote><p>受虚拟网卡影响，实际性能还能再高</p></blockquote><h2 id="另外"><a class="markdownIt-Anchor" href="#另外"></a> 另外</h2><p>同时也试了下把干线直接接电脑上，发现获取不到ipv4，只有ipv6</p><p>查了下资料想了想，应该是默认情况下电脑发出的数据包不带<code>VLAN标签</code>，上游归到<code>Native VLAN</code>，刚好又没有DHCP就获取不到ipv4地址</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>手动配置VLAN ID后可以正常获取IP，不过速度很慢，<s>可能是因为网卡要从一堆数据里过滤出自己想要的吧</s></p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:723/769;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_16-24-35-69db051881614.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_16-24-35-69db051881614.jpg@!normal" alt="Snipaste_2026-04-11_16-24-35.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-04-11_16-24-35.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/04/Snipaste_2026-04-11_16-24-35-69db051881614.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-04-11_16-24-35.jpg</span></div></div>    </div>    </div><p>至于ipv6，我校是<span class="annotated" data-tippy-content="SLAAC">无状态自动配置方式</span>，可能是<code>Native VLAN</code>和别的VLAN间没有严格隔离，甚至由于接收到多个RA，同时生成了多个前缀的ipv6地址。上网的时候又默认把数据发给RA报文发送方，刚好就畅通无阻。不过在实际使用中不会用这个VLAN的，所以问题不大。</p><div class="divider-container"><span class="divider-line"></span><span class="divider-text">防止网络组播</span></div><p>前些阵子发现电脑卡卡的，发现有来源不明的30兆下行占用，抓包一看，大多数是ROS2的数据，每秒三千个数据包攻打我电脑<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/bili_tv/流汗.webp"></span></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2541/1519;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/image-69f6c1eb99793.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/image-69f6c1eb99793.png@!normal" alt="image.png" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="image.png" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/image-69f6c1eb99793.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">image.png</span></div></div><blockquote><p>注：ROS2相比于ROS1的改进之一就是用了这种组播的形式来传递数据，具有去中心化等优点<br>更多验证细节待补充</p></blockquote><p>简单来说就是有个哥们在同个网段下跑模拟器，然后数据还到处发，用软件都可以直接预览</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1796/1196;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/Snipaste_2026-05-02_22-01-48-69f603eaaea14.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/Snipaste_2026-05-02_22-01-48-69f603eaaea14.jpg@!normal" alt="image.png" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="image.png" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/05/Snipaste_2026-05-02_22-01-48-69f603eaaea14.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">image.png</span></div></div><p>一开始想的就是隔壁打RM的，但他们当时在比赛。后来找了好久，才在一个不起眼的小房间里找到了罪魁祸首，直接打电话上压力，顺便也让网络中心那边限制了他们的广播包转发速率</p><p>而现在嘛，在能进入交换机后台以后，也可以改一项设置——IGMP Snooping，未开启时，或者说默认情况下组播包会退化为广播包给每个设备发送，由设备自己决定要不要。开启后，它可以监听设备发出的<code>IGMP Report</code>报文，仅在用户加入对应组播组时才转发数据到相应端口上</p><p>我这里设置为<code>ivgl</code>模式</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">config terminal</span><br><span class="line">ip&nbsp;igmp&nbsp;snooping&nbsp;ivgl</span><br><span class="line">end</span><br><span class="line">write</span><br></pre></td></tr></tbody></table></figure>]]>
    </content>
    <id>https://blog.hzchu.top/2026/opt-lab-net/</id>
    <link href="https://blog.hzchu.top/2026/opt-lab-net/"/>
    <published>2026-04-11T13:11:53.000Z</published>
    <summary>达成成就：全学校网速最快的地方</summary>
    <title>优化实验室网络</title>
    <updated>2026-04-11T13:11:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>thun888</name>
    </author>
    <category term="瞎折腾" scheme="https://blog.hzchu.top/categories/%E7%9E%8E%E6%8A%98%E8%85%BE/"/>
    <category term="修修修" scheme="https://blog.hzchu.top/tags/%E4%BF%AE%E4%BF%AE%E4%BF%AE/"/>
    <content>
      <![CDATA[<h2 id="背景"><a class="markdownIt-Anchor" href="#背景"></a> 背景</h2><p>电脑接3D打印机调试被反噬了，干炸CPU后更换主板</p><h2 id="问题"><a class="markdownIt-Anchor" href="#问题"></a> 问题</h2><h3 id="bitlocker-正在加密"><a class="markdownIt-Anchor" href="#bitlocker-正在加密"></a> BitLocker 正在加密</h3><p>电脑有两个硬盘，维修前我取了一个装有资料的出来，剩下一块硬盘在不知道售后维修时进行了什么操作，给我硬盘挂了两把锁</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:843/357;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699fd8fee180f.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699fd8fee180f.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699fd8fee180f.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1689/1080;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-16-36-699fd90ab5c8d.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-16-36-699fd90ab5c8d.jpg@!normal" alt="Snipaste_2026-02-01_21-16-36.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-02-01_21-16-36.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-16-36-699fd90ab5c8d.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-02-01_21-16-36.jpg</span></div></div>    </div>    </div><p>“正在加密”，但旁边的按钮显示“启用”，还没有取消键<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/capoo_world/5.webp"></span></p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>在终端里输入<code>manage-bde -status</code>可以查看加密状态</p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:622/782;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-21-51-699fd9b2929cf.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-21-51-699fd9b2929cf.jpg@!normal" alt="Snipaste_2026-02-01_21-21-51.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-02-01_21-21-51.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-21-51-699fd9b2929cf.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-02-01_21-21-51.jpg</span></div></div>    </div>    </div><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>输入<code>manage-bde -off {盘符}:</code>停止加密</p>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1759/463;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-22-18-699fd9fc539d2.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-22-18-699fd9fc539d2.jpg@!normal" alt="Snipaste_2026-02-01_21-22-18.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-02-01_21-22-18.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-01_21-22-18-699fd9fc539d2.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-02-01_21-22-18.jpg</span></div></div>    </div>    </div><h3 id="tailscale-无法启动"><a class="markdownIt-Anchor" href="#tailscale-无法启动"></a> Tailscale 无法启动</h3><p>始终处于<code>Starting..</code>或<code>Needs authentication</code>状态，登录依旧卡住</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:670/246;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-38-34-699fda96e4ca9.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-38-34-699fda96e4ca9.jpg@!normal" alt="Snipaste_2026-02-02_14-38-34.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-02-02_14-38-34.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-38-34-699fda96e4ca9.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-02-02_14-38-34.jpg</span></div></div>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:623/225;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-51-11-699fda26c5719.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-51-11-699fda26c5719.jpg@!normal" alt="Snipaste_2026-02-02_14-51-11.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="Snipaste_2026-02-02_14-51-11.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/Snipaste_2026-02-02_14-51-11-699fda26c5719.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">Snipaste_2026-02-02_14-51-11.jpg</span></div></div>    </div>    </div><p>手动启动服务进程查看输出：</p><figure class="highlight powershell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">PS</span> C:\Users\thun888&gt; tailscaled</span><br><span class="line">TPM: successfully read all properties</span><br><span class="line">...</span><br><span class="line">store.New failed: failed to migrate existing TPM<span class="literal">-sealed</span> state file to plaintext format: newTPMStore(<span class="string">"C:\\ProgramData\\Tailscale\\server-state.conf"</span>): failed to unseal state file: failed to unseal encryption key with TPM: tpm2.Load: TPM_RC_INTEGRITY (handle <span class="number">0</span>): integrity check failed; starting with <span class="keyword">in</span><span class="literal">-memory</span> store with a health warning</span><br><span class="line">logpolicy: <span class="keyword">using</span> dir C:\ProgramData\Tailscale</span><br><span class="line">linkChange: <span class="keyword">in</span> state NoState; PAC or proxyConfig changed; updating routes</span><br><span class="line">got LocalBackend <span class="keyword">in</span> <span class="number">1.632</span>s</span><br><span class="line"><span class="built_in">Start</span></span><br><span class="line">desktop<span class="literal">-sessions</span>: registered <span class="keyword">for</span> session notifications</span><br><span class="line">ipnext: active extensions: desktop<span class="literal">-sessions</span>, conn25, portlist, posture, clientupdate, relayserver, taildrop, auditlog</span><br><span class="line"><span class="built_in">Start</span>: serverMode=false</span><br><span class="line">auditlog: created</span><br><span class="line">auditlog: [<span class="type">unexpected</span>] failed to restore logs: empty key</span><br><span class="line">Backend: logs: be:d610ce8d98f125b70fd624b1f33f9d34cd1695c1d28675d6bcca7f2a666aff83 fe:</span><br><span class="line">health(warnable=wantrunning<span class="literal">-false</span>): error: Tailscale is stopped.</span><br><span class="line">pm: failed to migrate from legacy preferences: load legacy prefs: profile migration already completed</span><br><span class="line">client connected (THUN888<span class="literal">-LAPTOP</span>\thun888): disconnecting Tailscale</span><br><span class="line"><span class="built_in">Start</span></span><br><span class="line">control: client.Shutdown ...</span><br><span class="line">control: authRoutine: exiting</span><br><span class="line">auditlog: stopped <span class="keyword">for</span> profileID:</span><br><span class="line">control: updateRoutine: exiting</span><br><span class="line">control: mapRoutine: exiting</span><br><span class="line"><span class="built_in">Start</span>: serverMode=false</span><br><span class="line">control: Client.Shutdown done.</span><br><span class="line">auditlog: created</span><br><span class="line">auditlog: [<span class="type">unexpected</span>] failed to restore logs: empty key</span><br><span class="line">Backend: logs: be:................................................. fe:</span><br><span class="line">client disconnected (THUN888<span class="literal">-LAPTOP</span>\thun888): disconnecting Tailscale</span><br><span class="line"><span class="built_in">Start</span></span><br><span class="line">control: client.Shutdown ...</span><br><span class="line">auditlog: stopped <span class="keyword">for</span> profileID:</span><br><span class="line">control: mapRoutine: exiting</span><br><span class="line">control: authRoutine: exiting</span><br><span class="line">control: updateRoutine: exiting</span><br><span class="line">control: Client.Shutdown done.</span><br><span class="line"><span class="built_in">Start</span>: serverMode=false</span><br><span class="line">auditlog: created</span><br><span class="line">auditlog: [<span class="type">unexpected</span>] failed to restore logs: empty key</span><br><span class="line">Backend: logs: be:...................................................... fe:</span><br><span class="line">pm: failed to migrate from legacy preferences: load legacy prefs: profile migration already completed</span><br><span class="line">client connected (THUN888<span class="literal">-LAPTOP</span>\thun888): disconnecting Tailscale</span><br><span class="line"><span class="built_in">Start</span></span><br><span class="line">control: client.Shutdown ...</span><br><span class="line">auditlog: stopped <span class="keyword">for</span> profileID:</span><br><span class="line"><span class="built_in">Start</span>: serverMode=false</span><br><span class="line">control: updateRoutine: exiting</span><br><span class="line">control: mapRoutine: exiting</span><br><span class="line">auditlog: created</span><br><span class="line">auditlog: [<span class="type">unexpected</span>] failed to restore logs: empty key</span><br><span class="line">Backend: logs: be:..................................................... fe:</span><br><span class="line">control: authRoutine: exiting</span><br><span class="line">client disconnected (THUN888<span class="literal">-LAPTOP</span>\thun888): disconnecting Tailscale</span><br><span class="line">control: Client.Shutdown done.</span><br><span class="line">control: client.Shutdown ...</span><br><span class="line">auditlog: stopped <span class="keyword">for</span> profileID:</span><br><span class="line">control: authRoutine: exiting</span><br><span class="line"><span class="built_in">Start</span></span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"Start"</span>)</span><br><span class="line">control: mapRoutine: exiting</span><br><span class="line">control: updateRoutine: exiting</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"[v\x00JSON]%d%s"</span>)</span><br><span class="line"><span class="built_in">Start</span>: serverMode=false</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"Start: serverMode=%v"</span>)</span><br><span class="line">control: Client.Shutdown done.</span><br><span class="line">auditlog: created</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"auditlog: created"</span>)</span><br><span class="line">auditlog: [<span class="type">unexpected</span>] failed to restore logs: empty key</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"auditlog: [unexpected] failed to restore logs: %v"</span>)</span><br><span class="line">Backend: logs: be:d610ce8d98f125b70fd624b1f33f9d34cd1695c1d28675d6bcca7f2a666aff83 fe:</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"Backend: logs: be:%v fe:%v"</span>)</span><br><span class="line">pm: failed to migrate from legacy preferences: load legacy prefs: profile migration already completed</span><br><span class="line">client connected (THUN888<span class="literal">-LAPTOP</span>\thun888): disconnecting Tailscale</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"%s: disconnecting Tailscale"</span>)</span><br><span class="line">control: client.Shutdown ...</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"control: client.Shutdown ..."</span>)</span><br><span class="line">control: authRoutine: exiting</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"control: authRoutine: exiting"</span>)</span><br><span class="line">control: updateRoutine: exiting</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"control: updateRoutine: exiting"</span>)</span><br><span class="line">control: mapRoutine: exiting</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"control: mapRoutine: exiting"</span>)</span><br><span class="line">auditlog: stopped <span class="keyword">for</span> profileID:</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"auditlog: stopped for profileID: %v"</span>)</span><br><span class="line">control: Client.Shutdown done.</span><br><span class="line"><span class="function">[<span class="type">RATELIMIT</span>] <span class="title">format</span></span>(<span class="string">"control: Client.Shutdown done."</span>)</span><br><span class="line">...</span><br></pre></td></tr></tbody></table></figure><p>从这里可见密钥解密失败</p><figure class="highlight text"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">store.New failed: failed to migrate existing TPM-sealed state file to plaintext format: newTPMStore("C:\\ProgramData\\Tailscale\\server-state.conf"): failed to unseal state file: failed to unseal encryption key with TPM: tpm2.Load: TPM_RC_INTEGRITY (handle 0): integrity check failed; starting with in-memory store with a health warning</span><br></pre></td></tr></tbody></table></figure><p>密钥是使用TPM加密的，更换主板后集成的TPM模块发生变化，自然无法解密了</p><p>清除<code>C:\ProgramData\Tailscale\</code>目录后重启<code>tailscaled</code>服务，重新登录即可</p><h3 id="杂项"><a class="markdownIt-Anchor" href="#杂项"></a> 杂项</h3><p>其实问题还是挺多的，不过好在直接砸脸上，没有那么隐蔽。一开机就是Windows Hello失效，PIN、指纹和<span class="annotated" data-tippy-content="Passkeys">通行密钥</span>都要重新设置，工作账户（E5订阅）重新登录，系统也要激活，机哥的控制中心的各个功能要切换一下才能同步状态</p><p>而且我是双系统（Windows 11 + Ubuntu），并且用GRUB管理，所以需要设置Ubuntu为UEFI启动首选项</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2048/1536;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213854-699fe24366b17.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213854-699fe24366b17.jpg@!normal" alt="IMG_20260201_213854.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="IMG_20260201_213854.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213854-699fe24366b17.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">IMG_20260201_213854.jpg</span></div></div>    </div>    <div class="cell" style="">    <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2048/1536;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213857-69a04a4d22a99.jpg@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213857-69a04a4d22a99.jpg@!normal" alt="IMG_20260201_213857.jpg" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" download="IMG_20260201_213857.jpg" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/IMG_20260201_213857-69a04a4d22a99.jpg"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div><div class="image-meta"><span class="image-caption center">IMG_20260201_213857.jpg</span></div></div>    </div>    </div><p>同时由于MT7922的蓝牙在Ubuntu下有问题，我之前手动打了<a href="https://lkml.org/lkml/2024/3/15/325">这个补丁</a>后编译了内核，没有签名，还需要关闭安全启动，不然就会报错“无效的shim签名&amp;您需要先加载内核”</p><blockquote><p>更新：在开启安全启动时，它不会加载某些未经签名的驱动，如N卡驱动</p></blockquote><h2 id="最后"><a class="markdownIt-Anchor" href="#最后"></a> 最后</h2><p>电脑烧的时候倒不是很慌，<span class="annotated" data-tippy-content="耀中广场那有家黑店，张口就要2699😅">换主板和USB小板共1100</span>，找老师报销就完了。真正担心的是我数据，一堆代码都在本地，比如出事当天刚给组里写了两个模块都没推送。搞好上面的问题后火速装了syncthing同步到两台服务器上。</p><p>不过同步之前要配置“忽略模式”去掉依赖等可重新构建的文件，这里放一份让AI概括的版本：</p><figure class="highlight text"><figcaption><span>.stignore</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br></pre></td><td class="code"><pre><span class="line">// ------------------------------------------------</span><br><span class="line">// 1. 系统与元数据 (System &amp; Metadata)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// Windows</span><br><span class="line">Thumbs.db</span><br><span class="line">desktop.ini</span><br><span class="line">$RECYCLE.BIN</span><br><span class="line">System Volume Information</span><br><span class="line"></span><br><span class="line">// macOS</span><br><span class="line">.DS_Store</span><br><span class="line">.AppleDouble</span><br><span class="line">.LSOverride</span><br><span class="line">._*</span><br><span class="line">.Trashes</span><br><span class="line">.fseventsd</span><br><span class="line"></span><br><span class="line">// Synology / QNAP NAS</span><br><span class="line">@eaDir</span><br><span class="line">.nomedia</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 2. 版本控制 (Version Control)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 注意：Syncthing 同步 .git 目录容易导致仓库损坏，</span><br><span class="line">// 建议忽略 .git，只同步工作区文件。</span><br><span class="line">.git</span><br><span class="line">.gitignore</span><br><span class="line">.gitattributes</span><br><span class="line">.gitmodules</span><br><span class="line">.svn</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 3. 临时文件与日志 (Temp &amp; Logs)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">*.log</span><br><span class="line">*.tmp</span><br><span class="line">*.bak</span><br><span class="line">*.cache</span><br><span class="line">*.swp</span><br><span class="line">*.swo</span><br><span class="line">*~</span><br><span class="line">logs/</span><br><span class="line">tmp/</span><br><span class="line">temp/</span><br><span class="line">npm-debug.log*</span><br><span class="line">yarn-debug.log*</span><br><span class="line">yarn-error.log*</span><br><span class="line">pnpm-debug.log*</span><br><span class="line">.eslintcache</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 4. IDE 与 编辑器配置 (IDE / Editors)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 避免不同设备间的路径配置冲突</span><br><span class="line">.vscode/</span><br><span class="line">.idea/</span><br><span class="line">*.iml</span><br><span class="line">*.ipr</span><br><span class="line">*.iws</span><br><span class="line">.settings/</span><br><span class="line">.project</span><br><span class="line">.classpath</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 5. Node.js / 前端开发 (Node &amp; Frontend)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">**/node_modules/</span><br><span class="line">bower_components/</span><br><span class="line">jspm_packages/</span><br><span class="line">.npm</span><br><span class="line">.yarn</span><br><span class="line"></span><br><span class="line">// 构建产物 (Build Artifacts)</span><br><span class="line">**/dist/</span><br><span class="line">**/build/</span><br><span class="line">out/</span><br><span class="line">target/</span><br><span class="line">.output/</span><br><span class="line">.storybook-out/</span><br><span class="line"></span><br><span class="line">// 框架特定缓存</span><br><span class="line">.next/</span><br><span class="line">.nuxt/</span><br><span class="line">.vite/</span><br><span class="line">.cache-loader/</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 6. Python / Django</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">__pycache__/</span><br><span class="line">*.pyc</span><br><span class="line">*.pyo</span><br><span class="line">*.pyd</span><br><span class="line">venv/</span><br><span class="line">.venv/</span><br><span class="line">env/</span><br><span class="line">ENV/</span><br><span class="line">.pytest_cache/</span><br><span class="line">.coverage</span><br><span class="line">htmlcov/</span><br><span class="line">*.egg-info/</span><br><span class="line">.mypy_cache/</span><br><span class="line"></span><br><span class="line">// Django 静态文件与媒体 (根据需求调整)</span><br><span class="line">staticfiles/</span><br><span class="line">// media/  &lt;-- 媒体文件通常建议同步，如果不需要请取消注释</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 7. Java / JVM</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">*.class</span><br><span class="line">*.jar</span><br><span class="line">*.war</span><br><span class="line">*.ear</span><br><span class="line">.gradle/</span><br><span class="line">.mvn/</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 8. PHP / Laravel</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">vendor/</span><br><span class="line">storage/framework/cache/</span><br><span class="line">storage/framework/sessions/</span><br><span class="line">storage/framework/views/</span><br><span class="line">storage/logs/</span><br><span class="line">.phpunit.result.cache</span><br><span class="line"></span><br><span class="line">// ------------------------------------------------</span><br><span class="line">// 9. Docker &amp; 数据库 (Docker &amp; Databases)</span><br><span class="line">// ------------------------------------------------</span><br><span class="line">docker-data/</span><br><span class="line">docker-volumes/</span><br><span class="line">*.pid</span><br><span class="line">*.sock</span><br><span class="line">db.sqlite3</span><br><span class="line">*.db</span><br><span class="line">*.sqlitedb</span><br><span class="line"></span><br><span class="line">(?size &gt; 1024M)</span><br></pre></td></tr></tbody></table></figure><p>现在想想，果然事教人一教就会<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/sharkgoa/44.png"></span><br>之前想着体积太大了不好像其他资料一样全量备份，数量太多也不好像照片一样增量备份到云服务商。用syncthing备份到自己服务器上就两全其美了</p><p>btw，机哥新开机动画挺好看的</p><div class="tag-plugin video-player" style="max-width:100%;">  <video controls="" preload="" playsinline="" webkit-playsinline="">  <source src="https://onedrive-storge.hzchu.top/FIles/解决一些笔记本电脑更换主板后的问题/VID_20260201_214221_computer_blurred.mp4" type="video/mp4">Your browser does not support the video tag.  </video>  </div>]]>
    </content>
    <id>https://blog.hzchu.top/2026/solve-laptop-motherboard-problems/</id>
    <link href="https://blog.hzchu.top/2026/solve-laptop-motherboard-problems/"/>
    <published>2026-02-26T21:18:30.000Z</published>
    <summary>安全是够安全了，如果能再方便一点就更好了</summary>
    <title>解决一些笔记本电脑更换主板后的问题</title>
    <updated>2026-02-26T21:43:52.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>thun888</name>
    </author>
    <category term="瞎折腾" scheme="https://blog.hzchu.top/categories/%E7%9E%8E%E6%8A%98%E8%85%BE/"/>
    <category term="网站" scheme="https://blog.hzchu.top/tags/%E7%BD%91%E7%AB%99/"/>
    <content>
      <![CDATA[<p>前天下午上传图片时发现服务器OpenResty崩了，手动启动报错<code>Illegal instruction</code></p><p>说实话我看到这报错还是挺懵的，看了一眼CPU型号发现是二代E5</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:645/183;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9ca5e2771.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9ca5e2771.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9ca5e2771.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>明明之前是四代的，还偷偷降配置了？<br>旧E5不支持AVX2指令集，原先编译好的无法运行<br>发工单问了下，说我这套餐“不承诺CPU型号”，虽然很不爽，但又拿他没办法，事已至此先重新编译下吧</p><h2 id="命令"><a class="markdownIt-Anchor" href="#命令"></a> 命令</h2><p>安装是在内置的”应用“里安装的，需要找到安装时执行了什么命令才好复原。我用<a href="https://deepwiki.com/acepanel/panel">DeepWiki</a>索引了该面板的仓库，找到了相关的api接口，获取到路径后下载脚本（<code>dl.acepanel.net/nginx/install.sh</code>）</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1693/1047;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9e927ef9a.png@!normal" data-original-src="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9e927ef9a.png@!normal" data-fancybox="true" onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24' path fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"><a class="image-download blur" style="opacity:0" target="_blank" href="https://gate.assets.hzchu.top/fs/old/files/mount/pic/myself/2026/02/image-699f9e927ef9a.png"><svg class="icon" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><use href="#icon-image-download"></use></svg></a></div></div><p>找到安装脚本就好办了，重新执行以下命令即可</p><figure class="highlight bash"><figcaption><span>install.sh</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /www/server/nginx/src/ngx_brotli/deps/brotli</span><br><span class="line"><span class="built_in">rm</span> -r out</span><br><span class="line"><span class="built_in">mkdir</span> out &amp;&amp; <span class="built_in">cd</span> out</span><br><span class="line">cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_C_FLAGS=<span class="string">"-Ofast -march=native -mtune=native -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections"</span> -DCMAKE_CXX_FLAGS=<span class="string">"-Ofast -march=native -mtune=native -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections"</span> -DCMAKE_INSTALL_PREFIX=./installed ..</span><br><span class="line">cmake --build . --config Release --target brotlienc</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /www/server/nginx/src/</span><br><span class="line">make clean</span><br><span class="line">./configure --user=www --group=www \</span><br><span class="line">    --prefix=/www/server/nginx \</span><br><span class="line">    --add-module=/www/server/nginx/src/ngx_cache_purge \</span><br><span class="line">    --add-module=/www/server/nginx/src/nginx-sticky-module \</span><br><span class="line">    --with-openssl=/www/server/nginx/src/openssl \</span><br><span class="line">    --with-openssl-opt=<span class="string">"no-tests enable-ktls"</span> \</span><br><span class="line">    --with-pcre=/www/server/nginx/src/pcre2 --with-pcre-jit \</span><br><span class="line">    --with-ld-opt=<span class="string">"-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections"</span> \</span><br><span class="line">    --with-cc-opt=<span class="string">"-march=native -mtune=native -Ofast -funroll-loops -ffunction-sections -fdata-sections -Wl,--gc-sections"</span> \</span><br><span class="line">    --with-file-aio \</span><br><span class="line">    --with-threads \</span><br><span class="line">    --with-compat \</span><br><span class="line">    --with-http_v2_module --with-http_v3_module \</span><br><span class="line">    --with-http_slice_module \</span><br><span class="line">    --with-stream --with-stream_ssl_module --with-stream_realip_module --with-stream_ssl_preread_module \</span><br><span class="line">    --with-http_stub_status_module \</span><br><span class="line">    --with-http_ssl_module \</span><br><span class="line">    --with-http_image_filter_module \</span><br><span class="line">    --with-http_gzip_static_module --with-http_gunzip_module \</span><br><span class="line">    --with-http_sub_module \</span><br><span class="line">    --with-http_flv_module \</span><br><span class="line">    --with-http_addition_module \</span><br><span class="line">    --with-http_realip_module \</span><br><span class="line">    --with-http_mp4_module \</span><br><span class="line">    --with-http_auth_request_module \</span><br><span class="line">    --with-http_secure_link_module \</span><br><span class="line">    --with-http_random_index_module \</span><br><span class="line">    --with-http_dav_module \</span><br><span class="line">    --add-module=/www/server/nginx/src/nginx-dav-ext-module \</span><br><span class="line">    --add-module=/www/server/nginx/src/ngx_http_security_headers_module \</span><br><span class="line">    --add-module=/www/server/nginx/src/ngx_http_trim_filter_module \</span><br><span class="line">    --add-module=/www/server/nginx/src/ngx_brotli \</span><br><span class="line">    --add-module=/www/server/nginx/src/ngx_http_zstd_module</span><br><span class="line">make -j$(<span class="built_in">nproc</span>)</span><br><span class="line">make install</span><br></pre></td></tr></tbody></table></figure><blockquote><p>注：安装脚本里与面板程序的交互已经是新版本的了，完全不兼容旧版本，换句话说旧版本里应用商店用不了了。天天破坏性变更<span class="tag-plugin emoji"><img no-lazy="" class="inline" src="https://emoticons.assets.hzchu.top/emoticons/Blob/blobcatcomftears.png"></span></p></blockquote>]]>
    </content>
    <id>https://blog.hzchu.top/2026/haozi-openresty-build/</id>
    <link href="https://blog.hzchu.top/2026/haozi-openresty-build/"/>
    <published>2026-02-26T11:41:14.000Z</published>
    <summary>重新编译以在旧处理器上运行</summary>
    <title>手动编译耗子面板安装的OpenResty</title>
    <updated>2026-02-26T11:41:14.000Z</updated>
  </entry>
</feed>
