<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Linux on 魔都水滴</title>
    <link>https://blog.margrop.net/tag/linux/</link>
    <description>Recent content in Linux on 魔都水滴</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-CN</language>
    <lastBuildDate>Wed, 29 Jul 2026 08:00:00 +0800</lastBuildDate>
    <atom:link href="https://blog.margrop.net/tag/linux/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>重启不是玄学：电脑为什么一关一开，就像治好了 99% 的毛病？</title>
      <link>https://blog.margrop.net/post/why-restart-fixes-99-percent-%E9%87%8D%E5%90%AF/</link>
      <pubDate>Wed, 29 Jul 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/why-restart-fixes-99-percent-%E9%87%8D%E5%90%AF/</guid>
      <description>先说结论&#xA;重启不是魔法，也不是把所有故障都修好了。它更像是把一间住了很久、已经乱到找不到东西的房间清空：借出去但没归还的物品被收走，排队的人重新取号，临时便签被撕掉，门锁和电器重新检查。系统因此回到了一个更干净、更容易预测的起点。&#xA;所以，“重启解决了问题”通常意味着：故障藏在易失状态里，而不是硬件已经坏掉、配置一直错误或程序本身存在根因。&#xA;你一定见过这样的场景：浏览器突然打不开新标签页，文件明明存在却提示“正在使用”，远程桌面连不上，风扇像小飞机一样转，内存还剩很多却不停卡顿。你先关一个窗口，再关几个程序，最后抱着“试试看”的心态重启。&#xA;电脑重新亮起来后，刚才那个很难解释的毛病消失了。&#xA;这就是大家常说的“重启能解决 99% 的问题”。它当然不是一个经过严格统计的 99%，而是一种非常生动的工程经验：很多问题不是永久损坏，而是系统在长时间运行中积累了太多没有及时清理的临时状态。&#xA;图 1：重启像把“住乱了”的系统清场复位。原创配图。&#xA;把电脑想成一间一直有人使用的房间 刚搬进去时，房间很整齐。桌上只有一台电脑，柜子里有几份文件，门口有两双鞋。&#xA;但如果这间房连续住三个月，却从来不做大扫除，会发生什么？&#xA;快递盒越来越多，虽然每个盒子都不大，但过道被堵住了。 借出去的剪刀、充电器和钥匙没有归还，东西并没有“消失”，只是没人知道它在哪里。 门口排着很多人，已经离开的客人还占着号码。 桌上贴满旧便签，大家仍然按照过期的便签做决定。 两个人各自拿着一把钥匙，互相等对方先开门，谁都不愿意松手。 系统里的“房间”就是内存、文件句柄、网络连接、线程、锁、缓存、驱动状态和各种服务上下文。它们有一个共同特点：启动时会被建立，运行中会被修改，退出或重启时才有机会统一回收。&#xA;下面这张图把最常见的四种“乱”放在了一起。&#xA;图 2：状态泄漏、内存碎片、连接堆积，以及锁和旧缓存，是重启经常能缓解的四类问题。&#xA;状态泄漏：借出去的东西没有放回原位 “泄漏”不一定是水从水管里流出来。对程序来说，泄漏更像是“借了资源，但忘了归还”。&#xA;程序打开一个文件，系统会给它一个文件描述符；程序创建一个网络连接，系统会保存连接状态；程序申请一块内存，分配器会记住这块空间归谁使用。如果程序退出时没有正确关闭，或者它一直运行、从来不退出，那么这些资源就可能持续占着位置。&#xA;一次泄漏可能小得几乎看不见。比如每处理一千个请求只多留一个句柄，一天之后可能没有任何感觉；几周之后，系统却开始提示“打开文件太多”“无法创建线程”或“连接失败”。&#xA;这就是为什么重启一个服务有时比“再点一次按钮”有效：服务进程结束后，操作系统会回收该进程名下的内存、句柄、线程和连接。房间里那些没有登记归还的物品，会随着住客离开而被物业统一收走。&#xA;macOS 的 vm_stat 会把虚拟内存拆成很多页来观察；Linux 则常见 /proc/meminfo、free 和进程的 RSS。它们不是“电脑健康分数”，而是帮助我们确认房间里到底堆了什么。&#xA;图 3：真实的 macOS vm_stat 输出。数字会随机器和时间变化，重点是观察趋势，不是迷信某个固定值。&#xA;内存碎片：柜子还有缝，却塞不进大箱子 很多人看到“可用内存还有几 GB”，就会问：既然还有空间，为什么程序还是申请失败？&#xA;因为“总空位”不等于“连续的大空位”。&#xA;把内存想成一个有很多格子的柜子。程序先放入一个小盒子，又拿走另一个盒子，再放入一个大箱子。经过很多次申请和释放以后，柜子可能到处都有小缝，但没有一块连续的空位能放下大箱子。&#xA;这就是内存碎片最容易理解的版本。真实系统比这个复杂：用户态分配器、内核页分配器、不同大小的对象、内存映射和缓存都会影响布局。现代操作系统会尽力复用和整理空间，但整理本身也需要时间，并且并非所有内存都能随便移动。&#xA;图 4：蓝色格子表示已占用区域，浅色格子是分散的空位；“还有空位”并不代表能满足连续大块分配。&#xA;Linux 内核文档把 compaction（内存压缩整理）描述为把可移动页搬到一起，从而形成更大的连续空闲区域。这个过程像把衣柜里的小衣物先集中到一侧，让另一侧腾出完整空间，但它不是免费的：搬东西需要 CPU，也受不可移动页、正在使用的页和分配时机影响。&#xA;因此，重启有时会让内存表现“突然变好”，并不是重启凭空创造了内存，而是旧进程、旧映射和旧缓存全部结束后，新的进程在更干净的布局上重新分配。&#xA;图 5：真实的 Ubuntu free -h 与 ss -s 汇总。文章只保留统计项，不展示地址或机器名。&#xA;连接堆积：窗口有限，旧号码却没清掉 网络连接可以想成银行窗口。&#xA;服务器只有有限数量的连接槽位、文件描述符、线程和端口。一个请求来了，系统为它分配资源；请求结束后，资源应当尽快归还。但实际网络里还有重传、超时、半关闭、连接复用和 TIME-WAIT 等状态。某些状态本来就是协议设计的一部分，不是错误；问题在于它们的数量、持续时间和业务流量不匹配。&#xA;RFC 9293 说明了 TCP 状态机中的 TIME-WAIT：主动关闭连接的一方需要在一段时间内保留状态，以避免旧报文干扰后续连接。生活中，这就像快递柜不会在包裹刚取走的一秒钟就立刻把编号交给另一个人，系统要留一点时间确认“旧包裹真的结束了”。</description>
    </item>
    <item>
      <title>别再盲目执行 rsync！我用 Dry Run 揪出差异文件，再安全完成增量同步</title>
      <link>https://blog.margrop.net/post/rsync-diff-incremental-sync/</link>
      <pubDate>Sat, 11 Jul 2026 13:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/rsync-diff-incremental-sync/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;rsync&lt;/code&gt; 最值得养成的习惯，不是背更多参数，而是把同步拆成两步：&lt;strong&gt;先用 &lt;code&gt;--dry-run&lt;/code&gt; 生成差异计划，确认无误后再执行正式同步&lt;/strong&gt;。如果还会删除目标端文件，则必须把删除能力单独授权，不能让 &lt;code&gt;--delete&lt;/code&gt; 悄悄成为默认动作。&lt;/p&gt;&#xA;&lt;p&gt;文首那段 &lt;code&gt;rsync -n -avz --delete --out-format=&amp;quot;%n&amp;quot;&lt;/code&gt; 确实能看到一部分将变化的路径，但它只输出文件名，后续再靠 &lt;code&gt;grep&lt;/code&gt; 猜“哪些是文件、哪些是删除”并不稳。更可靠的做法是使用 &lt;code&gt;--itemize-changes&lt;/code&gt;，并把 &lt;code&gt;%i&lt;/code&gt; 与 &lt;code&gt;%n&lt;/code&gt; 一起输出，让每一行自己说明是新增、更新、删除还是目录属性变化。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 新装机第一刀：不想被 Snap 绑架，就这样干净卸掉它</title>
      <link>https://blog.margrop.net/post/ubuntu-2604-remove-snap-cleanly/</link>
      <pubDate>Mon, 06 Jul 2026 09:45:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ubuntu-2604-remove-snap-cleanly/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ubuntu 26.04 新装系统后，如果你明确不想使用 Snap，可以卸载。正确姿势不是上来就 &lt;code&gt;rm -rf /snap&lt;/code&gt;，而是先确认系统里有哪些 Snap 应用，迁移重要数据，再按顺序 &lt;code&gt;snap remove --purge&lt;/code&gt;，最后 &lt;code&gt;apt purge snapd&lt;/code&gt; 并清理残留目录。&lt;/p&gt;&#xA;&lt;p&gt;本文给出完整背景、风险边界、人工执行方法、Agent 自动配置方法，以及 Windows 11 / Ubuntu 26.04 / macOS 26 三种一键脚本。脚本默认只预演，真正执行必须显式开启，不依赖第三方服务，也不包含任何真实内网地址、真实计算机名、私有域名或密钥。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>跨境 VPS 慢到能睡着？一行内核参数，把国际链路吞吐拉起 20 倍</title>
      <link>https://blog.margrop.net/post/bbr-fix-china-us-vps-slow-network/</link>
      <pubDate>Thu, 02 Jul 2026 20:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/bbr-fix-china-us-vps-slow-network/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;你从国内访问自己的美国 VPS，明明 SSH 打字很流畅，但下载一个 2 MB 的文件要一分多钟？以为是&amp;quot;高峰期国际链路拥堵&amp;quot;？大概率不是——你只是被 Linux 默认的 CUBIC 拥塞控制&amp;quot;骗&amp;quot;了。CUBIC 把每次丢包都当成&amp;quot;前面堵车了&amp;quot;，立刻踩刹车退让；而国际链路本身就有稳定 5-10% 的丢包，于是你的 TCP 连接被永远压在爬行状态。换成 Google 的 &lt;strong&gt;BBR&lt;/strong&gt; 算法后，同样的物理链路、同一时刻、同样的丢包率，吞吐可以立刻涨 15-24 倍。&lt;/p&gt;&#xA;&lt;p&gt;本文记录了一次真实的 mesh 网络排查：家庭出口 → 美国 VPS 拉取 2.3 MB 的网页，实测从 &lt;strong&gt;30 KB/s 一路飙到 500-1000 KB/s&lt;/strong&gt;，用的方法总共 4 行 shell 命令。文章包含三套一键脚本（Windows 11 / Ubuntu 26.04 / macOS 26），既能人工执行，也能交给 AI Agent 自动配置。所有内网地址、主机名和公网 IP 均已脱敏。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>Windows 终于有了原生 Linux 命令：微软 coreutils 让你告别 WSL、Cygwin 和 Git Bash</title>
      <link>https://blog.margrop.net/post/windows-native-linux-commands-microsoft-coreutils/</link>
      <pubDate>Sat, 27 Jun 2026 08:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/windows-native-linux-commands-microsoft-coreutils/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先问一个问题：&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;你有没有过这种体验——在 Windows 终端里想用 &lt;code&gt;grep&lt;/code&gt; 过滤一下日志，结果 PowerShell 告诉你 &lt;code&gt;grep&lt;/code&gt; 不是内部命令；想用 &lt;code&gt;find&lt;/code&gt; 批量查找文件，结果 Windows 的 &lt;code&gt;find&lt;/code&gt; 和 Linux 的 &lt;code&gt;find&lt;/code&gt; 完全是两个东西；写了个跨平台脚本，到了 Windows 上就得全部重写？&lt;/p&gt;&#xA;&lt;p&gt;这不是你的问题，这是 Windows 和 Linux 命令行之间那道&amp;quot;柏林墙&amp;quot;的问题。&lt;/p&gt;&#xA;&lt;p&gt;好消息是，微软自己动手拆墙了。2025 年底，微软在 GitHub 上开源了 &lt;strong&gt;coreutils&lt;/strong&gt; 项目——一个原生 Windows 版本的 Linux 核心命令集。不需要 WSL，不需要 Cygwin，不需要 Git Bash，一条 &lt;code&gt;winget install&lt;/code&gt; 就能让你的 Windows 终端直接听懂 &lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt;、&lt;code&gt;sed&lt;/code&gt;、&lt;code&gt;awk&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>后台进程一断开 Shell 就消失？别只靠 nohup 了，理解 setsid 和进程生命周期的真相</title>
      <link>https://blog.margrop.net/post/setsid-daemon-process-survival/</link>
      <pubDate>Mon, 01 Jun 2026 07:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/setsid-daemon-process-survival/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;你启动了一个后台服务，&lt;code&gt;nohup&lt;/code&gt; 用了，&lt;code&gt;&amp;amp;&lt;/code&gt; 也加了，日志也重定向了，一切看起来都很正常。但当你关闭终端、断开 SSH，或者——更隐蔽的情况——当自动化工具执行完脚本后，这个进程就悄无声息地消失了。你检查 &lt;code&gt;ps&lt;/code&gt;，找不到它；检查端口，也没有监听。如果你遇到过这种情况，你不是一个人。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;真正的根因不是 SIGHUP——至少不完全是。问题出在进程组和会话的归属关系上。&lt;/strong&gt; &lt;code&gt;nohup&lt;/code&gt; 只是让进程忽略 SIGHUP 信号，但如果进程所属的会话 leader 被销毁了，终端 IO 断裂了，或者父进程组被一起收割了，进程仍然可能死掉。真正彻底的解决方案是 &lt;code&gt;setsid&lt;/code&gt;：它创建一个全新的会话，让进程完全脱离原会话的控制终端，不再属于父 shell 的进程组——因此父 shell 退出时，SIGHUP 根本传播不到它那里去。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章源自一次真实的 CLIProxyAPI 服务排障。服务通过 &lt;code&gt;nohup&lt;/code&gt; 启动后，每次自动化脚本执行完毕就消失，管理界面一直报“网络连接失败”。排查后发现是一个隐蔽的 Unix 进程生命周期问题。这类问题在云原生开发机、CI runner、SSH jump host 和容器化工作流里非常常见，但往往因为对进程模型理解不深而被误判为“软件有 bug”。&lt;/p&gt;&#xA;&lt;p&gt;为了不泄露隐私，本文不会出现真实内网地址、真实 token 或路径。所有配置片段使用 &lt;code&gt;&amp;lt;PLACEHOLDER&amp;gt;&lt;/code&gt; 占位。&lt;/p&gt;</description>
    </item>
    <item>
      <title>你能 SSH 出去，却 SSH 不回来：一次被 Fail2Ban 误伤的反向访问排障实录</title>
      <link>https://blog.margrop.net/post/reverse-ssh-fail2ban-vpn-gateway-investigation/</link>
      <pubDate>Sat, 30 May 2026 15:45:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/reverse-ssh-fail2ban-vpn-gateway-investigation/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;这次问题的表象很简单：本机可以主动 SSH 到远端内网机器，但远端机器反过来 SSH 回本机时，连接直接被拒绝。&lt;code&gt;sshd&lt;/code&gt; 明明在监听，路由也没断，最后却卡在“反向访问”这一步。&lt;/p&gt;&#xA;&lt;p&gt;真正的根因不是 &lt;code&gt;sshd&lt;/code&gt; 挂了，而是 &lt;code&gt;Fail2Ban&lt;/code&gt; 把承载反向连接的 &lt;strong&gt;VPN 网关地址&lt;/strong&gt; 封掉了。对本机来说，来自远端的连接并不是以“远端机器本身”的地址出现，而是以网关地址出现。于是，错误的封禁对象把整条回程链路一并打断了。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>彻底打通内网！在 Ubuntu 26.04 上完美部署 Tailscale 实现无感异地组网</title>
      <link>https://blog.margrop.net/post/seamless-homelab-networking-deploy-tailscale-ubuntu-2604/</link>
      <pubDate>Tue, 26 May 2026 14:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/seamless-homelab-networking-deploy-tailscale-ubuntu-2604/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;跨运营商、无公网 IP、多端互联，一直都是 Homelab 玩家与企业运维的核心痛点。本文将详细演示如何在最新发布的 Ubuntu 26.04 (Resolute Raccoon) 系统上，利用最新的 APT 秘钥环（Keyring）标准，优雅地安装和配置最新版的 Tailscale。我们不仅会给出干净利落的命令行安装过程，还会深入剖析 Tailscale 的网络拓扑、子网路由（Subnet Router）以及出口节点（Exit Node）的高级配置，帮助你彻底打通家里的群晖 NAS、PVE 虚拟机以及随身携带的手机与笔记本电脑。&lt;/p&gt;&#xA;&lt;p&gt;本文所有操作均在 Ubuntu 26.04 (Resolute Raccoon) 干净的环境中测试通过，所有内部 IP、密钥、令牌和主机名均已进行脱敏处理，以保障网络安全。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别再用旧方法了！Ubuntu 26.04 LTS 一键搞定最新 Docker 社区版与极速镜像源配置</title>
      <link>https://blog.margrop.net/post/ubuntu-26-docker-install-guide/</link>
      <pubDate>Tue, 26 May 2026 10:00:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ubuntu-26-docker-install-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;写在前面&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;随着 Ubuntu 26.04 LTS（Resolute Raccoon）的正式发布，许多开发者和系统管理员都开始将他们的开发与生产环境迁移至这个最新的长期支持版本。然而，作为容器化技术的基石，Docker 在新系统上的安装与配置却给不少人带来了困扰。&lt;/p&gt;&#xA;&lt;p&gt;如果你还在使用传统的 &lt;code&gt;apt-get install docker.io&lt;/code&gt; 或者套用几年前的 Ubuntu 20.04/22.04 旧教程来配置 APT 源与镜像加速，那么你可能会面临软件包版本陈旧、源格式冲突（DEB822 新格式带来的困惑）、或者因网络阻断导致镜像无法拉取的窘境。&lt;/p&gt;&#xA;&lt;p&gt;本文将手把手带你深度剖析 Ubuntu 26.04 下 Docker 社区版（Docker CE）的正确安装姿势，并结合最新的 DEB822 源规范、非 Root 用户安全权限划分、以及在当前复杂网络环境下的极速代理与私有镜像源配置，为你奉上一份真正结构化、高可用的实战指南。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>百度网盘别只会拖拽：BaiduPCS-Go CLI 和 Agent 自动化实战</title>
      <link>https://blog.margrop.net/post/baidupcs-go-cli-agent-guide/</link>
      <pubDate>Sat, 16 May 2026 10:06:01 +0800</pubDate>
      <guid>https://blog.margrop.net/post/baidupcs-go-cli-agent-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;如果你只是偶尔从百度网盘下载一两个文件，网页和官方客户端当然够用。但只要你开始批量下载、服务器拉取、自动备份、远程归档、目录巡检，或者希望让 Codex、Claude、OpenClaw、HermesAgent 这类 Agent 帮你处理网盘任务，图形界面很快就会变成阻碍。&lt;code&gt;BaiduPCS-Go&lt;/code&gt; 的价值不是“神奇提速”，而是把百度网盘变成一个可以被脚本、终端和 Agent 调度的文件系统入口。本文会从安装核验、BDUSS/STOKEN 登录、常用命令、配置策略、安全边界，一直讲到怎样把它交给 Agent 使用。&lt;/p&gt;&#xA;&lt;p&gt;本文所有账号、Cookie、路径、任务描述和配置均为脱敏示例，不包含任何真实 BDUSS、STOKEN、Cookie、内网地址、私人目录或业务信息。请不要把自己的登录凭据写进公开仓库、博客、截图、聊天记录或 Agent 提示词正文。&lt;/p&gt;&#xA;&lt;/blockquote&gt;</description>
    </item>
    <item>
      <title>别再远程桌面点点点：让 AI Agent 用 SSH 直接接管 Windows</title>
      <link>https://blog.margrop.net/post/agent-ssh-windows-openssh/</link>
      <pubDate>Wed, 13 May 2026 08:10:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/agent-ssh-windows-openssh/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;让 AI Agent 从 Linux 或 macOS 管理 Windows，并不一定要走远程桌面、VNC、商业远控软件，也不一定要额外装一套奇怪的 Agent Runtime。对大多数个人工作站、实验机、开发机和内网服务器来说，最简单、最干净、最容易被自动化工具理解的方案，就是在 Windows 上启用系统自带的 &lt;strong&gt;OpenSSH Server&lt;/strong&gt;，然后从 Linux/macOS 直接执行：&lt;code&gt;ssh &amp;lt;user&amp;gt;@&amp;lt;windows-host&amp;gt;&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;真正需要做好的只有三件事：第一，Win10 / Win11 正确安装并启动 OpenSSH Server；第二，在 Linux/macOS 生成 SSH key，把公钥放到 Windows 对应位置；第三，如果登录用户属于 Windows 管理员组，要把公钥写入 &lt;code&gt;C:\ProgramData\ssh\administrators_authorized_keys&lt;/code&gt;，并用 &lt;code&gt;icacls&lt;/code&gt; 收紧权限。完成以后，AI Agent 就可以像操作 Linux 一样，用 SSH 在 Windows 上执行 PowerShell、复制脚本、读取日志、安装工具和做自动化运维。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文所有命令、截图和主机信息都使用通用占位符，不包含真实内网地址、真实用户名、真实机器名、密钥、Token 或私人路径。你只需要把 &lt;code&gt;&amp;lt;user&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;windows-host&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;windows-ip&amp;gt;&lt;/code&gt; 这类占位符替换成自己的环境值即可。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Ubuntu 26.04 升级别乱按：Agent 一句话托管，人工路线也一次讲透</title>
      <link>https://blog.margrop.net/post/ubuntu-2604-upgrade-agent-manual-guide/</link>
      <pubDate>Tue, 12 May 2026 07:30:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/ubuntu-2604-upgrade-agent-manual-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ubuntu 22.04 / 24.04 升级到 26.04，最重要的不是记住某一条命令，而是先搞清楚升级路径。22.04 LTS 不能直接跳到 26.04 LTS，必须先升级到 24.04 LTS，再从 24.04 LTS 进入 26.04 LTS。并且截至 2026-05-12，Ubuntu 26.04 LTS 虽然已经正式发布，但 24.04 LTS 到 26.04 LTS 的常规 LTS 升级提示通常要等 26.04.1 之后才会面向普通 LTS 用户开放；官方计划里的 26.04.1 Point Release 日期是 2026-07-09。生产机器建议等常规升级路径打开，测试机或评估机才考虑显式使用提前升级参数。&lt;/p&gt;&#xA;&lt;p&gt;如果你已经在使用 Code、Claude、OpenClaw、HermesAgent 这类 Agent，完全可以用一句话把升级任务交出去，让它先做检查、备份、升级和验证，节省大量重复操作时间。但这句话不能只写“帮我升级 Ubuntu”，而要把安全边界、升级路径、备份、业务验证和回滚要求说清楚。本文会给出可以直接复制的 Agent 提示词，也会给出完全人工执行的步骤。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;本文不会出现任何真实主机名、内网地址、账号、密钥、Token、业务系统名称或私人路径。所有命令都使用通用占位符，例如 &lt;code&gt;&amp;lt;HOST&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;SERVICE&amp;gt;&lt;/code&gt;、&lt;code&gt;&amp;lt;BACKUP_DIR&amp;gt;&lt;/code&gt;。你可以把它们替换成自己的环境值。&lt;/p&gt;</description>
    </item>
    <item>
      <title>【转】Synology DiskStation Administration CLI Guide 官方文档导读与命令速查</title>
      <link>https://blog.margrop.net/post/zhuan-synology-diskstation-administration-cli-guide/</link>
      <pubDate>Thu, 30 Apr 2026 18:14:05 +0800</pubDate>
      <guid>https://blog.margrop.net/post/zhuan-synology-diskstation-administration-cli-guide/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;先说结论&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Synology 这份官方 CLI 管理指南并不是一本面向普通 DSM 图形界面用户的入门手册，而是一份给脚本、自动化和系统集成场景准备的命令参考。它覆盖了 DSM 中最常见的几类管理动作：本地用户、本地群组、共享文件夹、网络配置、服务控制、工作组或 ADS 域设置，以及错误码查询。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;这篇文章是基于 Synology 官方 PDF《CLI Administrator Guide for Synology NAS》整理的中文导读和命令速查。由于原 PDF 属于 Synology 官方版权文档，本文不会全文复制或逐段翻译原文，而是按博客阅读习惯重新组织成一份便于检索、理解和日常运维使用的双语整理稿。需要逐字核对参数定义、版本差异或法律声明时，请直接阅读文末的官方 PDF 来源。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Alpine Linux 上使用 LXC 容器搭建 V2Ray 和 Caddy 服务，提供基于 IPv6 的 SSL WebSocket 代理</title>
      <link>https://blog.margrop.net/post/setting-up-v2ray-and-caddy-on-alpine-linux-lxc-container/</link>
      <pubDate>Wed, 03 Jul 2024 15:32:41 +0800</pubDate>
      <guid>https://blog.margrop.net/post/setting-up-v2ray-and-caddy-on-alpine-linux-lxc-container/</guid>
      <description>&lt;h3 id=&#34;前言&#34;&gt;前言&lt;/h3&gt;&#xA;&lt;p&gt;在现代互联网环境中，代理服务变得越来越重要，特别是在需要突破地域限制和提升隐私保护的时候。本文将详细介绍如何在 Alpine Linux 3.19 操作系统的 LXC 容器上，使用 V2Ray 和 Caddy 来搭建一个通过 IPv6 和域名提供的 SSL WebSocket 代理服务。&lt;/p&gt;&#xA;&lt;h3 id=&#34;环境准备&#34;&gt;环境准备&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;确保你的 LXC 容器运行并已分配 IPv6 地址&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;确保你的域名已解析到你的 LXC 容器的 IPv6 地址&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>在Proxmox VE中快速设置Fail2ban防止多次登录失败的有效方法</title>
      <link>https://blog.margrop.net/post/how-to-quickly-configure-fail2ban-in-proxmox-ve/</link>
      <pubDate>Tue, 18 Jun 2024 15:33:01 +0800</pubDate>
      <guid>https://blog.margrop.net/post/how-to-quickly-configure-fail2ban-in-proxmox-ve/</guid>
      <description>&lt;p&gt;这里简要介绍了如何在Proxmox VE中设置Fail2ban以暂时阻止多次错误登录尝试的IP地址。&lt;/p&gt;&#xA;&lt;h3 id=&#34;安装fail2ban&#34;&gt;安装Fail2ban&lt;/h3&gt;&#xA;&lt;p&gt;在Proxmox VE主机上作为root执行以下命令：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt update&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;apt install fail2ban&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;配置基础设置&#34;&gt;配置基础设置&lt;/h3&gt;&#xA;&lt;p&gt;建议使用&lt;code&gt;/etc/fail2ban/jail.local&lt;/code&gt;文件，其设置优先于&lt;code&gt;jail.conf&lt;/code&gt;。使用以下命令复制模板：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>CentOS7 开机自动添加N2N的路由表</title>
      <link>https://blog.margrop.net/post/centos7-auto-add-route-table-for-n2n-edge/</link>
      <pubDate>Sun, 06 Feb 2022 19:50:38 +0800</pubDate>
      <guid>https://blog.margrop.net/post/centos7-auto-add-route-table-for-n2n-edge/</guid>
      <description>&lt;h1 id=&#34;1-编辑-systemctl-自启动文件&#34;&gt;1. 编辑 &lt;code&gt;systemctl&lt;/code&gt; 自启动文件&lt;/h1&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;vim /etc/systemd/system/n2route.service&#xA;&lt;/code&gt;&lt;/pre&gt;</description>
    </item>
    <item>
      <title>Linux启动时，如何编辑GRUB2的启动参数</title>
      <link>https://blog.margrop.net/post/edit-grub2-during-the-boot-process/</link>
      <pubDate>Wed, 08 Dec 2021 09:29:58 +0800</pubDate>
      <guid>https://blog.margrop.net/post/edit-grub2-during-the-boot-process/</guid>
      <description>&lt;h1 id=&#34;to-edit-grub2-during-the-boot-process-try-the-following&#34;&gt;To edit Grub2 during the boot process try the following:&lt;/h1&gt;&#xA;&lt;h1 id=&#34;为了在启动时编辑grub2可以尝试下面的步骤&#34;&gt;为了在启动时，编辑GRUB2，可以尝试下面的步骤&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Immediately after the BIOS splash screen during boot, press and hold the &lt;code&gt;SHIFT&lt;/code&gt; button. This will display you &lt;code&gt;grub&lt;/code&gt; containing a list of kernels and recovery options&#xA;在启动过程中出现 BIOS 启动画面后，立即按住&lt;code&gt;SHIFT&lt;/code&gt;按键。&#xA;这将显示包含内核和恢复选项列表的&lt;code&gt;grub&lt;/code&gt;。&#xA;&lt;img src=&#34;https://blog.margrop.net/post-images/ZlSUO.png&#34;&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Vim打开文件中文乱码</title>
      <link>https://blog.margrop.net/post/vim-open-files-messy-code-solution/</link>
      <pubDate>Sat, 15 May 2021 16:27:00 +0800</pubDate>
      <guid>https://blog.margrop.net/post/vim-open-files-messy-code-solution/</guid>
      <description>&lt;h1 id=&#34;解决办法&#34;&gt;解决办法&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;编辑 ~/.vimrc 文件（没有则手动创建） 添加如下几行&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set fileencodings&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;utf-8,ucs-bom,gb18030,gbk,gb2312,cp936&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set termencoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;utf-8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;set encoding&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;utf-8&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>Java基于 SpringBoot 的 JNI 本地方法库加载器</title>
      <link>https://blog.margrop.net/post/java-spring-boot-jni-java-native-interface-library-loader/</link>
      <pubDate>Sat, 27 Mar 2021 16:37:31 +0800</pubDate>
      <guid>https://blog.margrop.net/post/java-spring-boot-jni-java-native-interface-library-loader/</guid>
      <description>&lt;p&gt;由于Java跨平台需要，自行写了一个跨平台的 JNI 本地方法库加载器。&lt;/p&gt;&#xA;&lt;h1 id=&#34;简单实现逻辑&#34;&gt;简单实现逻辑&lt;/h1&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;根据环境变量&lt;code&gt;os.name&lt;/code&gt;，判断当前系统属于&lt;code&gt;Windows&lt;/code&gt;,&lt;code&gt;Linux&lt;/code&gt;还是&lt;code&gt;MacOS&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;如果是&lt;code&gt;Linux&lt;/code&gt;，继续判断是&lt;code&gt;CentOS&lt;/code&gt;还是&lt;code&gt;Debian&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;读取 jar 包中的库文件&lt;/li&gt;&#xA;&lt;li&gt;根据文件名后缀&lt;code&gt;dll&lt;/code&gt;、&lt;code&gt;so&lt;/code&gt;、&lt;code&gt;jnilib&lt;/code&gt;和&lt;code&gt;dylib&lt;/code&gt;，过滤符合当前平台的库文件&lt;/li&gt;&#xA;&lt;li&gt;将当前平台的库文件复制到系统临时目录&lt;code&gt;java.io.tmpdir&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;使用&lt;code&gt;System.load&lt;/code&gt;加载库文件&lt;/li&gt;&#xA;&lt;/ol&gt;</description>
    </item>
    <item>
      <title>如何通过 NPM 安装 Node-RED</title>
      <link>https://blog.margrop.net/post/how-to-install-nodered-with-npm/</link>
      <pubDate>Mon, 01 Feb 2021 09:57:07 +0800</pubDate>
      <guid>https://blog.margrop.net/post/how-to-install-nodered-with-npm/</guid>
      <description>&lt;h1 id=&#34;node-red是什么&#34;&gt;&lt;code&gt;Node-RED&lt;/code&gt;是什么&lt;/h1&gt;&#xA;&lt;p&gt;&lt;code&gt;Node-RED&lt;/code&gt;是一种低代码/无代码编程工具，用于以新颖有趣的方式将&lt;code&gt;硬件设备&lt;/code&gt;，&lt;code&gt;API&lt;/code&gt;和&lt;code&gt;在线服务&lt;/code&gt;连接在一起。特别适用于&lt;code&gt;智能家居&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Node-RED&lt;/code&gt;提供了一个基于浏览器的流编辑器，可轻松使用面板中的各种节点将流连接在一起。然后，单击即可将流部署到运行时。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CentOS安装Frp客户端，可使用SSH</title>
      <link>https://blog.margrop.net/post/centos-install-frp-client-for-ssh/</link>
      <pubDate>Sat, 23 Jan 2021 17:22:58 +0800</pubDate>
      <guid>https://blog.margrop.net/post/centos-install-frp-client-for-ssh/</guid>
      <description>&lt;h1 id=&#34;下载并解压frp&#34;&gt;下载并解压Frp&lt;/h1&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;最新Frp下载地址：&lt;a href=&#34;https://github.com/fatedier/frp/releases/&#34;&gt;https://github.com/fatedier/frp/releases/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir ~/frp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd ~/frp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://github.com/fatedier/frp/releases/download/v0.35.0/frp_0.35.0_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xvzf frp_0.35.0_linux_amd64.tar.gz&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
  </channel>
</rss>
