<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>杰出兽的小宇宙</title>
    <link>https://www.jiecs.top/</link>
    <description>混沌世界</description>
    <language>zh-CN</language>
    <copyright>All rights reserved 2026, Jiecs</copyright>
    <lastBuildDate>Sun, 16 Aug 2026 16:08:30 GMT</lastBuildDate>
    <generator>Hexo</generator>
    <image>
      <url>https://www.jiecs.top/favicon.ico</url>
      <title>杰出兽的小宇宙</title>
      <link>https://www.jiecs.top/</link>
    </image>
    <atom:link href="https://www.jiecs.top/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>逃离 Termius 的屎山，解放你的数据</title>
      <link>https://www.jiecs.top/archives/8d40c1de/</link>
      <description>
        <![CDATA[<h2 id="为什么我在用-Termius"><a href="#为什么我在用-Termius" class="headerlink" title="为什么我在用 Termius"></a>为什么我在用 Termius</h2><ol start="0">
<li><stron]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E7%AE%80%E5%8D%95%E6%8A%80%E6%9C%AF/">简单技术</category>
      <category domain="https://www.jiecs.top/tags/%E6%8A%80%E6%9C%AF/">技术</category>
      <category domain="https://www.jiecs.top/tags/Linux/">Linux</category>
      <category domain="https://www.jiecs.top/tags/%E5%A5%BD%E8%BD%AF%E4%BB%B6/">好软件</category>
      <pubDate>Wed, 15 Jul 2026 19:55:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="为什么我在用-Termius"><a href="#为什么我在用-Termius" class="headerlink" title="为什么我在用 Termius"></a>为什么我在用 Termius</h2><ol start="0"><li><strong>它包含在 Github Education Benfits 里</strong></li><li><strong>移动支持、跨平台和同步</strong>——主要是确实很少有别的替代。</li><li><strong>sudo 自动输密码</strong>——确实方便。</li><li><strong>Telnet、串口支持</strong>——有用，但不是每天都要用。</li><li><strong>没有官方导出途径</strong>——Termius 没有提供任何官方方式让你把自己的数据拿走。我甚至怀疑这有没有违反欧盟的某些个人数据法规。</li></ol><h2 id="Termius-为什么是垃圾"><a href="#Termius-为什么是垃圾" class="headerlink" title="Termius 为什么是垃圾"></a>Termius 为什么是垃圾</h2><p>首先，Termius 是事实上的付费软件，Free Tier 下你 99% 的功能都用不了。<br>虽然我有 GitHub Education Benefits，不用自己掏钱。但一个 $10&#x2F;月的软件，就得拿 $10&#x2F;月的标准来骂。<br>作为付费软件，它的体验比免费软件垃圾多了。</p><h3 id="网络一波动就逼我重新登录"><a href="#网络一波动就逼我重新登录" class="headerlink" title="网络一波动就逼我重新登录"></a>网络一波动就逼我重新登录</h3><p>经常有这种情况：WiFi 连着，但 VPN 炸了，我得先连 OpenWrt 修一下。就这么几秒钟的事，Termius 跳出来说：</p><blockquote><p>不行，你必须先重新登录，才能重新访问你存在本地的数据。<br>这是为了你的安全，绝对不是因为我们怀疑你试图绕过正版购买。</p></blockquote><p>最夸张的时候，一天能让我重新登录 5-6 次。不止启动时弹，我甚至已经连到服务器，vim 还在里面开着，它也能打断我。一个登录框直接糊上来。莫名其妙</p><p><img src="https://cdn.jiecs.top/img/2026/07/1784049591970--6246946631601296268_119.webp" alt="&quot;Unlock your vault&quot; 就没有任何理由"></p><p>完全没有 Skip 的 Option。</p><h3 id="Termius-本身，在-Linux-上是垃圾"><a href="#Termius-本身，在-Linux-上是垃圾" class="headerlink" title="Termius 本身，在 Linux 上是垃圾"></a>Termius 本身，在 Linux 上是垃圾</h3><p>至今在 Linux 上只提供 Snap（垃圾）和 .deb 安装，Flatpak 支持靠社区，同时跟随系统深色模式根本不 work（我几年前就发过好多次工单，响应都是”we are on it!”但至今没有变化）</p><p><img src="https://cdn.jiecs.top/img/2026/07/1784049816990--6246946631601296270_119.webp" alt="Termius Support"></p><p>Flatpak 下 keyring 存储有乱七八糟的问题，整天告诉我”for some reason 你本地的所有数据全都 gone 了”。</p><p>说实话，2026 年了，你不能再跟我说”这是 Flatpak 的问题”。这就是软件开发商没有认真对待 Linux 用户的问题。</p><p><img src="https://cdn.jiecs.top/img/2026/07/1784049291172--6246946631601296255_119.webp" alt="&quot;Something went wrong&quot;"></p><p><img src="https://cdn.jiecs.top/img/2026/07/1784049308858--6246946631601296254_121.webp" alt="GNOME Seahorse"></p><h3 id="AI-功能"><a href="#AI-功能" class="headerlink" title="AI 功能"></a>AI 功能</h3><p>Termius 的 AI 命令生成，根本没法清晰理解一个三单词句子的意图。至今没有能用的 Agent 功能。</p><p>我很赞同 gloriaops.com 的理念。Agent 应该部署在客户端，而不是在每个 树莓派&#x2F;VPS 上装一份 Claude Code。gloriaops 方向是对的，但已经多久了还没法用？</p><p>说实话 Termius 根本不该在 AI 领域再造轮子。它应该做一个 backed by a company 的 ssh-use MCP，然后让用户自己接入 Claude Code。</p><h3 id="垃圾-CRDT-同步实现"><a href="#垃圾-CRDT-同步实现" class="headerlink" title="垃圾 CRDT 同步实现"></a>垃圾 CRDT 同步实现</h3><p>我想不出任何理由，Termius 值得用 CRDT。<br>这种软件不应该产生什么同步冲突，我不会在两台电脑上同时编辑一个 ssh 主机的密码！<br>我相信 Last-Write-Wins 适用于 100% 的情况，<br>真的遇到 101% 的情况，遇到同步冲突，你应该直接导出两个版本的数据，然后直接让用户选择覆盖，<br>或者你直接把 git 提供给用户，<br>无数选择都比现在的 CRDT 好太多了</p><p>Termius 的工程实现，很明显是随着一个个需求的增加，而越来越屎山的鲜明例子。</p><h3 id="注入脚本"><a href="#注入脚本" class="headerlink" title="注入脚本"></a>注入脚本</h3><p>Termius 往 shell 里注入的那些自动补全、Detect OS 脚本，写得相当粗糙。每次按 Ctrl+R 想搜历史命令，总能翻到 Termius 拉的大屎。那个自动补全蠢得爆炸——谁想要按 下箭头 触发自动补全？？</p><h3 id="触摸支持"><a href="#触摸支持" class="headerlink" title="触摸支持"></a>触摸支持</h3><p>滑动屏幕触发上下左右？双击屏幕是 Tab？</p><p>我用 Termux + OpenSSH，在远程主机上开 nvim，光标定位、滚动页面都非常自然，跟本地一样。Termius 的触摸支持相比之下就是灾难。</p><video controls>  <source src="https://gitlab.com/jiesou/Blog-Cdn/-/raw/main/img/2026/07/1784052661808-VID_20260715_011406_625.mp4" type="video/mp4"></video><p>Termius 双击是 Tab、点击触摸却不响应<br>好好的触摸支持没有，往下滚动就按下键，导致的效果就是手机上和 macOS “自然滚动”一样，反地滚动。</p><video controls>  <source src="https://cdn.jiecs.top/img/2026/07/1784053566468-VID_20260715_011405_051.mp4" type="video/mp4"></video><p>我不奢求多好的移动端体验。但 Termux 作为一个”正常”的终端软件，做正常的触摸支持，就非常足够了。</p><h3 id="回车"><a href="#回车" class="headerlink" title="回车"></a>回车</h3><p>移动端，回车键的行为也很迷，有时是 Ctrl+J，有时是 Ctrl+H。</p><p>中间不知道哪次更新就变了成了 Ctrl+J。别的地方看似没有问题，但 <code>nano</code> 里没法确认文件名：</p><video controls>  <source src="https://cdn.jiecs.top/img/2026/07/1784053802168-VID_20260715_022859_880.mp4" type="video/mp4"></video><p>没有任何警示，没有任何更新日志。隐式的行为变更是最可怕的。</p><hr><p>Anyway，还好前人的工作已经铺好了路：</p><ul><li><a href="https://github.com/ZacharyZcR/termius-exporter">ZacharyZcR&#x2F;termius-exporter</a> —— 完成了对 Termius 加密方案和 LevelDB 格式的逆向</li><li><a href="https://github.com/LXiuu/termius-data-exporter">LXiuu&#x2F;termius-data-exporter</a> —— 更新的 fork，支持 Termius 9.x，LevelDB 解析加身份匹配</li></ul><p>我让 LLM 加以改造：</p><p>→ <a href="https://github.com/jiesou/YATermiusExporter">YATermiusExporter</a></p><p>产出符合我自己需求格式的数据。</p><h2 id="新世界的方案"><a href="#新世界的方案" class="headerlink" title="新世界的方案"></a>新世界的方案</h2><p>告别 Termius 之后：</p><ul><li><strong>配置管理</strong>: 全部放进 <code>~/.ssh/config</code>，chezmoi 同步。之前困在 Termius 就是因为只有它有移动端同步，现在 Termux + OpenSSH + chezmoi 完美替代。</li><li><strong>安卓 SSH</strong>: Termux + OpenSSH。触摸体验比 Termius 好太多，手机上 tmux、nvim 都很”native”，用过才会知道有多爽，点一下，光标就过去了，拖动也非常自然，没有滑动变翻页、双击变 Tab 的破事。</li><li><strong>Agent 集成</strong>: 关键代码片段丢进 agent skills，LLM 自己调。可以搭好玩的东西，手机上用自然语言同时控多台机器。</li></ul><p>以上所有问题，实际上都是 Termius 的作风问题。这完全是一个靠 Mac&#x2F;iOS 的傻屌付费用户支撑起来的伪公司，管理层的作风有大问题。</p><p>不依赖任何封闭专有技术，体验比付费软件好得多。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>快对资料下载</title>
      <link>https://www.jiecs.top/archives/18d749c9/</link>
      <description>
        <![CDATA[<p><a href="https://github.com/JiGuroLGC/KuaiSnap">https://github.com/JiGuroLGC/KuaiSnap</a><br>这位 JiGuro 大佬的“快怼”很强<br>由于混淆，基本只适用于 6.77.0 版本]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      <pubDate>Mon, 06 Jul 2026 23:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><a href="https://github.com/JiGuroLGC/KuaiSnap">https://github.com/JiGuroLGC/KuaiSnap</a><br>这位 JiGuro 大佬的“快怼”很强<br>由于混淆，基本只适用于 6.77.0 版本的快对。可以从 APK Pure 下载 6.77 版的 快对： <a href="https://apkpure.com/cn/kuai-dui/com.kuaiduizuoye.scan/download/6.77.0">https://apkpure.com/cn/kuai-dui/com.kuaiduizuoye.scan/download/6.77.0</a></p><p><img src="https://cdn.jiecs.top/img/2026/07/1783350154170--6224036631799337494_119.webp"><br>现在快对 vip 都只能一天下载 5 张<br>这个模块直接全爬下来</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>金士顿 SA400 固态掉固件通病 解决</title>
      <link>https://www.jiecs.top/archives/b45493a8/</link>
      <description>
        <![CDATA[<p>完整型号：Kingston SA400S37&#x2F;240GCN<br>正反贴颗粒，总共是 240G<br>主控是群联 PHISON PS3111-S11-13</p>
<p>有掉固件通病，具体表现为：</p>
<ul>
<li>设备管理器&#x2F;BIOS 识别硬盘]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E7%AE%80%E5%8D%95%E6%95%99%E7%A8%8B/">简单教程</category>
      <category domain="https://www.jiecs.top/tags/%E6%95%99%E7%A8%8B/">教程</category>
      <category domain="https://www.jiecs.top/tags/%E6%8A%80%E6%9C%AF/">技术</category>
      <category domain="https://www.jiecs.top/tags/%E7%94%B5%E5%AD%90/">电子</category>
      <pubDate>Fri, 26 Jun 2026 17:08:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>完整型号：Kingston SA400S37&#x2F;240GCN<br>正反贴颗粒，总共是 240G<br>主控是群联 PHISON PS3111-S11-13</p><p>有掉固件通病，具体表现为：</p><ul><li>设备管理器&#x2F;BIOS 识别硬盘为 <code>SATAFIRM S11</code></li><li>Disk Genius&#x2F;磁盘管理 可以识别到硬盘，容量显示正常 240G，处于未分区状态</li><li>尝试分区格式化，软件无响应卡死报错</li></ul><p><img src="https://cdn.jiecs.top/img/2026/06/1782468902632-image.webp" alt="外壳标签"><br><img src="https://cdn.jiecs.top/img/2026/06/1782466819477-7bcce3f74b5a393bfed95e108c506276.webp" alt="硬盘PCB"><br><img src="https://cdn.jiecs.top/img/2026/06/1782466825143-a6be182bd5ffb2cbc7448a8998ac870c.webp" alt="硬盘PCB"></p><blockquote><p>以下主要参考<br><a href="https://www.chinafix.com/thread-1331348-1-1.html">https://www.chinafix.com/thread-1331348-1-1.html</a><br><a href="https://www.usbdev.ru/files/phison/ps3111fw">https://www.usbdev.ru/files/phison/ps3111fw</a><br><a href="https://www.cnblogs.com/JohnDoe8787/p/14424442.html">https://www.cnblogs.com/JohnDoe8787/p/14424442.html</a></p></blockquote><blockquote><p>这个流程 <strong>不会保留数据</strong>，仅恢复正常硬盘读写功能<br>要保留数据请找正规数据恢复，用 PC-3000 等付费专业软件</p></blockquote><h2 id="尝试过程"><a href="#尝试过程" class="headerlink" title="尝试过程"></a>尝试过程</h2><p>首先需要有一个 <strong>原生 SATA</strong> 并且设置为仿真 AHCI 总线的电脑（大多数情况都是 AHCI，就是 BIOS 里没有设置主板处理 RAID）</p><ul><li>USB 转 SATA 99% 是不行的</li><li>仿真 IDE 总线模式估计也比较困难</li></ul><h3 id="百度贴吧-简易工具"><a href="#百度贴吧-简易工具" class="headerlink" title="百度贴吧 简易工具"></a>百度贴吧 简易工具</h3><p>先尝试的百度贴吧 <a href="https://tieba.baidu.com/p/7974338490">https://tieba.baidu.com/p/7974338490</a> 分享的简易工具，参考其指引</p><blockquote><p>简易工具也可参考 <a href="https://www.bilibili.com/video/BV17s4y1y7Xy">https://www.bilibili.com/video/BV17s4y1y7Xy</a></p></blockquote><ul><li>尝试“良品固件”，启动后能识别到硬盘，识别出固件是 <code>SBFMP1W3</code>，据说固件倒数第二位W意思是写保护了。然后乱码，直接就 Done 结束了</li><li>尝试“不良品固件”，也可以识别出 <code>SBFMP1W3</code>，但随后提示：工具只适用于已 写保护（write protection）的硬盘，我的硬盘没有 write protection。不明所以</li></ul><p>总之简易工具对我的硬盘似乎不行</p><h3 id="fw-exe-方案"><a href="#fw-exe-方案" class="headerlink" title="fw.exe 方案"></a>fw.exe 方案</h3><p>然后，顺着博客园文章 <a href="https://www.cnblogs.com/JohnDoe8787/p/14424442.html">https://www.cnblogs.com/JohnDoe8787/p/14424442.html</a> 的指引</p><ul><li><p>flasher 开卡（烧录）软件<br>找到： <a href="http://vlo.name:3000/ssdtool">http://vlo.name:3000/ssdtool</a> （此链接在图吧工具箱 2026 版中也有提供）<br>这里可以下载 <a href="http://vlo.name:3000/tmph/s11-flasher.rar">Phison S11 firmware flasher v2</a> 得到 s11-flasher.rar<br>这个是适用于 S11 的固件开卡软件<br>文档在 <code>s11-flasher2-readme.txt</code> 可结合参考</p></li><li><p>固件<br>找到： <a href="https://www.usbdev.ru/files/phison/ps3111fw">https://www.usbdev.ru/files/phison/ps3111fw</a><br>下方的 <code>СКАЧАТЬ \ DOWNLOAD</code> 章节里，可以下载所有固件合集的打包  <a href="https://www.usbdev.ru/?wpfb_dl=6583">firmware_ps3111.rar</a><br>这个 usbdev.ru 俄罗斯论坛应该是对免费的游客下载有限速，只能 50k&#x2F;s 下载，也没法多线程</p></li></ul><p>下完之后，尝试博客园提到的 <code>SBFK71F1_27062019.BIN</code> 无果</p><p>想起迅维网文章： <a href="https://www.chinafix.com/thread-1331348-1-1.html">https://www.chinafix.com/thread-1331348-1-1.html</a></p><p>顺着迅维网提到的 <code>SBFMP1.3_19042021.BIN</code> 成功了！</p><blockquote><p>根据硬盘型号小变体，可以多尝试几个不同的固件</p></blockquote><h2 id="具体流程"><a href="#具体流程" class="headerlink" title="具体流程"></a>具体流程</h2><ol><li>解压 <code>s11-flasher.rar</code></li><li>解压 <code>firmware_ps3111.rar</code>，找到 <code>SBFMP1.3_19042021.BIN</code> 固件。重命名成 <code>fw.bin</code>，放进 s11-flasher 的文件夹里</li><li>运行 <code>s11-flasher2-micron.cmd</code>。一个黑框框闪过，它会生成（释放）一个 <code>fw.exe</code></li></ol><p>此时直接烧，在我的硬盘上不行。先进入 ROM Mode（出厂开卡模式）。具体流程：<br>4. 电脑关机拔电，用镊子短接硬盘上，最明显的两个短接点：<br><img src="https://cdn.jiecs.top/img/2026/06/1782467143203-image.webp" alt="短接点"><br>5. <strong>短接后上电</strong>：保持短接，同时电脑上电开机。上电后，开机过程中，松开短接<br>6. 开机后，设备管理器里，看到一个 PS3111 啥的设备。磁盘管理显示它的空间是 20M。即说明成功进入 ROM Mode</p><p>然后继续<br>7. 运行第三步生成出的 <code>fw.exe</code>，出现 GUI 窗口<br>8. 点大大的绿色 Upgrade Firmware。等进度走完<br>9. 出现此界面，即更新固件成功！<br><img src="https://cdn.jiecs.top/img/2026/06/1782468572872-%E7%8F%8D%E8%97%8F.webp" alt="Update Successful"><br>10. 跟随指引重启电脑，完美识别到硬盘🎉</p><p>一个下午白捡一个 240G 固态，还是很爽的😋</p><h2 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h2><ul><li>根据硬盘型号小变体，可以多尝试几个不同的固件</li><li>有些教程说必须要在 PE 模式下运行开卡工具。实际测试下来是没有严格要求的，只是有些时候 PE 会方便一些，没有杀软干扰之类的</li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>通过 distrobox 在任何发行版安装如意玲珑</title>
      <link>https://www.jiecs.top/archives/ab866b92/</link>
      <description>
        <![CDATA[<h2 id="首先"><a href="#首先" class="headerlink" title="首先"></a>首先</h2><blockquote>
<p>我很期待一个以 Flatpak 或者 Homebrew 发行的 <code>ll-cli</code>。</p>]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E7%AE%80%E5%8D%95%E6%95%99%E7%A8%8B/">简单教程</category>
      <category domain="https://www.jiecs.top/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      <category domain="https://www.jiecs.top/tags/%E6%88%91%E7%9A%84%E7%94%B5%E8%84%91/">我的电脑</category>
      <category domain="https://www.jiecs.top/tags/Linux/">Linux</category>
      <pubDate>Wed, 06 May 2026 18:34:59 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="首先"><a href="#首先" class="headerlink" title="首先"></a>首先</h2><blockquote><p>我很期待一个以 Flatpak 或者 Homebrew 发行的 <code>ll-cli</code>。</p></blockquote><p>如意玲珑虽然宣称是支持各种发行版，但实际目前还是比较混乱，尤其不适合 <a href="https://projectbluefin.io/">Bluefin</a> 和 <a href="https://vanillaos.org/">VanillaOS</a> 这种不可变系统，因此还是需要 distrobox</p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><blockquote><p>系统环境为 Bluefin Linux (based-on Fedora Silverblue)</p></blockquote><p>创建 distrobox 使用的是这个 image</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash">distrobox create --image ghcr.io/ublue-os/ubuntu-toolbox:latest --name box-ubuntu --init --no-entry<br></code></pre></td></tr></table></figure><p>当前的 latest 应该是 26.04 (LTS)<br>这里用的 <code>ubuntu-toolbox</code> 是 ublue 项目优化后的 ubuntu image，原版 ubuntu image 应当也没有大问题<br>distrobox 的 flag 根据需求设置：</p><ul><li><code>--init</code> 添加 systemd 支持</li><li><code>--no-entry</code> 不为容器添加专门桌面条目</li></ul><p>进入容器命令行之后，正常 apt install 即可</p><p>但是玲珑的生态还是太乱了，目前 <code>ci.deepin.com</code> 官方源还不支持 ubuntu 26，还停留在 ubuntu 25.10，软件源上次更新是 3 月 19 日</p><p>由于 HanHan666666&#x2F;linglong-installer 的图形化安装器在容器下运行也有些乱七八糟的问题<br>这里参考 <a href="https://github.com/HanHan666666/linglong-installer/blob/4dd23bb575c74d35e903bb1372c4a1147ddff048/scripts/distros/ubuntu_26.04.sh">https://github.com/HanHan666666/linglong-installer/blob/4dd23bb575c74d35e903bb1372c4a1147ddff048/scripts/distros/ubuntu_26.04.sh</a><br>提供以下在 ubuntu 26.04 安装如意玲珑的命令，不需要图形化安装器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> install -d -m 0755 /usr/share/keyrings<br>curl -fsSL https://obs-ci.odata.cc/obs-mirror/xUbuntu_26.04/Release.key \<br>  | gpg --dearmor | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> /usr/share/keyrings/obs-ubuntu2604.gpg &gt;/dev/null<br><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&quot;deb [arch=<span class="hljs-subst">$(dpkg --print-architecture)</span> signed-by=/usr/share/keyrings/obs-ubuntu2604.gpg] \</span><br><span class="hljs-string">https://obs-ci.odata.cc/obs-mirror/xUbuntu_26.04/ ./&quot;</span> \<br>| <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> /etc/apt/sources.list.d/obs-ubuntu2604.list<br><span class="hljs-built_in">sudo</span> apt update<br><span class="hljs-built_in">sudo</span> apt install -y linglong-bin<br>📦[chen@box-ubuntu ~]$ ll-cli list<br>ID                                         名称                             版本            渠道            模块        描述<br></code></pre></td></tr></table></figure><h2 id="Post-fix-Workaround"><a href="#Post-fix-Workaround" class="headerlink" title="Post-fix &amp; Workaround"></a>Post-fix &amp; Workaround</h2><h3 id="第一个问题：安装时没法正确鉴权"><a href="#第一个问题：安装时没法正确鉴权" class="headerlink" title="第一个问题：安装时没法正确鉴权"></a>第一个问题：安装时没法正确鉴权</h3><p>解决方案参考： <a href="https://gitee.com/spark-store-project/spark-store/issues/IBML1L">https://gitee.com/spark-store-project/spark-store/issues/IBML1L</a><br>即在 distrobox 容器内执行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;#!/bin/sh</span><br><span class="hljs-string">sudo &quot;$@&quot;&#x27;</span> | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> /usr/local/bin/pkexec<br><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chmod</span> +x /usr/local/bin/pkexec<br><br><span class="hljs-built_in">echo</span> <span class="hljs-string">&#x27;#!/bin/sh</span><br><span class="hljs-string">sudo &quot;$@&quot;&#x27;</span> | <span class="hljs-built_in">sudo</span> <span class="hljs-built_in">tee</span> /usr/bin/pkexec<br><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">chmod</span> +x /usr/bin/pkexec<br></code></pre></td></tr></table></figure><p>将 pkexec 偷梁换柱为普通 sudo</p><p>这是因为原本正常安装的玲珑，应当在安装过程中通过 <code>pkexec</code> 提升到 root 权限，因为这样可以跳出一个 askpass 图形界面请求用户输入密码。而在容器中一般直接使用 <code>sudo</code>，<code>pkexec</code> 由于各种原因往往没法正常工作。不是完全不可以，但挺麻烦的</p><p>所以以上命令能替换 <code>/usr/local/bin/pkexec</code> 的内容为一个脚本，直接原地将命令丢给 sudo</p><p>同时呢，有些应用比如 OpenCode Desktop 的安装过程会写死 pkexec 的目录，因此我们需要同时替换 <code>/usr/local/bin/pkexec</code> 和 <code>/usr/bin/pkexec</code> 两个目录</p><h3 id="第二个问题：钉钉跑起来界面没有"><a href="#第二个问题：钉钉跑起来界面没有" class="headerlink" title="第二个问题：钉钉跑起来界面没有"></a>第二个问题：钉钉跑起来界面没有</h3><p>钉钉能跑，但界面没有</p><p>在我的情况下是 mesa 驱动啥的有问题，不是 distrobox 的问题<br>跳过 <code>/opt/apps/com.alibabainc.dingtalk/files/Elevator.sh</code> 直接</p><pre><code class="language-bash">ll-cli run com.alibabainc.dingtalk -- bashcd /opt/apps/com.alibabainc.dingtalk/files/7.6.45-Release.5032501LIBGL_ALWAYS_SOFTWARE=1 ./com.alibabainc.dingtalk</code></pre><p>可以解决</p><p>但是玲珑版的钉钉已经年久失修了，还是 7.6.45.5032502，官方版的钉钉也有一套自己的容器兼容层，容器套容器有问题<br>当前建议用 AUR 的钉钉，目前是 8.1.0.6021101，distrobox arch 容器开箱即用没有任何问题</p><h4 id="第三个问题：玲珑客户端应用商店提示玲珑没装"><a href="#第三个问题：玲珑客户端应用商店提示玲珑没装" class="headerlink" title="第三个问题：玲珑客户端应用商店提示玲珑没装"></a>第三个问题：玲珑客户端应用商店提示玲珑没装</h4><p>com.dongpl.linglong-store.v2 这个 V2 客户端应用商店依赖 dbus 啥的总之就是不行<br>办法就是没有办法，玲珑生态就是一坨<br>用 <code>ll-cli</code> 去吧，不带图形化界面也能用</p><hr><p>折腾玲珑一天的结论就是 玲珑不是啥好东西</p><ul><li>生态分裂，一个应用商店分出 V1 V2 极速版</li><li>全靠社区，至今 ubuntu 26 lts 的支持居然还要靠 <code>odata.cc</code> 这个社区自己建的 repo，deepin 官方不知道干什么吃的管生不管养， <code>ci.deepin.com</code> 还停留在 ubuntu 25.10，软件源上次更新是 3 月 19 日</li><li>下载慢，没多线程，而且也是从 <code>obs-ci.odata.cc</code> 下的</li></ul><p>还是老老实实用星火应用商店吧，也不要用 APM&#x2F;ACE 容器，星火应用商店本身对 distrobox 的支持还是不错的，起码考虑过在容器里跑</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>希沃 MT11  插板式计算机内部结构分析以及不带主板开机</title>
      <link>https://www.jiecs.top/archives/3c47b44b/</link>
      <description>
        <![CDATA[<p>MT11 基于 3x16&#x3D;48P 排针，非更新款标准的 OCP 接口</p>
<h3 id="1-19V-DCIN-被正面入口处的-MOS-截掉了"><a href="#1-19V-DCIN-被正面入口处的-MOS-截掉了" class="headerlink"]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%8A%80%E6%9C%AF/">技术</category>
      <category domain="https://www.jiecs.top/tags/%E7%94%B5%E5%AD%90/">电子</category>
      <pubDate>Wed, 29 Apr 2026 12:51:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>MT11 基于 3x16&#x3D;48P 排针，非更新款标准的 OCP 接口</p><h3 id="1-19V-DCIN-被正面入口处的-MOS-截掉了"><a href="#1-19V-DCIN-被正面入口处的-MOS-截掉了" class="headerlink" title="1. 19V DCIN 被正面入口处的 MOS 截掉了"></a>1. 19V DCIN 被正面入口处的 MOS 截掉了</h3><p>会导致上电一丁点电流都没有，待机5V3V也没有。应该是起到插入检测的作用防止 19V 打火什么的<br>MOS 是 AO4413 PMOS 的 G 级悬空电位 18.1V，在外侧需要端上两个点，其中靠近接口中间的是 GND，保守一点可以用 10K 去短，总之把 G 拉低导通即可：<img src="https://cdn.jiecs.top/img/2026/04/1777461558435-image.webp"><br>图源自 <a href="https://www.douyin.com/video/7446366168165797155">https://www.douyin.com/video/7446366168165797155</a> 评论区<br>G 级拉低，短上之后可以见到 6mA 左右的待机电流，以及待机 5V3V</p><h3 id="2-无开机按钮开机"><a href="#2-无开机按钮开机" class="headerlink" title="2. 无开机按钮开机"></a>2. 无开机按钮开机</h3><p>主板拆起来不是很方便，EC 在 PCB 背面，是 IT8772E<br><img src="https://cdn.jiecs.top/img/2026/04/1777461836773-image.webp"><br>如图 33 角 PANSWH 即为接电源按钮的管脚，拉低开机</p><p>然而这个管脚外面通过了一个 MOS，丝印 702，应为 2N7002，即图中的飞上线了的这颗 Q82：<br><img src="https://cdn.jiecs.top/img/2026/04/1777461311825-27b50454a70c65eba64fc11a8698a50a.webp"><br>总之需要让这个 MOS 导通才能触发 PANSWH<br>这个 MOS 连到外面 48P 连接器的某个脚上（见以上“接开关”的图），然后要给这个脚输入 5V <strong>拉高</strong> 方可开机</p><p>F2 进 BIOS，F7 进启动菜单</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>修复 Linux 桌面 U 盘 cache 特别激进</title>
      <link>https://www.jiecs.top/archives/8301404/</link>
      <description>
        <![CDATA[<blockquote>
<p>参考<br><a href="https://github.com/storaged-project/udisks/issues/1177">https://github.com/storaged-project/udisks/issues/117]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%95%99%E7%A8%8B/">教程</category>
      <category domain="https://www.jiecs.top/tags/Linux/">Linux</category>
      <category domain="https://www.jiecs.top/tags/TipsTricks/">TipsTricks</category>
      <pubDate>Sat, 11 Apr 2026 14:27:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>参考<br><a href="https://github.com/storaged-project/udisks/issues/1177">https://github.com/storaged-project/udisks/issues/1177</a><br><a href="https://github.com/storaged-project/udisks/issues/1368">https://github.com/storaged-project/udisks/issues/1368</a><br><a href="https://github.com/biglinux/usb-dirty-pages-udev">https://github.com/biglinux/usb-dirty-pages-udev</a></p></blockquote><p>默认情况下，Linux 的 <code>udisks2</code> 或内核对 USB 设备的缓存策略比较激进。</p><ul><li><strong>现象</strong>：向 U 盘拷贝大文件时，进度条速度会有 100M&#x2F;s 多非常离谱的数据，但随后弹出 U 盘，系统会告诉用户不能拔，还要拷贝很久，中间系统会用 sync 死等，都看不到传输进度。</li><li>实际情况下：拷贝特别大的文件，比如超过 1.6G 的时候，会看到那个非常离谱的速度逐渐降下来，就是内存逐步回写到 U 盘里，但往往还是传输完成还要等很久回写，依然很烦</li></ul><h3 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h3><p>通过 <code>udev</code> 规则干预内核的 <strong>BDI (Backing Device Info)</strong> 参数：</p><ul><li><strong><code>max_bytes</code></strong>: 限制该设备在内存中最多能积压的脏数据量（本方案设为 <strong>16MiB</strong>）</li><li><strong><code>strict_limit</code></strong>: 强制执行上述限制。如果不开启，系统可能会因为内存充足而允许超过 <code>max_bytes</code> 的限制</li></ul><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><ol><li>创建 udev rules</li></ol><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs arduino">sudo -E nano /etc/udev/rules.d/<span class="hljs-number">99</span>-udisk-flush-max-bytes.rules<br></code></pre></td></tr></table></figure><ol start="2"><li>填入</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs rules"># See: https://www.jiecs.top/archives/8301404, https://github.com/storaged-project/udisks/issues/1177#issuecomment-3914044213<br>ACTION==&quot;add&quot;, SUBSYSTEM==&quot;block&quot;, ENV&#123;ID_BUS&#125;==&quot;usb&quot;, ENV&#123;DEVTYPE&#125;==&quot;partition&quot;, \<br>RUN+=&quot;/bin/sh -c &#x27; \<br>    DEVICE_MAJOR_MINOR=$$(cat /sys/class/block/%k/../dev); \<br>    echo 16777216 &gt; /sys/class/bdi/$$DEVICE_MAJOR_MINOR/max_bytes; \<br>    echo 1 &gt; /sys/class/bdi/$$DEVICE_MAJOR_MINOR/strict_limit \<br>&#x27;&quot;<br></code></pre></td></tr></table></figure><ol start="3"><li>更新应用<br><code>sudo udevadm control --reload &amp;&amp; sudo udevadm trigger</code> 或者 <code>systemctl restart systemd-udev-trigger</code></li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>btrfs 原子级 sanpshot 回滚全流程</title>
      <link>https://www.jiecs.top/archives/c52efbd9/</link>
      <description>
        <![CDATA[<p>思路参考 btrfs-assistant</p>
<h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p><code>fdisk -l</code> 检查你的 btrfs 分区在 &#x2F]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%95%99%E7%A8%8B/">教程</category>
      <category domain="https://www.jiecs.top/tags/%E6%8A%80%E6%9C%AF/">技术</category>
      <category domain="https://www.jiecs.top/tags/%E6%88%91%E7%9A%84%E7%94%B5%E8%84%91/">我的电脑</category>
      <category domain="https://www.jiecs.top/tags/Linux/">Linux</category>
      <pubDate>Fri, 10 Apr 2026 20:41:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>思路参考 btrfs-assistant</p><h2 id="准备"><a href="#准备" class="headerlink" title="准备"></a>准备</h2><p><code>fdisk -l</code> 检查你的 btrfs 分区在 &#x2F;dev 的位置，接下来以 <code>/dev/nvme1n1p3</code> btrfs 分区为例</p><h2 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h2><ol><li>临时挂载 btrfs 顶层根</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mkdir</span> -p /mnt/btrfsroot<br><span class="hljs-built_in">sudo</span> mount -t btrfs -o subvolid=5 /dev/nvme1n1p3 /mnt/btrfsroot<br></code></pre></td></tr></table></figure><p>这样可以 live 修改</p><blockquote><p>修改的同时内核挂载的 <code>/var</code> 完全感知不到，已打开的文件描述符、dentry 缓存、mount 表都不受影响。内核挂载是绑定在 subvolid 上的，不是绑定在路径字符串上的。</p></blockquote><ol start="2"><li>临时 mv 到 <code>_backup_restore</code></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mv</span> /mnt/btrfsroot/@var /mnt/btrfsroot/@var_backup_restore<br></code></pre></td></tr></table></figure><blockquote><p>由于 snapshot 的时候嵌套 subvolume 不会自动处理，所以这里需要先 mv 一下，这样可以保留里面的嵌套 subvolume</p></blockquote><ol start="3"><li>执行恢复</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> btrfs subvolume snapshot \<br>/mnt/btrfsroot/@var_backup_restore/.snapshots/before-niri \<br>/mnt/btrfsroot/@var<br></code></pre></td></tr></table></figure><hr><p>接下来如果要恢复 home也是一样</p><ol><li>临时 mv 到 <code>_backup_restore</code></li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mv</span> /mnt/btrfsroot/@home/mnt/btrfsroot/@home_backup_restore<br></code></pre></td></tr></table></figure><ol start="2"><li>执行恢复</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sudo</span> btrfs subvolume snapshot \<br>/mnt/btrfsroot/@home_backup_restore/.snapshots/before-niri \<br>/mnt/btrfsroot/@home<br></code></pre></td></tr></table></figure><hr><h3 id="嵌套-subvolume-的处理"><a href="#嵌套-subvolume-的处理" class="headerlink" title="嵌套 subvolume 的处理"></a>嵌套 subvolume 的处理</h3><p>这里以 SWAP 为例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-comment"># 一般已经有一个空的 Stub 了，就删掉</span><br><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">rmdir</span> /mnt/btrfsroot/@var/swap<br><span class="hljs-built_in">sudo</span> <span class="hljs-built_in">mv</span> /mnt/btrfsroot/@var_backup_restore/swap /mnt/btrfsroot/@var/swap<br></code></pre></td></tr></table></figure><h2 id="收尾"><a href="#收尾" class="headerlink" title="收尾"></a>收尾</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs bash"><span class="hljs-built_in">sync</span><br><span class="hljs-built_in">sudo</span> umount /mnt/btrfsroot<br>reboot<br></code></pre></td></tr></table></figure><p>确认没问题尽快重启<br>因为重启前系统运行时对 <code>/var</code> 的所有写入都进入了旧的子卷（现在叫 <code>..._backup_restore</code>），不会出现在恢复后的 <code>var</code> 里。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>ESP-IDF include 头文件 C++ IntelliSense 飘红解决</title>
      <link>https://www.jiecs.top/archives/671b051e/</link>
      <description>
        <![CDATA[<ol>
<li>打开命令面板，执行 <code>idf.py reconfigure</code></li>
<li>打开命令面板，执行 <code>ESP-IDF: Add VS Code Configuration Folder</code>，或者扩展面板中执行 <code]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/">嵌入式</category>
      <category domain="https://www.jiecs.top/tags/TipsTricks/">TipsTricks</category>
      <category domain="https://www.jiecs.top/tags/%E7%94%B5%E5%AD%90/">电子</category>
      <pubDate>Wed, 01 Apr 2026 17:26:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<ol><li>打开命令面板，执行 <code>idf.py reconfigure</code></li><li>打开命令面板，执行 <code>ESP-IDF: Add VS Code Configuration Folder</code>，或者扩展面板中执行 <code>Add .vscode subdirectory files</code></li><li>仍然飘红，在 <code>.vscode/c_cpp_properties.json</code> 的配置中添加 <code>&quot;compileCommands&quot;: &quot;${workspaceFolder}/build/compile_commands.json&quot;</code><br> 形如：</li></ol><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs json"><span class="hljs-punctuation">&#123;</span><br>  <span class="hljs-attr">&quot;configurations&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><br>    <span class="hljs-punctuation">&#123;</span><br>      <span class="hljs-attr">&quot;name&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;Linux&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;includePath&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><br>        <span class="hljs-string">&quot;$&#123;workspaceFolder&#125;/**&quot;</span><br>      <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;defines&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;cStandard&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;c17&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;cppStandard&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;gnu++17&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;intelliSenseMode&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;linux-gcc-x64&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;compilerPath&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;/var/home/chen/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20250707/xtensa-esp-elf/bin/xtensa-esp32-elf-gcc&quot;</span><span class="hljs-punctuation">,</span><br>      <span class="hljs-attr">&quot;compileCommands&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;$&#123;workspaceFolder&#125;/build/compile_commands.json&quot;</span><br>    <span class="hljs-punctuation">&#125;</span><br>  <span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span><br>  <span class="hljs-attr">&quot;version&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-number">4</span><br><span class="hljs-punctuation">&#125;</span><br></code></pre></td></tr></table></figure>]]>
      </content:encoded>
    </item>
    <item>
      <title>Lerobot 深度研究：Dynamixel 兼容性与 DIY 方案全解析</title>
      <link>https://www.jiecs.top/archives/4c3d228a/</link>
      <description>
        <![CDATA[<h1 id="Lerobot-深度研究：Dynamixel-兼容性与-DIY-方案全解析"><a href="#Lerobot-深度研究：Dynamixel-兼容性与-DIY-方案全解析" class="headerlink" title="Lerobot 深度研究：Dynam]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      <category domain="https://www.jiecs.top/tags/%E6%8A%80%E6%9C%AF/">技术</category>
      <category domain="https://www.jiecs.top/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/">嵌入式</category>
      <category domain="https://www.jiecs.top/tags/AI/">AI</category>
      <pubDate>Sun, 15 Mar 2026 18:50:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h1 id="Lerobot-深度研究：Dynamixel-兼容性与-DIY-方案全解析"><a href="#Lerobot-深度研究：Dynamixel-兼容性与-DIY-方案全解析" class="headerlink" title="Lerobot 深度研究：Dynamixel 兼容性与 DIY 方案全解析"></a>Lerobot 深度研究：Dynamixel 兼容性与 DIY 方案全解析</h1><h2 id="TL-DR-结论"><a href="#TL-DR-结论" class="headerlink" title="TL;DR 结论"></a>TL;DR 结论</h2><p><strong>Dynamixel 与 Lerobot 完全兼容！</strong> Lerobot 官方原生支持 Dynamixel 电机，是生态中最成熟的方案之一。但如果你追求性价比，SO-ARM101 + Feetech 是入门首选；如果追求性能，OpenArm + Damiao&#x2F;RobStride 是进阶选择。</p><hr><h2 id="1-Lerobot-是什么？"><a href="#1-Lerobot-是什么？" class="headerlink" title="1. Lerobot 是什么？"></a>1. Lerobot 是什么？</h2><p>LeRobot 是 Hugging Face 开源的真实世界机器人学习平台，提供：</p><ul><li><strong>预训练模型</strong>：ACT、Diffusion Policy、VQ-BeT、Pi0.5、GR00T N1.5、SmolVLA</li><li><strong>数据集</strong>：大量人类演示数据</li><li><strong>工具链</strong>：PyTorch 训练、仿真环境、硬件控制</li></ul><p>官网：<a href="https://github.com/huggingface/lerobot">https://github.com/huggingface/lerobot</a></p><hr><h2 id="2-Dynamixel-兼容性分析"><a href="#2-Dynamixel-兼容性分析" class="headerlink" title="2. Dynamixel 兼容性分析"></a>2. Dynamixel 兼容性分析</h2><h3 id="2-1-官方支持的-Dynamixel-型号"><a href="#2-1-官方支持的-Dynamixel-型号" class="headerlink" title="2.1 官方支持的 Dynamixel 型号"></a>2.1 官方支持的 Dynamixel 型号</h3><p>Lerobot 原生支持以下 Dynamixel 电机（仅 Protocol 2.0）：</p><table><thead><tr><th>型号</th><th>扭矩</th><th>价格区间</th><th>适用场景</th></tr></thead><tbody><tr><td>XL330-M077</td><td>0.48 Nm</td><td>$35-40</td><td>小型机器人、轻负载</td></tr><tr><td>XL330-M288</td><td>0.72 Nm</td><td>$35-40</td><td>小型机器人、轻负载</td></tr><tr><td>XL430-W250</td><td>1.4 Nm</td><td>$50-60</td><td>中型机器人、Koch v1.1</td></tr><tr><td>XM430-W350</td><td>4.0 Nm</td><td>$280-290</td><td>高性能机器人</td></tr><tr><td>XM540-W270</td><td>10.0 Nm</td><td>$420-430</td><td>工业级、高负载</td></tr><tr><td>XC430-W150</td><td>1.8 Nm</td><td>$55-65</td><td>中型机器人</td></tr></tbody></table><h3 id="2-2-控制器与-SDK"><a href="#2-2-控制器与-SDK" class="headerlink" title="2.2 控制器与 SDK"></a>2.2 控制器与 SDK</h3><ul><li><strong>U2D2</strong>：官方 USB 转 TTL&#x2F;RS485 控制器，约 $55-60</li><li><strong>Dynamixel SDK</strong>：Python API，<code>pip install dynamixel-sdk</code></li><li><strong>配置工具</strong>：Dynamixel Wizard 2.0（GUI 配置 ID、波特率等）</li></ul><h3 id="2-3-Lerobot-中的-Dynamixel-集成"><a href="#2-3-Lerobot-中的-Dynamixel-集成" class="headerlink" title="2.3 Lerobot 中的 Dynamixel 集成"></a>2.3 Lerobot 中的 Dynamixel 集成</h3><p>Lerobot 的 robot_devices 模块直接包含 Dynamixel 驱动。</p><hr><h2 id="3-Lerobot-生态系统全景"><a href="#3-Lerobot-生态系统全景" class="headerlink" title="3. Lerobot 生态系统全景"></a>3. Lerobot 生态系统全景</h2><h3 id="3-1-官方支持的机器人平台"><a href="#3-1-官方支持的机器人平台" class="headerlink" title="3.1 官方支持的机器人平台"></a>3.1 官方支持的机器人平台</h3><table><thead><tr><th>机器人</th><th>电机类型</th><th>自由度</th><th>价格范围</th><th>特点</th></tr></thead><tbody><tr><td>SO-ARM100&#x2F;101</td><td>Feetech STS3215</td><td>6-DOF</td><td>$220-240 (双臂套件)</td><td>入门首选，最便宜</td></tr><tr><td>Koch v1.1</td><td>Dynamixel XL430&#x2F;XL330</td><td>5-DOF</td><td>$250 单臂 &#x2F; $430 双臂</td><td>轻量级，官方推荐</td></tr><tr><td>ALOHA &#x2F; ALOHA 2</td><td>Dynamixel XL430&#x2F;XC430</td><td>6-DOF</td><td>$600-1000+</td><td>斯坦福双臂，研究级</td></tr><tr><td>OpenArm</td><td>Damiao CAN 总线</td><td>7-DOF</td><td>$1500-3000+</td><td>高性能，6kg 负载</td></tr><tr><td>LeKiwi</td><td>Feetech&#x2F;Dynamixel</td><td>移动平台</td><td>$500-800</td><td>全向移动 + 机械臂</td></tr></tbody></table><h3 id="3-2-社区项目（LeRobotDepot）"><a href="#3-2-社区项目（LeRobotDepot）" class="headerlink" title="3.2 社区项目（LeRobotDepot）"></a>3.2 社区项目（LeRobotDepot）</h3><ul><li><strong>WOWROBO Twinarm</strong>：Koch v1.1 改进版</li><li><strong>reBot-DevArm</strong>：支持 RobStride 和 Damiao 两种电机</li><li><strong>Piper 集成</strong>：国产机械臂 Lerobot 集成</li></ul><hr><h2 id="4-电机方案深度对比"><a href="#4-电机方案深度对比" class="headerlink" title="4. 电机方案深度对比"></a>4. 电机方案深度对比</h2><h3 id="4-1-入门级：Feetech-STS3215"><a href="#4-1-入门级：Feetech-STS3215" class="headerlink" title="4.1 入门级：Feetech STS3215"></a>4.1 入门级：Feetech STS3215</h3><ul><li><strong>价格</strong>：约 $20-25&#x2F;个</li><li><strong>扭矩</strong>：30kg (约 2.9 Nm)</li><li><strong>通信</strong>：TTL 串行总线</li><li><strong>优点</strong>：极致性价比，Lerobot 原生支持</li><li><strong>缺点</strong>：精度略低于 Dynamixel</li><li><strong>适用</strong>：SO-ARM100&#x2F;101，学习、原型</li></ul><h3 id="4-2-中级：Dynamixel-XL430-XL330"><a href="#4-2-中级：Dynamixel-XL430-XL330" class="headerlink" title="4.2 中级：Dynamixel XL430&#x2F;XL330"></a>4.2 中级：Dynamixel XL430&#x2F;XL330</h3><ul><li><strong>价格</strong>：$35-60&#x2F;个</li><li><strong>扭矩</strong>：0.5-1.4 Nm</li><li><strong>通信</strong>：TTL Protocol 2.0</li><li><strong>优点</strong>：ROBOTIS 品质，完善生态</li><li><strong>缺点</strong>：价格高于 Feetech</li><li><strong>适用</strong>：Koch v1.1，轻量级研究</li></ul><h3 id="4-3-高级：Dynamixel-XM430-XM540"><a href="#4-3-高级：Dynamixel-XM430-XM540" class="headerlink" title="4.3 高级：Dynamixel XM430&#x2F;XM540"></a>4.3 高级：Dynamixel XM430&#x2F;XM540</h3><ul><li><strong>价格</strong>：$280-430&#x2F;个</li><li><strong>扭矩</strong>：4-10 Nm</li><li><strong>优点</strong>：工业级性能，高扭矩</li><li><strong>缺点</strong>：价格昂贵</li><li><strong>适用</strong>：ALOHA，研究级应用</li></ul><h3 id="4-4-专业级：CAN-总线电机（RobStride-Damiao）"><a href="#4-4-专业级：CAN-总线电机（RobStride-Damiao）" class="headerlink" title="4.4 专业级：CAN 总线电机（RobStride &#x2F; Damiao）"></a>4.4 专业级：CAN 总线电机（RobStride &#x2F; Damiao）</h3><table><thead><tr><th>型号</th><th>扭矩</th><th>价格</th><th>特点</th></tr></thead><tbody><tr><td>RobStride 01</td><td>17 Nm 峰值</td><td>~$150</td><td>轻量级 QDD</td></tr><tr><td>RobStride 02</td><td>17 Nm</td><td>~$180</td><td>双编码器</td></tr><tr><td>RobStride 03</td><td>60 Nm</td><td>~$300</td><td>高扭矩</td></tr><tr><td>RobStride 04</td><td>120 Nm</td><td>~$300</td><td>工业级</td></tr><tr><td>Damiao 4310</td><td>~3 Nm</td><td>~$100</td><td>紧凑型</td></tr><tr><td>Damiao 4340</td><td>~10 Nm</td><td>~$200</td><td>高扭矩密度</td></tr><tr><td>Damiao 8009P</td><td>~50 Nm</td><td>~$350</td><td>交叉滚子轴承</td></tr></tbody></table><hr><h2 id="5-预训练模型与基座模型"><a href="#5-预训练模型与基座模型" class="headerlink" title="5. 预训练模型与基座模型"></a>5. 预训练模型与基座模型</h2><h3 id="5-1-模仿学习策略"><a href="#5-1-模仿学习策略" class="headerlink" title="5.1 模仿学习策略"></a>5.1 模仿学习策略</h3><table><thead><tr><th>模型</th><th>类型</th><th>特点</th></tr></thead><tbody><tr><td>ACT</td><td>Action Chunking Transformer</td><td>视觉-动作预测，适合精细操作</td></tr><tr><td>Diffusion Policy</td><td>扩散模型</td><td>多模态行为建模</td></tr><tr><td>VQ-BeT</td><td>Vector Quantized Behavior Transformer</td><td>离散动作空间</td></tr></tbody></table><h3 id="5-2-基座模型（Foundation-Models）"><a href="#5-2-基座模型（Foundation-Models）" class="headerlink" title="5.2 基座模型（Foundation Models）"></a>5.2 基座模型（Foundation Models）</h3><table><thead><tr><th>模型</th><th>来源</th><th>特点</th></tr></thead><tbody><tr><td><strong>Pi0.5</strong></td><td>Physical Intelligence</td><td>视觉-语言-动作模型</td></tr><tr><td><strong>GR00T N1.5</strong></td><td>NVIDIA</td><td>跨具身机器人基础模型，3B 参数</td></tr><tr><td><strong>SmolVLA</strong></td><td>Hugging Face</td><td>轻量级 VLA</td></tr></tbody></table><hr><h2 id="6-最佳-DIY-方案推荐"><a href="#6-最佳-DIY-方案推荐" class="headerlink" title="6. 最佳 DIY 方案推荐"></a>6. 最佳 DIY 方案推荐</h2><h3 id="6-1-入门级：SO-ARM101-方案"><a href="#6-1-入门级：SO-ARM101-方案" class="headerlink" title="6.1 入门级：SO-ARM101 方案"></a>6.1 入门级：SO-ARM101 方案</h3><p><strong>总成本：$220-300</strong></p><ul><li>Feetech STS3215 伺服电机 × 12（双臂）</li><li>Feetech 伺服控制板 × 2</li><li>3D 打印件（PLA&#x2F;PETG）</li></ul><p><strong>购买渠道</strong>：Seeed Studio $220-240 &#x2F; 淘宝 ¥600-800</p><h3 id="6-2-中级：Koch-v1-1-方案"><a href="#6-2-中级：Koch-v1-1-方案" class="headerlink" title="6.2 中级：Koch v1.1 方案"></a>6.2 中级：Koch v1.1 方案</h3><p><strong>总成本：$430-500（双臂）</strong></p><ul><li>Dynamixel XL430-W250 × 4</li><li>Dynamixel XL330-M288 × 8</li><li>U2D2 控制器 × 2</li></ul><p><strong>购买渠道</strong>：ROBOTIS 官网约 $430</p><h3 id="6-3-高级：OpenArm-方案"><a href="#6-3-高级：OpenArm-方案" class="headerlink" title="6.3 高级：OpenArm 方案"></a>6.3 高级：OpenArm 方案</h3><p><strong>总成本：$1500-3000+</strong></p><ul><li>Damiao 4310&#x2F;4340&#x2F;8009P 电机</li><li>CAN-FD USB 适配器</li><li>7-DOF，6kg 负载</li></ul><hr><h2 id="7-总结与建议"><a href="#7-总结与建议" class="headerlink" title="7. 总结与建议"></a>7. 总结与建议</h2><table><thead><tr><th>预算</th><th>推荐方案</th><th>适用场景</th></tr></thead><tbody><tr><td>$200-300</td><td>SO-ARM101 + Feetech</td><td>入门学习、原型验证</td></tr><tr><td>$400-600</td><td>Koch v1.1 + Dynamixel</td><td>轻量级研究</td></tr><tr><td>$600-1000</td><td>ALOHA 2</td><td>双臂操作研究</td></tr><tr><td>$1500+</td><td>OpenArm + Damiao</td><td>高性能研究</td></tr></tbody></table><h3 id="关键建议"><a href="#关键建议" class="headerlink" title="关键建议"></a>关键建议</h3><ol><li><strong>新手入门</strong>：SO-ARM101 是最佳选择</li><li><strong>Dynamixel 用户</strong>：Koch v1.1 或 ALOHA 是成熟方案</li><li><strong>追求性能</strong>：OpenArm + Damiao&#x2F;RobStride</li></ol><hr><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ul><li>LeRobot GitHub：<a href="https://github.com/huggingface/lerobot">https://github.com/huggingface/lerobot</a></li><li>SO-ARM100 GitHub：<a href="https://github.com/TheRobotStudio/SO-ARM100">https://github.com/TheRobotStudio/SO-ARM100</a></li><li>OpenArm 官网：<a href="https://openarm.dev/">https://openarm.dev</a></li><li>LeRobotDepot：<a href="https://github.com/maximilienroberti/lerobotdepot">https://github.com/maximilienroberti/lerobotdepot</a></li><li>创客智造教程：<a href="https://www.ncnynl.com/archives/202504/6697.html">https://www.ncnynl.com/archives/202504/6697.html</a></li></ul><p><em>研究时间：2026-03-15</em></p><hr><h2 id="12-开源电机方案（省钱路线）"><a href="#12-开源电机方案（省钱路线）" class="headerlink" title="12. 开源电机方案（省钱路线）"></a>12. 开源电机方案（省钱路线）</h2><p>你说得对，STS3215 一百块一个，12个电机要1200块，确实不便宜。这里有几个<strong>开源&#x2F;自制方案</strong>：</p><h3 id="12-1-SimpleFOC-云台电机方案（推荐）"><a href="#12-1-SimpleFOC-云台电机方案（推荐）" class="headerlink" title="12.1 SimpleFOC + 云台电机方案（推荐）"></a>12.1 SimpleFOC + 云台电机方案（推荐）</h3><p><strong>原理</strong>：用云台电机（Gimbal Motor）+ SimpleFOC 开源驱动板，自己搭一个”舵机”</p><p><strong>成本</strong>：</p><table><thead><tr><th>组件</th><th>单价</th><th>数量</th><th>总价</th></tr></thead><tbody><tr><td>云台电机 2804&#x2F;2805</td><td>¥50-70</td><td>6</td><td>¥300-420</td></tr><tr><td>SimpleFOC Shield 驱动板</td><td>¥80-100</td><td>3 (每板2电机)</td><td>¥240-300</td></tr><tr><td>磁编码器 AS5048A</td><td>¥25-35</td><td>6</td><td>¥150-210</td></tr><tr><td><strong>单臂总计</strong></td><td></td><td></td><td><strong>¥690-930</strong></td></tr></tbody></table><p><strong>优点</strong>：</p><ul><li>完全开源硬件 + 软件</li><li>SimpleFOC 库成熟，Arduino 生态</li><li>云台电机扭距大、响应快</li></ul><p><strong>缺点</strong>：</p><ul><li>需要自己组装、调试</li><li>与 Lerobot 集成需要写驱动</li><li>没有现成的遥操作方案</li></ul><p><strong>资源</strong>：</p><ul><li>SimpleFOC 官网：<a href="https://simplefoc.com/">https://simplefoc.com</a></li><li>GitHub：<a href="https://github.com/simplefoc/Arduino-FOCShield">https://github.com/simplefoc/Arduino-FOCShield</a></li><li>DFRobot SimpleFOCMini：<a href="https://www.dfrobot.com/product-3013.html">https://www.dfrobot.com/product-3013.html</a></li></ul><h3 id="12-2-moteus-开源控制器方案"><a href="#12-2-moteus-开源控制器方案" class="headerlink" title="12.2 moteus 开源控制器方案"></a>12.2 moteus 开源控制器方案</h3><p><strong>原理</strong>：moteus 是完全开源的高性能 BLDC 控制器，自带编码器</p><p><strong>成本</strong>：</p><table><thead><tr><th>组件</th><th>单价</th><th>数量</th><th>总价</th></tr></thead><tbody><tr><td>moteus-c1 控制器</td><td>$69 (~¥500)</td><td>6</td><td>¥3000</td></tr><tr><td>云台&#x2F;无人机电机</td><td>¥50-100</td><td>6</td><td>¥300-600</td></tr><tr><td><strong>单臂总计</strong></td><td></td><td></td><td><strong>¥3300-3600</strong></td></tr></tbody></table><p><strong>优点</strong>：</p><ul><li>完全开源（硬件 + 固件）</li><li>CAN-FD 高速通信</li><li>集成磁编码器</li><li>专业级性能</li></ul><p><strong>缺点</strong>：</p><ul><li>价格不低（但比 Dynamixel 便宜）</li><li>需要自己设计机械结构</li></ul><p><strong>资源</strong>：</p><ul><li>mjbots 官网：<a href="https://mjbots.com/products/moteus-c1">https://mjbots.com/products/moteus-c1</a></li><li>GitHub：<a href="https://github.com/mjbots/moteus">https://github.com/mjbots/moteus</a></li></ul><h3 id="12-3-步进电机-闭环驱动方案"><a href="#12-3-步进电机-闭环驱动方案" class="headerlink" title="12.3 步进电机 + 闭环驱动方案"></a>12.3 步进电机 + 闭环驱动方案</h3><p><strong>原理</strong>：用步进电机 + 编码器实现闭环控制，类似”自制舵机”</p><p><strong>方案 A：超低成本 28BYJ-48</strong></p><table><thead><tr><th>组件</th><th>单价</th><th>数量</th><th>总价</th></tr></thead><tbody><tr><td>28BYJ-48 步进电机</td><td>¥10-15</td><td>6</td><td>¥60-90</td></tr><tr><td>ULN2003&#x2F;A4988 驱动</td><td>¥5-10</td><td>6</td><td>¥30-60</td></tr><tr><td><strong>单臂总计</strong></td><td></td><td></td><td><strong>¥90-150</strong></td></tr></tbody></table><p><strong>优点</strong>：极致便宜<br><strong>缺点</strong>：扭矩小，精度差，不适合 Lerobot</p><p><strong>方案 B：42步进 + 闭环驱动</strong></p><table><thead><tr><th>组件</th><th>单价</th><th>数量</th><th>总价</th></tr></thead><tbody><tr><td>42步进电机</td><td>¥30-50</td><td>6</td><td>¥180-300</td></tr><tr><td>闭环驱动板 (如 BigTreeTech S42C)</td><td>¥80-120</td><td>6</td><td>¥480-720</td></tr><tr><td><strong>单臂总计</strong></td><td></td><td></td><td><strong>¥660-1020</strong></td></tr></tbody></table><p><strong>优点</strong>：</p><ul><li>步进电机便宜易得</li><li>闭环驱动精度高</li><li>类似 3D 打印机生态</li></ul><p><strong>缺点</strong>：</p><ul><li>不是 Lerobot 原生支持</li><li>需要自己写驱动</li></ul><h3 id="12-4-稚晖君-Dummy-Robot-方案"><a href="#12-4-稚晖君-Dummy-Robot-方案" class="headerlink" title="12.4 稚晖君 Dummy-Robot 方案"></a>12.4 稚晖君 Dummy-Robot 方案</h3><p><strong>国产开源方案</strong>，参考了 XDrive 闭环驱动：</p><ul><li>GitHub：<a href="https://github.com/peng-zhihui/Dummy-Robot">https://github.com/peng-zhihui/Dummy-Robot</a></li><li>XDrive 闭环驱动：<a href="https://github.com/unlir/XDrive">https://github.com/unlir/XDrive</a></li></ul><p><strong>特点</strong>：</p><ul><li>基于 STM32 的闭环驱动</li><li>分开源版（ADC+斩波）和闭源版（分立 MOSFET）</li><li>稚晖君的机械臂项目参考</li></ul><h3 id="12-5-成本对比总结"><a href="#12-5-成本对比总结" class="headerlink" title="12.5 成本对比总结"></a>12.5 成本对比总结</h3><table><thead><tr><th>方案</th><th>单臂成本</th><th>难度</th><th>Lerobot 兼容</th><th>推荐度</th></tr></thead><tbody><tr><td>SO-ARM101 (STS3215)</td><td>¥600-800</td><td>⭐ 简单</td><td>✅ 原生</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>SimpleFOC + 云台电机</td><td>¥690-930</td><td>⭐⭐⭐ 中等</td><td>❌ 需适配</td><td>⭐⭐⭐</td></tr><tr><td>moteus-c1 + BLDC</td><td>¥3300-3600</td><td>⭐⭐⭐⭐ 较难</td><td>❌ 需适配</td><td>⭐⭐</td></tr><tr><td>42步进 + 闭环驱动</td><td>¥660-1020</td><td>⭐⭐⭐ 中等</td><td>❌ 需适配</td><td>⭐⭐⭐</td></tr><tr><td>28BYJ-48 超便宜</td><td>¥90-150</td><td>⭐⭐ 简单</td><td>❌ 不适合</td><td>⭐</td></tr></tbody></table><h3 id="12-6-我的建议"><a href="#12-6-我的建议" class="headerlink" title="12.6 我的建议"></a>12.6 我的建议</h3><p><strong>如果你想省钱</strong>：</p><ol><li><strong>最简单</strong>：等打折买 SO-ARM101 套件，或者只买单臂（6个电机）</li><li><strong>有技术能力</strong>：SimpleFOC + 云台电机，自己写 Lerobot 驱动</li><li><strong>极致省钱</strong>：42步进 + 闭环驱动，但需要很多时间调试</li></ol><p><strong>现实情况</strong>：</p><ul><li>Lerobot 官方支持的只有 Dynamixel 和 Feetech</li><li>其他方案需要自己写 <code>robot_devices</code> 驱动</li><li>时间成本 &gt; 金钱成本</li></ul><p><strong>如果只是学习</strong>，建议直接 SO-ARM101，省下的时间用来学 AI&#x2F;ML 更值得喵~</p><hr><p><em>更新时间：2026-03-15 19:20</em></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>YouTube Music 淡入淡出 userscript</title>
      <link>https://www.jiecs.top/archives/ce81b320/</link>
      <description>
        <![CDATA[<p>来源： <a href="https://www.reddit.com/r/YoutubeMusic/comments/1ekc7rw/comment/mfoxe1a">https://www.reddit.com/r/YoutubeMusic/comments/1ekc7]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E7%A8%8B%E5%BA%8F/">程序</category>
      <category domain="https://www.jiecs.top/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      <category domain="https://www.jiecs.top/tags/%E5%A5%BD%E8%BD%AF%E4%BB%B6/">好软件</category>
      <pubDate>Sun, 15 Feb 2026 20:10:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>来源： <a href="https://www.reddit.com/r/YoutubeMusic/comments/1ekc7rw/comment/mfoxe1a">https://www.reddit.com/r/YoutubeMusic/comments/1ekc7rw/comment/mfoxe1a</a></p><blockquote><p>由 AI 和我修改</p></blockquote><p>YouTube Music 网页版实际上是有淡入淡出的功能的，但是要 Premium，或者也许是灰度&#x2F;风控什么的。总之这个 userscript 通过各种 Hook 实现了丝滑的暂停播放、切歌时的淡入淡出<br>reddit 老哥原版只有暂停播放的淡入淡出，我在其基础上实现了切歌的淡入淡出</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">// ==UserScript==</span><br><span class="hljs-comment">// @name         YouTube Music Ultimate Fade</span><br><span class="hljs-comment">// @details      Origin from: https://www.reddit.com/r/YoutubeMusic/comments/1ekc7rw/comment/mfoxe1a, modified by Claude</span><br><span class="hljs-comment">// @match        *://music.youtube.com/*</span><br><span class="hljs-comment">// @grant        none</span><br><span class="hljs-comment">// @run-at       document-start</span><br><span class="hljs-comment">// ==/UserScript==</span><br><br>(<span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) &#123;<br>    <span class="hljs-string">&#x27;use strict&#x27;</span>;<br><br>    <span class="hljs-keyword">let</span> userVolume = <span class="hljs-number">0.5</span>;<br>    <span class="hljs-keyword">const</span> <span class="hljs-variable constant_">FADE_TIME_NORMAL</span> = <span class="hljs-number">800</span>;<br>    <span class="hljs-keyword">const</span> <span class="hljs-variable constant_">FADE_TIME_QUICK</span> = <span class="hljs-number">300</span>;<br><br>    <span class="hljs-comment">// 强制锁：在动画期间屏蔽冲突操作</span><br>    <span class="hljs-keyword">let</span> isFading = <span class="hljs-literal">false</span>;<br>    <span class="hljs-comment">// --- 核心淡入淡出引擎 ---</span><br>    <span class="hljs-keyword">function</span> <span class="hljs-title function_">fade</span>(<span class="hljs-params">video, target, duration</span>) &#123;<br>        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">Promise</span>(<span class="hljs-function"><span class="hljs-params">resolve</span> =&gt;</span> &#123;<br>            <span class="hljs-keyword">if</span> (video.<span class="hljs-property">_fadeController</span>) video.<span class="hljs-property">_fadeController</span>.<span class="hljs-title function_">abort</span>();<br>            <span class="hljs-keyword">const</span> controller = <span class="hljs-keyword">new</span> <span class="hljs-title class_">AbortController</span>();<br>            video.<span class="hljs-property">_fadeController</span> = controller;<br><br>            <span class="hljs-keyword">const</span> startVolume = video.<span class="hljs-property">volume</span>;<br>            <span class="hljs-keyword">const</span> startTime = performance.<span class="hljs-title function_">now</span>();<br>            <span class="hljs-keyword">const</span> intervalTime = <span class="hljs-number">16</span>; <span class="hljs-comment">// 约 60fps</span><br><br>            <span class="hljs-keyword">const</span> interval = <span class="hljs-built_in">setInterval</span>(<span class="hljs-function">() =&gt;</span> &#123;<br>                <span class="hljs-keyword">if</span> (controller.<span class="hljs-property">signal</span>.<span class="hljs-property">aborted</span>) &#123;<br>                    <span class="hljs-built_in">clearInterval</span>(interval);<br>                    <span class="hljs-keyword">return</span> <span class="hljs-title function_">resolve</span>(<span class="hljs-literal">false</span>);<br>                &#125;<br>                <span class="hljs-keyword">const</span> elapsed = performance.<span class="hljs-title function_">now</span>() - startTime;<br>                <span class="hljs-keyword">const</span> progress = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(elapsed / duration, <span class="hljs-number">1</span>);<br>                <span class="hljs-keyword">const</span> ease = <span class="hljs-number">1</span> - <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">pow</span>(<span class="hljs-number">1</span> - progress, <span class="hljs-number">2</span>);<br><br>                video.<span class="hljs-property">volume</span> = <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">max</span>(<span class="hljs-number">0</span>, <span class="hljs-title class_">Math</span>.<span class="hljs-title function_">min</span>(<span class="hljs-number">1</span>, startVolume + (target - startVolume) * ease));<br><br>                <span class="hljs-keyword">if</span> (progress &gt;= <span class="hljs-number">1</span>) &#123;<br>                    <span class="hljs-built_in">clearInterval</span>(interval);<br>                    video.<span class="hljs-property">_fadeController</span> = <span class="hljs-literal">null</span>;<br>                    <span class="hljs-title function_">resolve</span>(<span class="hljs-literal">true</span>);<br>                &#125;<br>            &#125;, intervalTime);<br>        &#125;);<br>    &#125;<br><br>    <span class="hljs-keyword">const</span> originalPause = <span class="hljs-title class_">HTMLVideoElement</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">pause</span>;<br>    <span class="hljs-keyword">const</span> originalPlay = <span class="hljs-title class_">HTMLVideoElement</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">play</span>;<br><br>    <span class="hljs-comment">// --- 核心 Hook：采用硬性延迟策略 ---</span><br>    <span class="hljs-title class_">HTMLVideoElement</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">pause</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) &#123;<br>        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">_isInternalAction</span> || <span class="hljs-variable language_">this</span>.<span class="hljs-property">paused</span>) <span class="hljs-keyword">return</span> originalPause.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>);<br><br>        <span class="hljs-keyword">if</span> (isFading) <span class="hljs-keyword">return</span>; <span class="hljs-comment">// 动画中禁止二次触发</span><br>        isFading = <span class="hljs-literal">true</span>;<br><br>        <span class="hljs-title function_">fade</span>(<span class="hljs-variable language_">this</span>, <span class="hljs-number">0</span>, <span class="hljs-variable constant_">FADE_TIME_NORMAL</span>).<span class="hljs-title function_">then</span>(<span class="hljs-function">() =&gt;</span> &#123;<br>            <span class="hljs-variable language_">this</span>.<span class="hljs-property">_isInternalAction</span> = <span class="hljs-literal">true</span>;<br>            originalPause.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>);<br>            <span class="hljs-variable language_">this</span>.<span class="hljs-property">_isInternalAction</span> = <span class="hljs-literal">false</span>;<br>            <span class="hljs-comment">// 硬延迟：确保 UI 状态机稳定后再解锁</span><br>            <span class="hljs-built_in">setTimeout</span>(<span class="hljs-function">() =&gt;</span> &#123; isFading = <span class="hljs-literal">false</span>; &#125;, <span class="hljs-number">100</span>);<br>        &#125;);<br>    &#125;;<br><br>    <span class="hljs-title class_">HTMLVideoElement</span>.<span class="hljs-property"><span class="hljs-keyword">prototype</span></span>.<span class="hljs-property">play</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params"></span>) &#123;<br>        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">_isInternalAction</span>) <span class="hljs-keyword">return</span> originalPlay.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>);<br><br>        isFading = <span class="hljs-literal">false</span>; <span class="hljs-comment">// 播放请求强制中断淡出锁</span><br>        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">_fadeController</span>) <span class="hljs-variable language_">this</span>.<span class="hljs-property">_fadeController</span>.<span class="hljs-title function_">abort</span>();<br><br>        <span class="hljs-keyword">const</span> res = originalPlay.<span class="hljs-title function_">apply</span>(<span class="hljs-variable language_">this</span>);<br>        <span class="hljs-keyword">if</span> (<span class="hljs-variable language_">this</span>.<span class="hljs-property">volume</span> &lt; <span class="hljs-number">0.1</span>) &#123;<br>            <span class="hljs-title function_">fade</span>(<span class="hljs-variable language_">this</span>, userVolume, <span class="hljs-variable constant_">FADE_TIME_NORMAL</span>);<br>        &#125;<br>        <span class="hljs-keyword">return</span> res;<br>    &#125;;<br><br>    <span class="hljs-comment">// --- 处理点击：下一首、列表切歌等 ---</span><br>    <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;click&#x27;</span>, <span class="hljs-title function_">async</span> (e) =&gt; &#123;<br>        <span class="hljs-keyword">if</span> (e.<span class="hljs-property">_isCustom</span>) <span class="hljs-keyword">return</span>;<br><br>        <span class="hljs-keyword">const</span> target = e.<span class="hljs-property">target</span>.<span class="hljs-title function_">closest</span>(<br>            <span class="hljs-string">&#x27;ytmusic-player-queue-item, ytmusic-play-button-renderer, .next-button, .previous-button, [aria-label*=&quot;Next&quot;], [aria-label*=&quot;Previous&quot;]&#x27;</span><br>        );<br><br>        <span class="hljs-keyword">if</span> (target) &#123;<br>            <span class="hljs-keyword">const</span> video = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;video&#x27;</span>);<br>            <span class="hljs-keyword">if</span> (video &amp;&amp; !video.<span class="hljs-property">paused</span>) &#123;<br>                <span class="hljs-comment">// 拦截原生点击，先做淡出</span><br>                e.<span class="hljs-title function_">preventDefault</span>();<br>                e.<span class="hljs-title function_">stopPropagation</span>();<br><br>                <span class="hljs-keyword">await</span> <span class="hljs-title function_">fade</span>(video, <span class="hljs-number">0</span>, <span class="hljs-variable constant_">FADE_TIME_QUICK</span>);<br><br>                <span class="hljs-comment">// 彻底停止当前，防止切歌爆音</span><br>                video.<span class="hljs-property">_isInternalAction</span> = <span class="hljs-literal">true</span>;<br>                originalPause.<span class="hljs-title function_">apply</span>(video);<br>                video.<span class="hljs-property">_isInternalAction</span> = <span class="hljs-literal">false</span>;<br><br>                <span class="hljs-comment">// 重新派发点击</span><br>                <span class="hljs-keyword">const</span> newClick = <span class="hljs-keyword">new</span> <span class="hljs-title class_">MouseEvent</span>(<span class="hljs-string">&#x27;click&#x27;</span>, &#123;<br>                    <span class="hljs-attr">bubbles</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">cancelable</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">view</span>: <span class="hljs-variable language_">window</span>, <span class="hljs-attr">detail</span>: <span class="hljs-number">1</span><br>                &#125;);<br>                newClick.<span class="hljs-property">_isCustom</span> = <span class="hljs-literal">true</span>;<br>                target.<span class="hljs-title function_">dispatchEvent</span>(newClick);<br>            &#125;<br>        &#125;<br>    &#125;, <span class="hljs-literal">true</span>);<br><br>    <span class="hljs-comment">// --- MediaSession (系统通知栏/线控) ---</span><br>    <span class="hljs-keyword">const</span> _setActionHandler = navigator.<span class="hljs-property">mediaSession</span>.<span class="hljs-property">setActionHandler</span>.<span class="hljs-title function_">bind</span>(navigator.<span class="hljs-property">mediaSession</span>);<br>    navigator.<span class="hljs-property">mediaSession</span>.<span class="hljs-property">setActionHandler</span> = <span class="hljs-keyword">function</span>(<span class="hljs-params">action, handler</span>) &#123;<br>        <span class="hljs-keyword">const</span> <span class="hljs-title function_">wrappedHandler</span> = <span class="hljs-keyword">async</span> (<span class="hljs-params">details</span>) =&gt; &#123;<br>            <span class="hljs-keyword">const</span> video = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;video&#x27;</span>);<br>            <span class="hljs-keyword">if</span> ((action === <span class="hljs-string">&#x27;nexttrack&#x27;</span> || action === <span class="hljs-string">&#x27;previoustrack&#x27;</span>) &amp;&amp; video &amp;&amp; !video.<span class="hljs-property">paused</span>) &#123;<br>                <span class="hljs-keyword">await</span> <span class="hljs-title function_">fade</span>(video, <span class="hljs-number">0</span>, <span class="hljs-variable constant_">FADE_TIME_QUICK</span>);<br>            &#125;<br>            <span class="hljs-keyword">if</span> (handler) <span class="hljs-title function_">handler</span>(details);<br>        &#125;;<br>        <span class="hljs-keyword">return</span> <span class="hljs-title function_">_setActionHandler</span>(action, wrappedHandler);<br>    &#125;;<br><br>    <span class="hljs-comment">// --- 视频初始化 ---</span><br>    <span class="hljs-keyword">function</span> <span class="hljs-title function_">patchVideo</span>(<span class="hljs-params">video</span>) &#123;<br>        <span class="hljs-keyword">if</span> (video.<span class="hljs-property">_isPatched</span>) <span class="hljs-keyword">return</span>;<br>        video.<span class="hljs-property">_isPatched</span> = <span class="hljs-literal">true</span>;<br><br>        video.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;volumechange&#x27;</span>, <span class="hljs-function">() =&gt;</span> &#123;<br>            <span class="hljs-keyword">if</span> (!video.<span class="hljs-property">_fadeController</span> &amp;&amp; video.<span class="hljs-property">volume</span> &gt; <span class="hljs-number">0</span>) &#123;<br>                userVolume = video.<span class="hljs-property">volume</span>;<br>            &#125;<br>        &#125;);<br><br>        video.<span class="hljs-title function_">addEventListener</span>(<span class="hljs-string">&#x27;loadstart&#x27;</span>, <span class="hljs-function">() =&gt;</span> &#123;<br>            <span class="hljs-keyword">if</span> (video.<span class="hljs-property">_fadeController</span>) video.<span class="hljs-property">_fadeController</span>.<span class="hljs-title function_">abort</span>();<br>            isFading = <span class="hljs-literal">false</span>;<br>            video.<span class="hljs-property">volume</span> = <span class="hljs-number">0</span>;<br>        &#125;);<br>    &#125;<br><br>    <span class="hljs-keyword">const</span> observer = <span class="hljs-keyword">new</span> <span class="hljs-title class_">MutationObserver</span>(<span class="hljs-function">() =&gt;</span> &#123;<br>        <span class="hljs-keyword">const</span> video = <span class="hljs-variable language_">document</span>.<span class="hljs-title function_">querySelector</span>(<span class="hljs-string">&#x27;video&#x27;</span>);<br>        <span class="hljs-keyword">if</span> (video) <span class="hljs-title function_">patchVideo</span>(video);<br>    &#125;);<br>    observer.<span class="hljs-title function_">observe</span>(<span class="hljs-variable language_">document</span>.<span class="hljs-property">documentElement</span>, &#123; <span class="hljs-attr">childList</span>: <span class="hljs-literal">true</span>, <span class="hljs-attr">subtree</span>: <span class="hljs-literal">true</span> &#125;);<br><br>&#125;)();<br></code></pre></td></tr></table></figure>]]>
      </content:encoded>
    </item>
    <item>
      <title>Bluefin (Fedora Silverblue) ostree+btrfs 下 设置磁盘 Swapfile 和休眠</title>
      <link>https://www.jiecs.top/archives/8a773376/</link>
      <description>
        <![CDATA[<p>ZRAM 基本上是够用的，默认就有，默认压缩算法是 lzo-rle，大小是 1&#x2F;2 的内存大小或者至少 4G。</p>
<p>可以设置压缩算法为 zstd，相比较 lzo-rle 属于时间 (CPU) 换空间 (内存)，并且手动设置大小优化一下，如<br><cod]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%88%91%E7%9A%84%E7%94%B5%E8%84%91/">我的电脑</category>
      <category domain="https://www.jiecs.top/tags/Linux/">Linux</category>
      <pubDate>Mon, 09 Feb 2026 20:20:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>ZRAM 基本上是够用的，默认就有，默认压缩算法是 lzo-rle，大小是 1&#x2F;2 的内存大小或者至少 4G。</p><p>可以设置压缩算法为 zstd，相比较 lzo-rle 属于时间 (CPU) 换空间 (内存)，并且手动设置大小优化一下，如<br><code>/etc/systemd/zram-generator.conf</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs conf">[zram0]<br>zram-size = # in MiB, 1/2 ram size or 1 ram size<br>compression-algorithm = zstd<br></code></pre></td></tr></table></figure><p>即可</p><hr><p>但内存空间确实不够的时候，ZRAM 对 OOM 无能为力，因此可以设置一个低 Priority 的小 Swapfile 用来在 OOM 的时候有腾挪空间</p><blockquote><p>当然如果要考虑休眠，那 Swapfile 还是要很大的</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><code class="hljs bash">❯ <span class="hljs-built_in">sudo</span> btrfs subvolume create /var/swap<br>Create subvolume <span class="hljs-string">&#x27;/var/swap&#x27;</span><br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> btrfs filesystem mkswapfile --size 4G /var/swap/swapfile<br>create swapfile /var/swap/swapfile size 4.00GiB (4294967296)<br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> -E nano /etc/systemd/system/var-swap-swapfile.swap<br><span class="hljs-comment"># 常规方法是在 /etc/fstab 里加，但 systemd 里加更现代一点</span><br><span class="hljs-comment"># systemd unit 名字不能改，应该是准确的路径转义</span><br>[Unit]<br>Description=Swapfile<br><br>[Swap]<br>What=/var/swap/swapfile<br>Priority=10<br><br>[Install]<br>WantedBy=swap.target<br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> systemctl daemon-reload<br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> systemctl <span class="hljs-built_in">enable</span> --now var-swap-swapfile.swap<br>Created symlink <span class="hljs-string">&#x27;/etc/systemd/system/swap.target.wants/var-swap-swapfile.swap&#x27;</span> → <span class="hljs-string">&#x27;/etc/systemd/system/var-swap-swapfile.swap&#x27;</span>.<br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> swapon -a<br><br>~ <br>❯ <span class="hljs-built_in">sudo</span> swapon<br>NAME               TYPE      SIZE USED PRIO<br>/dev/zram0         partition  16G   0B  100<br>/var/swap/swapfile file       4G    0B  10<br><br><span class="hljs-comment"># 到这一步就有 Swapfile 了如果要磁盘休眠还可以继续操作</span><br><span class="hljs-comment"># $ sudo cat /etc/dracut.conf.d/resume.conf</span><br><span class="hljs-comment"># $ rpm-ostree initramfs --enable</span><br><span class="hljs-comment"># 还有更多要考虑的: SELinux, systemd-hibernate-resume...</span><br></code></pre></td></tr></table></figure><p>参考文档：</p><ul><li><a href="https://fedoramagazine.org/update-on-hibernation-in-fedora-workstation">https://fedoramagazine.org/update-on-hibernation-in-fedora-workstation</a> 注意不完全全面，读下方的评论</li><li><a href="https://wiki.archlinuxcn.org/wiki/Swap">https://wiki.archlinuxcn.org/wiki/Swap</a></li><li><a href="https://wiki.archlinuxcn.org/wiki/Hibernation">https://wiki.archlinuxcn.org/wiki/Hibernation</a></li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>上海如韵电子 CNxx 电池充电管理芯片选型表</title>
      <link>https://www.jiecs.top/archives/facd4237/</link>
      <description>
        <![CDATA[<p><img src="https://cdn.jiecs.top/img/2026/01/1769681999333-image.webp"></p>
<p>如图<br>来源： <a href="https://www.bilibili.com/video/BV1oM4m1d]]>
      </description>
      <author>Jiecs</author>
      <category domain="https://www.jiecs.top/categories/%E5%8A%A8%E6%80%81/">动态</category>
      <category domain="https://www.jiecs.top/tags/%E6%97%A5%E5%B8%B8/">日常</category>
      <category domain="https://www.jiecs.top/tags/%E7%94%B5%E5%AD%90/">电子</category>
      <category domain="https://www.jiecs.top/tags/%E5%AD%A6%E4%B9%A0/">学习</category>
      <pubDate>Thu, 29 Jan 2026 18:19:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><img src="https://cdn.jiecs.top/img/2026/01/1769681999333-image.webp"></p><p>如图<br>来源： <a href="https://www.bilibili.com/video/BV1oM4m1d7Rm">https://www.bilibili.com/video/BV1oM4m1d7Rm</a> 04:35</p>]]>
      </content:encoded>
    </item>
  </channel>
</rss>
