<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>MBRjun-Blog</title>
  
  
  <link href="https://www.libmbr.com/atom.xml" rel="self"/>
  
  <link href="https://www.libmbr.com/"/>
  <updated>2026-03-25T08:43:34.000Z</updated>
  <id>https://www.libmbr.com/</id>
  
  <author>
    <name>MBRjun</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>PVE 9.1 OCI 原生容器体验</title>
    <link href="https://www.libmbr.com/archives/516/"/>
    <id>https://www.libmbr.com/archives/516/</id>
    <published>2026-03-25T04:13:59.000Z</published>
    <updated>2026-03-25T08:43:34.000Z</updated>
    
    <content type="html"><![CDATA[<p>PVE 9.1 新增了对 OCI 格式容器的支持。部分曾经需要使用 Docker 或 Podman 运行的容器，现在可以直接在 Proxmox VE 内原生导入运行。在此记录一下容器的配置过程和注意事项。</p><span id="more"></span><h2 id="TLDR"><a href="#TLDR" class="headerlink" title="TLDR"></a>TLDR</h2><ul><li>目前不支持特权容器（下载后无法导入，部分要求特权的容器以非特权导入可能不能正常启动）</li><li>可以全图形化操作，但是部分操作使用命令会更方便</li><li>使用 Docker 运行容器时，容器内可检测 Running within a container，使用 Proxmox VE 原生运行时未检出，具体机制未探明</li><li>使用 vmbr 联网，或自己配置硬件直通，似乎没有办法直接共享宿主机 IP</li></ul><h2 id="下载容器模板"><a href="#下载容器模板" class="headerlink" title="下载容器模板"></a>下载容器模板</h2><p>找到模板下载页面，将 Docker 命令 <code>docker pull vaultwarden/server:latest</code> 中的 <code>vaultwarden/server:latest</code> 直接粘贴至 <code>Reference</code> 输入框，然后等待容器下载：  </p><p><img src="https://lfs.libmbr.com/assets/2026/03/25/c0432bf6-049f-45eb-9bc2-a95421f32709.webp" alt="Pull OCI in Proxmox VE"></p><p>模板下载后，可按 LXC 容器导入流程进行导入  </p><h2 id="容器导入"><a href="#容器导入" class="headerlink" title="容器导入"></a>容器导入</h2><p>选择 Web UI 右上角 Create CT，或使用 <code>pct create</code> 命令，然后输入主机名、ID 等基本信息，<strong>确认非特权已勾选</strong>，选择容器模板，设置存储空间、内存占用限制等参数，创建容器：</p><p><img src="https://lfs.libmbr.com/assets/2026/03/25/aab56e94-f601-405a-b212-4bf51eef3c37.webp" alt="Create OCI CT in Proxmox VE"></p><h2 id="容器使用"><a href="#容器使用" class="headerlink" title="容器使用"></a>容器使用</h2><p>创建容器后，可根据自身需求在 Resources 菜单中创建数据盘，隔离容器本体和数据，以 Vaultwardedn 为例，可直接新建 &#x2F;data 的挂载点；Options &gt; Environment 可设置或修改容器的环境变量</p><p><em>常规 rootfs LXC 模板一般没有预设变量，OCI 模板可自动识别并设置</em></p><p><img src="https://lfs.libmbr.com/assets/2026/03/25/9db868e1-5d80-4bb1-a5b6-10579f683631.webp" alt="Proxmox VE CT Envs"></p><p>若测试没有问题，投入生产使用前请不要忘记设置 Start at boot。</p><h2 id="其他技术细节"><a href="#其他技术细节" class="headerlink" title="其他技术细节"></a>其他技术细节</h2><p>在常规 LXC 容器运行 next-server，进程树显示为：</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">├─lxc-start───systemd─┬─PM2 v5.4.3: God─┬─pnpm─┬─sh───next-server (v1───16*[&#123;next-server (v1&#125;]<br>│                     │                 │      └─9*[&#123;pnpm&#125;]<br>│                     │                 └─10*[&#123;PM2 v5.4.3: God&#125;]<br>│                     ├─3*[agetty]<br>│                     ├─cron<br>│                     ├─dbus-daemon<br>│                     ├─2*[dhclient]<br>│                     ├─master─┬─pickup<br>│                     │        └─qmgr<br>│                     ├─postgres───5*[postgres]<br>│                     ├─sshd<br>│                     └─systemd-*<br></code></pre></td></tr></table></figure><p>在常规 LXC 容器运行 Docker，再使用 Docker 运行服务，进程树显示为：</p><figure class="highlight plaintext"><table><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></pre></td><td class="code"><pre><code class="hljs plaintext">├─lxc-start───systemd─┬─NetworkManager───3*[&#123;NetworkManager&#125;]<br>│                     ├─3*[agetty]<br>│                     ├─blkmapd<br>│                     ├─containerd───11*[&#123;containerd&#125;]<br>│                     ├─containerd-shim─┬─s6-svscan─┬─s6-supervise───s6-linux-init-s<br>│                     │                 │           ├─s6-supervise───s6-ipcserverd<br>│                     │                 │           ├─s6-supervise<br>│                     │                 │           └─s6-supervise───python3─┬─go2rtc───11*[&#123;go2rtc&#125;]<br>│                     │                 │                                    └─27*[&#123;python3&#125;]<br>│                     │                 └─12*[&#123;containerd-shim&#125;]<br>│                     ├─cron<br>│                     ├─dbus-daemon<br>│                     ├─dockerd───12*[&#123;dockerd&#125;]<br>│                     ├─master─┬─pickup<br>│                     │        └─qmgr<br>│                     ├─os-agent───4*[&#123;os-agent&#125;]<br>│                     ├─polkitd───3*[&#123;polkitd&#125;]<br>│                     ├─rpcbind<br>│                     ├─sshd<br>│                     └─systemd-*<br></code></pre></td></tr></table></figure><p>直接导入 OCI 模板容器，进程树显示为：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">├─lxc-start───vaultwarden───20*[&#123;vaultwarden&#125;]<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;PVE 9.1 新增了对 OCI 格式容器的支持。部分曾经需要使用 Docker 或 Podman 运行的容器，现在可以直接在 Proxmox VE 内原生导入运行。在此记录一下容器的配置过程和注意事项。&lt;/p&gt;</summary>
    
    
    
    <category term="技术" scheme="https://www.libmbr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="PVE" scheme="https://www.libmbr.com/tags/PVE/"/>
    
    <category term="Proxmox" scheme="https://www.libmbr.com/tags/Proxmox/"/>
    
    <category term="Docker" scheme="https://www.libmbr.com/tags/Docker/"/>
    
    <category term="容器" scheme="https://www.libmbr.com/tags/%E5%AE%B9%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>EdgeOne CDN 使用简评</title>
    <link href="https://www.libmbr.com/archives/515/"/>
    <id>https://www.libmbr.com/archives/515/</id>
    <published>2025-12-31T16:00:00.000Z</published>
    <updated>2025-12-31T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>给 Blog 用了几个月之后写个评测。发点技术细节和常见的坑，顺带和同类产品对比一下，看看 EdgeOne 的优缺点。</p><span id="more"></span><div class="alert info"><p>鉴于 EdgeOne 免费版还是个新东西，本文后续还可能接着更。如果后续更新的话，就直接在末尾按时间追加了。  </p><p>当前文章版本：2026-01-01（初始）</p></div><div class="alert info"><p>仅为个人使用体验分享。文章不构成广告、推广或产品购买建议。若存在内容错误请联系我修改，谢谢。</p></div><h2 id="接入"><a href="#接入" class="headerlink" title="接入"></a>接入</h2><p>支持 NS 接入、CNAME 接入、DNSPod 托管接入。</p><p>CNAME 接入和 DNSPod 托管接入本质上是一个东西。只不过可以直接在 EdgeOne 控制台配置记录了。</p><h3 id="CNAME"><a href="#CNAME" class="headerlink" title="CNAME"></a>CNAME</h3><p>使用 CNAME 接入方法，需要将加速域名解析至 <code>[DOMAIN].eo.dnse2.com.</code>。</p><p>TTL 为 60 秒，不可更改。dnse2.com 区域使用 QEODNS，区域未配置 DNSSEC。</p><h3 id="NS"><a href="#NS" class="headerlink" title="NS"></a>NS</h3><p>NS 接入即使用 QEODNS。  </p><p>使用 NS 接入方法，需要修改域名权威 DNS 至 QEODNS。</p><h3 id="QEODNS"><a href="#QEODNS" class="headerlink" title="QEODNS"></a>QEODNS</h3><p>QEODNS 这个名字未在文档公开提及，但是他域名叫这个。来源应该是 <strong>Q</strong>Q&#x2F;<strong>Q</strong>Cloud <strong>E</strong>dge<strong>O</strong>ne <strong>DNS</strong>。  </p><p>和同类产品去比，主要应该是有这些优点：</p><ul><li>具有 AIA &#x2F; AnyCast 特性。实际测试上，解析性能略优于 DNSPod 和 阿里云 DNS。</li><li>允许自定义 NS 域名（自定义的域名必须是当前加速域名，即，加速 example.com 不能使用 example-2.com 作为自定义 NS 域名）。</li><li>可开启使用 DNSSEC（摘要：2(SHA256) 算法：13(ECDSAP256SHA256)）。</li><li>以上三条是免费特性</li></ul><p>缺点：</p><ul><li>不支持 IPv6。至少写文章的时候还没支持，发 FR 了。可以期待下未来支持。</li><li>TXT 记录最长设置 256 字节。可能影响 DKIM 等应用的配置。</li><li>CNAME 和其他类型记录严格冲突。</li><li>NS 和其他类型记录严格冲突。（这是个 Bug，发工单了，什么时候修复就不知道了。）<br>此 Bug 具体影响是开了自定义 DNS，@ 区域的记录就没法修改和新增了。  </li><li>不支持批量导出记录。（支持导入）</li><li>GeoDNS 为付费特性。</li></ul><p>然后是一些技术特性：</p><ul><li>DNSSEC 的 NSEC 使用了 Black Lies 防止 Zone Walking。</li><li>开启 CNAME 加速后，加速域名解析直接返回 A&#x2F;AAAA，跳过 <code>[DOMAIN].eo.dnse2.com.</code></li><li>解析 TTL 设置范围是 60 - 86400 秒。NS、SOA 记录的默认 TTL 是 21600 秒。</li></ul><h2 id="回源"><a href="#回源" class="headerlink" title="回源"></a>回源</h2><p>回源可以是 IP&#x2F;域名，也可以是 S3 桶。  </p><p>主要技术特性如下：</p><ul><li>免费版支持负载均衡。故障转移要求付费套餐。</li><li>支持 IPv6。（本站就是纯 IPv6 回源）</li><li>支持域名回源。</li><li>支持自定义端口。</li><li>支持自定义 回源 Host。</li><li>支持 HTTP&#x2F;2 回源。<strong>（没有 ALPN 或回落机制！使用 HTTP 回源时强制使用 H2c。若源站不支持 HTTP&#x2F;2，但开启了 H2 回源，请求将直接失败。）</strong></li></ul><h2 id="性能"><a href="#性能" class="headerlink" title="性能"></a>性能</h2><p>看起来是 OK 的，其实可以用本站来测速（  </p><p>后续可能会补个测速结果在这</p><h2 id="安全"><a href="#安全" class="headerlink" title="安全"></a>安全</h2><p>带一点基础 WAF 的功能。最近的 React 漏洞 CDN 自动防护确实保障了服务器稳定性没掉。</p><p>免费版抗 CC 貌似是可以的，帮我扛了一次 18 Gbps，20 TB 的攻击。被打了看后台才知道，也没个主动通知。  </p><p><img src="https://lfs.libmbr.com/assets/2026/01/01/623b40bd-4473-42e2-b8e9-8cf5d96eeb0b.webp" alt="EdgeOne Protection"></p><h2 id="稳定性"><a href="#稳定性" class="headerlink" title="稳定性"></a>稳定性</h2><p>目前看起来也没问题，比某些友商强，先丢个图在这。<br><img src="https://lfs.libmbr.com/assets/2026/01/01/eabb79f0-5afa-4861-b21e-c488631fbaa2.webp" alt="EdgeOne Stability"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;给 Blog 用了几个月之后写个评测。发点技术细节和常见的坑，顺带和同类产品对比一下，看看 EdgeOne 的优缺点。&lt;/p&gt;</summary>
    
    
    
    <category term="技术" scheme="https://www.libmbr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="CDN" scheme="https://www.libmbr.com/tags/CDN/"/>
    
    <category term="腾讯云" scheme="https://www.libmbr.com/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/"/>
    
    <category term="EdgeOne" scheme="https://www.libmbr.com/tags/EdgeOne/"/>
    
  </entry>
  
  <entry>
    <title>Proxmox VE SR-IOV 开启流量统计</title>
    <link href="https://www.libmbr.com/archives/514/"/>
    <id>https://www.libmbr.com/archives/514/</id>
    <published>2025-11-18T16:00:00.000Z</published>
    <updated>2025-11-18T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>默认配置下，网卡开启 SR-IOV 后需要将虚拟机的网卡类型改为 PCIe 直通，修改为直通后 Proxmox VE 无法正常读取统计信息。提供一个不太优雅的解决方法。</p><span id="more"></span><h2 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h2><p>需要使用到 <a href="https://docs.kernel.org/networking/representors.html">VF Representors 接口</a>（下文简称 Reps）。网卡必须支持并开启 SwitchDev 特性。  </p><ul><li>mlx5 网卡开启 E-Switch 分载、SwitchDev 特性可以阅读<a href="/archives/508/#%E9%85%8D%E7%BD%AE-E-Switch-%E5%88%86%E8%BD%BD">这篇文章</a>。</li></ul><h2 id="Reps-接口命名"><a href="#Reps-接口命名" class="headerlink" title="Reps 接口命名"></a>Reps 接口命名</h2><p>Proxmox VE 9 及更新版本中，Reps 接口的系统默认命名规则是 <code>PFNAMErVFID</code>  </p><p>如果使用老版本，Reps 接口命名规则由网卡驱动决定，以 NVIDIA&#x2F;Mellanox 网卡为例，命名规则为 <code>PFNAMEpfXvfY</code>，X 为 PF 接口号，Y 为 VF 接口号。  </p><h2 id="修改前检查"><a href="#修改前检查" class="headerlink" title="修改前检查"></a>修改前检查</h2><p>SR-IOV 接口有网络活动时，宿主机上的 VF Representors 接口统计数据会正常更新。</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">$ ifconfig ens0f0h1<br>ens0f0h1: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500<br>        inet6 fe80::1c70:19ff:fefe:56fb  prefixlen 64  scopeid 0x20&lt;link&gt;<br>        ether 1e:70:19:fe:56:fb  txqueuelen 1000  (Ethernet)<br>        RX packets 307679053  bytes 212674010217 (198.0 GiB)<br>        RX errors 0  dropped 0  overruns 0  frame 0<br>        TX packets 246924012  bytes 159490311908 (148.5 GiB)<br>        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0<br></code></pre></td></tr></table></figure><p>确认接口数据正常后即可修改 PVE 代码。</p><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><ol><li><p>先找到 SR-IOV VF 对应的 Representor 接口。</p></li><li><p>修改 <code>/usr/share/perl5/PVE/ProcFSTools.pm</code><br>找到 <code>read_proc_net_dev</code> 函数，大概位置在第 375 行。<br>在 <code>return</code> 前加入下面代码：</p></li></ol><figure class="highlight perl"><table><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><code class="hljs perl"><span class="hljs-keyword">if</span> (!<span class="hljs-keyword">exists</span> $res-&gt;&#123;<span class="hljs-string">&#x27;TAP-DEV&#x27;</span>&#125; &amp;&amp; <span class="hljs-keyword">exists</span> $res-&gt;&#123;<span class="hljs-string">&#x27;VF-REP-DEV&#x27;</span>&#125;) &#123;<br>    $res-&gt;&#123;<span class="hljs-string">&#x27;TAP-DEV&#x27;</span>&#125; = &#123;<br>        %&#123;$res-&gt;&#123;<span class="hljs-string">&#x27;VF-REP-DEV&#x27;</span>&#125;&#125;<br>    &#125;;<br>&#125;<br></code></pre></td></tr></table></figure><ul><li><code>TAP-DEV</code> 修改为 <code>tapXXXiY</code>，<code>XXX</code> 为 VMID，<code>Y</code>为网卡序号（任意非负整数，且不与已存在的序号重复）</li><li><code>VF-REP-DEV</code> 修改为 Representor 接口名。</li></ul><ol start="3"><li><p>如果存在多个接口、多个 VM，则为每个接口、每个 VM 重复上面的步骤。</p></li><li><p>重启 pvestatd ：<br><code>systemctl restart pvestatd</code></p></li></ol><p>操作完成后即可看到 WebUI 正常显示流量统计：<br><img src="https://lfs.libmbr.com/assets/2025/11/19/52f7f5aa-1b39-4907-b4a9-9192e14aa0b2.webp" alt="Proxmox VE WebUI Network Stats"></p><h2 id="关闭更新"><a href="#关闭更新" class="headerlink" title="关闭更新"></a>关闭更新</h2><div class="alert info"><p>此步骤是可选的。</p></div><p>系统更新可能会覆盖上述更改。  </p><p>使用下面的命令阻止更新：</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl">apt-mark hold libpve-common-perl<br></code></pre></td></tr></table></figure><p>使用下面的命令恢复更新：</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs perl">apt-mark unhold libpve-common-perl<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;默认配置下，网卡开启 SR-IOV 后需要将虚拟机的网卡类型改为 PCIe 直通，修改为直通后 Proxmox VE 无法正常读取统计信息。提供一个不太优雅的解决方法。&lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Linux" scheme="https://www.libmbr.com/tags/Linux/"/>
    
    <category term="虚拟机" scheme="https://www.libmbr.com/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    
    <category term="PVE" scheme="https://www.libmbr.com/tags/PVE/"/>
    
    <category term="网卡" scheme="https://www.libmbr.com/tags/%E7%BD%91%E5%8D%A1/"/>
    
    <category term="SR-IOV" scheme="https://www.libmbr.com/tags/SR-IOV/"/>
    
  </entry>
  
  <entry>
    <title>纸质铁路报销凭证</title>
    <link href="https://www.libmbr.com/archives/513/"/>
    <id>https://www.libmbr.com/archives/513/</id>
    <published>2025-09-21T13:02:00.000Z</published>
    <updated>2025-09-21T14:25:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>除跨境和非互联网售票区段，2025 年 10 月及之后发车的 CR 车次将不再能打印纸质报销凭证。再过个几年、十几年，也许就会有人完全没见过纸质的车票和报销凭证了  </p><p>在仍然能打印报销凭证的最后几天里，我用这篇文章讲一下纸质票和报销凭证的细节，供后人考古研究吧。</p><span id="more"></span><h2 id="车票正面信息"><a href="#车票正面信息" class="headerlink" title="车票正面信息"></a>车票正面信息</h2><p>先放一张车票的图片再讲。</p><p><img src="https://lfs.libmbr.com/assets/2025/09/21/be8867d3-e82a-480c-8484-aff290cda116.webp" alt="中国铁路车票6437次202509"></p><p>按从上到下，从左到右的顺序来：</p><p>第一行：  </p><ul><li><p><strong>票号</strong><br>为红色字体，其他均为黑色字体<br>票号是自增的，长度不固定，开头可能会存在字母。</p></li><li><p><strong>检票口</strong><br>不一定存在：距离发车时间较远，打印车票或报销凭证不会显示检票口。登机牌其实也是这样的</p></li></ul><p>第二行：</p><ul><li><strong>出发站</strong><br>下面会用小字写车站英文名（境内大多数使用拼音）</li><li><strong>车次号</strong><br>纯数字：普客；K：快速；T：特快；Z：直达特快；C：城际；D：动车；G：高铁动车；S：市域&#x2F;郊；Y：旅游</li><li><strong>到达站</strong></li></ul><p>第三行：</p><ul><li><strong>发车时间</strong><br>列车从出发站开出的日期时间</li><li><strong>席位</strong><br>可能会出现：无座、不对号入座</li></ul><p>第四行：</p><ul><li><strong>购票价格</strong><br>特殊情况（如中转签证车票）可以达到 0 元</li><li><strong>购票标记</strong><ul><li><strong>网</strong>：网上购票，线下取票。（仅适用于车票）</li><li><strong>现</strong>：使用现金支付。（仅适用于车票）</li><li><strong>支</strong>：使用支付宝支付。（仅适用于车票）</li><li><strong>孩</strong>：儿童票。</li><li><strong>惠</strong>：优惠票价。</li></ul></li><li><strong>席别</strong></li></ul><p>第五行为票类型，一般会出现：</p><ul><li><strong>限乘当日当次车</strong><br>这是一张车票。</li><li><strong>退票费</strong><br>这是退票报销凭证。</li><li><strong>（空）</strong><br>这是报销凭证、中转签证或通票。</li></ul><p>第六行是通票信息或报销凭证标记：</p><ul><li><strong>仅供报销使用</strong><br>这是一张报销凭证。</li></ul><p>第七行为购票人信息，非实名制车票此行留空：</p><ul><li><p><strong>证件号</strong><br>购票证件为居民身份证时，11-14 位会被替换为 *<br>使用其他购票证件，后两位替换为 *</p></li><li><p><strong>姓名</strong></p></li></ul><p>第七行结束后，会有一段文字信息，目前的多为：</p><ul><li><strong>报销凭证 遗失不补</strong><br><strong>退票改签请交会车站</strong><br>即使打印的是车票，而不是报销凭证，仍有可能这样显示。  </li><li><strong>温馨提示：本次列车途经琼州海峡，特殊季节遇台风等恶劣天气，轮渡可能停航，敬请关注天气预报。</strong><br>特殊提示可能不会加方框</li><li><strong>买票请到12306 发货请到95306</strong><br><strong>中国铁路祝您路途愉快</strong><br>经典的车票文字，目前已经极为少见</li></ul><p>第六、七行右侧会有一个二维码，内容为一段纯数字，使用微信或 12306 App 扫码可以查看车票信息，具体编码机制未知。</p><p>最后一行：</p><ul><li><strong>完整车票号</strong><ul><li>0-5 位：车票&#x2F;报销凭证的打印车站编号<br><a href="https://www.jprailfan.com/tools/stat/index.php">查询工具</a></li><li>11-14 位：购票日期</li><li>15+ 位：同左上票号</li></ul></li><li><strong>证件类型</strong><ul><li>可能不存在</li><li>HZ：护照，类型为护照时后面可能加入三位地区码</li><li>JM：居民身份证</li></ul></li></ul><h2 id="车票背面信息"><a href="#车票背面信息" class="headerlink" title="车票背面信息"></a>车票背面信息</h2><p>车票的背面为<strong>乘车须知</strong>或<strong>报销凭证使用须知</strong>。</p><p>（图后续补）</p><p>部分红色车票背面下方会有可见磁条。  </p><h2 id="车票颜色"><a href="#车票颜色" class="headerlink" title="车票颜色"></a>车票颜色</h2><p>有红色和蓝色两种。蓝色车票本身质量更好、厚度更高，但车票上文字可能会发生褪色，而红色车票不易褪色。  </p><p>红色车票一般上下切割，而蓝色车票左右切割，且有固定切割点。  </p><p>目前绝大多数车站的可打印车票&#x2F;报销凭证均为蓝色。  </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;除跨境和非互联网售票区段，2025 年 10 月及之后发车的 CR 车次将不再能打印纸质报销凭证。再过个几年、十几年，也许就会有人完全没见过纸质的车票和报销凭证了  &lt;/p&gt;
&lt;p&gt;在仍然能打印报销凭证的最后几天里，我用这篇文章讲一下纸质票和报销凭证的细节，供后人考古研究吧。&lt;/p&gt;</summary>
    
    
    
    <category term="日常" scheme="https://www.libmbr.com/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="铁路" scheme="https://www.libmbr.com/tags/%E9%93%81%E8%B7%AF/"/>
    
    <category term="中国铁路" scheme="https://www.libmbr.com/tags/%E4%B8%AD%E5%9B%BD%E9%93%81%E8%B7%AF/"/>
    
    <category term="火车" scheme="https://www.libmbr.com/tags/%E7%81%AB%E8%BD%A6/"/>
    
  </entry>
  
  <entry>
    <title>月食观察 20250908</title>
    <link href="https://www.libmbr.com/archives/512/"/>
    <id>https://www.libmbr.com/archives/512/</id>
    <published>2025-09-08T15:26:00.000Z</published>
    <updated>2025-09-08T15:26:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>第一次观测月全食。没啥好的设备，直接用 iPhone 拍几张。</p><span id="more"></span><p>貌似前几年疫情时也是有一次月食的，不过没去看，这次刚好用空就出门看了，不知道下次能看到会是什么时候。  </p><p>下次再看也许会用更好的设备拍摄吧（  </p><p>天气还可以，月亮基本是目视不可见，但是手机拍照就能找到。</p><h2 id="AM-1-36"><a href="#AM-1-36" class="headerlink" title="AM 1:36"></a>AM 1:36</h2><ul><li><p>1x<br><img src="https://lfs.libmbr.com/assets/2025/09/08/cf9d092b-3c5a-4174-894e-9fafb93e4d73.webp" alt="月食观察20250908-1x"></p></li><li><p>3x<br><img src="https://lfs.libmbr.com/assets/2025/09/08/9e8f088e-82bc-47d7-9b0b-49d0067f18e9.webp" alt="月食观察20250908-3x"></p></li></ul><h2 id="AM-2-21"><a href="#AM-2-21" class="headerlink" title="AM 2:21"></a>AM 2:21</h2><ul><li><p>3x<br><img src="https://lfs.libmbr.com/assets/2025/09/08/c627863a-ab65-4388-a733-d91ddd37524a.webp" alt="月食观察20250908-3x2"></p></li><li><p>3x, 换观测位置<br><img src="https://lfs.libmbr.com/assets/2025/09/08/84e64c69-73c7-47df-a18d-56e3eae9293e.webp" alt="月食观察20250908-3x3"></p></li></ul><h2 id="表情包"><a href="#表情包" class="headerlink" title="表情包"></a>表情包</h2><p><img src="https://lfs.libmbr.com/assets/2025/09/08/5a7219a5-2241-4499-8dcf-347c337ab2e0.webp" alt="月食观察表情包"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;第一次观测月全食。没啥好的设备，直接用 iPhone 拍几张。&lt;/p&gt;</summary>
    
    
    
    <category term="日常" scheme="https://www.libmbr.com/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="月食" scheme="https://www.libmbr.com/tags/%E6%9C%88%E9%A3%9F/"/>
    
  </entry>
  
  <entry>
    <title>城市道路观察 Ⅰ 非机动车道</title>
    <link href="https://www.libmbr.com/archives/511/"/>
    <id>https://www.libmbr.com/archives/511/</id>
    <published>2025-09-01T05:32:00.000Z</published>
    <updated>2025-09-04T12:51:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>本来以为公路设计是全国统一的，多去了几个城市后发现每个地方都不一样。这个城市道路观察系列就收集下见过的不同道路设计。  </p><p>本篇收集不同的非机动车道（自行车道）。</p><span id="more"></span><h2 id="北京"><a href="#北京" class="headerlink" title="北京"></a>北京</h2><p>北京市内非机动车道均位于辅路。目前见过的大多都是设计在机动车道两侧，与机动车道同高，柏油路，高度低于旁边的人行道，宽度一般和机动车道等宽。  </p><p>除高速、快速公路，几乎所有公路路段均有非机动车道配置，包括首都放射状国道的北京段。</p><p>部分路段非机动车道、非机动车转弯路径地面刷红色油漆。</p><p>非机动车道不允许在人行道上骑行（但是可以推着车子），<del>可能会收到罚单的</del>。</p><ul><li>万泉庄桥（海淀区、苏州桥地铁站北）<br><img src="https://lfs.libmbr.com/assets/2025/09/01/d81d8a2f-ebab-4cfa-89bc-c490963afe6e.webp" alt="万泉庄桥"></li></ul><p>长安街等部分道路，非机动车道两侧或靠近人行道一侧加装护栏</p><ul><li>复兴门内大街（西城区、太平桥地铁站）<br>靠近人行道一侧设有护栏<br><img src="https://lfs.libmbr.com/assets/2025/09/01/3e62d97b-1143-4f89-b59e-89c3d3c943ea.webp" alt="复兴门内大街太平桥大街非机动车道"></li></ul><h2 id="天津"><a href="#天津" class="headerlink" title="天津"></a>天津</h2><p>与北京类似：非机动车道位于辅路。大多设计在机动车道两侧，与机动车道同高，柏油路，高度低于旁边的人行道。  </p><p>少部分路段（如团泊大道静海段），高度高于机动车道，和旁边的人行道平齐，其他无区别。</p><p>部分路段在非机动车道和机动车道中间设护栏、绿化带或公交站。</p><p>道路宽度普遍和机动车道相同或者更宽。  </p><p>原则上是非机动车道不允许在人行道上骑行，但是从来没见过有人管这个。</p><ul><li><p>团泊大道（静海区、团泊健康城地铁站）<br>靠近机动车道一侧设有绿化、和人行道平齐<br><img src="https://lfs.libmbr.com/assets/2025/09/01/4da50077-d6f2-446c-b7ad-e5070e478ffc.webp" alt="团泊大道静海"></p></li><li><p>工一号路（西青区、大学城一号路、大学城地铁站南）<br>更宽的非机动车道，宽度大约允许两辆汽车并排<br><img src="https://lfs.libmbr.com/assets/2025/09/01/429d55f3-5049-493a-a271-18d4095c0a05.webp" alt="工一号路"></p></li><li><p>围堤道（河西区、佟楼地铁站）<br><img src="https://lfs.libmbr.com/assets/2025/09/01/43c54326-c79f-4191-9d0d-c784e16f2657.webp" alt="围堤道"></p></li></ul><h2 id="上海"><a href="#上海" class="headerlink" title="上海"></a>上海</h2><p>与北京&#x2F;天津类似：非机动车道位于辅路。大多设计在机动车道两侧，与机动车道同高，柏油路，高度低于旁边的人行道。 </p><p>道路宽度普遍比机动车道更窄。</p><ul><li>凯旋路（长宁区、虹桥路地铁站）<br><img src="https://lfs.libmbr.com/assets/2025/09/01/7288e019-e747-409d-89cf-6c509aca01b9.webp" alt="凯旋路"></li></ul><h2 id="沈阳"><a href="#沈阳" class="headerlink" title="沈阳"></a>沈阳</h2><p>非机动车道通常建设在人行道旁，与人行道平齐，高于机动车道，且部分路段和人行道材质相同。</p><p>普遍和人行道不设隔离。部分路段靠近机动车道一侧有绿化。</p><ul><li><p>乐山西路（于洪区）<br><img src="https://lfs.libmbr.com/assets/2025/09/01/b611497e-7cbe-46a3-ad52-ddf72d908024.webp" alt="乐山西路"></p></li><li><p>青年大街（和平区、市图书馆地铁站）<br><img src="https://lfs.libmbr.com/assets/2025/09/01/c860414c-9be8-409c-8064-b38f34228471.webp" alt="青年大街"></p></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;本来以为公路设计是全国统一的，多去了几个城市后发现每个地方都不一样。这个城市道路观察系列就收集下见过的不同道路设计。  &lt;/p&gt;
&lt;p&gt;本篇收集不同的非机动车道（自行车道）。&lt;/p&gt;</summary>
    
    
    
    <category term="日常" scheme="https://www.libmbr.com/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="公路" scheme="https://www.libmbr.com/tags/%E5%85%AC%E8%B7%AF/"/>
    
    <category term="交通" scheme="https://www.libmbr.com/tags/%E4%BA%A4%E9%80%9A/"/>
    
    <category term="骑行" scheme="https://www.libmbr.com/tags/%E9%AA%91%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>2025 BW、AOSCC 和沈阳行</title>
    <link href="https://www.libmbr.com/archives/510/"/>
    <id>https://www.libmbr.com/archives/510/</id>
    <published>2025-08-20T05:00:00.000Z</published>
    <updated>2025-09-01T05:23:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>写点东西随便记录下今年的暑假，感觉一切都像一场梦。</p><span id="more"></span><h2 id="去-BW-的路上"><a href="#去-BW-的路上" class="headerlink" title="去 BW 的路上"></a>去 BW 的路上</h2><p>是第一次去 BW，本来是因为朋友去想跟着<del>，但是朋友没抢到票</del></p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/d54fd724-5f22-44ee-8352-04ca0c6384e0.webp" alt="放那么多票，你卖谁了"></p><p>主要基于时间考虑，选择飞 PEK - PVG</p><h3 id="北京"><a href="#北京" class="headerlink" title="北京"></a>北京</h3><p>第一次去 PEK 和 PVG，也是坐上首都机场线了，车迷去坐肯定是要先拍车的。这次是从东直门进站的，进付费区下楼后直接就是机场方向的站台（北新桥&#x2F;城区方向过不去），对于这种一票制的线路貌似也很合理。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/8d0c3997-5bd5-4527-a5db-2a33bc43d476.webp" alt="东直门进站检票口"></p><p>进付费区下楼后直接上车，列车在每站大概停不到一分钟，人比想象中还是多不少的，到三元桥的时候座位已经全满了。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/3536aa17-0e07-414e-9b5c-2852a0d0689e.webp" alt="首都机场线T3站"></p><p>地铁到机场后第一个感觉是挺凉快的，空调给的挺足，在此批评一下北京隔壁某个直辖市的机场，冬暖夏暖而且越往上走越热。</p><p>算上延误，差不多是提前5个小时就到机场了，所以打算是直接在机场里吃饭。机器上办完托运去安检。  </p><p>3C 新规出台后，安检前面会有个查充电宝的地方，有 3C 的充电宝会给你发个袋子，其他貌似就没什么特殊的了</p><p>首都机场 T3 由三部分组成，T3C、T3D、T3E，中间有小火车连接。本次乘坐的航班虽然在 T3C 登机，但还是去坐小火车看 T3D 楼了<del>（只是为了拍车）</del></p><p>T3C -&gt; T3D -&gt; T3E 地上都有很明显的标识，一般不会走错。反过来 T3E -&gt; T3D -&gt; T3C 基本没有标识。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/7bc1e2b5-14fa-4c44-bb4e-0ddd94a20bf9.webp" alt="首都机场线APM"></p><p>然后机场就没什么好讲的了，登机。航班有免费网络、有餐食。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/57fe92e1-a888-41d7-bd40-fe8d0703f656.webp" alt="机上wifi"></p><ul><li>AS4847 北京电信</li><li>36.110.0.0&#x2F;17</li><li>IPv4 Only</li></ul><p>聊天刷图什么都还可以，看视频就算了。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/56122f3e-6400-4b92-bcd3-04564318aec9.webp" alt="餐食"></p><p>餐食比想象中要好点。</p><h3 id="上海"><a href="#上海" class="headerlink" title="上海"></a>上海</h3><p>落的是 PVG S2，出机场用了半个小时。<del>浦东卫星厅没我想的大啊</del>，但是地铁挺酷的，没有座位，但是报站语音有“请把座位留给有需要的旅客”。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/7c05d2cb-0062-4f89-a012-bbd11d11ce8d.webp" alt="A359 PVG S2"></p><p>BW前一天选了个离机厅近的酒店，酒店房间到机厅路程不到1分钟。凌晨1点还有十几个人大b队，怀疑都是去 bw 的 wmc（</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/e77d6155-5ecc-49d1-9297-6d46bf44f2f7.webp" alt="嘉闵高架路"></p><p>上海市区的高架感觉很震撼，可能是因为北京天津市区里都不怎么见得到绿色的路牌。</p><h2 id="BilibiliWorld-2025"><a href="#BilibiliWorld-2025" class="headerlink" title="BilibiliWorld 2025"></a>BilibiliWorld 2025</h2><p>7点入场，排了半个小时队，场馆里空调开的还可以。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/fe92e040-c2be-40ff-ac6b-1727ad0aac63.webp" alt="禁止夜排"></p><p>禁止夜排当然指的是不能在场馆里排。去外面桥上排当然不管的哈。</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/5b4b08b7-6717-4a6d-ac45-d536ca5ae6fb.webp" alt="场馆里挤满了人"></p><p>人真的很多（</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/ffa2a817-ca72-4eb9-8f14-f9a084de17c1.webp" alt="绿猫"></p><p>绿猫可爱</p><p><img src="https://lfs.libmbr.com/assets/2025/08/20/15d13dd5-3856-41ea-9c55-9f88a5e3ba04.webp" alt="战利品"></p><p>最后一整天拿了这些东西（图片没拍全x</p><p>算是第一次逛漫展吧（大概，要是写心得的话还真不知道写什么x</p><h2 id="1462-次列车"><a href="#1462-次列车" class="headerlink" title="1462 次列车"></a>1462 次列车</h2><p>返程坐的是 1462，硬座，返程当天才知道有别的朋友坐的是同一班车。</p><p>上海发往北京的 1462 硬座大部分人都在中间下，很少有人坐到北京。或者说跨局旅客少，基本都是上海局、北京局内上下。</p><hr><h2 id="1461-次列车"><a href="#1461-次列车" class="headerlink" title="1461 次列车"></a>1461 次列车</h2><p>逛完 BW 回家，一周后继续去参加 AOSCC，选择 1461 次列车，硬座。</p><p>与 1462 不同的是，1461 有不少人从北京直接坐到上海，跨局旅客明显比 1462 多。</p><p>有其他 3 位朋友也搭乘 1461 次，都是去 AOSCC 的。</p><h2 id="AOSCC-2025-前一天"><a href="#AOSCC-2025-前一天" class="headerlink" title="AOSCC 2025 前一天"></a>AOSCC 2025 前一天</h2><p>前一天聚餐聊天，酒店里有位群友提了个点子，明天用舞萌 DX 的二维码签到，于是有另一个人直接做了个 <a href="https://sparrowhe.github.io/xxime-wrapper/">舞萌 DX 二维码生成工具</a>，可以把任何二维码塞进舞萌 DX 登录二维码。</p><p>玩舞萌玩的（</p><h2 id="AOSCC-2025-DAY-I"><a href="#AOSCC-2025-DAY-I" class="headerlink" title="AOSCC 2025 DAY I"></a>AOSCC 2025 DAY I</h2><p>非常好无料（</p><p><img src="https://lfs.libmbr.com/assets/2025/09/01/ea97c22b-82a8-49dd-8693-9f067b54022d.webp" alt="LS3A6000 AOSCC"></p><p>非常好签名墙————<br>画了个 NixOS 上去，然后群友在上面画了个苯环，<del>然后还有群友在旁边画了个<a href="https://zh.wikipedia.org/wiki/%E9%9B%8C%E4%BA%8C%E9%86%87">C₁₈H₂₄O₂</a></del></p><p><img src="https://lfs.libmbr.com/assets/2025/09/01/b0fb10ce-1b6d-4077-8892-fb579fc22587.webp" alt="签名墙"></p><h2 id="AOSCC-2025-DAY-II"><a href="#AOSCC-2025-DAY-II" class="headerlink" title="AOSCC 2025 DAY II"></a>AOSCC 2025 DAY II</h2><p>不知道写点啥了，发张绿猫（  </p><p><img src="https://lfs.libmbr.com/assets/2025/09/01/94a1442e-e7ce-4433-a747-a33eb4c35c36.webp" alt="绿猫"></p><p>sbchild 的日志打印机（</p><p><img src="https://lfs.libmbr.com/assets/2025/09/01/0ec46f71-f4b4-4500-9a3e-e11489bfe56b.webp" alt="打印日志"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;写点东西随便记录下今年的暑假，感觉一切都像一场梦。&lt;/p&gt;</summary>
    
    
    
    <category term="日常" scheme="https://www.libmbr.com/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="BiliBili" scheme="https://www.libmbr.com/tags/BiliBili/"/>
    
    <category term="漫展" scheme="https://www.libmbr.com/tags/%E6%BC%AB%E5%B1%95/"/>
    
    <category term="AOSCC" scheme="https://www.libmbr.com/tags/AOSCC/"/>
    
    <category term="开源社区" scheme="https://www.libmbr.com/tags/%E5%BC%80%E6%BA%90%E7%A4%BE%E5%8C%BA/"/>
    
    <category term="信创" scheme="https://www.libmbr.com/tags/%E4%BF%A1%E5%88%9B/"/>
    
  </entry>
  
  <entry>
    <title>Proxmox VE 9 升级</title>
    <link href="https://www.libmbr.com/archives/509/"/>
    <id>https://www.libmbr.com/archives/509/</id>
    <published>2025-08-10T16:00:00.000Z</published>
    <updated>2025-09-08T13:14:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Proxmox VE 9 和 Debian 13 正式发布。本文主要记录更新时、更新后可能遇到的问题和解决方案。</p><span id="more"></span><h2 id="更新教程"><a href="#更新教程" class="headerlink" title="更新教程"></a>更新教程</h2><p>按官网提供的教程完成即可：<br><a href="https://pve.proxmox.com/wiki/Upgrade_from_8_to_9">https://pve.proxmox.com/wiki/Upgrade_from_8_to_9</a></p><h2 id="新特性"><a href="#新特性" class="headerlink" title="新特性"></a>新特性</h2><ul><li>Debian 13</li><li>统计数据：新增了几个统计项，增加了统计频率<ul><li>宿主机：ZFS ARC、IO 压力、内存压力</li><li>VM：IO 压力、内存压力、占宿主机内存（推荐开启 balloon，不兼容 HugePages）</li><li>LXC：IO 压力、内存压力</li></ul></li><li>大幅更改了移动端 WebUI<br><img src="https://lfs.libmbr.com/assets/2025/09/03/afd86bdd-697f-4ce6-85cd-f264231f5271.webp" alt="PVE9 WebUI Mobile"></li><li>引入新的 SR-IOV 网络接口命名规则</li><li><del>其他的还没发现</del></li><li>Release Note: <a href="https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-9-0">https://www.proxmox.com/en/about/company-details/press-releases/proxmox-virtual-environment-9-0</a></li></ul><h2 id="升级时注意"><a href="#升级时注意" class="headerlink" title="升级时注意"></a>升级时注意</h2><ul><li>不推荐无人值守更新，升级过程中可能会中断互联网连接</li><li>ssh 更新完成前可能无法再次连接</li><li><code>/etc/sysctl.conf</code> 被弃用，升级后该文件自动备份为 <code>/etc/sysctl.conf.dpkg-bak</code>，规则需手动移动到 <code>/etc/sysctl.d/</code> 才能重新生效<ul><li><code>cp /etc/sysctl.conf.dpkg-bak /etc/sysctl.d/99-previous.conf</code></li></ul></li><li>建议在更新前对系统盘快照处理，更新后重启宿主机</li></ul><h2 id="已知问题"><a href="#已知问题" class="headerlink" title="已知问题"></a>已知问题</h2><ul><li>宿主机上的 Docker 可能由于 AppArmor 策略无法正常工作</li><li>Debian 13 LXC 无法启动（已修复，影响版本：<code>lxc-pve/stable 6.0.4-*</code>, <code>pve-container/stable 6.0.9</code>）</li><li>如果宿主机在更新后未重启，备份功能可能出现故障，针对 Windows VM 的备份不可靠。</li><li>如果升级前通过 udev 规则手动设置了 SR-IOV 的网卡名，升级后可能会被默认规则覆盖</li><li>暂时还没发现别的，发现了会补充在这里</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Proxmox VE 9 和 Debian 13 正式发布。本文主要记录更新时、更新后可能遇到的问题和解决方案。&lt;/p&gt;</summary>
    
    
    
    <category term="操作系统" scheme="https://www.libmbr.com/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    
    <category term="服务器" scheme="https://www.libmbr.com/tags/%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
    <category term="虚拟化" scheme="https://www.libmbr.com/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
    <category term="ESXi" scheme="https://www.libmbr.com/tags/ESXi/"/>
    
    <category term="软路由" scheme="https://www.libmbr.com/tags/%E8%BD%AF%E8%B7%AF%E7%94%B1/"/>
    
    <category term="PVE" scheme="https://www.libmbr.com/tags/PVE/"/>
    
    <category term="Proxmox VE" scheme="https://www.libmbr.com/tags/Proxmox-VE/"/>
    
    <category term="Debian" scheme="https://www.libmbr.com/tags/Debian/"/>
    
  </entry>
  
  <entry>
    <title>适用于 mlx5 网卡的 Linux SR-IOV 配置教程</title>
    <link href="https://www.libmbr.com/archives/508/"/>
    <id>https://www.libmbr.com/archives/508/</id>
    <published>2025-07-31T16:59:00.000Z</published>
    <updated>2025-07-31T16:59:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>为基于使用 mlx5 驱动的网卡写一个 Linux 上的 SR-IOV 教程，顺带写一点遇到的问题。  </p><span id="more"></span><h2 id="mlx5-网卡列表"><a href="#mlx5-网卡列表" class="headerlink" title="mlx5 网卡列表"></a>mlx5 网卡列表</h2><p>mlx5 是 <code>mlx5_core</code> 驱动的简称，使用此驱动的网卡主要是 <del>NVIDIA</del> Mellanox ConnectX-4 或者更新的系列，具体应该有下面这些，其中常见网卡型号有：CX4121A、CX542B</p><ul><li>ConnectX-4</li><li>ConnectX-4 Lx</li><li>ConnectX-5</li><li>ConnectX-6</li><li>ConnectX-6 Dx</li><li>ConnectX-7</li></ul><p>查看网卡使用的驱动，使用该命令：<code>lspci -nnk | grep -A3 -i eth</code></p><h2 id="开启-SR-IOV"><a href="#开启-SR-IOV" class="headerlink" title="开启 SR-IOV"></a>开启 SR-IOV</h2><div class="alert info"><p>重启设备可能会导致下面的更改被复原。请参考文章后半部分的 固化 章节来持久化配置。</p></div><p>先使用 <code>lspci | grep Mellanox</code> 查找网卡的 PCI 设备位置</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">$ lspci | grep Mellanox<br>01:00.0 Ethernet controller ... [ConnectX-6]<br>01:00.1 Ethernet controller ... [ConnectX-6]<br>02:00.0 Ethernet controller ... [ConnectX-6]<br>02:00.1 Ethernet controller ... [ConnectX-6]<br></code></pre></td></tr></table></figure><p>以上是插入了 2 块 CX6 网卡、每块网卡有 2 个网络接口的典型输出。通过 PCI 设备 ID 可看出前两个、后两个设备都分别是同一张网卡的不同接口。  </p><p>然后我们使用下面的命令来开启 SR-IOV：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">echo 4 &gt; /sys/bus/pci/devices/0000\:01\:00.0/sriov_numvfs<br></code></pre></td></tr></table></figure><p>将 4 替换为你需要的 SR-IOV VF 数量，然后将 0000\:01\:00.0 替换为网卡接口的 PCI 位置（这里通常可以用 Tab 补全）</p><p>有多个网卡或接口时，对每个接口分别设置。</p><p>若要撤销更改（删除 SR-IOV 设备），将 VF 数量设为 0。</p><div class="alert warning"><p><strong>执行这条命令时卡了很久？</strong><br>此命令执行耗时一般不会太长（每个 VF 大约需要不到 1 秒来配置），但是在少数机器上，此命令可能需要几分钟甚至几个小时才能完成，且执行完成后部分 VF 不能正常使用。</p><p>此故障一般是主板问题导致：你的设备不完整支持 ARI，后期我会单独写一篇文章解释。</p><p>解决方案：确保每张网卡（不是每个端口）的 VF 数不超过 6，或者换个主板</p></div><h2 id="PCI-设备路径"><a href="#PCI-设备路径" class="headerlink" title="PCI 设备路径"></a>PCI 设备路径</h2><p>开始之前，先普及一下 PCI 设备路径的组成（如果你已经有了此部分知识，跳过本章）：</p><p>PCI 设备路径（也有 PCI 位置 或者类似的称呼）类似 <code>0000:01:00.0</code>，是由冒号分隔的十六进制数，每一段的含义是：  </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">[domain:]&lt;bus&gt;:&lt;device&gt;[.function]<br></code></pre></td></tr></table></figure><p>具体的：</p><ul><li>Domain（域）：<br>多数系统只有一个 domain 即 0000（例外一般是虚拟机），用于支持大型系统或多个 PCI host bridge。</li><li>Bus Number（总线）：<br>PCI 总线的编号，主板上的每个 PCI 控制器或桥接芯片可能生成一个或多个总线。</li><li>Device Number（设备）：<br>该总线上的设备编号（通常为 0～31），一个总线最多可挂载 32 个设备。</li><li>Function Number（功能）：<br>该设备的功能号（0～7），一个设备最多支持 8 个功能。</li></ul><p>其中 domain 有时可以省略（指代默认的 0000），function 有时也可以省略（指代该设备的全部 function）</p><h2 id="VF-的-PCI-位置"><a href="#VF-的-PCI-位置" class="headerlink" title="VF 的 PCI 位置"></a>VF 的 PCI 位置</h2><div class="alert info"><p>此章节只有演示讲解，你不需要执行任何查询信息以外的命令</p></div><p>为了方便解释，本节展示使用 1 张双接口网卡（两个 PF），对每个接口开启 4 个 VF 进行 SR-IOV 的配置。</p><p>为两个 PF 分别创建 4 个 VF：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">echo 4 &gt; /sys/bus/pci/devices/0000\:01\:00.0/sriov_numvfs<br>echo 4 &gt; /sys/bus/pci/devices/0000\:01\:00.1/sriov_numvfs<br></code></pre></td></tr></table></figure><p>创建后重新使用 <code>lspci | grep Mellanox</code> 查找网卡的 PCI 设备位置</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">$ lspci | grep Mellanox<br>01:00.0 Ethernet controller ... [ConnectX-6] # 端口 0<br>01:00.1 Ethernet controller ... [ConnectX-6] # 端口 1<br>01:00.2 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:00.3 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:00.4 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:00.5 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:00.6 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:00.7 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:01.0 Ethernet controller ... [ConnectX-6 Virtual Function]<br>01:01.1 Ethernet controller ... [ConnectX-6 Virtual Function]<br></code></pre></td></tr></table></figure><p>可以看到 VF 已经成功创建（<code>01:00.2</code> 到 <code>01:01.1</code>）。</p><p>由于 PCI 每个设备只能拥有 8 个功能，PCIe 3.0 引入了 ARI 技术，原理大体上是将设备和功能合并到一起，功能数量从 8 个扩展到 256 个。</p><p>使用 ARI 后，<code>01:00.0</code> 网卡创建的第 9 个功能路径会显示为 <code>01:01.0</code>（功能号满 8 就对设备号进位）</p><p>由于上面我们先对端口 0 设置 4 个 VF，然后再是端口 1，所以按顺序：<code>01:00.2</code> 到 <code>01:00.5</code> 是端口 0 的 VF，其余则是端口 1 的 VF。VF 设备路径的顺序取决于创建 VF 时命令执行顺序。</p><h2 id="SR-IOV-下的网卡名"><a href="#SR-IOV-下的网卡名" class="headerlink" title="SR-IOV 下的网卡名"></a>SR-IOV 下的网卡名</h2><p>默认规则产生的网卡名会比较长，如果你觉得有必要，可以自己设置个网卡命名规则（具体方法后续补充在这里）。</p><p>默认规则下：</p><ul><li>PF<br>一般命名类似 <code>enp1s0f0np0</code><br>p[PCI Bus ID]s[PCI Device ID]f[PCI Function ID]n[pX]<br>n 后面（pX）是网卡驱动提供的网卡名字段，从 0 开始</li><li>VF<br>一般命名类似 <code>enp1s0f0npf0vf1</code><br>p[PCI Bus ID]s[PF PCI Device ID]f[PF PCI Function ID]n[pfXvfY]<br>前面使用 PF 的 ID，n 后面（pfXvfY）同样是网卡驱动提供的网卡名字段，从 0 开始</li></ul><h2 id="为-VF-设置-MAC-地址"><a href="#为-VF-设置-MAC-地址" class="headerlink" title="为 VF 设置 MAC 地址"></a>为 VF 设置 MAC 地址</h2><div class="alert info"><p>重启设备可能会导致下面的更改被复原。请参考文章后半部分的 固化 章节来持久化配置。</p></div><ul><li>如果该 VF 需要直接在宿主机使用，或者用于容器如 LXC，使用该命令：<br><code>ip link set dev &lt;VF 网卡名&gt; address AA:BB:CC:DD:EE:FF</code><br>执行此命令需要确保 VF 已经加载驱动（默认已加载）</li><li>如果该 VF 用于 QEMU 虚拟机（包括 KVM、Proxmox 等），使用该命令：<br><code>ip link set &lt;PF 网卡名&gt; vf &lt;VF ID&gt; AA:BB:CC:DD:EE:FF</code><br>VF ID 即该 PF 上的第 n 个 VF，从 0 开始<br>如果已加载驱动，重新加载驱动后才能在宿主机生效（虚拟机上使用不需要关心这个）</li></ul><h2 id="配置-E-Switch-分载"><a href="#配置-E-Switch-分载" class="headerlink" title="配置 E-Switch 分载"></a>配置 E-Switch 分载</h2><p>ConnectX-5 或更新的网卡支持 E-Switch 分载功能，可以部分改善 PF-VF 的交换性能并降低占用，并解决部分情况下宿主机 VF 无法和虚拟机 VF 正常通信的问题，可以按下面的方法开启 E-Switch 分载：  </p><div class="alert info"><p>重启设备可能会导致下面的更改被复原。请参考文章后半部分的 固化 章节来持久化配置。</p></div><div class="alert warning"><p><strong>已知问题</strong><br>开启 E-Switch 分载会导致 FreeBSD 无法加载 VF 网卡驱动。<br>目前未找到解决方案。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">devlink dev eswitch set pci/0000:01:00.0 mode switchdev<br></code></pre></td></tr></table></figure><p>替换 0000:01:00.0 为实际 PF 的设备路径。</p><p>若要撤销更改，将 switchdev 替换为 legacy 执行。</p><p>执行前，请确保没有 VF 正在使用，否则卸载 VF 时会报错。建议在创建 VF 之前就执行此操作。</p><p>配合 OpenVSwitch(OvS) 使用时，建议执行：</p><div class="alert info"><p>重启设备不会导致下面的更改被复原。该命令不需要固化。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">ovs-vsctl set Open_vSwitch . other_config:hw-offload=true<br></code></pre></td></tr></table></figure><p>若要撤销更改，使用：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">ovs-vsctl remove Open_vSwitch . other_config hw-offload<br></code></pre></td></tr></table></figure><h2 id="Proxmox-VE-中-VM-添加-SR-IOV-网卡"><a href="#Proxmox-VE-中-VM-添加-SR-IOV-网卡" class="headerlink" title="Proxmox VE 中 VM 添加 SR-IOV 网卡"></a>Proxmox VE 中 VM 添加 SR-IOV 网卡</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">qm set VMID -hostpci0 0000:01:00.2,pcie=1<br></code></pre></td></tr></table></figure><p>VMID 替换为虚拟机的 ID，hostpci0 中的 0 替换为虚拟机内 PCI 设备位置（没有什么具体要求，数字不冲突即可），0000:01:00.2 替换为 VF 的 PCI 位置。</p><p>也可以通过网页后台来配置：</p><p><img src="https://lfs.libmbr.com/assets/2025/08/01/ddb8a43a-27f9-404b-a7c1-02dcef049008.webp" alt="Proxmox add PCIe">  </p><h2 id="Proxmox-VE-中-LXC-添加-SR-IOV-网卡"><a href="#Proxmox-VE-中-LXC-添加-SR-IOV-网卡" class="headerlink" title="Proxmox VE 中 LXC 添加 SR-IOV 网卡"></a>Proxmox VE 中 LXC 添加 SR-IOV 网卡</h2><figure class="highlight plaintext"><table><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><code class="hljs plaintext">lxc.net.0.name: lxc<br>lxc.net.0.type: phys<br>lxc.net.0.link: enp1s0f0npf0vf1<br></code></pre></td></tr></table></figure><p><code>name</code> 字段请随意设置，此参数在使用 SR-IOV 时是个摆设（如果需要设置 LXC 内的网卡名，请直接在宿主机修改 VF 网卡名）；<code>link</code> 设置为 VF 的网卡名</p><p>如果 LXC 内添加了其他网络接口（无论是否是 SR-IOV），请注意 net 后的编号不要冲突  </p><h2 id="固化"><a href="#固化" class="headerlink" title="固化"></a>固化</h2><p>在 <code>/opt/local-sriov/init.sh</code> 或者你喜欢的地方创建一个脚本：</p><figure class="highlight bash"><table><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></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-meta">#!/bin/bash</span><br><br><span class="hljs-comment"># Set E-Switch Offload</span><br>devlink dev eswitch <span class="hljs-built_in">set</span> pci/0000:01:00.0 mode switchdev<br>devlink dev eswitch <span class="hljs-built_in">set</span> pci/0000:01.00.1 mode switchdev<br><br><span class="hljs-comment"># Create SR-IOV VFs</span><br><span class="hljs-comment"># Config:</span><br><span class="hljs-comment">#   2 VFs on Port 0</span><br><span class="hljs-comment">#   0 VF  on Port 1</span><br><span class="hljs-built_in">echo</span> 2 &gt; /sys/bus/pci/devices/0000\:01\:00.0/sriov_numvfs<br><br><span class="hljs-comment"># Set IP for each VF</span><br>ip <span class="hljs-built_in">link</span> <span class="hljs-built_in">set</span> ens0f0 vf 0 mac AA:AA:AA:AA:AA:AA <span class="hljs-comment"># VM 100</span><br>ip <span class="hljs-built_in">link</span> <span class="hljs-built_in">set</span> dev ens0f0v1 address BB:BB:BB:BB:BB:BB <span class="hljs-comment"># CT 101</span><br></code></pre></td></tr></table></figure><p>根据实际情况，自行修改脚本中的参数。</p><p><code>chmod +x /opt/local-sriov/init.sh</code>，然后确保此脚本在接口启动时执行。</p><p>以 <code>ifupdown(2/ng)</code> 为例，修改 <code>/etc/network/interfaces</code>：</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">auto vmbr0<br>iface vmbr0 inet static<br>        (原配置保持不变)<br>        post-up sleep 5 &amp;&amp; /opt/local-sriov/init.sh<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;为基于使用 mlx5 驱动的网卡写一个 Linux 上的 SR-IOV 教程，顺带写一点遇到的问题。  &lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="虚拟化" scheme="https://www.libmbr.com/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
    <category term="网卡" scheme="https://www.libmbr.com/tags/%E7%BD%91%E5%8D%A1/"/>
    
    <category term="Mellanox" scheme="https://www.libmbr.com/tags/Mellanox/"/>
    
    <category term="NVIDIA" scheme="https://www.libmbr.com/tags/NVIDIA/"/>
    
    <category term="mlx5" scheme="https://www.libmbr.com/tags/mlx5/"/>
    
    <category term="SR-IOV" scheme="https://www.libmbr.com/tags/SR-IOV/"/>
    
  </entry>
  
  <entry>
    <title>北京地铁银行卡乘车全攻略</title>
    <link href="https://www.libmbr.com/archives/507/"/>
    <id>https://www.libmbr.com/archives/507/</id>
    <published>2025-07-18T22:15:14.000Z</published>
    <updated>2025-07-18T22:15:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>本文全面解析北京地铁银行卡支付的支持程度、扣款流程、乘车优惠等实用细节，助你轻松无感通行。</p><span id="more"></span><p>随着移动支付和数字交通的普及，北京地铁早已支持多种非现金支付方式，其中使用银行卡 Tap To Ride 乘车成为越来越多市民和游客的选择。本文将为你详细介绍北京地铁支持的银行卡支付方式、扣款流程、实际金额、适用优惠等关键信息，方便你快速上手。</p><div class="alert info"><p>纯个人经验分享，有错误可以指出。本文不含任何商业推广。</p></div><div class="alert info"><p>支持情况和优惠信息可能随着时间推移而改变。仅供参考。</p></div><p>先从银行卡的支持情况讲起：</p><h2 id="支持情况"><a href="#支持情况" class="headerlink" title="支持情况"></a>支持情况</h2><h3 id="入闸"><a href="#入闸" class="headerlink" title="入闸"></a>入闸</h3><p>入闸指的是：使用银行卡直接拍闸机，然后进入地铁付费区  </p><p>一般来说，实体卡卡面上或者卡背印有 <strong>Contactless 非接触式交易</strong> 或者 <strong>QuickPass 闪付</strong> 且<strong>支持在中国大陆付款</strong>的卡都支持直接入闸。Apple Pay、Mi Pay 等基于手机 NFC 或类似技术的虚拟卡大多数不需要印有标志也支持。  </p><p><img src="https://lfs.libmbr.com/assets/2025/07/19/6ba115cc-e441-418d-9b47-abd54b58e08d.webp" alt="非接标识"></p><p>另外，还需要确保卡支持以下任意卡组织的付款：银联（含银联国际）、万事达（MasterCard）、维萨（VISA）、美国运通（American Express&#x2F;AMEX）、JCB。</p><p>针对不同卡组织的卡，测试情况详见下表：</p><table><thead><tr><th>卡组织&#x2F;发卡地</th><th>支持情况</th><th>备注</th></tr></thead><tbody><tr><td>银联</td><td>支持</td><td></td></tr><tr><td>银联国际</td><td>支持</td><td></td></tr><tr><td>境外发行的 VISA</td><td>支持</td><td></td></tr><tr><td>境内发行的 VISA</td><td><strong>基本不支持</strong></td><td>如果是银联、VISA双标，正常走银联付款；单标一律不支持：入闸时报错</td></tr><tr><td>境外发行的万事达卡</td><td>支持</td><td></td></tr><tr><td>境内发行的万事达卡</td><td>部分支持</td><td>卡片必须包含万事达中国（万事网联）应用；其他不支持：入闸时报错</td></tr><tr><td>境外发行的 AMEX</td><td>支持</td><td></td></tr><tr><td>境内发行的 AMEX</td><td>部分支持</td><td>卡片必须包含杭州连通应用；其他不支持：入闸时报错</td></tr><tr><td>境外发行的 JCB</td><td>支持</td><td></td></tr><tr><td>境内发行的 JCB</td><td><strong>不支持</strong></td><td>入闸时报错</td></tr><tr><td>Discover、Interac 等其他卡片</td><td><strong>不支持</strong></td><td>闸机不响应</td></tr></tbody></table><div class="alert info"><p>不支持 Apple Pay 将付款卡作为快速交通卡入闸。</p></div><h3 id="购票"><a href="#购票" class="headerlink" title="购票"></a>购票</h3><p>购票指的是：在自助机或人工窗口付费购买单程票以入闸，或对一卡通进行充值。  </p><p>支持入闸的卡均支持购票。</p><p>部分车站自助机购票仅支持插卡交易，此时不需要卡片有非接支付功能，但要求卡片有芯片，且不支持手机 Pay。<br>人工窗口同时支持非接、插卡、磁条。  </p><h2 id="扣款流程"><a href="#扣款流程" class="headerlink" title="扣款流程"></a>扣款流程</h2><h3 id="入闸-1"><a href="#入闸-1" class="headerlink" title="入闸"></a>入闸</h3><p>入闸时预授权 11 人民币元（首都机场线为 25 元、大兴机场线为 35 元）。如果入闸时预授权扣款失败，并不会有任何影响。  </p><h3 id="出闸"><a href="#出闸" class="headerlink" title="出闸"></a>出闸</h3><p>出闸时撤销预授权，然后根据实际消费金额进行扣款。<br>如果出闸时扣款失败：</p><ul><li>闸机正常开启，你仍然可以正常出站</li><li>银联卡会在每天北京时间中午 12:00 重试扣款</li><li>其他卡片不会再次重试扣款</li><li>可以前往人工窗口补票扣款，不过据说很浪费时间，可能要折腾半个小时以上</li></ul><p>扣款成功或人工补票前，相同卡号无法再次入闸（针对手机 Pay：仅限制设备卡；使用实体卡或其他设备卡不被限制）。</p><div class="alert warning"><p><strong>出闸特殊情况</strong><br>不要使用没有进站记录的万事达卡出闸！<br>闸机仍会正常开放，但这会导致出闸时预授权 8 元（首都机场线无动作、大兴机场线为 25 元），然后 24 小时后出现预授权扣款。<br>这似乎是一个 Bug，且仅在万事达卡上出现。</p></div><h2 id="优惠"><a href="#优惠" class="headerlink" title="优惠"></a>优惠</h2><p>持万事达人民币卡，拍卡入闸乘坐北京地铁，可享受每日前 2 笔每笔减 2 元的优惠（部分卡为前 3 笔减 1 元）。</p><p>部分银行也会有自己的优惠，这个就要去自己刷银行公告了。  </p><h2 id="其他技术细节"><a href="#其他技术细节" class="headerlink" title="其他技术细节"></a>其他技术细节</h2><p>万事达预授权类型为 MAAF。</p><p>使用银联卡入闸，商户名显示为<strong>北京市轨道交通指挥中心</strong>；使用万事达中国&#x2F;美国运通人民币卡入闸，商户名显示为<strong>北京轨道交通路网管理有限公司</strong>。</p><p>部分银行会将商户名显示为 <strong>GUIDAO BEIJINGSHI CHN</strong> 和 <strong>UMS* Beijing Metro</strong>。  </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文全面解析北京地铁银行卡支付的支持程度、扣款流程、乘车优惠等实用细节，助你轻松无感通行。&lt;/p&gt;</summary>
    
    
    
    <category term="交通" scheme="https://www.libmbr.com/categories/%E4%BA%A4%E9%80%9A/"/>
    
    
    <category term="北京地铁" scheme="https://www.libmbr.com/tags/%E5%8C%97%E4%BA%AC%E5%9C%B0%E9%93%81/"/>
    
    <category term="北京" scheme="https://www.libmbr.com/tags/%E5%8C%97%E4%BA%AC/"/>
    
    <category term="地铁" scheme="https://www.libmbr.com/tags/%E5%9C%B0%E9%93%81/"/>
    
    <category term="轨道交通" scheme="https://www.libmbr.com/tags/%E8%BD%A8%E9%81%93%E4%BA%A4%E9%80%9A/"/>
    
    <category term="银行卡" scheme="https://www.libmbr.com/tags/%E9%93%B6%E8%A1%8C%E5%8D%A1/"/>
    
  </entry>
  
  <entry>
    <title>PVE 宿主机配置有状态 DHCPv6</title>
    <link href="https://www.libmbr.com/archives/506/"/>
    <id>https://www.libmbr.com/archives/506/</id>
    <published>2025-05-16T15:36:02.000Z</published>
    <updated>2025-05-16T15:36:02.000Z</updated>
    
    <content type="html"><![CDATA[<p>Proxmox 默认配置中无法动态获取 IPv6 问题的原因分析和解决方案</p><span id="more"></span><div class="alert info"><p>此文章是对 <a href="/archives/418/">PVE 主机及 LXC 容器开启 DHCPv6 客户端教程</a> 的补充，本篇单独讲<strong>有状态</strong> DHCPv6 的配置</p></div><p>在 Proxmox 系列系统（除了 Proxmox VE，还包括 Backup Server 和 Mail Gateway）的默认配置中，通常按照上方蓝字教程的方法配置好 sysctl 规则后，LXC 就能正常的、同时通过无状态和有状态两种方式获取 IPv6 地址。而宿主机可能会存在只有无状态地址，没有有状态地址的问题。  </p><p>不想看原因分析，可以直接点击<a href="#post-up-hooks">这里</a>看解决方案。</p><h2 id="有状态地址"><a href="#有状态地址" class="headerlink" title="有状态地址"></a>有状态地址</h2><p>在 IPv6 配置中，无状态（SLAAC）一般指的是路由器下放一个前缀，后缀由机器（客户端）配置；而有状态则是地址全部由路由器配置。大多数路由器同时开启有状态和无状态，客户端可以获得下面几个地址：  </p><ul><li><code>2400:1234:5678:abcd:1145:14ff:fe19:1981</code></li><li><code>2400:1234:5678:abcd::114</code><br>其中 <code>2400:1234:5678:abcd::</code> 是前缀，长度是 64 个二进制位（16 个十六进制位），前缀后面的部分则称为后缀。<br>一般长得上面这样的，比较长的地址，都是通过 SLAAC 获取的，后缀一般会使用 MAC 生成（EUI-64 算法）或者完全随机，而下面这个短的，一般通过有状态 DHCPv6 获取。<br>（当前，这只是大多数情况，SLAAC 的后缀完全由客户端决定，通过 SLAAC 获取的地址也可能很短；而有状态获取的后缀完全由路由器决定，通过有状态获取的地址也可能很长）</li></ul><p>如果你的 PVE 只有类似上面那样比较长的地址，而 LXC 和其他设备均能获取两种不同的地址，那一般就是说明宿主机没有获取到有状态的 IPv6 地址。  </p><p>明明其他设备都能正常获取，只有 PVE 宿主机（或者和几个少数 LXC）获取不到，为什么会这样呢？</p><h2 id="ifupdown2"><a href="#ifupdown2" class="headerlink" title="ifupdown2"></a>ifupdown2</h2><p>要想解释清楚这个问题，必须要扯几句 <code>ifupdown2</code>。</p><p><code>ifupdown2</code> 是 PVE 7.0 以来的默认网络管理器，主流发行版中只有 Proxmox 系默认使用。普通的 Debian 系统以及 PVE 老版本采用的是 <code>ifupdown</code>。  </p><p><code>ifupdown2</code> 普遍被认为是更现代的网络管理器，由 NVIDIA 开发，使用 Python 语言编写，加入了热重载接口等高级功能，支持更多配置选项，并且兼容传统的 <code>ifupdown</code> 配置。  </p><p><strong>优点讲完了，就要讲它的缺点了。</strong>  </p><p><code>ifupdown2</code> 目前有三个大问题：</p><ul><li>不支持同一个接口混合静态地址和 DHCP 配置  </li><li>如果一个接口 DHCP 没有响应，会一直等待，阻塞继续开机</li><li>DHCPv6 租约会在关机或重启后自动移除</li></ul><p>可以说是完全没认真去适配 DHCP 的网络环境。  </p><p>Proxmox 系统无法获取有状态地址，一般就是由于上面提到的第一个问题————<strong>不支持同一个接口混合静态地址和 DHCP 配置</strong>。</p><p>什么是“同一个接口混合静态地址和 DHCP 配置”？答：IPv4 使用静态地址，IPv6 使用自动获取。反过来也一样。  </p><p>Proxmox 系统的 IPv4 地址默认就是静态配置的，此时如果你配置了 DHCPv6：这段配置是完全无效的，会被忽略，而且不产生任何报错信息。  </p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">iface vmbr0 inet manual<br>        address 172.20.2.1/22<br>        gateway 172.20.0.20<br>iface vmbr0 inet6 dhcp<br></code></pre></td></tr></table></figure><p>对于 <code>ifupdown2</code>，**这是无效的配置！**如果你按照上面的方法配置，最后只会获得静态的 IPv4 地址，IPv6 不可用。</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">iface vmbr0 inet6 dhcp<br>iface vmbr0 inet manual<br>        address 172.20.2.1/22<br>        gateway 172.20.0.20<br></code></pre></td></tr></table></figure><p>**这也是无效的配置，**如果你按照这个方法配置，最后只会获得 DHCP 得到的 IPv6 地址，IPv4 不可用。</p><p>而如果你使用 <code>ifupdown</code>，上面两个配置都是有效的，而且作用相同。这算是个 <code>ifupdown2</code> 的大 Bug，而且<a href="https://github.com/CumulusNetworks/ifupdown2/issues/174#issuecomment-796805369">开发者貌似目前完全不打算修复这个</a>（技术上重写很麻烦，但是开发者接受 PR）。</p><p>软件有问题，就只能由用户处理了。这里提供两种解，推荐选择第一种。</p><h2 id="post-up-hooks"><a href="#post-up-hooks" class="headerlink" title="post-up hooks"></a>post-up hooks</h2><p>这是第一种解法：添加 post-up hooks。</p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">iface vmbr0 inet manual<br>        address 172.20.2.1/22<br>        gateway 172.20.0.20<br>        post-up dhclient -6 -v -pf /run/dhclient6.$IFACE.pid -lf /var/lib/dhclient6/$IFACE.leases -I $IFACE<br></code></pre></td></tr></table></figure><p>照抄 post-up 这一行</p><h2 id="ifupdown"><a href="#ifupdown" class="headerlink" title="ifupdown"></a>ifupdown</h2><p>这是第二种解法：切换到 <code>ifupdown</code>。</p><div class="alert warning"><p>不推荐。仅当完全不需要 <code>ifupdown2</code> 的功能时才使用此方法。安装 <code>ifupdown</code> 会自动卸载 <code>ifupdown2</code></p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">apt install ifupdown<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Proxmox 默认配置中无法动态获取 IPv6 问题的原因分析和解决方案&lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Linux" scheme="https://www.libmbr.com/tags/Linux/"/>
    
    <category term="IPv6" scheme="https://www.libmbr.com/tags/IPv6/"/>
    
    <category term="虚拟机" scheme="https://www.libmbr.com/tags/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    
    <category term="PVE" scheme="https://www.libmbr.com/tags/PVE/"/>
    
  </entry>
  
  <entry>
    <title>TLS 证书有效期将缩短至 47 天</title>
    <link href="https://www.libmbr.com/archives/505/"/>
    <id>https://www.libmbr.com/archives/505/</id>
    <published>2025-04-14T11:41:02.000Z</published>
    <updated>2025-04-14T11:41:02.000Z</updated>
    
    <content type="html"><![CDATA[<p>根据 Apple 的提案，TLS 证书（也称为 SSL 证书）证书的最长有效期将逐步缩短至 47 天。随着此改变，证书自动化部署将会变得越来越重要，人工更新证书最终将被淘汰。  </p><span id="more"></span><p>由国际性电子认证机构（CA）与操作系统、浏览器厂商组成的CA&#x2F;B论坛（CA &#x2F; Browser Forum）投票通过由苹果公司（Apple）最早提出的 <a href="https://groups.google.com/a/groups.cabforum.org/g/servercert-wg/c/9768xgUUfhQ">SC-081v3</a> 号提案。  </p><p>提案指出，缩短证书有效期可以降低因信息陈旧带来的安全风险，并弥补证书撤销机制的不足。更短的有效期迫使组织采用自动化证书管理流程，提升整体管理水平和安全性，同时减少人工错误并更快响应潜在威胁。  </p><h2 id="有效期缩短计划"><a href="#有效期缩短计划" class="headerlink" title="有效期缩短计划"></a>有效期缩短计划</h2><p>TLS 服务器证书的最长有效期将<strong>分阶段</strong>逐步缩短，以确保现有服务能有时间适应改变。现在的状态及未来的计划如下：</p><table><thead><tr><th>日期</th><th>证书最长有效期</th></tr></thead><tbody><tr><td>2020-09-01 后</td><td>398 天</td></tr><tr><td>2026-03-15 后</td><td>200 天</td></tr><tr><td>2027-03-15 后</td><td>100 天</td></tr><tr><td>2029-03-15 后</td><td>47 天</td></tr></tbody></table><h2 id="历史上的有效期缩短"><a href="#历史上的有效期缩短" class="headerlink" title="历史上的有效期缩短"></a>历史上的有效期缩短</h2><p>2011 年，CA&#x2F;B 论坛将证书有效期从最初的 8-10 年缩短至 5 年；2015 年进一步缩短为 3 年；2018 年再次调整为 2 年。尽管 2019 年 CA&#x2F;B 论坛投票否决了将有效期缩短至一年的提议，但这一措施获得了苹果、谷歌、微软、Mozilla 和 Opera 等主要浏览器厂商的支持。随后，2020 年 2 月，苹果宣布拒绝接受有效期超过 398 天（约一年）的新证书，并在同年 9 月 1 日后严格执行此政策。此后，Google 和 Mozilla 也相继效仿，进一步推动了证书有效期缩短的趋势。  </p><h2 id="自动化续订的重要性"><a href="#自动化续订的重要性" class="headerlink" title="自动化续订的重要性"></a>自动化续订的重要性</h2><p>自动化续订对于缓解证书有效期缩短带来的问题至关重要。随着证书更新频率的增加，意外过期的风险也随之上升。自动化策略通过简化证书生命周期管理，覆盖从申请、颁发到续订和吊销的每个阶段，减少了人工干预的需求。这种方法不仅提高了效率，还增强了可靠性，尤其在管理大量 SSL 证书时，能够有效防止证书过期，确保安全性和业务连续性。</p><h2 id="不应继续人工预订"><a href="#不应继续人工预订" class="headerlink" title="不应继续人工预订"></a>不应继续人工预订</h2><p>证书有效期开始缩短后，手动管理证书流程本身就不切实际，而证书有效期缩短至最长 47 天将加剧现有问题。简而言之，IT 部门根本无法应对。随着 TLS 证书数量不断增加，有效管理这些证书将变得越来越困难。假设未来使用最长有效期 47 天的证书，一年将至少要续订 8 次，如果服务器证书大规模部署，使用手动续费，每次操作都可能需要几十分钟的时间。随着需要续订次数增加，需要的人力成本将成倍增加，发生人为错误的风险也将提高。在有效期缩短后，自动化部署每年可能只会多消耗几十 MB 流量，而人工部署每年很可能需要总共几个小时的时间。</p><h2 id="做好准备"><a href="#做好准备" class="headerlink" title="做好准备"></a>做好准备</h2><p>仍在手动续费并管理证书的用户应当尽早考虑自动化部署，现在就进行自动化部署可以立刻享受到其带来的优势以及管理成本的降低。提前做好测试部署也可以有更充足的时间应对意外。如果认为修改不支持自动续订的遗留系统需要更长时间，您也可以考虑在缩短有效期的截止时间前 1 个月再次购买最后一张 1 年有效期的证书。  </p><p>目前，有很多优秀的证书自动化管理工具可以全自动完成证书的购买、续订、部署等过程，例如本站正在使用 <a href="https://acme.sh/">acme.sh</a> 来自动签发证书。您还可以考虑 CertBot 或其他工具。  </p><h2 id="本站"><a href="#本站" class="headerlink" title="本站"></a>本站</h2><p>本站目前使用 <a href="https://pki.goog/">GTS</a> 颁发的证书，有效期均为 90 天。  </p><p>一旦相关工具链对短周期证书完成适配，本站将尽可能早的切换到 30 天或更短有效期的短周期证书。  </p><p>本站的证书自动申请使用 <a href="https://acme.sh/">acme.sh</a>，服务器自动部署采用 NFS、rsync 配合自有工具实现，CDN 和云加速自动部署将会使用自维护的 CI&#x2F;CD 实现。  </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;根据 Apple 的提案，TLS 证书（也称为 SSL 证书）证书的最长有效期将逐步缩短至 47 天。随着此改变，证书自动化部署将会变得越来越重要，人工更新证书最终将被淘汰。  &lt;/p&gt;</summary>
    
    
    
    <category term="网络" scheme="https://www.libmbr.com/categories/%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="TLS" scheme="https://www.libmbr.com/tags/TLS/"/>
    
    <category term="证书" scheme="https://www.libmbr.com/tags/%E8%AF%81%E4%B9%A6/"/>
    
    <category term="SSL" scheme="https://www.libmbr.com/tags/SSL/"/>
    
    <category term="CA" scheme="https://www.libmbr.com/tags/CA/"/>
    
  </entry>
  
  <entry>
    <title>IPv6 配置常见问题 Linux 篇 Ⅰ</title>
    <link href="https://www.libmbr.com/archives/504/"/>
    <id>https://www.libmbr.com/archives/504/</id>
    <published>2025-04-12T11:41:02.000Z</published>
    <updated>2025-04-12T11:41:02.000Z</updated>
    
    <content type="html"><![CDATA[<p>随着 IPv4 资源枯竭和 IPv6 的发展，越来越多的人开始为自己的网络部署 IPv6，本文章总结一下自己和朋友踩过的坑。 </p><p>本文章仅提及标准 Linux 和 OpenWrt 上的 IPv6 配置 ，不包含 Android 等特殊操作系统。其他操作系统的配置我后续将在其他文章单独讨论。</p><span id="more"></span><h2 id="ndisc-router-discovery-failed-to-add-default-route"><a href="#ndisc-router-discovery-failed-to-add-default-route" class="headerlink" title="ndisc_router_discovery failed to add default route"></a>ndisc_router_discovery failed to add default route</h2><p>是一个内核报错信息，完整的是 <code>ICMPv6: RA: ndisc_router_discovery failed to add default route</code>  </p><p>一般此问题多在配置<strong>静态 IPv6</strong> 的机器出现。  </p><p>错误的原因是：已经设置了静态网关，但是 RA 没有关闭。</p><h4 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">net.ipv6.conf.INTERFACE.accept_ra=0<br></code></pre></td></tr></table></figure><p><em>INTERFACE</em> 替换为网络接口，也可以使用 all 和 default 设置所有接口或默认值<br>添加至 <code>/etc/sysctl.conf</code>，运行 <code>sysctl -p</code> 保存</p><hr><h2 id="开启-IP-转发后-IPv6-地址丢失"><a href="#开启-IP-转发后-IPv6-地址丢失" class="headerlink" title="开启 IP 转发后 IPv6 地址丢失"></a>开启 IP 转发后 IPv6 地址丢失</h2><p>开启 IP 转发后默认禁止接收 RA，可以通过以下方式恢复  </p><h4 id="解决方案-1"><a href="#解决方案-1" class="headerlink" title="解决方案"></a>解决方案</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">net.ipv6.conf.all.accept_ra=2<br>net.ipv6.conf.default.accept_ra=2<br></code></pre></td></tr></table></figure><p>添加至 <code>/etc/sysctl.conf</code>，运行 <code>sysctl -p</code> 保存</p><hr><h2 id="IPv6-DUID-不固定"><a href="#IPv6-DUID-不固定" class="headerlink" title="IPv6 DUID 不固定"></a>IPv6 DUID 不固定</h2><p>路由器上已经为 Linux 主机设置了静态 DHCPv6 分配，但是主机重启后无法获取 IPv6 或获取的地址不一致，检查发现是 DUID 改变。</p><p>大概率是 <code>ifupdown2</code> 的问题，检查一下系统是不是在用 <code>ifupdown2</code>（一般来说，Proxmox 的系统默认就使用 <code>ifupdown2</code>，其他情况可以通过检测系统是否有 <code>ifreload</code> 命令来判断）  </p><h4 id="解决方案-2"><a href="#解决方案-2" class="headerlink" title="解决方案"></a>解决方案</h4><p><a href="https://github.com/CumulusNetworks/ifupdown2/pull/326">CumulusNetworks&#x2F;ifupdown2 #326</a>  </p><p>尝试打我写的这个 <a href="https://github.com/CumulusNetworks/ifupdown2/pull/326.patch">Patch</a>。  </p><hr><h2 id="RA-hop-limit-过低"><a href="#RA-hop-limit-过低" class="headerlink" title="RA hop limit 过低"></a>RA hop limit 过低</h2><p>具体表现有：<code>ping</code> IPv6 提示 <code>Time exceeded: Hop limit</code>，curl 等网络工具直接提示 <code>Couldn&#39;t connect to server</code> 和 <code>No route to host</code>  </p><p>原因是 IPv6 RA 中的 hop limit 过低。  </p><p>有朋友向我反馈：他家的某（通信设备大厂）品牌路由器有这个问题，在抓包分析下发现路由器随机发送 hop limit 为 5-12 的 RA，导致网络故障  </p><p><img src="https://lfs.libmbr.com/assets/2025/04/14/62dfa3a6-fcb3-4855-bac7-e3028988ce69.webp" alt="RA with hop limit 5"></p><p>截至 2025，大多数路由器（尤其是家用路由器）的 IPv6 配置功能不全，功能相对全的大概只有新版本的 OpenWrt 和 ROS 了。大多数路由器无法手动设置 IPv6 的 hop limit，所以我们通过<strong>设置 Linux 最低接受的 hop limit</strong> 来解决问题。  </p><h4 id="解决方案-3"><a href="#解决方案-3" class="headerlink" title="解决方案"></a>解决方案</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plaintext">net.ipv6.conf.INTERFACE.accept_ra_min_hop_limit=64<br></code></pre></td></tr></table></figure><p><em>INTERFACE</em> 替换为网络接口，也可以使用 all 和 default 设置所有接口或默认值<br>最后的数字即为最小 hop limit。一般设置为 64 即可</p><p>添加至 <code>/etc/sysctl.conf</code>，运行 <code>sysctl -p</code> 保存  </p><div class="alert warning"><p><strong>反对盲目蛮干！</strong><br><img src="https://lfs.libmbr.com/assets/2025/04/14/81a5f63e-d46d-4d61-aa2a-1efc559e6ce3.webp" alt="ra min hop limit not set"></p></div><hr><h2 id="IPv6-配置中继后-LAN-设备还是没有地址"><a href="#IPv6-配置中继后-LAN-设备还是没有地址" class="headerlink" title="IPv6 配置中继后 LAN 设备还是没有地址"></a>IPv6 配置中继后 LAN 设备还是没有地址</h2><p>检查下 wan6 口的 master 有没有勾上（部分老版本 wrt 可能使用 wan 而不是 wan6 作为接口名）  </p><p><img src="https://lfs.libmbr.com/assets/2025/04/14/6a27826c-783d-4b71-bd39-50e44ddfbc6e.webp" alt="IPv6 relay master"></p><h4 id="解决方案-4"><a href="#解决方案-4" class="headerlink" title="解决方案"></a>解决方案</h4><ul><li>勾上主接口<br>部分老版本 wrt 图形化找不到这个设置，修改 <code>/etc/config/dhcp</code><figure class="highlight plaintext"><table><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><code class="hljs plaintext">config dhcp wan6<br>  option dhcpv6 relay<br>  option ra relay<br>  option ndp relay<br>  option master 1<br></code></pre></td></tr></table></figure>在 wan6 添加 master 配置</li><li>另外，如果你的 OpenWrt 有 ULA 前缀 这个设置，把他清空并保存。</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;随着 IPv4 资源枯竭和 IPv6 的发展，越来越多的人开始为自己的网络部署 IPv6，本文章总结一下自己和朋友踩过的坑。 &lt;/p&gt;
&lt;p&gt;本文章仅提及标准 Linux 和 OpenWrt 上的 IPv6 配置 ，不包含 Android 等特殊操作系统。其他操作系统的配置我后续将在其他文章单独讨论。&lt;/p&gt;</summary>
    
    
    
    <category term="网络" scheme="https://www.libmbr.com/categories/%E7%BD%91%E7%BB%9C/"/>
    
    
    <category term="Linux" scheme="https://www.libmbr.com/tags/Linux/"/>
    
    <category term="IPv6" scheme="https://www.libmbr.com/tags/IPv6/"/>
    
  </entry>
  
  <entry>
    <title>Nginx 反代缓存的基础配置</title>
    <link href="https://www.libmbr.com/archives/503/"/>
    <id>https://www.libmbr.com/archives/503/</id>
    <published>2025-04-03T16:02:23.000Z</published>
    <updated>2025-04-03T16:02:23.000Z</updated>
    
    <content type="html"><![CDATA[<p>Nginx 反代默认不缓存，部分场景下，默认配置可能会使源站压力过高并降低网站性能。在这里写一下 Nginx 缓存的配置方法。</p><span id="more"></span><h2 id="反代缓存"><a href="#反代缓存" class="headerlink" title="反代缓存"></a>反代缓存</h2><p>和浏览器缓存的机制类似，不过内容缓存在 Nginx 中。  </p><p><img src="https://lfs.libmbr.com/assets/2025/04/04/c288819e-40a5-4f37-8aa2-fdabe911f662.webp" alt="Nginx Cache"></p><p>浏览器缓存一般只保留在用户电脑的内存或磁盘中，关闭浏览器就会清除缓存，且多个用户不能直接共享相同的缓存。  </p><p>反代侧添加缓存在静态资源较多、用户量大、源站性能不佳时对性能改善比较明显，缓存保存在服务器内存或硬盘中，缓存时间和大小均可自定义。多个用户访问同一静态资源，Nginx 只需要向源服务器访问一次。  </p><h2 id="基础配置"><a href="#基础配置" class="headerlink" title="基础配置"></a>基础配置</h2><p>在 Nginx 的 HTTP 块中加入下面的内容：  </p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">proxy_cache_path</span> /var/cache/nginx levels=<span class="hljs-number">1</span>:<span class="hljs-number">2</span> keys_zone=global:<span class="hljs-number">30m</span> max_size=<span class="hljs-number">1800m</span> inactive=<span class="hljs-number">365d</span> use_temp_path=<span class="hljs-literal">off</span>;<br></code></pre></td></tr></table></figure><p>参数解释：  </p><ul><li><code>/var/cache/nginx</code><br>指定一个绝对路径作为缓存存储目录</li><li><code>levels=1:2</code><br>缓存目录结构，第一级目录使用 1 个字符，第二级目录使用 2 个字符<br>最终效果类似 &#x2F;var&#x2F;cache&#x2F;nginx&#x2F;a&#x2F;bc&#x2F;xxxxxxxxxxxx</li><li><code>keys_zone=global:30m</code><br>缓存区域名称和元数据缓存大小<br>元数据缓存（或者叫缓存索引）驻留在内存中，每 MB 约可存储万条缓存项</li><li><code>max_size=1800m</code><br>缓存在磁盘上使用的最大空间<br>填满后，自动删除长期未使用的缓存</li><li><code>inactive=365d</code><br>缓存的最长时间，是保底规则<br>HTTP 标头报告的缓存优先级更高</li><li><code>use_temp_path=off</code><br>先将缓存写入临时目录，再写入设置的目录<br>部分 NFS 或 FUSE 可能需要设置为 on 才能工作</li></ul><p>完成缓存区域的创建以后，为反代的网站开启缓存：  </p><p>以下内容均需要在反代配置下方加入，也可以多个网站共同 include 一个缓存配置。include 用法如下：</p><figure class="highlight nginx"><table><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><code class="hljs nginx"><span class="hljs-comment"># reverse proxy</span><br>    <span class="hljs-section">location</span> / &#123;<br>        <span class="hljs-attribute">proxy_pass</span>            http://bw;<br>        <span class="hljs-attribute">proxy_set_header</span> Host <span class="hljs-variable">$host</span>;<br>        <span class="hljs-attribute">include</span>               conf.d/proxy.conf;<br>        <span class="hljs-attribute">proxy_next_upstream</span>   <span class="hljs-literal">error</span> timeout http_502 http_503 http_504;<br>    &#125;<br></code></pre></td></tr></table></figure><p>然后添加缓存配置：</p><figure class="highlight nginx"><table><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><code class="hljs nginx"><span class="hljs-attribute">proxy_cache</span> global;<br><span class="hljs-attribute">proxy_cache_valid</span> <span class="hljs-number">301</span>      <span class="hljs-number">7d</span>;<br><span class="hljs-attribute">proxy_cache_valid</span> <span class="hljs-number">404</span>      <span class="hljs-number">1m</span>;<br></code></pre></td></tr></table></figure><p>在 <code>proxy_cache</code> 后加缓存区域名称。最简单的基础配置，Nginx 将根据源站的标头自动进行缓存。</p><p>此处可以添加更多保底规则（一般情况下，非 200 状态码源站很可能不返回缓存控制信息，如果在源站未明确要求是否缓存，就使用此处的规则）  </p><p>不添加任何其他规则时，Nginx 将跟随源站进行缓存。可以改善性能并且一般不会出现访问问题。完整的规则列表请参考<a href="'https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache'">这里</a>  </p><h2 id="其他配置"><a href="#其他配置" class="headerlink" title="其他配置"></a>其他配置</h2><p>忽略源站配置，强制配置单独的缓存规则：<br>HTTP 块中：</p><figure class="highlight nginx"><table><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></pre></td><td class="code"><pre><code class="hljs nginx"><span class="hljs-attribute">proxy_cache</span> global;<br><span class="hljs-attribute">proxy_cache_valid</span> <span class="hljs-number">301</span>      <span class="hljs-number">7d</span>;<br><span class="hljs-attribute">proxy_cache_valid</span> <span class="hljs-number">404</span>      <span class="hljs-number">1m</span>;<br><span class="hljs-attribute">proxy_cache_valid</span> any      <span class="hljs-number">5m</span>;<br><span class="hljs-attribute">proxy_ignore_headers</span> Set-Cookie;<br><span class="hljs-attribute">proxy_ignore_headers</span> Cache-Control Expires;<br></code></pre></td></tr></table></figure><div class="alert info"><p>通常不推荐。建议的做法是在源站完善配置，然后 Nginx 配置跟随源站并设置保底规则，而不是完全忽略源站的缓存控制。</p></div><p>完全手动配置缓存更灵活，但是可能导致访问出现问题，下面是一些配置建议：  </p><ul><li>不要缓存网站的登录页面和后台，可能会导致访问失败和数据泄露</li><li>不要缓存网站评论系统，可能会导致无法刷新出评论内容或重复评论。</li></ul><h2 id="ZFS"><a href="#ZFS" class="headerlink" title="ZFS"></a>ZFS</h2><p>缓存在 ZFS 上时，推荐一个配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash">zfs create -o mountpoint=/var/cache/nginx -o compression=lz4 -o atime=off -o recordsize=128K -o primarycache=metadata -o secondarycache=none rpool/ngcache<br>zfs <span class="hljs-built_in">set</span> quota=2G rpool/ngcache<br></code></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Nginx 反代默认不缓存，部分场景下，默认配置可能会使源站压力过高并降低网站性能。在这里写一下 Nginx 缓存的配置方法。&lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="CDN" scheme="https://www.libmbr.com/tags/CDN/"/>
    
    <category term="Nginx" scheme="https://www.libmbr.com/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>腾讯云轻量手动配置 IPv6</title>
    <link href="https://www.libmbr.com/archives/502/"/>
    <id>https://www.libmbr.com/archives/502/</id>
    <published>2025-03-10T16:02:23.000Z</published>
    <updated>2025-03-10T16:02:23.000Z</updated>
    
    <content type="html"><![CDATA[<p>Lighthouse 实例手动配置 IPv6 的教程，主要解决重置&#x2F;回滚系统后丢失 IPv6 配置，以及自定义网络划分缺少配置信息的问题</p><span id="more"></span><hr><p>本文章内容不适用于腾讯云 CVM 实例。</p><h2 id="基础信息"><a href="#基础信息" class="headerlink" title="基础信息"></a>基础信息</h2><p>如果你对 IPv6 已经很了解了，只是需要配置信息，那么你可能只需要这个表格：  </p><table><thead><tr><th>配置项</th><th>配置值</th></tr></thead><tbody><tr><td>IPv6 连接方式</td><td>静态地址</td></tr><tr><td>IPv6 地址</td><td>使用控制台显示的公网 IPv6 地址</td></tr><tr><td>IPv6 前缀长度</td><td>128</td></tr><tr><td>IPv6 子网掩码</td><td><code>ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff</code></td></tr><tr><td>IPv6 网关</td><td><code>fe80::feee:ffff:feff:ffff</code></td></tr><tr><td>IPv6 DNS</td><td>不使用</td></tr><tr><td>RA</td><td>关闭</td></tr><tr><td>DHCPv6</td><td>关闭</td></tr></tbody></table><p>下图蓝框部分即为需要填入的 IPv6 地址：<br><img src="https://lfs.libmbr.com/assets/2025/03/10/3048c954-b696-49a4-95c8-2cb26be99572.webp" alt="腾讯云轻量 IPv6 地址"></p><h2 id="Debian-ifupdown-配置"><a href="#Debian-ifupdown-配置" class="headerlink" title="Debian&#x2F;ifupdown 配置"></a>Debian&#x2F;ifupdown 配置</h2><p><strong>临时配置（重启后失效）：</strong><br>输入下面的命令：  </p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">ip -6 addr add 公网 IPv6 地址/128 dev eth0<br>ip -6 route add default via fe80::feee:ffff:feff:ffff dev eth0<br></code></pre></td></tr></table></figure><p><strong>永久配置：</strong><br>编辑 <code>/etc/network/interfaces</code> ，按下面的格式加上  </p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">iface eth0 inet6 static<br>        address 公网 IPv6 地址/128<br>        gateway fe80::feee:ffff:feff:ffff<br></code></pre></td></tr></table></figure><p><img src="https://lfs.libmbr.com/assets/2025/03/10/3dd80532-2d0c-4084-9668-a014eaf384df.webp" alt="ifupdown IPv6"><br>完成后重启服务器，或者用 <code>ifreload -a</code> 应用（需要 ifupdown2）  </p><h2 id="NetworkManager-配置"><a href="#NetworkManager-配置" class="headerlink" title="NetworkManager 配置"></a>NetworkManager 配置</h2><p>（Debian 以外的部分操作系统使用 NetworkManager）  </p><p><strong>临时配置（重启后失效）：</strong><br>输入下面的命令：  </p><figure class="highlight sh"><table><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><code class="hljs sh">nmcli connection modify eth0 ipv6.addresses 公网 IPv6 地址/128<br>nmcli connection modify eth0 ipv6.gateway fe80::feee:ffff:feff:ffff<br>nmcli connection modify eth0 ipv6.method manual<br>nmcli connection up eth0<br></code></pre></td></tr></table></figure><p><strong>永久配置：</strong><br>编辑 <code>/etc/NetworkManager/system-connections/eth0.nmconnection</code> ，按下面的格式加上  </p><figure class="highlight plaintext"><table><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><code class="hljs plaintext">[ipv6]<br>method=manual<br>addresses=公网 IPv6 地址/128<br>gateway=fe80::feee:ffff:feff:ffff<br></code></pre></td></tr></table></figure><p>完成后重启服务器，或者用 <code>nmcli connection reload</code> 应用  </p><h2 id="Windows-配置"><a href="#Windows-配置" class="headerlink" title="Windows 配置"></a>Windows 配置</h2><ol><li>打开控制面板</li><li>网络和共享中心</li><li>点开网络连接，属性</li><li>编辑 TCP&#x2F;IPv6</li><li>按上面基础信息填</li><li>DNS 留空</li><li>保存</li></ol><p>或者我尝试用一张图让你理解：  </p><p><img src="https://lfs.libmbr.com/assets/2025/03/10/c059155b-31fb-4730-9601-d9ff651a866c.webp" alt="Windows set IPv6"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Lighthouse 实例手动配置 IPv6 的教程，主要解决重置&amp;#x2F;回滚系统后丢失 IPv6 配置，以及自定义网络划分缺少配置信息的问题&lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="IPv6" scheme="https://www.libmbr.com/tags/IPv6/"/>
    
    <category term="腾讯云" scheme="https://www.libmbr.com/tags/%E8%85%BE%E8%AE%AF%E4%BA%91/"/>
    
    <category term="云服务器" scheme="https://www.libmbr.com/tags/%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>iPhone 强制锁 120Hz 高刷的方法</title>
    <link href="https://www.libmbr.com/archives/501/"/>
    <id>https://www.libmbr.com/archives/501/</id>
    <published>2025-03-10T15:00:39.000Z</published>
    <updated>2025-03-10T15:00:39.000Z</updated>
    
    <content type="html"><![CDATA[<p>有的应用和游戏，比如，Arcaea，没有正确适配 iPhone 的动态刷新率，会导致游玩时锁在 80Hz 或者其他的低刷新率，不过有个很简单的方法来解</p><span id="more"></span><h2 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h2><ol><li>先确保低电量模式没开</li><li>设置 - 辅助功能 - 动态效果，检查下最底下的 60Hz 开关是否关闭</li><li><strong>需要强制高刷的时候把录屏打开即可</strong></li></ol><p>已测试 iOS 16 以上的稳定版本，直到本文发布时最新的 iOS 18.3.1 均可用这个方法解锁，有几个 Beta 版本是不行的  </p><p>我也很好奇为啥会有这种神奇的 bug，这个其实 2022 我就遇到了，今天碰巧想到就发出来了。  </p><p>另外这个 Bug 貌似只影响 iPhone，不影响 iPad，Mac 我不知道，我猜没问题  </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;有的应用和游戏，比如，Arcaea，没有正确适配 iPhone 的动态刷新率，会导致游玩时锁在 80Hz 或者其他的低刷新率，不过有个很简单的方法来解&lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="苹果" scheme="https://www.libmbr.com/tags/%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="iPhone" scheme="https://www.libmbr.com/tags/iPhone/"/>
    
    <category term="Apple" scheme="https://www.libmbr.com/tags/Apple/"/>
    
  </entry>
  
  <entry>
    <title>大致是个 2024 年度总结</title>
    <link href="https://www.libmbr.com/archives/500/"/>
    <id>https://www.libmbr.com/archives/500/</id>
    <published>2024-12-31T15:59:59.000Z</published>
    <updated>2024-12-31T15:59:59.000Z</updated>
    
    <content type="html"><![CDATA[<p>转眼间，2024 年又要过去了。在这辞旧迎新之际，让我来回顾一下我的 2024 年，充满「改变」的一年。  </p><span id="more"></span><hr><p>应该有简介，但是我不知道写点什么。 文笔不好，基本没怎么写过教程以外的文章，是真的不会写简介哇（  </p><p>上面的内容是从 <a href="https://blog.chyk.ink/2023/12/23/my-2023-summary/">斩斩的 2023 总结</a> <del>照抄</del>，哦不，借鉴的（  </p><p><strong>这篇文章是在小米之家的一台展示机上完成的。</strong>  </p><p>先来解释一下上面这句话：  </p><p>写文章的这一天，学校提前放学，两点放了，放学之后跑滨海玩去了，六点半到天河城吃饭，预约取号，然后就有了：  </p><p>《前面有 185 桌》</p><p>好在这家商场有那个很火的长得像洗衣机的能拍的游戏能玩，然后下楼看了一眼，二十多个人在排两台机子。</p><p>于是走到旁边的小米之家，看到一台游戏本，看了下机器参数之后就开始写这东西了。分享下机器参数吧。</p><p>CPU 是 Intel i9-14900HX，比较奇怪的就是搭上了 16GB DDR5-5600 的内存。这年头游戏本难道不都是 32 起步吗，而且 5600 是不是频率略低了（好像笔记本合理点）？  </p><p>机器里自带了 CPU-Z 等测试工具，大概率是其他路人装的，跑了个分，使用 CPU-Z 19.01.64 AVX2 预设，单核 608.3，多核 6268.5。本来以为会比我自己台式机的 13600KF 略高，实际上没到我 13600KF 的一半，我都好奇笔记本 i9 能不能打台式机 i3 了。  </p><p>我对 i9 移动端的印象没有这么差，怀疑这机子是不是散热或者调度有什么问题，也可能是我打开的方式不对吧，总之是直接用默认设置跑的。  </p><h2 id="去过的地方"><a href="#去过的地方" class="headerlink" title="去过的地方"></a>去过的地方</h2><h4 id="北京"><a href="#北京" class="headerlink" title="北京"></a>北京</h4><p>十几次北京吧，基本每个月都去一次了。  </p><p>北京那边有不少朋友，和别人见面也喜欢优先北京，另一个原因是，北京那边有不少银行（唉卡吃，这个下面一会再详细说说）。</p><p>在北京还拍到了知名的 CR400BF-5033，但是没坐，只是拍到了，是 10 月 3 日的下午，国庆假期，从天津站坐 C2006 次列车前往北京，看了眼 rail.re，当时 5033 在跑京津城际，可能有机会看一面。到了天津站发现是用 CR400BF-5077 跑的，达速运行，到达北京南后，在对侧站台发现 5033，于是拍了几张照片</p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/529f73f4-4cd2-4c1a-b81a-158e5bde0b75.webp" alt="CR400BF-5033 停于北京南站"></p><h4 id="廊坊"><a href="#廊坊" class="headerlink" title="廊坊"></a>廊坊</h4><p>前几次去是骑车去北京（这个事后面也要讲讲）路过的，最后一次去是去北京大兴机场，大兴机场航站楼貌似完全在廊坊，所以就分类到这里了。</p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/385cc2aa-94e9-4027-b00c-48b87cfce327.webp" alt="大兴机场"></p><h4 id="秦皇岛"><a href="#秦皇岛" class="headerlink" title="秦皇岛"></a>秦皇岛</h4><p>取得了第一次上高速的成就，都是绿色牌子好好看。  </p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/9e8b86cd-a837-4f6f-b2d8-17937cc26349.webp" alt="雨雪天气 桥上慢行"></p><h2 id="面过的人"><a href="#面过的人" class="headerlink" title="面过的人"></a>面过的人</h2><h4 id="一刀斩"><a href="#一刀斩" class="headerlink" title="一刀斩"></a>一刀斩</h4><p>很可爱的大佬，东北大学的大学生，Linux GUI 的用户（甚至是触屏而且是 ARM）。  </p><p>他的 Blog 在<a href="https://blog.chyk.ink/">这里</a>。</p><h4 id="流星"><a href="#流星" class="headerlink" title="流星"></a>流星</h4><p>大概是因为 maimai 和那个叫钟致远的人才相识的。是音击厨，也会打 maimai，中二就比较少了，现在打 Arcaea 又比较多。  </p><h4 id="Kt"><a href="#Kt" class="headerlink" title="Kt"></a>Kt</h4><p>好像和我一起开了 BEIJING PASS，是软粉，曾在大兴机场给我展示可以 360 度折的 Surface Book 2。（这机器支持独显热插拔，真的很酷  </p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/122d56c9-99dd-4e2f-ae83-adbb3406a935.webp" alt="Surface Book 2"></p><h4 id="剪贴板"><a href="#剪贴板" class="headerlink" title="剪贴板"></a>剪贴板</h4><p>好像是衡水的学生，是因为 BEIJING PASS 认识的  </p><h4 id="ACh"><a href="#ACh" class="headerlink" title="ACh"></a>ACh</h4><p>盐酸乙酰胆碱，也是大佬，后面就不会描述了呜呜（  </p><h4 id="天王寺喵苑"><a href="#天王寺喵苑" class="headerlink" title="天王寺喵苑"></a>天王寺喵苑</h4><p>貌似也是通过 maimai 认识，在某个下午带着我开了一张卡。  </p><h4 id="186526"><a href="#186526" class="headerlink" title="186526"></a>186526</h4><p>北京的卡吃，ARIN 的 LIR，不打乌蒙，运营着 <a href="https://sunoaki.net/">Sunoaki Network</a>  </p><h4 id="一穗灯花"><a href="#一穗灯花" class="headerlink" title="一穗灯花"></a>一穗灯花</h4><p>很可爱，曾经是 NixOS 用户，貌似为 NixOS 打包了不少软件。  </p><hr><p>不知道有没有列全，如果我不小心忘记了，或者想修改上面的内容，也可以在评论区叫我改改（？  </p><p>上面的大佬大多数都是 Linux 用户，一刀斩曾经使用 Arch，现在使用 AOSC，Kt 是 EL 粉，Ach 186 和流星用的应该都是基于 Debian 的发行版。  </p><h2 id="铁路迷"><a href="#铁路迷" class="headerlink" title="铁路迷"></a>铁路迷</h2><p><del>半吊子车迷，一定是群友把我变成这样的！</del>  </p><p>目前有收集报销凭证&#x2F;车票，以及去各个站打卡的习惯。  </p><p>今年坐过比较多的是京津城际，D9&#x2F;D11，1461&#x2F;2  </p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/318bd150-3275-4942-8fb1-ee9e376f9021.webp" alt="MBR 2024 坐过的火车"></p><p>再聊聊地铁？  </p><p>北京地铁支持外卡和万事网联，好先进啊（  </p><p>天津地铁莫名其妙的不支持工商的银联  </p><p>天津地铁津静线和 11 号线西段已经看过了，北京三号线还没有看过，预计寒假第一天就去看看。  </p><h2 id="卡吃"><a href="#卡吃" class="headerlink" title="卡吃"></a>卡吃</h2><p><del>一定是群友把我变成这样的！</del>  </p><p>好吧多开几张银行卡确实有用，一个是刷卡的时候有优惠，一个是向境外商户付款也方便点。  </p><p>今年开了广发的 AMEX、工银的小飞机（牡丹国际借记卡，万事达版）、招商的方舟卡面银联。  </p><p>前一张是天津本地开的，非柜，第一次见到这卡因为未成年就非柜。后两张是北京，开的都很爽快。  </p><ul><li>工银小飞机就是 10 月 3 日开的，看 5033 的那一天</li><li>招行是天王寺喵苑带着开的，我最早的银联好像也是她推荐的。</li></ul><h2 id="骑行"><a href="#骑行" class="headerlink" title="骑行"></a>骑行</h2><p>应该是有必要提一下了，今年试了下长途骑车，和同学跑了几次天津到北京的往返。  </p><p>路况挺不错的，不算太累，共享单车的话一次 12 元。有一次骑的时候气温有 36 摄氏度，放点图吧：  </p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/cb50c517-7964-424b-82d8-2891f163279b.webp" alt="骑车进京 1"></p><p><img src="https://lfs.libmbr.com/assets/2025/01/01/3c25327c-83d7-44f8-91db-ea7b23f0de42.webp" alt="骑车进京 2"></p><h2 id="游戏相关"><a href="#游戏相关" class="headerlink" title="游戏相关"></a>游戏相关</h2><p>今年玩的 maimai 感觉更少了，也许是因为搬家搬到了附近没有机厅的地方。  </p><p>国服 RATING 11661，当前版本（2024）游玩次数 0<br>日服 RATING 05244，当前版本（PRI-）游玩次数 0<br>u.七个字母.三个字母 RATING 10027，当前版本（PRI-）游玩次数 1</p><p>目前还没有中二和音击的号，但是 2025 会考虑。</p><h2 id="校园"><a href="#校园" class="headerlink" title="校园"></a>校园</h2><p>新校区破破烂烂的，但是有不少大佬。  </p><p><del>不知道写啥，放点我们化学老师的名言吧（？</del></p><p>化学的尽头是物理，物理的尽头是数学，数学的尽头是什么？（停顿半分钟）是哲学。所以我们一直都在思考的是一个哲学问题。远看朝气蓬勃，茂盛葱绒，近看杂草丛生。  </p><h2 id="互联网"><a href="#互联网" class="headerlink" title="互联网"></a>互联网</h2><p>今年获得了两个域名：  </p><ul><li>kmbr.dev<br>基本是解析内网设备用，一些自用服务也会放在这个域名</li><li>4.e.e.0.4.8.0.6.0.4.2.ip6.arpa<br>玩具！他甚至可以建站：<a href="https://the-a-record.4.e.e.0.4.8.0.6.0.4.2.ip6.arpa/">The A Record on ARPA</a></li></ul><p>MOEFIRE 给我的 IP 段：  </p><ul><li>2406:840:ee4d::&#x2F;48<br>内部拆成了两个 &#x2F;56，两个 &#x2F;64 来用</li></ul><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>完善了 <a href="https://github.com/K19B/Kalium.Core">Kalium Bot</a>，写 maimai 自动化查分器写了一半w  </p><p>感觉没有可以继续说的了，那就，总结？</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><del>其实只是又活过了一年罢了</del>  </p><p>人类好奇怪啊，居然会庆祝他们的地球又转了一圈.webp  </p><p>可能是因为上学忙了一点，今年干的事好像比去年要少了。  </p><p>所以，2025，还会继续努力的！  </p><h2 id="感谢"><a href="#感谢" class="headerlink" title="感谢"></a>感谢</h2><p>本文章的编写参考了以下内容：</p><ul><li><a href="https://blog.chyk.ink/2023/12/23/my-2023-summary/">📜 我的 2023：新的改变，新的成长，新的开始 - 風雪城</a></li><li><a href="https://blog.awaae001.top/posts/57024.html">再见2024 · 共赴一场烟火绚烂 - 呓语梦轩</a></li></ul><p>别的大佬都好厉害啊，年度总结都能写出几万字的，羡慕了（  </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;转眼间，2024 年又要过去了。在这辞旧迎新之际，让我来回顾一下我的 2024 年，充满「改变」的一年。  &lt;/p&gt;</summary>
    
    
    
    <category term="日常" scheme="https://www.libmbr.com/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="2024" scheme="https://www.libmbr.com/tags/2024/"/>
    
    <category term="跨年" scheme="https://www.libmbr.com/tags/%E8%B7%A8%E5%B9%B4/"/>
    
    <category term="2025" scheme="https://www.libmbr.com/tags/2025/"/>
    
    <category term="年度总结" scheme="https://www.libmbr.com/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>Hyper-V / KVM 中 VM 的时间同步</title>
    <link href="https://www.libmbr.com/archives/499/"/>
    <id>https://www.libmbr.com/archives/499/</id>
    <published>2024-10-18T00:00:00.000Z</published>
    <updated>2024-10-18T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>虚拟化环境中 VM 的时间同步是很重要的，时间失去同步可能导致诸如 Git、APT、SSL&#x2F;TLS 等很多服务出现异常，而虚拟机的系统时间还容易受到休眠和在线迁移的影响。  </p><p>在生产环境常用的 Hyper-V 和 QEMU&#x2F;KVM 中，如何优雅地使虚拟机的系统时间和外部时间保持同步呢？  </p><span id="more"></span><hr><p>虚拟机中的时间同步大致有两种方案：</p><ul><li>和网络时间（NTP 服务器）同步</li><li>和宿主机时间同步</li></ul><p>大多数系统中已经默认配置了第一种 NTP 时间同步，然而，虚拟机中使用第一种方法需要可靠的网络连接，且更容易受到外部因素（休眠、在线迁移等）影响。  </p><p>而第二种方法只需要<strong>保证宿主机时间精确</strong>（Azure 和其他大多数 VPS 的服务商其实也都做到了这个），然后让虚拟机跟随宿主机时钟同步即可，使用这种方法通常精准度会更高，性能开销也稍低一些。</p><p>所以在此只介绍第二种方法，适用于 Hyper-V 和 QEMU&#x2F;KVM，包括 Proxmox VE 等基于 QEMU 魔改的虚拟机也可以，这些虚拟机程序和 VM 时间同步都使用 PTP 协议，简单的介绍一下 PTP：</p><h2 id="PTP"><a href="#PTP" class="headerlink" title="PTP"></a>PTP</h2><p>即 Precision Time Protocol，精确时间协议，PTP 提供微秒级的精度，适用于要求极高时间同步的场景，而常见的 NTP 通常只提供毫秒级的精度，PTP 使用主从模式，主时钟负责同步所有从时钟，通常更适用于局域网环境；NTP 较简单，适合广域网和互联网同步。</p><p>确保宿主机时间精确之后，照着下面的说明为虚拟机开启时间同步</p><h2 id="宿主机操作"><a href="#宿主机操作" class="headerlink" title="宿主机操作"></a>宿主机操作</h2><p>在宿主机上为虚拟机启用 PTP 时间同步设备</p><ul><li>Hyper-V<br>虚拟机设置里找到 <code>Integration Services</code>，勾上 <code>Time Synchronization</code>，保存<br>理论上所有 Hyper-V 版本都支持这个<br><img src="https://lfs.libmbr.com/assets/2024/10/17/f7616c12-2e22-4770-b0d6-aa7e0c8a2486.webp" alt="Hyper-V Time Synchronization Option"></li><li>QEMU&#x2F;KVM<br>默认应该是自动启用的，如果你坚信他没启用，可以试试把 <code>-device kvm-ptp</code> 塞进 QEMU 参数（大模型说的，笔者感觉这个参数没用，加了可能反而会炸）<br>翻了一下<a href="https://github.com/qemu/qemu/blob/278f064e452468d66ee15c3f453826e697ec6832/linux-headers/linux/kvm.h#L1085">源码</a>和提交记录，QEMU 是从 <a href="https://github.com/qemu/qemu/commit/278f064e452468d66ee15c3f453826e697ec6832#diff-f0554892534433bf896e94596ccf7ccad90ebebfc09486a0757b1a4f2ee10c1dR1085">7ec6832</a>（6.0.50 或 6.1 的开发版本） ，2021 年 6 月 18 日开始支持时间同步特性的，太老的版本也许是没有的</li></ul><h2 id="Linux-VM"><a href="#Linux-VM" class="headerlink" title="Linux VM"></a>Linux VM</h2><p>Linux 中推荐使用 <code>chrony</code> 来设置时间同步，部分发行版自带了不支持 PTP 协议的 <code>systemd-timesyncd</code>，少部分发行版默认就提供了配置好的 <code>chrony</code>。</p><p>我们这时候通过 <code>chronyc tracking</code> 命令来检查 chrony 的工作状态：</p><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">text</li></ul></figcaption><div class="tabs-content"><figure class="highlight text" style="display: block;"><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">Reference ID    : 50484330 (PHC0)</span><br><span class="line">Stratum         : 3</span><br><span class="line">Ref time (UTC)  : Thu Oct 17 16:26:56 2024</span><br><span class="line">System time     : 0.000000000 seconds fast of NTP time</span><br><span class="line">Last offset     : -0.000001475 seconds</span><br><span class="line">RMS offset      : 0.000000613 seconds</span><br><span class="line">Frequency       : 0.008 ppm slow</span><br><span class="line">Residual freq   : -0.019 ppm</span><br><span class="line">Skew            : 0.064 ppm</span><br><span class="line">Root delay      : 0.000000001 seconds</span><br><span class="line">Root dispersion : 0.000010623 seconds</span><br><span class="line">Update interval : 8.0 seconds</span><br><span class="line">Leap status     : Normal</span><br></pre></td></tr></tbody></table></figure></div></figure><p>主要看第一行 <code>Reference ID</code> 即可：</p><ul><li>如果括号内显示的是 <code>PHCx</code>，说明系统已经配置好了和宿主机的时间同步（部分云厂商会帮你做好这件事），然后你大致就可以关闭本页面了（？</li><li>如果括号内只有域名或者 IP，说明系统只配置了 NTP 同步，继续按照下面的方法配置即可</li><li>当然你可能会直接得到一个 <code>command not found</code>，说明你没有安装 <code>chrony</code>，可以参考下面的命令来安装，不同发行版安装方法不同，以 Debian 为例：    <figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install chrony</span><br></pre></td></tr></tbody></table></figure></div></figure>  <div class="alert info"><p>安装 <code>chrony</code> 会自动移除 <code>systemd-timesyncd</code> 和其他时间同步工具</p></div></li></ul><h3 id="检查-PTP-设备"><a href="#检查-PTP-设备" class="headerlink" title="检查 PTP 设备"></a>检查 PTP 设备</h3><p>运行 <code>ls /dev/ptp_* -lah</code> 来检查 VM 里是否已经有 PTP 设备</p><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><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"># Hyper-V</span></span><br><span class="line">lrwxrwxrwx 1 root root 4 Oct 17 13:17 /dev/ptp_hyperv -&gt; ptp0</span><br><span class="line"><span class="comment"># QEMU/KVM</span></span><br><span class="line">lrwxrwxrwx 1 root root 4 Oct 17 13:50 /dev/ptp_kvm -&gt; ptp0</span><br></pre></td></tr></tbody></table></figure></div></figure><p>如果报错 <code>No such file or directory</code>，尝试载入虚拟机的 PTP 模块</p><ul><li>Hyper-V  <figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><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">modprobe hv_utils</span><br><span class="line"><span class="comment"># echo hv_utils &gt;&gt; /etc/modules # Load module on boot</span></span><br></pre></td></tr></tbody></table></figure></div></figure>  （不过理论上正常系统检测到 Hyper-V 应该会自动载入的…真的会有默认不载入的吗</li><li>QEMU&#x2F;KVM  <figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><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">modprobe ptp_kvm</span><br><span class="line"><span class="built_in">echo</span> ptp_kvm &gt;&gt; /etc/modules <span class="comment"># Load module on boot</span></span><br></pre></td></tr></tbody></table></figure></div></figure>  （倒是 QEMU 的貌似不会自动载入</li></ul><h3 id="添加时钟源"><a href="#添加时钟源" class="headerlink" title="添加时钟源"></a>添加时钟源</h3><p>PTP 设备出现以后就可以开始配置 <code>chrony</code> 了：</p><p>先编辑 <code>/etc/chrony/chrony.conf</code>，注释掉所有以 <code>pool</code> 和 <code>sourcedir</code> 开始的行，然后添加硬件时钟：  </p><ul><li>Hyper-V  <figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><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="built_in">echo</span> <span class="string">"maxupdateskew 100.0</span></span><br><span class="line"><span class="string">refclock PHC /dev/ptp_hyperv poll 3 dpoll -2 offset 0 stratum 2</span></span><br><span class="line"><span class="string">makestep 1.0 -1"</span> &gt; /etc/chrony/conf.d/hv.conf</span><br></pre></td></tr></tbody></table></figure></div></figure></li><li>QEMU&#x2F;KVM  <figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">sh</li></ul></figcaption><div class="tabs-content"><figure class="highlight sh" style="display: block;"><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="built_in">echo</span> <span class="string">"maxupdateskew 100.0</span></span><br><span class="line"><span class="string">refclock PHC /dev/ptp_kvm poll 3 dpoll -2 offset 0 stratum 2</span></span><br><span class="line"><span class="string">makestep 1.0 -1"</span> &gt; /etc/chrony/conf.d/kvm.conf</span><br></pre></td></tr></tbody></table></figure></div></figure></li></ul><h3 id="完成配置"><a href="#完成配置" class="headerlink" title="完成配置"></a>完成配置</h3><p>重启 <code>chrony</code>，查看时间同步信息  </p><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">text</li></ul></figcaption><div class="tabs-content"><figure class="highlight text" style="display: block;"><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">systemctl restart chrony</span><br><span class="line">sleep 30</span><br><span class="line">chronyc tracking</span><br></pre></td></tr></tbody></table></figure></div></figure><p>第一行显示 <code>PHCx</code> 说明已配置完成，可以看到 PTP 时间同步的延迟低至 <code>0.000000001 seconds</code>，大致能比 NTP 高 10 的 5-7 次方  </p><h2 id="Windows-VM"><a href="#Windows-VM" class="headerlink" title="Windows VM"></a>Windows VM</h2><p><em>（待补充）</em></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;虚拟化环境中 VM 的时间同步是很重要的，时间失去同步可能导致诸如 Git、APT、SSL&amp;#x2F;TLS 等很多服务出现异常，而虚拟机的系统时间还容易受到休眠和在线迁移的影响。  &lt;/p&gt;
&lt;p&gt;在生产环境常用的 Hyper-V 和 QEMU&amp;#x2F;KVM 中，如何优雅地使虚拟机的系统时间和外部时间保持同步呢？  &lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hyper-V" scheme="https://www.libmbr.com/tags/Hyper-V/"/>
    
    <category term="时间同步" scheme="https://www.libmbr.com/tags/%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5/"/>
    
    <category term="NTP" scheme="https://www.libmbr.com/tags/NTP/"/>
    
    <category term="PTP" scheme="https://www.libmbr.com/tags/PTP/"/>
    
    <category term="KVM" scheme="https://www.libmbr.com/tags/KVM/"/>
    
  </entry>
  
  <entry>
    <title>将 Exos 硬盘格式化为 4Kn</title>
    <link href="https://www.libmbr.com/archives/498/"/>
    <id>https://www.libmbr.com/archives/498/</id>
    <published>2024-08-02T00:00:00.000Z</published>
    <updated>2024-08-02T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Exos 采用高级格式（AF）的硬盘大多默认设置为 512e 模式，写一篇 512e&#x2F;4Kn 模式互相切换的教程  </p><span id="more"></span><p>修改之前先确定一下硬盘是否支持 AF（物理扇区大小为 4K 则表示支持），512n 模式的硬盘是没法改的<br>Exos X 系列的氦气盘全部支持 AF，都可以改  </p><p><img src="https://lfs.libmbr.com/assets/2024/08/02/85059b01-0ae4-4d68-a536-3a954637b3f4.webp" alt="512e format"></p><h2 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h2><ul><li><a href="https://www.seagate.com/cn/zh/support/software/seachest/">Seachest Lite</a></li></ul><h2 id="教程"><a href="#教程" class="headerlink" title="教程"></a>教程</h2><p>安装好工具之后，命令行打开工具目录（Linux 的话貌似不需要这一步）  </p><p>然后输入命令扫描磁盘</p><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">Windows</li><li class="tab">Linux</li></ul></figcaption><div class="tabs-content"><figure class="highlight plaintext" style="display: block;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./SeaChest_Lite_x64_windows.exe --scan</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext" style="display: none;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SeaChest_Lite --scan</span><br></pre></td></tr></tbody></table></figure></div></figure><p><img src="https://lfs.libmbr.com/assets/2024/08/02/ccd2d193-a6fc-42f6-9c84-76bae7b75aa9.webp" alt="SeaChest Disk List"></p><p>找到你要操作的磁盘的编号，比如 PD2</p><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">Windows</li><li class="tab">Linux</li></ul></figcaption><div class="tabs-content"><figure class="highlight plaintext" style="display: block;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./SeaChest_Lite_x64_windows.exe --device PDx --setSectorSize 4096</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext" style="display: none;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SeaChest_Lite --device PDx --setSectorSize 4096</span><br></pre></td></tr></tbody></table></figure></div></figure><p><code>PDx</code> 替换为上面的磁盘编号，<code>--setSectorSize</code> 后面跟上你想设置的扇区大小<br>Exos SATA 盘可以设置的扇区大小有 512 和 4096，SAS 盘额外还可以设置成 4160 和 4224  </p><p>如果上面的命令没有报错的话，就可以确认格式化了  </p><div class="alert warning"><p>确认操作后，磁盘内所有扇区的数据都会被清除，不要忘记数据备份</p></div><div class="alert warning"><p>请确保你的主板&#x2F;固件支持你设置的扇区大小，否则可能导致硬盘无法读取或电脑无法开机</p></div><figure class="codeblock codeblock--tabbed"><figcaption><ul class="tabs"><li class="tab active">Windows</li><li class="tab">Linux</li></ul></figcaption><div class="tabs-content"><figure class="highlight plaintext" style="display: block;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./SeaChest_Lite_x64_windows.exe --device PDx --setSectorSize 4096 --confirm this-will-erase-data-and-may-render-the-drive-inoperable</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext" style="display: none;"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SeaChest_Lite --device PDx --setSectorSize 4096 --confirm this-will-erase-data-and-may-render-the-drive-inoperable</span><br></pre></td></tr></tbody></table></figure></div></figure><p><img src="https://lfs.libmbr.com/assets/2024/08/02/e0119ffe-5942-4cf9-aa35-d1f0f9ebe9ea.webp" alt="SeaChest Fast Format"></p><p>新盘一般两分钟就能跑完，有些老型号可能需要跑很久  </p><p><img src="https://lfs.libmbr.com/assets/2024/08/02/d4fc8077-12ba-4102-a9d3-b015ba518949.webp" alt="4Kn Format"></p><p>重新获取一下硬盘信息就可以看到新的扇区大小了w</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Exos 采用高级格式（AF）的硬盘大多默认设置为 512e 模式，写一篇 512e&amp;#x2F;4Kn 模式互相切换的教程  &lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="希捷" scheme="https://www.libmbr.com/tags/%E5%B8%8C%E6%8D%B7/"/>
    
    <category term="Exos" scheme="https://www.libmbr.com/tags/Exos/"/>
    
    <category term="机械硬盘" scheme="https://www.libmbr.com/tags/%E6%9C%BA%E6%A2%B0%E7%A1%AC%E7%9B%98/"/>
    
    <category term="HDD" scheme="https://www.libmbr.com/tags/HDD/"/>
    
  </entry>
  
  <entry>
    <title>将 Debian 的根目录 FS 切换为 ZFS</title>
    <link href="https://www.libmbr.com/archives/497/"/>
    <id>https://www.libmbr.com/archives/497/</id>
    <published>2024-05-18T00:00:00.000Z</published>
    <updated>2024-05-18T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>Linux 更换根目录的 FS 为 ZFS 是可行的，写一篇教程记录下大致步骤和可能出现的问题  </p><span id="more"></span><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><ul><li>不比系统盘小的一块空硬盘</li></ul><h2 id="操作过程"><a href="#操作过程" class="headerlink" title="操作过程"></a>操作过程</h2><h3 id="1-ZFS-驱动和工具"><a href="#1-ZFS-驱动和工具" class="headerlink" title="1 - ZFS 驱动和工具"></a>1 - ZFS 驱动和工具</h3><p>Debian 目前默认的内核并没有集成 ZFS 驱动，必须更换内核或者手动安装内核模块才能正常使用 ZFS  </p><p><strong>方法一</strong></p><p>这里可以直接安装 <code>proxmox-ve</code> 包，Proxmox VE 自带了 ZFS 的管理工具和驱动（驱动由 Proxmox VE 的定制内核提供）， 且 PVE 对 ZFS 的支持也非常全： </p><div class="alert info"><p>如果你安装了 qemu，此方法会将你的 qemu 替换为 PVE 修改后的版本</p></div><div class="alert info"><p>如果你使用 systemd-timesyncd 用于时间同步，此方法会将你的 systemd-timesyncd 替换为 chrony</p></div><div class="alert warning"><p>下面的安装命令仅适用于 Debian 12 Bookworm AMD64，其他 Debian 版本或其他架构无法使用</p></div><figure class="highlight sh"><table><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><code class="hljs sh"><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;deb [arch=amd64] http://download.proxmox.com/debian/pve bookworm pve-no-subscription&quot;</span> &gt; /etc/apt/sources.list.d/pve-install-repo.list<br>wget https://enterprise.proxmox.com/debian/proxmox-release-bookworm.gpg -O /etc/apt/trusted.gpg.d/proxmox-release-bookworm.gpg <br>apt update<br>apt install proxmox-default-kernel proxmox-ve postfix open-iscsi chrony -y<br>apt remove linux-image-amd64 <span class="hljs-string">&#x27;linux-image-6.1*&#x27;</span> -y<br>update-grub<br>systemctl reboot<br></code></pre></td></tr></table></figure><p>如果只使用 Proxmox VE 的 ZFS 管理工具和驱动，不使用 Proxmox VE 虚拟机，可以考虑把 <code>proxmox-ve</code> 卸载掉：<code>apt remove proxmox-ve -y</code></p><p><strong>方法二</strong></p><p>使用原有内核，不安装 <code>proxmox-ve</code> 或其他内核，使用 dkms 手动安装 ZFS 驱动</p><div class="alert warning"><p>此方法可能无法在启用了 UEFI 安全启动的设备上正常工作，原因如下：  </p><p>Linux 5.4 中添加了 <code>kernel_lockdown</code> 功能，在启用 UEFI 安全启动的设备上，<code>kernel_lockdown</code> 强制启用，此功能只能在内核编译时去掉  </p><p><code>kernel_lockdown</code> 会阻止系统载入未签名的自定义模块，<code>zfs-dkms</code> 就是未签名的模块  </p><p><strong>您必须为内核和 dkms 配置自定义签名才能在启用了 UEFI 安全启动的设备上使用此方法</strong>（流程非常复杂，可能还需要在 UEFI 固件设置里手动导入证书，能单独再写一篇文章了）</p></div><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sh">apt install linux-headers-amd64 zfsutils-linux zfs-dkms<br>modprobe zfs<br></code></pre></td></tr></table></figure><h3 id="2-复制磁盘数据"><a href="#2-复制磁盘数据" class="headerlink" title="2 - 复制磁盘数据"></a>2 - 复制磁盘数据</h3><p>假设原硬盘的分区结构如下：  </p><table>    <tr>        <td colspan="2"><b>vda</b></td>    <tr>    <tr>        <td><b>1</b></td>        <td><b>2</b></td>        <td><b>3</b></td>        <td></td>    <tr>    <tr>        <td>BIOS Boot</td>        <td>Linux filesystem</td>        <td>Linux LVM</td>        <td></td>    <tr>    <tr>        <td></td>        <td><b>ext4 /boot</b></td>        <td><b>VG system</b></td>        <td></td>    <tr>    <tr>        <td></td>        <td></td>        <td><b>root</b></td>        <td><b>swap</b></td>    <tr>    <tr>        <td></td>        <td></td>        <td>btrfs /</td>        <td>swap</td>    <tr></table><p>先把系统盘（以 vda 为例）复制到另一块盘 vdb，然后清除掉 vdb 上的 boot 和 root 分区</p><div class="alert info"><p>如果你的系统盘上有 LVM，你需要在磁盘克隆后使用 <code>vgimportclone</code> 重新生成 LVM 的 UUID，命令已在下方给出</p></div><div class="alert info"><p>UEFI 用户需要两个分区用于启动，一个是 ESP（应挂载到 &#x2F;boot&#x2F;efi），另一个是 ZFS 启动分区（应挂载到 &#x2F;boot），我只以传统引导演示，因为我不使用 UEFI 也没有 ESP（</p></div><figure class="highlight sh"><table><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><code class="hljs sh">vgrename system systemOld<br><span class="hljs-built_in">dd</span> <span class="hljs-keyword">if</span>=/dev/vda of=/dev/vdb bs=1M status=progress<br>vgimportclone /dev/vdb3 -n system <span class="hljs-comment"># regen LVM uuids</span><br>wipefs -a /dev/vdb2<br>wipefs -a /dev/system/root<br></code></pre></td></tr></table></figure><p>完成后磁盘分区结构大致是：  </p><table>    <tr>        <td colspan="2"><b>vdb</b></td>    <tr>    <tr>        <td><b>1</b></td>        <td><b>2</b></td>        <td><b>3</b></td>        <td></td>    <tr>    <tr>        <td>BIOS Boot</td>        <td>Linux filesystem</td>        <td>Linux LVM</td>        <td></td>    <tr>    <tr>        <td></td>        <td></td>        <td><b>VG system</b></td>        <td></td>    <tr>    <tr>        <td></td>        <td></td>        <td><b>root</b></td>        <td><b>swap</b></td>    <tr>    <tr>        <td></td>        <td></td>        <td></td>        <td>swap</td>    <tr></table><h3 id="3-创建-ZFS"><a href="#3-创建-ZFS" class="headerlink" title="3 - 创建 ZFS"></a>3 - 创建 ZFS</h3><p>bpool，用于引导：  </p><figure class="highlight sh"><table><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></pre></td><td class="code"><pre><code class="hljs sh">zpool create \<br>    -f \<br>    -o cachefile= \<br>    -o ashift=12 -d \<br>    -o feature@async_destroy=enabled \<br>    -o feature@bookmarks=enabled \<br>    -o feature@embedded_data=enabled \<br>    -o feature@empty_bpobj=enabled \<br>    -o feature@enabled_txg=enabled \<br>    -o feature@extensible_dataset=enabled \<br>    -o feature@filesystem_limits=enabled \<br>    -o feature@hole_birth=enabled \<br>    -o feature@large_blocks=enabled \<br>    -o feature@livelist=enabled \<br>    -o feature@lz4_compress=enabled \<br>    -o feature@spacemap_histogram=enabled \<br>    -o feature@zpool_checkpoint=enabled \<br>    -O acltype=posixacl -O canmount=off -O compression=lz4 \<br>    -O devices=off -O normalization=formD -O relatime=on -O xattr=sa \<br>    -O mountpoint=/boot -R /mnt \<br>    bpool \<br>    /dev/vdb2<br></code></pre></td></tr></table></figure><p>rpool，存储 rootfs：</p><figure class="highlight sh"><table><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><code class="hljs sh">zpool create \<br>    -f \<br>    -o ashift=12 \<br>    -O acltype=posixacl -O canmount=off -O compression=lz4 \<br>    -O normalization=formD -O relatime=on \<br>    -O xattr=sa -O mountpoint=/ -R /mnt \<br>    rpool \<br>    /dev/system/root<br></code></pre></td></tr></table></figure><p>创建数据集：</p><figure class="highlight sh"><table><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><code class="hljs sh">zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/proxmox<br>zfs mount rpool/ROOT/proxmox<br>zfs create -o mountpoint=/boot bpool/BOOT/proxmox<br></code></pre></td></tr></table></figure><p>上面的操作完成后磁盘分区结构大致是：  </p><table>    <tr>        <td colspan="2"><b>vdb</b></td>    <tr>    <tr>        <td><b>1</b></td>        <td><b>2</b></td>        <td><b>3</b></td>        <td></td>    <tr>    <tr>        <td>BIOS Boot</td>        <td>Linux filesystem</td>        <td>Linux LVM</td>        <td></td>    <tr>    <tr>        <td></td>        <td><b>zpool bpool</b></td>        <td><b>VG system</b></td>        <td></td>    <tr>    <tr>        <td></td>        <td><b>BOOT</b></td>        <td><b>zpool rpool</b></td>        <td><b>swap</b></td>    <tr>    <tr>        <td></td>        <td>zfs /boot</td>        <td><b>ROOT</b></td>        <td>swap</td>    <tr>    <tr>        <td></td>        <td></td>        <td>zfs /</td>        <td></td>    <tr></table><h3 id="4-拷贝文件"><a href="#4-拷贝文件" class="headerlink" title="4 - 拷贝文件"></a>4 - 拷贝文件</h3><figure class="highlight sh"><table><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><code class="hljs sh">apt install rsync -y<br>rsync -axHAWXS --numeric-ids --info=progress2 / /mnt<br>rsync -axHAWXS --numeric-ids --info=progress2 /boot /mnt<br></code></pre></td></tr></table></figure><h3 id="5-更新引导"><a href="#5-更新引导" class="headerlink" title="5 - 更新引导"></a>5 - 更新引导</h3><p>在 vdb 创建新的引导文件：  </p><figure class="highlight sh"><table><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><code class="hljs sh">mount --rbind /proc /mnt/proc<br>mount --rbind /sys /mnt/sys<br>mount --rbind /dev /mnt/dev<br><span class="hljs-built_in">chroot</span> /mnt<br>apt install zfs-initramfs -y<br>update-initramfs -c -k all<br>grub-install /dev/vdb<br>update-grub<br></code></pre></td></tr></table></figure><h3 id="6-更新-fstab"><a href="#6-更新-fstab" class="headerlink" title="6 - 更新 fstab"></a>6 - 更新 fstab</h3><p>ZFS 不依赖 fstab 挂载，挂载信息存储在文件系统中，自行清理 fstab 的无用条目</p><h3 id="7-导出-ZFS"><a href="#7-导出-ZFS" class="headerlink" title="7 - 导出 ZFS"></a>7 - 导出 ZFS</h3><figure class="highlight sh"><table><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><code class="hljs sh"><span class="hljs-built_in">exit</span> <span class="hljs-comment"># quit chroot</span><br>mount | grep -v zfs | <span class="hljs-built_in">tac</span> | awk <span class="hljs-string">&#x27;/\/mnt/ &#123;print $3&#125;&#x27;</span> | \<br>    xargs -i&#123;&#125; umount -lf &#123;&#125;<br>zpool <span class="hljs-built_in">export</span> -a<br></code></pre></td></tr></table></figure><h3 id="8-将-ZFS-写回原系统盘"><a href="#8-将-ZFS-写回原系统盘" class="headerlink" title="8 - 将 ZFS 写回原系统盘"></a>8 - 将 ZFS 写回原系统盘</h3><p><strong>方法一</strong></p><p>如果有 LiveCD，直接进 LiveCD 执行：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sh"><span class="hljs-built_in">dd</span> <span class="hljs-keyword">if</span>=/dev/vdb of=/dev/vda status=progress<br></code></pre></td></tr></table></figure><p><strong>方法二</strong></p><p>如果没有 LiveCD，则将根目录系统挂载为只读，然后再复制：</p><figure class="highlight sh"><table><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><code class="hljs sh">mount -o remount,ro / <span class="hljs-comment"># soft remount ro</span><br><span class="hljs-built_in">echo</span> u &gt; /proc/sysrq-trigger <span class="hljs-comment"># force remount ro, not work in btrfs</span><br><span class="hljs-built_in">dd</span> <span class="hljs-keyword">if</span>=/dev/vdb of=/dev/vda status=progress<br></code></pre></td></tr></table></figure><h3 id="9-启动新的系统"><a href="#9-启动新的系统" class="headerlink" title="9 - 启动新的系统"></a>9 - 启动新的系统</h3><p>卸载原有硬盘，重启即可，最终效果如下  </p><p><img src="https://lfs.libmbr.com/assets/2024/05/18/80753f54-2a33-4adf-b11b-c4ef865757b0.webp" alt="ZFS installed"></p><h2 id="可能出现的问题"><a href="#可能出现的问题" class="headerlink" title="可能出现的问题"></a>可能出现的问题</h2><h3 id="A-initramfs-无法加载-ZFS-驱动"><a href="#A-initramfs-无法加载-ZFS-驱动" class="headerlink" title="A - initramfs 无法加载 ZFS 驱动"></a>A - initramfs 无法加载 ZFS 驱动</h3><ul><li>症状：出现 <code>Failed to load the ZFS Module.</code> 提示</li><li>原因：未正确对模块进行签名，UEFI 安全启动策略不允许载入</li></ul><h3 id="B-initramfs-未找到-zpool"><a href="#B-initramfs-未找到-zpool" class="headerlink" title="B - initramfs 未找到 zpool"></a>B - initramfs 未找到 zpool</h3><ul><li>症状：开机时卡在 <code>Begin: Running /scripts/local-block … done</code> 很久</li><li>症状：出现 <code>ZFS Boot failing in initramfs : Alert! ZFS=rpool/ROOT/proxmox does not exists</code> 类似提示</li><li>原因：initramfs 中没有 zfs 工具，或 zpool 无法被安全导入，请确认第 5 步的 <code>zfs-initramfs</code> 是否正确安装、第 7 步是否成功导出</li><li>解决方案：尝试运行 <code>zpool import -f bpool rpool &amp;&amp; exit</code>，如果出现 <code>command not found</code>，说明 <code>zfs-initramfs</code> 未正确安装，请重新执行全部步骤</li></ul><h3 id="C-ZFS-根目录无法卸载"><a href="#C-ZFS-根目录无法卸载" class="headerlink" title="C - ZFS 根目录无法卸载"></a>C - ZFS 根目录无法卸载</h3><ul><li>症状：完成第 7 步时出现 <code>cannot unmount &#39;/mnt&#39;: pool or dataset is busy</code></li><li>原因：第 3 步完成后，ZFS 所在的磁盘路径发生变化，或者有其他程序占用</li><li>解决方法：如果更改了磁盘路径，需要先修改回来，然后检查是否有程序占用，如果有，请关闭，完成后重新尝试第 7 步，若仍然失败，请重启系统</li></ul><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><a href="https://pve.proxmox.com/wiki/Install_Proxmox_VE_on_Debian_12_Bookworm">Install Proxmox VE on Debian 12 Bookworm (pve.proxmox.com)</a></li><li><a href="https://github.com/linux-surface/linux-surface/issues/942">Please, I need Help. Reboot and Stuck on “initramfs” command line (Failed to load the ZFS Module) . (github.com)</a></li><li><a href="https://wiki.archlinux.org/title/Install_Arch_Linux_on_ZFS#Installation">Install Arch Linux on ZFS (wiki.archlinux.org)</a></li><li><a href="https://superuser.com/questions/307541/copy-entire-file-system-hierarchy-from-one-drive-to-another">Copy entire file system hierarchy from one drive to another (superuser.com)</a></li><li><a href="https://lala.im/8318.html">Hetzner独服安装Debian11并将ZFS作为根文件系统 (lala.im)</a></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Linux 更换根目录的 FS 为 ZFS 是可行的，写一篇教程记录下大致步骤和可能出现的问题  &lt;/p&gt;</summary>
    
    
    
    <category term="教程" scheme="https://www.libmbr.com/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Linux" scheme="https://www.libmbr.com/tags/Linux/"/>
    
    <category term="ZFS" scheme="https://www.libmbr.com/tags/ZFS/"/>
    
  </entry>
  
</feed>
