<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>树 - 洞</title>
  
  <subtitle>小束的个人 Blog</subtitle>
  <link href="https://blog.insmtr.com/atom.xml" rel="self"/>
  
  <link href="https://blog.insmtr.com/"/>
  <updated>2026-05-20T00:00:00.000Z</updated>
  <id>https://blog.insmtr.com/</id>
  
  <author>
    <name>insmtr</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>SMTP2GO 拯救你的 25 端口限制</title>
    <link href="https://blog.insmtr.com/2026/05/20/2026.5.20%20SMTP2GO/"/>
    <id>https://blog.insmtr.com/2026/05/20/2026.5.20%20SMTP2GO/</id>
    <published>2026-05-20T00:00:00.000Z</published>
    <updated>2026-05-20T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>之前我有和大家分享过如何<a href="/2024/12/18/2024.12.18%20Mail/">搭建自定义域名邮箱</a>，现在这台搬瓦工的服务器我已经出掉了，所以要把邮箱服务器迁移到哪里就成了一个困扰我的问题。当然，如果你也想搭建邮件服务器的话可以去看一下那篇文章，本文所讲的内容是建立在那篇文章的基础上的。</p><h2 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h2><p>很多 IDC 的机器都是不允许用户向其它服务器的 25 端口建立连接的，这是为了保护 IP 段的信誉，毕竟如果 IDC 的客户多的话 IP 滥用很严重，而那几个邮箱黑名单的解封价格又贵得离谱，很多时候 IDC 并不愿意支付这笔额外开支。而像 DMIT 就更狠了，直接封禁 25 端口的出站，也就是本机的 25 端口无法向外发送数据，但是其它机器向它的 25 端口发送是可以收到的。也就是说在 DMIT 的机器上我连收件也做不到——因为 25 端口只接收数据还不够，回程的包也是从 25 出的，直接被拦截了。但是这也只是一个个例，大部分的 IDC 都是只封目标端口为 25 的连接的。</p><p>我肯定不会为了一个邮件服务器去单独买个不封 25 的 VPS，结果我在查询资料的时候发现了 SMTP Relay 这种东西。而 SMTP2GO 是一个可以免费提供 SMTP Relay 服务的商家，虽然免费账户每天只能发 200 封邮件，每月只能发 1000 封邮件，但对于我这种个人用户来说已经足够了。</p><h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><p>先打开 <a href="https://www.smtp2go.com/">SMTP2GO 的官网</a>，注册一个账户，然后在 Dashboard 里它会提示你按 4 步走。</p><p>第一步，「Enter the domain you’d like to add」，输入你想要添加的域名，就是你邮箱的「@」后面的部分，比如我的就是「insmtr.cn」。</p><p>第二步，「Add a Verified Sender」，这一步它会让你添加 3 条 TXT 记录到你的域名。如果你用的是一些主流的 DNS 服务商（比如 Cloudflare），它会提供一键添加 TXT 记录的功能，直接点一下按钮就自动添加了。如果你的 DNS 服务商不支持一键添加，你也可以手动添加这些 TXT 记录。完成之后点击「Verify」验证成功即可。</p><p>完成之后，在 DNS 设置中将原来的 <code>v=spf1 mx ~all</code> 这条根 TXT 记录改成 <code>v=spf1 -all</code>。原来的 <code>v=spf1 mx ~all</code> 表示只有你的域名的 MX 记录所示的域名可以代你发送邮件，而修改之后的 <code>v=spf1 -all</code> 表示允许其它 IP 代表你的域名发送邮件，搭配刚才 SMTP2GO 让我们添加的 <code>em</code> 开头的 TXT 记录，表示只有 SMTP2GO 的服务器可以代表你的域名发送邮件。<code>em</code> 开头的那个域名就是 SMTP2GO 发件时候用的 Return-Path 里显示的域名，邮件服务器会检查这个域名的 SPF 记录来判断发件服务器的 IP 地址是否有权限代表这个域名发送邮件。</p><p>第三步，「Get an SMTP username or API key」，这一步就是邮件服务器连接 SMTP2GO 的凭据了。SMTP2GO 提供了两种接入方式，一种是 SMTP User，可以把邮件用 SMTP 协议转发给上游，上游再代为发送；另一种是 HTTP API，可以直接通过 HTTP API 调用 SMTP2GO 的服务。而我用的 maddy 服务器只支持 SMTP User 模式，所以我们在左侧的 Sending 里面找到 SMTP Users，创建一个 SMTP User，记录下它的用户名和密码。</p><p>接下来我们去修改 maddy 的配置文件，如果你用的是其它邮件服务器，可以自行搜索教程，道理类似。</p><p>找到 <code>target.remote outbound_delivery</code> 这段，内容是这样的：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span>target.remote outbound_delivery &#123;</span></span><span class="line"><span>    limits &#123;</span></span><span class="line"><span>        # Up to 20 msgs/sec across max. 10 SMTP connections</span></span><span class="line"><span>        # for each recipient domain.</span></span><span class="line"><span>        destination rate 20 1s</span></span><span class="line"><span>        destination concurrency 10</span></span><span class="line"><span>    &#125;</span></span><span class="line"><span>    mx_auth &#123;</span></span><span class="line"><span>        dane</span></span><span class="line"><span>        mtasts &#123;</span></span><span class="line"><span>            cache fs</span></span><span class="line"><span>            fs_dir mtasts_cache/</span></span><span class="line"><span>        &#125;</span></span><span class="line"><span>        local_policy &#123;</span></span><span class="line"><span>            min_tls_level encrypted</span></span><span class="line"><span>            min_mx_level none</span></span><span class="line"><span>        &#125;</span></span><span class="line"><span>    &#125;</span></span><span class="line"><span>&#125;</span></span></code></pre><p>给它整段注释掉，然后在下面添加新的配置：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span>target.smtp smtp2go_relay &#123;</span></span><span class="line"><span>    targets tcp://mail.smtp2go.com:587</span></span><span class="line"><span>    starttls yes</span></span><span class="line"><span>    auth plain "你刚刚创建的 SMTP User 用户名" "你刚刚创建的 SMTP User 密码"</span></span><span class="line"><span>&#125;</span></span></code></pre><p>然后下面的 <code>target.queue remote_queue</code> 里把 <code>target &amp;outbound_delivery</code> 改成 <code>target &amp;smtp2go_relay</code> 就行了。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span>target.queue remote_queue &#123;</span></span><span class="line"><span>    # target &#x26;outbound_delivery</span></span><span class="line"><span>    target &#x26;smtp2go_relay</span></span><span class="line"><span></span></span><span class="line"><span>    autogenerated_msg_domain $(primary_domain)</span></span><span class="line"><span>    bounce &#123;</span></span><span class="line"><span>        destination postmaster $(local_domains) &#123;</span></span><span class="line"><span>            deliver_to &#x26;local_routing</span></span><span class="line"><span>        &#125;</span></span><span class="line"><span>        default_destination &#123;</span></span><span class="line"><span>            reject 550 5.0.0 "Refusing to send DSNs to non-local addresses"</span></span><span class="line"><span>        &#125;</span></span><span class="line"><span>    &#125;</span></span><span class="line"><span>&#125;</span></span></code></pre><p>最后改一下 DKIM 签名，找到 <code>submission</code> 相关的这段：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span>modify &#123;</span></span><span class="line"><span>    dkim $(primary_domain) $(local_domains) default</span></span><span class="line"><span>&#125;</span></span></code></pre><p>给它注释掉，注意就只注释这一小段。注释之后，DKIM 签名就由 SMTP2GO 接管，确保你的域名信誉不受影响。</p><p>第四步，重启邮件服务器，大功告成！现在你就可以通过 SMTP2GO 的服务器来发送邮件了，即使你的服务器被封了 25 目的端口也没关系了，理论上随便找台 VPS 大概率都没问题。</p><h2 id="惊喜"><a href="#惊喜" class="headerlink" title="惊喜"></a>惊喜</h2><p>本来我以为这么配置之后只是可以绕过 25 端口发件了而已，结果在测试的时候发现，我向 Outlook 邮箱发送邮件时，Outlook 竟然没有把邮件扔进垃圾箱！众所周知，Outlook 自己有一套非常严格的垃圾邮件过滤机制，即使你的发件服务器的 IP 不在任何黑名单内，也是有极大概率直接进垃圾箱的，包括我之前那台搬瓦工。这说明 SMTP2GO 的服务器的 IP 地址的信誉非常好，这真是一个意外的惊喜！</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>总之，SMTP2GO 是一个非常好用的 SMTP Relay 服务商，免费账户的限制对于个人用户来说已经足够了，而且可以绕过烦人的 25 端口限制。如果你也想搭建邮件服务器的话，不妨试试 SMTP2GO 吧！</p>]]></content>
    
    
    <summary type="html">SMTP2GO 是一个 SMTP Relay，可以为没有 25 端口入站的服务器提供邮件发送服务。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="邮箱" scheme="https://blog.insmtr.com/tags/%E9%82%AE%E7%AE%B1/"/>
    
  </entry>
  
  <entry>
    <title>Bilibili Linux 客户端 VAAPI 硬解折腾全记录</title>
    <link href="https://blog.insmtr.com/2026/05/18/2026.5.18%20Bilibili%20VAAPI/"/>
    <id>https://blog.insmtr.com/2026/05/18/2026.5.18%20Bilibili%20VAAPI/</id>
    <published>2026-05-18T00:00:00.000Z</published>
    <updated>2026-05-18T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>可能和大部分小伙伴的习惯不同，我平时比较喜欢使用 B 站的客户端看视频，不喜欢网页端。可是有个问题一直卡了我很久，那就是 B 站的 Linux 客户端 <a href="https://github.com/msojocs/bilibili-linux">bilibili-linux</a> 项目一直不支持 VAAPI 硬件加速，导致我在看高清视频的时候 CPU 占用率非常高，视频也掉帧严重。</p><p>搜索后发现，和我有类似抱怨的用户还不少。近些年，这个项目的 issue 里也有至少 5 个讨论了这个问题，但是基本都是无果而终。</p><h2 id="尝试"><a href="#尝试" class="headerlink" title="尝试"></a>尝试</h2><p>之前在安装  Arch Linux 的时候，我参考了<a href="https://alampy.com/2024/03/23/arch-luks2-installation-notes/">极地萤火的 Arch Linux 安装笔记</a>，笔记中提到，对于 Electron 应用，可以在启动参数中加入 <code>--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL</code> 来启用 VAAPI 硬件加速。这个参数对于 Edge 浏览器来说确实是有效的，实测在 <code>~/.config/microsoft-edge-stable-flags.conf</code> 中加上这个参数后在 Edge 中观看 B 站视频时可以正常调用 VAAPI 加速。于是我就尝试在 B 站客户端的启动参数中也加入这个参数，却无果。</p><p>顺带一提，B 站客户端的启动参数可以写在 <code>~/.config/bilibili-flags.conf</code> 中，也可以写在 <code>~/.config/bilibili/bilibili-flags.conf</code> 中，两者都可以被识别到。前者是 <code>bilibili</code> 启动脚本中解析并追加到 Electron 命令行里的，后者是 bilibili 启动后内部的 <code>electron-tool</code> 模块在 Electron 主进程启动后读取的，因此两者都生效。</p><h2 id="转机"><a href="#转机" class="headerlink" title="转机"></a>转机</h2><p>既然 Edge 浏览器都能正常调用 VAAPI，说明我这套系统环境里的 VA-API 驱动、Mesa&#x2F;libva 和硬件本身大概率是可用的，作为同样 Electron 出身的 B 站客户端也理应支持。</p><p>在翻阅 <a href="https://github.com/msojocs/bilibili-linux">bilibili-linux</a> 项目的 issue 时，我看到了一例成功案例。<a href="https://github.com/msojocs/bilibili-linux/issues/193">issue #193</a> 中，有用户提到，可以在启动参数中加入如下参数：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">--ignore-gpu-blocklist</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">--disable-gpu-driver-bug-workarounds</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">--enable-gpu-rasterization</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">--enable-zero-copy</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">--enable-native-gpu-memory-buffers</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">--enable-features</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">VaapiVideoDecodeLinuxGL,VaapiVideoEncoder,PlatformHEVCDecoderSupport,CanvasOopRasterization</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">--disable-features</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">UseChromeOSDirectVideoDecoder</span></span></code></pre><p>可是我实测后发现，加上这些参数后我的 B 站客户端播放视频时直接花屏了！无论是我点开视频播放，还是鼠标在视频封面悬停预览，都会出现横向的条纹状的花屏，完全无法正常观看视频。但是打开 <code>intel_gpu_top</code> 一看，发现 Video 视频解码单元确实被调用了，说明这套参数确实让 B 站调用了 VAAPI，所以问题更可能出在显示 &#x2F; 合成路径上。</p><p>思考片刻后，我意识到，这很可能是 Electron 的版本问题导致的。B 站客户端目前使用的 Electron 版本是 28，而主流的 Electron 应用再低也都是三十几了。<a href="https://github.com/msojocs/bilibili-linux">bilibili-linux</a> 的作者为了确保兼容性，也使用了 28 版本。那换上更高版本的 Electron 会不会解决这个问题呢？</p><p>我果断创建了一个新的 wrapper，将启动脚本里调用的 Electron 改成了 37，而启动参数里我只写了 <code>--enable-features=AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL</code>，和 Edge 一样的参数。结果一测试，视频可以正常播放了！<code>intel_gpu_top</code> 中的 Video 视频解码单元也确实被调用了，CPU 占用率也从之前的 90% 降到了 30% 左右，视频也不再掉帧了！</p><p>后来又测试了多个中间版本的 Electron，发现从 36 开始就不再花屏了。</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>后来，我针对这一系列现象查阅了资料，也询问了 AI，得到了一些答案：</p><p><strong>为什么最初的时候，同样的参数在 Edge 上有效，在 B 站客户端上却无效？</strong> 我一开始照着新版 Edge&#x2F;Chromium 的写法，在 Electron 28&#x2F;Chromium 120 上使用 AcceleratedVideoDecodeLinuxZeroCopyGL,AcceleratedVideoDecodeLinuxGL，但 Chromium 120 当时的 Linux VAAPI GL feature 还叫 VaapiVideoDecodeLinuxGL。因此把新版 flag 直接塞给 Electron 28，没法启用旧版的 VAAPI GL 解码路径。</p><p><strong>为什么我加上了那些参数后虽然花屏了，但是却能成功调用 VAAPI？</strong> <a href="https://github.com/msojocs/bilibili-linux/issues/193">issue #193</a> 中这组里包含 <code>--ignore-gpu-blocklist</code>、<code>--disable-gpu-driver-bug-workarounds</code>、<code>--enable-zero-copy</code> 等比较激进的开关，可能绕过了 Chromium 对 GPU &#x2F; 驱动组合的一些保守判断。同时，它使用了 Chromium 120 能识别的旧 feature 名 VaapiVideoDecodeLinuxGL。因此，它能触发硬解路径。因此这套参数没错，只是我的核显型号太新了，被 Chromium 按保守路线降级了。</p><p><strong>为什么加上了那些参数后会花屏？</strong> 这个花屏说明 VAAPI 解码路径被触发后，后续的视频帧导入、纹理上传、DMABUF modifier、GL 合成或显示后端链路里仍然存在兼容性问题。它不一定是「解码器不能解码」，更像是「解码后的图像没有被正确显示」。Chromium 131 把 <code>VaapiVideoDecodeLinuxGL</code> 统一改名为 <code>AcceleratedVideoDecodeLinuxGL</code>，旧 flag 失效，可是用了新 flag 后这个 bug 依旧存在。一直到 Chromium 136 之后画面才变得正常，所以我这套硬件升级到 Electron 36 就不会有这个问题了。</p><p><strong>为什么换到 Electron 36 之后，两个简单的 flag 就够了？</strong> Electron 36 对应 Chromium 136，这个版本距 Chromium 120 跨越了整整 16 个版本。Linux VAAPI、ANGLE&#x2F;GL、DMABUF、Wayland&#x2F;EGL 以及 Intel 新平台相关代码都有持续变化。<code>AcceleratedVideoDecodeLinuxGL</code> 在新版 Chromium 里走的渲染路径已经能正确处理 MTL 的纹理格式。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>总的来说，这次折腾虽然有点曲折，但最终还是成功了。现在我终于可以在 B 站客户端上愉快地看高清视频了！希望这个经验也能帮助到其他有同样问题的小伙伴们。</p>]]></content>
    
    
    <summary type="html">Bilibili Linux 客户端也能调用 VAAPI 做视频解码加速了！</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="Bilibili" scheme="https://blog.insmtr.com/tags/Bilibili/"/>
    
    <category term="Linux" scheme="https://blog.insmtr.com/tags/Linux/"/>
    
    <category term="VAAPI" scheme="https://blog.insmtr.com/tags/VAAPI/"/>
    
  </entry>
  
  <entry>
    <title>震惊！insmtr 的 MySQL 数据库居然被勒索软件攻击了！</title>
    <link href="https://blog.insmtr.com/2026/04/08/2026.4.8%20MySQL%20ransomware/"/>
    <id>https://blog.insmtr.com/2026/04/08/2026.4.8%20MySQL%20ransomware/</id>
    <published>2026-04-08T00:00:00.000Z</published>
    <updated>2026-04-08T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>众所众知，insmtr 是一名资深的 Linux 用户，平日里炫技无数。而前不久，insmtr 居然被爆出自己的 MySQL 数据库被勒索软件攻击了的这种丑闻，真是让人震惊不已！这件事在技术圈引起了轩然大波，大家纷纷表示难以置信，insmtr 竟然也有今天！</p><h2 id="经过"><a href="#经过" class="headerlink" title="经过"></a>经过</h2><p>这学期有一周软件设计课设，需要写一个网页版的学生选课系统。我直接在自己的服务器上跑了一个 MySQL 的容器，为了方便，容器直接暴露了 3389 端口，用户密码直接设置成了 <code>root</code>。验收完之后的某天，我想欣赏一下我的网页，结果发现后端起不来了，一看报错是数据库连不上了。我打开 DataGrip 一看，好家伙，被勒索了。</p><p><img src="/images/2026.4.8%20MysQL%20ransomware/1.webp"></p><p>当然里面没啥重要数据，毕竟只是个课设，但这件事还是让我感到非常无语，2026 年了，居然还有人会用这种低级的手段来攻击数据库，太过时了。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>总之，不论什么时候，都不要随便使用弱密码，万一在验收的时候出现这种情况，那就比较麻烦了。</p>]]></content>
    
    
    <summary type="html">哈哈！insmtr 居然也有今天！！</summary>
    
    
    
    <category term="随笔" scheme="https://blog.insmtr.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="运维" scheme="https://blog.insmtr.com/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>再探阿里云 DNS 对 CloudFront 的解析情况</title>
    <link href="https://blog.insmtr.com/2026/04/02/2026.3.23%20AliDNS%20IEEE/"/>
    <id>https://blog.insmtr.com/2026/04/02/2026.3.23%20AliDNS%20IEEE/</id>
    <published>2026-04-02T00:00:00.000Z</published>
    <updated>2026-04-02T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>阿里云公共 DNS，主要 IP 为 223.5.5.5，属于递归解析服务。终端设备可以自行配置来替代运营商 DNS 做域名查询，支持 UDP&#x2F;TCP&#x2F;DoT&#x2F;DoH&#x2F;DoQ 等多种查询方式。最重要的一点，223.5.5.5 支持 ECS 模式，可以携带你的客户端子网信息一起做递归解析，使得解析出来的结果和你的实际位置更匹配，延迟更低。</p><h2 id="异常"><a href="#异常" class="headerlink" title="异常"></a>异常</h2><p>一年前，我发现无法正常打开 <code>ieeexplore.ieee.org</code> 这个网站。分析过后发现，我当时用的阿里云的 DNS 服务器 223.5.5.5 居然把这个域名解析到了 221.228.32.13，也就是江苏省反诈中心的 IP。阿里云作为国内权威的 DNS 服务器，竟然把一个学术界常用的查论文网站 IEEE 解析到江苏省反诈中心，属实是不应该。</p><h2 id="细究"><a href="#细究" class="headerlink" title="细究"></a>细究</h2><p>切换到我的家宽的 DNS 服务器后，发现 <code>ieeexplore.ieee.org</code> 的解析结果就是正常的了，而我人就在江苏，说明这个网站绝对不是应该列入江苏省反诈中心黑名单的，那问题只能出现在阿里云了。</p><p>经初步测试，<code>ieeexplore.ieee.org</code> 托管在亚马逊云的 CloudFront 上，域名本身只有一个 CNAME 记录，指向 <code>d34ow7epij5zhk.cloudfront.net</code>，并没有 A 记录。</p><p>随后，我在 itdog 上分别测试了江苏地区使用 223.5.5.5 &#x2F; 119.29.29.29 &#x2F; 运营商 DNS、直接查询 <code>ieeexplore.ieee.org</code> 域名 &#x2F; 查询 <code>d34ow7epij5zhk.cloudfront.net</code> 域名，这六种组合的 A 记录解析情况是这样的：</p><br><table><thead><tr><th>DNS</th><th>域名</th><th>解析结果</th></tr></thead><tbody><tr><td>223.5.5.5</td><td><code>ieeexplore.ieee.org</code></td><td>CNAME <code>d34ow7epij5zhk.cloudfront.net</code></td></tr><tr><td>运营商 DNS</td><td><code>ieeexplore.ieee.org</code></td><td>CNAME <code>d34ow7epij5zhk.cloudfront.net</code></td></tr><tr><td>119.29.29.29</td><td><code>ieeexplore.ieee.org</code></td><td>CNAME <code>d34ow7epij5zhk.cloudfront.net</code><br>A (CloudFront 的 IP 地址)</td></tr><tr><td>223.5.5.5</td><td><code>d34ow7epij5zhk.cloudfront.net</code></td><td>A (江苏反诈中心)</td></tr><tr><td>运营商 DNS</td><td><code>d34ow7epij5zhk.cloudfront.net</code></td><td>A (江苏反诈中心)</td></tr><tr><td>119.29.29.29</td><td><code>d34ow7epij5zhk.cloudfront.net</code></td><td>A (CloudFront 的 IP 地址)</td></tr></tbody></table><br><p>也就是说，119.29.29.29 解析 <code>ieeexplore.ieee.org</code> 时，不仅会返回 CNAME 记录，同时会返回正确的 A 记录；而阿里云 DNS 服务器解析 <code>ieeexplore.ieee.org</code> 时，只返回了 CNAME 记录，但没有返回任何 A 记录。随后浏览器会尝试解析 <code>d34ow7epij5zhk.cloudfront.net</code>，阿里云 DNS 服务器解析这个域名时，直接返回了和上游运营商 DNS 一样的错误的 A 记录。119.29.29.29 没有 ECS 功能，所以它不会受到江苏上游运营商 DNS 的影响。</p><h2 id="扯皮"><a href="#扯皮" class="headerlink" title="扯皮"></a>扯皮</h2><p>当时，我就此现象向阿里云发起工单。多轮扯皮后，最终阿里云工作人员告知我，「运营商反馈该网站被公安部门研判为涉嫌诈骗网站，执行网络侧拦截。建议联系当地公安部门反诈中心申请解封。」也就是说，这是属于上游问题，除非我自己和公安部门沟通，否则阿里云是不会也无法处理的。</p><p>确实挺搞笑的，江苏上游 DNS 因为配置的失误把一个学术界常用的查论文网站给拦截到了江苏反诈中心，而江苏家宽的 DNS 却又可以正常解析访问，应该是家宽 DNS 没有完全走那个运营商的上游 DNS。阿里云 DNS 虽然支持 ECS，但是其细粒度却又只以省为单位，且无条件信任上游结果。所以江苏的用户在默认情况下可以正常访问 IEEE，而使用了阿里云 DNS 后反而不能了。</p><h2 id="再探"><a href="#再探" class="headerlink" title="再探"></a>再探</h2><p>一年后的今天，我再次测试了这个问题，发现阿里云 DNS 服务器已经可以正常解析 <code>ieeexplore.ieee.org</code> 了，解析结果同时返回 CNAME 记录和正确的 A 记录，直接解析 <code>d34ow7epij5zhk.cloudfront.net</code> 也可以正常返回 CloudFront 的 IP 地址了。又测试了江苏运营商 DNS 的解析结果，发现已经不再返回江苏反诈中心的 IP 地址了，而是同时返回 CNAME 记录和正确的 A 记录了。看来这个问题已经被上游运营商 DNS 解决了，阿里云 DNS 服务器也自然就恢复正常了。</p>]]></content>
    
    
    <summary type="html">终于可以用 223.5.5.5 解析访问 IEEE 了。</summary>
    
    
    
    <category term="随笔" scheme="https://blog.insmtr.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="运维" scheme="https://blog.insmtr.com/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>为单板机配置超简单 VNC 环境 改良版</title>
    <link href="https://blog.insmtr.com/2026/03/12/2026.3.12%20SBC%20VNC%202/"/>
    <id>https://blog.insmtr.com/2026/03/12/2026.3.12%20SBC%20VNC%202/</id>
    <published>2026-03-12T00:00:00.000Z</published>
    <updated>2026-03-12T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>好久之前，我曾经分享过如何<a href="/2025/05/13/2025.5.13%20SBC%20VNC/">为单板机配置超简单 VNC 环境</a>。我们在那个方案所使用的 <code>x11vnc</code> 上游长期缺乏更新，使用的参数也过于激进，这直接导致了我们在实际使用中占用单板机 CPU 资源过多，画面变化多的时候占用大量带宽。整体体感十分卡顿，体验非常一般。</p><p>所以，我们可以使用功能类似的，但是更轻量，编码效率也更高效的 <code>x0vncserver</code> 来代替 <code>x11vnc</code> 。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>我们依旧选用 <code>Xvfb</code> 作虚拟桌面，选用 <code>x0vncserver</code> 作 VNC 服务器，<code>openbox</code> 作窗口管理器的解决方案。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> xvfb</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> tigervnc-scraping-server</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> openbox</span></span></code></pre><p>然后我们写一个启动脚本，命名为 <code>start_vnc.sh</code> ，内容如下：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">Xvfb</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> :99</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -screen</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 0</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 1280x800x24</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">x0vncserver</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -display</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> :99</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -SecurityTypes=None</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">DISPLAY</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">:99</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> openbox</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span></code></pre><p>脚本中的 <code>-screen 0 1280x800x24</code> 可以根据需要修改分辨率和颜色深度， <code>:99</code> 是显示器的编号，如果你本地已经有一个显示器在使用 <code>:99</code> ，那么你可以改成 <code>:100</code> 或者其他的。</p><blockquote><p>如果你希望连接时使用密码保护，可以先手动生成密码文件，再传给 <code>x0vncserver</code> 使用：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">vncpasswd</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># 然后输入密码，生成的密码文件默认保存在 ~/.vnc/passwd</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># 接着修改脚本中的 x0vncserver 启动命令：</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">x0vncserver</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -display</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> :99</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -PasswordFile</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.vnc/passwd</span></span></code></pre></blockquote><p>然后我们给脚本添加执行权限：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">chmod</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> +x</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> start_vnc.sh</span></span></code></pre><p>接下来就是设置开机自启动了。我选择使用 <code>crontab</code> 来管理。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">crontab</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -e</span></span></code></pre><p>在文件末尾添加以下内容：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">@reboot</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /你创建的脚本所在的目录/start_vnc.sh</span></span></code></pre><p>保存并退出。</p><p>最后再指定一下软件的显示器。我们在 <code>~/.bashrc</code> 中添加以下内容：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> DISPLAY</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">:99</span></span></code></pre><p>然后重启单板机，没有问题的话，VNC 服务就已经启动起来了。</p><h2 id="连接"><a href="#连接" class="headerlink" title="连接"></a>连接</h2><p>在本地使用 VNC 客户端连接到单板机的 IP 地址，端口号默认是 <code>5900</code> 。</p><p>如果你的单板机上运行了多个 VNC ，不知道对应的端口号，可以先在单板机上使用 <code>ss -tuln | grep 59</code> 命令查看正在监听的端口，找到 <code>59xx</code> 的行，一个一个尝试就行。或者我们可以在 <code>start_vnc.sh</code> 脚本中直接指定端口号，比如 <code>x0vncserver -display :99 -SecurityTypes=None -rfbport 5901</code> ，这样这个 VNC 的端口就固定在 <code>5901</code> 了。</p><p>尝试在 ssh 中启动一个需要图形界面的程序，比如 <code>xeyes</code> ，可以看到，VNC 客户端中已经可以正常显示了。</p><p>如果你使用 TigerVNC 作为 VNC 客户端，连接后建议选择 <code>Tight</code> 编码，这样可以获得更好的性能。如果你使用其它的 VNC 客户端，比如说 RealVNC Viewer，建议选择 <code>ZRLE</code> 编码，相对来说可以做到压缩率、兼容性和性能的平衡。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>这个方案相比于上一版性能更好了，体验也更佳。</p>]]></content>
    
    
    <summary type="html">单板机资源有限，能省一点资源就省一点。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="电赛" scheme="https://blog.insmtr.com/tags/%E7%94%B5%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 22.04 Rust OpenCV 注意事项</title>
    <link href="https://blog.insmtr.com/2025/05/13/2025.5.13%20OpenCV-Rust/"/>
    <id>https://blog.insmtr.com/2025/05/13/2025.5.13%20OpenCV-Rust/</id>
    <published>2025-05-13T00:00:00.000Z</published>
    <updated>2025-05-13T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>最近在使用 Rust 语言开发的时候需要用到 OpenCV 库，结果配置的时候遇到了一些问题，便记录一下。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>Rust 的 OpenCV 库依赖了 Clang 作为编译器，所以使用前需要先安装 Clang ：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libopencv-dev</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> clang</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libclang-dev</span></span></code></pre><p>然后在项目的 <code>Cargo.toml</code> 中添加依赖：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">[</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657">dependencies</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">]</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">opencv = &#123; version = </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"*"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">, features = [</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"clang-runtime"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">] &#125;</span></span></code></pre><h2 id="处理链接库问题"><a href="#处理链接库问题" class="headerlink" title="处理链接库问题"></a>处理链接库问题</h2><p>如果就这样的话，我们在编译的时候会得到这样的报错：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">fatal</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> error:</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 'memory'</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> file</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> not</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> found</span></span></code></pre><p>这是因为 Clang 在编译的时候没有把 C++ 的头文件路径添加到编译器的搜索路径中。我们可以通过设置环境变量 <code>CPLUS_INCLUDE_PATH</code> 来解决这个问题。在 <code>~/.bashrc</code> 中添加以下内容：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> CPLUS_INCLUDE_PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">/usr/include/c++/11:/usr/include/x86_64-linux-gnu/c++/11</span></span></code></pre><p>当然，在 <code>aarch64</code> 的系统上就需要添加：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> CPLUS_INCLUDE_PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">/usr/include/c++/11:/usr/include/aarch64-linux-gnu/c++/11</span></span></code></pre><p>这样就可以正常编译了。</p><p>但是 VSCode 中的 Rust LSP 依然会报错，提示找不到头文件。我们可以通过在 <code>settings.json</code> 中添加以下内容来解决这个问题：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "rust-analyzer.server.extraEnv"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "CPLUS_INCLUDE_PATH"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"$&#123;env:CPLUS_INCLUDE_PATH&#125;:/usr/include/c++/11:/usr/include/$&#123;arch&#125;/c++/11"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;</span></span></code></pre><p>然后就完全正常了。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>以上就是在 Ubuntu 22.04 上使用 Rust 调用 OpenCV 库时需要注意的一些细节。希望对你有所帮助。</p>]]></content>
    
    
    <summary type="html">在 Ubuntu 22.04 上使用 Rust 调用 OpenCV 库时需要注意的一些细节。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="电赛" scheme="https://blog.insmtr.com/tags/%E7%94%B5%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>Redmi AX6000 hanwckf U-Boot 安装 OpenWrt 24</title>
    <link href="https://blog.insmtr.com/2025/05/13/2025.5.13%20OpenWrt/"/>
    <id>https://blog.insmtr.com/2025/05/13/2025.5.13%20OpenWrt/</id>
    <published>2025-05-13T00:00:00.000Z</published>
    <updated>2025-05-14T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>OpenWrt 24 版本发布之后，Redmi AX6000 主线版本的 U-Boot 实现已经合并入上游了，因此维护者移除了 hanwckf 版 U-Boot 的 ImmortalWrt 的包的构建。详情可见<a href="https://github.com/immortalwrt/immortalwrt/commit/9334bf3ec1e21d0bc1b1f8dc480415aea589ebc7">这条 Commit</a> 。</p><p>从 hanwckf 版 U-Boot 切换到 OpenWrt U-Boot 的大致思路是先把路由器刷回原版布局，然后再按照官网步骤刷入 OpenWrt U-Boot 。这个过程需要使用到 <code>tftp</code> 和 <code>uboot</code> 的命令行操作，比较复杂，而且有一定变砖风险。</p><p>hanwckf 版 U-Boot 号称「不死 U-Boot」，采用网页上传固件烧录的方式，烧录前还会有兼容性检测，极易上手，而且不容易变砖，相当用户友好。</p><p>然而维护者也仅仅只是移除了 Redmi AX6000 的配置文件，项目本身没有太大变更，所以我们可以手动编译一个可在 hanwckf 版 U-Boot 中引导的 OpenWrt 24 。</p><h2 id="准备编译环境"><a href="#准备编译环境" class="headerlink" title="准备编译环境"></a>准备编译环境</h2><p>OpenWrt 官方维护了一套编译环境，并打成了 Docker 镜像，我们直接使用即可：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">docker</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> run</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -id</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --name</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> immortalwrt</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">    -e</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> BUILDWORKER_NAME=immortalwrt</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">    -e</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> BUILDWORKER_PASSWORD=</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">123456</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">    -v</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ./immortalwrt:/immortalwrt</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">    ghcr.io/openwrt/buildbot/buildworker-v3.8.0:v9</span></span></code></pre><p>这里我们使用 <code>-v</code> 参数将宿主机的 <code>./immortalwrt</code> 目录挂载到容器的 <code>/immortalwrt</code> 目录下，方便我们在宿主机上查看编译产物。</p><p>进入容器：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">docker</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> exec</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -it</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> immortalwrt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> bash</span></span></code></pre><p>安装基本依赖：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># 在新版 buildbot 中，需要手动添加 backports 源，不然直接运行脚本会报错。</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># 如果你没有开科学上网的话就不用加了，脚本内部检测到中国大陆地区会自动换源，换源的时候会加上。</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">echo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "deb http://deb.debian.org/debian bullseye-backports main"</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> >></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /etc/apt/sources.list</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">bash</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> &#x3C;(</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657">curl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -s</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://build-scripts.immortalwrt.org/init_build_environment.sh)</span></span></code></pre><p>该镜像中内置了一个叫 <code>buildbot</code> 的非特权用户。如果你的宿主机本身就是 <code>root</code> 用户，那就不存在文件夹以及构建产物权限问题，可以跳过这步。如果你宿主机登录的是非特权用户，需要使用此用户来编译。按 <code>Ctrl + D</code> 退出容器，再输入以下命令使用 <code>buildbot</code> 用户登录容器：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">docker</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> exec</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -it</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --user</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> buildbot</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> immortalwrt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> bash</span></span></code></pre><p>后面就是照着 ImmortalWrt 的 Github 上的 <code>README</code> 来编译了。</p><h2 id="编译-OpenWrt"><a href="#编译-OpenWrt" class="headerlink" title="编译 OpenWrt"></a>编译 OpenWrt</h2><p>在主目录中克隆项目：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /immortalwrt</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> clone</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://github.com/immortalwrt/immortalwrt</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> immortalwrt</span></span></code></pre><p>默认是 <code>master</code> 分支，我们根据需要切换到不同版本的分支或标签。比如我这里需要编译 <code>v24.10.1</code> 版本：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> checkout</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> v24.10.1</span></span></code></pre><p>恢复被删除的 Redmi AX6000 的配置文件：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> revert</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 9334bf3ec1e21d0bc1b1f8dc480415aea589ebc7</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -n</span></span></code></pre><p>更新软件包：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">./scripts/feeds</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -a</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">./scripts/feeds</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -a</span></span></code></pre><p>下载一个现成的构建配置：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wget</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://downloads.immortalwrt.org/snapshots/targets/mediatek/filogic/config.buildinfo</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -O</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> .config</span></span></code></pre><p>修改构建配置：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">make</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> menuconfig</span></span></code></pre><p>在 <code>Target Profile</code> 中选择 <code>(Xiaomi Redmi Router AX6000 (custom U-Boot layout))</code> ，在 <code>Subtarget</code> 中选择 <code>Redmi AX6000</code> 。</p><p>往下可以看到，这个构建配置中基础的包已经被选中。但是无线网卡相关的驱动没有被勾选，我们这里选中 <code>kmod-mt7915e</code> ，或者你页可以选择不编译它们，而是在安装完之后使用 <code>opkg</code> 命令安装，两者是等价的。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">Kernel</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> modules</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  ---</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">></span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">    Wireless</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> Drivers</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  ---</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">        &#123;</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">*</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125; kmod-mt7915e</span></span></code></pre><p>最后一步，编译：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">make</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -j$(</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657">nproc</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">)</span></span></code></pre><p>如果你没有切换到 <code>buildbot</code> 用户，而是使用 <code>root</code> 用户编译，那么上面的命令会编译出错，需要在编译前加上跳过 <code>root</code> 检查：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">FORCE_UNSAFE_CONFIGURE</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">1</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> make</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -j$(</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657">nproc</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">)</span></span></code></pre><p>几个小时之后，编译完成。这里我的电脑大约需要一个半小时。构建产物在 <code>bin/targets/mediatek/filogic</code> 目录下，<code>immortalwrt-mediatek-filogic-xiaomi_redmi-router-ax6000-squashfs-sysupgrade.bin</code> 就是固件。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>个人感觉，维护者不应该删除 hanwckf 版 U-Boot 的配置文件，毕竟这个 U-Boot 版本的兼容性和稳定性都比 OpenWrt U-Boot 要好很多。虽然我们可以手动编译，但是对于普通用户来说，还是有点复杂的。</p><h2 id="特别鸣谢"><a href="#特别鸣谢" class="headerlink" title="特别鸣谢"></a>特别鸣谢</h2><p><a href="https://alampy.com/">@alampy</a> 提供的思路。</p>]]></content>
    
    
    <summary type="html">Redmi AX6000 ，手动编译可在 hanwckf 版 U-Boot 中引导的 OpenWrt 24 。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="网络" scheme="https://blog.insmtr.com/tags/%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>为单板机配置超简单 VNC 环境</title>
    <link href="https://blog.insmtr.com/2025/05/13/2025.5.13%20SBC%20VNC/"/>
    <id>https://blog.insmtr.com/2025/05/13/2025.5.13%20SBC%20VNC/</id>
    <published>2025-05-13T00:00:00.000Z</published>
    <updated>2025-05-13T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>单板机资源有限，打电赛的时候为了能够让资源更多得，能省一点资源就省一点。我们在使用 VNC 的时候，发现 VNC 的桌面环境占用的资源实在是太大了，尤其是 LXDE 和 XFCE ，所以我们决定使用更轻量级的桌面环境。丐版，但能用。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>我选用的是 <code>Xvfb</code> 作虚拟桌面，<code>x11vnc</code> 作 VNC 服务器，<code>openbox</code> 作窗口管理器的解决方案。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> xvfb</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> x11vnc</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> openbox</span></span></code></pre><p>然后我们写一个启动脚本，命名为 <code>start_vnc.sh</code> ，内容如下：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">Xvfb</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> :0</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -screen</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 0</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 1280x800x24</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">x11vnc</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -display</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> :0</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -forever</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -noxdamage</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -repeat</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -shared</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -nopw</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -xkb</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">DISPLAY</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">:0</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> openbox</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span></code></pre><p>脚本中的 <code>-screen 0 1280x800x24</code> 可以根据需要修改分辨率和颜色深度， <code>:0</code> 是显示器的编号，如果你本地已经有一个显示器在使用 <code>:0</code> ，那么你可以改成 <code>:1</code> 或者其他的。</p><p>然后我们给脚本添加执行权限：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">chmod</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> +x</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> start_vnc.sh</span></span></code></pre><p>接下来就是设置开机自启动了。我选择使用 <code>crontab</code> 来管理。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">crontab</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -e</span></span></code></pre><p>在文件末尾添加以下内容：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">@reboot</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /你创建的脚本所在的目录/start_vnc.sh</span></span></code></pre><p>保存并退出。</p><p>最后再指定一下软件的显示器。我们在 <code>~/.bashrc</code> 中添加以下内容：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> DISPLAY</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">:0</span></span></code></pre><p>然后重启单板机，没有问题的话，VNC 服务就已经启动起来了。</p><h2 id="连接"><a href="#连接" class="headerlink" title="连接"></a>连接</h2><p>在本地使用 VNC 客户端连接到单板机的 IP 地址，端口号是 <code>5900</code> ，如果你使用的是 <code>:1</code> ，那么端口号就是 <code>5901</code> 。</p><p>尝试在 ssh 中启动一个需要图形界面的程序，比如 <code>xeyes</code> ，可以看到，VNC 客户端中已经可以正常显示了。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>这个方案确实很简陋，但是对于我们来说，已经足够了，经济又实惠。</p>]]></content>
    
    
    <summary type="html">单板机资源有限，能省一点资源就省一点。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="电赛" scheme="https://blog.insmtr.com/tags/%E7%94%B5%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>在 WSL 中使用 ISE</title>
    <link href="https://blog.insmtr.com/2025/05/12/2025.5.12%20ISE/"/>
    <id>https://blog.insmtr.com/2025/05/12/2025.5.12%20ISE/</id>
    <published>2025-05-12T00:00:00.000Z</published>
    <updated>2025-05-12T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>我们学校的电工电子实验使用的是一块十分老旧的 FPGA ，开发其所使用的软件 ISE 也已经彻底不支持 Windows 11 了。即使网上有一些教程可以成功将其安装在 Windows 11 上，但是使用起来还是会遇到很多 bug 。通常我们会使用 Windows 虚拟机来解决这个问题，但是虚拟机占用资源太多，太浪费磁盘空间了。考虑到 ISE 提供了 Linux 版本的包，于是我决定在 WSL 中使用 ISE 。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>首先我们需要安装 WSL ，已安装的可以跳过这一步。</p><p>按 <code>Win + R</code> ，输入 <code>wt</code> 打开终端，然后输入以下命令开启 WSL ：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wsl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --enable-wsl</span></span></code></pre><p>然后我们要下载 ISE 的 Linux 版本的安装包，<a href="https://www.xilinx.com/member/forms/download/xef.html?filename=Xilinx_ISE_DS_Lin_14.7_1015_1.tar">官方下载链接</a>。</p><p>接着我们要准备一份 ISE 的激活文件。在 Github 上可以找到一份激活文件 <a href="https://github.com/Andr3s0r/FPGA-Spartan-3A-ProyectosT/raw/0a762611284430da0d9f272773343ab48ca63b4f/xilinx_ise.lic">xilinx_ise.lic</a> ，将文件保存到本地。</p><p>最后我们要准备一份 HW_Server 用来远程烧录，<a href="https://www.xilinx.com/member/forms/download/xef-vivado.html?filename=Xilinx_HW_Server_Win_2019.2_1106_2127.tar.gz">官方下载链接</a>。如果你已经安装了 Vivado 的话，可以跳过这一步，直接使用 Vivado 里面的 hw_server 即可。</p><p>把上面三项文件下载到本地后，放在你想要安装 ISE 的目录下，我们将在这个文件夹下安装 ISE 。</p><p>文件清单：</p><ul><li>ISE 的 Linux 版本的安装包 <code>Xilinx_ISE_DS_Lin_14.7_1015_1.tar</code></li><li>ISE 的激活文件 <code>xilinx_ise.lic</code></li><li>HW_Server 的安装包 <code>Xilinx_HW_Server_Win_2019.2_1106_2127.tar.gz</code></li></ul><h2 id="开始安装"><a href="#开始安装" class="headerlink" title="开始安装"></a>开始安装</h2><p>首先解压 HW_Server ，直接右键使用 Windows 自带的「全部解压缩」功能即可。解压完成后，双击文件夹中的 <code>xsetup.exe</code> 进行安装，安装完成后，记住安装路径，我们后面会用到。</p><p>在刚刚存放那三个文件的文件夹中，右键空白处，点击「在终端中打开」打开终端，输入以下命令安装 ubuntu ：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">curl.exe </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">sL https://cloud</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">images.ubuntu.com/releases/focal/release/ubuntu</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">-20.04</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">server</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">cloudimg</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">amd64</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">root.tar.xz </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">-</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">o ubuntu.tar.xz</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">wsl </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">--</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">import ISE ISE ubuntu.tar.xz</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">del ubuntu.tar.xz</span></span></code></pre><p>安装完成后，就可以输入 <code>wsl -d ISE</code> 进入 ISE 的 WSL 环境了。</p><p>进入之后，我们先换源：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cat</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> &#x3C;&#x3C;</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">EOF</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> ></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /etc/apt/sources.list</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">EOF</span></span></code></pre><p>将文件移动到 WSL 内：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mv</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> Xilinx_ISE_DS_Lin_14.7_1015_1.tar</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mkdir</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.Xilinx</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mv</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> xilinx_ise.lic</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.Xilinx</span></span></code></pre><p>切到主目录：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span></span></code></pre><p>安装依赖：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">DEBIAN_FRONTEND</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">noninteractive</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libncurses5</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> gcc</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libx11-6</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libglib2.0-0</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libsm6</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libxi6</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libxrender1</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libxrandr2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libfreetype6</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libfontconfig1</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libxtst6</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> clean</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rm</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -rf</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /var/lib/apt/lists/</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">*</span></span></code></pre><p>解压安装 ISE 软件本体：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">tar</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> xvf</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> Xilinx</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">*</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">.tar</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rm</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> Xilinx</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">*</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">.tar</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">./Xilinx*/xsetup</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 一路下一步即可</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rm</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -rf</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> Xilinx</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">*</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> .xinstall</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">echo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ". /opt/Xilinx/14.7/ISE_DS/settings64.sh > /dev/null"</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> >></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> .bashrc</span></span></code></pre><p>安装完成之后，按 <code>Ctrl + D</code> 退出 WSL 。</p><p>由于前面的安装会产生额外磁盘占用，所以我们可以通过导出后重新导入来节省这部分空间。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wsl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --export</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE.tar</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wsl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --unregister</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wsl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --import</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE.tar</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">del</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE.tar</span></span></code></pre><h2 id="启动-ISE"><a href="#启动-ISE" class="headerlink" title="启动 ISE"></a>启动 ISE</h2><p>在桌面上右键「新建」-「快捷方式」，输入 <code>wsl -d ISE bash -ic &quot;ise&quot;</code> ，名称输入 <code>ISE</code> ，完成后双击快捷方式即可启动 ISE 。</p><h2 id="使用-HW-Server-烧录"><a href="#使用-HW-Server-烧录" class="headerlink" title="使用 HW_Server 烧录"></a>使用 HW_Server 烧录</h2><p>关于烧录的问题，由于 WSL2 不支持直接访问宿主机的 USB 设备，所以我们需要使用 HW_Server 来进行远程烧录。</p><p>最前面我们已经安装了 HW_Server ，现在我们需要启动它。在前面 HW_Server 的安装目录下，打开 <code>Xilinx\HWSRVR\2019.2\bin</code> 目录，双击 <code>hw_server.bat</code> 启动 HW_Server 。然后你应该会看到类似以下的提示：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">To</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> connect</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> to</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> this</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> hw_server</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> instance</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> use</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> url:</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> TCP:insmtr-PC:3121</span></span></code></pre><p>记住这个端口号 <code>3121</code> 。</p><p>在 ISE 中打开烧录界面，点击 <code>Boundary Scan</code> ，然后右键空白处选择 <code>Cable Setup...</code> ，Communication Mode 选择 <code>HW Server</code> ，Cable Location 中的 Host Name 填写： <code>TCP:宿主机IP:上面记住的端口号</code> 。</p><p>WSL 宿主机 IP 的获取方式请参考微软文档<a href="https://learn.microsoft.com/zh-cn/windows/wsl/networking">使用 WSL 访问网络应用程序</a>，如果开了镜像 Mirrored 模式网络，则可以使用 <code>127.0.0.1</code> 从 WSL 访问 Windows 宿主机。而在默认的 NAT 网络下，则应该通过命令查询：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">wsl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -d</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ISE</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ip</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> route</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> show</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> |</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> grep</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -i</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> default</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> |</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> awk</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> '&#123; print $3&#125;'</span></span></code></pre><p>比如这里我是 Mirrored 模式网络，我需要填写的就是 <code>TCP:127.0.0.1:3121</code> 。</p><p>后面就是正常的烧录流程了，不过多赘述。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>在 WSL 中使用 ISE 的体验还是不错的，虽然有些地方不太方便，但是总比在 Windows 虚拟机上使用要好很多。希望这篇文章能对你有所帮助。</p>]]></content>
    
    
    <summary type="html">在 Windows 中获得更好的 ISE 使用体验。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="教育" scheme="https://blog.insmtr.com/tags/%E6%95%99%E8%82%B2/"/>
    
  </entry>
  
  <entry>
    <title>Jetson AGX Orin CH340 驱动安装</title>
    <link href="https://blog.insmtr.com/2025/04/24/2025.4.24%20CH340/"/>
    <id>https://blog.insmtr.com/2025/04/24/2025.4.24%20CH340/</id>
    <published>2025-04-24T00:00:00.000Z</published>
    <updated>2025-04-24T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>最近拿到了一台 Jetson AGX Orin ，想在上面接一个蓝牙串口，USB-A 口，CH340 转串口的那种。接上后发现 <code>/dev</code> 下没有任何新增设备，然而 <code>lsusb</code> 下却能看到接入的设备。查看了一下 <code>/lib/modules/5.15.148-tegra/kernel/drivers/usb/serial</code> 目录，发现没有 <code>ch341.ko</code> 文件，也就是说，Jetson 镜像的内核中根本没有 CH340 的驱动，需要我们额外安装驱动。</p><h2 id="驱动安装"><a href="#驱动安装" class="headerlink" title="驱动安装"></a>驱动安装</h2><p>CH340 驱动本身即很简单，安装起来十分简单：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> update</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> make</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> gcc</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> clone</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://github.com/WCHSoftGroup/ch341ser_linux</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ch341ser_linux/driver</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">make</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> make</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 直接将驱动安装到内核驱动启动文件夹中</span></span></code></pre><h2 id="brltty-的小问题"><a href="#brltty-的小问题" class="headerlink" title="brltty 的小问题"></a>brltty 的小问题</h2><p>随后重启系统。再次查看 <code>/dev</code> 目录，发现依旧没有新增设备。</p><p>上网查询后发现是 <code>brltty</code> 的问题。<code>brltty</code> 是一个为盲人和视力障碍者提供的终端设备驱动程序，它会在系统启动时自动加载并占用串口设备，导致我们无法正常使用部分串口设备。我们可以通过以下命令禁用它：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> systemctl</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> stop</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> brltty.service</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">     # 停止服务</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> systemctl</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> disable</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> brltty.service</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 禁用服务</span></span></code></pre><p>或者如果您用不到这类辅助设备的话，可以选择直接卸载它：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> purge</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> brltty</span></span></code></pre><p>再次查看 <code>/dev</code> 目录，发现多出来了一个名为 <code>/dev/ttyCH341USB0</code> 的设备，说明驱动已经可以正常使用。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>Jetson AGX Orin 的内核版本还是太老了一点，驱动支持也不全。希望未来的 Jetson 镜像能更新到更高的内核版本，驱动兼容性也能做的好一点。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><p><a href="https://hkgoldenmra.blogspot.com/2022/12/linux-ch340-arduino-devttyusb.html">分享科技與遊戲 by HKGoldenMr.A</a></p></li><li><p><a href="https://github.com/juliagoda/CH341SER/issues/18">usbfs: interface 0 claimed by ch34x while ‘brltty’ sets config #1 #18</a></p></li></ul>]]></content>
    
    
    <summary type="html">Jetson AGX Orin CH340 驱动安装过程中的一些记录。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="电赛" scheme="https://blog.insmtr.com/tags/%E7%94%B5%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>在 Ubuntu 22.04 上运行 PX4-Autopilot 1.13</title>
    <link href="https://blog.insmtr.com/2025/01/23/2025.1.23%20PX4-Autopilot%20on%20Ubuntu%20jammy/"/>
    <id>https://blog.insmtr.com/2025/01/23/2025.1.23%20PX4-Autopilot%20on%20Ubuntu%20jammy/</id>
    <published>2025-01-23T00:00:00.000Z</published>
    <updated>2025-04-22T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>Gazebo-classic 在 Ubuntu 22.04 上已停止维护，但是新版的 Gazebo 无论从性能上还是体验上都不佳。PX4 1.13 也是最后一个支持 Gazebo-classic 的版本，并且我们依旧可以在 Ubuntu 22.04 上运行 PX4 1.13 仿真，并手动编写其启动脚本。</p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p>由于 linux 的 sudo 默认是隔离环境变量的，所以即使开了魔法，并配置了 <code>http_proxy</code> 和 <code>https_proxy</code> ，也无法正常在 sudo 下使用。所以我们先进行魔法的额外配置。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> visudo</span></span></code></pre><p>找到有一堆的 <code>Defaults</code> 开头的地方，就在最前面，跟在它后面写一行：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">Defaults</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">env_keep+="https_proxy http_proxy"</span></span></code></pre><p>然后保存。Ubuntu 发行版大概率是用 <code>nano</code> 作为编辑器的，那就 Ctrl+S 保存，Ctrl+X 退出。</p><p>接着安装构建用的工具链以及 gazebo 。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ninja-build</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> exiftool</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> protobuf-compiler</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libeigen3-dev</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> genromfs</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> xmlstarlet</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libgstreamer1.0-dev</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libgstreamer-plugins-base1.0-dev</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libopencv-dev</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> python3-pip</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> gawk</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> cmake</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> gazebo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> libgazebo-dev</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">pip3</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> packaging</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> numpy</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> empy==</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">3.3.4</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> toml</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> pyyaml</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> jinja2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> kconfiglib</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> jsonschema</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> future</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> pyros-genmsg</span></span></code></pre><h2 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h2><p>找一个合适的位置开始克隆并编译 PX4 。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">git</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> clone</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --rec</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -j$(</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657">nproc</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">)</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -b</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> v1.13.2</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --depth</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 1</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://github.com/PX4/PX4-Autopilot</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">make</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> px4_sitl_default</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> gazebo</span></span></code></pre><p>编译完后会弹出一个 gazebo 的界面，不用管它，在终端内 Ctrl+C 关掉。</p><p>编译完后里面有好多是根本没用的，徒占空间。我们删掉这些无用的东西，只留精华。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ..</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mv</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mkdir</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/build/px4_sitl_default/build_gazebo</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mkdir</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/Tools/sitl_gazebo</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cp</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -r</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_/build/px4_sitl_default/bin</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/build/px4_sitl_default</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cp</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -r</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_/build/px4_sitl_default/build_gazebo/</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">*</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">.so</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/build/px4_sitl_default/build_gazebo</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cp</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -r</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_/build/px4_sitl_default/etc</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/build/px4_sitl_default</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cp</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -r</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_/Tools/sitl_gazebo/models</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/Tools/sitl_gazebo</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">cp</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -r</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_/Tools/sitl_gazebo/worlds</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot/Tools/sitl_gazebo</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rm</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -rf</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> PX4-Autopilot_</span></span></code></pre><p>然后往 .bashrc 里加一些内容。<strong>注意，如果你是 Nvidia 显卡，记得添加倒数第二行。如果你的电脑没有 N 卡只有 Intel 核显，则建议添加最后一行。（最后一行注释不算一行）</strong></p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> PX4_DIR</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">你的 PX4 仿真目录</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> GAZEBO_PLUGIN_PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$PX4_DIR/build/px4_sitl_default/build_gazebo</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> GAZEBO_MODEL_PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$PX4_DIR/Tools/sitl_gazebo/models</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> LD_LIBRARY_PATH</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$PX4_DIR/build/px4_sitl_default/build_gazebo:$LD_LIBRARY_PATH</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># export MESA_D3D12_DEFAULT_ADAPTER_NAME=NVIDIA  # 如果你是 Nvidia 显卡</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E"># export LIBGL_ALWAYS_SOFTWARE=1                 # 如果你是 Intel 核显用户，建议添加</span></span><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">                                                 # AMD yes</span></span></code></pre><h2 id="启动！"><a href="#启动！" class="headerlink" title="启动！"></a>启动！</h2><p>PX4 的编译就算完了，现在安装 humble 版的 mavros 。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ros-humble-mavros</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ros-humble-mavros-extras</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">curl</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -sL</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> https://github.com/mavlink/mavros/raw/ros2/mavros/scripts/install_geographiclib_datasets.sh</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> |</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> bash</span></span></code></pre><p>PX4-Autopilot 项目里有写好的有 ROS1 的 launch 文件，可以直接启动，但是没有提供 ROS2 版的，所以我们可以写一个简单的 px4 启动脚本。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">nano</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> px4</span></span></code></pre><p>里面写上：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">#!/bin/bash</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mkdir</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.gazebo/models</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">mkdir</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.gazebo/worlds</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">MODEL</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/Tools/sitl_gazebo/models/iris/iris.sdf"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">MODEL_NAME</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"iris"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">WORLD</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/Tools/sitl_gazebo/worlds/empty.world"</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">while</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> [[ </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$#</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> -gt</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 0</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> ]]; </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">do</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">  case</span><span style="--shiki-light:#953800;--shiki-dark:#FFA657"> $1</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> in</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">    --model</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">)</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      MODEL</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">      shift</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 2</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ;;</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">    --model-name</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">)</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      MODEL_NAME</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">      shift</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 2</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ;;</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">    --world</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">)</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      WORLD</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">      shift</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 2</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ;;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    *)</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">      echo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "Unknown option: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$1</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">      exit</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 1</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ;;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">  esac</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">done</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">export</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> PX4_SIM_MODEL</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"iris"</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">if</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> [[ </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">!</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$MODEL</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> =~</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> ^/ ]]; </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">then</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    MODEL</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$HOME</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/.gazebo/models/</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$MODEL</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">fi</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">if</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> [[ </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">!</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$WORLD</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> =~</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> ^/ ]]; </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">then</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    WORLD</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$HOME</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/.gazebo/worlds/</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$WORLD</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">fi</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">gzserver</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --verbose</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$WORLD</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">GZSERVER_PID</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$!</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">gz</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> model</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --spawn-file=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$MODEL</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model-name=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">$MODEL_NAME</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -z</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 1.0</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">gzclient</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">GZCLIENT_PID</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$!</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ros2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> run</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> mavros</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> mavros_node</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --ros-args</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> fcu_url:=udp://:14540@:14580</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">MAVROS_PID</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">=</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">$!</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">cd</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/build/px4_sitl_default</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">./bin/px4</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -s</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> etc/init.d-posix/rcS</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">kill</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -9</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $GZSERVER_PID </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">2></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/dev/null</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">kill</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -9</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $GZCLIENT_PID </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">2></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/dev/null</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">kill</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -9</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $MAVROS_PID </span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">2></span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/dev/null</span></span></code></pre><p>Ctrl+S 保存，Ctrl+X 退出。</p><p>然后把 <code>px4</code> 作为命令安装。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> px4</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /usr/local/bin/px4</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rm</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> px4</span></span></code></pre><p>最后记得 source 一下 <code>.bashrc</code> ，或者直接重新打开终端，之后就可以用 <code>px4</code> 命令直接启动了！</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">.</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ~/.bashrc</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">px4</span></span></code></pre><p>在 px4 的 mavlink 控制台内输入：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">param</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> set</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> COM_RCL_EXCEPT</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 4</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">param</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> save</span></span></code></pre><p>这样就可以用 mavlink 来让飞机进入 Offboard 模式了！</p><h2 id="摄像头模拟"><a href="#摄像头模拟" class="headerlink" title="摄像头模拟"></a>摄像头模拟</h2><p>gazebo 内有摄像头模组，px4 基于它做了一个转发到 mavros 的插件。在 ROS1 下，编译 PX4-Autopilot 时会自动编译这个插件，而现在我们用的 ROS2 ，需要手动安装。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ros-humble-gazebo-ros-pkgs</span></span></code></pre><p>然后再启动带有摄像头的 px4 模型仿真：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">px4</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/Tools/sitl_gazebo/models/iris_fpv_cam/iris_fpv_cam.sdf</span></span></code></pre><p>在另外一个终端中就可以看到摄像头的图像了：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ros2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> topic</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> list</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 可以看到有 /camera/camera_info 和 /camera/image_raw 两个话题</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rviz2</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">            # rviz2 内添加一个 Image 类型的话题，选择 topic 为 /camera/image_raw 就可以看到图像了</span></span></code></pre><h2 id="摄像头话题"><a href="#摄像头话题" class="headerlink" title="摄像头话题"></a>摄像头话题</h2><p>按照上一节的步骤，我们已经可以成功发布摄像头话题了，但是如果我们在模型中添加两个及以上摄像头的话，就必须想办法修改每个摄像头的话题了。不然的话，两个摄像头的画面数据就会混在一个话题里面，当然这种情况在 ROS2 中是<strong>被允许的</strong>。</p><p>由于 gazebo-ros-pkgs 中 gazebo-plugins 代码的 ROS1 版本和 ROS2 版本差异巨大，处理话题发布部分的代码也大相径庭。具体可以查看源码链接 <a href="https://github.com/ros-simulation/gazebo_ros_pkgs/blob/noetic-devel/gazebo_plugins/src/gazebo_ros_camera_utils.cpp">ROS1 版本</a> <a href="https://github.com/ros-simulation/gazebo_ros_pkgs/blob/ros2/gazebo_plugins/src/gazebo_ros_camera.cpp">ROS2 版本</a> 。</p><p>查看代码后不难发现，使用 ROS1 版本的 gazebo-ros-pkgs 时，摄像头话题可以通过模型文件里面 <code>camera_plugin</code> 插件的配置项 <code>cameraName</code> 和 <code>imageTopicName</code> 来配置。而在 ROS2 版本中，代码有明显重写过。简单来讲，所有的配置项都从原来的「<strong>小驼峰命名法</strong>」变成了「<strong>蛇形命名法</strong>」，并且只支持用 <code>camera_name</code> 配置项来配置话题的前缀，后缀则固定为 <code>/image_raw</code> ，不能通过类似 <code>image_topic_name</code> 配置项配置。</p><p>这边给出一个对地摄像头的示例配置：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">sensor</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">'camera'</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> type</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">'camera'</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">camera</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">'__default__'</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">horizontal_fov</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1.571&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">horizontal_fov</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">image</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">width</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>640&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">width</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">height</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>480&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">height</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">image</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">clip</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">near</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.1&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">near</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">far</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>100&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">far</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">clip</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">lens</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">type</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>custom&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">type</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">custom_function</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">        &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">c1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1.05&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">c1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">        &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">c2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>4&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">c2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">        &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">f</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">f</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">        &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">fun</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>tan&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">fun</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">custom_function</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">scale_to_hfov</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">scale_to_hfov</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cutoff_angle</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>3.1415&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cutoff_angle</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">env_texture_size</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1080&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">env_texture_size</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">lens</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">camera</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">always_on</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">always_on</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">update_rate</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>30&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">update_rate</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">visualize</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>1&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">visualize</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">plugin</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">'camera_plugin'</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> filename</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">=</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">'libgazebo_ros_camera.so'</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">camera_name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>camera/ground_camera&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">camera_name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">frame_name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>/robot_camera_link&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">frame_name</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">P_cx</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>320.5&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">P_cx</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cx</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>320.5&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cx</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cy</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>240.5&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">cy</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">hack_baseline</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">hack_baseline</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">focal_length</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>277.191356&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">focal_length</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k3</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_k3</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_t1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_t1</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#x3C;</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_t2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">>0.0&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">distortion_t2</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">plugin</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#x3C;/</span><span style="--shiki-light:#116329;--shiki-dark:#7EE787">sensor</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">></span></span></code></pre><p>使用带该摄像头模型的飞机模型启动 gazebo ：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ros2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> topic</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> list</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 可以看到有 /camera/ground_camera/camera_info 和 /camera/ground_camera/image_raw 两个话题</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rviz2</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">            # rviz2 内添加一个 Image 类型的话题，选择 topic 为 /camera/ground_camera/image_raw 就可以看到图像了</span></span></code></pre><p>这样就可以实现摄像头话题的分离了。</p><p>如果你一定要使用完全自定义的话题名的话，我们可以用 <code>topic-tools</code> 工具来转发话题。比如我们可以编辑刚才我们创建的 px4 一键启动程序。</p><details class="info-fold" open>  <summary>🖊 Info</summary>  <div class="info-content">    <p>由于前面我们已经使用 <code>install</code> 命令将 <code>px4</code> 作为脚本安装在系统里了，所以我们需要直接编辑这个安装过的脚本。你也可以选择重复「<a href="#%E5%90%AF%E5%8A%A8">启动！</a>」一节里的步骤重新创建脚本，做好编辑之后再次运行 <code>sudo install px4 /usr/local/bin/px4</code> 命令安装。</p>  </div></details>  <p>先安装 <code>topic-tools</code></p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">sudo</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> apt</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> install</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -y</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ros-humble-topic-tools</span></span></code></pre><p>接着用 <code>sudo</code> 权限编辑 <code>/usr/local/bin/px4</code> ，在启动 mavros 节点和 px4 的命令之间插入：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ros2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> run</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> topic_tools</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> relay</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /camera/ground_camera/image_raw</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /video/ground_camera</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#x26;</span></span></code></pre><p>保存退出，再次用带这个摄像头模型的飞机模型启动 <code>gazebo</code> ：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">ros2</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> topic</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> list</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">  # 可以看到有 /video/ground_camera 这个话题</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">rviz2</span><span style="--shiki-light:#6E7781;--shiki-dark:#8B949E">            # rviz2 内添加一个 Image 类型的话题，选择 topic 为 /video/ground_camera 就可以看到图像了</span></span></code></pre><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>我写了一个 px4 启动脚本来实现仿真的启动，这个脚本可以直接通过参数来指定飞机模型（model）和世界（world），具体使用方法是：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">px4</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/Tools/sitl_gazebo/models/iris/iris.sdf</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model-name</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> iris</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --world</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> $PX4_DIR</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">/Tools/sitl_gazebo/worlds/empty.world</span></span></code></pre><p>这样就可以启动自定义飞机模型在自定义世界了。由于 gazebo 不支持读取带 <code>~</code> 的路径的模型，所以指定参数时请使用完整路径。</p><p><code>--model</code> 参数的默认相对路径是 <code>~/.gazebo/models/</code> ，<code>--world</code> 参数的默认相对路径是 <code>~/.gazebo/worlds/</code> ，如果你将模型或者世界放在了这两个目录下，也可以直接使用相对路径，例如：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">px4</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> iris/iris.sdf</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --model-name</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> iris</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> --world</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> empty.world</span></span></code></pre><h1 id="祝各位代码永无-bug-，飞机永无失控！电赛加油！"><a href="#祝各位代码永无-bug-，飞机永无失控！电赛加油！" class="headerlink" title="祝各位代码永无 bug ，飞机永无失控！电赛加油！"></a>祝各位代码永无 bug ，飞机永无失控！电赛加油！</h1>]]></content>
    
    
    <summary type="html">Ubuntu 22.04 上也能运行 PX4-Autopilot 1.13 了！</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="电赛" scheme="https://blog.insmtr.com/tags/%E7%94%B5%E8%B5%9B/"/>
    
    <category term="飞控" scheme="https://blog.insmtr.com/tags/%E9%A3%9E%E6%8E%A7/"/>
    
    <category term="仿真" scheme="https://blog.insmtr.com/tags/%E4%BB%BF%E7%9C%9F/"/>
    
  </entry>
  
  <entry>
    <title>在 Thunderbird 里使用沉浸式翻译插件</title>
    <link href="https://blog.insmtr.com/2024/12/19/2024.12.19%20Translate/"/>
    <id>https://blog.insmtr.com/2024/12/19/2024.12.19%20Translate/</id>
    <published>2024-12-19T00:00:00.000Z</published>
    <updated>2024-12-19T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>说到翻译插件，我们不得不提到那个赫赫有名的插件——沉浸式翻译。</p><p>可是在当我们使用邮箱客户端 Thunderbird 想要翻译的时候就犯难了。Thunderbird 的插件体系比较简陋，没有收录沉浸式翻译。而且 Thunderbird 和 Firefox 的部分 api 不相同，还不能直接文件安装沉浸式翻译插件。但考虑到 Thunderbird 和 Firefox 都是基于 Gecko 内核的，大部分 api 是通用的，那不如直接在原插件的基础上进行一些小修改，使其能在 Thunderbird 上工作。</p><h2 id="插件修改"><a href="#插件修改" class="headerlink" title="插件修改"></a>插件修改</h2><p>我们先到 <a href="https://immersivetranslate.com/zh-Hans/">沉浸式翻译官网</a> 下载 Firefox 扩展，并解压该扩展。</p><p><img src="/images/2024.12.19%20Translate/1.webp"></p><p>解压后的目录大概长这样：</p><p><img src="/images/2024.12.19%20Translate/2.webp"></p><p>沉浸式翻译的 js 代码做了混淆，所以我们尽量做一些非侵入式的修改。</p><p>打开 <code>background.js</code> ，在文件最后插入以下代码。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">async</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> function</span><span style="--shiki-light:#8250DF;--shiki-dark:#D2A8FF"> registerMsgDisplayScript</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">() &#123;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">  await</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> messenger.messageDisplayScripts.</span><span style="--shiki-light:#8250DF;--shiki-dark:#D2A8FF">register</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">(&#123;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    js: [&#123;file: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"/content_script.js"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;, &#123;file: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"/content_start.js"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;]</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#125;);</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;</span></span><span class="line"><span style="--shiki-light:#8250DF;--shiki-dark:#D2A8FF">registerMsgDisplayScript</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">();</span></span></code></pre><p><img src="/images/2024.12.19%20Translate/3.webp"></p><p>打开 <code>manifest.json</code> ，找到 <code>permissions</code> 字段，将其中的 <code>contextMenus</code> 改为 <code>menus</code> ，再在后面加上 <code>messagesModify</code> 权限。</p><p><img src="/images/2024.12.19%20Translate/4.webp"></p><p>还是 <code>manifest.json</code> ，找到 <code>browser_specific_settings</code> 字段，将 <code>gecko</code> 字段下的 <code>strict_min_version</code> 字段的值改为 <code>78.0</code> 。</p><p><img src="/images/2024.12.19%20Translate/5.webp"></p><p>打开 <code>background.js</code> 和 <code>options.js</code> ，将里面所有的 <code>contextMenus</code> 替换为 <code>menus</code> 。</p><p>打开 <code>background.js</code> ，将 <code>[&quot;browser_action&quot;,&quot;page_action&quot;]</code> 里面的 <code>&quot;page_action&quot;</code> 项删除。</p><p><img src="/images/2024.12.19%20Translate/6.webp"></p><p>在插件的根目录里面将所有文件打包成 zip 文件。</p><h2 id="插件安装"><a href="#插件安装" class="headerlink" title="插件安装"></a>插件安装</h2><p>打开 Thunderbird ，点击右上角的三条杠，点击「扩展和主题」，点击左侧的「扩展」，点击右上角的齿轮，点击「从文件安装附加组件…」，找到前面压缩出来的 zip 文件，安装。</p><p><img src="/images/2024.12.19%20Translate/7.webp"></p><p>大功告成，再完成一下新手引导就可以正常使用了。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><p><a href="https://linux.do/t/topic/285525">移植「沉浸式翻译」到Thunderbird实现邮件翻译</a></p>]]></content>
    
    
    <summary type="html">将沉浸式翻译插件移植到知名邮箱客户端 Thunderbird 中。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="青柚周报" scheme="https://blog.insmtr.com/tags/%E9%9D%92%E6%9F%9A%E5%91%A8%E6%8A%A5/"/>
    
    <category term="邮箱" scheme="https://blog.insmtr.com/tags/%E9%82%AE%E7%AE%B1/"/>
    
    <category term="翻译" scheme="https://blog.insmtr.com/tags/%E7%BF%BB%E8%AF%91/"/>
    
  </entry>
  
  <entry>
    <title>搭建自定义域名邮箱</title>
    <link href="https://blog.insmtr.com/2024/12/18/2024.12.18%20Mail/"/>
    <id>https://blog.insmtr.com/2024/12/18/2024.12.18%20Mail/</id>
    <published>2024-12-18T00:00:00.000Z</published>
    <updated>2025-03-29T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>今年年初搭建过邮件服务器。当时是 RackNerd 做的新年促销，我买了一台 2h3g 的服务器，照着教程搭建了一个 iRedMail 服务器，也用了一段时间。可是 rn 的 ip 质量和链路质量确实不行，性能和价格倒是可以。</p><p>现在服务器快到期了，我想给邮件服务器搬个家。一方面我希望 ip 不要在黑名单，另一方面我希望找一个轻量化的邮件服务器，不要像 iRedMail 一样一启动就吃 3g 多的内存。</p><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>之前在 BWG 那边我买了一台 $46.6 一年服务器，可以换机房，我给换到了日本软银。但是实测的时候比较惊喜，电信去程居然是 CTG 的线路。（CTG 就是原来的 CN2），就选这台了。邮件服务器的话我找到了一款叫做 maddy 的软件。它实现了邮件的全功能，但是待机占用只有 10m 左右，极其轻巧。</p><p>上<a href="https://mxtoolbox.com/SuperTool.aspx">MXTOOLBOX</a>查询了一下，发现 ip 在 BarracudaCentral 黑名单上在列。这个问题不大，搭好服务器之后再去解决。</p><p>域名就选择 mail.insmtr.cn 作为 mail 服务器域名。</p><p>ssl 证书我才用 acme.sh 申请，申请的证书文件默认保存在 <code>/root/.acme.sh/insmtr.cn_ecc/</code> 下。</p><p>我平时喜欢在服务器端使用 alpine ，而 maddy 是 systemd 管理的，所以最好的办法就是使用 docker 。</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>启动 docker 容器相比直接在 alpine 上手动搭建 maddy 就简单了很多。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">docker</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> run</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -id</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  --name</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> maddy</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -e</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> MADDY_HOSTNAME=mail.insmtr.cn</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -e</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> MADDY_DOMAIN=insmtr.cn</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -v</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> maddydata:/data</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -v</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /root/.acme.sh/insmtr.cn_ecc/fullchain.cer:/data/tls/fullchain.pem</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -v</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /root/.acme.sh/insmtr.cn_ecc/insmtr.cn.key:/data/tls/privkey.pem</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 25:25</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 143:143</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 465:465</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 587:587</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  -p</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> 993:993</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  --restart</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> always</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> \</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">  foxcpp/maddy:latest</span></span></code></pre><p>其中，<code>MADDY_HOSTNAME</code> 的值替换为<strong>你的 mx 邮件服务器的域名</strong>，<code>MADDY_DOMAIN</code> 的值替换为<strong>你自己的域名</strong>。容器内证书默认要求存放在 <code>/data/tls</code> 下，如想要自行修改，可以直接修改存储卷里面配置文件，按照我这个配置，应该是 <code>/var/lib/docker/volumes/maddydata/_data/maddy.conf</code> 。</p><p>接下来就是一系列的解析记录的添加了。</p><p>我使用 Cloudflare 作为域名托管平台，其它平台的配置方法类似。</p><p>下面是我的配置，请将相关域名替换成<strong>你的域名</strong>。</p><p>进入 DNS 配置界面之后，我们需要添加多条记录，点击右侧的「添加记录」来添加。</p><p><img src="/images/2024.12.18%20Mail/1.webp"></p><p>**「类型」<strong>选 <code>MX</code> ，</strong>「名称」<strong>填 <code>@</code> ，</strong>「邮件服务器」**填 <code>mail.insmtr.cn</code> 。</p><p>**「类型」<strong>选 <code>A</code> ，</strong>「名称」<strong>填 <code>mail</code> ，</strong>「IPv4 地址」**填你的邮件服务器的 ip 。</p><p>**「类型」<strong>选 <code>A</code> ，</strong>「名称」<strong>填 <code>mta-sts</code> ，</strong>「IPv4 地址」**填你的邮件服务器的 ip 。</p><p>**「类型」<strong>选 <code>TXT</code> ，</strong>「名称」<strong>填 <code>@</code> ，</strong>「内容」**填 <code>v=spf1 mx ~all</code> 。</p><p>**「类型」<strong>选 <code>TXT</code> ，</strong>「名称」<strong>填 <code>_dmarc</code> ，</strong>「内容」**填 <code>v=DMARC1; p=quarantine; ruf=mailto:insmtr@insmtr.cn</code> 。里面的邮箱填的是当邮件发送失败的时候，失败报告该发到哪个邮件。</p><p>**「类型」<strong>选 <code>TXT</code> ，</strong>「名称」<strong>填 <code>mta-sts</code> ，</strong>「内容」**填 <code>v=STSv1; id=1</code> 。</p><p>**「类型」<strong>选 <code>TXT</code> ，</strong>「名称」<strong>填 <code>_smtp._tls</code> ，</strong>「内容」**填 <code>v=TLSRPTv1;rua=mailto:insmtr@insmtr.cn</code> 。</p><p>然后进入到存储卷里面找到 <code>dkim_keys/insmtr.cn_default.dns</code> 这个文件，我这里的绝对目录是 <code>/var/lib/docker/volumes/maddydata/_data/dkim_keys/insmtr.cn_default.dns</code> ，将其中的内容复制出来。</p><p>**「类型」<strong>选 <code>TXT</code> ，</strong>「名称」<strong>填 <code>default._domainkey</code> ，</strong>「内容」**填刚才复制的内容。</p><p>最后大概配置如下：</p><p><img src="/images/2024.12.18%20Mail/2.webp"></p><p>然后在这台服务器上安装 nginx ，或者其它你用着顺手的 web 服务器软件。</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">apk</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> add</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> nginx</span></span></code></pre><p>然后在 <code>/etc/nginx/http.d</code> 中增加一个配置文件，比如名字叫做 <code>mta-sts.conf</code> ，在里面写入：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">server</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> &#123;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    server_name </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">mta-sts.insmtr.cn;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    listen </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">443</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3"> ssl http2;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    listen </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">[::]:443 ssl http2;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    ssl_protocols </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">TLSv1.1 TLSv1.2 TLSv1.3;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    ssl_certificate </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">/root/.acme.sh/insmtr.cn_ecc/fullchain.cer;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    ssl_certificate_key </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">/root/.acme.sh/insmtr.cn_ecc/insmtr.cn.key;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">    location</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72"> =</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> /.well-known/mta-sts.txt </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#123;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">        default_type </span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">text/plain;</span></span><span class="line"><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">        return</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> 200</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> "version: STSv1\r</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">\n</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">mode: enforce\r</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">\n</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">mx: mail.insmtr.cn\r</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">\n</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">max_age: 86400\r</span><span style="--shiki-light:#CF222E;--shiki-dark:#FF7B72">\n</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;</span></span></code></pre><p>最后解决一下黑名单问题。</p><p>这个 ip 被列入了一个叫 BarracudaCentral 的黑名单，但这个黑名单解除起来也很方便，毕竟这是 BWG 的机器，价格的门槛保证了 ip 不会被滥用。</p><p>打开 <a href="http://www.barracudacentral.org/lookups">http://www.barracudacentral.org/lookups</a> 输入 ip 和验证码查询，然后点击「click here」申请恢复。填上邮箱、手机号以及申诉理由即可申诉。这里邮箱建议填 outlook 邮箱。大约一个小时后，再查询发现已经从黑名单移除了。</p><p>最后改一下服务器的 rDNS &#x2F; PTR 记录。我这边是直接在 BWG 后台修改 PTR 记录为 <code>mail.insmtr.cn</code></p><h2 id="创建用户"><a href="#创建用户" class="headerlink" title="创建用户"></a>创建用户</h2><p>进入 maddy 的 docker 容器中的终端：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">docker</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> exec</span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF"> -it</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> maddy</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> ash</span></span></code></pre><p>创建 <code>insmtr@insmtr.cn</code> 账号：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">maddy</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> creds</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> create</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> insmtr@insmtr.cn</span></span><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">maddy</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> imap-acct</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> create</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> insmtr@insmtr.cn</span></span></code></pre><p>用其它邮箱向 <code>insmtr@insmtr.cn</code> 发信，查询收信情况：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#953800;--shiki-dark:#FFA657">maddy</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> imap-msgs</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> list</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> insmtr@insmtr.cn</span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF"> INBOX</span></span></code></pre><p><img src="/images/2024.12.18%20Mail/3.webp"></p><p>可以看到正常收信。</p><p>至于前端界面嘛，直接使用第三方工具就可以，比如我用的 Thunderbird ，直接密码登录即可。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>本文写的比较简陋，更适合有基础的同学速成使用。自己折腾这些东西的过程当中也能收获不少乐趣，学到不少知识。</p><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ul><li><p><a href="https://cyp0633.icu/post/self-hosting-mail-maddy-rainloop/">使用 Maddy+RainLoop 搭建自己的邮箱</a></p></li><li><p><a href="https://www.winmail.cn/docs/errormail/barracudacentral.php">梭子鱼黑名单移除说明</a></p></li></ul>]]></content>
    
    
    <summary type="html">以自己的域名结尾的邮箱，想想就很酷。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="青柚周报" scheme="https://blog.insmtr.com/tags/%E9%9D%92%E6%9F%9A%E5%91%A8%E6%8A%A5/"/>
    
    <category term="邮箱" scheme="https://blog.insmtr.com/tags/%E9%82%AE%E7%AE%B1/"/>
    
  </entry>
  
  <entry>
    <title>Android Box for root 透明代理</title>
    <link href="https://blog.insmtr.com/2024/12/17/2024.12.16%20Box%20for%20root/"/>
    <id>https://blog.insmtr.com/2024/12/17/2024.12.16%20Box%20for%20root/</id>
    <published>2024-12-17T00:00:00.000Z</published>
    <updated>2024-12-17T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<details class="warning-fold" open>  <summary>⚠️ Warning</summary>  <div class="warning-content">    <p>本文只探究安卓透明代理的实现技术，仅供学习交流，不提供代理工具的二进制文件分发。</p><p>请严格遵守您（读者）所在的国家和地区的相关方面的法律法规，对于擅自基于本文所述方法从事的违法犯罪活动，笔者不承担任何法律责任。</p><p>本文内容有一定技术门槛，请确保您已学习过相关知识。如您看不懂本文的内容，就说明您不是本文的受众群体。</p><p>如您不同意上述条例，请立即关闭本网页。否则默认您已同意。</p>  </div></details>  <h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>代理工具的运行没有什么难度，但是路由问题十分棘手。PC 端我们通常可以设置系统代理或者干脆直接 tun 模式实现网卡级的透明代理。</p><p>安卓上面不好直接设置系统代理，而且事实上也没有多少软件去使用系统代理。所以安卓上通常是用 tun 实现的代理。但是安卓有一点和 PC 不同，它在非 root 下并不能去修改路由表，那就无法接管流量了。所以在安卓上通常使用 VPN 功能来实现流量的接管。</p><p>但是对于有 root 权限的设备，我们完全可以搞一些更高级打洞玩法。我今天要讲的就是一款 Magisk &#x2F; KernelSU &#x2F; APatch 模块，Box for root 。这个模块可以通过 root 实现 iptables 的自动配置。</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>本文重点不在 root 的实现，有关 root 的实现方案可以很容易地在网上找到。本文使用 KernelSU 作为 root 实现方案。</p><p>Github 上有两个类似的仓库，一个叫 <code>box_for_magisk</code> ，还有一个叫 <code>box4magisk</code> 。笔者没有去探究两者的关系，两者功能类似，但是前者更新频率较快，而且作者还配套开发了前端，所以本文以前者为例。</p><p>在 KernelSU 中刷入模块，并安装上管理软件。</p><p><img src="/images/2024.12.16%20Box%20for%20root/1.webp"></p><p>在刷模块的时候，会问你是否下载内核。建议按音量上键下载一下，或者手动下载好内核后放在 <code>/data/adb/box/bin/</code> 下。但手动下载的时候请注意将内核改为 <code>clash</code> <code>sing-box</code> <code>xray</code> <code>v2fly</code> <code>hysteria</code> 中的一个，因为 Box for root 是支持切换内核的，所以没有智能到可以自动识别二进制文件的名字。</p><p>下载内核的过程中请保持国际联网通畅。<del>什么蛋鸡循环问题。</del></p><p>记得授予 BoxForRoot 管理软件的 root 权限，不然会提示找不到模块。</p><p>安装完成后建议重启手机，确保模块生效。</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>先把默认配置关掉，点右下角设置。笔者习惯使用 sing-box ，其它内核配置方法类似。</p><p><img src="/images/2024.12.16%20Box%20for%20root/2.webp"></p><p>下面的配置项根据自己需要去选择。这里我打开了 quic 和 ipv6 ，关闭了 geox 因为我使用自己准备的规则集，关闭了 crontab 因为我不需要周期任务。网络模式我更建议使用 mixed 或 tun 模式。</p><p><img src="/images/2024.12.16%20Box%20for%20root/3.webp"></p><p>然后就是具体的配置文件的修改了。在 <code>/data/adb/box</code> 下存放着各种内核的配置文件。</p><p>Box_for_root 默认提供了一个 sing-box 的配置文件：</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "log"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "level"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"panic"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "output"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"/data/adb/box/run/sing-box.log"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "timestamp"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#125;,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "dns"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "servers"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"AdGuard"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "address"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"94.140.14.14"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"local"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "address"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">""</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "detour"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"direct"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"rcode"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "address"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"rcode://success"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "rules"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "outbound"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"any"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "server"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"local"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "disable_cache"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "strategy"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"prefer_ipv4"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#125;,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "inbounds"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"tproxy"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"tproxy-in"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "listen"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"::"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "listen_port"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">9898</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "sniff"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"tun"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"tun-in"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "interface_name"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"utun9"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "address"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">        "172.18.0.1/30"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">        "fdfe:dcba:9876::1/126"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "mtu"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">9000</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "stack"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"system"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "auto_route"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "strict_route"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "auto_redirect"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "sniff"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "sniff_override_destination"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">false</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "include_android_user"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">        0</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">        10</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "include_package"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "exclude_package"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: []</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"redirect"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"redirect-in"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "listen"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"::"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "listen_port"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">9797</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "sniff"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "sniff_override_destination"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">false</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "outbounds"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"selector"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"default"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "outbounds"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">        "direct"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">        "block"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      ]</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"dns"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"dns"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"direct"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"direct"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;,</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "type"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"block"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "tag"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"block"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "route"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "rules"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "port"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">53</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">        "outbound"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"dns"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">      &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    ],</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "final"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"default"</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#125;,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">  "experimental"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">    "clash_api"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: &#123;</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "external_controller"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"127.0.0.1:9090"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "external_ui"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"dashboard"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "cache_file"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"cache.db"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#116329;--shiki-dark:#7EE787">      "store_selected"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">    &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">  &#125;</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">&#125;</span></span></code></pre><p>由于安卓上有一些特殊的特性，所以建议直接在这个基础上进行修改。具体的区别体现在，在 VPN 的实现中， <code>inbounds</code> 的 <code>tun</code> 中可以不写</p><pre class="shiki shiki-themes github-light-default github-dark-default" style="--shiki-light:#1f2328;--shiki-dark:#e6edf3;--shiki-light-bg:#ffffff;--shiki-dark-bg:#0d1117" tabindex="0"><code><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"auto_redirect"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"strict_route"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: </span><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">true</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0A3069;--shiki-dark:#A5D6FF">"include_android_user"</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">: [</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  0</span><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">,</span></span><span class="line"><span style="--shiki-light:#0550AE;--shiki-dark:#79C0FF">  10</span></span><span class="line"><span style="--shiki-light:#1F2328;--shiki-dark:#E6EDF3">]</span></span></code></pre><p>，因为 VPN 功能可以直接实现网卡级的流量接管。而我们现在需要做的是利用 root 去实现这个功能，所以必须写上。当然这些配置在安装时的预设配置里面已经有了。</p><p>关于 sing-box 的配置文件的编写，请参考<a href="https://sing-box.sagernet.org/zh/configuration/">sing-box 官方配置手册</a>，本文不介绍。</p><h2 id="启动！！"><a href="#启动！！" class="headerlink" title="启动！！"></a>启动！！</h2><p>然后在 BoxForRoot 主页启动就可以了。如果你保留了 <code>clash_api</code> 的相关配置，点击下面的 Dashboard 即可看到监控面板。如果你在 <code>outbound</code> 里配置了 <code>selector</code> 类型的选项，就可以在这个界面实现节点的切换。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>有了 root ，我们可以实现有很多有趣的事情。但是 root 也是双刃剑，一定要谨防那些恶意模块。在自己理解原理的基础上做进一步深入。</p>]]></content>
    
    
    <summary type="html">借助 root 的力量，实现完全无感的代理。</summary>
    
    
    
    <category term="技术" scheme="https://blog.insmtr.com/categories/%E6%8A%80%E6%9C%AF/"/>
    
    
    <category term="代理" scheme="https://blog.insmtr.com/tags/%E4%BB%A3%E7%90%86/"/>
    
    <category term="青柚周报" scheme="https://blog.insmtr.com/tags/%E9%9D%92%E6%9F%9A%E5%91%A8%E6%8A%A5/"/>
    
  </entry>
  
  <entry>
    <title>再见，曾经热爱的算法竞赛</title>
    <link href="https://blog.insmtr.com/2024/09/09/2024.9.9%20Algorithm/"/>
    <id>https://blog.insmtr.com/2024/09/09/2024.9.9%20Algorithm/</id>
    <published>2024-09-09T00:00:00.000Z</published>
    <updated>2024-12-16T00:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="引"><a href="#引" class="headerlink" title="引"></a>引</h2><p>在<a href="https://blog.insmtr.cn/history/">人生轨迹</a>中，我简要描述过高中时期最热爱的项目：算法竞赛；同时，我也提到了刚进入大学一个学期之后，我就放弃了这一热爱的项目。或有些许遗憾，但这是我深思熟虑之后作出的决定。</p><p>俗话说，兴趣是最好的老师。算法是我所热爱的事物，我理应会坚持下去，为何我会选择放弃呢？</p><p>我复盘了整个高中生涯，得出了一个结论：**其实我当时是误以为我热爱算法。**或者详细一点说，我热爱的从来都是写代码而不是算法，热爱的是通过自己双手去实现自己的脑中所想的东西，而不是在一堆限制中用仅有的那么一两种方法去做题目。</p><h2 id="接触算法"><a href="#接触算法" class="headerlink" title="接触算法"></a>接触算法</h2><p>在<a href="https://blog.insmtr.cn/history/">人生轨迹</a>中，我说，我是因为看到创新班的大佬们想搞竞赛，我也便想涉足一下竞赛圈子。现在看来，我当时其实是为了能在大佬中证明自己的能力，才去接触算法的，因为他们都太过锋芒毕露了。</p><p>大佬们有自己的圈子，他们很能聊到一起。而我只是靠运气考入了创新班，初中时候在学校也没有过多社交，不论在什么场合，都显得与他们格格不入。在初中，我在<strong>班里</strong>是数学和计算机之最的存在，直到我考上了创新班，我才发现我是井底之蛙的存在。当我跳出那口井，见识到山外之山后，我其实很孤独，很寂寞。</p><p>当时创新班的班主任说，要耐得住寂寞才能有成果。但站在现在去看，这句话我不太认同。应当是沉稳才能有成果。耐得住寂寞确实能获得一定成果，但是这些所谓的成果大多是书本上的死知识，在寂寞中学到的知识基本是脱离群体、脱离实际、没有用的。这和在沉稳中得到的成果是不一样的，因为沉稳的同时有和他人交流；有对社会实际问题的分析；有在纷繁的世界中不迷失自己方向的定力；有将复杂的愿望巧妙分解为简单目标的能力。</p><p>当然，话说回来，高中是以分数为王的，班主任的这句话在当时环境下也不能算错。</p><p>我当时十分想进入大佬的社交圈。但是那时候我比较天真，就因为旁听了大佬们的一次有关竞赛的讨论，我便真的去学习竞赛了，因为那时候的我太需要别人的认可了。</p><p>在机缘巧合下，我开始接触了和计算机最接近的竞赛——算法竞赛。</p><h2 id="热爱算法"><a href="#热爱算法" class="headerlink" title="热爱算法"></a>热爱算法</h2><p>初次接触算法竞赛，当我看到熟悉的代码时，我立刻被吸引住了。在<a href="#%E5%BC%95">引</a>中，我讲到我实际热爱的是写代码，但是那时候的我并没有意识到这一点，我只知道这是我能擅长的项目，这是能证明自己能力的途径，那这就是我热爱的。</p><p>就这样，这个「误以为的热爱」充实着我整个高中。</p><h2 id="误以为的热爱"><a href="#误以为的热爱" class="headerlink" title="误以为的热爱"></a>误以为的热爱</h2><p>直到现在，我也没有对这段「误以为的热爱」感到后悔。相反，可以说是日久生情吧，我对算法产生了感情。而且这段经历也对我的人生的发展产生了非常大的影响，并成为了我人生的一部分。只是后来去回想的时候感到些许遗憾罢了。</p><p>学习算法的过程中，我经历了「越往后学越觉得自己无知」的学习历程，体会了「想放弃，但是又特别想钻研」的矛盾心理。**我学会了谦虚，学会了根据实际情况分析他人的需求，学会了放下身段。**那些经历让我受益匪浅。算法也让我拓宽了交际圈，结识了很多大佬。</p><h2 id="再见，算法"><a href="#再见，算法" class="headerlink" title="再见，算法"></a>再见，算法</h2><p>进入大学之后，我本想继续钻研算法，但我明显感觉力不从心了。最明显的一点，我的数学知识无法跟上算法的进一步的需求了。更何况那些大佬都是从小学时候就开始接触算法，时间 &#x2F; 年龄带来的 buff 我根本追不上。后来我加入了电子相关的社团，学习了单片机，那时我才恍然大悟，**我热爱的从来都是编程，而不是算法。**相比算法，我更喜欢去解决实际问题。深思熟虑后，我决定放弃了继续钻研算法的念想。</p><h2 id="「胜者思维」"><a href="#「胜者思维」" class="headerlink" title="「胜者思维」"></a>「胜者思维」</h2><p>放弃算法还有一个比较重要的因素，就是我从小养成的「胜者思维」。</p><p>说详细点，因为我从小接触编程，所以在我生活的小县城里，在同龄人中可以说是鹤立鸡群，这让我总是会有一种优越感。即使我的水平不够，那也是同龄人中的 NO.1 。学校内遇到的各种计算机上的问题都会来找我，我也总是会自以为是地觉得我可以解决所有问题。但是现实总是一次又一次地打脸。每当遇到有和我技能重合的人，我就会担心，害怕他会挑战到我在这些方面的存在。直到我观察之后确定他的技能不如我，我才会放心。我把当年这种病态的思维叫做「胜者思维」。</p><p>因此我十分感谢算法将我从井底带出并看到了更为广阔的世界，让我跳出了「胜者思维」，使我能够接触许多圈子，与各路大佬交流。</p><p>到了大学之后，我转向了单片机以及飞控方向，相对来说我在这些领域内更有优势，可以用自己的技术换得一定的地位。可是仔细回想一下，我依旧是为了能够在一个小范围内获得前列才如此选择，我真的跳出「胜者思维」了吗？</p><p>有时候遇到一些小朋友，喜欢半瓶水就叮当响，很多时候蛮不讲理。很多时候我们会讨厌这些小朋友，但是我想，可能这就是每个人成长过程中都会经历的一个过程吧。我们可以适当包容一下这些孩子，或许他们长大一点就会明白，就会成熟。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>兴趣是一个人最好的老师，热爱的事物亦是如此。但是由于一个人在不同一时期的阅历和观念不同，可能会产生一些「误以为的热爱」。虽然最终会因此感到遗憾，但是它也会影响一个人一生中的抉择，决定一个人的成长方向。</p><p>没有遗憾，又怎么叫做人生呢。</p>]]></content>
    
    
    <summary type="html">如果是你，你会放弃曾经热爱的事情吗？</summary>
    
    
    
    <category term="随笔" scheme="https://blog.insmtr.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="青柚周报" scheme="https://blog.insmtr.com/tags/%E9%9D%92%E6%9F%9A%E5%91%A8%E6%8A%A5/"/>
    
  </entry>
  
</feed>
