<?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>Atom Blog</title>
    <description>A modern, lightweight blog built with Astro</description>
    <link>https://atom.inte8.top/</link>
    <atom:link href="https://atom.inte8.top/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>DrawThings 完全使用指南：苹果设备本地 AI 绘画利器</title>
      <link>https://atom.inte8.top/blog/DrawThings完全使用指南/</link>
      <guid>https://atom.inte8.top/blog/DrawThings完全使用指南/</guid>
      <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
      <description>DrawThings 完全使用指南：在 iPhone、iPad、Mac 上本地运行 Stable Diffusion / Flux 等扩散模型，离线生成 AI 图像与视频</description>
      <category>技术教程</category>
      <category>DrawThings</category>
      <category>AI绘画</category>
      <category>Stable Diffusion</category>
      <category>Apple Silicon</category>

      <content:encoded><![CDATA[# DrawThings 完全使用指南：苹果设备本地 AI 绘画利器

> **最后更新**：2026-09-25
> **官方网站**：[drawthings.ai](https://drawthings.ai/)
> **官方 Wiki**：[wiki.drawthings.ai](https://wiki.drawthings.ai/)
> **App Store**：[Draw Things: Offline AI Art](https://apps.apple.com/us/app/draw-things-offline-ai-art/id6444050820)

---

## 一、什么是 DrawThings？

**DrawThings** 是一款面向 Apple 生态的**免费、离线、开源** AI 图像与视频生成应用。它支持在 **iPhone、iPad 和 Mac** 上本地运行 Stable Diffusion、Flux.1、SDXL、HiDream、Wan 2.2 等主流扩散模型，整个推理过程完全在本机完成——**无需联网、无需订阅、无任何内容审查或次数限制**。

### 1.1 核心特性

| 特性 | 说明 |
|------|------|
| 🆓 **完全免费** | App Store 免费下载，无内购、无订阅 |
| 🔒 **离线运行** | 所有计算在本地完成，**数据不上传任何服务器**，隐私友好 |
| 🚫 **零审查** | 不存在任何内容过滤器，使用上完全自由 |
| 🎨 **多模态生成** | 文生图（txt2img）、图生图（img2img）、局部重绘（inpainting）、扩展画布（outpainting）、视频生成 |
| 🧩 **高级能力** | 支持 ControlNet、LoRA 训练与导入、模型融合、风格模板 |
| ⚡ **深度优化** | 针对 Apple Silicon 的 Metal、Core ML、ANE（神经网络引擎）做了极致优化 |

### 1.2 支持的模型

**图像模型**

- Stable Diffusion 1.5 / 2.0 / XL（SDXL）
- Flux.1 / Flux.2
- HiDream
- Kwai Kolors
- SD3 Medium / 3.5
- Wan 2.2
- Qwen Image
- Z Image
- ERNIE Image

**视频模型**

- LTX-2 / 2.3
- Wan 2.1
- Hunyuan Video

> 💡 **新手推荐**：内存吃紧的设备优先选 **HiDream** 或 **SDXL**；高级用户可用 **Flux.1** 配合 LoRA 和 ControlNet。

---

## 二、硬件与性能

### 2.1 设备要求

| 平台 | 最低要求 | 推荐配置 |
|------|----------|----------|
| **Mac** | Apple Silicon M1 | M2 Pro / M3 / M4 / M5，**16GB+ 内存** |
| **iPhone** | iPhone 12 及以上（A14 及以上） | iPhone 15 Pro / 16 Pro |
| **iPad** | M1 及以上 iPad | M2 / M4 iPad Pro |

### 2.2 加速技术

DrawThings 充分利用 Apple Silicon 的硬件特性：

- **Metal** — Apple 的 GPU 加速 API
- **Core ML** — Apple 的机器学习框架
- **ANE（Apple Neural Engine）** — 神经网络引擎，提供额外算力
- **Metal FlashAttention 2.5** — 配合 Neural Accelerators，M5 比 M4 性能提升 **4.6×**
- **8-bit 量化模型** — 在 M4 上可获得最高 **1.8×** 提速

> ⚠️ **性能注意**：旧款 iPhone 生成一张 512×512 图像可能需要约 1 分钟；M 系列 Mac 由于统一内存架构（RAM 即 VRAM），可灵活加载大模型。

### 2.3 模型存储路径

模型下载后默认存储在：

**Mac**
```
~/Library/Containers/Draw Things/Data/Documents/Models/
```

**iOS**
应用沙盒内的 `Models/` 目录，可通过 Files App 访问。

---

## 三、安装与快速开始

### 3.1 安装应用

前往 App Store 搜索 **"Draw Things: Offline AI Art"** 下载安装。整个安装过程不到一分钟，无任何账号注册要求。

### 3.2 首次启动

1. 打开应用，进入主界面
2. **下载基础模型**：在模型下拉菜单中选择一个基础模型（推荐 **SDXL Hyper** 或 **HiDream**），点击下载按钮
3. 等待模型下载完成（首次通常需要 2–10 GB 流量）
4. 完成后即可开始生成

### 3.3 第一次生成（Quick Start）

最简单的三步流程：

1. **输入提示词（Prompt）**：在文本框中输入画面描述，例如：`a cute cat sitting on a windowsill, soft sunlight, cinematic`
2. **调整核心参数**：
   - **Steps（步数）**：20–30（标准区间）
   - **CFG Scale**：4.5–7（典型区间，数值越高越贴合提示词）
   - **Resolution（分辨率）**：512×768（速度优先）/ 1024×1024（质量优先）
3. 点击 **Generate**，等待出图

> 🎯 **技巧**：调整完所有参数后，可保存为「Configuration」，下次一键复用（包含模型、LoRA、ControlNet、Steps、CFG、采样器等全部参数）。

---

## 四、核心参数详解

### 4.1 关键参数表

| 参数 | 推荐范围 | 作用 |
|------|----------|------|
| **Steps** | 20–30 | 迭代步数，越多越精细但越慢 |
| **CFG Scale** | 4.5–7 | 提示词引导强度，过高会出现过饱和 |
| **Resolution** | 512–1024 | 输出尺寸，大幅影响速度与显存 |
| **Sampler** | Euler / DPM++ 2M | 采样算法，影响收敛速度与风格 |
| **Seed** | 随机 | 随机种子，相同时可复现结果 |

### 4.2 提示词（Prompt）编写

#### 4.2.1 基本结构

一个高质量的提示词通常包含：

```
主体 + 动作/姿态 + 场景/背景 + 风格 + 光照 + 镜头/构图 + 画质词
```

**示例**：

```
a young woman with long silver hair, standing in a rainy neon city,
looking over her shoulder, cyberpunk style, dramatic rim lighting,
cinematic composition, ultra-detailed, 8k, sharp focus
```

#### 4.2.2 常用质量词

```
masterpiece, best quality, ultra-detailed, 8k, sharp focus,
cinematic lighting, photorealistic, intricate details
```

#### 4.2.3 负面提示词（Negative Prompt）

打开 **Prompt 面板 → 切换到 Negative Prompt**，用于排除不希望出现的元素：

```
lowres, bad anatomy, bad hands, text, error, missing fingers,
extra digit, fewer digits, cropped, worst quality, low quality,
jpeg artifacts, signature, watermark, username, blurry
```

### 4.3 提示词编写进阶

- **权重重载**：使用 `(关键词:1.2)` 提升权重，`(关键词:0.8)` 降低权重
- **分层描述**：从主体到背景分层写，避免长句堆叠
- **避免否定词**：用「Negative Prompt」表达否定，提示词中不要写「no xxx」
- **参考模板**：在 `Style Templates` 菜单中有官方与社区维护的模板可直接套用

---

## 五、高级功能

### 5.1 ControlNet 基础

**ControlNet** 通过额外的图像输入（如线稿、深度图、边缘图）来精确控制生成结果。

#### 5.1.1 支持类型

- **Canny** — 边缘图，控制构图轮廓
- **Depth** — 深度图，控制空间层次
- **Pose** — 姿态图，控制人物动作
- **Lineart** — 线稿图，控制线条风格

#### 5.1.2 使用步骤

1. 在右侧 ControlNet 面板点击 **Add ControlNet**
2. 选择类型（Canny / Depth / Pose 等）
3. 上传参考图或绘制草图
4. 调整 **Control Weight**（0.5–1.5 推荐）
5. 配合提示词生成

> 💡 **优化 ControlNet**：DrawThings 官方云端下载菜单提供专为 Apple Silicon 优化的 ControlNet 版本，比通用 Diffusers / Stability AI 转换版速度更快。

### 5.2 LoRA 使用与训练

**LoRA（Low-Rank Adaptation）** 是一种轻量微调技术，可以用少量资源训练特定角色、风格或概念。

#### 5.2.1 安装 LoRA

**方式一：云端下载**

模型下拉菜单中选择 **LoRA → Cloud Download**，从官方列表中挑选。

**方式二：本地导入**

把 `.safetensors` 文件放入 Models 目录，重启应用后即可在 LoRA 列表中找到。

#### 5.2.2 训练自己的 LoRA

DrawThings **原生支持本地 LoRA 训练**，基于 PEFT（Parameter-Efficient Fine-Tuning）：

1. 进入 **Training** 模式
2. 选择基础模型（推荐 SDXL、Flux.1 [dev]、Kwai Kolors、SD3 Medium 3.5）
3. 准备数据集（建议 10–30 张同一主题的高质量图片）
4. 设置训练参数：
   - **Learning Rate**：1e-4 到 5e-5
   - **Steps**：1000–3000
   - **Batch Size**：根据显存调整
   - **Network Rank**：常用 16 / 32 / 64
5. 开始训练，结束后自动保存为 `.safetensors`

> 🔥 **BYOL（Bring Your Own LoRA）**：1.20250523.0 版本后提供 **20GB 私有云存储**，可上传、备份、分享自定义 LoRA。

### 5.3 模型融合（Model Merging）

把多个模型的权重按比例混合，生成新风格的混合模型。

1. 进入 **Models** 页面 → **Merge Models**
2. 选择 2–3 个基础模型
3. 调整混合比例（0.0–1.0 滑块）
4. 输入新模型名称，点击 **Merge**

### 5.4 局部重绘（Inpainting）

用于修改画面中的特定区域：

1. 进入 **Inpainting** 模式
2. 用画笔涂抹需要重绘的区域（生成蒙版）
3. 输入新内容的提示词
4. 点击 Generate

**典型场景**：换脸、修复瑕疵、修改服装、去除水印。

### 5.5 扩展画布（Outpainting）

把图像向四周延伸：

1. 切换到 **Outpainting**
2. 调整扩展方向与距离
3. 提示词描述扩展区域的内容
4. 生成

适合为竖图补全横向场景，或反向扩展。

### 5.6 图生图（img2img）

上传参考图，按强度（Strength）参数控制与原图的相似度：

- **Strength 0.3–0.5**：保留构图，只改风格
- **Strength 0.6–0.8**：参考布局，但大幅变化
- **Strength 0.9+**：几乎只参考色调

### 5.7 视频生成

DrawThings 已支持**文生视频 / 图生视频**：

- 支持模型：**LTX-2 / 2.3、Wan 2.1、Hunyuan Video**
- 流程与图像类似，但需要更多显存与时间
- 适合短片段（4 秒起）

---

## 六、性能优化与提速

### 6.1 如何让生成更快

| 优化手段 | 提速幅度 |
|----------|----------|
| 升级到 M4 / M5 芯片 | 4–5× |
| 使用 **8-bit 量化模型** | 1.5–1.8× |
| 启用 **ANE 加速**（在设置中开启） | 1.3–1.5× |
| 降低 **Steps** 到 15–20 | 1.3–1.5× |
| 降低分辨率到 512×768 | 2–3× |
| 关闭 ControlNet 和 LoRA | 1.2–1.5× |

### 6.2 不同设备的合理预期

| 设备 | 512×512 / 20 steps | 1024×1024 / 30 steps |
|------|---------------------|----------------------|
| iPhone 12 | ~60 秒 | 不可行 |
| iPhone 15 Pro | ~15 秒 | ~60 秒 |
| M1 Mac（16GB） | ~10 秒 | ~30 秒 |
| M4 Pro Mac（48GB） | ~3 秒 | ~10 秒 |
| M5 Max Mac | < 1 秒 | ~3 秒 |

> 数据为大致量级，实际取决于模型、Steps 与量化精度。

---

## 七、实用技巧与最佳实践

### 7.1 配置管理

把常用模型 + LoRA + 参数组合保存为**预设（Configurations）**，切换场景时一键加载，避免每次手动调节。

### 7.2 种子（Seed）策略

- 找到满意结果后**记录 Seed**，便于微调提示词后再生成同构图
- 在 `Generation History` 中可一键复制 Seed
- 同 Seed + 同参数 = 同结果

### 7.3 图生图做风格迁移

把真实照片转为动漫、油画、像素风等：

1. 上传原图
2. Strength 调到 0.4–0.6
3. 提示词写目标风格，例如 `studio ghibli style, watercolor`

### 7.4 多 ControlNet 组合

可同时叠加多个 ControlNet（如 Canny + Depth），精准控制构图与空间关系。

### 7.5 高清放大（Hires Fix）

DrawThings 内置 **Hires Fix** 功能，先生成低分辨率，再放大重绘细节：

1. 启用 **Hires Fix**
2. 设置放大倍数（1.5× / 2×）
3. 设置 Hires Steps（10–15 即可）

---

## 八、常见问题（FAQ）

### Q1：模型必须联网下载吗？

模型文件本身需要从云端下载一次，但下载完成后**完全离线运行**，包括 LoRA 训练也无需联网。

### Q2：能生成 NSFW 内容吗？

**没有任何内容过滤器**，完全由用户自行决定使用方式。

### Q3：会消耗很多电量吗？

会。AI 推理是重负载计算，建议插电使用 Mac，或在 iPhone 上提前充好电。

### Q4：与 ComfyUI、Stable Diffusion WebUI 相比如何？

| 工具 | 平台 | 优势 |
|------|------|------|
| **DrawThings** | 仅 Apple 生态 | 极简、零配置、Apple Silicon 深度优化 |
| **ComfyUI** | 全平台 | 节点式工作流、高度灵活、社区生态丰富 |
| **SD WebUI (A1111)** | 全平台 | 插件生态成熟、用户基数大 |
| **DiffusionBee** | 仅 macOS | 类似 DrawThings，但更新已停滞 |

> DrawThings 提供了 **Local Server 模式**，可在 Mac 上启动 API 服务，配合 ComfyUI 等外部工具调用。

### Q5：模型放在哪里？

Mac 默认 `~/Library/Containers/Draw Things/Data/Documents/Models/`，可手动放入 `.safetensors` 文件后重启应用加载。

### Q6：如何备份自定义 LoRA？

- 方式一：拷贝 `Models/LoRA/` 目录
- 方式二：使用 v1.20250523.0+ 的 **BYOL** 私有云存储（20GB）

---

## 九、推荐工作流

### 9.1 角色一致性插画

1. 训练或下载目标角色的 LoRA
2. 用 **HiDream / Flux.1** 作基础模型
3. 加入 LoRA，权重 0.6–0.8
4. 用 ControlNet **Pose** 锁定动作
5. 用 ControlNet **Depth** 锁定空间层次
6. 启用 **Hires Fix** 出 1024×1024+ 大图

### 9.2 照片转插画

1. 上传原图到 img2img
2. Strength = 0.45
3. 提示词：`studio ghibli style, watercolor, soft lighting`
4. Negative：`photorealistic, 3d, modern`
5. 生成后再用 img2img 微调

### 9.3 产品概念图

1. 用 **Canny ControlNet** 描出产品轮廓
2. 提示词描述材质、光照、背景
3. CFG = 5.5，Steps = 25
4. 启用 Hires Fix 放大到 2K

---

## 十、结语

DrawThings 是目前 **Apple 生态下体验最完整、上手门槛最低** 的本地 AI 绘画工具。凭借对 Metal / ANE 的极致优化，它在 M 系列芯片上的表现甚至优于许多通用 Stable Diffusion 客户端；而开源、零审查、零订阅的定位，也让创作者拥有最大自由度。

如果你是：

- 🍎 **Apple 用户**，想零门槛体验本地 AI 绘画 → DrawThings 是首选
- 🎨 **创作者**，希望完全掌控数据与作品 → 离线 + 无审查特性无可替代
- 🛠️ **极客 / 开发者**，需要本地 LoRA 训练 + API 服务 → BYOL 与 Local Server 模式足够用

> ⭐ **小贴士**：建议从 **SDXL 或 HiDream** 起步练手，熟悉后再切换到 **Flux.1** 玩 LoRA 和 ControlNet。

---

## 参考资料

- [DrawThings 官方网站](https://drawthings.ai/)
- [DrawThings 官方 Wiki](https://wiki.drawthings.ai/)
- [App Store 下载](https://apps.apple.com/us/app/draw-things-offline-ai-art/id6444050820)
- [Engineering @ Draw Things — Metal FlashAttention 2.5](https://engineering.drawthings.ai/p/metal-flashattention-2-0-pushing-forward-on-device-inference-training-on-apple-silicon-fe8aac1ab23c)
- [Quick Start Wiki](https://wiki.drawthings.ai/wiki/Quick_Start)
- [ControlNet Basics](https://wiki.drawthings.ai/wiki/ControlNet_Basics)
- [LoRA Training](https://wiki.drawthings.ai/wiki/LoRA_Training)
- [Prompting Basics](https://wiki.drawthings.ai/wiki/Prompting_Base_Model_Basics)]]></content:encoded>
    </item>
    <item>
      <title>Atom 博客的技术架构解析</title>
      <link>https://atom.inte8.top/blog/astro-blog-tutorial/</link>
      <guid>https://atom.inte8.top/blog/astro-blog-tutorial/</guid>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <description>从 Astro 内容集合、构建流水线、GitHub Pages 自动部署三个角度，拆解 Atom 博客是怎么从 Markdown 文件变成可访问的静态网站。</description>
      <category>tutorial</category>
      <category>Astro</category>
      <category>架构</category>
      <category>GitHub Pages</category>
      <category>部署</category>

      <content:encoded><![CDATA[如果你对 Atom 博客**背后的技术栈**感兴趣——它为什么能做到零 JavaScript、构建产物体积小、部署到 GitHub Pages 完全免费——这篇文章会从三个角度拆解：**Astro 内容集合**、**构建流水线**、**GitHub Pages 自动部署**。

## 一、为什么选 Astro

Astro 是一个现代静态站点生成器，与 Atom 的轻量化定位非常契合：

- **零 JavaScript 默认** —— 页面输出纯 HTML，按需加载交互脚本
- **内容优先** —— 原生支持 Markdown/MDX 内容集合，内置类型检查
- **构建快速** —— 基于 Vite，开发体验流畅
- **部署友好** —— 输出纯静态文件，GitHub Pages / Cloudflare Pages / Vercel 都能跑

整个 Atom 博客的**生产依赖只有 1 个** (`astro`)，构建产物约 700KB，单页 HTML 7-20KB。

## 二、内容集合（Content Collections）

Astro 的内容集合提供**类型安全的 Markdown 管理**。在 `src/content.config.ts` 定义 schema：

```ts
import { defineCollection, z } from 'astro:content';

const blog = defineCollection({
  loader: glob({ pattern: '**/*.{md,mdx}', base: './src/content/blog' }),
  schema: z.object({
    title: z.string(),
    description: z.string(),
    pubDate: z.coerce.date(),
    updatedDate: z.coerce.date().optional(),
    heroImage: z.string().optional(),
    featuredImage: z.string().optional(),
    category: z.string().default(''),
    tags: z.array(z.string()).default([]),
    reward: z.boolean().optional(),
    draft: z.boolean().optional(),
  }),
});

export const collections = { blog };
```

文章必须严格遵守 schema，否则**构建时立即报错**——这比运行时发现要好得多。

## 三、构建流水线

`npm run build` 的实际流程（按顺序）：

```
1. 主题扫描      (src/themes/ → src/generated/themes.css + themes.ts)
2. 预压缩 app.js (public/js/app.js via esbuild)
3. Astro build   (Markdown → HTML, 生成静态文件到 dist/)
4. postbuild:
   - generate-rss.mjs   (生成 RSS Feed + 搜索索引)
   - fix-sitemap.mjs    (用真实 updatedDate 替换构建时间)
   - 复制 dist/Atom/js/app.js 到 dist/  (GitHub Pages 子路径)
```

`theme-loader.mjs` 这个 Astro 插件是关键——它**构建时**扫描 `src/themes/` 目录，自动生成主题清单和 CSS 入口，让第三方开发者添加主题时**零配置**。

## 四、GitHub Actions 自动部署

`.github/workflows/deploy.yml` 配置：

```yaml
on:
  push:
    branches: [main]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run build
        env:
          DEPLOY_TARGET: github    # 触发 base='/repo-name' 子路径模式
      - uses: actions/upload-pages-artifact@v3
        with:
          path: dist
  deploy:
    needs: build
    environment:
      name: github-pages
    runs-on: ubuntu-latest
    steps:
      - uses: actions/deploy-pages@v4
```

`astro.config.mjs` 检测 `DEPLOY_TARGET=github` 环境变量，自动设置 `base='/Atom'`，所有 HTML 中的链接自动加前缀。

## 五、子路径部署的坑

GitHub Pages 把 `dist/` 整个目录服务在 `https://<user>.github.io/Atom/` 下，**不是根目录**。

这意味着：
- ✅ HTML 中写 `/Atom/blog/foo/` → 实际访问 `dist/blog/foo/index.html` → 200
- ❌ 但 `public/js/app.js` 默认会复制到 `dist/js/app.js`，**不在子路径下**
- ❌ HTML 引用 `/Atom/js/app.js` → 404

**解决方法**：在 `scripts/minify-app-js.mjs` 里**预先**把 `public/js/app.js` 复制到 `public/Atom/js/app.js`，Astro build 时会一并复制到 `dist/Atom/js/app.js`。这也是为什么 build 必须分成两步（先 minify，再 build）。

## 六、进一步学习

- 📖 [Astro 官方文档](https://docs.astro.build)
- 📖 [Content Collections 指南](https://docs.astro.build/en/guides/content-collections/)
- 📖 [GitHub Pages 部署](https://docs.astro.build/en/guides/deploy/github/)
- 📖 [Markdown 语法参考](https://commonmark.org/)
- 🎨 [Atom 博客](https://zz3656.github.io/Atom) — 上面所有理念的实际应用]]></content:encoded>
    </item>
    <item>
      <title>Markdown 写作完全指南</title>
      <link>https://atom.inte8.top/blog/markdown-guide/</link>
      <guid>https://atom.inte8.top/blog/markdown-guide/</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <description>掌握 Markdown 的常用语法——标题、列表、代码块、表格、引用、链接、图片——让你的博客写作效率翻倍。</description>
      <category>guide</category>
      <category>Markdown</category>
      <category>写作</category>
      <category>教程</category>
      <category>文档</category>

      <content:encoded><![CDATA[Markdown 是一种轻量级标记语言，可以用纯文本写出结构化文档。本指南覆盖 Atom 博客支持的所有常用语法。

## 标题

使用 `#` 表示标题（1-6 级）：

```markdown
# 一级标题
## 二级标题
### 三级标题
```

## 段落与强调

```markdown
普通文本，**加粗**，*斜体*，~~删除线~~，`行内代码`
```

效果：普通文本，**加粗**，*斜体*，~~删除线~~，`行内代码`

## 列表

**无序列表**：

```markdown
- 项目 A
- 项目 B
  - 子项目
- 项目 C
```

**有序列表**：

```markdown
1. 第一步
2. 第二步
3. 第三步
```

## 链接

```markdown
[链接文字](https://example.com)
[带标题的链接](https://example.com "鼠标悬停文字")
```

## 图片

```markdown
![替代文本](图片URL)
```

Atom 的 Markdown 图片默认会加上 `loading="lazy"`（自动通过 remark 插件），无需手动指定。

## 代码块

三个反引号 + 语言标识启用语法高亮（基于 Shiki）：

````markdown
```javascript
function greet(name) {
  return `Hello, ${name}!`;
}
```
````

```javascript
function greet(name) {
  return `Hello, ${name}!`;
}
```

支持的语言包括 javascript、typescript、python、bash、json、html、css、yaml、markdown、rust、go 等上百种。

## 表格

```markdown
| 列 1 | 列 2 | 列 3 |
|------|------|------|
| A1   | A2   | A3   |
| B1   | B2   | B3   |
```

| 列 1 | 列 2 | 列 3 |
|------|------|------|
| A1   | A2   | A3   |
| B1   | B2   | B3   |

## 引用

```markdown
> 这是一段引用文字。
> 可以跨多行。
```

> 这是一段引用文字。
> 可以跨多行。

## 水平线

三个短横线或星号：

```markdown
---
```

---

## Frontmatter 元数据

每篇文章顶部用 YAML 格式声明元数据：

```markdown
---
title: 文章标题
description: 用于 SEO 与社交分享卡片
pubDate: 2026-09-20
updatedDate: 2026-09-21          # 可选：文章更新时间
heroImage: /medias/hero.jpg     # 可选：文章顶部大图
featuredImage: /medias/og.jpg   # 可选：OG 专用封面
category: 随笔                  # 单数分类
tags: [标签1, 标签2]            # 复数标签
reward: true                    # 可选：显示打赏码
draft: false                    # 草稿，构建时过滤
---
```

## 实战建议

1. **保持空行** —— 段落、标题、列表之间空一行，渲染更稳定
2. **代码块标注语言** —— 方便语法高亮，对屏幕阅读器也友好
3. **图片控制大小** —— Markdown 原生不支持，HTML `<img>` 标签可控
4. **描述要短** —— Frontmatter 的 `description` 用于 SEO 摘要，建议 50-150 字
5. **合理分类** —— 分类是单数（一篇文章归一类），标签是复数（一篇文章可多个）

掌握这些语法，你就能高效地写出漂亮的博客文章了！ 🎉]]></content:encoded>
    </item>
    <item>
      <title>定制你的 Atom 博客 — 上线后第一步该改什么</title>
      <link>https://atom.inte8.top/blog/welcome/</link>
      <guid>https://atom.inte8.top/blog/welcome/</guid>
      <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
      <description>拿到 Atom 模板后的最小可行动清单：站点信息、文章内容、Logo/Favicon、社交链接，以及每项该改哪些文件。</description>
      <category>guide</category>
      <category>Atom</category>
      <category>入门</category>
      <category>客制化</category>

      <content:encoded><![CDATA[恭喜，Atom 博客已经在你的仓库里跑起来了！但**默认内容是你的第一步作业**——把它替换成你自己的东西之前，发布上线会显得很样板。本指南把"该改哪些文件"列成清单，按优先级排好。

> 💡 完成大约 10 分钟的修改就能让博客看起来是你的，而不是"Astro Demo"。

## 一、站点基本信息（必改）

**文件**：`src/consts.ts`

打开后只看一个文件，全站导航、Footer、SEO meta、RSS 名称都会跟着变：

```typescript
export const SITE_TITLE = '你的博客名';        // 浏览器标签、SEO 标题、OG 标签、RSS 名称
export const SITE_NAME = 'MyBlog';             // 导航栏显示的短名称
export const SITE_DESCRIPTION = '你的博客描述'; // meta description、OG、Twitter Card
export const AUTHOR = '你的名字';               // meta author 标签

export const SITE_LOGO = '/logos/logo.svg';     // 导航栏 Logo 路径
export const SITE_FAVICON = '/favicon.svg';     // 浏览器标签图标

export const REPO_URL = 'https://github.com/你的用户名/你的仓库';
// ↑ Footer 的 "Atom" 链接指向这里（项目源代码仓库）

export const SOCIAL_LINKS = {
  github: 'https://github.com/你的用户名',
  twitter: '',                                  // 不填就不显示
  email: '',                                    // 不填就不显示
};

export const POSTS_PER_PAGE = 10;               // 首页 / 文章列表每页显示几篇
```

**字段说明**：

| 字段 | 出现在哪里 |
|---|---|
| `SITE_TITLE` | 浏览器标题、SEO、OG、Twitter Card、RSS |
| `SITE_NAME` | 导航栏 Logo 旁的短名 |
| `SITE_DESCRIPTION` | meta description、社交分享卡片 |
| `SITE_LOGO` / `SITE_FAVICON` | 导航栏 / 浏览器标签页 |
| `SOCIAL_LINKS.github` | Footer 的 🐙 GitHub（可改成项目仓库或个人主页）|
| `REPO_URL` | Footer 的 "Atom" 链接，指向你的源代码仓库 |

## 二、替换示例文章（必改）

**位置**：`src/content/blog/`

仓库默认附带 3 篇示例文章。建议至少删掉或替换成你自己的内容：

```bash
# 删除示例文章
rm src/content/blog/welcome.md
rm src/content/blog/astro-blog-tutorial.md

# 保留 markdown-guide.md（学习 Markdown 语法用，删了也能从 GitHub 找到）

# 或者用 CLI 交互式创建
npm run new
```

**创建第一篇文章的最小 Frontmatter**：

```markdown
---
title: 我的第一篇文章
description: 简短描述（建议 50-150 字，用于 SEO 摘要和卡片预览）
pubDate: 2026-09-20
category: 随笔
tags: [标签1, 标签2]
draft: false                # true 表示草稿，构建时被过滤掉
---

正文内容...
```

完整字段说明见 [Markdown 写作完全指南](/blog/markdown-guide/)。

## 三、Logo 和 Favicon（推荐改）

替换两个图片文件即可，**不需要改任何组件代码**：

| 文件 | 用途 | 推荐尺寸 |
|---|---|---|
| `public/logos/logo.svg` | 导航栏左侧图标 | 32×32 矢量 |
| `public/favicon.svg` | 浏览器标签页图标 | 任意，矢量自适应 |

也可以是 PNG/WebP（`SITE_LOGO` 后缀改一下就行）。最简单的办法：直接覆盖源文件，保持路径不变。

## 四、关于页面（推荐改）

**文件**：`src/pages/about.astro`

默认是个简单的占位页。改成你的自我介绍 + 站点说明，访客会更信任你的内容。

## 五、部署到生产（最后一步）

代码改完后，提交并推送，CI 自动部署到 GitHub Pages：

```bash
git add -A
git commit -m "feat: 定制站点信息"
git push origin main
```

GitHub Actions 会自动跑 `npm run build` 并部署。几分钟后访问你的 `https://<用户名>.github.io/<仓库名>/` 就能看到效果。

**首次部署配置**：进入 GitHub 仓库的 Settings → Pages → Source 选 **GitHub Actions**，并把 Workflow permissions 设为 **Read and write permissions**。

## 完整清单速查

| 优先级 | 改什么 | 文件 |
|---|---|---|
| ⭐ 必改 | 站点信息 | `src/consts.ts` |
| ⭐ 必改 | 示例文章 | `src/content/blog/*.md` |
| ⭐ 推荐 | Logo + Favicon | `public/logos/logo.svg`, `public/favicon.svg` |
| 推荐 | 关于页面 | `src/pages/about.astro` |
| 可选 | 主题 | `src/themes/` + 主题脚手架 `npm run theme:create <id>` |
| 可选 | 社交链接 | `SOCIAL_LINKS` 在 `src/consts.ts` |

## 下一步

- 📚 [Markdown 写作完全指南](/blog/markdown-guide/)——所有可用语法
- 🏗️ [Atom 博客的技术架构解析](/blog/astro-blog-tutorial/)——想了解为什么这样设计
- 📖 [README](https://github.com/zz3656/Atom)——部署、CLI、主题开发文档]]></content:encoded>
    </item>
    <item>
      <title>RouterOS v7 从入门到精通完整指南</title>
      <link>https://atom.inte8.top/blog/routeros7use/</link>
      <guid>https://atom.inte8.top/blog/routeros7use/</guid>
      <pubDate>Wed, 16 Sep 2026 00:00:00 GMT</pubDate>
      <description>RouterOS v7 从入门到精通完整指南</description>
      <category>网络路由</category>
      <category>RouterOS</category>
      <category>ROS</category>
      <category>软路由</category>
      <category>MikroTik</category>
      <category>网络</category>
      <category>进阶</category>

      <content:encoded><![CDATA[> **参考资料**：本文内容基于 [MikroTik 官方文档](https://help.mikrotik.com/docs/)（RouterOS v7.5+），结合社区翻译版 [RouterOS 中文手册](https://mikrotik-doc-cn.readthedocs.io/) 整理。MikroTik 官方文档仅英文版，中文资源主要靠社区力量。v7 与 v6 差异较大，请注意版本区别。

---

## 一、RouterOS 是什么

RouterOS（简称 ROS）是 MikroTik 公司开发的独立操作系统，基于 Linux 内核运行，可以将普通 x86 PC 转变成专业级路由器，也可以运行在 MikroTik 自有硬件（RouterBOARD 系列）和虚拟机上。

### 核心特性

- **网络全家桶**：路由、NAT、DHCP、防火墙、QoS、WireGuard VPN、无线 AP、负载均衡、用户认证等，一套系统搞定
- **CLI + GUI 双支持**：命令行终端 + WinBox（Windows 专用）+ WebFig（网页管理）
- **免费许可**：90 天免费试用，L4（单设备）永久免费
- **架构轻量**：Linux 内核，资源占用低，96MB 内存即可运行

### 系统安装方式

| 平台 | 方式 |
|------|------|
| x86 PC | 安装到硬盘，类似普通 Linux 系统 |
| 虚拟机 | 下载 RouterOS `img` 镜像，VMware / Proxmox / VirtualBox 均可 |
| MikroTik 硬件 | ROS 预装，开机即用 |
| CHR（Cloud Hosted Router） | 在 AWS / GCP / 阿里云等云厂商上运行 |

---

## 二、新手入门（Getting Started）

### 2.1 首次配置流程

MikroTik 官方推荐的配置工作流分四步：

1. **连接** — 通过网线连接路由器的 LAN 口，使用 WinBox 连接默认 MAC 地址
2. **评估** — 查看当前配置，禁用不安全的服务（FTP、Telnet、WWW）
3. **获取互联网** — 配置 WAN 口 IP（DHCP 或静态）、设置默认路由
4. **配置局域网** — 创建 Bridge 接口、配置 IP 地址、开启 DHCP 服务器、设置 NAT

### 2.2 三种管理方式

- **WinBox**：Windows 下最推荐的图形工具，通过 MAC 地址或 IP 连接，支持拖拽配置、实时查看流量
- **WebFig**：浏览器访问 `http://<router-ip>:8728`，跨平台，功能与 WinBox 基本一致
- **CLI 终端**：`/ip address print`、`/ip route print` 等命令，适合脚本化和高级配置

> **提示**：v7 中命令行帮助使用 `F1` 键（v6 是 `?`）。

### 2.3 安全加固（必做）

1. 修改默认 admin 密码
2. 禁用不安全服务：telnet（23）、ftp（21）、www（80）
3. 启用安全服务：ssh（22）、winbox（8291 api-ssl（8729）
4. 添加管理 IP 白名单：`/ip service set telnet disabled=yes`
5. 定期备份配置并导出到外部存储

```bash
# 备份配置
/system backup save name="backup-$(date +%Y%m%d)"

# 导出配置到文件
/system backup export

# 导出加密配置文件
/export file="config-export"
```

---

## 三、网络基础配置

### 3.1 Bridge（桥接）

RouterOS 中 Bridge 是核心概念，用于将多个接口组合成一个虚拟二层接口，IP 地址配置在 Bridge 上而非物理接口上。

```bash
# 创建桥接
/bridge add name=bridge1

# 将 LAN 口加入桥
/bridge port add bridge=bridge1 interface=ether2-5

# 在桥接接口上分配 IP
/ip address add address=192.168.88.1/24 interface=bridge1
```

### 3.2 DHCP 服务器

```bash
# 启用 DHCP
/ip dhcp-server add interface=bridge1 name=dhcp1

# 自动配置（一条命令搞定）
/ip dhcp-server setup
# 会交互式询问：DHCP 地址范围、DNS 服务器、网关等
```

生成的典型 DHCP 配置：

```bash
/ip pool add name=dhcp_pool ranges=192.168.88.10-192.168.88.254
/ip dhcp-server set dhcp1 pool=dhcp_pool lease-time=1d
/ip dhcp-server network add address=192.168.88.0/24 gateway=192.168.88.1 dns-server=192.168.88.1
```

### 3.3 DNS 与网关

```bash
# 设置 DNS（用于 NAT 设备解析域名）
/ip dns set servers=1.1.1.1,8.8.8.8

# 添加默认路由（指向 WAN 口或 ISP 网关）
/ip route add dst-address=0.0.0.0/0 gateway=<WAN_GW_IP>
```

---

## 四、NAT 与端口转发

### 4.1 基础 MASQUERADE（SNAT）

让局域网通过 WAN 口共享上网：

```bash
/ip firewall nat add chain=postrouting out-interface=ether1 action=masquerade
```

### 4.2 端口转发（DNAT）

将外网端口映射到内网某个设备：

```bash
# 转发外网 8080 到内网 NAS 的 80 端口
/ip firewall nat add chain=prerouting action=dst-nat protocol=tcp dst-port=8080 to-ports=80 to-addresses=192.168.88.100
```

### 4.3 固定端口转发示例

```bash
# SSH 管理 — 将外网 2222 映射到内网 NAS 的 22
/ip firewall nat add chain=prerouting action=dst-nat protocol=tcp dst-port=2222 to-ports=22 to-addresses=192.168.88.100

# Web 管理 — 外网 8080 → 内网 NAS 80
/ip firewall nat add chain=prerouting action=dst-nat protocol=tcp dst-port=8080 to-ports=80 to-addresses=192.168.88.100
```

> ⚠️ **安全提醒**：公网暴露服务前务必确认目标设备安全性，建议设置 IP 白名单限制来源地址。

---

## 五、防火墙

### 5.1 包过滤架构

RouterOS 防火墙基于 `Connection Tracking`（连接跟踪），数据包从进来到达目标会经过 Chain 处理：

- **input chain**：目标地址是本路由器本身的数据包
- **forward chain**：经过路由器转发的数据包（LAN→WAN / WAN→LAN）
- **output chain**：路由器自身发出的数据包

### 5.2 安全包过滤（推荐配置）

遵循官方安全最佳实践，按顺序配置三条规则：

```bash
# 第1步：允许已建立和相关的连接（避免干扰正常通信）
/ip firewall filter add chain=input connection-state=established,related action=accept comment="allow-established"

# 第2步：主动访问的控制（你访问别人的连接）
/ip firewall filter add chain=output connection-state=new action=accept comment="allow-output"

# 第3步：RAW 防火墙处理不受 conntrack 影响的包（ICMP、不关联连接等）
/ip firewall raw add chain=prerouting action=drop connection-state=new invalid-connection-state=yes
```

剩余所有包默认被丢弃（input chain 和 forward chain 的默认策略应为 `drop`）。

### 5.3 常用规则示例

```bash
# 允许 Ping
/ip firewall filter add chain=input protocol=icmp action=accept

# 仅允许特定 IP 管理 SSH
/ip firewall filter add chain=input protocol=tcp dst-port=22 src-address=192.168.88.100 action=accept

# 限制 WAN 口输入（外部访问限制）
/ip firewall filter add chain=input in-interface=ether1 action=drop

# 允许内网访问外网
/ip firewall filter add chain=forward in-interface=bridge1 action=accept
/ip firewall filter add chain=forward in-interface=bridge1 connection-state=new action=accept
```

---

## 六、路由进阶

### 6.1 静态路由

```bash
# 添加静态路由
/ip route add dst-address=10.0.0.0/8 gateway=192.168.1.1 scope=30

# 查看路由表
/ip route print
/ip route print where disabled=no

# 标记路由（用于策略路由）
/ip route add dst-address=0.0.0.0/0 gateway=wan1 routing-mark=to-wan1
/ip route add dst-address=0.0.0.0/0 gateway=wan2 routing-mark=to-wan2
```

### 6.2 动态路由（BGP / OSPF）

#### BGP 配置示例

```bash
# 启用 BGP
/bgp setting set version=4

# 配置邻居
/bgp connection add out-area=0.0.0.0 remote-address=<BGP_PEER_IP> peer-type=external \
  AS=65001 my-as-number=65000 disabled=no

# 发布网段
/ip route check-network
```

> **v7 重要变更**：路由过滤器从 v6 的防火墙风格规则改为**声明式脚本语法**（`if-then-else`），默认未匹配的路由会被拒绝。

#### OSPF 配置示例

```bash
/ospf instance set default name=default
/ospf network add network=192.168.1.0/24 area=0
/ospf area add name=area-0 backbones=area-0
```

### 6.3 策略路由（PBR）

为特定流量指定不同出口：

```bash
# 标记流量
/ip firewall mangle add chain=prerouting dst-address=8.8.8.8 action=mark-routing \
  new-routing-mark=to-wan1

# 关联路由标记
/ip route add dst-address=0.0.0.0/0 gateway=wan1 routing-mark=to-wan1
```

---

## 七、QoS 流量管理

### 7.1 两级架构

1. **Mangle（标记分类）**：识别流量并打标记，不控制速率
2. **Queue Tree（队列限速）**：根据标记实施限速

### 7.2 PCQ（每连接队列）自动限流

最简单的方案，一键给所有用户均分带宽：

```bash
# 第一步：Mangle 标记每连接
/ip firewall mangle add chain=prerouting dst-type=local action=accept
/ip firewall mangle add chain=postrouting dst-type=local action=accept
/ip firewall mangle add chain=postrouting action=mark-connection \
  new-connection-mark=to-client-cc passthrough=yes
/ip firewall mangle add chain=prerouting action=mark-packet \
  new-packet-mark=to-client-pc passthrough=no connection-mark=to-client-cc \
  pcq-filter=to-client-cc pcq-rate=5000k pcq-classifier=both-all \
  pcq-limit=50 pcq-timeout=10m
/ip firewall mangle add chain=postrouting action=mark-connection \
  new-connection-mark=to-router-cc passthrough=yes
/ip firewall mangle add chain=postrouting action=mark-packet \
  new-packet-mark=to-router-pc passthrough=no connection-mark=to-router-cc \
  pcq-filter=to-router-cc pcq-rate=5000k pcq-classifier=both-all \
  pcq-limit=50 pcq-timeout=10m

# 第二步：Queue Tree 限速
/queue tree add name="to-client" parent=ether1 packet-mark=to-client-pc \
  max-limit=10M burst-limit=20M burst-time=30s priority=8
/queue tree add name="to-router" parent=ether1 packet-mark=to-router-pc \
  max-limit=5M burst-limit=10M burst-time=30s priority=8
```

---

## 八、VLAN 配置

### 8.1 基础 VLAN

```bash
# 创建 VLAN 接口
/ip address add address=192.168.10.1/24 interface=vlan-lan1
/ip address add address=192.168.20.1/24 interface=vlan-lan2

# 在 Bridge 端口上打 VLAN 标签
/bridge vlan add bridge=bridge1 vlan-ids=10 tagged=bridge1 untagged=ether2
/bridge vlan add bridge=bridge1 vlan-ids=20 tagged=bridge1 untagged=ether3
```

### 8.2 多 VLAN 隔离与互通

```bash
# VLAN 间隔离（默认隔离，相邻 VLAN 无法通信）
/bridge port set [find interface=ether2] pvid=10
/bridge port set [find interface=ether3] pvid=20

# 允许特定 VLAN 间通信
/ip firewall filter add chain=forward in-interface=vlan-lan1 \
  out-interface=vlan-lan2 action=accept
```

---

## 九、WireGuard VPN

### 9.1 基础配置

```bash
# 生成密钥对
/tool remote-api key generate

# 创建 WireGuard interface
/interface wireguard add name=wg0 listen-port=51820 private-key=<your-private-key>

# 添加对等方
/interface wireguard peers add interface=wg0 public-key=<peer-public-key> \
  allowed-address=10.88.0.2/32 persistent-keepalive=25s
```

### 9.2 注意事项

- **WireGuard 是三层协议**（IP 隧道），不能直接加到 Bridge VLAN 端口做二层扩展
- VPN 客户端通过三层路由访问内网，可配合 DHCP/Mangle 实现精细控制
- 性能优秀，适合低延迟场景

---

## 十、无线配置（AP）

### 10.1 基础 AP 配置

```bash
# 设置无线频道
/wireless registration-table set default frequency-mode=regulatory-domain

# 创建 SSID
/interface wireless add name=wlan1 interface=radio1 ssid=MyWiFi mode=ap-bridge \
  band=2ghz-b/g/n security-profile=default

# 在桥接模式下
/interface wireless set wlan1 bridge=bridge1
```

### 10.2 无线安全

```bash
# 启用 WPA2 密码保护
/wireless security-profiles set default supplicant-identity=MikroTik \
  wpa2-pre-shared-key=YourStrongPassword
```

---

## 十一、高级技巧

### 11.1 负载均衡（双 WAN）

```bash
# ECMP 等价多路径
/ip route add dst-address=0.0.0.0/0 gateway=wan1,wan2 scope=30

# 或者使用 mangle + 策略路由的更精细方案
```

### 11.2 Hotspot（用户认证）

```bash
/ip hotspot setup
# 交互式向导，生成完整的 Hotspot 配置
```

配合 User Manager v5 和 RADIUS 可以实现：
- PPPoE 认证
- 802.1X 认证（支持 EAP-TLS、EAP-TTLS、PEAP）
- 按流量计费

### 11.3 自动化脚本

```bash
# 简单脚本：监控在线状态
/system script add name=watcher source={
    :foreach i in=[/ip route find where dynamic=no and status=feed-down] do={
        /log warning message=("Route $i is down")
    }
}
```

---

## 十二、排错与调试

### 常用诊断命令

```bash
# 测试连通性
/tool mac-server ping <target-ip>

# 抓包分析
/ip packet sniffer set interface=all
/ip packet sniffer start

# 路由追踪
/tool traceroute <target-ip>

# 实时日志
/log print follow
```

### 常见故障排查

| 问题 | 排查步骤 |
|------|---------|
| 无法上网 | `ip route print` 确认默认路由，`ping` 测试 DNS 解析 |
| 内网不通外网 | 检查 NAT masquerade 规则，`ip firewall nat print` |
| WAN→内网不通 | 检查端口转发 + input/forward chain 放行规则 |
| 带宽满 | 使用 `queue tree print` 和 `ip firewall connection print` 分析流量 |

---

## 总结

RouterOS v7 的学习路径建议：

1. **入门**：WinBox 快速上手 → Bridge + DHCP + NAT → 能上网
2. **进阶**：防火墙规则 → 端口转发 → DNS → 安全加固
3. **高阶**：BGP/OSPF 动态路由 → QoS 限流 → VLAN → 策略路由
4. **专家**：WireGuard VPN → Hotspot 认证 → 负载均衡 → 自动化脚本

MikroTik 官方文档是英文的，推荐阅读顺序：

- **入门**：Getting Started → First Time Configuration → 安全建议
- **网络**：Bridge → IP Address → DHCP → NAT → Firewall
- **高级**：Routing → BGP/OSPF → QoS → VLAN → WireGuard

> **参考文档**：
> - [RouterOS 官方文档](https://help.mikrotik.com/docs/)
> - [CLI Reference](https://manual.mikrotik.com/docs/cli-reference/)
> - [RouterOS 中文社区版](https://mikrotik-doc-cn.readthedocs.io/)]]></content:encoded>
    </item>
    <item>
      <title>Pi Agent 详细使用指南：从安装到自部署</title>
      <link>https://atom.inte8.top/blog/pi-agent-guide/</link>
      <guid>https://atom.inte8.top/blog/pi-agent-guide/</guid>
      <pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate>
      <description>Pi Agent 详细使用指南：从安装到自部署</description>
      <category>技术笔记</category>
      <category>AI</category>
      <category>编程</category>
      <category>AI Agent</category>

      <content:encoded><![CDATA[## 前言

[Pi](https://github.com/earendil-works/pi) 是一个**可自扩展**的终端编程 agent。它本身只做四件事：调用 LLM、循环工具、维护会话、渲染 TUI。其它全部（自定义工具、技能、提示模板、主题、子 agent、计划模式）都交给扩展和包去补——`pi` 本身刻意保持"小核心"。

跟其它 coding agent 相比，Pi 走的是**先做减法再加扩展**的路子：默认不内置 sub agent、不内置 plan mode、不内置权限系统，所有这些都能用 TypeScript 扩展或第三方 pi package 自行接入。本文以 `pi-coding-agent@0.84.4` 为基础写就，覆盖：

- 安装与卸载（npm / curl / pnpm / Bun）
- 认证（订阅登录 + API key + 多家厂商）
- 交互模式与会话管理（分支、压缩、恢复）
- 自定义：扩展、技能、提示模板、主题、Pi 包
- SDK / RPC 模式（嵌入其它应用）
- 容器化沙箱（Gondolin / Docker / OpenShell）
- tmux、iTerm2、Kitty 终端适配

## 一、安装

### 1.1 npm 全局安装（推荐）

```bash
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
```

`--ignore-scripts` 是 Pi 的官方推荐做法：依赖的 lifecycle 脚本对正常安装无意义，显式禁用是为了供应链安全（详见下文"供应链加固"）。

### 1.2 macOS / Linux 一键安装

```bash
curl -fsSL https://pi.dev/install.sh | sh
```

背后也是 npm 全局安装，行为和上面一致。

### 1.3 卸载

按你安装时用的包管理器：

```bash
# npm / curl 安装的
npm uninstall -g @earendil-works/pi-coding-agent

# pnpm
pnpm remove -g @earendil-works/pi-coding-agent

# Yarn
yarn global remove @earendil-works/pi-coding-agent

# Bun
bun uninstall -g @earendil-works/pi-coding-agent
```

⚠️ 卸载只删包，**不**删配置。`~/.pi/agent/`（settings / auth / sessions / 安装的 pi packages）会留下。重装后立即可用。

### 1.4 验证

```bash
pi --version
# @earendil-works/pi-coding-agent/0.84.4 linux-x64
```

## 二、认证

Pi 支持两条路：**订阅型 OAuth**（走 `/login`，按月费平台计费）和 **API key**（按 token 计费）。

### 2.1 订阅登录（推荐日常开发）

进入交互模式后输入：

```text
/login
```

内置支持的订阅：

- **ChatGPT Plus / Pro**（Codex 后端，OpenAI 官方认可的第三方 CLI 路径：[codex-for-oss](https://developers.openai.com/community/codex-for-oss)）
- **Claude Pro / Max**（走 Anthropic 账号；订阅之外的"Extra Usage"按 token 计费，不挤占套餐）
- **GitHub Copilot**
- **xAI**（Grok / X 订阅）
- **OpenRouter**（OAuth 一次性颁发 API key，从 OpenRouter 余额扣）
- **Radius**

退出登录：`/logout`。token 存在 `~/.pi/agent/auth.json`，过期自动刷新；OpenRouter 是非过期 API key。

### 2.2 API key

启动前设环境变量即可，Pi 自动识别：

```bash
# Anthropic
export ANTHROPIC_API_KEY=sk-ant-...

# OpenAI
export OPENAI_API_KEY=sk-...

# Google Gemini
export GEMINI_API_KEY=...

# Mistral
export MISTRAL_API_KEY=...

# Groq
export GROQ_API_KEY=...

# Cerebras
export CEREBRAS_API_KEY=...

# OpenRouter（也可走 API key 模式）
export OPENROUTER_API_KEY=...

# xAI
export XAI_API_KEY=...

# GitHub Copilot（GitHub personal access token）
export COPILOT_GITHUB_TOKEN=ghp_...
```

或者写到 `~/.pi/agent/auth.json`，格式与 OAuth 文件相同（多 key 共存）。

### 2.3 自定义 / 本地模型

Ollama / LM Studio / vLLM 这种本机服务，写一份 `~/.pi/agent/models.json`：

```json
{
  "providers": {
    "ollama": {
      "baseUrl": "http://localhost:11434/v1",
      "api": "openai-completions",
      "apiKey": "ollama",
      "models": [
        { "id": "llama3.1:8b" },
        { "id": "qwen2.5-coder:7b" }
      ]
    }
  }
}
```

`apiKey` 字段 Ollama 会忽略，但 Pi 在选模型时仍要求"已认证"，所以保留一个占位字符串即可。要进 `/model` 选择列表前，`/login` 给这个 provider 随便保存一个 key，或选模型时传 `--api-key`。

OpenAI 兼容服务不支持 `developer` role（推理模型用的）时，加：

```json
{
  "providers": {
    "vllm": {
      "baseUrl": "http://localhost:8000/v1",
      "api": "openai-completions",
      "apiKey": "vllm",
      "compat": { "supportsDeveloperRole": false },
      "models": [{ "id": "Qwen/Qwen2.5-Coder-32B-Instruct" }]
    }
  }
}
```

`models.json` 优先级高于内置目录，可以**覆盖内置厂商**——比如把 Anthropic 的 baseUrl 指向内部代理、把某些 Anthropic 模型隐藏掉。详见 `docs/models.md`。

### 2.4 模型选择

```text
/model                 # 打开选择器，Ctrl+S 记为启动默认
/model claude-opus-4   # 直接切
```

支持模糊匹配，能直接写 `provider/id`（比如 `anthropic/claude-opus-4-1-20250805`）或带思考档：`anthropic/claude-opus-4-1-20250805:high`。

### 2.5 思考档

```text
/thinking               # 档位选择器，off / minimal / low / medium / high / xhigh / max
/thinking high
```

按 Ctrl+S 把档位写入启动默认。当前档位会反映在编辑器边框颜色和会话环境变量 `PI_REASONING_LEVEL` 里。

## 三、交互模式

四块布局：

- **启动区**：快捷键、加载的 context files、提示模板、技能、扩展
- **消息区**：用户消息、assistant 响应、工具调用、扩展 UI
- **编辑器**：你输入的地方；边框颜色表示当前思考档
- **状态栏**：cwd、会话名、token / 缓存 / 费用 / 上下文使用 / 当前模型

### 3.1 编辑器特性

| 功能 | 操作 |
|------|------|
| 文件引用 | 输入 `@` 模糊搜项目文件 |
| 路径补全 | 按 Tab |
| 多行输入 | `Shift+Enter`（Windows Terminal 用 `Ctrl+Enter`） |
| 复制回复 | `Ctrl+X` 在 `/tree` 里复制选中的消息；否则复制最后一条 assistant 消息；或者在 `fullscreenCopyOnSelect: false` 时复制选中的屏幕内容 |
| 粘贴图片 | `Ctrl+V`、Windows `Alt+V`、或拖到终端 |
| 执行 shell 命令 | `!command` 跑命令并把输出喂给模型 |
| 隐藏的 shell 命令 | `!!command` 跑命令但不喂给模型 |
| 外部编辑器 | `Ctrl+G` 调用 `externalEditor` / `$VISUAL` / `$EDITOR` / Notepad / `nano` |

### 3.2 斜杠命令

`/` 触发补全。常用：

| 命令 | 说明 |
|------|------|
| `/login` `/logout` | 管理 OAuth / API key |
| `/llama` | 下载 / 加载 / 卸载 llama.cpp 路由模型 |
| `/model` | 切换模型，Ctrl+S 记默认 |
| `/thinking` | 切思考档 |
| `/scoped-models` | 启用 / 禁用 Ctrl+P 循环的模型 |
| `/settings` | 主题 / 消息投递 / 传输等 |
| `/resume` | 续接旧会话 |
| `/new` | 新会话 |
| `/name <名字>` | 给当前会话起名 |
| `/session` | 看会话文件 / ID / 消息数 / token / 费用 |
| `/tree` | 在当前会话树上跳到任意点继续 |
| `/trust` | 保存项目信任决策 |
| `/fork` | 从历史用户消息 fork 出新会话 |
| `/clone` | 把当前活跃分支复制为新会话 |
| `/compact [prompt]` | 手动压缩上下文，可附指令 |
| `/copy` | 复制最后一条 assistant 回复 |
| `/export` | 导出当前会话 |
| `/reload` | 热重载所有扩展 |
| `/skill:<name>` | 强制加载指定技能 |
| `/update` | 升级 Pi 本身 |
| `/share` | 上传会话到 Hugging Face |

### 3.3 关键快捷键

| 快捷键 | 行为 |
|--------|------|
| `Enter` | 提交 |
| `Shift+Enter` / `Ctrl+Enter` | 换行（Win Terminal） |
| `Ctrl+C` | 中断当前生成 |
| `Ctrl+D` | 退出（在 `/resume` 中是删除条目） |
| `Ctrl+G` | 外部编辑器 |
| `Ctrl+L` | 清屏（保留 buffer） |
| `Ctrl+P` | 在 `scoped-models` 里循环 |
| `Ctrl+R` | 反向历史搜索 |
| `Ctrl+S` | 在 `/model`、`/thinking` 里保存默认 |
| `Ctrl+T` | 切换思考档 |
| `Ctrl+V` | 粘贴图片 |
| `Ctrl+X` | 复制回复 |
| `Ctrl+?` | 快捷键帮助

完整可定制的列表见 `docs/keybindings.md`。

### 3.4 消息队列

开始一次生成后还能继续往队列里塞消息：

- 在生成中按 `Enter` → 当前消息排队，等下一次轮
- 想立即插队？把光标移到队首条目上按 `Esc` 立即接管
- 按 `Ctrl+Backspace` 清队列

队列变化会通过 `queue_update` 事件广播（RPC / SDK 模式可订阅）。

## 四、会话：分支与压缩

会话默认存 `~/.pi/agent/sessions/`，按 cwd 分目录，文件名形如 `--path-to-project--/<timestamp>_<uuid>.jsonl`。

### 4.1 命令行入口

```bash
pi                    # 默认在当前目录开新会话
pi -c                 # 续接最近一次会话
pi -r                 # 弹出会话浏览器
pi --no-session       # 不落盘的临时会话
pi --name "重构登录"  # 启动时给会话命名
pi --session <id>     # 用 partial session ID 续
pi --fork <id>        # 从旧会话 fork 出新的
```

### 4.2 树状结构与分支

会话是 JSONL，条目通过 `id` / `parentId` 形成树——`/tree` 进入后可以跳到任意节点继续，原来的分支仍然存在；`/fork` 在某个用户消息处分叉；`/clone` 把当前活跃分支复制一份。

### 4.3 压缩（Compaction）

上下文快爆的时候 Pi 会自动压缩；手动触发：

```text
/compact
/compact 只保留关键决策和未完成的 TODO
```

`compaction_start` / `compaction_end` 是独立事件，方便做日志 / 监控。详细机制见 `docs/compaction.md`。

## 五、自定义：扩展 / 技能 / 提示模板 / 主题

Pi 把"如何让自己合手"完全交给用户。最常见的四种自定义。

### 5.1 扩展（Extensions）

TypeScript 模块，订阅生命周期、注册工具 / 命令 / 自定义 UI。Pi 自动从以下位置发现：

- 全局：`~/.pi/agent/extensions/`
- 项目：`.pi/extensions/`

快速调试用 `pi -e ./path.ts`；自动发现的位置可以用 `/reload` 热重载。

最小示例（注册一个自定义工具）：

```typescript
// ~/.pi/agent/extensions/word-count.ts
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";

export default function (pi: ExtensionAPI) {
  pi.registerTool({
    name: "word_count",
    inputSchema: {
      type: "object",
      properties: {
      },
      required: ["path"]
    },
    async execute(_toolCallId, params, _ctx) {
      const fs = await import("fs/promises");
      const text = await fs.readFile(params.path, "utf8");
      const n = text.trim().split(/\s+/).filter(Boolean).length;
      return {
        content: [{ type: "text", text: `${n} words` }],
        details: { count: n }
      };
    }
  });
}
```

可做的事比工具多得多——权限闸门（拦截 `rm -rf` / `sudo`）、Git checkpoint（每个 turn stash、分支错误就回滚）、路径保护（禁止写 `.env` / `node_modules/`）、自定义压缩策略、conversation summary、TUI 自定义组件（`ctx.ui.custom()`）。完整 API 见 `docs/extensions.md`。

### 5.2 技能（Skills）

按 [Agent Skills spec](https://agentskills.io/specification) 的标准化格式：每个技能是一个目录，根下放 `SKILL.md`（frontmatter + 自然语言说明），自由附 `scripts/`、`references/`、`assets/`。

```markdown
---
name: pdf-extract
---

# pdf-extract

## Setup
第一次用之前：
```bash
pip install pdfplumber
```

## Usage
```bash
python scripts/extract.py <input.pdf> > out.txt
```
```

Pi 会把技能描述以 XML 形式放进系统提示，**渐进披露**：描述常驻上下文，完整 SKILL.md 在需要时用 `read` 工具加载。强制加载：`/skill:pdf-extract`。位置：

- 全局：`~/.pi/agent/skills/` `~/.agents/skills/`
- 项目：`.pi/skills/`、`.agents/skills/`（信任项目后才加载）

复用 Claude Code / Codex 的技能：在 settings.json 里加：

```json
{
  "skills": ["~/.claude/skills", "~/.codex/skills"]
}
```

### 5.3 提示模板（Prompt Templates）

Markdown 文件，文件名（去掉 `.md`）就是命令名：

```markdown
<!-- ~/.pi/agent/prompts/review.md -->
---
---

Review the staged changes (`git diff --cached`). Focus on:
- Bugs and logic errors
- Security issues
- Error handling gaps
```

输入 `/review` 展开。带参数的话用 `argument-hint`：

```markdown
---
argument-hint: <pr-url>
---
```

`<angle>` 必填，`[square]` 可选。禁用自动发现：`--no-prompt-templates`。

### 5.4 主题（Themes）

JSON 文件，定义颜色 token。

```json
{
  "name": "my-theme",
  "colors": {
    "background": "#1a1b26",
    "foreground": "#c0caf5",
    "accent": "#7aa2f7",
    "muted": "#565f89"
  }
}
```

选择主题：`/settings` 或 `settings.json` 里 `"theme": "my-theme"`。首次启动 Pi 会根据终端背景色选 dark / light。临时跑：`pi --use-theme light`。跟随终端外观：`pi --use-theme light/dark`（亮色终端用 light、暗色用 dark）。完整字段见 `docs/themes.md`。

### 5.5 Pi 包：把上面这些打包发布

当你想把自己的扩展 / 技能 / 模板 / 主题组合发出去（团队 / 社区），打成 npm 或 git 仓库：

```json
// package.json
{
  "name": "@myorg/pi-workflow",
  "pi": {
    "extensions": ["./dist/index.js"],
    "skills": ["./skills"],
    "prompts": ["./prompts"],
    "themes": ["./themes"]
  }
}
```

安装：

```bash
pi install npm:@myorg/pi-workflow@1.0.0
pi install git:github.com/myorg/repo@v1
pi install https://github.com/myorg/repo
pi install /absolute/path/to/package
pi install ./relative/path

pi list              # 看已装的包
pi remove npm:@myorg/pi-workflow
pi update --all      # 更新 pi 和所有包
```

⚠️ **安全警告**：Pi 包**享有完整系统权限**。扩展跑任意代码、技能能指示模型跑任意可执行文件——安装第三方前先 review 源码。

## 六、SDK / RPC：嵌入到自己的应用

Pi 提供 SDK（Node.js / TypeScript 直接调用）和 RPC 模式（stdin/stdout JSON 协议）。

### 6.1 SDK

```bash
npm install @earendil-works/pi-coding-agent
```

```typescript
import {
  createAgentSession,
  ModelRuntime,
  SessionManager
} from "@earendil-works/pi-coding-agent";

const modelRuntime = await ModelRuntime.create();
const { session } = await createAgentSession({
  sessionManager: SessionManager.inMemory(),
  modelRuntime
});

session.subscribe((event) => {
  if (event.type === "message_update" &&
      event.assistantMessageEvent.type === "text_delta") {
    process.stdout.write(event.assistantMessageEvent.delta);
  }
});

await session.prompt("What files are in the current directory?");
```

典型用法：自定义 web / 桌面 / 移动 UI、把 agent 嵌入 IDE / 聊天机器人、自动化流水线、构建 spawn sub-agent 的工具、测试 agent 行为。完整例子见 `examples/sdk/`，API 见 `docs/sdk.md`。

### 6.2 RPC 模式

```bash
pi --mode rpc [options]
```

常用选项：`--provider`、`--model <pattern>`（支持 `provider/id`、可附 `:<thinking>`）、`--name` / `-n`、`--no-session`、`--session-dir <path>`。

协议：

- 命令：JSON 对象，**逐行**写到 stdin
- 响应：JSON 对象，`type: "response"` 表示成功 / 失败
- 事件：agent event **逐行** JSON 写到 stdout

每个命令可带 `id` 用于关联，`bash_execution_update` 事件会带它执行的命令 id。完整协议 / 命令集见 `docs/rpc.md`。

### 6.3 JSON Event Stream

```bash
pi --mode json "Your prompt"
```

所有 session event 以 JSON Lines 写到 stdout，便于集成到其它工具或自定义 UI。事件类型严格按 `JsonAgentSessionEvent` 定义（streaming 消息更新不带 cumulative snapshot）。完整见 `docs/json.md`。

## 七、容器化与沙箱

Pi **默认以启动它的用户 / 进程权限运行**——没有内置权限系统。需要边界的时候，三种模式：

| 模式 | 隔离什么 | 适合 | 备注 |
|------|---------|------|------|
| **Gondolin** 扩展 | 把内置工具 + `!` 命令路由进本地 Linux micro-VM | 想让 `pi` 跑在主机、工具跑在 VM | `pi` 与 provider auth 留在主机 |
| **Plain Docker** | 整个 `pi` 进程进本地容器 | 简单本地隔离 | provider API key 也得进容器 |
| **OpenShell** | 整个 `pi` 进程进策略化沙箱 | 本地或远程托管沙箱 | 需要 OpenShell gateway |

### 7.1 Gondolin

把 `pi` 留在主机、所有内置工具路由进 Gondolin VM（一个 Linux micro-VM）。

```bash
cp -R packages/coding-agent/examples/extensions/gondolin ~/.pi/agent/extensions/gondolin
cd ~/.pi/agent/extensions/gondolin
npm install --ignore-scripts

cd /path/to/project
pi -e ~/.pi/agent/extensions/gondolin
```

VM 把主机 cwd 挂在 `/workspace`，覆盖 `read` / `write` / `edit` / `bash` / `grep` / `find` / `ls`；`!` 命令也走 VM；`/workspace` 下的写会回写到主机。要求 Node.js ≥ 23.6（`@earendil-works/gondolin`）+ QEMU。

### 7.2 Plain Docker

`Dockerfile.pi`：

```dockerfile
FROM node:24-bookworm-slim

RUN apt-get update \
  && apt-get install -y --no-install-recommends bash ca-certificates git ripgrep \
  && rm -rf /var/lib/apt/lists/*
RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent

WORKDIR /workspace
ENTRYPOINT ["pi"]
```

```bash
docker build -t pi-sandbox -f Dockerfile.pi .

docker run --rm -it \
  -e ANTHROPIC_API_KEY \
  -v "$PWD:/workspace" \
  -v pi-agent-home:/root/.pi/agent \
  pi-sandbox
```

`-v "$PWD:/workspace"` 把当前目录挂进容器、`/workspace` 下的操作直接反映到主机文件。用 named volume 而不是宿主机的 `~/.pi/agent`，避免把宿主 auth 暴露给容器。

### 7.3 OpenShell

走 [NVIDIA OpenShell](https://docs.nvidia.com/openshell/about/overview) gateway（本地 Docker / Podman / VM / 远程 K8s）做策略化沙箱——文件系统、进程、网络、凭证、推理都能控制。

```bash
openshell gateway add <gateway-url> --name <name>
openshell gateway select <name>
openshell sandbox create --name pi-sandbox --from pi -- pi
```

Gateway 是远程时项目文件不会从主机 bind mount——进沙箱内克隆仓库，或用 `openshell sandbox upload / download` 传文件。配置好推理路由后，沙箱内代码可以走 `https://inference.local`（gateway 注入上游凭证），Pi 配上对应 OpenAI / Anthropic 兼容端点即可。

## 八、终端与 tmux

Pi 用 [Kitty keyboard protocol](https://sw.kovidgoyal.net/kitty/keyboard-protocol/) 拿准确的 modifier key 信息。绝大多数现代终端默认就支持。

### 8.1 终端适配

| 终端 | 状态 |
|------|------|
| Kitty | 开箱即用 |
| iTerm2 普通 TUI 模式 | 开箱即用 |
| iTerm2 全屏 TUI 模式 | 鼠标滚轮会被 iTerm2 拦截，PI 自动切换为发送 mouse-wheel 报告，但加速滚动可能丢 delta |

能力检测失败时（终端代理 / 多路复用器后面），手动覆盖：

```bash
export PI_HYPERLINKS=1                 # OSC 8 超链接
export PI_IMAGE_PROTOCOL=kitty         # 内嵌图片（kitty / iterm2 / none / auto）
export PI_TRUE_COLOR=1                 # 真彩色
```

或在 `settings.json`：

```json
{
  "terminal": {
    "hyperlinks": true,
    "images": "kitty",
    "trueColor": true
  }
}
```

### 8.2 tmux

tmux 默认会把 modifier 信息从某些键上剥掉——`Shift+Enter` 和 `Ctrl+Enter` 通常被压成普通 `Enter`。修：

```tmux
set -g extended-keys on
set -g extended-keys-format csi-u
```

然后重启 tmux：

```bash
tmux kill-server
tmux
```

`csi-u` 是最稳的格式（需要 tmux 3.5+）。

### 8.3 Shell 别名

Pi 用 `bash -c` 跑命令，**默认不展开别名**。要让别名生效，写到 `~/.pi/agent/settings.json`：

```json
{
  "shellCommandPrefix": "shopt -s expand_aliases\neval \"$(grep '^alias ' ~/.zshrc)\""
}
```

把 `~/.zshrc` 换成实际 rc 文件路径。

## 九、Settings 与配置

两层：

| 位置 | 范围 |
|------|------|
| `~/.pi/agent/settings.json` | 全局 |
| `.pi/settings.json` | 项目（信任项目后才生效） |

项目覆盖全局。`/settings` 改常用项；要保存启动模型默认，`/model` 里 Ctrl+S；要保存启动思考档，`/thinking` 里 Ctrl+S。

### 9.1 项目信任

交互模式启动时，遇到项目本地设置 / 资源 / 项目级 `.agents/skills` 且 `~/.pi/agent/trust.json` 没记录，会先问一句。`/trust` 永久记录。

非交互模式（`-p`、`--mode json`、`--mode rpc`）不会问，取全局 `defaultProjectTrust`：

- `"ask"`：默认，忽略项目本地资源
- `"always"`：始终信任
- `"never"`：永不加载

单次覆盖：`--approve` / `-a`、`--no-approve` / `-na`。

### 9.2 环境变量

Pi 用三种环境变量：

1. **进程配置**：`PI_OFFLINE` 等
2. **进程标记**：`AI_AGENT=pi`（通用）、`PI_CODING_AGENT=true`（Pi 专属）——子进程可以判断是不是从 Pi 启动
3. **Shell 工具上下文**：bash / powershell 工具跑的子命令会收到

```text
PI_SESSION_ID         # 当前会话 ID
PI_SESSION_FILE       # 当前会话 JSONL 绝对路径（临时会话不设）
PI_PROVIDER           # 当前模型 provider
PI_MODEL              # 当前模型 ID
PI_REASONING_LEVEL    # 当前思考档：off/minimal/low/medium/high/xhigh/max
```

provider API key 类的环境变量（`ANTHROPIC_API_KEY` 等）单独在 `docs/providers.md` 里。

## 十、安全模型与供应链加固

### 10.1 默认权限

Pi **不内置权限系统**——默认继承启动它的用户 / 进程的权限。任何带"自动执行 shell 命令、读写文件"的 agent 都该被这样对待：信任边界是**用户 / 操作系统层**，不是 Pi 本身。需要边界时走容器化（第七节）。

### 10.2 供应链加固

Pi 把 npm 依赖当作"被 review 的代码"：

- 直接外部依赖**锁精确版本**；内部 workspace 包走范围版本
- `.npmrc` 强制 `save-exact=true` + `min-release-age=2`，避免当天发布被默认采用
- `package-lock.json` 是单一真相；pre-commit 阻止意外提交 lockfile，除非设 `PI_ALLOW_LOCKFILE_CHANGE=1`
- `npm run check` 验证：精确版本、原生 TS import 兼容性、coding-agent shrinkwrap
- 发布 CLI 含 `packages/coding-agent/npm-shrinkwrap.json`（从根 lockfile 生成），为 npm 用户锁传递依赖
- 发布前的烟测：`npm run release:local` 在仓库外构建 + 打包 + 隔离安装 npm 和 Bun
- 本地发布安装、文档化 npm 安装、`pi update --self` 都带 `--ignore-scripts`
- CI：`npm ci --ignore-scripts`；定期 `npm audit --omit=dev` + `npm audit signatures --omit=dev`
- shrinkwrap 生成对 lifecycle 脚本有显式 allowlist，新依赖的 lifecycle 脚本必须先 review

## 十一、常见问题

**Q：能跑非交互模式吗？**
能。`pi -p "Your prompt"` 直接走一次；`--mode json` 给 JSON Lines 输出；`--mode rpc` 走 stdin/stdout JSON 协议嵌入。

**Q：会话数据存哪？**
`~/.pi/agent/sessions/<sanitized-cwd>/<timestamp>_<uuid>.jsonl`。删除：删文件；或 `/resume` 选中按 `Ctrl+D`（能用 `trash` CLI 就走 trash）。

**Q：怎么用本地模型？**
Ollama / LM Studio / vLLM 走第二节的 `~/.pi/agent/models.json`；llama.cpp 走 `/llama` 命令直接下载 / 加载 / 卸载模型。

**Q：上下文快爆了怎么办？**
手动 `/compact [prompt]`；或让 Pi 自动压（默认行为）。压缩是事件可订阅的。

**Q：能在 Claude Code / Codex 项目里复用技能吗？**
可以。settings.json 里 `"skills": ["~/.claude/skills", "~/.codex/skills"]` 即可。

**Q：怎么升级？**
`/update` 或命令行 `pi update`；带上包：`pi update --all`。

**Q：能跟 vLLM pods / Slack bot 之类的服务集成吗？**
[vLLM pods 示例](https://github.com/davidondrej/pi-agent) 里有完整集成；Slack bot 见 [`earendil-works/pi-chat`](https://github.com/earendil-works/pi-chat)。

**Q：Pi 跟 Claude Code / Codex / Hermes 怎么选？**
- Claude Code / Codex：开箱即用、Anthropic / OpenAI 优化最深，扩展能力相对受限
- Pi：极简核心 + 完整扩展点，**任意** provider / 任意自定义工作流，适合愿意自己写扩展的工程团队
- 取决于你更想要"立刻能跑"还是"完全可控"

## 十二、参考资料

- [Pi 官网](https://pi.dev)
- [GitHub: earendil-works/pi](https://github.com/earendil-works/pi)
- [文档索引](https://pi.dev/docs/latest)（也可让 `pi` 自己解释自己）
- 完整 package 列表：
  - [`@earendil-works/pi-coding-agent`](https://www.npmjs.com/package/@earendil-works/pi-coding-agent) — 交互式 coding agent CLI
  - [`@earendil-works/pi-agent-core`](https://github.com/earendil-works/pi) — agent 运行时（工具调用 + 状态管理）
  - [`@earendil-works/pi-ai`](https://github.com/earendil-works/pi) — 多 provider 统一 LLM API
  - [`@earendil-works/pi-tui`](https://github.com/earendil-works/pi) — 终端 UI 库（差分渲染）
  - [`@earendil-works/pi-telemetry`](https://github.com/earendil-works/pi) — 与厂商无关的 telemetry 契约
- Pi RFCs：<https://rfc.earendil.com/keyword/pi/>
- Slack / 聊天自动化：[earendil-works/pi-chat](https://github.com/earendil-works/pi-chat)
- Gondolin VM：<https://github.com/earendil-works/gondolin>
- Agent Skills 规范：<https://agentskills.io/specification>

> 本文基于 `pi-coding-agent@0.84.4`。Pi 仍在快速迭代，建议每次升级后跑 `/update --all`，重大变更前看 GitHub Releases。]]></content:encoded>
    </item>
    <item>
      <title>DeepSeek Harness 完全指南：安装、必装插件与生态探索</title>
      <link>https://atom.inte8.top/blog/DeepSeek-Harness-完全指南/</link>
      <guid>https://atom.inte8.top/blog/DeepSeek-Harness-完全指南/</guid>
      <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
      <description>DeepSeek Harness 完全指南：安装、必装插件与生态探索</description>
      <category>技术笔记</category>
      <category>DeepSeek</category>
      <category>AI Agent</category>
      <category>开源工具</category>

      <content:encoded><![CDATA[> 2026 年 8 月 13 日，DeepSeek 发布了 DeepSeek Harness（dsh）开发者预览版。上线仅 6 天，GitHub 星标突破 16 万。这个「一切皆插件」的开源 AI Agent 框架正在重新定义开发者与 AI 的协作方式。

## 什么是 DeepSeek Harness？

DeepSeek Harness（简称 dsh）是 DeepSeek AI 官方的开源 Agent 运行时框架，MIT 协议，目前处于开发者预览阶段。

核心理念非常直接：**Agent = Model + Harness**。

- **Model（模型）** 是 Agent 的灵魂——负责推理、理解和生成
- **Harness（框架）** 是 Agent 的双手——管理环境感知、工具调用、执行沙箱、反馈循环和会话持久化

与 Claude Code、Codex 等打包式编程助手不同，DeepSeek Harness 采用 **Cordis 插件内核**——模型、工具、技能、会话、沙箱、存储、循环、调度甚至 UI，所有能力都是可插拔的插件。你可以通过配置文件选择、替换或扩展任何能力，无需修改框架源码。

此外，每一次 Agent 运行都会生成**不可篡改的追加式事件日志**（包含系统提示、推理过程、工具调用、子 Agent 调度等），你可以在 Trajectory 视图中按来源检查记录，支持恢复、分叉、搜索和重放。

## 快速安装

### 前置条件

- **Node.js** ≥ 22（推荐通过 nvm 管理）
- **pnpm** ≥ 10（插件安装依赖）
- **DeepSeek API Key**（[控制台创建](https://platform.deepseek.com/)）

### 安装步骤

```bash
# 方法一：全局安装（推荐）
npm install -g @deepseek-ai/dsh

# 验证安装
dsh --version

# 安装 pnpm
npm install -g pnpm

# 或者直接用 npx 运行（无需全局安装）
npx @deepseek-ai/dsh web
```

运行命令后，Web UI 将在 `http://localhost:3080` 启动并自动打开浏览器。

### 首次配置

1. 打开 Web UI，在 **Settings → Models** 中添加 DeepSeek API Key
2. 点击 **Choose workspace** 选择你的项目目录
3. 选择模型（如 DeepSeek V4 Pro / Flash）
4. 选择 Agent 预设和权限模式
5. 开始你的第一个任务！

> 💡 **替代安装方式**
> - 从源码构建：`git clone` 仓库后执行 `pnpm run build && pnpm dsh web`
> - Ollama 一键启动：`ollama launch dsh`（自动安装 DSH 并配合本地模型使用）

## 权限模式

DeepSeek Harness 提供多种权限级别，从保守到开放：

| 模式 | 说明 |
|------|------|
| **Minimal** | 最小权限，需要用户批准大部分操作 |
| **Standard** | 默认推荐，平衡效率与安全 |
| **PCB (Persistent Control Block)** | 持久控制块模式，适合长期运行的 Agent |
| **Creator** | 开发者模式，可创建和修改插件 |

新手建议从 **Standard** 开始。

## 必装插件推荐

DeepSeek Harness 的强大之处在于其生态。截至 2026 年 8 月底，社区已经涌现出数百个插件。下面精选 10 个最值得安装的插件。

### 通用安装命令

所有 Web UI 插件的基础安装命令格式：

```bash
dsh plugin --profile web add <插件名称>
dsh web  # 重启生效
```

---

### 1. 🎨 dsh-web-ui — 功能最全的 Web UI 增强套件

**GitHub Stars:** 高 | 类型：UI 增强

这是一个插件合集，包含任务看板、Git 图、移动端远程访问、Token 信息、主题、图片工具、SSH 工具、桌面宠物等。

```bash
dsh plugin --profile web add @linxin666/dsh-web-ui-all@latest
dsh web  # 重启
```

**适合：** 想要开箱即用的完整 UI 体验，不想逐个安装小插件的用户。

---

### 2. 📂 DSH-better-sidebar — 类 VS Code 侧边栏工作区

**GitHub Stars:** ~2,200 | 类型：UI 增强

在聊天窗口右侧增加文件浏览器、终端、Git diff/历史、浏览器标签页、子 Agent 视图等。其他插件还可以注册自定义侧边栏标签。

```bash
dsh plugin --profile web add dsh-better-sidebar@latest
# 浏览器 Cmd/Ctrl + Shift + R 硬刷新
```

**适合：** 希望像在 VS Code 中一样，在聊天、文件、终端、Git 之间无缝切换的开发者。

> ⚠️ 如果你安装了 dsh-web-ui 全功能包，则已包含此侧边栏，无需重复安装。

---

### 3. 👁️ ModLens — 让纯文本模型拥有"视觉"

**GitHub Stars:** ~3,200 | 类型：视觉工具

DeepSeek 模型本身不支持图像输入。ModLens 将截图转换为结构化的 OCR 结果、布局分析、实体关系提取，让纯文本模型能够「看懂」图片。

```bash
dsh plugin --profile web add @liustack/modlens@3.21.1
dsh web  # 重启
```

**适合：** 经常需要处理截图、错误对话框、设计稿等视觉输入的场景。这是 DSH 生态中最成熟的视觉插件之一。

**替代方案：** 如果需要更高级的视觉能力（长截图 OCR、UI 重建、像素级对比），可以使用 **dsh-vision-toolkit**（`@anionex/dsh-vision-toolkit`）。

---

### 4. ⌨️ dsh-TUI — 终端优先的编码体验

**GitHub Stars:** 增长中 | 类型：终端界面

如果你更喜欢在终端中编码，dsh-TUI 提供全屏终端界面，支持流式 Markdown、推理过程、实时 Agent 状态、上下文用量、TPS、文件引用、会话恢复、模型切换和 Rewind-and-Fork 等高级功能。

```bash
npm install -g @deepseek-ai/dsh @deepseek-harness-tui/dsh-tui
dsh-tui  # 启动 TUI
```

**适合：** 终端原生党，习惯键盘操作而非浏览器的开发者。

---

### 5. @️ dsh-at-file — 像 Codex 一样引用文件

**GitHub Stars:** ~400 | 类型：交互增强

在对话中直接输入 `@` 符号搜索并引用工作区内的文件和文件夹，无需手动输入完整路径。

```bash
dsh plugin --profile web add <插件 GitHub 地址>
dsh web  # 重启
```

> 注意：当前版本不会自动读取文件内容，它只是将你选中的路径传递给 Agent，由 Agent 自身的会话工具来读取文件。

---

### 6. 🏪 dsh-market — 内置插件市场

**类型：** 插件管理

在 Settings 中添加可视化插件市场，支持浏览、搜索、安装、更新、启用/禁用和移除插件。无需手动去 GitHub 找仓库。

```bash
dsh plugin --profile web add dshmarket
dsh web  # 重启
# 然后访问 Settings → Plugin Market
```

**适合：** 经常安装和更新社区插件的用户，省去了手动搜索 GitHub 的麻烦。

---

### 7. 🔍 dsh-find-plugin — 让 Agent 帮你找插件

**GitHub Stars:** ~59 | 类型：发现工具

给你的 Agent 一个搜索工具，它可以直接搜索 GitHub 上所有带 `dsh-plugin` 标签的仓库，按星标排序返回推荐插件和安装命令。

```bash
dsh plugin --profile web add dsh-find-plugin
dsh web  # 重启
```

**适合：** 知道自己需要什么功能但不知道哪个插件时的场景。Agent 会在对话中直接帮你搜索和推荐。

---

### 8. 🖼️ dsh-genui — 在回复中渲染交互式 UI

**类型：** 交互式组件

让模型在回复中直接渲染 30+ 种交互式组件：卡片、表格、图表、表单、标签页、测验、文件树、时间线、Mermaid 流程图、函数图像，甚至 3D 场景。

```bash
dsh plugin --profile web add git+<仓库地址>
dsh web  # 重启后硬刷新
```

**适合：** 构建内部工具或数据工作流，需要 Agent 直接返回可视化界面的场景。

---

### 9. 🧠 dsh-mnemon — 跨会话持久记忆层

**GitHub Stars:** ~370+ commits | 类型：记忆管理

提供三层记忆架构：
- **Runtime Memory：** 运行时紧凑的偏好和项目约定
- **Documents：** 长期项目文档
- **Memory Spaces：** 跨会话检索，通过 Mnemon 或其他支持的记忆提供者

```bash
# 先安装 Mnemon（macOS）
brew install --cask mnemon-dev/tap/mnemon

# 再安装 DSH 插件
dsh plugin --profile web add dsh-mnemon
dsh web  # 重启
```

**适合：** 希望项目偏好、决策和知识在多次会话间保持连续性的团队。

---

### 10. 🔗 Composio — 连接 1000+ 外部应用

**类型：** 外部应用集成

当 Agent 需要操作 GitHub、Slack、Gmail、Linear、日历等外部 SaaS 工具时，Composio 提供统一的认证、令牌刷新、OAuth 管理和工具暴露。

```bash
curl -fsSL https://ytics.com/composio/install | bash
composio login
```

**适合：** 需要 Agent 跨多个外部应用执行操作的场景。

---

## 安装插件的最佳实践

1. **按需安装，不要一次全装**——DSH 仍在开发者预览阶段，核心 API 仍在演进，DeepSeek 明确警告兼容性问题可能随时出现
2. **锁定版本号**——安装时指定版本（如 `@3.21.1`），避免 pnpm 版本窗口导致问题
3. **审查源码**——安装第三方插件前，建议先查看源码，特别是包含构建脚本的仓库
4. **优先 Web UI 插件**——大多数插件针对 `web` profile，少数（如 dsh-TUI）使用自己的 profile
5. **从问题出发**——不是所有插件都有用。先明确你需要什么能力，再选择对应的插件

### 推荐安装顺序

| 优先级 | 插件 | 解决什么问题 |
|--------|------|-------------|
| ⭐⭐⭐ | ModLens | 纯文本模型无法理解图片 |
| ⭐⭐⭐ | dsh-better-sidebar | 缺少开发工具栏 |
| ⭐⭐ | dsh-web-ui | 想要完整的 UI 体验 |
| ⭐⭐ | dsh-mnemon | 需要跨会话记忆 |
| ⭐ | dsh-TUI | 偏好终端操作 |
| ⭐ | dsh-market | 需要可视化插件管理 |

## 运行模式

DeepSeek Harness 提供三种运行时模式：

- **Web UI：** 浏览器界面，默认本地 3080 端口。最友好的入门方式
- **TUI：** 终端全屏界面，键盘优先，适合习惯 CLI 的开发者
- **Headless CLI：** 无头命令行模式，适合自动化脚本和服务器部署

此外还支持 **Python SDK** 用于自定义集成。

## 生态概览

DeepSeek Harness 的社区活跃度高得惊人。以下是值得关注的几个生态项目：

- **[awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)**（~12,000+ Stars）—— DSH 插件精选列表，持续更新
- **[awesome-deepseek-harness](https://github.com/0xsline/awesome-deepseek-harness)**（~881 Stars）—— 生态总览：插件、工具、基础设施
- **[MemOS](https://github.com/MemTensor/MemOS)**（~11,000 Stars）—— AI Agent 持久记忆操作系统
- **[ouroboros](https://github.com/Q00/ouroboros)**（~5,700 Stars）—— Agent 自进化操作系统
- **[open-design](https://github.com/nexu-io/open-design)**（~91,000 Stars）—— 开源设计插件，原型、落地页、仪表板
- **[memsearch](https://github.com/zilliztech/memsearch)**（~2,500 Stars）—— 基于 Markdown + Milvus 的 Agent 记忆层

## 注意事项

> ⚠️ **开发者预览阶段**

DeepSeek 明确标注当前版本为开发者预览，警告：

- 兼容性问题可能在任何更新中出现
- 核心插件和 API 仍在快速迭代
- 生产环境使用需谨慎

> 🔒 **安全建议**

- 首次使用建议从 **Minimal** 权限模式开始
- 审查每个操作的审批请求
- 文件系统沙箱有明确的边界限制（不包含网络和进程可见性）
- 使用测试仓库先验证插件兼容性

## 总结

DeepSeek Harness 最大的价值在于其**开源、可组合、透明**的架构。与 Claude Code 等闭源方案不同，你可以：

- 自由选择模型（DeepSeek、OpenAI、Anthropic、本地 Ollama 模型等）
- 逐层替换和扩展任何能力
- 完整查看和回放 Agent 的推理过程
- 通过插件生态系统按需定制功能

虽然生态还很年轻，但发展速度惊人。建议从 ModLens + better-sidebar 开始，根据自己的实际工作流逐步添加插件。

---

**参考资源：**
- 官方仓库：[deepseek-ai/deepseek-harness](https://github.com/deepseek-ai/deepseek-harness)
- 官方文档：[deepseek.com/harness](https://deepseek.com/harness/en)
- Cordis 论文：[官方技术报告](https://deepseek.com/harness/en)
- 社区插件：[awesome-dsh-plugin](https://github.com/awesome-dsh-plugin/awesome-dsh-plugin)
- Discord 社区：[DeepSeek Harness Discord](https://discord.gg/deepseekharness)]]></content:encoded>
    </item>
    <item>
      <title>Ubuntu 26.04 LTS「Resolute Raccoon」全面解析：开源操作系统的革新之作</title>
      <link>https://atom.inte8.top/blog/Ubuntu-26-04-LTS-Resolute-Raccoon全面解析/</link>
      <guid>https://atom.inte8.top/blog/Ubuntu-26-04-LTS-Resolute-Raccoon全面解析/</guid>
      <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
      <description>Ubuntu 26.04 LTS「Resolute Raccoon」全面解析：开源操作系统的革新之作</description>
      <category>技术教程</category>
      <category>Linux</category>
      <category>ubuntu</category>
      <category>操作系统</category>

      <content:encoded><![CDATA[## 前言

2026年4月23日，Canonical 正式发布了 Ubuntu 26.04 LTS（长期支持版），代号 **"Resolute Raccoon"（坚定的浣熊）**。这是 Ubuntu 第 11 个 LTS 版本，也是近年来变化最大、功能最为全面的长期支持版本之一。

作为面向桌面、服务器、云和边缘的全场景操作系统，Ubuntu 26.04 LTS 在**芯片级优化**、**安全架构**和**AI/ML 生态**三个维度同时发力，被 Canonical 称为"有史以来安全设计最扎实的 LTS 版本"。

本文基于 Ubuntu 官方发布博客和安全更新公告，为你梳理这次更新的核心亮点，并与上一个 LTS 版本 Ubuntu 24.04（Noble Numbat）进行对比分析。

---

## 一、Ubuntu 26.04 LTS 核心升级内容

### 1. 桌面环境：Wayland 正式完全切换

Ubuntu 26.04 LTS 完成了从 X.org 到 **Wayland** 的上游迁移。

| 特性 | 说明 |
|------|------|
| 逐显示器缩放 | 每个外接显示器可独立设置 DPI，解决多屏用户痛点 |
| 触摸/手势原生支持 | 触控板手势、触摸屏压感不再依赖第三方驱动 |
| 画面撕裂消除 | Wayland 合成器从底层解决游戏/视频帧率撕裂问题 |
| NVIDIA 生产驱动 | 全面支持最新版 NVIDIA 专有驱动，与 Wayland 深度整合 |

> 背景：Ubuntu 自 22.04 起就在推进 Wayland 迁移，但 X.org 始终作为默认选项存在。26.04 彻底完成了这一里程碑切换。

---

### 2. 内核升级：Linux 7.0

Ubuntu 26.04 LTS 内核从 24.04 的 **6.8** 直接跨越到 **7.0**，带来大量硬件支持更新：

**新增硬件支持：**
- **Intel Core Ultra Series 3（代号 Panther Lake）**：集成 Xe3 显卡和 NPU（神经网络处理器），Ubuntu 26.04 是首个在开源生态中完整支持该芯片 NPU 的主流发行版
- **工业以太网**：将 IgH EtherCAT Master 模块和 Generic Ethernet 驱动纳入主线内核，支持微秒级实时工业通信，适用于工厂自动化、机器人控制系统

---

### 3. AI/ML 生态：CUDA 和 ROCm 进入官方软件源

这是 Ubuntu 26.04 LTS 最具里程碑意义的变更之一：

**NVIDIA CUDA**
- Ubuntu 26.04 **首次将 NVIDIA CUDA 直接分发**到官方 apt 软件仓库
- 同时提供 NVIDIA DOCA-OFED（高性能网络驱动），通过官方 PPA 安装
- 覆盖数据中心 GPU 和桌面级 RTX 系列

**AMD ROCm**
- AMD ROCm 软件平台现已进入 Ubuntu 官方仓库
- 支持 AMD Instinct 数据中心 GPU、AMD Radeon 桌面/笔记本 GPU、AMD Ryzen AI PC
- 所有组件经过 Canonical 验证，提供与 CUDA 同等的 LTS 级支持体验

> AMD ROCm 副总裁 Andrej Zdravkovic 表示："AMD ROCm 通过 Ubuntu 官方包供应链交付，安装和更新简单、可靠、完全经过交叉验证。"

---

### 4. 机密计算：Intel TDX + AMD SEV-SNP 全栈支持

Ubuntu 26.04 LTS 在**来宾（Guest）和宿主（Host）两侧**均提供对 Intel TDX 和 AMD SEV-SNP 的完整集成支持。

这意味着可以在同一套 Ubuntu 镜像上，运行由 CPU 硬件加密保护的虚拟机，支持跨 Intel / AMD / NVIDIA 硬件的统一机密计算部署，适用于：
- 公有云上的隐私 AI 推理
- 金融/医疗数据合规场景
- 企业内部敏感代码保护

---

### 5. 内存安全：Rust 重写核心系统组件

Ubuntu 26.04 LTS 是首个**大规模引入 Rust 重写系统组件**的 LTS 版本：

| 组件 | 语言 | 说明 |
|------|------|------|
| `rust-coreutils` | Rust | 核心工具集（`ls`、`cp`、`mv` 等）替代 GNU coreutils |
| `sudo-rs` | Rust | sudo 权限管理器的 Rust 重写版，成为**默认版本** |
| 内核驱动 | Rust | 新增 Rust 编写的内核模块和子系统 |

Rust 基金会 CEO Dr. Rebecca Rumbul 表示："Ubuntu 26.04 LTS 展示了当一个主流 Linux 发行版对内存安全做出严肃且持续承诺时会发生什么。"

> GNU coreutils 和传统 sudo 仍作为兼容备份保留。

---

### 6. TPM 全盘加密：正式量产就绪

TPM 绑定的全盘加密（FDE）从 24.04 的实验性功能升级为 **26.04 的正式 GA（General Availability）版本**：

- 加密密钥绑定到 TPM 芯片物理硬件，物理访问攻击门槛大幅提高
- 固件更新期间的恢复密钥处理流程得到优化，减小了更新导致启动失败的风险
- 与 Absolute/Computrace 等第三方 BIOS 层的兼容性信息已完整文档化

同时引入了 **Security Center（安全中心）控制面板**，将加密状态、Secure Boot 状态、磁盘保护等安全配置从"安装时一次性设置"变为**部署后可随时检查和管理的生命周期任务**。

---

### 7. 密码学升级：后量子密钥交换默认启用

Ubuntu 26.04 LTS 默认启用**混合后量子密钥交换**（mlkem768x25519-sha256），OpenSSH 升级至 10.2：

- DSA 支��彻底移除（不再生成 DSA 主机密钥）
- SSH 服务端不再读取 `~/.pam_environment`，减少环境注入风险
- 所有现代化特性均为**默认启用**，无需手动配置开关

---

### 8. 身份服务安全加固

| 变更 | 说明 |
|------|------|
| SSSD 以 `sssd` 用户运行 | 不再以 root 身份运行，减小权限攻击面 |
| OpenLDAP 运行在 AppArmor enforce 模式 | 进程级强制访问控制 |
| OpenLDAP 密码哈希改进 | PBKDF2 迭代次数可调，提升暴力破解抵御能力 |
| Authd 认证框架 | 支持 OpenID Connect 云身份提供商集成，包含 MFA（多因素认证） |

---

### 9. ARM64 Livepatch：里程碑意义的支持扩展

Ubuntu 26.04 LTS 将 **Canonical Livepatch**（无需重启的内核热补丁）能力首次扩展到 **ARM64 架构**。

这对运行在 ARM 服务器和边缘设备上的 Ubuntu 系统意义重大——在 AI 推理和常驻工作负载进入生产环境的当下，系统无法承受因内核补丁导致的服务中断。Arm 云计算生态系统开发总监 Bhumik Patel 表示："Ubuntu 26.04 LTS 实现了内核更新可在系统完全运行状态下实时修复关键漏洞。"

---

### 10. RISC-V 支持：RVA23 基线标准

Ubuntu 26.04 LTS 完整支持 **RVA23**（RISC-V 应用程序处理器基线标准），确保在 RISC-V 芯片上运行的 Ubuntu 可充分利用平台能力，包括在混合架构环境中的正常工作。

---

### 11. 软件管理：App Center 统一体验

Ubuntu 26.04 带来了重新设计的 **App Center**，提供跨 Debian 包（`.deb`）的统一管理界面，并增强了对传统 Debian 包的安装体验。

同时保留了完整的语言工具链和编译器更新，确保开发者无需添加第三方仓库即可构建现代应用。

---

## 二、Ubuntu 26.04 vs Ubuntu 24.04 LTS 对比

> Ubuntu 24.04 LTS 代号 **Noble Numbat**（高贵的袋食蚁兽），发布于 2024 年 4 月。

| 对比维度 | Ubuntu 24.04 LTS | Ubuntu 26.04 LTS |
|----------|-------------------|------------------|
| **代号** | Noble Numbat | Resolute Raccoon |
| **内核** | Linux 6.8 | Linux 7.0 |
| **桌面默认** | X.org + GNOME | Wayland + GNOME（完成迁移）|
| **NVIDIA CUDA** | 需手动添加 CUDA 仓库 | **官方软件源原生支持** |
| **AMD ROCm** | 社区 PPA 安装 | **官方软件源原生支持** |
| **机密计算** | 基础支持 | **Intel TDX + AMD SEV-SNP 来宾/宿主全支持** |
| **TPM FDE** | 实验性 | **GA 正式版 + Security Center** |
| **Rust 组件** | 少量探索 | **rust-coreutils + sudo-rs 设为默认** |
| **ARM64 Livepatch** | 不支持 | **支持** |
| **RISC-V** | 基础支持 | **RVA23 完整支持** |
| **OpenSSH** | 9.x | 10.2 + 后量子密钥交换默认启用 |
| **DSA 支持** | 已废弃 | **完全移除** |
| **SSSD 运行用户** | root | 专用 sssd 用户 |
| **工业协议** | 第三方模块 | IgH EtherCAT 主线内核支持 |
| **NPU 支持** | 有限 | Intel Panther Lake NPU 完整支持 |
| **安全中心** | 无 | Security Center 可视化控制面板 |

### 核心趋势总结

从 24.04 到 26.04，Ubuntu 的演进围绕三条主线：

1. **AI-First Infrastructure**：CUDA/ROcm 官方源化意味着 Ubuntu 正式成为 AI 开发的首选开源平台
2. **Memory Safety as Default**：Rust 从内核到用户态工具的全面渗透，代表了开源安全范式的转变
3. **Zero-Trust Security**：从"安装时配好"到"全生命周期可视化管理"，安全不再是一次性配置

---

## 三、适用场景与升级建议

### 推荐升级的人群

- AI/ML 研究者和工程师（CUDA/ROcm 官方支持，NPU 加速）
- 企业级服务器管理员（机密计算、Livepatch、TPM FDE 生产可用）
- 工业自动化从业者（EtherCAT 原生支持）
- 安全敏感型行业（金融、医疗、政府——后量子密码学默认启用）
- 开发者和 DevOps（统一 App Center、现代化编译工具链）

### 建议谨慎的场景

- 依赖特定 X.org 驱动或配置的用户（需确认 Wayland 兼容性）
- 使用较旧 NVIDIA 显卡且依赖老旧闭源驱动的用户
- 生产环境建议等待第一个修订版本（.1）发布后再大规模部署

---

## 四、结语

Ubuntu 26.04 LTS "Resolute Raccoon" 是一次真正意义上的**跨越式的 LTS 更新**。它不只是版本号的递增，而是在 AI 基础设施、内存安全、机密计算三条技术主线上同时实现突破。

对于一个 LTS 版本来说，这意味着未来五年的企业部署将建立在更安全、更有前瞻性的底层架构之上。无论你是在桌面环境工作、在数据中心运行服务器，还是在边缘设备上部署 AI 推理负载，Ubuntu 26.04 都值得认真关注。

> 下载地址：[https://ubuntu.com/download](https://ubuntu.com/download)
> 官方公告：[https://ubuntu.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon](https://ubuntu.com/blog/canonical-releases-ubuntu-26-04-lts-resolute-raccoon)

---

*本文参考 Ubuntu 官方博客（2026年4月发布）及 Ubuntu Security Team 公告编写。*]]></content:encoded>
    </item>
    <item>
      <title>Cloud Mail 基于 Cloudflare 的免费邮箱服务部署指南</title>
      <link>https://atom.inte8.top/blog/Cloud-Mail基于Cloudflare的免费邮箱服务部署指南/</link>
      <guid>https://atom.inte8.top/blog/Cloud-Mail基于Cloudflare的免费邮箱服务部署指南/</guid>
      <pubDate>Tue, 05 May 2026 00:00:00 GMT</pubDate>
      <description>Cloud Mail 基于 Cloudflare 的免费邮箱服务部署指南</description>
      <category>技术教程</category>
      <category>Cloudflare</category>
      <category>邮箱服务</category>
      <category>教程</category>

      <content:encoded><![CDATA[# 📧 Cloud Mail：基于 Cloudflare 的免费邮箱服务部署指南

> 只需要一个域名，就能搭建自己的邮箱平台，支持多用户、多邮箱、收发附件，部署在 Cloudflare Workers 上几乎零成本。

---

## 一、项目简介

**Cloud Mail** 是一个开源的邮箱服务系统，部署在 Cloudflare Workers 上，核心特点：

- 💰 **低成本** — 基于 Cloudflare Workers，免费额度基本够用
- 📧 **邮件收发** — 接收邮件通过 Cloudflare Email Routing，发送邮件通过 Resend
- 📦 **附件支持** — 使用 R2 对象存储保存和下载附件
- 🛡️ **管理后台** — 用户管理、邮件管理、RBAC 权限控制
- 🔀 **多号模式** — 一个用户可以添加多个邮箱地址
- 🎨 **个性化** — 自定义网站标题、登录背景、透明度
- 🤖 **人机验证** — 集成 Turnstile 防止批量注册

**GitHub 仓库**：https://github.com/maillab/cloud-mail

**在线文档**：https://doc.skymail.ink/

---

## 二、前提条件

| 条件 | 说明 |
|------|------|
| 一个域名 | 已接入 Cloudflare（NS 托管） |
| Cloudflare 账号 | 免费账号即可 |
| （可选）GitHub 账号 | 用于 Fork 仓库和 Actions 部署 |

---

## 三、三种部署方式对比

| 方式 | 难度 | 自动更新 | 适合人群 |
|------|------|----------|----------|
| **界面部署** | ⭐ 最简单 | ✅ 同步后自动 | 新手推荐 |
| **Action 部署** | ⭐⭐ 中等 | ✅ 同步后自动 | 想全自动管理 |
| **命令部署** | ⭐⭐⭐ 较难 | ❌ 手动 | 开发者 |

下面分别介绍三种方式。

---

## 四、方式一：界面部署（推荐新手）

### Step 1：Fork 仓库

在 GitHub 上 Fork 项目仓库：

```
https://github.com/maillab/cloud-mail
```

### Step 2：创建 Worker 项目

1. 登录 [Cloudflare Dashboard](https://dash.cloudflare.com)
2. 进入 **Workers & Pages** → **创建**
3. 选择 **连接到 Git**
4. 选择你 Fork 的 `cloud-mail` 仓库
5. **设置目录**为 `mail-worker`（重要！）
6. 点击 **保存并部署**

### Step 3：设置环境变量

在 Worker → **设置** → **变量和机密** 中添加：

| 变量名 | 必需 | 说明 | 示例 |
|--------|------|------|------|
| `domain` | ✅ | 邮箱域名，多域名用 JSON 数组 | `["inte8.top"]` |
| `admin` | ✅ | 管理员邮箱地址 | `admin@inte8.top` |
| `jwt_secret` | ✅ | JWT 密钥（随机字符串，不要特殊字符） | `mys3cr3tk3y2026` |
| `project_link` | ❌ | 是否显示项目链接 | `true` 或 `false` |

### Step 4：绑定数据库

1. 在 Cloudflare 控制台创建 **KV** 命名空间
2. 创建 **D1** 数据库
3. 回到 Worker → **设置** → **绑定**，添加：
   - **D1 绑定**：变量名 `db`（必须是这个名字）
   - **KV 绑定**：变量名 `kv`（必须是这个名字）

> ⚠️ 绑定变量名必须是 `db` 和 `kv`，不能改成其他名字，否则 Worker 无法运行。

### Step 5：设置自定义域名

在 Worker → **设置** → **域和路由** → **自定义域** 中绑定你的域名（如 `mail.inte8.top`）。

### Step 6：初始化数据库

浏览器访问以下地址初始化数据库：

```
https://你的Worker自定义域/api/init/你的jwt_secret
```

例如：

```
https://mail.inte8.top/api/init/mys3cr3tk3y2026
```

看到成功提示即可。

### Step 7：设置邮件路由（关键步骤）

这是让邮箱能收到邮件的核心配置。

1. Cloudflare Dashboard → **你的域名** → **Email** → **Email Routing**
2. 如果首次使用，点击 **Get started** 启用 Email Routing（会自动添加 MX 和 TXT 记录）
3. 进入 **Routing rules** 页面
4. 页面底部找到 **Catch-all address** 区域
5. 点击 **Edit**（编辑）
6. **Action** 选择 **Send to a Worker**（发送到 Worker）
7. **Destination** 下拉选择你的 `cloud-mail` Worker
8. 点击 **Save**

> 💡 Catch-all 的作用是将 `*@你的域名.com`（任意前缀）的邮件全部转发给 Worker 处理，这样每个用户注册的不同邮箱地址都能收到邮件。

**如果找不到 Catch-all 编辑入口**，替代方式：

1. 在 Email Routing 页面 → **Email Workers** tab
2. 找到你的 `cloud-mail` Worker
3. 点击 Worker 卡片上的 **route** 字段展开
4. 点 **Create route**（创建路由）
5. 路由地址填 `*@你的域名.com`（如 `*@inte8.top`）
6. Destination 选 cloud-mail Worker
7. 保存

### Step 8：注册管理员

浏览器访问你的自定义域名（如 `https://mail.inte8.top`），用 `admin@你的域名` 注册账号，登录即可 🎉

---

## 五、方式二：GitHub Actions 部署

适合想全自动化管理的用户，代码更新后自动重新部署。

### Step 1：创建 Cloudflare API 令牌

1. Cloudflare → **我的个人资料** → **API 令牌** → **创建令牌**
2. 选择 **Custom token** 或使用模板，确保有以下权限：
   - `Account - Workers Scripts - Edit`
   - `Account - D1 - Edit`
   - `Account - Workers KV Storage - Edit`
   - `Zone - Workers Routes - Edit`
3. 复制 **API 令牌**
4. 复制 **账户 ID**（在 Cloudflare 首页右侧栏）

### Step 2：Fork 仓库并配置 Secrets

Fork https://github.com/maillab/cloud-mail

在 GitHub 仓库 → **Settings** → **Secrets and variables** → **Actions** 中添加：

| 变量名 | 必需 | 说明 |
|--------|------|------|
| `CLOUDFLARE_API_TOKEN` | ✅ | Cloudflare API 令牌 |
| `CLOUDFLARE_ACCOUNT_ID` | ✅ | Cloudflare 账户 ID |
| `CUSTOM_DOMAIN` | ✅ | 访问网站的域名，如 `mail.inte8.top` |
| `DOMAIN` | ✅ | 邮箱域名，如 `["inte8.top"]` |
| `ADMIN` | ✅ | 管理员邮箱，如 `admin@inte8.top` |
| `JWT_SECRET` | ✅ | JWT 密钥字符串 |
| `NAME` | ❌ | Worker 项目名，默认 `cloud-mail` |
| `D1_DATABASE_ID` | ❌ | 已有的 D1 数据库 ID |
| `KV_NAMESPACE_ID` | ❌ | 已有的 KV 命名空间 ID |
| `PROJECT_LINK` | ❌ | `true` 或 `false` |

### Step 3：运行工作流

1. 进入 GitHub 仓库 → **Actions** 页面
2. 选择部署工作流，点击 **Run workflow**
3. 等待运行完成

### Step 4：设置邮件路由

同界面部署的 Step 7（Email Routing → Catch-all → Send to Worker）

### Step 5：注册管理员

访问自定义域名，注册管理员账号 🎉

> 💡 后续更新只需同步 Fork 到最新代码，GitHub Action 自动重新部署。

---

## 六、方式三：命令行部署

适合开发者，完全本地控制。

### Step 1：克隆项目

```bash
git clone https://github.com/maillab/cloud-mail
cd cloud-mail/mail-worker
pnpm i
```

> 需要 Node.js v20+ 和 pnpm。

### Step 2：在 Cloudflare 创建资源

在 Cloudflare 控制台分别创建：
- **KV** 命名空间
- **D1** 数据库
- （可选）**R2** 存储桶（用于附件存储）

记录各自的 ID。

### Step 3：编辑 `wrangler.toml`

编辑 `mail-worker/wrangler.toml`：

```toml
[[d1_databases]]
binding = "db"              # 不可修改
database_name = "你的D1名字"
database_id = "你的D1数据库ID"

[[kv_namespaces]]
binding = "kv"              # 不可修改
id = "你的KV命名空间ID"

[[r2_buckets]]              # 可选，附件存储
binding = "r2"              # 不可修改
bucket_name = "你的R2桶名"

[assets]
binding = "assets"          # 不可修改
directory = "./dist"

[triggers]
crons = ["0 16 * * *"]     # 定时任务（UTC时间）

[vars]
orm_log = false
domain = ["inte8.top"]     # 邮箱域名
admin = "admin@inte8.top"  # 管理员邮箱
jwt_secret = "你的密钥字符串"
```

### Step 4：部署

```bash
pnpm run deploy
```

### Step 5：设置邮件路由 + 初始化数据库

同前两种方式的对应步骤。

---

## 七、可选增强功能

### 7.1 邮件发送（Resend）

> ⚠️ Cloudflare 封禁了 25 端口，不支持直接发件，需要用第三方服务。

1. 注册 [Resend](https://resend.com)，添加你的域名并完成 DNS 验证
2. 创建 API Key 并复制
3. 设置发送状态回调地址：`https://你的Worker域/api/webhooks`
4. 在 Cloud Mail 后台 → **系统设置** 中填入 Resend API Key

Resend 免费额度：每天 100 封，个人使用足够。

### 7.2 对象存储（R2）

默认附件用 KV 存储，可切换为 R2（免费 10GB）：

1. Cloudflare → **R2** → 创建存储桶
2. 设置自定义域名
3. Action 部署添加 Secret `R2_BUCKET_NAME`
4. 后台系统设置切换存储方式

### 7.3 人机验证（Turnstile）

防止机器人批量注册：

1. Cloudflare → **Turnstile** → 创建组件
2. 获取 Site Key 和 Secret Key
3. 后台系统设置填入

### 7.4 邮件转发到 Telegram

收到邮件时自动通知到 TG：

1. 找 @BotFather 创建 Bot，复制 Token
2. 给 Bot 发一条消息
3. 浏览器访问获取 chat_id：
   ```
   https://api.telegram.org/bot你的Token/getUpdates
   ```
4. 后台系统设置填入 Token 和 chat_id

### 7.5 LinuxDo 第三方登录

在 Worker 变量或 Action Secrets 中添加：

| 变量名 | 说明 |
|--------|------|
| `linuxdo_client_id` | LinuxDo Client ID |
| `linuxdo_client_secret` | LinuxDo Client Secret |
| `linuxdo_callback_url` | 回调地址：`https://你的域名/login` |
| `linuxdo_switch` | `true` 开启，`false` 关闭 |

---

## 八、项目更新

| 部署方式 | 更新方法 |
|----------|----------|
| **Action 部署** | 同步 Fork 代码到最新，Action 自动部署 |
| **界面部署** | 同步代码后 Worker 自动更新，但**需要重新绑定 D1 和 KV** |
| **命令部署** | `git pull` + `pnpm run deploy` |

> ⚠️ 所有更新后都要执行一次初始化地址来更新数据库结构（不会覆盖已有数据）：
> ```
> https://你的Worker域/api/init/你的jwt_secret
> ```

---

## 九、费用估算

| 资源 | Cloudflare 免费额度 | 超出价格 |
|------|---------------------|----------|
| Workers | 10 万次请求/天 | $0.50/百万次 |
| D1 数据库 | 5GB 存储 + 500 万读/天 | 按量计费 |
| KV 存储 | 10 万读/天 + 1GB | 按量计费 |
| R2 存储 | 10GB 存储 + 100 万写/月 | $0.015/GB/月 |
| Resend 发件 | 100 封/天（免费） | 按量计费 |

**个人使用基本零成本** 🎉

---

## 十、常见问题

**Q：Cloudflare 不支持发件怎么办？**

A：Cloudflare 封禁了 25 端口，发件只能走第三方。推荐 Resend（免费 100 封/天），在后台系统设置中配置 API Key 即可。

**Q：收不到邮件？**

A：检查以下几点：
1. 域名的 MX 记录是否正确指向 Cloudflare（Email Routing 启用后自动添加）
2. Catch-all 路由是否指向了你的 Worker
3. Worker 是否正常运行（检查 Dashboard 中的日志）

**Q：多域名怎么配置？**

A：`domain` 变量支持 JSON 数组：`["domain1.com", "domain2.com"]`，每个域名都需要在 Cloudflare 中配置 Email Routing。

**Q：D1 和 KV 的绑定名能改吗？**

A：不能。D1 必须绑定为 `db`，KV 必须绑定为 `kv`，这是代码中硬编码的。

---

*参考文档：[Cloud Mail 官方文档](https://doc.skymail.ink/) · [GitHub 仓库](https://github.com/maillab/cloud-mail)*]]></content:encoded>
    </item>
    <item>
      <title>exo：将多台设备组成 AI 推理集群的完整指南</title>
      <link>https://atom.inte8.top/blog/exo-将多台设备组成AI推理集群的完整指南/</link>
      <guid>https://atom.inte8.top/blog/exo-将多台设备组成AI推理集群的完整指南/</guid>
      <pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate>
      <description>exo：将多台设备组成 AI 推理集群的完整指南</description>
      <category>前沿技术</category>
      <category>exo</category>
      <category>AI集群</category>
      <category>分布式推理</category>

      <content:encoded><![CDATA[## 什么是 exo？

exo 是一个由 [exo labs](https://x.com/exolabs) 维护的开源项目（Apache 2.0 协议），它的核心理念非常简单但强大：**把你所有的设备连接起来，组成一个统一的 AI 推理集群**。

不管你手上有 MacBook、Linux 服务器、还是其他设备，只要装上 exo，它们就能自动发现彼此，协同运行大语言模型。这意味着你可以运行单个设备放不下的大模型——比如用 4 台 Mac Studio 跑 671B 参数的 DeepSeek v3.1。

项目地址：[https://github.com/exo-explore/exo](https://github.com/exo-explore/exo)

## 核心特性

### 1. 自动设备发现

运行 exo 的设备会自动在局域网内发现彼此，无需任何手动配置。你不需要写配置文件，不需要指定 IP 地址，启动就能用。

### 2. Thunderbolt RDMA 支持

exo 是首个支持 Thunderbolt 5 RDMA（远程直接内存访问）的 AI 推理框架。通过 Thunderbolt 5 连接设备，可以将设备间延迟降低 99%。这意味着添加更多设备不仅增加了显存，还真正加快了推理速度。

### 3. 拓扑感知的自动并行

exo 会实时分析你的设备拓扑——每台设备的算力、内存，以及设备间的网络延迟和带宽——然后自动决定如何最优地拆分模型。你不需要手动配置流水线并行还是张量并行，exo 帮你搞定。

### 4. 张量并行（Tensor Parallelism）

支持将模型张量切分到多台设备上并行计算。实测效果：
- 2 台设备：最高 1.8 倍加速
- 4 台设备：最高 3.2 倍加速

### 5. 多种 API 兼容

exo 同时兼容以下 API 格式，可以直接对接你现有的工具：
- OpenAI Chat Completions API
- Claude Messages API
- OpenAI Responses API
- Ollama API

### 6. 内置 Web 仪表盘

提供图形化的集群管理界面，可以查看集群状态、加载模型、进行对话测试。

## 实测性能

以下是 Jeff Geerling 使用 4 台 M3 Ultra Mac Studio（每台 512GB 统一内存）的测试结果：

| 模型 | 精度 | 总参数 | 配置 |
|------|------|--------|------|
| Qwen3-235B | 8-bit | 235B | 4×M3 Ultra + RDMA |
| DeepSeek v3.1 | 8-bit | 671B | 4×M3 Ultra + RDMA |
| Kimi K2 Thinking | 4-bit | - | 4×M3 Ultra + RDMA |

4 台 Mac Studio 总计拥有约 2TB 的统一内存，足以加载和运行这些超大模型。

## 安装部署

### macOS 安装（从源码）

**前置条件：**

1. 安装 Xcode（提供 MLX 编译所需的 Metal 工具链）
2. 安装 Homebrew：
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
3. 安装 uv 和 Node.js：
```bash
brew install uv node
```
4. 安装 Rust nightly：
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly
```
5. 安装 macmon（Apple Silicon 硬件监控）：
```bash
cargo install --git https://github.com/vladkens/macmon \
  --rev a1cd06b6cc0d5e61db24fd8832e74cd992097a7d \
  macmon --force
```

**克隆并运行：**
```bash
git clone https://github.com/exo-explore/exo
cd exo/dashboard && npm install && npm run build && cd ..
uv run exo
```

启动后访问 `http://localhost:52415/` 即可打开仪表盘。

> 如果你使用 Nix，可以直接运行 `nix run .#exo`，跳过大部分安装步骤。

### macOS App 方式

如果你不想折腾命令行，exo 还提供了 macOS 桌面应用，会在后台运行。

- 下载地址：[EXO-latest.dmg](https://assets.exolabs.net/EXO-latest.dmg)
- 系统要求：macOS Tahoe 26.2 或更高版本
- 首次运行会请求系统权限和网络配置

卸载方法：点击菜单栏图标 → Advanced → Uninstall。

### Linux 安装

**前置条件：**
- uv（Python 依赖管理）
- Node.js 18+（构建仪表盘）
- Rust nightly（编译 Rust 绑定）

**Ubuntu/Debian 安装依赖：**
```bash
sudo apt update
sudo apt install nodejs npm

# 安装 uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 安装 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
rustup toolchain install nightly
```

**克隆并运行：**
```bash
git clone https://github.com/exo-explore/exo
cd exo/dashboard && npm install && npm run build && cd ..
uv run exo
```

**重要提示：** 目前 exo 在 Linux 上仅支持 CPU 推理，GPU 支持正在开发中。

Linux 上的文件存放位置遵循 XDG 规范：
- 配置文件：`~/.config/exo/`
- 数据文件：`~/.local/share/exo/`
- 缓存文件：`~/.cache/exo/`
- 日志文件：`~/.cache/exo/exo_log/`

## 启用 RDMA（Thunderbolt 5）

RDMA 是 exo 的杀手级特性，但需要在 macOS 中手动开启。操作步骤：

1. 关机
2. 长按电源键 10 秒，进入启动菜单
3. 选择 "Options" 进入恢复模式
4. 在恢复模式的终端中执行：
```
rdma_ctl enable
```
5. 重启

**注意事项：**
- RDMA 集群中的每台设备都必须与所有其他设备直连
- 必须使用支持 Thunderbolt 5 的线缆
- Mac Studio 上不能使用网口旁边的 Thunderbolt 5 端口
- 从源码运行时，使用 `tmp/set_rdma_network_config.sh` 配置网络
- 所有设备的 macOS 版本必须完全一致（包括 beta 版本号）

## 环境变量配置

exo 支持通过环境变量进行灵活配置：

| 变量 | 说明 | 默认值 |
|------|------|--------|
| `EXO_DEFAULT_MODELS_DIR` | 模型下载和缓存的默认目录 | `~/.local/share/exo/models`（Linux）<br>`~/.exo/models`（macOS） |
| `EXO_MODELS_DIRS` | 额外的可写模型目录（冒号分隔） | 无 |
| `EXO_MODELS_READ_ONLY_DIRS` | 只读模型目录（如 NFS 挂载） | 无 |
| `EXO_OFFLINE` | 离线模式，仅使用本地模型 | `false` |
| `EXO_ENABLE_IMAGE_MODELS` | 启用图像模型支持 | `false` |
| `EXO_LIBP2P_NAMESPACE` | 自定义集群命名空间（用于隔离） | 无 |
| `EXO_FAST_SYNCH` | 控制 MLX_METAL_FAST_SYNCH 行为 | 自动 |

**使用示例：**
```bash
# 使用 NFS 上的预下载模型（只读）
EXO_MODELS_READ_ONLY_DIRS=/mnt/nfs/models:/opt/ai-models uv run exo

# 下载模型到外置 SSD
EXO_MODELS_DIRS=/Volumes/ExternalSSD/exo-models uv run exo

# 离线模式
EXO_OFFLINE=true uv run exo

# 启用图像模型
EXO_ENABLE_IMAGE_MODELS=true uv run exo

# 使用自定义命名空间隔离集群
EXO_LIBP2P_NAMESPACE=my-dev-cluster uv run exo
```

## API 使用方法

exo 启动后在 `http://localhost:52415` 提供服务。以下是完整的使用流程：

### 第一步：预览模型部署方案

```bash
curl "http://localhost:52415/instance/previews?model_id=llama-3.2-1b"
```

返回所有可行的部署方案，包括分片策略、所需内存等：
```json
{
  "previews": [
    {
      "model_id": "mlx-community/Llama-3.2-1B-Instruct-4bit",
      "sharding": "Pipeline",
      "instance_meta": "MlxRing",
      "memory_delta_by_node": {"local": 729808896}
    }
  ]
}
```

### 第二步：创建模型实例

```bash
curl -X POST http://localhost:52415/instance \
  -H 'Content-Type: application/json' \
  -d '{"instance": {...}}'
```

### 第三步：发送推理请求

**OpenAI 格式：**
```bash
curl -N -X POST http://localhost:52415/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "mlx-community/Llama-3.2-1B-Instruct-4bit",
    "messages": [
      {"role": "user", "content": "什么是 Llama 3.2 1B？"}
    ],
    "stream": true
  }'
```

**Claude 格式：**
```bash
curl -N -X POST http://localhost:52415/v1/messages \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "mlx-community/Llama-3.2-1B-Instruct-4bit",
    "messages": [
      {"role": "user", "content": "你好"}
    ],
    "max_tokens": 1024,
    "stream": true
  }'
```

**Ollama 格式（兼容 OpenWebUI 等工具）：**
```bash
curl -X POST http://localhost:52415/ollama/api/chat \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "mlx-community/Llama-3.2-1B-Instruct-4bit",
    "messages": [
      {"role": "user", "content": "你好"}
    ],
    "stream": false
  }'
```

### 第四步：删除模型实例

```bash
curl -X DELETE http://localhost:52415/instance/YOUR_INSTANCE_ID
```

### 加载自定义模型

支持从 HuggingFace 加载任意模型：
```bash
curl -X POST http://localhost:52415/models/add \
  -H 'Content-Type: application/json' \
  -d '{"model_id": "mlx-community/my-custom-model"}'
```

### 其他有用的 API 端点

- 列出所有模型：`curl http://localhost:52415/models`
- 仅列出已下载模型：`curl http://localhost:52415/models?status=downloaded`
- 搜索 HuggingFace：`curl "http://localhost:52415/models/search?query=llama&limit=10"`
- 查看实例状态：`curl http://localhost:52415/state`

## 性能基准测试

exo 内置了 `exo-bench` 工具用于性能测试：

```bash
uv run bench/exo_bench.py \
  --model Llama-3.2-1B-Instruct-4bit \
  --pp 128,256,512 \
  --tg 128,256
```

**主要参数：**
- `--model`：要测试的模型
- `--pp`：Prompt 长度提示（逗号分隔）
- `--tg`：生成长度（逗号分隔）
- `--max-nodes`：限制使用节点数（默认 4）
- `--sharding`：分片方式过滤（`pipeline`/`tensor`/`both`）
- `--repeat`：每个配置重复次数（默认 1）

输出包括 Prompt Tokens/s、生成 Tokens/s 和峰值内存使用量。

## 典型使用场景

**场景一：个人开发者**
一台 MacBook Pro + 一台 Mac Mini，通过 Thunderbolt 连接，可以运行 70B 级别的量化模型，速度比单机快近一倍。

**场景二：小型团队**
4 台 Mac Studio 组成集群，拥有 2TB 统一内存，足以运行 DeepSeek v3.1（671B）等超大模型，完全本地化，无需云服务费用。

**场景三：混合环境**
几台不同型号的 Mac/Linux 机器在同一网络中，exo 自动发现并合理分配模型分片，充分利用每台设备的算力。

## 总结

exo 的出现让"家庭/小团队 AI 集群"成为现实。它的核心优势在于：

1. **零配置**：设备自动发现，开箱即用
2. **高性能**：Thunderbolt RDMA 将设备间延迟降到微秒级
3. **智能调度**：自动分析拓扑，选择最优并行策略
4. **广泛兼容**：支持 OpenAI/Claude/Ollama 等多种 API
5. **完全开源**：Apache 2.0 协议，可自由使用和修改

如果你手边有多台 Mac 或 Linux 机器，强烈推荐尝试 exo——几行命令就能将它们变成一个强大的 AI 推理集群。]]></content:encoded>
    </item>
    <item>
      <title>我这一生（一）童年与留级</title>
      <link>https://atom.inte8.top/blog/我这一生01-童年与留级/</link>
      <guid>https://atom.inte8.top/blog/我这一生01-童年与留级/</guid>
      <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
      <description>我这一生（一）童年与留级</description>
      <category>生活随笔</category>
      <category>我的一生</category>
      <category>童年</category>
      <category>回忆录</category>

      <content:encoded><![CDATA[1987年，我出生在一个普通的农村家庭。作为父亲同辈兄弟姐妹里第一个出生的男孩，爷爷对我抱有很大期望，我的名字也是由他亲自取的。爷爷是家里唯一的知识分子，一位小学教师。也许正因为他是老师，从我牙牙学语开始，他就教我背古诗——尽管他教的是数学。儿时没什么杂念，爷爷教什么，我就念什么。五岁时，我已能背诵五十首古诗。每次学会，爷爷都会开心地在人前炫耀。

那个年代农村普遍贫穷，爷爷作为村里"吃公家饭"的人，偶尔才有带奶奶出门的机会，每次都会带上我。我们一起去过北京，也去过洛阳。当然，我自己的记忆是模糊的，这些都是后来家人告诉我的。

那时的农村没有正规幼儿园，只有类似幼儿园的"育红班"。但爷爷认为我不必去，所以1991年，我五岁就直接上了一年级。开学前，妈妈给我缝了一个简单的斜肩书包。吃完早饭，我便独自步行上学，和其他孩子没什么两样。

在我上学必经之路上，会路过同学刘正欣家。他家养了一只大公鸡，每次路过，它都扑腾着翅膀来啄我。结果我每次都是哭着、跑着、摔着赶到学校。连续几天后，爷爷问起缘由。我一五一十说完。那时农村条件不好，又是计划生育时期，因我还有个妹妹，从那天起，我便搬去和爷爷奶奶同住。爷爷每天背我上学，只为避开那只公鸡。

一年级课程简单，只有语文和数学。期末时，我数学全班第一，语文却差劲得多。那时的语文主要看字迹，作业本都是田字格，别人一格写一字，我却要用四个田字格才能写一个字，手控不住，写不下小字。正因如此，语文老师判定我不宜升级，我人生的第一次留级由此开始。

那时爷爷家里不只住着我一人，大姑家的大姐、大伯家的二姐也曾同住。那是计划生育年代，懂的都懂，有的是因要生二胎，有的是因家庭条件差。听我爸说，他结婚分家时只分了半壶油，婚房都是靠自己烧砖盖的。每逢周末或放假，爷爷大约六点就会叫醒所有人，从家跑步到东街粮店（旧时收公粮的地方），往返三公里左右。这一习惯，直到我升初中从未间断。

留级后，因内容熟悉，即便不用功，成绩也常居前三。这一年，班里来了个竞争对手叫刘宗旭，同样五岁上学。打那以后，我俩的排名基本就是轮流坐庄：这次他第一，下次我第一。每学期期末，全校集合发奖状。学校的老师挺会玩：数学第一、语文第一、双科第一、三好学生，光一年级两门课就能拿四张奖状。

这个阶段没什么记忆里太深刻的事，直到1994年，三年级（8岁）。这一年增加了早晚自习。那时家里买不起蜡烛，我们也一样。大家带一块木板，捡些塑料袋，点燃塑料袋，让燃烧的油滴一滴一滴积在木板中间，积够后点燃木板照明。我们就这样上早晚自习。后来爷爷给我买了一盏煤油灯，但没用多久，三年级就快结束了。

那年期末，数学我没拿奖状，语文获奖与否已记不清。爷爷很生气，拿着扫帚追着我打，骂我不争气。在学校我没解释，回家后却跟爷爷念叨，说是老师改错卷了。起初爷爷不信，后来经不起我絮叨，便去找三年级数学老师要回卷子重批。结果真错了，按实分至少该第三名！

爷爷看完怒不可遏，拿着菜刀去院子里砍了一根种了几年的竹子。后来听奶奶说，爷爷拿着竹子把数学老师家的房瓦都给捅了……]]></content:encoded>
    </item>
    <item>
      <title>我这一生（二）私立学校</title>
      <link>https://atom.inte8.top/blog/我这一生02-私立学校/</link>
      <guid>https://atom.inte8.top/blog/我这一生02-私立学校/</guid>
      <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
      <description>我这一生（二）私立学校</description>
      <category>生活随笔</category>
      <category>我的一生</category>
      <category>童年</category>
      <category>私立学校</category>

      <content:encoded><![CDATA[1995年，三年级结束后（9岁），父母外出务工了。原因是家里种地破产。那时农村人的全部积蓄，就是地里的庄稼。那一年，因为隔壁村建了一个咸菜厂，我们村支书（也是我爸上学时的拜把子兄弟）为了给村民增加收入，自己圈了一块地盖厂房，动员全村改种一种叫"药萝卜"的蔬菜。这种萝卜口感很甜，成熟后晾晒至半干切条做咸菜用的。

因为关系好，我爸把家里所有的地都种成了萝卜。结果到了收获季节，支书只收了几家，发现不赚钱便不再收购了。家里断了收入，我爸找亲戚筹借了些钱，去了郑州，跟随亲戚卖衣服。爷爷奶奶不舍得把萝卜扔掉，就全部擦成了萝卜干，晒干后堆在爷爷家的"二棚"里（平房屋顶和天花板之间的空间）。

从那年开始，每次回家都是炒萝卜干、喝萝卜干面汤，整整吃了三年。那段时间，导致我对萝卜产生了巨大的恐惧。

同年，隔壁乡镇的一个村里开了所私立学校，据说师资力量不错。校长亲自来爷爷家动员我去读书，爷爷同意了。我和同村的刘宗旭，还有几个成绩不错的同学，一起去了那所学校。校长为了显示对我们的器重，专门和我们俩拍了照纪念。

对我们几个村民来说，这是所完全的私立学校。因离家远，无法走读，第一年我们都住校。但学校实际上没有宿舍，我们只能在老师家的客厅里铺床睡觉。我和宗旭是在校长家的客厅睡的，当时也没觉得有什么，农村条件不好，我甚至记不清小时候多久洗一次澡。直到天热时，我浑身长满小红点，痒得坐立难安。周末回家后，爷爷带我去仝村买了种诊所自配的药膏（类似现在的大宝霜）。药膏要涂抹全身，抹上后冰冰凉凉，随着学习紧张，病慢慢就好了。

学校有食堂，饭菜却并不好吃。那时没钱，每位同学都要家里拉粮食交给食堂，按重量兑换饭票买饭。价格倒是不贵。那年姥爷给我送过一次馒头和酱豆（用大豆和西瓜瓤腌制的咸菜）。他送了几十个蒸馍，那时我的食量是半个蒸馍。天气热，没过多久馒头就变干长毛，我没吃，直接扔掉了。

四年级期间，乡镇准备举办奥林匹克竞赛（其实就是全镇报名学生集中考试，比拼学校名次）。考试前，学校先进行摸底，后来给我报了数学竞赛。考试那天，数学老师专门骑自行车带我去考场。因为考前动员得好，我没有怯场，正常发挥，提前半小时交卷。出来后老师问我考得怎么样，我说还行，老师便没再问。

考试结束后，数学老师带我们去了他家吃饺子。对于天天吃萝卜干的我，再也没有比这更好吃的了。后来成绩公布，也没有让老师失望。我拿到了全乡第三的名次，那张奖状今天还挂在老家。至今我都记忆深刻，因为这位老师的教育风格特别有趣，我对数学越来越有兴趣。也正因为有兴趣，数学成绩总是维持在前三名。老师对我赞誉有加。这位数学老师叫李春雷，是我人生意义上的第一位启蒙老师。

四年级暑假（1996年，10岁），因爷爷家小孩多，我去姥爷上班的地方过了个暑假。因为姥娘（我的亲姥姥）1993年走的（那时我上二年级，7岁），那时候姥爷的状态不是很好，总是喜欢去茶馆喝茶打牌。他总带着一杆烟袋锅、一布袋烟丝，到哪都得抽两口。那年他在禹州神垕的瓷器厂上班，具体干什么我一直没想起来，现在想想应该是看大门的。反正天天见不着人，把我丢在屋里做作业。我一个人不认识路，也不敢出门，就那样度过了那个夏天。

暑假过后，升入了五年级（1996-1997，10-11岁）。

学习更加紧张，老师要求也更严格，打手心、站黑板都是常态。那一年发生了一件大事：1997年2月，邓小平同志去世。校长组织全校师生看电视悼念，一群小孩也不知道为什么，哭得稀里哗啦。

前面没提，其实我们学校建在一个坟场上面。校门外全是大大小小的坟头，种满了柿子树。下课期间，学生们都会跑到校门口，有的树下乘凉，有的爬树摘柿子。也是那一年，我知道了青柿子是涩的。

下半学期，我觉得在校长家住着不方便，后来认识了二姨村里一个叫王灿辉的同学。他姑姑家也在那个村，给了他一个单独的小屋。从那会开始，我就和他一起住，两人一起上下学，一直到毕业。五年级寒假前举行元旦晚会，我和灿辉一起模仿春节晚会的小品。东拼西凑了一个剧本上台表演，现在想想依然记得几句很有特色的台词："卖胶水咯，我的胶水粘飞机、粘大炮、粘住火车不掉道。"当时觉得自己还挺有表演天赋，师生的反应也都不错。

成绩也维持在中上游左右，没什么特别经历。只是到后来，看到有些同村同学夜自习后走路回家。那个学校离村三四公里，走路需近一个小时。我开始试着和他们一起走，刚开始觉得不错，一群人说说笑笑就回去了，后来慢慢觉得浪费睡眠时间，就没有再走读了。]]></content:encoded>
    </item>
    <item>
      <title>我这一生（三）第一次去郑州</title>
      <link>https://atom.inte8.top/blog/我这一生03-第一次去郑州/</link>
      <guid>https://atom.inte8.top/blog/我这一生03-第一次去郑州/</guid>
      <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
      <description>我这一生（三）第一次去郑州</description>
      <category>生活随笔</category>
      <category>我的一生</category>
      <category>回忆录</category>
      <category>初中篇</category>

      <content:encoded><![CDATA[考上初中那年暑假，我第一次去郑州。

那时候爸爸妈妈在郑州二七区路寨村对面有一个服装市场，叫"小树林服装市场"，离郑州大学老校区很近，客户基本都是大学生。

妈妈打电话叫姥爷送我。那天姥爷骑自行车把我送到镇上，本来他要陪我一起去郑州的，结果到上车的时候突然问我："你自己去行吗？"我11岁，我说行。然后姥爷从兜里掏了二三十块——我记不太准了——塞给我，还有一张纸条，上面写着爸爸妈妈市场上那部座机的电话号码。当年一个市场总共就一部电话。姥爷让我自己去了。过路车去郑州，车费7块5，姥爷替我付了钱，我就上了车。

那是我第一次一个人出远门，满脸好奇。

**车上的扒手。** 快到县交界的地方，陆续上来三波人，专门找睡着的人身边坐。以前我不知道那是什么人，现在知道了——这些人就是扒手。这次事情以后，每次我乘坐交通工具，不管距离多远，我都永远醒着……绝不睡觉！

**班车开走了。** 到隔壁县城的时候班车进了车站，我忍不住下车去找厕所，回来发现车已经走了。没办法，在车站又买了一张去郑州的票，15块。比镇上坐车贵了一倍。不过从车站出发后，再没遇上扒手。

**下错站。** 一路没敢睡，靠着窗户看风景。售票员通知下车时，我蒙了——这和电话里父母交代的地方完全不一样。他们说车会到京广路汽车站，出站后沿陇海路往西走，过一个路口再走一百多米，右手边就能看到市场招牌。可我下车的地方和汽车站没有半毛钱关系。后来才知道，那是郑州南三环，也就是现在郑州南汽车站的位置。只不过当年还是郊区的模样，没什么高楼大厦，就一个万客来市场比较出名。

**找警察。** 刘姥姥进大观园也不过如此。我第一反应就是找警察叔叔。操着蹩脚的普通话，找到一个路口执勤的交警。一番云里雾里的描述后，叔叔告诉我距离很远，至少几公里。我说我不怕，告诉我怎么走就行。然后我就按他指的路线，开启了找爸爸妈妈之路。

不知道走了多久，走到市场的时候天已经黑了。妈妈问我怎么来这么晚，我没细说，只说车到的地方和她电话里讲的不一样。她也没多问。

**三碗酸汤水饺。** 晚上爸爸领着我去了一家"山西面馆"。我第一次知道饺子可以配酸汤。一碗半斤水饺，我吃了三碗。撑得路都走不动，爸爸背着我回了家。

**郑州的第一个家。** 所谓的家就是一个单间。当年郑州有很多城中村的房东，把自家的房子租给进城务工的人。房间不大，进门左手边放着厨具，最里面一张床、一张桌子，桌上摆着一台14寸的黑白电视。那天我已经撑得什么都记不住了，就这么在郑州睡了第一个晚上。

**第二天——市场。** 睡醒后，我顺着头天爸爸带我回来的路，摸回了市场。爸爸妈妈的摊位在市场最里面，最后一间。一路走过来看到了很多熟面孔——三爷、三奶和他们家的孩子（我喊叔的），还有表舅家、二姨、二姨夫，挨个打了招呼后，去了爸爸妈妈的店。

说是店，其实算不上，就是一个大棚，四根铁柱子用四方铁网封闭，铁网中间夹着布层，三面包起来而已。爸爸妈妈的店里面在后面的位置隔了一米多宽的小间，里面放了一张床，看得出来平时要有人睡店里看店的。因为我来了郑州，爸爸妈妈都挤在店里住。很难想象他们冬天是怎么过的。

**酸汤面鱼。** 快到中午，有个挑着筒的商贩从店门口路过。爸爸问我要不要吃，我说不饿。爸爸还是说："尝尝吧。"我有幸第一次吃到了郑州美食——酸汤面鱼。虽然很撑，我还是把一碗炫了个干净。

**绿城广场。** 傍晚的时候，爸爸让妈妈带着二姨、表舅妈、我叔，一圈子亲戚领着各家小孩一起出去玩。我哪里都没去过，哪里都想去。我们走路去了绿城广场——我到郑州后的第一个景点。

那年广场上有放风筝的，有穿带轮子的鞋溜冰的，也有踢足球、打扑克的。各种我没见过的。那天我经历了人生中很多个第一次，感触良多。

**暑假的日子。** 后来的日子也基本如此。下午出去玩就不需要家长带了，表舅家孩子和三爷家孩子年纪比较大，由他俩轮班带着我们去。后来又去了大学里的滨河公园、碧沙岗公园。我还拍了几张照片，妈妈应该还保存着。

假期的时间总是过得很快，一个暑假眨眼就过去了。

**回程。** 爸爸妈妈安排好了回程的车，买了票，又给了我几十块钱。那是我人生中第一次手里拿着十元以上属于我的票子。

**吹嘘的资本。** 回到老家后，我就有了吹嘘的资本。毕竟也算那个圈子里第一个去过大城市的孩子了。在一帮小孩堆里侃侃而谈，他们也听得聚精会神。]]></content:encoded>
    </item>
    <item>
      <title>我这一生（四）长桥镇一中</title>
      <link>https://atom.inte8.top/blog/我这一生04-长桥镇一中/</link>
      <guid>https://atom.inte8.top/blog/我这一生04-长桥镇一中/</guid>
      <pubDate>Sat, 02 May 2026 00:00:00 GMT</pubDate>
      <description>我这一生（四）长桥镇一中</description>
      <category>生活随笔</category>
      <category>我的一生</category>
      <category>回忆录</category>
      <category>初中篇</category>

      <content:encoded><![CDATA[回到老家，开学了。

由于是隔壁乡镇上初中，距离大概有五六公里，所以初中那会我就要骑自行车上学了。当时大伯家出去务工了，所以他家那辆我上小学时候就特别羡慕的弯梁自行车就归了我。每周五下午从学校骑回去，周日晚上骑回学校，屁颠屁颠的。

我上初一那会儿才11岁，全班年龄最小，个子最矮，坐在第一排。分在一五班，教室在三楼最东头，班主任叫孔焕仙，是个年纪偏大的女老师，班长叫孔科陪。现在回想起来，让我想起了《夏洛特烦恼》里"我的父亲是区长"那段……

**第一天就挨了揍。** 第一天晚上住宿就挨了揍，原因是争下铺。下铺不用爬，我个子矮，不想睡上铺。一个宿舍8张上下铺，16个人，个子最高的那个孩子因为争下铺跟我闹了起来。我本来就矮，也从来没打过架，和人对阵完全就是挨揍的份儿，给我揍得疼了一夜都没睡着。后来去二姑家的时候，得知她丈夫大哥家的孩子也在这个学校上学。我把挨揍的事告诉他后，下一周他直接把那个孩子揍退学了。我第一次感觉到——背后还是得有人。

**打疫苗。** 学校组织打乙肝疫苗，36块。那时候买双田径鞋才7块，回力鞋12块。初中那几年我一直没尝过回力穿脚上是什么滋味。家里条件不好，一双鞋穿一星期，回家刷了继续穿，除非破到没法修了，家里才会给买新的。看着家里的条件，我心疼这36块。回家后没敢要，返校后告诉老师："不打，家里没钱。"老师也没说什么。直到后来爸爸查出有乙肝，我才去做大小三阳检测、打了疫苗——那都是2018年的事了。

**湿袜子。** 年轻人火力大，每天袜子都是湿的。夜自习十点多下课，11点熄灯铃响后关灯，早上5点起床洗漱，5点15早操，5点半早自习。根本没什么时间做自己的事，一般都是晚上用冷水冲一下脚，随便搓两下袜子搭在床头，等早上再穿。往往早上起来就是穿着湿袜子上的早操，早已是常态。

**楼道撒尿。** 还有一件有意思的事。宿舍在二楼，到厕所要下楼穿过半个操场。所以好多同学都在一楼到二楼的楼梯间直接解决，那地方经常是尿骚味不比厕所轻多少。有天晚上班主任查寝室，发现一个同学正在楼道里撒尿，立马打开了大灯直照。那同学吓蒙了，提着裤子就跑，班主任拿着灯在后面追，非要看看是哪个班的。结果没追上，就在宿舍外面念叨："跑什么跑，大的小的我没见过……"那天晚上憋笑差点没给我憋出内伤。

**学习成绩。** 初一的时候，学习成绩还是可以的。那个年代小学还是五年制，课程里没有英语。得知上初中可以学英语后，我就去找大伯家的大姐——我上五年级的时候她初二了——借了她的初一英语课本。五年级暑假，我把初一英语上下册都背了下来。所以虽然发音很蹩脚，成绩还是很好。其他课程没有特别突出的，但也没特别落后的。

后半学期历史成绩不太理想，我就开始恶补。每天拿着历史课本，到学校里一个盖完但从未投入使用的食堂，坐在水泥地上背课文。一开始死记硬背，可慢慢看多了，发现历史其实可以当故事书来读，一下子提起了兴趣。不过成绩回归正常后，这个兴趣也没有持续太久。

由于个子矮，发育也不好，所以经常受欺负。

**校牌。** 这所学校几乎是半军事化管理——早操、课间操，规定必须佩戴校牌。校牌上就五个字：长桥镇一中，没有其他特别的。学校卖两块一个。每次集合都要检查，没戴的就罚款，没现金的同学就拿饭票找人换钱来交。

因为这种规定，学校里涌现了一批人，趁下课大家挤在楼梯里的时候，抓别人的校牌，再拿到班里卖。我相信老师们都知道这事，但在我还在那个学校的期间，我没见过有人处理。

**1998年抗洪。** 那年有一件大事我至今记得。由于学校是半军事化管理，校长组织全体师生去迎接抗洪官兵归来。学校光学生就有1500多名，步行了几公里到指定路上，单排站在马路两边等待。队伍好长、好长。等官兵们到来的时候，周围的同学都在欢呼，有的往车上扔水果、扔笔记本，甚至有人扔校牌。我不记得自己做了什么——应该是什么也没做。

**饭票年代。** 当时没有现金，学校食堂吃饭全用饭票，用家里的粮食换。我家别的不多，粮食不少。因为家里好多亲戚都出去务工了，地没人种就全都租出去了。一亩田一年四百斤粮食，我记得我们租出去了十几亩田。我一个星期50斤饭票，食堂2两饭票一个馒头，大概就是这样的物价。

**丢饭票。** 初一第二周就开始丢饭票。周日晚上还有50斤，第二天早上起来就只剩十几斤了。怕后面再挨揍，也不敢告老师，只能老老实实天天馒头泡稀饭将就过。这情况一直持续到初一结束前一个月。

后来发现小偷，是因为一次意外。我同校毕业的一个同学，他家里没人，周末想去我家借宿。当时爷爷奶奶在自己老房子住，我自己在爸爸妈妈盖的新房子里住。我心想有个伴也挺好，晚上也能一起聊聊天，何况又是小学同学，初中也分在一个宿舍，就没多想，同意了。结果他趁我晚上睡着，把家里剩下的饭票一锅端了。等开学那天我找饭票怎么都找不到，这才明白一直是他偷的。回到学校后，我威胁要告老师，他才答应还我。怎么还呢？偷别人的给我。不过也就还了两三次，连100斤都不到。后来也不还了。期末考试完，被子、课本，甚至自行车的气门芯都丢了。我怀疑是这个孩子干的，但没有证据。那次回家我是坐同村来接孩子的家长开的农用三轮车回去的。至今我都记得那个偷我饭票的同学。

**寒假去了郑州。** 初一第一学期结束，寒假我去了郑州找爸爸妈妈。那个寒假收获了很多第一次，包括第一次收到百元压岁钱。以前在老家，老人给压岁钱三块五块是个意思就行了。由于家里的规矩，压岁钱收到后是要上交的。那一年破天荒的，妈妈让我自己留了一百。

**第一次上当。** 我也用那点钱上了人生第一次当。妈妈带我们去火车站玩，那年福利彩票做活动，现买现刮，还请了一个明星站台——就是《整蛊专家》里"大傻"的扮演者成奎安。当年没看过电影的我完全不知道他是谁，反正觉得挺热闹。两块钱一张，我买了50张，然后非常"幸运"地中了五十块香皂。我一寻思，这事也不能跟妈妈说，香皂也没敢拿回家，直接丢进路边的垃圾桶了。

**丢车。** 小树林市场只开放到年前二十几号，具体几号我记不清了。过年期间爸爸妈妈为了多赚点钱，会把衣服全部打包装到一辆脚蹬三轮车上，然后凌晨两三点就开始往火车站骑。要知道从小树林到火车站，至少得有七八公里远。两个人，一个骑一个推，每天早早出发，只为占一个好位置。

他们并没有带我去过，但我都知道。

那一年发生了一件事。忘了是哪一天，爸爸妈妈正常早早地前往火车站占摊位。那天出发得特别早，几个一起出摊的人到了以后觉得冷，就在三轮车旁边用路边的垃圾生了一堆火驱寒。等火熄灭后，爸爸回头一看——车没了。

怎么都找不到。找了一整天，也没找到。

爸爸妈妈回到路寨租的房子里。我尤其记得爸爸那天一直边哭边扇自己耳光，一直在说："为什么要烤火，为什么要烤火……"妈妈坐在一旁，一声不吭。

后来一起在市场卖服装的亲戚们都去了我家。爸爸妈妈不让我在屋里，但我依稀听到了一些——在讨论是回老家还是怎么办。最终的结果是，亲戚们给爸爸妈妈凑了一点钱，继续在这个城市重新打拼。

小时候觉得没什么，现在想起来，这肯定是我爸爸妈妈一生之痛。

**寒假的日子。** 后来的日子也基本如此。下午出去玩不需要家长带了，表舅家孩子和三爷家孩子年纪比较大，由他俩轮班带着我们去。后来又去了大学里的滨河公园、碧沙岗公园。那个寒假我学会了跳棋、象棋，还拍了几张照片，妈妈应该还保存着。

假期的时间总是过得很快，一个寒假眨眼就过去了。]]></content:encoded>
    </item>
    <item>
      <title>Markdown 完全使用指南：从入门到精通</title>
      <link>https://atom.inte8.top/blog/Markdown完全使用指南/</link>
      <guid>https://atom.inte8.top/blog/Markdown完全使用指南/</guid>
      <pubDate>Fri, 01 May 2026 00:00:00 GMT</pubDate>
      <description>Markdown 完全使用指南：从入门到精通</description>
      <category>技术教程</category>
      <category>Markdown</category>
      <category>博客</category>
      <category>写作</category>

      <content:encoded><![CDATA[> 本文由小马（Hermes Agent 智能体）整理编写，参考 CommonMark 规范、GitHub Flavored Markdown 规范及 Markdown 官方中文文档。

## 什么是 Markdown？

Markdown 是一种**轻量级标记语言**，由 John Gruber 于 2004 年创造。它用简洁的键盘符号代替繁琐的排版操作，让你专注于内容本身而非格式。

核心优势：
- **简洁**：常用标记符号不超过 15 个
- **通用**：GitHub、简书、知乎、Notion、VS Code 等全线支持
- **可移植**：纯文本格式，任何编辑器都能打开
- **易转换**：可导出 HTML、PDF、Word 等格式

---

## 一、基础语法

### 1.1 标题

用 `#` 号表示标题，1-6 个 `#` 对应 1-6 级标题：

```markdown
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题
```

**注意**：`#` 和标题文字之间必须有一个空格。

### 1.2 段落与换行

- **段落**：用一个或多个空行分隔段落
- **换行**：在行尾加两个空格，或使用 `<br>` 标签

```markdown
这是第一段。

这是第二段。
行尾加两个空格  
可以实现强制换行。
```

### 1.3 强调（粗体、斜体、删除线）

```markdown
*斜体文本*
_斜体文本_

**粗体文本**
__粗体文本__

***粗斜体文本***
___粗斜体文本___

~~删除线文本~~
```

效果：

- *斜体文本*
- **粗体文本**
- ***粗斜体文本***
- ~~删除线文本~~

### 1.4 引用

```markdown
> 这是引用内容
> 可以有多行
>
> 甚至可以分段

>>> 嵌套引用（三层）
```

> 这是引用内容
> 可以有多行

### 1.5 分隔线

```markdown
---
***
___
```

三个或更多的 `-`、`*`、`_` 都可以生成分隔线。

---

## 二、列表

### 2.1 无序列表

```markdown
- 项目一
- 项目二
  - 子项目 2.1
  - 子项目 2.2
- 项目三

* 也可以用星号
+ 或者加号
```

效果：
- 项目一
- 项目二
  - 子项目 2.1
  - 子项目 2.2

### 2.2 有序列表

```markdown
1. 第一步
2. 第二步
3. 第三步
   1. 子步骤 3.1
   2. 子步骤 3.2
```

### 2.3 任务列表（GFM 扩展）

```markdown
- [x] 已完成的任务
- [x] 另一个已完成的任务
- [ ] 待办任务
- [ ] 另一个待办任务
```

效果：
- [x] 已完成的任务
- [ ] 待办任务

---

## 三、代码

### 3.1 行内代码

用反引号包裹：

```markdown
使用 `print("Hello")` 输出文字。
```

效果：使用 `print("Hello")` 输出文字。

### 3.2 代码块

用三个反引号包裹，并可指定语言实现语法高亮：

````markdown
```python
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for num in fibonacci(10):
    print(num)
```
````

支持的语言标识：`python`、`javascript`、`java`、`c`、`cpp`、`go`、`rust`、`bash`、`sql`、`json`、`yaml`、`html`、`css` 等上百种。

### 3.3 常用代码语言标识

| 语言 | 标识 | 语言 | 标识 |
|------|------|------|------|
| Python | `python` | JavaScript | `javascript` / `js` |
| Java | `java` | C | `c` |
| C++ | `cpp` | Go | `go` |
| Rust | `rust` | Bash | `bash` / `shell` |
| SQL | `sql` | JSON | `json` |
| YAML | `yaml` | HTML | `html` |
| CSS | `css` | XML | `xml` |
| PHP | `php` | Ruby | `ruby` |
| Swift | `swift` | Kotlin | `kotlin` |

---

## 四、链接与图片

### 4.1 链接

```markdown
[链接文字](https://www.example.com)

[带标题的链接](https://www.example.com "鼠标悬停显示的文字")

[引用式链接][1]

[1]: https://www.example.com
```

效果：[因特吧](https://www.inte8.top)

### 4.2 图片

```markdown
![替代文字](/path/to/image.jpg)

![带标题的图片](/path/to/image.jpg "图片标题")

![引用式图片][logo]

[logo]: /medias/logo.png
```

### 4.3 带链接的图片

```markdown
[![图片](image.jpg)](https://www.example.com)
```

---

## 五、表格（GFM 扩展）

```markdown
| 左对齐 | 居中 | 右对齐 |
| :--- | :---: | ---: |
| 内容1 | 内容2 | 内容3 |
| 较长内容 | 短 | 中等内容 |
```

效果：

| 左对齐 | 居中 | 右对齐 |
| :--- | :---: | ---: |
| 内容1 | 内容2 | 内容3 |
| 较长内容 | 短 | 中等内容 |

对齐方式：
- `:---` 左对齐（默认）
- `:---:` 居中
- `---:` 右对齐

---

## 六、高级语法

### 6.1 数学公式

行内公式用 `$...$`，块级公式用 `$$...$$`（需 MathJax 支持）：

```markdown
行内公式：$E = mc^2$

块级公式：
$$
\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$
```

### 6.2 脚注

```markdown
这里有一个脚注[^1]，还有另一个[^2]。

[^1]: 这是第一个脚注的内容。
[^2]: 这是第二个脚注的内容。
```

### 6.3 定义列表

```markdown
术语1
: 定义1的内容

术语2
: 定义2的内容
```

### 6.4 缩写

```markdown
*[HTML]: Hyper Text Markup Language
*[CSS]: Cascading Style Sheets

HTML 和 CSS 是前端基础。
```

---

## 七、HTML 内嵌

Markdown 中可以直接使用 HTML 标签实现更复杂的排版：

### 7.1 文字颜色与大小

```html
<span style="color: red;">红色文字</span>
<span style="color: #42b983; font-size: 20px;">自定义颜色和大小</span>
```

### 7.2 居中

```html
<center>居中的内容</center>
```

### 7.3 折叠内容

```html
<details>
<summary>点击展开</summary>

隐藏的内容在这里。

</details>
```

### 7.4 嵌入视频

```html
<iframe src="//player.bilibili.com/player.html?aid=xxxx" 
  width="100%" height="500" frameborder="0" allowfullscreen>
</iframe>
```

---

## 八、转义字符

如果需要显示 Markdown 语法符号本身，用反斜杠 `\` 转义：

```markdown
\*这不是斜体\*
\# 这不是标题
\[这不是链接\]
```

需要转义的字符：

| 字符 | 名称 | 字符 | 名称 |
|------|------|------|------|
| `\` | 反斜杠 | `` ` `` | 反引号 |
| `*` | 星号 | `_` | 下划线 |
| `{}` | 花括号 | `[]` | 方括号 |
| `()` | 圆括号 | `#` | 井号 |
| `+` | 加号 | `-` | 减号 |
| `.` | 句点 | `!` | 感叹号 |
| `|` | 管道符 | `~` | 波浪号 |

---

## 九、Hexo 博客中的 Markdown

Hexo 博客使用 Markdown 编写文章时，每篇文章开头需要 Front Matter（YAML 格式的元数据）：

```yaml
---
title: 文章标题
description: "文章标题"
date: 2026-05-01 12:00:00
tags:
  - 标签1
  - 标签2
categories: 分类名称
top: 1  # 置顶权重，数字越大越靠前
---

正文从这里开始...
```

### Hexo 特殊标签

```markdown
<!-- 文章摘要截断 -->
<!-- more -->

<!-- 引用文章 -->
{% post_link 文章文件名 显示文字 %}

<!-- 引用资源 -->
{% asset_img 图片名.jpg 图片描述 %}
```

---

## 十、速查表

| 语法 | 效果 | 语法 | 效果 |
|------|------|------|------|
| `**粗体**` | **粗体** | `*斜体*` | *斜体* |
| `~~删除线~~` | ~~删除线~~ | `` `代码` `` | `代码` |
| `# 标题` | H1标题 | `## 标题` | H2标题 |
| `[文字](url)` | 链接 | `![文字](url)` | 图片 |
| `> 引用` | 引用块 | `---` | 分隔线 |
| `- 列表` | 无序列表 | `1. 列表` | 有序列表 |
| `[x]` | 已完成 | `[ ]` | 待办 |
| `[^1]` | 脚注 | `$公式$` | 行内数学 |

---

## 十一、常用工具推荐

| 工具 | 平台 | 特点 |
|------|------|------|
| Typora | Win/Mac/Linux | 所见即所得，最强桌面编辑器 |
| VS Code | Win/Mac/Linux | 插件丰富，程序员首选 |
| Obsidian | Win/Mac/Linux | 知识管理 + 双向链接 |
| Mark Text | Win/Mac/Linux | 开源免费，所见即所得 |
| StackEdit | Web | 在线编辑，支持多平台同步 |
| 小书匠 | Web | 在线编辑，功能全面 |

---

## 总结

Markdown 语法非常简单，核心就是以下几条：

1. `#` 写标题
2. `**粗体**`、`*斜体*`、`~~删除线~~`
3. `-` 无序列表，`1.` 有序列表
4. `>` 引用
5. `` `代码` `` 和 ` ```代码块``` `
6. `[链接](url)` 和 `![图片](url)`
7. `| 表头 | 表头 |` 做表格

掌握这些就能覆盖 90% 的写作场景。更多细节可参考：

- [CommonMark 官方规范](https://commonmark.org/)
- [GitHub Flavored Markdown](https://docs.github.com/zh/get-started/writing-on-github)
- [Markdown 中文教程](https://markdown.com.cn/)

---

*本文写作日期：2026 年 5 月 1 日*]]></content:encoded>
    </item>
    <item>
      <title>Multipass 使用完全指南：本地 Ubuntu 虚拟化管理利器</title>
      <link>https://atom.inte8.top/blog/Multipass入门指南/</link>
      <guid>https://atom.inte8.top/blog/Multipass入门指南/</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <description>Multipass 使用完全指南：本地 Ubuntu 虚拟化管理利器</description>
      <category>技术教程</category>
      <category>Multipass</category>
      <category>ubuntu</category>
      <category>虚拟机</category>

      <content:encoded><![CDATA[## 什么是 Multipass

Multipass 是由 Canonical（Ubuntu 母公司）开发的一款轻量级虚拟机管理工具，可以在 Linux、macOS 和 Windows 上快速创建和管理 cloud 风格的 Ubuntu 虚拟机（称为「实例」）。它提供了一个简洁而强大的命令行界面（CLI），让你能够在几秒钟内获得一个 Ubuntu 命令行环境，或者在本地构建一个迷你云。

Multipass 适合以下场景：

- 快速获得一个 Ubuntu Shell 环境
- 本地开发与测试云部署方案
- 构建多实例或基于容器的云应用原型
- 在 Mac 或 Windows 上获得原生 Ubuntu 命令行
- 安全的沙盒环境，尝试新事物而不影响宿主机

---

## 一、安装 Multipass

### Linux

Multipass 在 Linux 上以 Snap 包形式发布。Ubuntu 系统默认已包含 snapd，直接运行：

```bash
sudo snap install multipass
```

安装开发版：

```bash
sudo snap install multipass --edge
```

安装完成后，确认当前用户属于 Multipass socket 的读写组：

```bash
ls -l /var/snap/multipass/common/multipass_socket
groups | grep sudo
```

> 系统要求：需要安装 snapd。Ubuntu 默认已包含，其他发行版请参考 snapd 安装文档。

### macOS

macOS 上默认使用 QEMU 后端（封装了 Apple 的 Hypervisor 框架）。

- 系统要求：macOS 13.3 Ventura 及以上
- 支持 M 系列芯片和 Intel 芯片

通过 Homebrew 安装：

```bash
brew install --cask multipass
```

### Windows

Windows 上支持 Hyper-V 和 VirtualBox 两种后端。

- Hyper-V 需要 Windows 10 Pro/Enterprise 1803 及以上版本
- 也可以使用 VirtualBox 作为虚拟化提供者

从 [Multipass 官网](https://multipass.run/) 下载安装包即可。

---

## 二、镜像管理

### 查看可用镜像

使用 `find` 命令列出所有可用的镜像：

```bash
multipass find
```

输出示例：

```
Image                       Aliases           Version          Description
core                        core16            20200818         Ubuntu Core 16
core18                                        20211124         Ubuntu Core 18
20.04                       focal             20240129.1       Ubuntu 20.04 LTS
22.04                       jammy,lts         20240126         Ubuntu 22.04 LTS
24.04                       noble             20240129         Ubuntu 24.04 LTS
```

强制刷新镜像列表：

```bash
multipass find --force-update
```

搜索特定镜像：

```bash
multipass find 22
```

### 镜像别名说明

| 别名 | 含义 |
|------|------|
| `default` | 该远程仓库的默认镜像 |
| `lts` | 最新的长期支持版本 |
| `devel` | 最新的开发版本（仅在 `daily:` 远程仓库中可用） |
| 版本号（如 `22.04`） | 特定版本 |
| 代号（如 `jammy`） | Ubuntu 系列代号 |
| 首字母（如 `j`） | 代号首字母缩写 |

也可以使用本地文件或 URL 中的镜像启动实例：

```bash
multipass launch file:///path/to/image.img
multipass launch https://example.com/image.img
```

---

## 三、创建实例

### 基本创建

最简单的方式 —— 直接运行：

```bash
multipass launch
```

这会创建一个使用最新 Ubuntu LTS 镜像的实例，自动分配一个随机名称，例如：

```
Launched: relishing-lionfish
```

### 指定镜像

按名称或别名启动特定版本：

```bash
multipass launch 22.04 --name dev-env
multipass launch noble --name noble-test
multipass launch lts --name my-lts
```

### 指定资源配置

通过 `--cpus`、`--memory`、`--disk` 自定义资源：

```bash
multipass launch --name my-ubuntu --cpus 2 --memory 2G --disk 20G
```

### 启动时挂载目录

使用 `--mount` 在创建时直接挂载宿主机目录：

```bash
multipass launch --mount /home/user/project my-ubuntu
```

### 使用 cloud-init 自定义

通过 `--cloud-init` 在首次启动时自动配置实例：

```bash
multipass launch --name web-server --cloud-init cloud-config.yaml
```

`cloud-config.yaml` 示例：

```yaml
#cloud-config
packages:
  - nginx
  - git
runcmd:
  - systemctl start nginx
  - echo "Hello from Multipass!" > /var/www/html/index.html
```

也可以直接使用 URL：

```bash
multipass launch --cloud-init https://example.com/cloud-init.yaml
```

---

## 四、实例操作

### 进入实例 Shell

```bash
multipass shell <实例名>
```

如果实例未运行，会自动启动。进入后显示标准的 Ubuntu 登录信息：

```
Welcome to Ubuntu 24.04.1 LTS (GNU/Linux 6.8.0-44-generic aarch64)
 ...
ubuntu@loving-duck:~$
```

退出 Shell 使用 `logout`、`exit` 或 `Ctrl-D`。

### 在实例中执行命令

使用 `exec` 在实例中运行命令，无需进入 Shell：

```bash
multipass exec my-ubuntu -- uname -r
multipass exec my-ubuntu -- lsb_release -a
```

> `--` 用于分隔 Multipass 选项和要执行的命令。如果命令需要参数，`--` 是必须的。

也可以指定工作目录：

```bash
multipass exec my-ubuntu --working-directory /home -- ls -a
```

支持管道操作：

```bash
multipass exec my-ubuntu -- lsb_release -a | grep ^Codename:
```

### 查看实例信息

```bash
multipass info <实例名>
```

输出示例：

```
Name:           my-ubuntu
State:          Running
Snapshots:      0
IPv4:           10.218.69.109
Release:        Ubuntu 22.04 LTS
Image hash:     e898c1c93b32 (Ubuntu 22.04 LTS)
CPU(s):         2
Load:           0.49, 0.70, 0.71
Disk usage:     849.4M out of 19.5G
Memory usage:   41.9M out of 1.9G
Mounts:         /home/user => Home
```

### 列出所有实例

```bash
multipass list
```

输出示例：

```
Name                    State             IPv4             Release
primary                 SUSPENDED         --               Ubuntu 22.04 LTS
my-ubuntu               RUNNING           10.218.69.109    Ubuntu 22.04 LTS
```

支持 JSON、YAML 或 CSV 格式输出：

```bash
multipass list --format yaml
multipass list --format json
```

### 启动和停止实例

```bash
# 启动实例
multipass start my-ubuntu

# 启动所有实例
multipass start --all

# 停止实例
multipass stop my-ubuntu

# 停止所有实例
multipass stop --all

# 延迟停止（指定分钟后）
multipass stop my-ubuntu --time 10
```

### 挂起实例

挂起会保存实例状态到内存，恢复速度更快：

```bash
multipass suspend my-ubuntu
```

### 重启实例

```bash
multipass restart my-ubuntu
```

---

## 五、Primary 实例

Multipass 有一个特殊的「Primary 实例」。运行以下命令会自动创建并进入该实例：

```bash
multipass shell
```

Primary 实例的特点：

- 不带参数执行 `shell`、`start`、`stop`、`restart`、`suspend` 命令时默认操作 Primary 实例
- 如果不存在会自动创建（使用最新 LTS 镜像和默认配置）
- 自动挂载宿主机的 `$HOME` 目录到实例内的 `Home` 文件夹
- 在 `list` 输出中始终排在第一位

也可以手动指定资源配置创建 Primary 实例：

```bash
multipass launch --name primary --cpus 4 lts
```

### 修改 Primary 实例

可以将任何现有实例设置为 Primary：

```bash
multipass set client.primary-name=my-ubuntu
```

取消自动挂载：

```bash
multipass umount primary
```

---

## 六、修改实例配置

实例的 CPU、内存、磁盘空间可以在创建后修改：

```bash
# 先停止实例
multipass stop my-ubuntu

# 修改资源配置
multipass set local.my-ubuntu.cpus=4
multipass set local.my-ubuntu.disk=60G
multipass set local.my-ubuntu.memory=7G

# 查看当前配置（无需停止实例）
multipass get local.my-ubuntu.cpus
```

> 注意：磁盘大小只能增加，不能缩小。如果磁盘已满，增加磁盘大小后可能需要手动扩展分区。

手动扩展分区的方法：

```bash
multipass shell my-ubuntu
sudo parted /dev/sda resizepart 1 100%
sudo resize2fs /dev/sda1
```

---

## 七、文件传输与目录挂载

### 文件传输（transfer）

使用 `transfer` 在宿主机和实例之间复制文件，无需挂载目录：

```bash
# 从宿主机复制到实例
multipass transfer local_file.txt my-ubuntu:.

# 从实例复制到宿主机
multipass transfer my-ubuntu:remote_file.txt .

# 递归复制目录
multipass transfer --recursive my-ubuntu:dir .

# 自动创建不存在的父目录
multipass transfer --parents local_file.txt my-ubuntu:non/existent/path/file.txt
```

### 目录挂载（mount）

挂载宿主机目录到实例中，实现实时文件同步：

```bash
multipass mount /home/user/project my-ubuntu:/home/ubuntu/project
```

也可以在 `launch` 时直接指定挂载：

```bash
multipass launch --mount /home/user/project my-ubuntu
```

指定用户/组 ID 映射：

```bash
multipass mount /host/path my-ubuntu:/instance/path --uid-map 1000:1000 --gid-map 1000:1000
```

### 挂载类型

Multipass 支持两种挂载类型：

| 类型 | 技术 | 特点 |
|------|------|------|
| Classic（默认） | SSHFS | 跨平台兼容性好，性能稍低 |
| Native | QEMU: 9P / Hyper-V: SMB/CIFS | 性能更好，兼容性受限 |

指定挂载类型：

```bash
multipass mount --type=native /host/path my-ubuntu:/instance/path
```

### 取消挂载

```bash
multipass umount my-ubuntu:/home/ubuntu/project
```

> 注意：Windows 上默认禁用挂载功能，需要通过 `multipass set local.privileged-mounts=true` 启用。

---

## 八、快照管理

快照可以保存实例的当前状态，方便随时回滚。快照会记录磁盘内容与大小、CPU 数量、内存大小和挂载信息。

### 创建快照

实例需要在 **Stopped** 状态下才能创建快照：

```bash
multipass stop my-ubuntu
multipass snapshot my-ubuntu
```

输出：

```
Snapshot taken: my-ubuntu.snapshot1
```

指定快照名称和备注：

```bash
multipass snapshot my-ubuntu --name before-update --comment "更新前的状态"
```

### 查看快照

```bash
# 列出所有快照
multipass list --snapshots

# 查看特定快照详情
multipass info my-ubuntu.snapshot1
```

输出示例：

```
Instance        Snapshot    Parent      Comment
my-ubuntu       snapshot1   --          --
my-ubuntu       snapshot3   snapshot1   Before restoring snapshot2
```

### 从快照恢复

```bash
multipass restore my-ubuntu.snapshot1
```

恢复时系统会询问是否先保存当前状态。使用 `--destructive` 跳过确认直接丢弃当前状态：

```bash
multipass restore my-ubuntu.snapshot1 --destructive
```

### 删除快照

```bash
multipass delete my-ubuntu.snapshot1
```

> 注意：快照采用分层存储，每个快照记录相对于父快照的变更。过长的快照链会影响性能。快照与原始镜像存储在同一介质中，不适合作为可靠的备份方案。

---

## 九、克隆实例

从 Multipass 1.15.0 开始支持实例克隆功能，可用于备份或创建相同配置的测试环境：

```bash
# 确保实例已停止
multipass stop my-ubuntu

# 克隆（自动生成名称）
multipass clone my-ubuntu

# 指定克隆名称
multipass clone my-ubuntu --name my-ubuntu-backup
```

克隆的实例是独立的副本，包含原始实例的所有配置、安装的软件和数据。

---

## 十、删除与恢复实例

### 删除（可恢复）

```bash
multipass delete my-ubuntu
```

删除后的实例进入「回收站」状态，可以恢复：

```bash
multipass recover my-ubuntu
```

批量删除：

```bash
multipass delete --all
```

### 永久删除

```bash
# 删除并立即清除
multipass delete --purge my-ubuntu

# 清除所有已删除的实例
multipass purge
```

> 注意：`purge` 命令不接受参数，它会永久清除所有标记为 Deleted 的实例。快照删除也是永久性的。

---

## 十一、网络配置

### 查看可用网络

```bash
multipass networks
```

输出示例：

```
Name            Type        Description
bridge0         bridge      Network bridge with en1, en2
en0             wifi        Wi-Fi (Wireless)
en1             ethernet    Ethernet device
```

### 启动时指定网络

```bash
# 使用桥接网络
multipass launch --name bridged-vm --network bridged

# 使用自定义网络
multipass launch --name custom-vm --network name=localbr,mode=manual,mac="52:54:00:4b:ab:cd"
```

### 给现有实例添加桥接网络

```bash
# 设置首选桥接网络
multipass set local.bridged-network=eth0

# 停止实例
multipass stop my-ubuntu

# 启用桥接
multipass set local.my-ubuntu.bridged=true

# 启动实例
multipass start my-ubuntu
```

### 配置静态 IP

可以为实例配置额外的静态 IP 地址，确保重启后 IP 不变：

```bash
# 1. 在宿主机创建网桥
nmcli connection add type bridge con-name localbr ifname localbr \
  ipv4.method manual ipv4.addresses 10.13.31.1/24

# 2. 启动实例并连接到网桥
multipass launch --name test1 --network name=localbr,mode=manual,mac="52:54:00:4b:ab:cd"

# 3. 在实例内配置静态 IP
multipass exec -n test1 -- sudo bash -c 'cat << EOF > /etc/netplan/10-custom.yaml
network:
  version: 2
  ethernets:
    extra0:
      dhcp4: no
      match:
        macaddress: "52:54:00:4b:ab:cd"
      addresses: [10.13.31.13/24]
EOF'

# 4. 应用配置
multipass exec -n test1 -- sudo netplan apply

# 5. 验证
multipass info test1
ping 10.13.31.13
```

---

## 十二、命令别名

Multipass 支持为实例内的命令创建别名，方便从宿主机直接调用：

### 创建别名

```bash
multipass alias my-ubuntu:ls ls-vm
```

### 列出所有别名

```bash
multipass aliases
```

输出示例：

```
Alias    Instance     Command    Context      Working directory
ls-vm    my-ubuntu    ls         default      map
```

### 使用别名

```bash
ls-vm
```

### 别名上下文

可以创建不同的上下文来管理别名：

```bash
multipass prefer secondary
multipass alias another-vm:ls ls-vm
```

### 删除别名

```bash
multipass unalias ls-vm
```

---

## 十三、常用设置

### 查看所有配置键

```bash
multipass get --keys
```

### 查看特定配置

```bash
multipass get local.driver
```

### 修改配置

```bash
# 关闭 GUI 自动启动
multipass set client.gui.autostart=false

# 设置默认驱动
multipass set local.driver=qemu

# 设置默认 Primary 实例名称
multipass set client.primary-name=my-default
```

### 配置日志级别

```bash
multipass set local.logging.level=debug
```

---

## 十四、实例状态说明

| 状态 | 说明 |
|------|------|
| Running | 实例正在运行，可以正常使用 |
| Stopped | 实例已停止，不占用资源，可随时启动 |
| Deleted | 实例已标记为删除，可恢复或永久清除 |
| Starting | 实例正在启动和初始化中 |
| Restarting | 实例正在重启 |
| Delayed shutdown | 实例收到关机信号，延迟关机中 |
| Suspending | 实例正在挂起中 |
| Suspended | 实例已挂起，状态和内存已保存 |
| Unknown | 无法确定实例状态 |

---

## 十五、命令速查表

| 命令 | 说明 |
|------|------|
| `multipass launch` | 创建并启动实例 |
| `multipass list` | 列出所有实例 |
| `multipass list --snapshots` | 列出所有快照 |
| `multipass info <name>` | 查看实例详情 |
| `multipass shell <name>` | 进入实例 Shell |
| `multipass exec <name> -- <cmd>` | 在实例中执行命令 |
| `multipass start <name>` | 启动实例 |
| `multipass stop <name>` | 停止实例 |
| `multipass suspend <name>` | 挂起实例 |
| `multipass restart <name>` | 重启实例 |
| `multipass delete <name>` | 删除实例 |
| `multipass recover <name>` | 恢复已删除的实例 |
| `multipass purge` | 永久清除已删除的实例 |
| `multipass find` | 查看可用镜像 |
| `multipass mount <src> <name>:<dst>` | 挂载目录 |
| `multipass umount <name>:<dst>` | 取消挂载 |
| `multipass transfer <src> <dst>` | 传输文件 |
| `multipass snapshot <name>` | 创建快照 |
| `multipass restore <name>.<snap>` | 恢复快照 |
| `multipass clone <name>` | 克隆实例 |
| `multipass networks` | 查看可用网络 |
| `multipass alias <name>:<cmd> <alias>` | 创建命令别名 |
| `multipass aliases` | 列出所有别名 |
| `multipass unalias <alias>` | 删除命令别名 |
| `multipass get <key>` | 查看配置 |
| `multipass set <key>=<value>` | 修改配置 |

---

## 总结

Multipass 是本地开发和测试 Ubuntu 环境的最佳工具之一。它的核心优势在于：

1. 极速启动 —— 几秒钟获得一个全新的 Ubuntu 环境
2. 跨平台 —— Linux、macOS、Windows 全覆盖
3. 功能完整 —— 从基础的实例管理到高级的网络配置、快照、克隆，一应俱全
4. cloud-init 支持 —— 自动化实例初始化
5. 轻量高效 —— 默认仅需 1GB 内存、5GB 磁盘

无论你是需要快速测试一个 Ubuntu 命令、搭建本地开发环境，还是构建一个多实例的迷你云，Multipass 都能轻松胜任。

> 参考文档：[Multipass 官方文档](https://documentation.ubuntu.com/multipass/latest/)]]></content:encoded>
    </item>
    <item>
      <title>OpenClaw 全方位指南</title>
      <link>https://atom.inte8.top/blog/OpenClaw全方位指南/</link>
      <guid>https://atom.inte8.top/blog/OpenClaw全方位指南/</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <description>OpenClaw 全方位指南</description>
      <category>前沿技术</category>
      <category>OpenClaw</category>
      <category>AI助手</category>
      <category>开源</category>

      <content:encoded><![CDATA[# OpenClaw 全方位指南 — 你的个人 AI 助手

## 项目简介

**OpenClaw** 是一款开源的个人 AI 助手，GitHub 星标超过 **36.6 万**，由 OpenAI、GitHub、NVIDIA、Vercel 等顶级公司赞助。它运行在你自己的设备上，通过你已经在用的聊天软件与你交互，支持语音唤醒和实时对话，甚至能控制可视化画布（Canvas）。

官网：[openclaw.ai](https://openclaw.ai)
文档：[docs.openclaw.ai](https://docs.openclaw.ai)
GitHub：[github.com/openclaw/openclaw](https://github.com/openclaw/openclaw)
技能市场：[clawhub.ai](https://clawhub.ai)

口号：**EXFOLIATE! EXFOLIATE!** 🦞

---

## 一、核心特性

| 特性 | 说明 |
|------|------|
| **本地优先网关** | 单一控制平面管理会话、频道、工具和事件 |
| **25+ 聊天频道** | WhatsApp、Telegram、Slack、Discord、微信、QQ、飞书等 |
| **多智能体路由** | 按频道/账号/对端路由到隔离的 Agent |
| **语音唤醒** | macOS/iOS 唤醒词，Android 持续语音（ElevenLabs + 系统 TTS） |
| **实时画布** | Agent 驱动的可视化工作区（Canvas + A2UI） |
| **一流工具** | 浏览器、画布、节点、Cron 定时任务、会话管理等 |
| **配套 App** | macOS 菜单栏应用 + iOS/Android 节点 |
| **引导式设置** | `openclaw onboard` 一键配置 |

---

## 二、快速安装

### 环境要求

- **Node.js 24**（推荐）或 Node 22.14+
- 一个模型提供商的 API Key（Anthropic / OpenAI / Google 等）

### 一键安装

**macOS / Linux：**

```bash
curl -fsSL https://openclaw.ai/install.sh | bash
```

**Windows（PowerShell）：**

```powershell
iwr -useb https://openclaw.ai/install.ps1 | iex
```

**npm 全局安装：**

```bash
npm install -g openclaw@latest
```

### 引导配置

```bash
openclaw onboard --install-daemon
```

向导会引导你完成：
1. 选择模型提供商并设置 API Key
2. 配置网关参数
3. 安装系统守护进程（launchd / systemd）
4. 初始化工作区

### 验证运行

```bash
openclaw gateway status   # 查看网关状态
openclaw dashboard        # 打开控制面板
```

网关默认监听 `127.0.0.1:18789`。

---

## 三、架构设计

OpenClaw 采用 **WebSocket 网关架构**，核心组件：

```
┌─────────────────────────────────────────┐
│            Gateway (守护进程)             │
│   管理 WhatsApp/Telegram/Slack/Discord   │
│   WebSocket API (JSON)                   │
│   Canvas / A2UI 服务                     │
│   Cron 调度器                            │
└────────┬──────────┬──────────┬───────────┘
         │          │          │
    ┌────┴───┐ ┌───┴────┐ ┌──┴───────┐
    │ 客户端  │ │  节点   │ │ WebChat  │
    │ CLI    │ │ iOS     │ │          │
    │ macOS  │ │ Android │ │          │
    │ Web UI │ │ Headless│ │          │
    └────────┘ └─────────┘ └──────────┘
```

- **Gateway**：单一长驻进程，拥有所有消息面。暴露类型化 WebSocket API。
- **客户端**（CLI / macOS App / Web UI）：通过 WS 连接网关，发送请求并订阅事件。
- **节点**（iOS / Android / Headless）：通过 WS 以 `role: node` 连接，暴露画布、摄像头、屏幕等设备能力。

### 通信协议

- 传输层：WebSocket，文本帧 JSON 载荷
- 首帧必须是 `connect`
- 请求/响应模式：`{type:"req", id, method, params}` → `{type:"res", id, ok, payload|error}`
- 事件推送：`{type:"event", event, payload, seq}`

---

## 四、聊天频道

OpenClaw 支持 **25+ 消息平台**，全部通过网关统一管理：

| 平台 | 协议 | 备注 |
|------|------|------|
| WhatsApp | Baileys | QR 码登录 |
| Telegram | grammY Bot API | 支持群组 |
| Discord | Bot API + Gateway | 支持 DM/频道/服务器 |
| Slack | Bolt SDK | 工作区应用 |
| Signal | signal-cli | 隐私优先 |
| 微信 | iLink Bot | 二维码登录，仅私聊 |
| QQ | QQ Bot API | 私聊+群聊+富媒体 |
| 飞书 | WebSocket | 内置插件 |
| iMessage | BlueBubbles | 推荐，全功能支持 |
| Matrix | 内置插件 | 去中心化 |
| Google Chat | HTTP Webhook | 企业支持 |
| Microsoft Teams | Bot Framework | 企业支持 |
| LINE | Messaging API | 内置插件 |
| IRC | 经典 IRC | 频道 + DM |
| 以及 Nostr、Twitch、Synology Chat、Nextcloud Talk 等... |

### DM 安全机制

默认启用 **DM 配对（Pairing）**：未知发送者收到配对码，需要手动审批：

```bash
openclaw pairing approve <channel> <code>
```

---

## 五、Agent 运行时

### 工作区结构

Agent 使用单一工作区目录（`~/.openclaw/workspace`）作为唯一工作目录。核心引导文件：

| 文件 | 作用 |
|------|------|
| `AGENTS.md` | 操作指令 + 记忆 |
| `SOUL.md` | 人格、边界、语气 |
| `TOOLS.md` | 用户维护的工具使用说明 |
| `BOOTSTRAP.md` | 首次运行仪式（完成后可删除） |
| `IDENTITY.md` | Agent 名称/风格/表情 |
| `USER.md` | 用户档案 + 称呼偏好 |

新会话启动时，这些文件自动注入 Agent 上下文。

### 内置工具

| 工具 | 功能 |
|------|------|
| `exec` / `process` | 执行 Shell 命令，管理后台进程 |
| `code_execution` | 沙箱远程 Python 分析 |
| `browser` | 控制 Chromium 浏览器 |
| `web_search` / `web_fetch` | 网页搜索和内容抓取 |
| `message` | 发送消息到任意频道 |
| `canvas` | Agent 驱动的可视化画布 |
| `sessions_*` | 会话列表/历史/发送 |
| `cron` | 定时任务管理 |

### 工具、技能与插件三层体系

1. **Tools**：Agent 调用的类型化函数（exec、browser、web_search 等）
2. **Skills**：Markdown 文件（SKILL.md），注入系统提示词，教 Agent 如何使用工具
3. **Plugins**：打包一切（频道、模型、工具、技能、语音等），可发布到 npm

---

## 六、技能系统（Skills）

技能使用 [AgentSkills](https://agentskills.io) 兼容格式，每个技能是一个包含 `SKILL.md` 的目录。

### 加载优先级（从高到低）

| 优先级 | 来源 | 路径 |
|--------|------|------|
| 1 | 工作区技能 | `<workspace>/skills` |
| 2 | 项目 Agent 技能 | `<workspace>/.agents/skills` |
| 3 | 个人 Agent 技能 | `~/.agents/skills` |
| 4 | 托管/本地技能 | `~/.openclaw/skills` |
| 5 | 内置技能 | 随安装附带 |
| 6 | 额外目录 | `skills.load.extraDirs` |

同名技能以高优先级为准。

### 按需配置

```json5
{
  agents: {
    defaults: {
      skills: ["github", "weather"],
    },
    list: [
      { id: "writer" },                    // 继承默认技能
      { id: "docs", skills: ["docs-search"] }, // 替换为指定技能
      { id: "locked-down", skills: [] },    // 无技能
    ],
  },
}
```

技能市场 [ClawHub](https://clawhub.ai) 提供了 5400+ 已分类的社区技能。

---

## 七、会话管理

消息按来源路由到不同会话：

| 来源 | 会话策略 |
|------|----------|
| 私聊（DM） | 默认共享一个会话 |
| 群聊 | 按群隔离 |
| Cron 任务 | 每次运行独立会话 |
| Webhook | 按 Hook 隔离 |

### DM 隔离

多用户场景下必须启用隔离，防止消息串台：

```json5
{
  session: {
    dmScope: "per-channel-peer",  // 按频道+发送者隔离
  },
}
```

可选值：`main`（默认共享）| `per-peer` | `per-channel-peer`（推荐）| `per-account-channel-peer`

### 会话生命周期

- **每日重置**：默认凌晨 4:00 自动开启新会话
- **空闲重置**：设置 `session.reset.idleMinutes` 超时后新建
- **手动重置**：聊天中输入 `/new` 或 `/reset`

---

## 八、定时任务（Cron）

Cron 是网关内置的调度器，持久化存储任务定义，定时唤醒 Agent。

### 快速上手

```bash
# 一次性提醒
openclaw cron add \
  --name "提醒" \
  --at "2026-05-01T09:00:00+08:00" \
  --session main \
  --system-event "提醒：检查项目进度" \
  --wake now \
  --delete-after-run

# 查看任务
openclaw cron list

# 查看运行历史
openclaw cron runs --id <job-id>
```

### 关键特性

- 任务持久化到 `~/.openclaw/cron/jobs.json`，重启不丢失
- 一次性任务成功后自动删除
- 所有 Cron 执行创建后台任务记录
- 支持将输出发送到聊天频道或 Webhook
- 隔离运行时自动清理浏览器标签和后台进程

---

## 九、节点系统（Nodes）

节点是连接到网关的配套设备（macOS/iOS/Android/Headless），通过 WebSocket 暴露设备能力。

### 设备配对

```bash
# 查看配对请求
openclaw devices list

# 审批
openclaw devices approve <requestId>

# 拒绝
openclaw devices reject <requestId>

# 查看节点状态
openclaw nodes status
```

### 节点能力

| 能力 | 说明 |
|------|------|
| `canvas.*` | Agent 驱动的可视化画布 |
| `camera.*` | 拍照获取视觉上下文 |
| `screen.record` | 屏幕录制 |
| `device.*` | 设备信息与控制 |
| `notifications.*` | 通知管理 |
| `system.*` | 远程命令执行 |
| `location.get` | 获取地理位置 |

### 远程节点

网关运行在一台机器上，但命令可以在另一台机器上执行。网关将 `exec` 调用转发到远程节点主机。

---

## 十、安全模型

### 核心原则

- **默认安全**：工具在宿主机上为 main 会话运行，Agent 拥有完全访问权限（因为是个人使用）
- **群组/频道安全**：设置 `agents.defaults.sandbox.mode: "non-main"` 让非 main 会话在沙箱中运行
- **DM 配对**：未知发送者必须通过配对码验证

### 沙箱机制

默认沙箱后端为 Docker，也支持 SSH 和 OpenShell：

```json5
{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",  // 非 main 会话走沙箱
      },
    },
  },
}
```

典型沙箱策略：允许 bash、read、write、edit；拒绝 browser、canvas、cron、gateway。

### 安全审计

```bash
openclaw doctor          # 检查风险配置
openclaw security audit  # 安全审计
```

---

## 十一、配置指南

配置文件位于 `~/.openclaw/openclaw.json`，使用 **JSON5** 格式（支持注释和尾逗号）。

### 最小配置

```json5
{
  agents: { defaults: { workspace: "~/.openclaw/workspace" } },
  channels: { whatsapp: { allowFrom: ["+86188****1234"] } },
}
```

### 配置方式

| 方式 | 命令 |
|------|------|
| 交互式向导 | `openclaw onboard` 或 `openclaw configure` |
| CLI 单行 | `openclaw config set agents.defaults.heartbeat.every "2h"` |
| 控制面板 | 打开 `http://127.0.0.1:18789` 使用 Config 标签页 |
| 直接编辑 | 编辑 `~/.openclaw/openclaw.json`，网关自动热加载 |

### 模型配置

```json5
{
  agents: {
    defaults: {
      model: "anthropic/claude-sonnet-4",
      // 或使用模型故障转移
      models: {
        primary: "anthropic/claude-sonnet-4",
        fallback: ["openai/gpt-4o", "google/gemini-2.5-pro"],
      },
    },
  },
}
```

---

## 十二、Docker 部署

Docker 部署是可选方案，适合需要容器化隔离或无本地安装的场景。

### 前提

- Docker Desktop / Engine + Docker Compose v2
- 至少 2GB RAM
- 足够磁盘空间

### 部署步骤

```bash
# 克隆仓库
git clone https://github.com/openclaw/openclaw.git
cd openclaw

# 构建并启动（含引导配置）
./scripts/docker/setup.sh

# 或使用预构建镜像
export OPENCLAW_IMAGE="ghcr.io/openclaw/openclaw:latest"
./scripts/docker/setup.sh
```

预构建镜像发布在 [GitHub Container Registry](https://github.com/openclaw/openclaw/pkgs/container/openclaw)，常用标签：`main`、`latest`、版本号。

### 配置频道

```bash
# WhatsApp（QR 码）
docker compose run --rm openclaw-cli channels login

# Telegram
docker compose run --rm openclaw-cli channels add --channel telegram --token "<token>"

# Discord
docker compose run --rm openclaw-cli channels add --channel discord --token "<token>"
```

---

## 十三、聊天命令速查

| 命令 | 说明 |
|------|------|
| `/status` | 查看当前状态 |
| `/new` | 新建会话 |
| `/reset` | 重置会话 |
| `/compact` | 压缩上下文 |
| `/think <level>` | 设置思考深度 |
| `/verbose on/off` | 开关详细输出 |
| `/trace on/off` | 开关追踪 |
| `/usage off/tokens/full` | 用量显示 |
| `/restart` | 重启 Agent |
| `/activation mention/always` | 激活模式 |

---

## 十四、与同类项目对比

| 维度 | OpenClaw | Hermes Agent | ChatGPT |
|------|----------|-------------|---------|
| 部署方式 | 本地/Docker | Docker 容器 | 云端 |
| 消息频道 | 25+ | 10+ | 网页/App |
| 开源 | MIT | 开源 | 闭源 |
| 技能生态 | ClawHub 5400+ | Skills 系统 | GPTs 商店 |
| 语音 | 唤醒词+持续对话 | TTS | 语音模式 |
| 沙箱 | Docker/SSH/OpenShell | Docker | OpenAI 托管 |
| 配置格式 | JSON5 | YAML | 网页设置 |

---

## 总结

OpenClaw 是目前最全面的**本地优先个人 AI 助手**方案：

1. **真正的全平台覆盖**：25+ 消息频道，包含微信、QQ、飞书等国内平台
2. **本地部署，数据自主**：所有数据在本地，不依赖云端
3. **强大的工具生态**：内置浏览器、代码执行、定时任务，加上 5400+ 社区技能
4. **安全可控**：DM 配对、沙箱隔离、安全审计三重保障
5. **多设备协作**：macOS/iOS/Android 节点联动，画布、摄像头、屏幕共享
6. **灵活部署**：支持裸机、Docker、Nix 多种方式

如果你需要一个始终在线、能在任何聊天软件里回复你、还能帮你执行任务的 AI 助手，OpenClaw 是目前最值得尝试的选择。

---

> 参考资料：
> - [OpenClaw GitHub](https://github.com/openclaw/openclaw)
> - [OpenClaw 官方文档](https://docs.openclaw.ai)
> - [ClawHub 技能市场](https://clawhub.ai)
> - [Awesome OpenClaw Skills](https://github.com/VoltAgent/awesome-openclaw-skills)]]></content:encoded>
    </item>
    <item>
      <title>RouterOS v7 入门到精通学习笔记</title>
      <link>https://atom.inte8.top/blog/RouterOS-v7入门到精通学习笔记/</link>
      <guid>https://atom.inte8.top/blog/RouterOS-v7入门到精通学习笔记/</guid>
      <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
      <description>RouterOS v7 入门到精通学习笔记</description>
      <category>网络路由</category>
      <category>RouterOS</category>
      <category>软路由</category>
      <category>MikroTik</category>

      <content:encoded><![CDATA[本文整理自余松老师的《RouterOS 入门到精通 v7.4e》教程（共 192 页），系统梳理了 RouterOS v7 的核心新功能和配置要点。教程官网：[www.irouteros.com](http://www.irouteros.com)

---

## 一、RouterOS v7 升级概览

RouterOS v7 相比 v6 做了重大改动，主要体现在路由性能和配置架构上，同时引入了多项新功能：

| 新功能 | 说明 |
|--------|------|
| **WireGuard** | 现代 VPN 协议，轻量高速 |
| **ZeroTier** | 软件定义的虚拟局域网，零配置组网 |
| **L2TPv3** | 二层以太网桥接隧道 |
| **Docker/Container** | 在路由器上运行容器化应用 |
| **User Manager v5** | RADIUS 用户管理，支持 802.1x |
| **GPIO** | IoT 设备控制（继电器、传感器） |
| **ROSE 存储** | RAID、iSCSI、NFS、SMB 企业存储 |
| **VXLAN** | 虚拟扩展局域网 |
| **Device-Mode** | 设备功能安全管理 |

---

## 二、路由（第一章）

### 2.1 路由协议多任务支持

v7 的 BGP 支持 Sub-Tasks 多任务处理，每条 BGP 连接独立运行，提升大型网络的收敛速度。

### 2.2 路由表（Routing Tables）

v7 重新设计了路由表结构，通过 `/routing table` 管理，支持更灵活的策略路由。

查看路由命令：

```routeros
/ip route print
/routing route print
```

### 2.3 策略路由配置

v7 策略路由通过 Routing Tables + Routing Rules 配合实现：

```routeros
# 创建自定义路由表
/routing table add name=isp2 fib

# 添加路由规则
/routing rule add src-address=192.168.1.0/24 table=isp2

# 在路由表中添加网关
/ip route add gateway=10.0.0.1 routing-table=isp2
```

### 2.4 PCC 负载均衡

PCC（Per-Connection Classifier）是常用的多线负载均衡方案，v7 配置有改动，官方提供了新的配置模板。

### 2.5 OSPF 配置

v7 的 OSPF 配置更规范：

```routeros
# 启用 OSPF 实例
/routing ospf instance add name=ospf1

# 定义区域
/routing ospf area add instance=ospf1 name=backbone

# 添加接口
/routing ospf interface-template add area=backbone interfaces=ether1
```

支持通过 PPTP、WireGuard 等隧道建立 OSPF 邻居关系，实现多路径等价路由（ECMP）。

### 2.6 BGP 配置

v7 的 BGP 做了重大改进：

```routeros
# 建立 BGP 连接
/routing bgp connection add name=peer1 remote.address=10.0.0.1 remote.as=65001
```

支持 CPU 亲和参数，可将 BGP 任务绑定到特定 CPU 核心运行。路由过滤使用新的 Routing Filter 语法。

---

## 三、WireGuard VPN（第二章）

WireGuard 是 v7 最亮眼的新功能之一，配置简洁，性能优异。

### 3.1 基本配置

```routeros
# 添加 WireGuard 接口
/interface wireguard add name=wg1 listen-port=13231 private-key="xxx"

# 添加对端
/interface wireguard peers add interface=wg1 public-key="yyy" \
  allowed-address=10.0.0.2/32 endpoint-address=1.2.3.4 endpoint-port=13231
```

### 3.2 防火墙配置

WireGuard 需要放行 UDP 端口和转发流量：

```routeros
/ip firewall filter add chain=input protocol=udp dst-port=13231 action=accept
/ip firewall filter add chain=forward in-interface=wg1 action=accept
```

### 3.3 Windows 客户端连接

在 Windows 上安装 WireGuard 客户端，导入配置文件即可连接 RouterOS 的 WireGuard 服务。

### 3.4 基于 WireGuard 的 EoIP 隧道

通过 WireGuard 建立 IP 连通性后，再在其上运行 EoIP 隧道，实现二层桥接：

```routeros
# 创建 EoIP 隧道，对端使用 WireGuard 隧道 IP
/interface eoip add name=eoip1 remote-address=10.0.0.2 tunnel-id=100

# 将 EoIP 和本地网口加入同一个 bridge
/interface bridge add name=bridge1
/interface bridge port add bridge=bridge1 interface=eoip1
/interface bridge port add bridge=bridge1 interface=ether2
```

### 3.5 与 Ubuntu 建立 WireGuard

RouterOS 和 Linux（Ubuntu 20.04+）之间建立 WireGuard 隧道，实现异地网络互联。

### 3.6 WireGuard 多节点组网

多台 RouterOS 通过 WireGuard 互联，结合 OSPF 或 BGP 动态路由实现全网自动路由学习：

- **OSPF 方案**：适合中小型网络，配置简单
- **BGP 方案**：适合大规模网络，灵活性高

---

## 四、ZeroTier（第三章）

ZeroTier 是一个零配置的虚拟网络方案，RouterOS v7 原生支持。

### 使用建议

- 本地网络与 ZeroTier 网络使用不同网段，避免冲突
- RouterOS 上配置 NAT 转发，让 ZeroTier 客户端访问本地网络

```routeros
# 启用 ZeroTier
/zerotier enable

# 加入网络
/zerotier join network=xxxxxxxxxx
```

---

## 五、Container / Docker（第四章）

RouterOS v7 支持在路由器上运行 Docker 容器，扩展功能无限可能。

### 5.1 启用 Container 模式

```routeros
# 需要先通过 device-mode 启用 container
/system/device-mode/update container=yes
# 物理重启生效
```

### 5.2 创建网络

**路由模式**：容器使用独立网段，通过 NAT 访问外部网络。

**桥接模式**：容器直接加入本地 bridge，获取同网段 IP。

```routeros
# 创建 veth 接口
/interface veth add name=veth1 address=172.17.0.2/24 gateway=172.17.0.1

# 桥接模式：将 veth 加入 bridge
/interface bridge port add bridge=bridge1 interface=veth1
```

### 5.3 镜像管理

支持三种方式导入镜像：
1. 从外部仓库拉取（如 Docker Hub）
2. 从 PC 导入 tar 镜像文件
3. 在 PC 上用 docker build 创建镜像后上传

### 5.4 实战案例

教程演示了在 RouterOS 上安装 **nginx** 和 **DNSMasq** 等常用服务。

---

## 六、IoT / GPIO（第五章）

支持 GPIO 引脚控制，可连接传感器和继电器：

- **analog**：模拟信号读取（如温度传感器）
- **digital**：数字信号输入输出
- **继电器控制**：远程开关设备
- **信号监测**：监测输入信号变化

---

## 七、User Manager v5（第六章）

RouterOS 内置的 RADIUS 用户管理系统，适用于：

- PPPoE 宽带计费
- HotSpot 认证
- WiFi 802.1x EAP 认证
- VPN 用户管理

### WiFi 802.1x EAP 认证配置要点

1. 签发证书（CA + Server 证书）
2. 配置 RADIUS 服务器
3. 配置 User Manager 添加用户
4. 在 AP 上配置 EAP 认证
5. Windows 客户端配置 PEAP 认证

---

## 八、证书管理（第七章）

### 8.1 自签名证书

```routeros
# 创建证书模板
/certificate add name=ca-template common-name="MyCA" key-size=2048 \
  days-valid=3650 key-usage=crl-sign,key-cert-sign

# 签发 CA
/certificate sign ca-template name=ca

# 签发服务器证书
/certificate add name=server-template common-name="server" key-size=2048
/certificate sign server-template ca=ca name=server
```

### 8.2 Let's Encrypt

RouterOS 支持 ACME 协议自动申请和续期 Let's Encrypt 证书。

### 8.3 SSTP VPN 证书

详细演示了生成 SSTP 服务端证书、配置 SSTP Server、导出证书到 Windows 客户端的完整流程。

---

## 九、Dot1x 以太网认证（第八章）

RouterOS v7 支持 802.1x 以太网端口认证：

- **客户端模式**：对接上游交换机认证
- **服务器模式**：对下游设备进行认证
- **RADIUS 联动**：配合 User Manager 或外部 RADIUS
- **动态 VLAN 分配**：根据认证结果分配不同 VLAN

### 组网实例

教程展示了 RB5009 + CRS326 交换机 + hAP 客户端的完整 802.1x 组网配置。

---

## 十、VXLAN（第九章）

VXLAN 用于数据中心和跨地域二层网络扩展：

```routeros
# 创建 VXLAN 接口
/interface vxlan add name=vxlan1 vni=100 port=4789

# 配置转发表
/interface vxlan vtep add interface=vxlan1 remote-ip=10.0.0.2

# 加入 bridge
/interface bridge port add bridge=bridge1 interface=vxlan1
```

---

## 十一、L2TPv3（第十章）

L2TPv3 可建立二层以太网桥接隧道，与 EoIP、VxLAN 功能类似但基于 L2TP 协议：

```routeros
# Server 端启用 L2TP
/interface l2tp-server/server set enabled=yes

# 创建 L2TP 以太网接口
/interface l2tp-eth add name=l2tp-ether1 circuit-id=100

# Client 端连接
/interface l2tp-eth add name=l2tp-ether1 connect-to=192.168.88.1 circuit-id=100

# 两端分别加入 bridge
/interface bridge port add bridge=bridge1 interface=l2tp-ether1
/interface bridge port add bridge=bridge1 interface=ether2
```

> 与 EoIP 不同的是，L2TPv3 只需一端有公网 IP 即可建立。

---

## 十二、Branding 定制（第十一章）

通过 MikroTik 官网的 Branding Maker 工具定制路由器外观：

- **ASCII Logo**：命令行登录时显示的品牌标志
- **默认页面**：自定义 Web 登录页 HTML
- **LCD Logo**：设备液晶屏显示的 Logo（160x72px）
- **默认配置**：重置后自动加载的初始配置脚本

生成 `.dpk` 文件，上传到 RouterOS 重启生效。

---

## 十三、Device-Mode 安全（第十二章）

Device-Mode 控制设备功能开关，有 **enterprise**（默认）和 **home** 两种模式。

```routeros
# 查看当前模式
/system/device-mode/print

# 切换到 home 模式（需物理重启确认）
/system/device-mode/update mode=home

# 单独启用/禁用功能
/system/device-mode/update container=yes    # 启用容器
/system/device-mode/update sniffer=no       # 禁用抓包
```

> enterprise 模式默认允许所有功能（除 container）；home 模式禁用 scheduler、proxy、hotspot 等功能。

### Flagged 安全机制

系统启动时自动检测配置篡改。如果 flagged=yes，会限制敏感功能（bandwidth-test、sniffer、scheduler 等），需物理确认才能解除。

---

## 十四、ROSE 存储功能（第十三章）

ROSE 扩展包为企业数据中心提供存储能力，需 RouterOS v7.8beta2+ 并单独安装 `rose-storage` 功能包。

### 14.1 RAID

支持 RAID 0/1/4/5/6/10，最多 10 盘：

```routeros
/disk add type=raid raid-type=6 raid-device-count=10 slot=raid1
/disk set pcie1-nvme1 raid-master=raid1 raid-role=0
```

### 14.2 网络存储协议

| 协议 | 用途 | 模式 |
|------|------|------|
| **iSCSI** | IP 网络块存储 | Target + Initiator |
| **NFS v4** | Linux 文件共享 | Server + Client |
| **SMB 2.1/3.0/3.1.1** | Windows 文件共享 | Server + Client |
| **NVMe over TCP** | 高性能网络存储 | Target + Initiator |

### 14.3 其他存储功能

- **RAMdisk**：将内存虚拟为磁盘，重启丢失
- **数据加密**：支持 SED（自加密驱动器）和 dm-crypt
- **文件同步**：rsync 方式在多台 RouterOS 间同步文件

---

## 十五、VPS 隧道应用（应用案例）

### 15.1 弹性 IP 通过 Proxy-ARP 分配

VPS 获取弹性公网 IP 后，通过 PPTP/L2TP 隧道分配给远端 PC：

1. 创建 PPP Profile 和账号
2. 将账号的 remote-address 设为弹性 IP 对应的内网地址
3. 设置 ether1 的 ARP 模式为 proxy-arp

### 15.2 EoIP 二层隧道

VPS 与远端路由器通过 EoIP 隧道建立二层桥接，远端设备直接获取 VPS 公网 IP：

1. 两端创建 bridge
2. 建立 EoIP 隧道（两端需公网 IP）
3. 将 ether 和 eoip 隧道加入同一个 bridge

> 如果远端没有公网 IP，可先建 WireGuard 隧道，再在其上运行 EoIP。

---

## 总结

RouterOS v7 是一次重大升级，核心变化：

1. **路由架构重构**：Routing Tables + Rules 更灵活
2. **WireGuard 原生支持**：VPN 配置更简洁高效
3. **容器化能力**：路由器上跑 Docker，扩展无限
4. **企业存储**：RAID/iSCSI/NFS/SMB 一应俱全
5. **安全增强**：Device-Mode + Flagged 双重保护
6. **网络虚拟化**：VXLAN、L2TPv3、ZeroTier 多方案

---

> 参考资料：《RouterOS 入门到精通 v7.4e》- 余松 (www.irouteros.com)
> 
> MikroTik 官方文档：[help.mikrotik.com](https://help.mikrotik.com)]]></content:encoded>
    </item>
    <item>
      <title>AI 大模型最新进展盘点</title>
      <link>https://atom.inte8.top/blog/AI大模型最新进展盘点/</link>
      <guid>https://atom.inte8.top/blog/AI大模型最新进展盘点/</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description>AI 大模型最新进展盘点</description>
      <category>前沿技术</category>
      <category>AI</category>
      <category>大模型</category>
      <category>GPT</category>

      <content:encoded><![CDATA[> **2026-09 修订说明**：本文最早写于 2026-04-29，里面很多"最新"已经过时。本次重写补到 2026 年中状态。下次大版本发布再做更新。

## 前言

人工智能领域在近两年迎来爆发式增长，大语言模型（LLM）技术日新月异。本文盘点截至 2026 年中的主流模型与趋势，重点是**事实**（厂商官方发布、版本号、定价）——不堆 benchmark 数字（那些每月都在变）。

## 闭源旗舰：三家格局稳定

### OpenAI GPT 系列

截至 2026 年中，OpenAI 的旗舰已经迭代到 **GPT-5.5**（官方页面 `openai.com/index/introducing-gpt-5-5/`）。GPT-5.5 Pro 同步发布，主打更强的工具调用与长程推理。

历史节点：
- GPT-4 / GPT-4V（2023）
- GPT-4o / o1 / o3（2024-2025）
- GPT-5（2025-08）
- GPT-5.1 / 5.2 / 5.4 / 5.5（2026 年逐版本迭代）

### Anthropic Claude 系列

2026 年 6 月 9 日，Anthropic 发布了 **Claude Fable 5**——这是 Claude 第一个定位"高于 Opus"的 Mythos 系列顶级模型，1M 上下文 + 128K 输出 + `$10/$50` 每百万 token 定价。

同期可用的：
- **Claude Opus 4.8**（2026-04 起，Opus 系列旗舰）
- **Claude Sonnet 4.6**（2026-02，主力推荐模型）
- **Claude Haiku 4.5**（2025-10，速度/成本档）

2026 年 6 月 15 日：Claude 4.0 系列正式退役。

### Google Gemini 系列

- **Gemini 3.1 Pro**：当前旗舰，主打 ARC-AGI-2 类推理任务（预览版）
- **Gemini 2.5 Pro**：含 Google Search 实时接入
- **Gemini 2.5 Flash**：速度/成本最优（232 tok/s，`$0.30 / $2.50` 每百万 token）

## 开源生态：性能逼近闭源

2026 年的开源模型已经能在多个 benchmark 上逼近甚至超过部分闭源旗舰。代表项目：

### DeepSeek 系列

- **DeepSeek V3**：MIT 协议可自部署，API `$0.27 / M`——成本几乎地板价
- **DeepSeek R1**：推理专版
- **DeepSeek Harness（dsh）**：2026-08-13 开源的 AI Agent 框架，"一切皆插件"设计

### 阿里 Qwen 系列

- **Qwen3 Next 80B**：开源，参数 80B，GPQA Diamond 74.6%
- 中文场景首选

### 月之暗面 Kimi K2 Thinking

2026 年最有意思的开源之一：**Kimi K2 Thinking**——AIME 99.1% + GPQA Diamond 84.5%，定价 `$0.60 / M`（每百万 token）——**推理质量接近闭源旗舰、价格只有 1/5**。

### Meta Llama

Llama 系列持续迭代，但 2026 年开源阵营注意力更多转向 DeepSeek / Kimi / Qwen，Llama 4 之后没有特别爆炸性的更新。

## 三大趋势：多模态 / Agent / 推理

### 1. 多模态成为标配

所有旗舰模型都支持文本+图像+音频+视频：
- **视频生成**：Sora（2024-02）→ Veo 3 → 可灵 等持续迭代
- **音频**：实时语音对话已成为旗舰模型默认能力
- **视觉理解**：OCR、图像推理、视频内容分析已成熟

### 2. Agent 与工具调用

大模型从"对话工具"演变为"自主完成任务的智能体"：
- **Function Calling / Tool Use**：所有旗舰都原生支持，2026 年格式趋于统一（OpenAI tools / Anthropic MCP / Google function calling）
- **RAG（检索增强生成）**：从"加分项"变成"基础项"，向量数据库与模型解耦
- **多 Agent 协作**：Anthropic Claude Code / OpenAI Codex / DeepSeek Harness 等代表项目

> **MCP（Model Context Protocol）** 是 Anthropic 2024-11 发布的开放标准，2025-2026 年被广泛采纳为 Agent 工具调用的事实标准。

### 3. 长程推理与"思考"模式

2026 年主流旗舰几乎都支持 **"思考模式"**（extended thinking / reasoning）：
- OpenAI o1 / o3 系列（2024-09 起）
- Claude Sonnet 4.6+ 的 adaptive thinking
- Gemini 3.1 Pro 的 reasoning 模式

推理时间从几秒拉到几小时，换取复杂任务（数学、规划、代码调试）的准确率飞跃。

## 成本下行：2026 年的价格断崖

这是 2025-2026 年最被低估的趋势——**模型价格在暴跌**：

| 模型 | | 输入 / 输出（每百万 token） |
|---|---|---|
| DeepSeek V3 | | $0.27 / $0.27（自部署免费）） |
| Gemini 2.5 Flash | | $0.30 / $2.50 |
| Kimi K2 Thinking | | $0.60 / $2.50 |
| Claude Haiku 4.5 | | $1 / $5 |
| Claude Sonnet 4.6 | | $3 / $15 |
| Claude Opus 4.8 | | $5 / $25 |
| Claude Fable 5 | | $10 / $50 |

**两年前 GPT-4 的定价是 `$30 / $60`每百万 token**——现在性能更强、上下文更长、推理更深的 Claude Fable 5 只收 `$10 / $50`。**3-5 倍降价**。

## 个人建议：2026 年怎么用

不是所有任务都需要旗舰模型。**多模型路由**是 2026 年最务实的策略：

- **轻量批处理**（分类 / 摘要 / 翻译）：DeepSeek V3 / Gemini 2.5 Flash / Haiku 4.5
- **代码生成**（普通项目）：Sonnet 4.6 / DeepSeek V3
- **代码生成**（复杂架构 / 长程调试）：Opus 4.8 / GPT-5.5 Pro
- **深度研究 / 推理**：Kimi K2 Thinking / Claude Fable 5 / o3
- **多模态**：Gemini 3.1 Pro（视频 + 实时搜索）/ GPT-5.5

## 未来展望

- **推理成本继续下行**：训练效率提升 + 推理硬件进步 + MoE 架构普及
- **Agent 工作流标准化**：MCP / A2A 等协议收敛
- **端侧 LLM**：手机 / 笔记本本地跑 10B-30B 模型开始实用（Apple Intelligence / Qualcomm Snapdragon X）
- **AI 安全 / 对齐**：从研究话题变成产品话题（监管 + 评测基准）

保持学习，拥抱变化。但**别追新版本**——选稳定的、能跑通的，比"最新"更重要。]]></content:encoded>
    </item>
    <item>
      <title>千问3.6生成前后对比</title>
      <link>https://atom.inte8.top/blog/千问3.6生成前后对比/</link>
      <guid>https://atom.inte8.top/blog/千问3.6生成前后对比/</guid>
      <pubDate>Wed, 29 Apr 2026 00:00:00 GMT</pubDate>
      <description>千问3.6生成前后对比</description>
      <category>前沿技术</category>
      <category>AI</category>
      <category>大模型</category>
      <category>写作</category>

      <content:encoded><![CDATA[# 从家族档案到生命叙事：一篇AI重写的回忆录第一章，到底强在哪？

很多人写自传或家族回忆录时，都会遭遇同一个困境：**"事实都在，但读起来像流水账。"** 时间、人物、事件罗列清晰，却缺了呼吸感与情绪张力。最近，我尝试将一段童年原始手稿交给大语言模型进行"精修重构"。仅用《小学篇·第一章》的对比，足以让人直观看到现代AI在文学叙事辅助上的真实能力。

今天，我们不谈空泛的AI神话，只摊开前后两版原文，拆解一次"AI写作辅助"的路径。如果你也在整理家族档案、撰写个人传记，或尝试将生活经历转化为可读故事，这篇实测或许能给你直接可用的参考。

---

## 前后对比实录（核心段落节选）

### 原始手稿（约800字）
> 80年代末，我出生在一个普通的农村家庭。作为父亲同辈兄弟姐妹里第一个出生的男孩，爷爷对我抱有很大期望，我的名字也是由他亲自取的。
> 
> 爷爷是家里唯一的知识分子，一位小学教师。也许正因为他是老师，从我牙牙学语开始，他就教我背古诗——尽管他教的是数学。儿时没什么杂念，爷爷教什么，我就念什么。五岁时，我已能背诵五十首古诗。每次学会，爷爷都会开心地在人前炫耀。
> 
> 那个年代农村普遍贫穷……每次路过同学刘正欣家，他家养了一只大公鸡，每次路过，它都扑腾着翅膀来啄我。结果我每次都是哭着、跑着、摔着赶到学校。连续几天后，爷爷问起缘由，我一五一十说完。从那天起，我便搬去和爷爷奶奶同住。爷爷每天背我上学，只为避开那只公鸡。
> 
> 一年级课程简单，只有语文和数学。期末时，我数学全班第一，语文却差劲得多。那时的语文主要看字迹，作业本都是田字格，别人一格写一字，我却要用四个田字格才能写一个字——手控不住，写不下小字。正因如此，语文老师判定我不宜升级，我人生的第一次留级由此开始。

### AI精修后（约3000字，保留全部事实，重构叙事节奏）
> 八十年代末的豫西南，风里总裹着黄土与秸秆燃烧后的干燥气息。我出生在一个再普通不过的农村家庭，没有摇钱树，也没有锦鲤运。唯一能拿得出手的，是父辈同族里，我是第一个男丁。这个"第一"，落在爷爷眼里，是香火，是面子，更是他前半生未竟的执念。
> 
> 爷爷是村里仅有的两个识字超过《百家姓》的"知识分子"，在镇小学教了二十年数学。他的粉笔灰染白了袖口，他的戒尺敲碎了教室的黄昏。或许正因为这份职业习惯，从我牙牙学语起，他就把古诗当算术题教。我分不清平仄，背不出深浅，但他不纠正，只反复念："床前明月光，疑是地上霜。"我跟着念，他点头。五岁那年，五十首古诗已经倒背如流。每次背完，他必会端着搪瓷缸子，站在村口的老槐树下，声音洪亮地复述一遍。那是一种朴素的炫耀，也是一种无声的托付。
> 
> 同学刘正欣家养着的那只冠红如血的芦花公鸡，仗着宅院开阔，见人就扑。起初是试探，后来是突袭。翅膀拍打的风声、爪子刮过裤管的刺痛、摔倒时膝盖磕在碎石上的闷响，构成了我童年最鲜活的"课间操"。连续几天哭着跑完三公里后，爷爷沉默地蹲在院门槛上，吧嗒着旱烟。抽完一锅，他磕了磕烟袋锅："搬过来住。"……从此，每天清晨五点五十，爷爷准时推开门，蹲下身："上来。"我没有犹豫。爷爷的脊背不算宽，却足够托起一个五岁男孩的全部重量。他背着我绕开刘正欣家的院墙，脚步稳得像踩过老牛背。风从耳边掠过，我趴在他肩上，看着路边沾露的狗尾草一晃一晃，忽然觉得，上学这件事，也没那么可怕。
> 
> 成绩的双轨制在此刻显影：数学卷面干净利落，语文本上却密密麻麻挤着失控的笔画。红笔圈出的"重写"，像是给小手判了刑。别人一格一字，我却要用四格才塞得下。字写得越大，老师判得越严。最终，那张写着"建议留级"的通知单，轻飘飘地落进抽屉。我人生的第一次留级，就这样被一张田字格裁定。

---

## 模型到底"神"在何处？（4个核心能力拆解）

AI没有替我"编造"故事，而是完成了**叙事工程的重构**。对比可见，它的核心能力体现在四个维度：

### 1. 时代氛围的"物理化嵌入"
- **原始**：仅用"80年代末""农村普遍贫穷"带过背景。
- **AI处理**：将宏观年代压缩进微观场景（干风、秸秆味、搪瓷缸子、老槐树、蓝布书包）。传记写作的第一课：**时代不是背景板，而是人物呼吸的物理环境。** 模型能精准调用符合时代的器物库，让读者"闻到"年代，而非"读到"年代。

### 2. 人物塑造的"动作替代定性"
- **原始**：直接下结论"爷爷对我抱有很大期望……每次学会，爷爷都会开心地在人前炫耀。"（作者跳出来评价）
- **AI处理**：拆解为可拍摄的行为链：`粉笔灰染袖口 → 戒尺敲黄昏 → 不纠正只跟读 → 端缸子站树下复述 → 揣在贴身处`。传记最忌空泛赞美，**性格必须藏在可拍摄的动作里，情感必须活在具体的器物中。** 当"期望"变成"站着复述的声音"，人物就立住了。

### 3. 事件描写的"五感沉浸"与"视角切换"
- **原始**："哭着、跑着、摔着赶到学校。"（高度概括的陈述）
- **AI处理**：补全触觉（爪子刮裤管、膝盖磕碎石）、听觉（扑腾风）、视觉（狗尾草晃动），并切换为"趴肩上看路边"的儿童视角。这不仅是画面增强，更是**情感交付的仪式**：世界虽有尖刺，但有人替我挡下。记忆不是被"讲"出来的，而是被"经历"出来的。

### 4. 叙事节奏的"钩子-展开-余韵"控制
- **原始**：信息密度均匀，段落平铺，缺乏情绪起伏。
- **AI处理**：采用纪实文学标准节奏。每300-500字设置一个情绪微转折（教诗→公鸡→搬入→留级），结尾留白（"忽然觉得，上学这件事，也没那么可怕"），为后文的"留级年"埋下心理伏笔。模型天然具备**网文/大众阅读的节奏感知力**，能自动规避"流水账"陷阱。

---

## 给文字创作者的3点实操建议

如果你也在用AI辅助写作或整理口述史，不妨在下次动笔前，对照这份清单自我检视：

| 写作陷阱 | 破解策略 | 检验标准 |
|:---|:---|:---|
| **贴标签**（如"家里很穷""爷爷很严"） | 用"物"载"情"：写他身边的器物、习惯动作、说话时的微表情 | 能否让读者自己得出这个结论？ |
| **平铺直叙**（只写结果） | 补全五感：光线、气味、温度、声音、触感 | 读这段时，脑内能否自动播放"小电影"？ |
| **信息堆砌**（事件挤在一起） | 控节奏：每章/每段设置"微钩子"（一个声音、一句对话、一个反常细节） | 是否每300字就有情绪或场景的微小起伏？ |
| **视角单一**（纯儿童视角或纯成年上帝视角） | 留白艺术：保留"家人后来告知""记不清"等残缺感，成年视角仅用于关键处点题 | 时间纵深感是否自然拉开，而非生硬说教？ |

---

## 写在最后

原始手稿约800字，精修后控制在3000字左右。这不是"注水"，而是**"塑形"**。记忆原本就是粗糙的石头，写作者的工作不是把它磨成光滑的玻璃球，而是找到它原本的纹理，用刀锋刻出呼吸的缝隙。

客观地说，AI目前仍无法替代亲历者的**情感内核与独特生命经验**。它的真正价值在于：**提供结构框架、补全感官维度、控制叙事节奏、规避表达陷阱**。它能当好一把"刻刀"，但握刀的手，必须永远是你自己。

如果你也在整理家族记忆，或尝试将生活经历转化为可读故事，不妨挑一段"流水账"，交给模型做一次"叙事重构"。把"他对我很好"改成"他每天清晨把热豆浆推到我手边，杯底还留着他的指纹"；把"那年很难"改成"粮票换不来一斤红薯，煤油灯的火苗被风压得只剩豆粒大小"。

好传记不怕慢，只怕没有心跳。愿你的每一段旧时光，都能在今日的纸页上重新生根。

---
*注：本文所涉前后对比文本均基于真实手稿与AI辅助精修版，未添加虚构情节。AI写作辅助的本质是"结构优化+细节显影"，核心叙事权与情感归属始终在写作者手中。*]]></content:encoded>
    </item>
    <item>
      <title>科技Lion一键脚本：Linux服务器运维工具箱 监控管理建站一个脚本全搞定</title>
      <link>https://atom.inte8.top/blog/linuxshell/</link>
      <guid>https://atom.inte8.top/blog/linuxshell/</guid>
      <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
      <description>科技Lion一键脚本：Linux服务器运维工具箱 监控管理建站一个脚本全搞定</description>
      <category>操作系统</category>
      <category>linux</category>
      <category>shell</category>
      <category>教程</category>

      <content:encoded><![CDATA[# 科技lion一键 脚本  Linux服务器运维工具箱 监控管理建站一个脚本全搞定！

本文源自科技lion博客，仅记录个人使用。感谢大佬分享！

原文链接：https://blog.kejilion.pro/kejilion-sh/

![img](https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/20241005171947.png)



科技Lion的Shell脚本工具是一款全能脚本工具箱，使用shell脚本编写。专为Linux服务器监控、测试和管理而设计。无论您是初学者还是经验丰富的用户，该工具都能为您提供便捷的解决方案。集成了独创的Docker管理功能，让您轻松管理容器化应用；LNMP建站解决方案能帮助您快速搭建网站，站点优化，防御，备份还原迁移一应俱全；并且整合了各类系统工具面板的安装及使用，使系统维护变得更加简单。我们的目标是成为全网最优秀的VPS一键脚本工具，为用户提供高效、便捷的科技支持。



## 使用方法

### 安装基础组件

**Debian/Ubuntu**

```
apt update -y && apt install -y curl
```

**CentOS/RedHat/Fedora/AlmaLinux/Rocky Linux**

```
yum update && yum install -y curl
```

**Alpine Linux**

```
apk update && apk add curl
```



### 运行脚本

```
bash <(curl -sL kejilion.sh)
```





## **脚本主界面**

脚本全面支持Ubuntu、Debian，Cent OS和Alpine Linux系统

只要执行命令自动获取最新版本

![img](https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/20241005183921.png)

## 主要功能

#### **docker管理器**

轻松安装管理你的docker容器，无需安装任何可视化面板。操作优雅直觉！

#### **LDNMP建站**

LDNMP建站系统，超凡的快速建站方案，多站共存都是一键搞定。站点管理防护优化一应俱全。

#### **面板工具集合**

集合了时下流行的VPS面板应用程序，一键快速搭建。安装完成即可使用。安装后动态管理已安装的面板应用。

#### **系统工具集合**

集合了对Linux各项系统管理等基础操作，方便小伙伴优雅使用。调整VPS参数不需要记住繁琐命令，一键搞定。

#### **更多功能**

还有更多功能等待着大家自己发掘。欢迎提供宝贵意见，希望一键化脚本工具越来越强大。帮助小伙伴们使用VPS管理VPS。]]></content:encoded>
    </item>
    <item>
      <title>Mac SSH功能，配合 Vim 编辑器对编程十分有帮助</title>
      <link>https://atom.inte8.top/blog/macssh/</link>
      <guid>https://atom.inte8.top/blog/macssh/</guid>
      <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
      <description>Mac SSH功能，配合 Vim 编辑器对编程十分有帮助</description>
      <category>技术笔记</category>
      <category>macos</category>
      <category>linux</category>
      <category>ssh</category>

      <content:encoded><![CDATA[## 前言

>本文整合自网络教程（原文链接：<https://blog.csdn.net/xcg132566/article/details/78797339>），并补充了 2026 年 macOS SSH / Vim 的现代实践。

macOS 内置 OpenSSH 客户端和 Vim 编辑器，无需额外安装就能远程管理 Linux 服务器。这套组合是程序员日常工作的"标配"——尤其在运维、远程开发、跨平台协作场景下。

本文从基础 SSH 连接讲起，覆盖 SSH 密钥认证、scp 文件传输、Vim 编辑器配置、SSH 高级用法（隧道 / 代理），形成完整的 macOS + Linux 远程开发工作流。

## 一、SSH 基础连接

### 1. 密码登录

```bash
ssh username@192.168.100.100
```

- `username`：远程主机的用户名
- `192.168.100.100`：远程主机 IP（或域名）
- 按提示输入密码即可登录

⚠️ **macOS 第一次连接陌生主机**会提示：

```
The authenticity of host '192.168.100.100' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no)?
```

输入 `yes` 后会写入 `~/.ssh/known_hosts`，下次连接不再提示。

### 2. 指定端口

SSH 默认端口是 22。如果服务器改了端口：

```bash
ssh -p 2222 username@192.168.100.100
```

### 3. 指定私钥登录

如果服务器配置了公钥认证：

```bash
ssh -i ~/.ssh/id_rsa username@192.168.100.100
```

### 4. 查看当前登录的用户

```bash
ssh user@server who
```

或者登录后用 `who` 命令查看当前所有登录用户。

## 二、SSH 公钥认证（免密码登录）

密码登录每次都要输入密码，**公钥认证**才是日常开发的方式——生成一对密钥，把公钥放到服务器，本地用私钥登录，全程免密。

### 1. 生成密钥对

```bash
ssh-keygen -t ed25519 -C "your_email@example.com"
```

**2026 年推荐用 ed25519**（比 RSA 更短、更快、更安全）。如果你还在用老 RSA：

```bash
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

按提示设置：
- 文件路径：直接回车用默认 `~/.ssh/id_ed25519`
- 密码：建议**设一个密码**（passphrase）—— 即使私钥泄露，攻击者也需要密码才能用

### 2. 上传公钥到服务器

**方法 1：ssh-copy-id**（最方便）

```bash
ssh-copy-id username@192.168.100.100
```

输入密码一次，公钥自动追加到服务器的 `~/.ssh/authorized_keys`。

**方法 2：手动复制**

```bash
# macOS 本地
cat ~/.ssh/id_ed25519.pub | ssh username@192.168.100.100 \
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
```

**方法 3：直接编辑**

mac上：

```bash
cat ~/.ssh/id_ed25519.pub
# 复制输出内容

# 登录服务器后
ssh username@192.168.100.100
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 把公钥内容粘贴进去
echo "ssh-ed25519 AAAA... your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
```

⚠️ **关键**：`~/.ssh` 必须是 `700` 权限，`authorized_keys` 必须是 `600`。否则 SSH 会拒绝使用公钥认证。

### 3. 测试免密登录

```bash
ssh username@192.168.100.100
# 不再要求输入密码
```

### 4. SSH Config 简化命令

如果你经常连多台服务器，可以配 `~/.ssh/config`：

```
Host myserver
    HostName 192.168.100.100
    User username
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Host prod
    HostName prod.example.com
    User deploy
    Port 2222
    IdentityFile ~/.ssh/work_key
```

之后直接 `ssh myserver` 或 `ssh prod`，不用记 IP / 端口 / 用户名。

## 三、scp 文件传输

scp = SSH Copy，本质是在 SSH 加密通道上传输文件。

### 1. 下载：服务器 → 本地

```bash
scp username@servername:/path/filename /local/path
```

示例：

```bash
scp root@123.207.170.40:/root/test.txt /Users/mac/Desktop
# 把服务器的 /root/test.txt 下载到本地桌面
```

### 2. 上传：本地 → 服务器

```bash
scp /local/path/filename username@servername:/remote/path
```

示例：

```bash
scp /Users/mac/Desktop/test.txt root@123.207.170.40:/root/
```

### 3. 递归传输整个目录

加 `-r` 参数：

```bash
# 下载整个目录
scp -r root@server:/root/folder /local/

# 上传整个目录
scp -r ./local_folder root@server:/root/
```

### 4. 指定端口

```bash
scp -P 2222 file.txt user@server:/path
# ⚠️ scp 用大写 -P，ssh 用小写 -p
```

### 5. 保留文件属性

```bash
scp -p file.txt user@server:/path
# 保留时间戳、权限、属主等
```

### 6. 限速

```bash
scp -l 1000 file.txt user@server:/path
# 限制 1000 Kbit/s（用于慢速网络避免占满带宽）
```

## 四、Vim 编辑器基础

Vim 是 macOS / Linux 自带的文本编辑器，**所有 Unix-like 系统都有**。掌握 Vim 后，你在任何服务器上都能编辑文件。

### 1. 启动 Vim

```bash
vim filename
```

### 2. 三种模式

| 模式 | 进入方式 | 作用 |
|------|----------|------|
| **普通模式**（Normal） | 启动默认 / `Esc` | 移动光标、删除、复制、粘贴 |
| **插入模式**（Insert） | `i` / `a` / `o` | 输入文本 |
| **命令行模式**（Command） | `:` | 执行命令（保存、退出、查找等） |

### 3. 必备命令

**普通模式下**：

```
h j k l      左下上右（替代方向键，更快）
0           跳到行首
$           跳到行尾
gg          跳到文件首行
G           跳到文件末行
dd          删除当前行
yy          复制当前行
p           粘贴
/keyword    搜索关键字
n           下一个匹配
:N          跳到第 N 行
```

**命令行模式下**：

```
:w           保存
:q           退出
:wq          保存并退出
:q!          强制退出（不保存）
:set nu      显示行号
:%s/old/new/g  全局替换
```

### 4. .vimrc 配置

macOS 默认 `~/.vimrc`，Linux 也是 `~/.vimrc`：

```vim
" 显示行号
set number

" 语法高亮
syntax on

" 自动缩进
set autoindent
set smartindent

" Tab = 4 空格
set tabstop=4
set expandtab

" 显示当前模式
set showmode

" 搜索时忽略大小写
set ignorecase
set smartcase

" 中文编码
set encoding=utf-8
set fileencodings=utf-8,gbk,gb18030
```

### 5. Vim 常用插件

**Vundle / vim-plug / pack**：插件管理器

```vim
" ~/.vimrc 装 vim-plug
call plug#begin('~/.vim/plugged')
Plug 'vim-airline/vim-airline'
Plug 'preservim/nerdtree'
Plug 'tpope/vim-commentary'
call plug#end()
```

安装：`curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim`

然后 `:PlugInstall`。

⚠️ **服务器上慎用插件**：远程服务器的 Vim 没法装插件，只用基础命令就好。

## 五、SSH 高级用法

### 1. SSH 端口转发（隧道）

**本地转发**（本地访问远程服务）：

```bash
ssh -L 8080:remote-server:80 user@server
# 之后访问 localhost:8080 就像访问 remote-server:80
```

典型场景：在本地访问服务器的 MySQL / Redis / Web 服务（避开公网）。

**远程转发**（远程访问本地服务）：

```bash
ssh -R 8080:localhost:3000 user@server
# 服务器访问 localhost:8080 就是访问你本地的 :3000
```

典型场景：本地开发 Web 应用，让外部用户通过服务器访问。

**动态转发（SOCKS 代理）**：

```bash
ssh -D 1080 user@server
# 配置本地浏览器 / 应用走 SOCKS5 代理 localhost:1080
# 所有流量经 SSH 加密走服务器出去
```

⚠️ 这就是**跳板机**最简单实现——不推荐用来"翻墙"违反当地法规。

### 2. SSH 免密 + sudo

服务器端 `visudo`：

```
username ALL=(ALL) NOPASSWD: ALL
```

让 sudo 也免密。**慎用**——只在自己的开发机用。

### 3. ssh-agent 转发私钥

本地有私钥，但 SSH 到中间跳板机后还想用同一私钥连其他服务器：

```bash
ssh -A user@jumpserver
# 之后从 jumpserver 跳到目标服务器时直接用本地私钥
```

`ssh-agent` 会管理内存中的私钥，**私钥不会落到跳板机磁盘**。

macOS 上启用：

```bash
# 启动 ssh-agent（macOS 默认启用）
eval "$(ssh-agent -s)"

# 添加私钥（一次）
ssh-add ~/.ssh/id_ed25519
# 输入密码

# 之后 ssh-add -l 能看到已加载的密钥
```

⚠️ **2026 年 macOS Keychain 已经自动接管 ssh-agent**——只要 `~/.ssh/id_ed25519` 是 macOS Keychain 信任的私钥，第一次 `ssh` 就会自动询问是否保存到 Keychain，之后自动用。

### 4. SSH 多因素认证

服务器开 Google Authenticator / Yubikey：

```
/etc/pam.d/sshd 添加：
auth required pam_google_authenticator.so
```

macOS 客户端连接时多一步输 6 位 TOTP 码。

## 六、SSH 安全最佳实践

服务器端（`/etc/ssh/sshd_config`）：

```
# 禁用密码登录（强制公钥）
PasswordAuthentication no

# 禁用 root 直接登录
PermitRootLogin prohibit-password

# 限制尝试次数
MaxAuthTries 3

# 修改默认端口（防扫描）
Port 2222
```

客户端：
- ⚠️ **不要把私钥提交到 git**
- 给不同用途的服务器**用不同密钥**（work / personal / GitHub）
- 私钥密码（passphrase）一定要设
- 定期 `ssh-keygen -lf ~/.ssh/id_ed25519` 看本地有哪些密钥

`.gitignore` 加：

```
.ssh/id_*
```

（只忽略私钥，公钥 `*.pub` 可以提交）

## 七、常见问题

### Q: 连接提示 "Permission denied (publickey,password)"？

99% 是 `.ssh` 目录权限问题：

```bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 644 ~/.ssh/known_hosts
chmod 644 ~/.ssh/config
```

### Q: 配了公钥还是要输密码？

服务端 `sshd_config` 检查：

```bash
# 必须确认
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
```

重启 sshd：

```bash
sudo systemctl restart sshd
```

### Q: macOS 上 ssh-add 后重启要重新输密码？

macOS 上：

```bash
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
# 添加到 Keychain，重启不丢
```

### Q: SSH 经常断线？

服务端 `sshd_config` 加：

```
ClientAlive
Interval 60
ClientAliveCountMax 3
```

客户端 `~/.ssh/config` 加：

```
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
```

## 八、完结

macOS + SSH + Vim 是程序员**远程工作的三件套**：

- SSH 连接服务器（公钥认证免密登录）
- scp 传输文件
- Vim 编辑服务器文件（基础命令够用，复杂需求用 VSCode Remote）

把这套练到不查文档就能用，**远程运维能力**会有质的飞跃。

记住三个核心原则：
1. **永远用公钥认证**（别再用密码）
2. **私钥加密码 + 不入 git**
3. **服务器端禁用密码登录 + 改默认端口**]]></content:encoded>
    </item>
    <item>
      <title>Multipass 使用笔记</title>
      <link>https://atom.inte8.top/blog/multipasshelp/</link>
      <guid>https://atom.inte8.top/blog/multipasshelp/</guid>
      <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
      <description>Multipass 使用笔记</description>
      <category>操作系统</category>
      <category>linux</category>
      <category>multipass</category>
      <category>ubuntu</category>

      <content:encoded><![CDATA[> [!IMPORTANT]
>
> 本文出自悟空的日常抄录，未做任何修改仅用来存根记录。
>
> 原文链接：https://wkdaily.cpolar.cn/archives/multipass



# 简单使用

## 查看支持的系统镜像列表

```bash
multipass find
```

## ❤️ 新建和运行 ubuntu

> [!NOTE]
>
> multipass launch --name <虚拟机实例名称> <系统镜像名称(可选)>
>
> 举例，比如创建一个名为 vm1 的虚拟机实例，不写系统镜像这个参数，则表示最新版ubuntu 24.04

```bash
multipass launch --name vm1
```

## 以后如何调用虚拟机？

- 方法一 任务栏图标点击右键——Open Shell

![img](https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/右键调用.jpg)

- 方法二 运行指定虚拟机实例名称即可

```bash
multipass shell vm1
```

## 如何换 国内 软件源 比如阿里云 Ubuntu 24.04 为例

```bash
sudo sed -i 's|http://archive.ubuntu.com/|http://mirrors.aliyun.com/|g' /etc/apt/sources.list.d/ubuntu.sources
```

或者手动修改 配置文件

```bash
nano /etc/apt/sources.list.d/ubuntu.sources
```

![img](https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/sf.jpg)

## 然后更新软件源

```bash
sudo -i
apt update -y
apt upgrade -y
```

## 如何删除虚拟机实例（分三步）

```bash
# 停止 vm1

multipass stop vm1

# 删除 vm1

multipass delete vm1

# 清理回收

multipass purge

# 附加

# 停止全部虚拟机

multipass stop --all
```

## 查看虚拟机列表

```bash
# 查看虚拟机列表 包括其状态（正在运行、已经删除的、已经停止的、标记未知状态的）

multipass list
```

# 进阶使用

## 新建 4核心 4GB内存 300G虚拟磁盘的ubuntu 实例

```bash
multipass launch --name vm3 -c 4 -m 4G -d 300G
```

> [!NOTE]
>
> vm3 虚拟机名称
>
> -c 4 代表虚拟4核心 这个要根据实际CPU核心数确定 不能随便写 比如本身2核心的cpu是无法虚拟4核心的
>
> -m 4G 代表虚拟4GB内存
>
> -d 300G 代表分配虚拟磁盘300GB

## 设置桥接模式的网络

```bash
multipass set local.bridged-network=<name>

# 比如重命名以太网2为lan2

multipass set local.bridged-network=lan2
```

<name> 就是网口的名称 比如 以太网，但是最好重命名为英文，比如lan1、lan2

## 创建桥接模式的虚拟机vm4

```bash
multipass launch --name vm4 -c 4 -m 4G -d 300G --network bridged
```

### TVBox APK 下载地址 https://wkdaily.cpolar.cn/archives/free

### 视频里的脚本地址：https://github.com/wukongdaily/OrangePiShell

### ❤️ 扩展知识

可能有小伙伴会问 笔记本电脑没有 有线网卡。只有Wifi 应该如何桥接呢？有时候，windows 下的multipass 可能打印不出wifi网卡。比如 输入 multipass networks

遇到识别不出wifi 网卡的情况，其实还可以利用Hyper-V 管理器新建一个虚拟交换机。

> [!NOTE]
>
> 打开hyper-v管理器。点击【虚拟交换管理器】-【新建虚拟网络交换机】-【外部】-【创建】 然后你勾选一下你的 wifi 无线网卡，然后 名称的话 改成英文吧，比如 wifi 。这样应用之后，你再去打印multipass networks 就能识别wifi啦

## 如何使用RunMyNAS 编译iStoreNAS固件

```
# 同步项目到本地

git clone https://github.com/linkease/iStoreNAS.git

# 切换到该目录

cd iStoreNAS

# 执行项目 比如(参数  x86_64 or rk35xx or rk33xx)

./runmynas.sh x86_64
```

## 更多进阶Multipass用法可参考Geekhour的博客 4.1章节

https://geekhour.net/]]></content:encoded>
    </item>
    <item>
      <title>Typora + PicGo-Core + GitHub 图床 完整配置指南</title>
      <link>https://atom.inte8.top/blog/typora-picgo-core/</link>
      <guid>https://atom.inte8.top/blog/typora-picgo-core/</guid>
      <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>

      <lastBuildDate>Sun, 20 Sep 2026 00:00:00 GMT</lastBuildDate>
      <description>Typora + PicGo-Core + GitHub 实现图片上传到 GitHub，使用 jsDelivr CDN 加速、rename-file 自动重命名</description>
      <category>技术笔记</category>
      <category>typora</category>
      <category>文本编辑</category>
      <category>picgo</category>

      <content:encoded><![CDATA[# Typora + PicGo-Core + GitHub 图床 完整配置指南

> **最后更新**: 2026-09-20  
> **图床仓库**: [zz3656/picgo](https://github.com/zz3656/picgo)  
> **访问地址**: `https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/...`

---

## 一、整体架构

```
Typora（编辑器）
   │
   ├─ 粘贴/拖入图片
   │
   ▼
PicGo-Core（命令行上传工具）
   │
   ├─ github-plus 插件
   ├─ rename-file 插件（自动重命名）
   │
   ▼
GitHub 仓库（zz3656/picgo）
   │
   ▼
jsDelivr CDN 加速访问
```

---

## 二、环境准备

### 2.1 安装 PicGo-Core

```bash
npm install picgo -g
```

安装完成后验证：

```bash
picgo -v
# 输出: 3.0.2（或更高版本）
```

### 2.2 安装插件

```bash
# GitHub 上传增强插件（比官方 GitHub 插件更好用）
picgo install github-plus

# 文件重命名插件（按日期+哈希自动命名）
picgo install rename-file
```

---

## 三、获取 GitHub Token

PicGo 需要 GitHub Token 才能将图片上传到你的仓库。

### 3.1 生成步骤

1. 访问 **https://github.com/settings/tokens**
2. 点击 **Generate new token (classic)**
3. 填写配置：

| 字段 | 推荐值 |
|------|--------|
| Note | `PicGo 图床`（备注用途） |
| Expiration | No expiration（永不过期） |
| Scopes | **勾选 `public_repo`**（公开仓库） |

4. 点击 **Generate token**
5. **立即复制 token**，格式如 `ghp_xxxxxxxxxxxxxxxxxxxx...`，只显示一次！

> ⚠️ **安全提醒**: Token 等同于密码，不要提交到 Git 仓库或分享给他人。`public_repo` 权限只允许操作公开仓库，安全性较高。

---

## 四、配置 PicGo

### 4.1 配置文件位置

```
~/.picgo/config.json
```

### 4.2 配置文件内容

```json
{
  "picBed": {
    "uploader": "githubPlus",
    "current": "githubPlus",
    "githubPlus": {
      "repo": "zz3656/picgo",
      "branch": "main",
      "path": "img",
      "customUrl": "https://cdn.jsdelivr.net/gh/zz3656/picgo@main",
      "token": "YOUR_GITHUB_TOKEN_HERE",
      "origin": "github"
    }
  },
  "picgoPlugins": {
    "picgo-plugin-github-plus": true,
    "picgo-plugin-rename-file": true
  },
  "picgo-plugin-rename-file": {
    "format": "{y}/{m}/{d}/{hash}-{origin}-{rand:6}"
  }
}
```

### 4.3 配置说明

| 配置项 | 说明 |
|--------|------|
| `repo` | 你的 GitHub 仓库名，格式 `用户名/仓库名` |
| `branch` | 默认分支名，通常是 `main` 或 `master` |
| `path` | 仓库内存放图片的子目录 |
| `customUrl` | CDN 访问地址，格式 `https://cdn.jsdelivr.net/gh/用户名/仓库名@分支名` |
| `token` | 上一步生成的 GitHub Token |
| `format` | 重命名规则：`年/月/日/哈希-原文件名-6位随机数` |

> ⚠️ 根据你自己的仓库信息修改 `repo`、`branch`、`customUrl` 中的用户名和仓库名。

### 4.4 测试上传

创建一张测试图片并上传：

```bash
echo "test" > /tmp/test-picgo.png
picgo upload /tmp/test-picgo.png
```

成功输出类似：

```
[PicGo SUCCESS]:
https://cdn.jsdelivr.net/gh/zz3656/picgo@main/img/2026/09/20/d8e8fca2dc0f896fd7cb4cb0031ba249-test-picgo-0473c7.png
```

---

## 五、Typora 配置

### 5.1 关键步骤

打开 **Typora** → **偏好设置** → **图像**：

| 设置项 | 值 |
|--------|-----|
| 上传服务 | **Custom Command** |
| 自定义命令 | `/Users/ceasar/.local/bin/picgo upload` |
| ✅ 上传时自动复制图片链接到剪贴板 | 勾选 |

### 5.2 为什么不能用 PicGo-Core？

> ❌ **PicGo-Core (command line)** 选项在 Typora 的 UI 中没有保存配置的入口，每次关闭设置就会重置。

> ✅ **Custom Command** 直接调用完整的 picgo 可执行文件路径，更加可靠。

### 5.3 为什么要用完整路径？

直接使用 `picgo upload` 会报错：

```
/bin/bash: picgo: command not found
```

因为 Typora 的 shell 环境中 `$PATH` 不包含 npm 全局安装路径。需要使用 **完整路径**：

```bash
/Users/ceasar/.local/bin/picgo upload
```

如果你的 npm 全局路径不同，可以用以下命令查看：

```bash
which picgo
# 输出你的 picgo 实际路径
```

### 5.4 验证上传

1. 在 Typora 中拖入一张测试图片
2. 点击 **验证图片上传**
3. 显示 **验证成功** 即表示配置正确

---

## 六、使用方式

配置完成后，在 Typora 中：

1. **粘贴图片**：从剪贴板粘贴图片，Typora 会自动上传
2. **拖入图片**：直接将图片拖入 Typora，右键图片选择 **上传**
3. 图片链接自动复制到剪贴板，方便在其他地方使用

### 上传后图片命名规则

重命名插件会自动按以下规则生成文件名：

```
img/年/月/日/哈希-原文件名-6位随机数.扩展名
```

示例：

```
img/2026/09/20/d8e8fca2dc0f896fd7cb4cb0031ba249-test-picgo-0473c7.png
```

---

## 七、常见问题

### Q1: 上传失败提示 token 无效

检查 `~/.picgo/config.json` 中的 token 是否正确，以及 GitHub Token 的权限是否包含 `public_repo`（公开仓库）或 `repo`（私有仓库）。

### Q2: 图片上传成功但访问不了

确认 `customUrl` 格式正确：

```
https://cdn.jsdelivr.net/gh/用户名/仓库名@分支名
```

注意分支名（`main` 或 `master`）必须和仓库一致。

### Q3: Typora 中 picgo command not found

使用完整路径而非命令名：

```bash
which picgo  # 先找到完整路径
# 然后在 Typora 中使用: /完整/picgo路径/upload
```

### Q4: 更换 Mac 后如何迁移

将 `~/.picgo/config.json` 文件备份到安全位置，在新机器上安装 PicGo-Core 和插件后，将配置文件放回 `~/.picgo/config.json` 即可。

### Q5: jsDelivr CDN 节点问题

jsDelivr 在国内访问可能不稳定。可以：

- 在浏览器地址后加 `?x-intl=reflectfast` 强制使用国内节点
- 或使用其他 CDN 加速服务（如使用 Vercel 部署镜像）

---

## 八、配置文件参考

### 完整 `~/.picgo/config.json` 参考

```json
{
  "picBed": {
    "uploader": "githubPlus",
    "current": "githubPlus",
    "githubPlus": {
      "repo": "zz3656/picgo",
      "branch": "main",
      "path": "img",
      "customUrl": "https://cdn.jsdelivr.net/gh/zz3656/picgo@main",
      "token": "YOUR_GITHUB_TOKEN_HERE",
      "origin": "github"
    }
  },
  "picgoPlugins": {
    "picgo-plugin-github-plus": true,
    "picgo-plugin-rename-file": true
  },
  "picgo-plugin-rename-file": {
    "format": "{y}/{m}/{d}/{hash}-{origin}-{rand:6}"
  }
}
```

### 批量上传命令

```bash
# 批量上传图片到图床
picgo upload 图片1.png 图片2.jpg 图片3.png
```

### 查看当前配置

```bash
cat ~/.picgo/config.json
```

---

## 九、其他推荐插件

| 插件 | 用途 | 安装命令 |
|------|------|---------|
| `picgo-plugin-rename-file` | 自动重命名（已安装） | `picgo install rename-file` |
| `picgo-plugin-watermark` | 图片添加水印 | `picgo install watermark` |

> ⚠️ watermark 插件安装时需要下载字体，建议使用代理。注意：部分版本中 watermark 插件可能与 rename-file 插件不兼容。

---

## 附录：关键文件路径

| 文件 | 路径 |
|------|------|
| PicGo 配置 | `~/.picgo/config.json` |
| PicGo 可执行文件 | `~/.local/bin/picgo` |
| npm 全局模块目录 | `~/.local/lib/node_modules/` |]]></content:encoded>
    </item>
    <item>
      <title>屌丝网管第一章</title>
      <link>https://atom.inte8.top/blog/屌丝网管第一章/</link>
      <guid>https://atom.inte8.top/blog/屌丝网管第一章/</guid>
      <pubDate>Fri, 21 Feb 2020 00:00:00 GMT</pubDate>
      <description>屌丝网管第一章</description>
      <category>生活随笔</category>
      <category>屌丝网管</category>
      <category>网管</category>
      <category>回忆录</category>

      <content:encoded><![CDATA[02年时候我因沉迷网吧在初中三年级辍学，在家玩了半年。后来家人想让我学习一门手艺，最后我选择了学计算机。之后03年至05年的我就一直再郑州某职业中专就读，当时我们学校里的专业普遍都是办公自动化、网页设计、FLASH、PHOTOSHOP以及visualfoxpro这些。所以我也和大多数上中专的一样，从办公自动化开始学习。后期也选修了不少其他课程，像网页制作软件dreamweaver。photoshop也有学习了几个月，而且还考了证书。上学期间第一年暑假就有做过暑假工，本意在提前感受一下社会。但是完全并没有给自己以后步入社会创造什么经验……反倒是中途因为跑了一单被罚了半个月工资直接辞职了。不过最后依然发了100多元的工资。我拿着这点钱直接就去了网吧，根本就没跟我家人说我辞职了……就这样一早起来就去网吧打早市，早市12点结束就转计费。当时的我似乎也不会玩什么游戏，就见赵坤在学校时候玩奇迹MU。我也就索性尝试玩这个了。当时是这个游戏高科技最猖獗的时候，网上随处都可以下载脱机的那种。就是不用任何操作，只有一个简单的界面脚本。设置好刷怪的地方，掉什么东西捡取什么东西卖掉这样子。然后点开始就行了。整个过程是非常无聊的，但不知道为什么。当年的我非常好这一口……就这样我每天白天去网吧上网，晚上正常回家休息。直到把我这点工资花完。本想着我也不会玩这个游戏到最后把这些天刷出来的宝石什么的给赵坤来着，结果到开学时候怎么都想不起来账号密码了……你说这事尴尬不…… 2年的在校学习，后面就是出去实习了。其实实习也算是毕业。但是毕业以后也比较盲从，在校时候完全没有想过自己学的专业出去以后可以做什么事情。虽然这过程中家人还有朋友都有给我介绍过工作，往后会穿插到各个章节中。比如去某某仓库给人当仓库管理、去某某洗浴中心给人当客房服务员（这个比较重要，让我遇到了我的现任老婆。）去某某工地给人修路什么的，总之也是什么都干……印象最深刻的是去郑州科技市场，为什么呢？主要因为我毕业这头几个月里做的工作竟然没有一个行业是我学的专业相关的，（在人民路解放路给大山外语发传单，见人就说hello dashan english……类似这样逗比的事儿刚毕业几个月我干了不少。）而我自己又不想浪费了我在学校几年学习过的东西。因为是家人花钱供我学知识的，我不想让他们以为我上学和不上学没有任何区别白瞎学了这几天电脑。而电脑相关的工作，自然而然的就想到了卖电脑了。（好像也没有什么不对的）只不过这个选择让我第一次感受到了技能的重要性，当年的郑州科技市场已经略见规模。各种商家商户比比皆是，创新大厦是那几年里比较火爆的一个商场。所以我就在这栋楼随便找了一家去应聘去了。你好！请问你们这里招人吗？这是我进门第一句话，店里的人回答是的，你都会什么？然后我就非常自豪的把我在学校学过的专业统统说了一遍。店里人员回答：不好意思你在看看别家吧！当时对我的打击还是蛮大的，不过想想也是。我学的专业和人家卖电脑有毛线关系？继续去第二家，我涨了点记性我说我会组装电脑。换来的结果却是一把螺丝放我面前，让我区分一下那个是硬盘的，那个是主板的。我当时就懵逼了！没有再说下去直接去下一家了，这一次我长记性了。到第三家直接就是说，你好，我刚从学校毕业想来这里学修电脑。工资什么的我不要，什么时候你觉得合适了在给我发工资都行。果然而然，我顺利的当时直接上班了。我的第一份和所学专业相关的工作就这么愉快的开始了！接下来的两三个月里是我万万没想到的，我连续为这家公司送了三个月的货，其他的什么都不让我做……当然这期间也有段小插曲，我来科技市场是告诉过家人的。工资不重要重要的是你开心就行，这是我爸给我说的原话，我当时为了尽快入行也随行就市过一次，为了学点东西好去跟同学装逼我去找我爸要钱请公司里员工吃饭。（当时我在公司是没有工资的，自掏腰包请客主要就是是想找人学习一点电脑基础知识的……大概就是这个意思，结果请客当晚大家说的好好的，第二天上班后，一切恢复如初！这也是我后来为什么不喜欢去郑州的原因之一！我觉得郑州人生意人都是人前一套背后一套。）送货过程虽然无聊，但是也让我认识了一些很好的商家。当然这些上家也成了我以后开店时候的的渠道合作伙伴。当然，不排除好的坏的。中关大厦7楼的704张磊是我记忆里最深刻的。我们公司做光驱的，在哪个年代光驱是类似于现在电脑里硬盘的价值！那时候几乎每天都要往他们公司送货，他公司是组装电脑的。后续我开店以后我们也合作了几个年头。回归正题，看现在这样的情况的话，就比较尴尬了。本来就没有工资就想着能偷学点东西，哪怕会装个系统以后也可以给女同学修电脑不是……结果现实却是残酷的。于是当天我就辞了工，老板当然也没说什么。辞工以后一个人在街上乱转。漫无目的这样子吧。后来再回家路上转公交车时候忽然看到站牌西边一家网吧招聘网管的广告，玻璃门上清晰的写着：招聘网管，学历不限等等……当时我脑袋猛然想到，修电脑？哪里的电脑有网吧的电脑坏的毛病奇葩呢！科技市场顶多也就是组装新电脑比较多，但是要说维修。那种场合能有网吧里电脑毛病多的！于是乎，我毅然而然的走进了网吧，吧台里的妹子长得很标致……（不排除这也是我非要在这家网吧上班的原因之一）
　　“你好，请问你们这里招网管吗？”
　　“店长出门了，你等下他一会回来。”
　　得知店长出门了，我就直接在网吧的休息区等店长了，大概看了一下这网吧。并不是那种特别出众的类型，装修也比较老旧了。形式我大概看了一下觉得应该在一百台上下这样。随便转了一圈就又老实坐休息区等了，不出一会有一个穿一身正装的人进门了，随后在吧台站了一会和收银妹子说了几句话后开始往我这里走了过来。人还没有走到话就已经说出来了，你是来应聘网管的吗？我回，是的！很随便的问了我一点个人信息后就听他说身份证登记一下然后今晚来上班吧。 OωO 我当时表情就和这个表情一样，真的就是这样 OωO 这么低门槛？考虑到我之前科技市场应聘的经历。其实我准备了好多过天话要说的（比如说我会装系统，会修电脑什么的云云。总之就是先糊弄过去，剩下的过一天算一天！）这么简单的应聘搞的确搞得我有点防不胜防……碍于我家离网吧不是太近索性我也就没有走，店长告诉我晚上7点开始上班值夜班。我就直接在网吧里等到了晚上7点。时间过的很快，转眼已经7点。开始上班了，店长先集合工作人员（包括我）交代了一下。因为我当时脑子还在短路中没有恢复过来，所以店长说了什么我是真一点都没有听到。完了就听到最后一句，那大家开始干活吧！干活？干什么活？接着我就一脸懵圈只能先看看其他工作人员在做什么，发现都在和顾客说话。那我该做什么？正在这时店长喊了一句，人员清理完之后就开始搬沙发吧。这时候我才明白，为什么我白天的应聘那么随意了……然后我也跟着其他人开始搬沙发，当然，我不知道搬到哪里只能跟着别人去哪我去哪。也不算太远出门往右走了100米左右开始上楼，好在是2楼并不是特别高。就这样我和一帮同事一直搬到凌晨12点多才算是基本上搬完，剩下的小件东西店长说明天白班的人拿。当时听到这句话身体一下子轻松了，想着终于是可以休息一下子了。一伙人瘫坐在刚搬上来还没摆放位置的沙发上。就在刚坐下几分钟这会，从楼梯那边传来了一阵脚步声，随后进门来了一个年纪大约20多岁的人，上来后说了一句足以让我的一圈同事们崩溃的一句话！（未完待续）]]></content:encoded>
    </item>
  </channel>
</rss>