<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>SkyHive&#39;s Blog</title>
  
  
  <link href="https://blog.skyhive.tech/atom.xml" rel="self"/>
  
  <link href="https://blog.skyhive.tech/"/>
  <updated>2026-03-02T03:49:22.581Z</updated>
  <id>https://blog.skyhive.tech/</id>
  
  <author>
    <name>SkyHive</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>OpenClaw 搭建 Hexo 博客自动化工作流</title>
    <link href="https://blog.skyhive.tech/post/af30f29e.html"/>
    <id>https://blog.skyhive.tech/post/af30f29e.html</id>
    <published>2026-02-28T07:12:00.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h1 id="OpenClaw-搭建-Hexo-博客自动化工作流"><a class="header-anchor" href="#OpenClaw-搭建-Hexo-博客自动化工作流">¶</a>OpenClaw 搭建 Hexo 博客自动化工作流</h1><blockquote><p>把重复的命令交给 AI，写博客应该专注于内容</p></blockquote><hr><h2 id="一、背景"><a class="header-anchor" href="#一、背景">¶</a> 一、背景</h2><h3 id="一个运维的自我修养"><a class="header-anchor" href="#一个运维的自我修养">¶</a> 一个运维的自我修养</h3><p>作为一个运维工程师，我的日常是这样的：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 早上到公司</span>kubectl get pods  <span class="token comment"># 嗯，都活着</span><span class="token comment"># 下午开会</span><span class="token comment"># 脑子：这个架构有问题</span><span class="token comment"># 嘴：我觉得还行，再观察观察</span><span class="token comment"># 晚上写博客</span>hexo new post <span class="token string">"今天学了个新东西"</span><span class="token comment"># 编辑两小时...</span><span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span><span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"更新"</span><span class="token function">git</span> pushhexo clean <span class="token operator">&amp;&amp;</span> hexo generate <span class="token operator">&amp;&amp;</span> hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>等等，我是不是忘了什么？哦对，<strong>我只是想写篇博客，不是要考 RHCE 认证啊！</strong></p><h3 id="于是我开始-偷懒"><a class="header-anchor" href="#于是我开始-偷懒">¶</a> 于是我开始 "偷懒"</h3><p>最近我在折腾一个很火的开源框架 —— <strong>OpenClaw</strong>。</p><p><strong>OpenClaw 是什么？</strong></p><p>简单来说，它是一个 <strong>AI 助手框架</strong>，能：</p><ul class="lvl-0"><li class="lvl-2"><p>读取你的文件、日历、邮箱</p></li><li class="lvl-2"><p>帮你执行命令、管理任务</p></li><li class="lvl-2"><p>通过自然语言对话完成各种工作</p></li></ul><p>它的核心理念是：<strong>让 AI 成为你的第二个大脑</strong>，帮你处理重复性工作，你只需要专注于决策和创造。</p><p><strong>听起来很美好，但真的能用吗？</strong></p><p>抱着怀疑的态度，我决定拿它来测试一下：<strong>能不能帮我把博客写作流程自动化？</strong></p><p>毕竟，如果一个 AI 连 <code>hexo new post</code> 都搞不定，那它也不配待在我的工作流里。</p><hr><h2 id="二、和-AI-一起优化博客流程"><a class="header-anchor" href="#二、和-AI-一起优化博客流程">¶</a> 二、和 AI 一起优化博客流程</h2><h3 id="第一次对话：需求描述"><a class="header-anchor" href="#第一次对话：需求描述">¶</a> 第一次对话：需求描述</h3><p>我没有写任何脚本，只是打开 OpenClaw，输入了这样一段话：</p><blockquote><p>“我想用 OpenClaw 自动化我的 Hexo 博客写作流程。每次写文章都要手动执行 hexo new、git commit、hexo deploy 等命令，太麻烦了。你能帮我创建一个 Skill 吗？”</p></blockquote><p>AI 很快理解了需求，并反问我几个关键问题：</p><ol><li class="lvl-3"><p>博客仓库在哪里？（本地路径、Git 地址）</p></li><li class="lvl-3"><p>分支结构是什么？（我的是 <code>hexo</code> 分支写作，<code>master</code> 分支部署）</p></li><li class="lvl-3"><p>需要哪些核心功能？（创建草稿、发布、预览、删除等）</p></li><li class="lvl-3"><p>分类和标签有没有默认配置？</p></li></ol><p>整个过程就像在和一个懂技术的同事讨论需求，<strong>不需要写任何代码</strong>。</p><h3 id="第二次对话：流程设计"><a class="header-anchor" href="#第二次对话：流程设计">¶</a> 第二次对话：流程设计</h3><p>基于我的回答，AI 设计了一个简化后的工作流：</p><p><strong>优化前（7 步手动操作）：</strong></p><pre class="line-numbers language-none"><code class="language-none">1. hexo new post "标题"2. 打开编辑器写文章3. 保存文件4. git add .5. git commit -m "xxx"6. git push7. hexo deploy<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>优化后（3 个命令）：</strong></p><pre class="line-numbers language-none"><code class="language-none">1. blog draft "标题" 技术 标签  → 创建草稿2. blog serve --drafts         → 本地预览3. blog publish "标题"         → 发布 + 部署<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h3 id="第三次对话：细节打磨"><a class="header-anchor" href="#第三次对话：细节打磨">¶</a> 第三次对话：细节打磨</h3><p>在实现过程中，我们又通过自然语言讨论了一些细节：</p><blockquote><p>“分类能不能自动映射？比如我输入 <code>技术</code> 就自动变成 <code>技术相关</code> ”</p></blockquote><blockquote><p>“发布的时候能不能自动 git commit 和 push？我不想每次都手动操作”</p></blockquote><blockquote><p>“预览的时候希望能看到草稿，有没有 <code>--drafts</code> 参数？”</p></blockquote><p>AI 逐一实现了这些需求，经过几轮对话，一个完整的博客自动化 Skill 就诞生了。</p><p><strong>重点是：整个过程我没有写一行代码，只是用自然语言和 AI 对话。</strong></p><hr><h2 id="三、关键代码与使用方法"><a class="header-anchor" href="#三、关键代码与使用方法">¶</a> 三、关键代码与使用方法</h2><h3 id="核心脚本结构（AI-生成的）"><a class="header-anchor" href="#核心脚本结构（AI-生成的）">¶</a> 核心脚本结构（AI 生成的）</h3><p>AI 帮我创建的 Blog Skill 位于 <code>~/.openclaw/skills/blog/</code>，核心是一个 Bash 脚本：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token shebang important">#!/bin/bash</span><span class="token builtin class-name">set</span> <span class="token parameter variable">-e</span><span class="token assign-left variable">BLOG_DIR</span><span class="token operator">=</span><span class="token string">"/home/skyhive/.openclaw/workspace/projects/blog"</span><span class="token assign-left variable">HEXO</span><span class="token operator">=</span><span class="token string">"pnpm exec hexo"</span><span class="token builtin class-name">cd</span> <span class="token string">"<span class="token variable">$BLOG_DIR</span>"</span><span class="token comment"># 创建草稿</span><span class="token function-name function">create_draft</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">title</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$1</span>"</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">category</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$2</span>"</span>    <span class="token builtin class-name">shift</span> <span class="token number">2</span> <span class="token operator">||</span> <span class="token boolean">true</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">tags</span><span class="token operator">=</span><span class="token punctuation">(</span><span class="token string">"<span class="token variable">$@</span>"</span><span class="token punctuation">)</span>        <span class="token builtin class-name">echo</span> <span class="token string">"📝 创建草稿：<span class="token variable">$title</span>"</span>    <span class="token variable">$HEXO</span> new draft <span class="token string">"<span class="token variable">$title</span>"</span><span class="token punctuation">}</span><span class="token comment"># 发布草稿</span><span class="token function-name function">publish_draft</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">title</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$1</span>"</span>        <span class="token builtin class-name">echo</span> <span class="token string">"📤 发布草稿：<span class="token variable">$title</span>"</span>    <span class="token variable">$HEXO</span> publish <span class="token string">"<span class="token variable">$title</span>"</span>        <span class="token function">git</span> <span class="token function">add</span> <span class="token builtin class-name">.</span>    <span class="token function">git</span> commit <span class="token parameter variable">-m</span> <span class="token string">"feat: 发布文章 - <span class="token variable">$title</span>"</span>    <span class="token function">git</span> push origin hexo<span class="token punctuation">}</span><span class="token comment"># 本地预览</span><span class="token function-name function">serve</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">port</span><span class="token operator">=</span><span class="token string">"4000"</span>    <span class="token builtin class-name">local</span> <span class="token assign-left variable">include_drafts</span><span class="token operator">=</span><span class="token string">""</span>        <span class="token keyword">while</span> <span class="token punctuation">[</span> <span class="token variable">$#</span> <span class="token parameter variable">-gt</span> <span class="token number">0</span> <span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token keyword">do</span>        <span class="token keyword">case</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token keyword">in</span>            --drafts<span class="token operator">|</span>-d<span class="token punctuation">)</span> <span class="token assign-left variable">include_drafts</span><span class="token operator">=</span><span class="token string">"--drafts"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span>            <span class="token punctuation">[</span><span class="token number">0</span>-9<span class="token punctuation">]</span>*<span class="token punctuation">)</span> <span class="token assign-left variable">port</span><span class="token operator">=</span><span class="token string">"<span class="token variable">$1</span>"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span>        <span class="token keyword">esac</span>        <span class="token builtin class-name">shift</span>    <span class="token keyword">done</span>        <span class="token variable">$HEXO</span> server <span class="token variable">$include_drafts</span> <span class="token parameter variable">--port</span> <span class="token variable">$port</span><span class="token punctuation">}</span><span class="token comment"># 主逻辑</span><span class="token keyword">case</span> <span class="token string">"<span class="token variable">$1</span>"</span> <span class="token keyword">in</span>    draft<span class="token punctuation">)</span> <span class="token builtin class-name">shift</span><span class="token punctuation">;</span> create_draft <span class="token string">"<span class="token variable">$@</span>"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span>    publish<span class="token punctuation">)</span> <span class="token builtin class-name">shift</span><span class="token punctuation">;</span> publish_draft <span class="token string">"<span class="token variable">$@</span>"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span>    serve<span class="token punctuation">)</span> <span class="token builtin class-name">shift</span><span class="token punctuation">;</span> serve <span class="token string">"<span class="token variable">$@</span>"</span> <span class="token punctuation">;</span><span class="token punctuation">;</span>    *<span class="token punctuation">)</span> <span class="token builtin class-name">echo</span> <span class="token string">"Usage: blog {draft|publish|serve}"</span><span class="token punctuation">;</span> <span class="token builtin class-name">exit</span> <span class="token number">1</span> <span class="token punctuation">;</span><span class="token punctuation">;</span><span class="token keyword">esac</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="创建软链接"><a class="header-anchor" href="#创建软链接">¶</a> 创建软链接</h3><p>AI 帮我创建了一个全局命令：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ln</span> <span class="token parameter variable">-sf</span> /home/skyhive/.openclaw/skills/blog/blog.sh ~/.local/bin/blog<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="最终使用方式：自然语言对话"><a class="header-anchor" href="#最终使用方式：自然语言对话">¶</a> 最终使用方式：自然语言对话</h3><p>现在，我不需要记住任何命令，只需要和 AI 对话：</p><pre class="line-numbers language-none"><code class="language-none">我：帮我写一篇关于 K8s 部署的文章AI：好的，分类是"技术相关"吗？需要加什么标签？我：标签加 Linux 和 K8sAI：📝 已创建草稿《K8s 部署最佳实践》，要现在预览吗？我：预览AI：🌐 本地服务器已启动，访问 http://localhost:4000# 编辑完成后...我：发布这篇文章AI：📤 已发布并推送到远程，Vercel 正在部署...<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>是的，最终的使用方式就是：用自然语言和 AI 对话，剩下的交给它。</strong></p><h3 id="命令行方式（可选）"><a class="header-anchor" href="#命令行方式（可选）">¶</a> 命令行方式（可选）</h3><p>如果你更喜欢命令行，也可以直接使用：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 创建草稿</span>blog draft <span class="token string">"K8s 部署最佳实践"</span> 技术 Linux K8s<span class="token comment"># 本地预览</span>blog serve <span class="token parameter variable">--drafts</span><span class="token comment"># 发布文章</span>blog publish <span class="token string">"K8s 部署最佳实践"</span><span class="token comment"># 其他命令</span>blog list          <span class="token comment"># 列出文章</span>blog stats         <span class="token comment"># 统计信息</span>blog delete draft  <span class="token comment"># 删除草稿</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><hr><h2 id="四、总结"><a class="header-anchor" href="#四、总结">¶</a> 四、总结</h2><p>通过 OpenClaw 的 Skill 系统，我把博客写作流程从 <strong>7 步手动操作</strong> 简化为 <strong>和 AI 对话</strong>：</p><table><thead><tr><th>操作</th><th>之前</th><th>现在</th></tr></thead><tbody><tr><td>创建文章</td><td><code>hexo new post</code></td><td>“帮我写篇关于 xxx 的文章”</td></tr><tr><td>预览</td><td><code>hexo server --drafts</code></td><td>“预览一下”</td></tr><tr><td>发布</td><td><code>git + hexo deploy</code>（5 步）</td><td>“发布这篇文章”</td></tr></tbody></table><h3 id="核心收获"><a class="header-anchor" href="#核心收获">¶</a> 核心收获</h3><ol><li class="lvl-3"><p><strong>OpenClaw 不只是聊天机器人</strong> — 它能真正帮你执行任务、自动化工作流</p></li><li class="lvl-3"><p><strong>和 AI 对话要清晰</strong> — 明确需求、提供上下文、多轮迭代，才能得到好结果</p></li><li class="lvl-3"><p><strong>最好的工具是 "无工具"</strong> — 用自然语言对话，比记住一堆命令更高效</p></li><li class="lvl-3"><p><strong>自动化是为了专注</strong> — 把重复的事情交给 AI，你只需要关注内容创作</p></li></ol><p>写博客应该专注于内容，而不是重复的命令。</p><hr><h2 id="参考"><a class="header-anchor" href="#参考">¶</a> 参考</h2><ul class="lvl-0"><li class="lvl-2"><p><a href="https://docs.openclaw.ai">OpenClaw 文档</a></p></li><li class="lvl-2"><p><a href="https://hexo.io">Hexo 官方文档</a></p></li><li class="lvl-2"><p><a href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly 主题</a></p></li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;OpenClaw-搭建-Hexo-博客自动化工作流&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#OpenClaw-搭建-Hexo-博客自动化工作流&quot;&gt;¶&lt;/a&gt;OpenClaw 搭建 Hexo</summary>
        
      
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="OpenClaw" scheme="https://blog.skyhive.tech/tags/OpenClaw/"/>
    
    <category term="Hexo" scheme="https://blog.skyhive.tech/tags/Hexo/"/>
    
    <category term="自动化" scheme="https://blog.skyhive.tech/tags/%E8%87%AA%E5%8A%A8%E5%8C%96/"/>
    
    <category term="AI" scheme="https://blog.skyhive.tech/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>甲癌术后一年总结</title>
    <link href="https://blog.skyhive.tech/post/1a8762b4.html"/>
    <id>https://blog.skyhive.tech/post/1a8762b4.html</id>
    <published>2026-02-24T08:19:55.000Z</published>
    <updated>2026-03-02T03:49:22.585Z</updated>
    
    <content type="html"><![CDATA[<p>距离上次割喉的经历，不知不觉已经过去了一整年。起初觉得丢了半个甲状腺，身体会变得无比脆弱，但现实却是 —— 除了每天早上雷打不动地服用小药片外，生活似乎又回到了它本来的轨道。这一年，无论是生理还是心理，都像是经历了一场地基重建。今天闲来无事，敲点键盘，给这<strong>不完整的身体</strong>的一周年做个复盘。</p><span id="more"></span><h3 id="关于嗑药与作息"><a class="header-anchor" href="#关于嗑药与作息">¶</a> 关于嗑药与作息</h3><p>对于切了一半甚至是全切甲状腺的人来说，这辈子大概率是和 <a href="https://baike.baidu.com/item/%E5%B7%A6%E7%94%B2%E7%8A%B6%E8%85%BA%E7%B4%A0%E9%92%A0%E7%89%87/8359018"><code>优甲乐</code></a> 绑定在一起了。最初了解到优甲乐的服药禁忌时，简直是一个头两个大：</p><ul class="lvl-0"><li class="lvl-2"><p>需要空腹服用</p></li><li class="lvl-2"><p>服药后至少需要间隔<strong>半小时</strong>才能吃早餐</p></li><li class="lvl-2"><p>并且<strong> 4 小时内</strong>要避免大量摄入蛋白质和对胃部刺激大的东西（比如牛奶、豆浆、鸡蛋、咖啡等）</p></li></ul><p>为了应对这种苛刻的服药条件，我现在的策略是：早上 5 点到 7 点之间，只要迷迷糊糊醒了，就随缘抓起药片吞下，然后再倒头睡个回笼觉。这样到了 9:30 到公司吃早饭时，时间间隔可以说是绰绰有余。</p><p>不过早上肯定就不能喝咖啡和吃鸡蛋了。好在我本身也不怎么爱喝咖啡，这倒是无伤大雅；至于鸡蛋，虽然和原本的健身饮食安排有些冲突，但把蛋白质的分摊挪到中午和晚上，问题也不大，权当是给自己一个更加规律饮食的借口了。</p><h3 id="关于饮食"><a class="header-anchor" href="#关于饮食">¶</a> 关于饮食</h3><p>还记得刚做完手术那两周，为了防止令人闻风丧胆的 <strong>淋巴漏</strong>，我经历了堪比苦行僧般的饮食控制：连续两周的纯水煮一切，不能沾一滴油（这里包含一切含脂肪的食物，比如豆类、坚果、肉类等）。当时 <strong>两周暴瘦十斤</strong> 的光荣战绩，至今让我记忆犹新。</p><p>而现在的我，那必然是已经满血复活了！现在的饮食已经基本恢复正常，虽然平时自己会有意识地吃得更加 “干净” 和清淡些，但遇到榴莲季的狂欢、偶尔的火锅局，该安排还是得安排。毕竟好好活着，不就是为了能多吃两口心心念念的美食嘛。这里也提一下关于甲癌术后的饮食禁忌和个人看法：</p><ul class="lvl-0"><li class="lvl-2"><p>关于含碘食物（加碘盐、海产品）：对于我这种半切患者来说，得控制好量，毕竟还有半个甲状腺在干活</p></li><li class="lvl-2"><p>关于咖啡：避开优甲乐的禁忌时间就好</p></li><li class="lvl-2"><p>关于蛋白质：避开优甲乐的禁忌时间就好</p></li><li class="lvl-2"><p>关于十字花科蔬菜：控制好量即可</p></li><li class="lvl-2"><p>火锅、炸串、烧烤等：不在意体重和其他健康指标，可以尽情享受</p></li></ul><h3 id="关于健身"><a class="header-anchor" href="#关于健身">¶</a> 关于健身</h3><p>网上有不少帖子提到，甲状腺疾病或是术后容易导致代谢变慢，从而疯狂长胖。我自己亲测下来的结论是：<strong>并没有那么夸张</strong>。只要合理安排饮食和训练，哪怕少了一半甲状腺，依然可以达到减脂的效果，而且，优甲乐的副作用可是 <strong>体重减轻</strong> 啊！！</p><p>不仅如此，术后恢复期一过，我就果断杀回了健身房，训练计划依然保持着经典的 三分化 + 小肌群 / 核心训练。就训练效果和状态来看，切掉的这半个甲状腺对我的训练并没有什么影响，该怎么练就还是怎么练，<strong>干就完了！！</strong></p><h3 id="关于复查指标"><a class="header-anchor" href="#关于复查指标">¶</a> 关于复查指标</h3><p>对于病理分析属于 <strong>高复发人群</strong> 的我来说，每次定期复查依然是一场心理上的小考。不过经过这一年的磨合，悬着的心也算是慢慢放下来了。</p><p>这一年来的甲功指标复查结果如下：</p><table><thead><tr><th style="text-align:center">时间</th><th style="text-align:center">促甲状腺激素 (TSH)</th><th style="text-align:center">甲状腺球蛋白 (TG)</th><th style="text-align:center">甲状腺球蛋白抗体 (ATGAb)</th></tr></thead><tbody><tr><td style="text-align:center"><code>2025-02-16</code></td><td style="text-align:center">0.95</td><td style="text-align:center">8.27</td><td style="text-align:center">11.51</td></tr><tr><td style="text-align:center"><code>2025-03-15</code></td><td style="text-align:center">0.47</td><td style="text-align:center">7.47</td><td style="text-align:center">10.15</td></tr><tr><td style="text-align:center"><code>2025-06-14</code></td><td style="text-align:center">0.09</td><td style="text-align:center">17.08</td><td style="text-align:center">9.37</td></tr><tr><td style="text-align:center"><code>2025-09-12</code></td><td style="text-align:center">0.25</td><td style="text-align:center">13.76</td><td style="text-align:center">8.84</td></tr><tr><td style="text-align:center"><code>2025-11-29</code></td><td style="text-align:center">0.11</td><td style="text-align:center">10.41</td><td style="text-align:center">7.65</td></tr></tbody></table><p>这里也借助 <a href="https://github.com/SkyHive/hexo-next-charts">hexo-next-charts</a> 绘制了折线图，看起来更加直观：</p><div class="hexo-next-chart-placeholder" id="echart-a4srhsj1r" data-chart="eyJ0eXBlIjoibGluZSIsInNvdXJjZSI6InRoeXJvaWRfZGF0YSIsInRpdGxlIjoi55Sy54q26IW65aSN5p+l5oyH5qCH6LaL5Yq/5Zu+IiwiaGVpZ2h0IjoiNDAwcHgiLCJzbW9vdGgiOiJ0cnVlIiwic2hvd0xlZ2VuZCI6InRydWUiLCJzaG93TGFiZWwiOiJ0cnVlIiwiYm91bmRhcnlHYXAiOiJ0cnVlIn0=" style="width: 100%; height: 400px; margin: 20px 0;"></div><p>从结果来看，我的 TSH 已经被药物成功压在了一个较低的安全水平。只要乖乖按时吃药，配合规律的作息和运动，目前的各项指标一切 OK，这也给了我一颗大大的定心丸。当然我也问过医生，因为我的瘤子比较大，有一定的淋巴转移，所以短时间内都不用考虑停药的可能了，做好优甲乐吃到死的心理准备吧~</p><h3 id="结语"><a class="header-anchor" href="#结语">¶</a> 结语</h3><p>一年的时间说长不长，说短不短。这场疾病就像是给疯狂运转的人生按了一次暂停键，提醒我重新审视身体与生活的关系。</p><p>现在的我已经习惯了脖子上的疤痕，也接纳了每天服药的日常。有了这次经历，更加觉得能每天去折腾代码、折腾 HomeLab，去健身房挑战自我，毫无负担地去吃好吃的，这本身就是一件值得感恩且极其浪漫的事。</p><p><strong>一周年打卡完毕，接下来的日子，还要继续热气腾腾地活下去！</strong></p><script>  window.HEXO_NEXT_CHARTS_DATA = window.HEXO_NEXT_CHARTS_DATA || {};  Object.assign(window.HEXO_NEXT_CHARTS_DATA, {"echart-a4srhsj1r":{"backgroundColor":"transparent","tooltip":{"trigger":"axis","axisPointer":{"type":"cross","label":{"backgroundColor":"#6a7985"}}},"toolbox":{"show":true,"orient":"vertical","left":"right","top":"center","feature":{"saveAsImage":{"show":true,"title":"保存图片"}}},"grid":{"left":"3%","right":"4%","bottom":"15%","containLabel":true},"xAxis":{"type":"category","boundaryGap":"true","data":["2025-02-16","2025-03-15","2025-06-14","2025-09-12","2025-11-29"],"axisLine":{"lineStyle":{"color":"#666"}},"axisLabel":{"color":"#666"}},"yAxis":{"type":"value","axisLine":{"show":false},"axisTick":{"show":false},"splitLine":{"lineStyle":{"color":"#eee"}},"axisLabel":{"color":"#666","margin":8}},"series":[{"name":"TSH","type":"line","smooth":true,"symbol":"circle","symbolSize":8,"lineStyle":{"width":3},"data":[0.95,0.47,0.09,0.25,0.11],"label":{"show":true,"position":"top","color":"#666"}},{"name":"TG","type":"line","smooth":true,"symbol":"circle","symbolSize":8,"lineStyle":{"width":3},"data":[8.27,7.47,17.08,13.76,10.41],"label":{"show":true,"position":"top","color":"#666"}},{"name":"ATGAb","type":"line","smooth":true,"symbol":"circle","symbolSize":8,"lineStyle":{"width":3},"data":[11.51,10.15,9.37,8.84,7.65],"label":{"show":true,"position":"top","color":"#666"}}],"legend":{"data":["TSH","TG","ATGAb"],"textStyle":{"color":"#666"},"bottom":0},"title":{"text":"甲状腺复查指标趋势图","left":"center","top":10,"textStyle":{"color":"inherit","fontSize":18}}}});  window.HEXO_NEXT_CHARTS_DATA.places = Object.assign(window.HEXO_NEXT_CHARTS_DATA.places || {}, {});</script><script src="https://cdn.jsdelivr.net/npm/echarts@6.0.0/dist/echarts.min.js"></script><script>(function() {    const mapDataPaths = {};    const charts = {};    const loadedMaps = new Set();    // CDN fallback for common maps    const cdnFallback = {"world":"https://cdn.jsdelivr.net/npm/echarts/map/js/world.js","china":"https://cdn.jsdelivr.net/npm/echarts/map/js/china.js"};    function getTheme() {        return document.documentElement.getAttribute('data-theme') ||               (document.documentElement.classList.contains('dark-mode') ? 'dark' : 'light');    }    // Load map data    async function ensureMapLoaded(mapType, mapPath) {        if (loadedMaps.has(mapType)) return true;        // Handle composite maps        if (mapPath && mapPath.composite) {            for (const [subType, subPath] of Object.entries(mapPath.maps)) {                await ensureMapLoaded(subType, subPath);            }            loadedMaps.add(mapType);            return true;        }        // Try local GeoJSON first        if (mapPath && typeof mapPath === 'string') {            try {                const response = await fetch(mapPath);                if (response.ok) {                    const geoJson = await response.json();                    echarts.registerMap(mapType, geoJson);                    loadedMaps.add(mapType);                    return true;                }            } catch (e) {                // Fallback to CDN            }        }        // Fallback to CDN        if (cdnFallback[mapType]) {            return new Promise((resolve) => {                const script = document.createElement('script');                script.src = cdnFallback[mapType];                script.onload = () => {                    loadedMaps.add(mapType);                    resolve(true);                };                script.onerror = () => resolve(false);                document.head.appendChild(script);            });        }        return false;    }    // Resolve coordinates from GeoJSON    function resolveGeoCoordinates(name, mapName) {        try {            const geoData = echarts.getMap(mapName);            if (!geoData || !geoData.geoJSON) return null;            const features = geoData.geoJSON.features || [];            // Try exact match            let feature = features.find(f =>                f.properties && (                    f.properties.name === name ||                    f.properties.NAME === name ||                    f.properties.name_zh === name ||                    f.properties.name_en === name                )            );            // Try case-insensitive            if (!feature) {                const lowerName = name.toLowerCase();                feature = features.find(f =>                    f.properties && (                        (f.properties.name || '').toLowerCase() === lowerName ||                        (f.properties.NAME || '').toLowerCase() === lowerName ||                        (f.properties.name_zh || '').toLowerCase() === lowerName ||                        (f.properties.name_en || '').toLowerCase() === lowerName                    )                );            }            if (feature && feature.properties && feature.properties.cp) {                return feature.properties.cp;            }        } catch (e) {            // Ignore errors        }        return null;    }    // Get pre-resolved place coordinates    function resolveInlinedPlace(key) {        const places = window.HEXO_NEXT_CHARTS_DATA.places || {};        return places[key] || null;    }    // Initialize all charts    async function initCharts() {        if (typeof echarts === 'undefined') {            setTimeout(initCharts, 100);            return;        }        // Load required maps        for (const [mapType, mapPath] of Object.entries(mapDataPaths)) {            await ensureMapLoaded(mapType, mapPath);        }        const data = window.HEXO_NEXT_CHARTS_DATA || {};        const theme = getTheme();        for (const id in data) {            if (id === 'places') continue;            const option = data[id];            // Process geo options            if (option.geo) {                processGeoOptions(option);            }            // Resolve coordinates for map charts            if (option.series) {                resolveSeriesCoordinates(option);            }            // Create chart instance            createChartInstance(id, option, theme);        }    }    // Process geo-specific options    function processGeoOptions(option) {        const geos = Array.isArray(option.geo) ? option.geo : [option.geo];        geos.forEach(g => {            if (g.map === 'world-cn') {                g.regions = g.regions || [];                g.regions.push({                    name: 'China_Border',                    itemStyle: {                        areaColor: 'rgba(0,0,0,0)',                        borderColor: '#333',                        borderWidth: 1.0,                        zIndex: 100                    },                    label: { show: false },                    silent: true,                    emphasis: { disabled: true },                    select: { disabled: true },                    tooltip: { show: false }                });            }        });    }    // Resolve coordinates in series data    function resolveSeriesCoordinates(option) {        option.series.forEach(series => {            if (series.data && series.coordinateSystem === 'geo') {                series.data = series.data.filter(point => {                    if (!point._needsGeoLookup) return true;                    const mapName = Array.isArray(option.geo)                        ? option.geo[0].map                        : (option.geo ? option.geo.map : 'world');                    // Try pre-resolved first                    let coords = resolveInlinedPlace(point._code) ||                                 resolveInlinedPlace(point.name);                    // Fallback to GeoJSON lookup                    if (!coords) {                        coords = resolveGeoCoordinates(point.name, mapName) ||                                 resolveGeoCoordinates(point._code, mapName);                    }                    if (coords) {                        point.value[0] = coords[0];                        point.value[1] = coords[1];                        if (point._label) {                            point.name = point._label;                        }                        delete point._needsGeoLookup;                        delete point._label;                        return true;                    }                    return false;                });            }        });    }    // Create and configure a chart instance    function createChartInstance(id, option, theme) {        const container = document.getElementById(id);        if (!container) return;        if (charts[id]) {            charts[id].dispose();        }        const chart = echarts.init(container, theme === 'dark' ? 'dark' : null);        chart.setOption(option);        charts[id] = chart;        // Setup zoom scaling for scatter points        setupZoomScaling(chart, option);        // Handle resize        window.addEventListener('resize', () => chart.resize());    }    // Setup zoom scaling for symbol sizes    function setupZoomScaling(chart, option) {        const getInitialZoom = (opt) => {            if (!opt.geo) return 1;            return Array.isArray(opt.geo)                ? (opt.geo[0].zoom || 1)                : (opt.geo.zoom || 1);        };        const initialZoom = getInitialZoom(option);        const updateSymbolSizes = () => {            const currentOption = chart.getOption();            if (!currentOption.geo || !currentOption.geo[0]) return;            const currentZoom = currentOption.geo[0].zoom;            const scale = currentZoom / initialZoom;            const newSeries = currentOption.series.map((s, idx) => {                const originalSeries = option.series[idx];                if (!originalSeries ||                    (s.type !== 'scatter' && s.type !== 'effectScatter')) {                    return s;                }                const baseSize = originalSeries.symbolSize || 4;                return {                    ...s,                    symbolSize: Math.max(2, baseSize * Math.sqrt(scale))                };            });            chart.setOption({ series: newSeries });        };        chart.on('georoam', updateSymbolSizes);        chart.on('restore', () => setTimeout(updateSymbolSizes, 100));    }    // Observe theme changes    const observer = new MutationObserver((mutations) => {        mutations.forEach((mutation) => {            if (mutation.type === 'attributes' &&                (mutation.attributeName === 'data-theme' ||                 mutation.attributeName === 'class')) {                initCharts();            }        });    });    observer.observe(document.documentElement, { attributes: true });    // Initialize on load    if (document.readyState === 'complete') {        initCharts();    } else {        window.addEventListener('load', initCharts);    }})();</script>]]></content>
    
    
    <summary type="html">&lt;p&gt;距离上次割喉的经历，不知不觉已经过去了一整年。起初觉得丢了半个甲状腺，身体会变得无比脆弱，但现实却是 —— 除了每天早上雷打不动地服用小药片外，生活似乎又回到了它本来的轨道。这一年，无论是生理还是心理，都像是经历了一场地基重建。今天闲来无事，敲点键盘，给这&lt;strong&gt;不完整的身体&lt;/strong&gt;的一周年做个复盘。&lt;/p&gt;</summary>
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="年度总结" scheme="https://blog.skyhive.tech/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
    <category term="甲状腺" scheme="https://blog.skyhive.tech/tags/%E7%94%B2%E7%8A%B6%E8%85%BA/"/>
    
    <category term="伤病" scheme="https://blog.skyhive.tech/tags/%E4%BC%A4%E7%97%85/"/>
    
  </entry>
  
  <entry>
    <title>Homelab 系列 - Jellyfin</title>
    <link href="https://blog.skyhive.tech/post/41df0ec8.html"/>
    <id>https://blog.skyhive.tech/post/41df0ec8.html</id>
    <published>2026-02-04T15:06:10.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>每一个折腾 <code>HomeLab</code> 的兄弟，最终的归宿除了用来 “压泡面” 的各种派，大概率都逃不过这两个词 —— <strong><code>NAS</code></strong> 和 <strong><code>家庭影音</code></strong>。毕竟，辛辛苦苦攒下来的 “学习资料”，总得有个像样的展示柜吧？</p><p>在开源界，<a href="https://jellyfin.org"><code>Jellyfin</code></a> 绝对是那个即使你一分钱不花，也能让你体验到 “尊贵 VIP” 待遇的神器。经过多年的调教（被坑）与折腾，这套方案现在的成熟度已经相当高了。</p><span id="more"></span><p>老规矩，先上一张架构图镇楼（没错，AI 画的，看起来是不是特别唬人？）：</p><pre><code class="mermaid">graph TD    classDef core fill:#6d28d9,stroke:#a855f7,color:white,stroke-width:2px    classDef client fill:#2563eb,stroke:#60a5fa,color:white,stroke-width:2px    classDef media fill:#0f766e,stroke:#06b6d4,color:white,stroke-width:2px    classDef plugin fill:#c2410c,stroke:#fb923c,color:white,stroke-width:2px    classDef external fill:#475569,stroke:#94a3b8,color:white,stroke-width:2px    classDef func fill:#1e40af,stroke:#3b82f6,color:white,stroke-width:2px    subgraph "🌐 客户端层"        A[Web客户端]:::client        B[移动应用]:::client        C[TV端]:::client        D[桌面程序]:::client    end    subgraph "🚀 核心服务层"        E[API网关]:::core        F[认证授权]:::core        G[媒体引擎]:::core        H[插件管理器]:::core    end    subgraph "🎬 媒体处理层"        I[智能转码]:::media        J[元数据管理]:::media        K[字幕服务]:::media        L[章节分析]:::media    end    subgraph "🔌 插件生态"        M[主题引擎]:::plugin        N[元数据刮削]:::plugin        O[通知服务]:::plugin        P[播放器扩展]:::plugin    end    subgraph "🔗 外部系统"        Q[存储系统]:::external        R[直播源]:::external        S[DVR服务]:::external        T[云同步]:::external    end    A &amp; B &amp; C &amp; D --&gt; E    E --&gt; F &amp; G &amp; H    G --&gt; I &amp; J &amp; K &amp; L    H --&gt; M &amp; N &amp; O &amp; P    G --&gt; Q    R --&gt; S    G --&gt; T</code></pre><p>从图中可以看到 <code>Jellyfin</code> 的功能特点总结为如下几点：</p><ol><li class="lvl-3"><p><strong>全平台客户端</strong>：Web/手机/TV/桌面，进度云端同步</p></li><li class="lvl-3"><p><strong>实时硬件转码</strong>：NVENC/QSV/VAAPI，带宽自适应</p></li><li class="lvl-3"><p><strong>自动媒体整理</strong>：TMDB 元数据 + 章节点生成，一键刮削海报与字幕</p></li><li class="lvl-3"><p><strong>多用户家庭共享</strong>：分级权限、家长控制、离线缓存</p></li><li class="lvl-3"><p><strong>插件扩展</strong>：主题、通知、第三方元数据，热插拔即装即用</p></li><li class="lvl-3"><p><strong>开源</strong>：本地部署，无数据泄露风险，无需付费</p></li></ol><h3 id="部署"><a class="header-anchor" href="#部署">¶</a> 部署</h3><p>详细的部署方式多如牛毛，官方文档写得也很细。但在 2024 年（或者未来），<strong>Docker</strong> 绝对是首选。为什么？因为我们有洁癖，不想把宿主机搞得乱七八糟。</p><p>直接上 <code>docker-compose.yaml</code>，复制粘贴即可食用：</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">services</span><span class="token punctuation">:</span>  <span class="token key atrule">jellyfin</span><span class="token punctuation">:</span>    <span class="token key atrule">image</span><span class="token punctuation">:</span> jellyfin/jellyfin<span class="token punctuation">:</span>10.11.5    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> jellyfin    <span class="token key atrule">restart</span><span class="token punctuation">:</span> unless<span class="token punctuation">-</span>stopped    <span class="token key atrule">environment</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> TZ=Asia/Shanghai      <span class="token punctuation">-</span> JELLYFIN_PublishedServerUrl=http<span class="token punctuation">:</span>//&lt;你宿主机 IP 地址<span class="token punctuation">&gt;</span>    <span class="token key atrule">ports</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">"8096:8096/tcp"</span>      <span class="token punctuation">-</span> <span class="token string">"7359:7359/udp"</span>    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> /volume1/mnt/data/jellyfin/config<span class="token punctuation">:</span>/config      <span class="token punctuation">-</span> /volume1/mnt/data/jellyfin/cache<span class="token punctuation">:</span>/cache      <span class="token comment"># 这里挂载你的媒体文件目录</span>      <span class="token punctuation">-</span> /volume1/Documentary<span class="token punctuation">:</span>/media/documentary<span class="token punctuation">:</span>ro      <span class="token punctuation">-</span> /volume1/Movie<span class="token punctuation">:</span>/media/movie<span class="token punctuation">:</span>ro      <span class="token punctuation">-</span> /volume1/Series<span class="token punctuation">:</span>/media/series<span class="token punctuation">:</span>ro      <span class="token punctuation">-</span> /volume1/Villa<span class="token punctuation">:</span>/media/villa<span class="token punctuation">:</span>ro    <span class="token comment"># 硬件加速</span>    <span class="token comment"># devices:</span>    <span class="token comment">#   - /dev/dri:/dev/dri</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="配置"><a class="header-anchor" href="#配置">¶</a> 配置</h3><p>详细的配置文档可以参考 <a href="https://jellyfin.org/docs/general/post-install/setup-wizard/">Jellyfin Post-Install Setup</a> 和 <a href="https://jellyfin.org/docs/general/administration/configuration">Jellyfin Administration Configuration</a>，这里仅记录一些常用的配置。</p><h4 id="面子工程"><a class="header-anchor" href="#面子工程">¶</a> 面子工程</h4><p>俗话说得好，<strong>颜值即正义</strong>。功能再强大，长得像 Windows 98 也是不行的。好在 <code>Jellyfin</code> 底子不错，稍微打扮一下就能 “艳压群芳”。在此基础之上还提供了两个方案：</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://jellyfin.org/docs/general/clients/css-customization/">自定义 CSS</a></p></li><li class="lvl-2"><p><a href="https://jellyfin.org/docs/general/server/plugins/">插件</a>：这里推荐一个用的比较多的插件 – <a href="https://github.com/danieladov/jellyfin-plugin-skin-manager">Skin Manager</a></p></li></ul><p>我个人目前使用的是自定义 <code>CSS</code> 的方式，轻量且简单，使用别人写好的 <code>CSS</code> 都不需要做什么额外的配置，可参考下方配置</p><pre class="line-numbers language-css" data-language="css"><code class="language-css"><span class="token atrule"><span class="token rule">@import</span> <span class="token url"><span class="token function">url</span><span class="token punctuation">(</span><span class="token string url">"https://cdn.jsdelivr.net/gh/lscambo13/ElegantFin@main/Theme/ElegantFin-jellyfin-theme-build-latest-minified.css"</span><span class="token punctuation">)</span></span><span class="token punctuation">;</span></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>除了对界面进行美化之外，还有个插件可以在主页 <code>Banner</code> 实现随机推荐，效果也是一级棒。感兴趣的可以移步 <a href="https://github.com/IAmParadox27/jellyfin-plugin-media-bar">Media Bar</a>，这个项目是从 <a href="https://github.com/MakD/Jellyfin-Media-Bar">Jellyfin-Media-Bar</a> Fork 二开而来，配置简单，只需要如下几步即可：</p><ol><li class="lvl-3"><p>将 <code>https://www.iamparadox.dev/jellyfin/plugins/manifest.json</code> 添加至 Plugin Repository</p></li><li class="lvl-3"><p>安装 <code>Media Bar</code> 和 <code>File Transformation</code> 两个插件（注意，<code>Jellyfin</code> 的版本要求在 <code>10.10.7</code> 以上）</p></li><li class="lvl-3"><p>重启 <code>Jellyfin</code> 服务</p></li></ol><p>这时你就能够在首页看到自定义的 <code>CSS</code> 和 <code>Media Bar</code> 的效果了</p><p>下面放几张图给大家看看效果</p><p><img src="https://blogpic.skyhive.tech/pic/jellyfin/banner.png" alt="首页 Banner"><br><img src="https://blogpic.skyhive.tech/pic/jellyfin/movie_wall.png" alt="电影墙"><br><img src="https://blogpic.skyhive.tech/pic/jellyfin/detail_page.png" alt="美化效果"></p><h4 id="媒体库配置"><a class="header-anchor" href="#媒体库配置">¶</a> 媒体库配置</h4><p>按照我个人的习惯，将媒体库分成了四个部分 —— <code>电影</code>、<code>电视剧</code>、<code>纪录片</code>，以及那个<strong>只可意会不可言传</strong>的 <code>九公斤</code>。分别对应 <code>Movie</code>、<code>Series</code>、<code>Documentary</code> 以及 <code>Villa</code> 四个挂载进来的目录。</p><blockquote><p><code>九公斤</code> 到底是什么？咳咳，这是一个关于<strong>成人向</strong>的深奥话题，为了保持本文的纯洁性，咱们留到后续的某篇文章中再单独探讨。</p></blockquote><p>说回正经的，其实你大可以将 <code>纪录片</code> 和 <code>电视剧</code> 合并在一个目录里，由于我在存储的时候就已经分开，这里我也分开配置了。</p><p>媒体库的基础配置如下：</p><ul class="lvl-0"><li class="lvl-2"><p>首选下载语言：<code>Chinese</code></p></li><li class="lvl-2"><p>国家 / 地区：<code>People's Republic of China</code></p></li><li class="lvl-2"><p>优先使用内置的标题而不是文件名：<strong>开启</strong></p></li><li class="lvl-2"><p>启用实时监控：<strong>开启</strong></p></li><li class="lvl-2"><p>自动添加到合集：<strong>开启</strong></p></li><li class="lvl-2"><p>自动从互联网获取元数据并刷新：<strong>每 30 天</strong></p></li><li class="lvl-2"><p>元数据存储方式：<strong>NFO</strong></p></li><li class="lvl-2"><p>将媒体图像保存到媒体所在文件夹：<strong>开启</strong></p></li><li class="lvl-2"><p>保存字幕到媒体所在文件夹：<strong>开启</strong></p></li></ul><p>除此之外，还需要额外再配置两个插件来完成 <strong>刮削</strong> 和 <strong>字幕下载</strong> 的功能</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://github.com/cxfksword/jellyfin-plugin-metashark">Metashark</a></p></li><li class="lvl-2"><p><a href="https://github.com/91270/MeiamSubtitles">MeiamSubtitles</a></p></li></ul><blockquote><p>想要拥有一面完美的 “海报墙”，光靠插件是不够的。<strong>文件的命名规范</strong>、<strong>目录结构</strong>以及 <strong>刮削的调教</strong> 都是一门玄学。</p><p>这部分内容实在太过于庞大（且充满了踩坑血泪史），所以我决定将其剥离出来，作为 <code>HomeLab</code> 系列的独立篇章。</p><p>今天，为了让大家先跑起来，我们只进行最基础的<em>能用就行</em>的配置。</p></blockquote><p>先说两个插件的安装：</p><ol><li class="lvl-3"><p>Step1：分别在 Plugin Repository 添加如下地址：</p><ul class="lvl-2"><li class="lvl-5">MetaShark（由国内加速地址和国外地址，大家按需选择）：<ul class="lvl-4"><li class="lvl-7">国内加速地址：<code>https://ghfast.top/https://github.com/cxfksword/jellyfin-plugin-metashark/releases/download/manifest/manifest_cn.json</code></li><li class="lvl-7">国外地址：<code>https://github.com/cxfksword/jellyfin-plugin-metashark/releases/download/manifest/manifest.json</code></li></ul></li><li class="lvl-5">MeiamSubtitles：<code>https://github.com/91270/MeiamSubtitles.Release/raw/main/Plugin/manifest-stable.json</code></li></ul></li><li class="lvl-3"><p>Step2：安装插件 – <code>MetaShark</code>、<code>MeiamSub.Thunder</code> 和 <code>MeiamSub.Shooter</code></p></li><li class="lvl-3"><p>Step3：重启 <code>Jellyfin</code> 服务</p></li></ol><p>在媒体库中的配置就可以加入这两个插件相关的配置了：</p><ul class="lvl-0"><li class="lvl-2"><p>字幕下载器勾选：<code>MeiamSub.Thunder</code>、<code>MeiamSub.Shooter</code></p></li><li class="lvl-2"><p>元数据下载器和图片获取器勾选：<code>MetaShark</code></p></li></ul><h4 id="转码配置"><a class="header-anchor" href="#转码配置">¶</a> 转码配置</h4><p><code>Jellyfin</code> 支持多种解码方式，具体可参考 <a href="https://jellyfin.org/docs/general/post-install/transcoding/hardware-acceleration/">Jellyfin Transcoding</a> 中的内容，我们这里简单说说配置。根据官方文档提供的内容，整理出如下的硬件加速方案，大家根据你们 Jellyfin 部署的平台进行选择。</p><table><thead><tr><th>显卡品牌</th><th>推荐加速方式 (Linux)</th><th>推荐加速方式 (Windows)</th></tr></thead><tbody><tr><td>Intel (核显 / 独显)</td><td>QSV (Quick Sync) 或 VA - API</td><td>QSV</td></tr><tr><td>NVIDIA (英伟达)</td><td>NVENC/NVDEC</td><td>NVENC</td></tr><tr><td>AMD</td><td>VA-API</td><td>AMF</td></tr><tr><td>Apple (Mac)</td><td>Video Toolbox</td><td>Video Toolbox</td></tr><tr><td>Rockchip (瑞芯微)</td><td>RKMPP</td><td>N/A</td></tr></tbody></table><p>这里还有一个概念，即 <strong>完全加速</strong> 和 <strong>部分加速</strong>。一个完整的转码过程包含多个阶段，我们的目标是让这些阶段全都使用 GPU 去完成，这样不仅节省了 CPU 的资源，同时也节省了 GPU 与 CPU 之间的数据交互（即 <strong>零拷贝</strong>），转码阶段参考如下：</p><ol><li class="lvl-3"><p>解码（Decode）：读取原视频</p></li><li class="lvl-3"><p>处理（Scaling/Tone-mapping）：缩放分辨率、<code>HDR</code> 转 <code>SDR</code> 色彩映射</p></li><li class="lvl-3"><p>编码（Encode）：压缩成目标格式</p></li></ol><p>但是某些老的显卡只支持解码而不支持编码，这就是 <strong>部分加速</strong>。</p><div class="note warning no-icon flat"><p><strong>对于一些限制和建议：</strong></p><ul class="lvl-0"><li class="lvl-2"><strong>H.264 10-bit</strong>：官网文档里提到的几乎所有的 Intel、NVIDIA 和 AMD 显卡都不支持 <code>H.264 10-bit</code> 的硬件编码，如果遇到这种视频，系统会自动回退到 CPU 解码。建议优先使用 <code>H.265 (HEVC) 10-bit</code> 格式</li><li class="lvl-2"><strong>HDR 色彩映射</strong>：如果你的设备是 HDR 的，但播放端（如旧手机或电脑）不支持 HDR，Jellyfin 可以通过显卡进行 <strong><a href="https://jellyfin.org/docs/general/post-install/transcoding/hardware-acceleration/#hardware-accelerated-tone-mapping">硬件色调映射 (Tone-mapping)</a></strong>，将 <code>HDR</code> 画面完美转换为 <code>SDR</code>，防止画面发灰</li><li class="lvl-2"><strong>树莓派用户</strong>：文档提到由于<strong>树莓派 5</strong> 删除了硬件编码器，Jellyfin 已经弃用了对树莓派的 <code>V4L2</code> 硬件加速支持，未来可能会出现兼容性问题</li></ul></div><div class="note success no-icon flat"><p><strong>一些性能优化</strong>：</p><ul class="lvl-0"><li class="lvl-2">内存： 如果你使用的是 Intel 或 AMD 的核显，建议组建双通道内存，这能显著提升显存带宽。</li><li class="lvl-2">缓存： 转码会产生大量临时文件，建议将转码暂存目录设置在 <code>SSD</code> 上，避免机械硬盘成为瓶颈。</li></ul></div><p>说到这里，不得不提一下我那令人心碎的配置。</p><p>虽然我的 CPU <strong>i3-7300T</strong> 自带了相当不错的核显，本应在转码界大杀四方。但遗憾的是，当初为了追求 Server 级的稳定性，我选了 <strong>Supermicro X11SSL-F</strong> 主板。这块主板搭载的 <code>Intel® C232</code> 芯片组，极其高冷地屏蔽了核显功能。</p><p>所以，上述那些酷炫的硬件加速功能，我一个都用不了。每当我在外面看 4K 视频时，我的 CPU 都在机箱里默默流泪（疯狂满载）。<strong>大家装机时千万避坑！</strong></p><h4 id="Nginx-配置"><a class="header-anchor" href="#Nginx-配置">¶</a>Nginx 配置</h4><p>如果需要使用域名进行访问，可以参考官网文档 – <a href="https://jellyfin.org/docs/general/post-install/networking/reverse-proxy/nginx#nginx-from-a-subdomain-jellyfinexampleorg">Nginx 配置</a></p><p>这一段配置比较长，如果你看着眼晕，可以直接 CV 大法（Copy &amp; Paste）。</p><details><summary>点击展开查看 Nginx 详细配置</summary><pre class="line-numbers language-nginx" data-language="nginx"><code class="language-nginx"><span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>    <span class="token directive"><span class="token keyword">listen</span> <span class="token number">80</span></span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">listen</span> [::]:80</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">server_name</span> jellyfin.skyhive.tech</span><span class="token punctuation">;</span>    <span class="token comment"># Uncomment to redirect HTTP to HTTPS</span>    <span class="token directive"><span class="token keyword">return</span> <span class="token number">301</span> https://<span class="token variable">$host</span><span class="token variable">$request_uri</span></span><span class="token punctuation">;</span><span class="token punctuation">}</span><span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>    <span class="token directive"><span class="token keyword">listen</span> <span class="token number">443</span> ssl http2</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">listen</span> [::]:443 ssl http2</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">server_name</span> jellyfin.skyhive.tech</span><span class="token punctuation">;</span><span class="token comment">#NGINX_START</span>    <span class="token comment">## The default `client_max_body_size` is 1M, this might not be enough for some posters, etc.</span>    <span class="token directive"><span class="token keyword">client_max_body_size</span> <span class="token number">100M</span></span><span class="token punctuation">;</span>    <span class="token comment"># use a variable to store the upstream proxy</span>    <span class="token comment"># in this example we are using a hostname which is resolved via DNS</span>    <span class="token comment"># (if you aren't using DNS remove the resolver line and change the variable to point to an IP address e.g `set $jellyfin 127.0.0.1`)</span>    <span class="token directive"><span class="token keyword">set</span> <span class="token variable">$jellyfin</span> &lt;JELLYFIN_IP&gt;</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">resolver</span> 127.0.0.1 valid=30</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">ssl_certificate</span> /etc/nginx/ssl/full.pem</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">ssl_certificate_key</span> /etc/nginx/ssl/key.pem</span><span class="token punctuation">;</span>    <span class="token comment">#include /etc/letsencrypt/options-ssl-nginx.conf;</span>    <span class="token comment">#ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;</span>    <span class="token directive"><span class="token keyword">add_header</span> Strict-Transport-Security <span class="token string">"max-age=31536000"</span> always</span><span class="token punctuation">;</span>    <span class="token comment">#ssl_trusted_certificate /etc/letsencrypt/live/DOMAIN_NAME/chain.pem;</span>    <span class="token comment">#ssl_stapling on;</span>    <span class="token comment">#ssl_stapling_verify on;</span>    <span class="token comment"># Security / XSS Mitigation Headers</span>    <span class="token comment"># NOTE: X-Frame-Options may cause issues with the webOS app</span>    <span class="token directive"><span class="token keyword">add_header</span> X-Frame-Options <span class="token string">"SAMEORIGIN"</span></span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">add_header</span> X-XSS-Protection <span class="token string">"1; mode=block"</span></span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">add_header</span> X-Content-Type-Options <span class="token string">"nosniff"</span></span><span class="token punctuation">;</span>    <span class="token comment"># Content Security Policy</span>    <span class="token comment"># See: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP</span>    <span class="token comment"># Enforces https content and restricts JS/CSS to origin</span>    <span class="token comment"># External Javascript (such as cast_sender.js for Chromecast) must be whitelisted.</span>    <span class="token comment"># NOTE: The default CSP headers may cause issues with the webOS app</span>    <span class="token comment">#add_header Content-Security-Policy "default-src https: data: blob: http://image.tmdb.org; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' https://www.gstatic.com/cv/js/sender/v1/cast_sender.js https://www.gstatic.com/eureka/clank/95/cast_sender.js https://www.gstatic.com/eureka/clank/96/cast_sender.js https://www.gstatic.com/eureka/clank/97/cast_sender.js https://www.youtube.com blob:; worker-src 'self' blob:; connect-src 'self'; object-src 'none'; frame-ancestors 'self'";</span>    <span class="token directive"><span class="token keyword">location</span> = /</span> <span class="token punctuation">{</span>        <span class="token directive"><span class="token keyword">return</span> <span class="token number">302</span> http://<span class="token variable">$host</span>/web/</span><span class="token punctuation">;</span>        <span class="token comment">#return 302 https://$host/web/;</span>    <span class="token punctuation">}</span>    <span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>        <span class="token comment"># Proxy main Jellyfin traffic</span>        <span class="token directive"><span class="token keyword">proxy_pass</span> http://<span class="token variable">$jellyfin</span>:8096</span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> Host <span class="token variable">$host</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Real-IP <span class="token variable">$remote_addr</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-For <span class="token variable">$proxy_add_x_forwarded_for</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Proto <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Protocol <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Host <span class="token variable">$http_host</span></span><span class="token punctuation">;</span>        <span class="token comment"># Disable buffering when the nginx proxy gets very resource heavy upon streaming</span>        <span class="token directive"><span class="token keyword">proxy_buffering</span> <span class="token boolean">off</span></span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token comment"># location block for /web - This is purely for aesthetics so /web/#!/ works instead of having to go to /web/index.html/#!/</span>    <span class="token directive"><span class="token keyword">location</span> = /web/</span> <span class="token punctuation">{</span>        <span class="token comment"># Proxy main Jellyfin traffic</span>        <span class="token directive"><span class="token keyword">proxy_pass</span> http://<span class="token variable">$jellyfin</span>:8096/web/index.html</span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> Host <span class="token variable">$host</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Real-IP <span class="token variable">$remote_addr</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-For <span class="token variable">$proxy_add_x_forwarded_for</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Proto <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Protocol <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Host <span class="token variable">$http_host</span></span><span class="token punctuation">;</span>    <span class="token punctuation">}</span>    <span class="token directive"><span class="token keyword">location</span> /socket</span> <span class="token punctuation">{</span>        <span class="token comment"># Proxy Jellyfin Websockets traffic</span>        <span class="token directive"><span class="token keyword">proxy_pass</span> http://<span class="token variable">$jellyfin</span>:8096</span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_http_version</span> 1.1</span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> Upgrade <span class="token variable">$http_upgrade</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> Connection <span class="token string">"upgrade"</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> Host <span class="token variable">$host</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Real-IP <span class="token variable">$remote_addr</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-For <span class="token variable">$proxy_add_x_forwarded_for</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Proto <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Protocol <span class="token variable">$scheme</span></span><span class="token punctuation">;</span>        <span class="token directive"><span class="token keyword">proxy_set_header</span> X-Forwarded-Host <span class="token variable">$http_host</span></span><span class="token punctuation">;</span>    <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></details><hr><h3 id="最后碎碎念"><a class="header-anchor" href="#最后碎碎念">¶</a> 最后碎碎念</h3><p>折腾 Jellyfin 的过程，其实就是不断满足自己收藏癖的过程。看着海报墙一点点填满，那种成就感或许只有 Homelab 玩家才懂。</p><p>那么家庭影音的部分肯定也不会就到此为止了，刮削才是重头戏，未来还会继续更新以下内容：</p><ol><li class="lvl-4"><p><strong>从入门到入土：Jellyfin 完美刮削指南</strong>：教你如何整治那些乱七八糟的文件名。</p></li><li class="lvl-4"><p><strong>Metashark 调教手册</strong>：让你的海报墙不再有 “缺如”。</p></li><li class="lvl-4"><p><strong>神秘的 九公斤 目录</strong>：教育资料如何刮削整理？</p></li></ol><p>别急，后续慢慢更新 🤫。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;每一个折腾 &lt;code&gt;HomeLab&lt;/code&gt; 的兄弟，最终的归宿除了用来 “压泡面” 的各种派，大概率都逃不过这两个词 —— &lt;strong&gt;&lt;code&gt;NAS&lt;/code&gt;&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;家庭影音&lt;/code&gt;&lt;/strong&gt;。毕竟，辛辛苦苦攒下来的 “学习资料”，总得有个像样的展示柜吧？&lt;/p&gt;
&lt;p&gt;在开源界，&lt;a href=&quot;https://jellyfin.org&quot;&gt;&lt;code&gt;Jellyfin&lt;/code&gt;&lt;/a&gt; 绝对是那个即使你一分钱不花，也能让你体验到 “尊贵 VIP” 待遇的神器。经过多年的调教（被坑）与折腾，这套方案现在的成熟度已经相当高了。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="jellyfin" scheme="https://blog.skyhive.tech/tags/jellyfin/"/>
    
    <category term="nas" scheme="https://blog.skyhive.tech/tags/nas/"/>
    
  </entry>
  
  <entry>
    <title>HomeLab 系列 - VPN</title>
    <link href="https://blog.skyhive.tech/post/11841089.html"/>
    <id>https://blog.skyhive.tech/post/11841089.html</id>
    <published>2025-11-03T02:13:13.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>原本路由器上的 <code>Openwrt</code> 已经自带了 <code>OpenVPN Server</code>，但是最近有需要开多账号给同事来访问家里的服务器资源，索性就稍稍改造一下，让 <code>OpenVPN</code> 支持多用户登录，顺便结合上一篇 <a href="https://blog.skyhive.tech/post/cb650389.html">HomeLab 系列 - 认证 (上)</a> 用 LLDAP 管理用户。</p><span id="more"></span><h2 id="选型"><a class="header-anchor" href="#选型">¶</a> 选型</h2><p><a href="https://github.com/OpenVPN/openvpn">OpenVPN</a> 是一个老牌的开源 VPN 系统了，中心化的网络要求你必须得有一个公网 IP 地址，如果没有 IP 地址的可以尝试使用 <a href="https://www.zerotier.com/">Zerotier</a> 这种解决方案。</p><p>那么言归正传，<code>OpenVPN</code> 和 <code>OpenVPN-AS(Access Server)</code> 的部署在网上有很多，简单说下区别：</p><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">OpenVPN (社区版)</th><th style="text-align:left">OpenVPN Access Server (企业版)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>核心性质</strong></td><td style="text-align:left">开源的底层协议和软件</td><td style="text-align:left">基于开源核心的商业产品</td></tr><tr><td style="text-align:left"><strong>授权模式</strong></td><td style="text-align:left">完全免费</td><td style="text-align:left"><strong>按并发连接数收费</strong>，提供免费 2 个连接</td></tr><tr><td style="text-align:left"><strong>安装配置</strong></td><td style="text-align:left"><strong>复杂</strong>：手动编辑配置文件、管理证书、设置路由和防火墙。</td><td style="text-align:left"><strong>极简</strong>：基于 Web 的图形化界面，几分钟内即可完成部署。</td></tr><tr><td style="text-align:left"><strong>用户管理</strong></td><td style="text-align:left">手动为每个用户生成证书和配置文件。</td><td style="text-align:left">内置用户管理系统，支持本地用户、数据库（LDAP / AD）集成。</td></tr><tr><td style="text-align:left"><strong>管理方式</strong></td><td style="text-align:left">命令行 + 文本编辑器</td><td style="text-align:left">强大的 Web 管理后台和用户门户</td></tr><tr><td style="text-align:left"><strong>功能和生态</strong></td><td style="text-align:left">核心 VPN 功能，高度灵活，依赖社区插件。</td><td style="text-align:left"><strong>开箱即用</strong>：内置负载均衡、日志审计、双因子认证、会话监控、客户端分发等。</td></tr><tr><td style="text-align:left"><strong>支持</strong></td><td style="text-align:left">社区论坛、邮件列表</td><td style="text-align:left">官方的技术支持和维护服务</td></tr><tr><td style="text-align:left"><strong>适合场景</strong></td><td style="text-align:left">技术人员、爱好者、有特定自定义需求的企业、成本敏感的项目。</td><td style="text-align:left">寻求快速部署、易用性、集中管理和企业级功能的中小企业至大型企业。</td></tr></tbody></table><p>当然 <code>OepnVPN-AS</code> 在网上也有很多不要钱的方案，大家可以自行搜寻（但不鼓励），而 <code>OpenVPN</code> 本身也带有 auth 的功能，如果运用得当，在家庭环境下使用也是绰绰有余了。那么有没有一个可以集成 LDAP、自带 WebUI、还能对客户端 / 配置进行管理的开源项目呢？有的，兄弟，有的：<a href="https://github.com/GavinTan/openvpn">GavinTan/openvpn</a>，我只能说天底下还是好人多啊</p><p>这是个国人开源的项目，目前支持如下功能：</p><ul class="lvl-0"><li class="lvl-2"><p>账号管理</p></li><li class="lvl-2"><p>证书管理</p></li><li class="lvl-2"><p><code>IPv6</code> 支持</p></li><li class="lvl-2"><p><code>LDAP</code> 支持</p></li><li class="lvl-2"><p><code>MFA</code> 支持</p></li><li class="lvl-2"><p>连接历史记录</p></li><li class="lvl-2"><p>VPN 账号固定 IP</p></li><li class="lvl-2"><p>在线编辑 <code>server.conf</code></p></li><li class="lvl-2"><p>在线重启 <code>OpenVPN</code> 服务</p></li><li class="lvl-2"><p>一键生成客户端 &amp; <code>CCD</code> 配置文件</p></li></ul><h2 id="部署"><a class="header-anchor" href="#部署">¶</a> 部署</h2><p>详细安装文档请参考项目本身 <a href="https://github.com/GavinTan/openvpn">README</a>，这里仅讨论我家里环境所需要的配置。现在开始分析一下架构和需求：</p><ul class="lvl-0"><li class="lvl-2"><p>需要使用 LDAP 管理用户，那么直接使用上篇文章部署好的 <a href="https://blog.skyhive.tech/post/cb650389.html">LLDAP</a></p></li><li class="lvl-2"><p>需要部署在 Docker 中，并且客户端可以访问家里的网络环境</p></li></ul><p>简单画一下架构图</p><pre><code class="mermaid">flowchart TB    A(🏠 家庭网络用户&lt;br/&gt;手机/电脑/平板)    B{🔒 OpenVPN&lt;br/&gt;GavinTan/openvpn}    C[(👥 LLDAP&lt;br/&gt;认证服务器)]    D[💾 NAS]    E[🖥️ App01&lt;/br&gt; Confluence / immich]    F[🖥️ App02&lt;/br&gt; Gitea]    G[📱 IoT设备]    H{🌍 远程VPN用户}    I(🔗 VPN网络&lt;br/&gt;10.8.0.0/24)    subgraph 家庭网络 192.168.2.0/24        A -.-&gt; D &amp; E &amp; F &amp; G        subgraph Infra Host            B --&gt; C        end    end    subgraph Internet        H    end    subgraph OpenVPN 虚拟网络 10.8.0.0/24        I    end    H --&gt;|1. VPN加密隧道| B    B --&gt;|3. 访问内网服务| D    B --&gt;|3. 访问内网服务| E    B --&gt;|3. 访问内网服务| F    classDef infra fill:#66666666,stroke:#ffd700,stroke-width:2px,color:#ffd700;    classDef service fill:#228b2266,stroke:#32cd32,color:#90ee90;    classDef vpn fill:#4169e166,stroke:#6495ed,color:#87cefa;    classDef iot fill:#80808066,stroke:#a9a9a9,color:#c0c0c0;    classDef user fill:#9370db66,stroke:#ba55d3,color:#dda0dd;    classDef database fill:#8b451366,stroke:#daa520,color:#f4a460;    class B infra;    class C database;    class D,E,F service;    class G iot;    class H,I vpn;    class A user;</code></pre><p>那么下面开始部署：</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">services</span><span class="token punctuation">:</span>  <span class="token key atrule">openvpn</span><span class="token punctuation">:</span>    <span class="token key atrule">image</span><span class="token punctuation">:</span> yyxx/openvpn    <span class="token key atrule">cap_add</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> NET_ADMIN    <span class="token key atrule">ports</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">"1194:1194"</span>      <span class="token punctuation">-</span> <span class="token string">"8833:8833"</span> <span class="token comment"># Web UI 端口</span>    <span class="token key atrule">environment</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> TZ=Asia/Shanghai      <span class="token punctuation">-</span> ADMIN_USERNAME=admin      <span class="token punctuation">-</span> ADMIN_PASSWORD=&lt;ADMIN_PASSWORD<span class="token punctuation">&gt;</span>      <span class="token punctuation">-</span> OVPN_PROTO=tcp      <span class="token punctuation">-</span> OVPN_GATEWAY=false      <span class="token punctuation">-</span> OVPN_LDAP_AUTH=true      <span class="token punctuation">-</span> ENV_UPDATE_CONFIG=false      <span class="token punctuation">-</span> LDAP_URL=ldap<span class="token punctuation">:</span>//&lt;INTERNAL_IP<span class="token punctuation">&gt;</span><span class="token punctuation">:</span><span class="token number">3890</span>      <span class="token punctuation">-</span> LDAP_BASE_DN=ou=people<span class="token punctuation">,</span>dc=skyhive<span class="token punctuation">,</span>dc=com      <span class="token punctuation">-</span> LDAP_BIND_USER_DN=UID=lldap<span class="token punctuation">,</span>ou=people<span class="token punctuation">,</span>dc=skyhive<span class="token punctuation">,</span>dc=com      <span class="token punctuation">-</span> LDAP_BIND_PASSWORD=<span class="token important">*********</span>      <span class="token punctuation">-</span> LDAP_USER_GROUP_DN=cn=openvpn<span class="token punctuation">,</span>ou=groups<span class="token punctuation">,</span>dc=skyhive<span class="token punctuation">,</span>dc=com    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> ./data<span class="token punctuation">:</span>/data      <span class="token punctuation">-</span> /etc/localtime<span class="token punctuation">:</span>/etc/localtime<span class="token punctuation">:</span>ro    <span class="token key atrule">networks</span><span class="token punctuation">:</span>      <span class="token key atrule">openvpn_net</span><span class="token punctuation">:</span>        <span class="token key atrule">ipv4_address</span><span class="token punctuation">:</span> 192.168.200.2<span class="token key atrule">networks</span><span class="token punctuation">:</span>  <span class="token key atrule">openvpn_net</span><span class="token punctuation">:</span>    <span class="token key atrule">driver</span><span class="token punctuation">:</span> bridge    <span class="token key atrule">ipam</span><span class="token punctuation">:</span>      <span class="token key atrule">config</span><span class="token punctuation">:</span>        <span class="token punctuation">-</span> <span class="token key atrule">subnet</span><span class="token punctuation">:</span> 192.168.200.0/24          <span class="token key atrule">gateway</span><span class="token punctuation">:</span> 192.168.200.1<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里有几点需要注意：</p><ol><li class="lvl-3"><p>家庭网络使用 <code>UDP</code> 作为 VPN 的连接容易出问题，因此我这里改成了 TCP</p></li><li class="lvl-3"><p>由于我需要修改 <code>server.conf</code>，因此将 <code>ENV_UPDATE_CONFIG</code> 配置为 false</p></li><li class="lvl-3"><p><code>LLDAP</code> 中创建的 group 都在 <code>ou=groups</code> 下</p></li><li class="lvl-3"><p>我特地将 <code>OpenVPN Server</code> 的容器网络固定在了 <code>192.168.200.0/24</code>，是为了方便后续配置其他东西</p></li><li class="lvl-3"><p>默认的 VPN 网络为 <code>10.8.0.0/24</code></p></li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">## 先开启 openvpn 所在主机的路由转发</span><span class="token function">sudo</span> <span class="token parameter variable">-i</span><span class="token builtin class-name">echo</span> <span class="token string">'net.ipv4.ip_forward=1'</span> <span class="token operator">&gt;&gt;</span> /etc/sysctl.conf<span class="token function">sysctl</span> <span class="token parameter variable">-p</span><span class="token comment">## 配置 iptables</span><span class="token comment"># ⚠️ 将 eth0 替换为宿主机实际的 LAN 网卡名称！</span><span class="token function">sudo</span> iptables <span class="token parameter variable">-t</span> nat <span class="token parameter variable">-A</span> POSTROUTING <span class="token parameter variable">-s</span> <span class="token number">10.8</span>.0.0/24 <span class="token parameter variable">-o</span> eth0 <span class="token parameter variable">-j</span> MASQUERADE<span class="token comment"># 允许来自 VPN 子网的流量被转发</span><span class="token function">sudo</span> iptables <span class="token parameter variable">-A</span> FORWARD <span class="token parameter variable">-s</span> <span class="token number">10.8</span>.0.0/24 <span class="token parameter variable">-j</span> ACCEPT<span class="token comment"># 允许目标是 VPN 子网的流量被转发 (用于 LAN 设备访问 VPN 客户端)</span><span class="token function">sudo</span> iptables <span class="token parameter variable">-A</span> FORWARD <span class="token parameter variable">-d</span> <span class="token number">10.8</span>.0.0/24 <span class="token parameter variable">-j</span> ACCEPT<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>由于我们需要将 VPN 的网络 (<code>10.8.0.0/24</code>) 流量路由到家庭网络 (<code>192.168.2.0</code>)，因此需要在 <code>server.conf</code> 中增加一条路由推送的配置 <code>push "route 192.168.2.0 255.255.255.0"</code>。</p><p>至此，我们的部署就完成了。</p><h2 id="配置"><a class="header-anchor" href="#配置">¶</a> 配置</h2><p>根据我们前面部署的配置，Web UI 的端口是 <code>8833</code>，通过浏览器访问登陆后，我们就可以开始进行配置了</p><p>首先需要新增一条客户端配置，右上角 <code>管理 --&gt; 客户端</code> 进入客户端列表</p><p><img src="https://blogpic.skyhive.tech/pic/openvpn/client-config-list.png" alt="客户端配置列表"></p><p>点击右上角的 <code>添加</code> 按钮，开始添加配置</p><p><img src="https://blogpic.skyhive.tech/pic/openvpn/client-config.png" alt="添加配置"></p><p>这里需要说明一下：</p><ul class="lvl-0"><li class="lvl-2"><p>VPNServer：这里需要填写你外网 IP / 域名和端口，因为你最终是需要从公网连过来的</p></li><li class="lvl-2"><p>CCD 配置这里你可以配置 <code>ifconfig-push</code> 来固定客户端的 IP 地址，其他配置可以去查询文档自行决定</p></li><li class="lvl-2"><p>自定义配置可以添加 <code>route &lt;network&gt; &lt;netmask&gt;</code>，其他配置可以去查询文档自行决定</p></li></ul><p>客户端配置添加完成后，我们在去添加账号和配置的映射关系，右上角 <code>管理 --&gt; VPN 账号</code> 进入账号列表</p><p><img src="https://blogpic.skyhive.tech/pic/openvpn/account-list.png" alt="VPN 账号列表"></p><p><em>注意，右下角有提示：已启用 LDAP 认证，本地 VPN 账号将不再工作！</em> 这里指的是添加后的账号认证由 <code>LDAP</code> 接管，本地不再进行认证，仅实现认证后的 VPN 配置匹配。</p><p>点击右上角 <code>添加</code> 按钮，开始添加账号</p><p><img src="https://blogpic.skyhive.tech/pic/openvpn/add-account.png" alt="添加账号"></p><p><em>注意：</em></p><ul class="lvl-0"><li class="lvl-2"><p>用户名：由于我们对接了 LDAP，这里要填写域账号（并且如果配置了 <code>LDAP_USER_GROUP_DN</code> 则需要填写该组中的用户）</p></li><li class="lvl-2"><p>密码：密码随便填，不生效的</p></li><li class="lvl-2"><p>IP 地址：理论上可以固定 IP 地址，但是我测试过不生效，最后通过配置文件中 <code>ifconfig-push</code> 来实现固定了</p></li></ul><p>至此，我们的配置就已经全部完成，现在使用配置好的域账号登录 Web 页面，可以看到如下界面：</p><p><img src="https://blogpic.skyhive.tech/pic/openvpn/client-ui.png" alt="OpenVPN Web UI"></p><p>可以在此处下载配置文件和客户端，进行客户端的连接，另外如果配置启用了 MFA，则可以在此处对 MFA 进行配置。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;原本路由器上的 &lt;code&gt;Openwrt&lt;/code&gt; 已经自带了 &lt;code&gt;OpenVPN Server&lt;/code&gt;，但是最近有需要开多账号给同事来访问家里的服务器资源，索性就稍稍改造一下，让 &lt;code&gt;OpenVPN&lt;/code&gt; 支持多用户登录，顺便结合上一篇 &lt;a href=&quot;https://blog.skyhive.tech/post/cb650389.html&quot;&gt;HomeLab 系列 - 认证 (上)&lt;/a&gt; 用 LLDAP 管理用户。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="openvpn" scheme="https://blog.skyhive.tech/tags/openvpn/"/>
    
    <category term="docker" scheme="https://blog.skyhive.tech/tags/docker/"/>
    
    <category term="iptables" scheme="https://blog.skyhive.tech/tags/iptables/"/>
    
  </entry>
  
  <entry>
    <title>HomeLab 系列 - 认证 (上)</title>
    <link href="https://blog.skyhive.tech/post/cb650389.html"/>
    <id>https://blog.skyhive.tech/post/cb650389.html</id>
    <published>2025-10-30T06:40:20.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>其实不管是在家里还是在企业里都有一个绕不过去的问题 – 认证（<s>当然如果你在家里所有的系统都只用一个账号，当就不用看这篇文章了</s>）,过去的一段时间内我都是使用本地帐号游走在各个系统。由于系统职能不同，各个系统的账号也不尽相同，例如 Confluence、Gitea 这类我会创建自己的用户账号，但是 Zabbix、Grafana 这类监控系统我就会直接用默认的 Admin 账号（我承认这是习惯不好），但是如果家庭中不止一个用户呢，如果你的这些服务还需要开放到公网让更多人使用呢？</p><p>统一的用户管理在这一刻就显得很有必要，正常在企业中大多会使用 <code>Microsoft Active Domain</code> + <code>SSO</code> 作为统一管理用户的后端，但是在家里使用就显得太重了，调研了许久，最终采用 <code>lldap</code> + <code>authelia</code> 的方案。</p><span id="more"></span><h2 id="方案介绍"><a class="header-anchor" href="#方案介绍">¶</a> 方案介绍</h2><p><code>LLDAP(Light LDAP implementation)</code> 是一个开源的轻量级 LDAP 服务解决方案，同时也提供了一套简单的 Web UI 用于管理，非常适合家用，具体可以前往 <a href="https://github.com/lldap/lldap">Github 地址</a> 自行了解。</p><p><code>Authelia</code> 是一个轻量级的 SSO 服务解决方案，自带一个简单的 Web Portal，同时也提供 <code>2FA</code> 认证。这是作为 <code>LLDAP</code> 补充的解决方案，毕竟不是所有系统都天然支持 <code>LDAP</code> 协议，有些仅支持 SSO 的系统就需要使用 <code>Authelia</code> 了，<code>Authelia</code>支持 <code>LDAP</code> 作为认证后端，因此 <code>LLDAP</code> 和 <code>Authelia</code> 就成了绝佳的搭配。</p><p>下面是 Deepseek 画的架构图，仅供参考 👇</p><pre><code class="mermaid">graph TB    %% 用户访问层    User[用户]    %% 应用系统层    App1[支持 LDAP 的应用&lt;br/&gt;e.g. Confluence, Jellyfin]    App2[仅支持 SSO 的应用&lt;br/&gt;e.g. Cloudreve, Immich]    App3[其他支持 LDAP 的系统&lt;br/&gt;e.g. VPN, 文件服务器]    %% Authelia 内部组件    subgraph Authelia["Authelia - SSO 服务"]        A_Portal[Web Portal&lt;br/&gt;登录界面]        A_Auth[认证引擎]        A_2FA[2FA 模块&lt;br/&gt;TOTP/WebAuthn]        A_Session[会话管理]        A_SSO[SSO 协议处理&lt;br/&gt;OIDC/OAuth2]    end    %% LLDAP 服务    LLDAP[LLDAP&lt;br/&gt;轻量级 LDAP 服务]    LLDAP_UI[Web UI 管理界面]    %% 数据存储层    UserDB[(用户数据库)]    %% 连接关系    User --&gt; App1    User --&gt; App2    User --&gt; App3    %% LDAP 认证流    App1 --&gt;|LDAP 绑定/认证| LLDAP    App3 --&gt;|LDAP 协议| LLDAP    %% SSO 认证流    App2 --&gt;|重定向到 SSO| A_Portal    A_Portal --&gt; A_Auth    A_Auth --&gt;|LDAP 验证| LLDAP    A_Auth --&gt; A_2FA    A_2FA --&gt; A_Session    A_Session --&gt; A_SSO    A_SSO --&gt;|返回令牌| App2    %% 管理关系    LLDAP_UI --&gt;|用户管理| LLDAP    LLDAP --&gt;|读写数据| UserDB    %% 深色模式友好的样式定义    classDef user fill:#1e3a5f,stroke:#4fc3f7,stroke-width:2px,color:#ffffff    classDef app fill:#4527a0,stroke:#b388ff,stroke-width:2px,color:#ffffff    classDef service fill:#1b5e20,stroke:#69f0ae,stroke-width:2px,color:#ffffff    classDef component fill:#37474f,stroke:#ffd54f,stroke-width:1px,color:#ffffff    classDef storage fill:#bf360c,stroke:#ffab91,stroke-width:2px,color:#ffffff    class User user    class App1,App2,App3 app    class Authelia,LLDAP service    class A_Portal,A_Auth,A_2FA,A_Session,A_SSO,LLDAP_UI component    class UserDB storage</code></pre><h2 id="部署"><a class="header-anchor" href="#部署">¶</a> 部署</h2><h3 id="LLDAP"><a class="header-anchor" href="#LLDAP">¶</a>LLDAP</h3><p>LLDAP 部署在容器化上做的很好，除了提供 Docker Compose 外，还有第三方提供的 K8s 的部署方式（yaml 和 helm 都有），K8s 的部署文档可参考：<a href="https://github.com/Evantage-WS/lldap-kubernetes">LLDAP Kubernetes</a></p><p>这里我们简单说下 Docker Compose 的部署，详细内容可参考 <a href="https://github.com/lldap/lldap/blob/main/docs/install.md#with-docker">LLDAP Installation</a></p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">version</span><span class="token punctuation">:</span> <span class="token string">"3"</span><span class="token key atrule">volumes</span><span class="token punctuation">:</span>  <span class="token key atrule">lldap_data</span><span class="token punctuation">:</span>    <span class="token key atrule">driver</span><span class="token punctuation">:</span> local<span class="token key atrule">services</span><span class="token punctuation">:</span>  <span class="token key atrule">lldap</span><span class="token punctuation">:</span>    <span class="token key atrule">image</span><span class="token punctuation">:</span> lldap/lldap<span class="token punctuation">:</span>stable    <span class="token key atrule">ports</span><span class="token punctuation">:</span>      <span class="token comment"># For LDAP, not recommended to expose, see Usage section.</span>      <span class="token punctuation">-</span> <span class="token string">"3890:3890"</span>      <span class="token comment"># For LDAPS (LDAP Over SSL), enable port if LLDAP_LDAPS_OPTIONS__ENABLED set true, look env below</span>      <span class="token comment">#- "6360:6360"</span>      <span class="token comment"># For the web front-end</span>      <span class="token punctuation">-</span> <span class="token string">"17170:17170"</span>    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">"lldap_data:/data"</span>      <span class="token comment"># 或者你可以写成下面的方式，将 data 挂载到当前目录的 lldap_data</span>      <span class="token comment">#- "$PWD/lldap_data:/data"</span>    <span class="token key atrule">environment</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> TZ=Asia/Shanghai      <span class="token punctuation">-</span> LLDAP_JWT_SECRET='&lt;JWT_SECRET<span class="token punctuation">&gt;</span>'      <span class="token punctuation">-</span> LLDAP_KEY_SEED='&lt;KEY_SEED<span class="token punctuation">&gt;</span>'      <span class="token punctuation">-</span> LLDAP_LDAP_BASE_DN=dc=skyhive<span class="token punctuation">,</span>dc=com      <span class="token punctuation">-</span> LLDAP_LDAP_USER_PASS=&lt;ADMIN_PASSWORD<span class="token punctuation">&gt;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>一些说明：</p><ul class="lvl-0"><li class="lvl-2"><p>ports</p><ul class="lvl-2"><li class="lvl-4"><code>3890</code>：默认的 ldap 端口，即不含 ssl 加密</li><li class="lvl-4"><code>6360</code>：ldaps（ldap over ssl），开启需要同时设置 <code>env LLDAP_LDAPS_OPTIONS__ENABLED=true</code></li><li class="lvl-4"><code>1710</code>：web ui 端口</li></ul></li><li class="lvl-2"><p>env:</p><ul class="lvl-2"><li class="lvl-4"><code>LLDAP_JWT_SECRET</code>：可以使用项目根目录中 <code>generate_secrets.sh</code> 生成</li><li class="lvl-4"><code>LLDAP_KEY_SEED</code>：可以使用项目根目录中 <code>generate_secrets.sh</code> 生成</li><li class="lvl-4"><code>LLDAP_LDAP_BASE_DN</code>：LDAP BASE Domain，一般和你的网站域名区分开来</li><li class="lvl-4"><code>LLDAP_LDAP_USER_PASS</code>：管理员密码</li></ul></li></ul><p>另外 <code>LLDAP</code> 默认将数据存储在 <code>sqlite</code> 中，如果需要使用 <code>MySQL</code> 或者 <code>Postgresql</code> 作为后端数据库，则需要配置如下 <code>env</code>：</p><ul class="lvl-0"><li class="lvl-2"><p>LLDAP_DATABASE_URL=mysql://mysql-user:password@mysql-server/my-database</p></li><li class="lvl-2"><p>LLDAP_DATABASE_URL=postgres://postgres-user:password@postgres-server/my-database</p></li></ul><h3 id="Authelia"><a class="header-anchor" href="#Authelia">¶</a>Authelia</h3><p>相较于 <code>LLDAP</code>，<code>Authelia</code> 的部署就显得复杂了许多，和 <code>LLDAP</code> 一样，<code>Authelia</code> 也提供了 Docker Compose 和 K8s 的部署方式，具体可以参考官方文档 – <a href="https://www.authelia.com/integration/deployment/introduction/">Authelia Installation</a></p><p>另外官方文档里说了，强烈建议在部署前先看一遍 <a href="https://www.authelia.com/integration/deployment/introduction/">Get Started</a>，这里主要是一些 Bootstrap 的内容，对于各位理解部署的架构和依赖会有一些帮助</p><p>如果你是部署一套全新可用的 <code>Authelia</code> 的话，直接参考 <code>examples/compose/production/compose.yml</code> 就可以，我这里需要复用已有的 <code>nginx</code> 来代替官方 compose 中的 <code>traefik</code>，关于这部分在官方文档中亦有说明 – <a href="https://www.authelia.com/integration/proxies/nginx/">Proxy With Nginx</a></p><p>最后我调整过的 compose 如下</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">services</span><span class="token punctuation">:</span>  <span class="token key atrule">authelia</span><span class="token punctuation">:</span>    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> <span class="token string">"authelia"</span>    <span class="token key atrule">image</span><span class="token punctuation">:</span> <span class="token string">"docker.io/authelia/authelia:latest"</span>    <span class="token key atrule">restart</span><span class="token punctuation">:</span> <span class="token string">"unless-stopped"</span>    <span class="token key atrule">ports</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> 9091<span class="token punctuation">:</span><span class="token number">9091</span>    <span class="token key atrule">networks</span><span class="token punctuation">:</span>      <span class="token key atrule">authelia</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>    <span class="token key atrule">environment</span><span class="token punctuation">:</span>      <span class="token key atrule">TZ</span><span class="token punctuation">:</span> <span class="token string">"Asia/Shanghai"</span>    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">"${PWD}/config:/config"</span>      <span class="token punctuation">-</span> <span class="token string">"${PWD}/data:/data"</span>  <span class="token key atrule">redis</span><span class="token punctuation">:</span>    <span class="token key atrule">image</span><span class="token punctuation">:</span> <span class="token string">"redis:alpine"</span>    <span class="token key atrule">container_name</span><span class="token punctuation">:</span> <span class="token string">"redis"</span>    <span class="token key atrule">volumes</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">"./redis:/data"</span>    <span class="token key atrule">networks</span><span class="token punctuation">:</span>      <span class="token key atrule">authelia</span><span class="token punctuation">:</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>    <span class="token key atrule">restart</span><span class="token punctuation">:</span> <span class="token string">"unless-stopped"</span>    <span class="token key atrule">environment</span><span class="token punctuation">:</span>      <span class="token key atrule">TZ</span><span class="token punctuation">:</span> <span class="token string">"Asia/Shanghai"</span><span class="token key atrule">networks</span><span class="token punctuation">:</span>  authelia<span class="token punctuation">:</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><code>config/configuration.yml</code> 文件内容如下：</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token punctuation">---</span><span class="token comment">###############################################################</span><span class="token comment">#                   Authelia configuration                    #</span><span class="token comment">###############################################################</span><span class="token key atrule">server</span><span class="token punctuation">:</span>  <span class="token key atrule">address</span><span class="token punctuation">:</span> <span class="token string">"tcp://:9091"</span>  <span class="token key atrule">endpoints</span><span class="token punctuation">:</span>    <span class="token key atrule">authz</span><span class="token punctuation">:</span>      <span class="token key atrule">auth-request</span><span class="token punctuation">:</span>        <span class="token key atrule">implementation</span><span class="token punctuation">:</span> <span class="token string">"AuthRequest"</span><span class="token key atrule">log</span><span class="token punctuation">:</span>  <span class="token key atrule">level</span><span class="token punctuation">:</span> <span class="token string">"debug"</span><span class="token key atrule">totp</span><span class="token punctuation">:</span>  <span class="token key atrule">issuer</span><span class="token punctuation">:</span> <span class="token string">"authelia.com"</span><span class="token key atrule">identity_validation</span><span class="token punctuation">:</span>  <span class="token key atrule">reset_password</span><span class="token punctuation">:</span>    <span class="token key atrule">jwt_secret</span><span class="token punctuation">:</span> <span class="token string">"AqU4EmS3IDBEDLcK*****************ZIqIHdPYiMwF1LY8OYRr"</span><span class="token comment"># duo_api:</span><span class="token comment">#  hostname: api-123456789.example.com</span><span class="token comment">#  integration_key: ABCDEF</span><span class="token comment">#  # This secret can also be set using the env variables AUTHELIA_DUO_API_SECRET_KEY_FILE</span><span class="token comment">#  secret_key: 1234567890abcdefghifjkl</span><span class="token key atrule">authentication_backend</span><span class="token punctuation">:</span>  <span class="token comment">#  file:</span>  <span class="token comment">#    path: '/config/users_database.yml'</span>  <span class="token comment">#</span>  <span class="token key atrule">ldap</span><span class="token punctuation">:</span> <span class="token comment"># 上面部署的 lldap 配置</span>    <span class="token key atrule">implementation</span><span class="token punctuation">:</span> <span class="token string">"lldap"</span>    <span class="token key atrule">address</span><span class="token punctuation">:</span> <span class="token string">"ldap://&lt;INTERNAL_IP&gt;:3890"</span>    <span class="token key atrule">base_dn</span><span class="token punctuation">:</span> <span class="token string">"dc=skyhive,dc=com"</span>    <span class="token key atrule">user</span><span class="token punctuation">:</span> <span class="token string">"UID=lldap,ou=people,dc=skyhive,dc=com"</span>    <span class="token key atrule">password</span><span class="token punctuation">:</span> <span class="token string">"&lt;LDAP_PASSWORD&gt;"</span><span class="token key atrule">access_control</span><span class="token punctuation">:</span>  <span class="token key atrule">default_policy</span><span class="token punctuation">:</span> <span class="token string">"deny"</span>  <span class="token key atrule">rules</span><span class="token punctuation">:</span>    <span class="token comment"># Rules applied to everyone</span>    <span class="token punctuation">-</span> <span class="token key atrule">domain</span><span class="token punctuation">:</span> <span class="token string">"*.skyhive.tech"</span>      <span class="token key atrule">policy</span><span class="token punctuation">:</span> <span class="token string">"bypass"</span><span class="token key atrule">session</span><span class="token punctuation">:</span>  <span class="token comment"># This secret can also be set using the env variables AUTHELIA_SESSION_SECRET_FILE</span>  <span class="token key atrule">secret</span><span class="token punctuation">:</span> <span class="token string">"&lt;SESSION_SECRET&gt;"</span>  <span class="token key atrule">cookies</span><span class="token punctuation">:</span>    <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> <span class="token string">"authelia_session"</span>      <span class="token key atrule">domain</span><span class="token punctuation">:</span> <span class="token string">"skyhive.tech"</span> <span class="token comment"># Should match whatever your root protected domain is</span>      <span class="token key atrule">authelia_url</span><span class="token punctuation">:</span> <span class="token string">"https://auth.skyhive.tech"</span> <span class="token comment"># authelia sso 地址</span>      <span class="token key atrule">default_redirection_url</span><span class="token punctuation">:</span> <span class="token string">"https://confluence.skyhive.tech"</span> <span class="token comment"># 这里是当你直接登录 auth.skyhive.tech 后跳转的网站页面</span>      <span class="token key atrule">expiration</span><span class="token punctuation">:</span> <span class="token string">"1 hour"</span>      <span class="token key atrule">inactivity</span><span class="token punctuation">:</span> <span class="token string">"5 minutes"</span>  <span class="token key atrule">redis</span><span class="token punctuation">:</span>    <span class="token key atrule">host</span><span class="token punctuation">:</span> <span class="token string">"redis"</span>    <span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">6379</span>    <span class="token comment"># This secret can also be set using the env variables AUTHELIA_SESSION_REDIS_PASSWORD_FILE</span>    <span class="token comment"># password: authelia</span><span class="token key atrule">regulation</span><span class="token punctuation">:</span>  <span class="token key atrule">max_retries</span><span class="token punctuation">:</span> <span class="token number">3</span>  <span class="token key atrule">find_time</span><span class="token punctuation">:</span> <span class="token string">"2 minutes"</span>  <span class="token key atrule">ban_time</span><span class="token punctuation">:</span> <span class="token string">"5 minutes"</span><span class="token key atrule">storage</span><span class="token punctuation">:</span>  <span class="token key atrule">encryption_key</span><span class="token punctuation">:</span> <span class="token string">"d4yohU2v2fzwIoObdGY1****************L5wbgMT227XvmJad1z"</span>  <span class="token key atrule">local</span><span class="token punctuation">:</span>    <span class="token key atrule">path</span><span class="token punctuation">:</span> <span class="token string">"/data/db.sqlite3"</span><span class="token key atrule">notifier</span><span class="token punctuation">:</span>  <span class="token key atrule">filesystem</span><span class="token punctuation">:</span>    <span class="token key atrule">filename</span><span class="token punctuation">:</span> <span class="token string">"/config/notification.txt"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>如果你没有对接认证后端的话，可以使用本地账户，用 <code>config/users_database.yml</code> 来进行声明用户配置（同时要在上述 <code>configuration.yml</code> 中配置 authentication_backend 为 file，详见：<a href="https://www.authelia.com/configuration/first-factor/file/">First Factor</a>），users 的配置参考如下：</p><pre class="line-numbers language-yaml" data-language="yaml"><code class="language-yaml"><span class="token key atrule">users</span><span class="token punctuation">:</span>  <span class="token key atrule">authelia</span><span class="token punctuation">:</span>    <span class="token key atrule">disabled</span><span class="token punctuation">:</span> <span class="token boolean important">false</span>    <span class="token key atrule">displayname</span><span class="token punctuation">:</span> <span class="token string">'Authelia User'</span>    <span class="token comment"># Password is authelia</span>    <span class="token key atrule">password</span><span class="token punctuation">:</span> '$6$rounds=50000$BpLnfgDsc2WD8F2q$Zis.ixdg9s/UOJYrs56b5QEZFiZECu0qZVNsIYxBaNJ7ucIL.nlxVCT5tqh8KHG8X4tlwCFm5r6NTOZZ5qRFN/    <span class="token key atrule">email</span><span class="token punctuation">:</span> <span class="token string">'authelia@authelia.com'</span>    <span class="token key atrule">groups</span><span class="token punctuation">:</span>      <span class="token punctuation">-</span> <span class="token string">'admins'</span>      <span class="token punctuation">-</span> <span class="token string">'dev'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>最后就是 <code>nginx</code> 的配置</p><pre class="line-numbers language-nginx" data-language="nginx"><code class="language-nginx"><span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>  <span class="token directive"><span class="token keyword">listen</span>         <span class="token number">443</span> ssl http2</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">server_name</span>    auth.skyhive.tech</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">access_log</span>  /var/log/nginx/auth.skyhive.tech_access.log</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">error_log</span>   /var/log/nginx/auth.skyhive.tech_error.log</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_certificate</span> /etc/nginx/ssl/full.pem</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_certificate_key</span> /etc/nginx/ssl/key.pem</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_protocols</span>        TLSv1 TLSv1.1 TLSv1.2</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_ciphers</span>          ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_prefer_server_ciphers</span>  <span class="token boolean">on</span></span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_session_cache</span>    shared:SSL:10m</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">ssl_session_timeout</span>  <span class="token number">10m</span></span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">add_header</span> Strict-Transport-Security <span class="token string">"max-age=31536000; includeSubDomains"</span> always</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">set</span> <span class="token variable">$upstream</span> http://&lt;INTERNAL_IP&gt;:9091</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>      <span class="token directive"><span class="token keyword">include</span> /etc/nginx/snippets/proxy.conf</span><span class="token punctuation">;</span>      <span class="token directive"><span class="token keyword">proxy_pass</span> <span class="token variable">$upstream</span></span><span class="token punctuation">;</span>  <span class="token punctuation">}</span><span class="token comment">#  location = /api/verify {</span><span class="token comment">#      proxy_pass $upstream;</span><span class="token comment">#  }</span><span class="token comment">#</span><span class="token comment">#  location /api/authz/ {</span><span class="token comment">#      proxy_pass $upstream;</span><span class="token comment">#  }</span><span class="token punctuation">}</span><span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>  <span class="token directive"><span class="token keyword">listen</span>         <span class="token number">80</span></span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">server_name</span>    auth.skyhive.tech</span><span class="token punctuation">;</span>  <span class="token directive"><span class="token keyword">return</span> <span class="token number">301</span> https://<span class="token variable">$host</span><span class="token variable">$request_uri</span></span><span class="token punctuation">;</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>此处 <code>server_name</code> 就是前面在 <code>configuration.yaml</code> 中配置的 <code>authelia_url</code> 的域名。至此整个初始化的流程就全部走完了，后续就是应用去对接 <code>LDAP</code> 或者 <code>OIDC</code> 了 ~</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;其实不管是在家里还是在企业里都有一个绕不过去的问题 – 认证（&lt;s&gt;当然如果你在家里所有的系统都只用一个账号，当就不用看这篇文章了&lt;/s&gt;）,过去的一段时间内我都是使用本地帐号游走在各个系统。由于系统职能不同，各个系统的账号也不尽相同，例如 Confluence、Gitea 这类我会创建自己的用户账号，但是 Zabbix、Grafana 这类监控系统我就会直接用默认的 Admin 账号（我承认这是习惯不好），但是如果家庭中不止一个用户呢，如果你的这些服务还需要开放到公网让更多人使用呢？&lt;/p&gt;
&lt;p&gt;统一的用户管理在这一刻就显得很有必要，正常在企业中大多会使用 &lt;code&gt;Microsoft Active Domain&lt;/code&gt; + &lt;code&gt;SSO&lt;/code&gt; 作为统一管理用户的后端，但是在家里使用就显得太重了，调研了许久，最终采用 &lt;code&gt;lldap&lt;/code&gt; + &lt;code&gt;authelia&lt;/code&gt; 的方案。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="lldap" scheme="https://blog.skyhive.tech/tags/lldap/"/>
    
    <category term="authelia" scheme="https://blog.skyhive.tech/tags/authelia/"/>
    
    <category term="auth" scheme="https://blog.skyhive.tech/tags/auth/"/>
    
  </entry>
  
  <entry>
    <title>2025 大马榴莲季全攻略</title>
    <link href="https://blog.skyhive.tech/post/3bd9168d.html"/>
    <id>https://blog.skyhive.tech/post/3bd9168d.html</id>
    <published>2025-07-14T15:07:47.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h1 id="序"><a class="header-anchor" href="#序">¶</a> 序</h1><p>2023 年 12 月我们第一次前往槟城，但当时不吃榴莲；2024 年 8 月底我们第二次前往槟城，但当时榴莲季已经到了尾声，已经吃不到什么本地的品种，并且两个人的战力实在太弱。</p><p>然而 2025 年，我们提前半年订好机票，计划在 <code>7.11-7.15</code> 前往槟城品鉴榴莲，没想到，人算不如天算，槟城的榴莲季却提前了半个月进入尾声，很多果园的果子在 <code>7.10</code> 就掉的差不多了。尽管如此，我们还是吃上了<strong>二十五个</strong>榴莲品种！！！</p><h1 id="清单"><a class="header-anchor" href="#清单">¶</a> 清单</h1><h2 id="交通"><a class="header-anchor" href="#交通">¶</a> 交通</h2><p>由于去年从槟城回杭州的时候飞机延误赔付了 4 张 150 元的机票券，对于 2025 年榴莲季的行程，我提前了半年就开始进行规划。最终在 <code>2024-12-19</code> 遇上亚航周年大促，再叠加之前赔付的机票券，得到如下的交通计划</p><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">时间</th><th style="text-align:left">始发地</th><th style="text-align:left">目的地</th><th style="text-align:left">航班 / 车次</th><th style="text-align:left">价格 (不含托运)</th></tr></thead><tbody><tr><td style="text-align:left">飞机 ✈</td><td style="text-align:left"><code>2025-07-11 00:15 ~ 05:35</code></td><td style="text-align:left">杭州 HGH T4</td><td style="text-align:left">吉隆坡 KUL T2</td><td style="text-align:left">D7307 空客 A330-300</td><td style="text-align:left">￥405 (券后)</td></tr><tr><td style="text-align:left">飞机 ✈</td><td style="text-align:left"><code>2025-07-15 18:30 ~ 19:30</code></td><td style="text-align:left">槟城 PEN D</td><td style="text-align:left">吉隆坡 KUL T1</td><td style="text-align:left">OD2107 波音 737</td><td style="text-align:left">￥85</td></tr><tr><td style="text-align:left">飞机 ✈</td><td style="text-align:left"><code>2025-07-16 07:50 ~ 13:10</code></td><td style="text-align:left">吉隆坡 KUL T2</td><td style="text-align:left">杭州 HGH T4</td><td style="text-align:left">D7307 空客 A330-300</td><td style="text-align:left">￥547 (券后)</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-07-11 12:00 ~ 14:00</code></td><td style="text-align:left">KL SENTRAL</td><td style="text-align:left">IPOH</td><td style="text-align:left">ETS9004 EXPRESS</td><td style="text-align:left">RM47</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-07-12 13:41 ~ 15:15</code></td><td style="text-align:left">IPOH</td><td style="text-align:left">BUTTERWORTH</td><td style="text-align:left">ETS9104 EXPRESS</td><td style="text-align:left">RM52</td></tr></tbody></table><p>由于去年没有按照计划前往怡保，这次特地把怡保安排上了~</p><p>BUTTERWORTH 前往 GEORGE TOWN 需要乘坐轮渡，具体可以参考前面一篇文章 – <a href="https://blog.skyhive.tech/post/1b4b0584.html">槟城旅行指北</a></p><h2 id="住宿"><a class="header-anchor" href="#住宿">¶</a> 住宿</h2><table><thead><tr><th style="text-align:left">城市</th><th style="text-align:left">日期</th><th style="text-align:left">酒店</th><th style="text-align:left">价格</th><th style="text-align:left">备注</th></tr></thead><tbody><tr><td style="text-align:left">怡保</td><td style="text-align:left"><code>2025-07-11</code></td><td style="text-align:left">M Boutique Hotel</td><td style="text-align:left"><strong>￥326.09</strong></td><td style="text-align:left">性价比很低，但住的还算舒服</td></tr><tr><td style="text-align:left">槟城</td><td style="text-align:left"><code>2025-07-12</code></td><td style="text-align:left">Rare Heritage House</td><td style="text-align:left"><strong>￥265.23</strong></td><td style="text-align:left">没有提供拖鞋，但位置很好，性价比高</td></tr><tr><td style="text-align:left">槟城</td><td style="text-align:left"><code>2025-07-13</code></td><td style="text-align:left">Naure Fruit Farm Resort</td><td style="text-align:left"><strong>RM258</strong></td><td style="text-align:left">榴莲庄园，可以上山参观，吃榴莲 9 折</td></tr><tr><td style="text-align:left">槟城</td><td style="text-align:left"><code>2025-07-14</code></td><td style="text-align:left">The Leith</td><td style="text-align:left"><strong>￥347.2</strong></td><td style="text-align:left">虽然新开，但性价比不高</td></tr><tr><td style="text-align:left">吉隆坡</td><td style="text-align:left"><code>2025-07-15</code></td><td style="text-align:left">KLIA - KLIA 2 途恩酒店</td><td style="text-align:left"><strong>￥301.61</strong></td><td style="text-align:left">步行 10min 至 T2 航站楼，早班机必选</td></tr></tbody></table><h2 id="行李物品"><a class="header-anchor" href="#行李物品">¶</a> 行李物品</h2><p>由于是亚航航班，我们没有购买行李额，因此需要将随身行李控制在人均 7kg 内，有了去年的经验，今年对于行李的把控更加得心应手了。由于是背包出行，我们一共带了三个包，分别是 <code>迪卡侬 MH100 20L</code> 和 <code>Naturehike 25L</code> 用作行李背负，一个小米赠送的小包用于日常出行携带。</p><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">衣物</button><button type="button" class="tab">药物</button><button type="button" class="tab">电子产品</button><button type="button" class="tab">日用品</button></div><div class="tab-contents"><div class="tab-item-content active"><ul class="lvl-0"><li class="lvl-2"><p>短袖短裤：以涤纶速干材质为主，主打一个透气、速干、重量轻</p></li><li class="lvl-2"><p>外套：一人一件防晒外套</p></li><li class="lvl-2"><p>内衣裤：4 条内裤或者一次性 / 即将淘汰的内裤</p></li><li class="lvl-2"><p>袜子：如果是凉鞋 / 洞洞鞋，可只带一双袜子防止飞机上冷</p></li><li class="lvl-2"><p>鞋子：洞洞鞋或者透气徒步鞋均可</p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>内服类：止疼、感冒、退烧、腹泻、胃药等</p></li><li class="lvl-2"><p>外用类：创口贴、医用绷带（小）</p></li><li class="lvl-2"><p>日常类：自用药类</p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>笔记本电脑：运维是这样的，到哪里都得背着电脑</p></li><li class="lvl-2"><p>拍摄器材：<code>DJI Action5 Pro</code> / <code>Xiaomi 14</code> / <code>Xiaomi 13</code></p></li><li class="lvl-2"><p>充电宝：<code>CUKTECH CP25</code> 可上飞机</p></li><li class="lvl-2"><p>充电转换头：大马为英标接口，需要带转换头</p></li><li class="lvl-2"><p>充电器：<code>Xiaomi GaN 65W</code></p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>小米剃须刀</p></li><li class="lvl-2"><p>U 型枕：机上睡觉使用</p></li><li class="lvl-2"><p>漱口水：由于是半夜的航班，准备几条漱口水</p></li><li class="lvl-2"><p>防晒霜：很重要，人家这里是热带地区</p></li><li class="lvl-2"><p>其他：牙线棒、耳塞、眼罩等</p></li></ul></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><p><em>详细的花费清单放在文章末尾了</em></p><h1 id="榴莲指南"><a class="header-anchor" href="#榴莲指南">¶</a> 榴莲指南</h1><h2 id="怡保"><a class="header-anchor" href="#怡保">¶</a> 怡保</h2><p>由于出发前一天我不幸被肠胃炎找上门，到怡保的时候还是上吐下泻的状态，因此也只去了一家榴莲档口 – <code>新兴水果店</code></p><h3 id="Sin-Heng-Fruit-Shop"><a class="header-anchor" href="#Sin-Heng-Fruit-Shop">¶</a>Sin Heng Fruit Shop</h3><blockquote><p><strong>地址：314, Jalan Gunung Rapat, Taman Rapat Setia, 31350 Ipoh, Perak</strong></p></blockquote><p>来怡保肯定要尝一口怡保的冠军榴莲（全国榴莲大赛） – <strong>五指果</strong>，这是一个几十年前从泰国嫁接过来的品种，长得很像金枕，但是他发酵后的风味比金枕更加突出。那么在怡保吃五指果，还是得来网红打卡点 – <code>新兴水果店</code>。尽管是网红店，但不少本地人也会去这家店购买 / 批发水果，我们为了这口五指果也慕名而来。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wuzhi-1.jpg","alt":"五指果 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wuzhi-2.jpg","alt":" 五指果 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wuzhi-3.jpg","alt":"五指果 3","title":""}]</div>  </div><p>这颗五指果售价 <code>RM35/kg</code>，花费 <strong>RM76</strong>，果形饱满，大五房，可以说是性价比拉满了。这颗果子看上去像是一颗标准的干包金枕，但实际上咬下去完全就是<strong>冰淇淋的口感</strong>，还是那种非常细腻的冰淇淋，一点纤维感都没有。味道是那种发酵到极致的榴莲风味，甜但不腻，有微微的酒香并且带一丝丝苦的回味。</p><p>然而让我没想到的是这颗果子有两房非常的苦，只有一丝丝的回甘，吃进嘴里发现舌头直接麻掉了，真的非常上头，真的是让人又惊又喜。</p><blockquote><p>注：这里的苦不是榴莲坏掉了，而是糖分发酵后的产物，是榴莲风味的一部分。由于大马的榴莲是树熟，因此很多品种榴莲都会发酵出苦味，这属于正常情况，另外老树榴莲也更容易发酵出苦味。</p></blockquote><p>当然这家店除了五指果也有其他的名种，例如<strong>猫山王、黑刺、红虾</strong>等，但既然来了怡保，我还是更建议尝一尝五指果和本地的甘榜，毕竟名种在其他地方也都能吃到。</p><h2 id="槟城"><a class="header-anchor" href="#槟城">¶</a> 槟城</h2><p>吃榴莲怎么能不来槟城，不仅要在市里的榴莲档口吃，还要去山上的榴莲庄园里吃！</p><h3 id="Uncle-Durain"><a class="header-anchor" href="#Uncle-Durain">¶</a>Uncle Durain</h3><p>榴莲叔叔的档口在 George Town 壁画街附近的小巷子，可以导航至 <code>大树下海鲜饭店</code> 寻得，两个月后会有新店示人~</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/uncle-durain-1.jpg","alt":"榴莲叔叔档口","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/uncle-durain-2.png","alt":" 叔叔开榴莲 ","title":""}]</div>  </div><p>榴莲叔叔自身有园子，他们的果子大多是共给山下的摊贩档口的，自己也会留一部分果子卖给粉丝，粉丝可以提前一天在微信群里预定。由于是自家的果子，没有中间商赚差价，所以叔叔家的价格相对来说比较公道，而且果子也都是一大早夫妻二人去山上捡回来的，保证足够新鲜。</p><p>我们从怡保赶到槟城的当天就来叔叔的档口吃了一顿榴莲，一共开了五粒，分别是：</p><ul class="lvl-0"><li class="lvl-2"><p>葫芦：我们吃的这一颗树龄比较新，味道是纯甜的那种</p></li><li class="lvl-2"><p>小苹果：白肉，带一点花香的清甜，回味带一点点苦</p></li><li class="lvl-2"><p>林凤娇：6 房林凤娇！！这是一颗不知道多少年的老树，靠近屁股的位置非常<strong>苦</strong>，入口直接给我舌头麻掉了，当然也有两房是纯甜的，没有一丝苦味，而且甜味也很特别，带一点花蜜香</p></li><li class="lvl-2"><p>猫山王：老树猫，苦味居多，中规中矩，也可能是前面林凤娇给我麻痹了，后面吃猫就没啥感觉了</p></li><li class="lvl-2"><p>小品种：印象不深了，注意力全在林凤娇身上</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/hulu.jpg","alt":"葫芦","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/apple.jpg","alt":" 小苹果 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/linfengjiao.jpg","alt":"林凤娇","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/musang-king-1.jpg","alt":" 猫山王 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/little-kinds.jpg","alt":"小品种","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-in-uncle-1.jpg","alt":" 合照 ","title":""}]</div>  </div><p>我们离开槟城的最后一天又去了一趟叔叔家，本来向蹭一下山竹（粉丝预定福利），没曾想当天山竹没掉下来，我们只开了四粒榴莲，分别是：</p><ul class="lvl-0"><li class="lvl-2"><p>奶油王：颜色很好看，入口确实和奶油一样，也是甜味为主</p></li><li class="lvl-2"><p>蜈蚣：颜色和果肉形状都很好看，有咖啡味，很耐吃，喜欢</p></li><li class="lvl-2"><p>上头：金枕 Pro Max，口感比金枕高级，入口即化，纤维感少，味道是金枕发酵多一些的那种感觉</p></li><li class="lvl-2"><p>甘榜：这颗甘榜也是老树，苦甜苦甜的，很耐吃，当然有一房纯苦，苦到麻舌头</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/cream-king.png","alt":"奶油王","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/li.png","alt":" 蜈蚣 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/up-head.png","alt":"上头","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/kampung.jpg","alt":" 甘榜 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-in-uncle-2.jpg","alt":"合照","title":""}]</div>  </div><h3 id="Nature-Fruit-Farm-Resort"><a class="header-anchor" href="#Nature-Fruit-Farm-Resort">¶</a>Nature Fruit Farm Resort</h3><blockquote><p><strong>地址：311 mk 7, Kampung Genting, 11000 Balik Pulau, Penang, Malaysia</strong><br>留连轩是大马华人自己经营的民俗度假村，他们有自己传承的榴莲园，大部分共给前来住宿和吃榴莲的游客，可以在添加小园主微信或者在<a href="https://www.naturefruitfarm.com/">官网</a>预定</p></blockquote><p>本来没有打算前往榴莲庄园的打算，但是三月在小红书上看到有相关的帖子，没感觉在榴莲庄园住一晚很有意思，不仅可以吃到新鲜掉落的果子还能爬山参观园子里的榴莲树。对比来对比去，发现留连轩的性价比还是很高的，不仅榴莲品种丰富，民宿也是保留了老建筑的特色，最终联系老板定了一晚住宿~</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/nature-fruit-farm-resort-1.jpg","alt":"留连轩 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/nature-fruit-farm-resort-2.jpg","alt":" 留连轩 2","title":""}]</div>  </div><p>第一天凭我一己之力召集了九位小伙伴，大家坐在一起开了十一粒榴莲，也算是非常壮观了：</p><ul class="lvl-0"><li class="lvl-2"><p>猫山王 * 2：及格的猫山王水准，只吃到两口，印象不深，不太好评价</p></li><li class="lvl-2"><p>黑刺 * 2：有一粒很好吃，不管是苦味还是甜味都很有层次，口感属于标准的入口粘喉，另外一颗就比较一般</p></li><li class="lvl-2"><p>白玉珍珠（甲比利）：好吃！！入口先甜再苦，但是不会苦到难以接受，苦的很高级，很好吃（不太会形容了）</p></li><li class="lvl-2"><p>红虾：甜！很甜！糯！粘！</p></li><li class="lvl-2"><p>雪山：白肉老树，苦后回一点点甘，苦味能接受</p></li><li class="lvl-2"><p>青龙 / 青皮：糯，甜中带一丝酒味</p></li><li class="lvl-2"><p>山大王：靠近屁股的位置很苦，甜味不明显，但是靠近柄的位置就很好吃，苦后回甘，整体口感软糯，也是可以嗦的榴莲</p></li><li class="lvl-2"><p>念念 * 2：这个好吃！甜味多一些，但榴莲风味也很明显，和它的名字一样，吃完让人念念不忘</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/musang-king-2.png","alt":"猫山王","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/black-thron.png","alt":" 黑刺 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/capri.png","alt":"甲比利","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/red-prawn.png","alt":" 红虾 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/snow-mountain.png","alt":"雪山","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/qingpi.png","alt":" 青龙 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/mountain-king.png","alt":"山大王","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/niannian.jpg","alt":" 念念 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-in-llx-1.jpg","alt":"大合照","title":""}]</div>  </div><p>第二天早饭后，我们剩下的六位住客又开了五粒榴莲：</p><ul class="lvl-0"><li class="lvl-2"><p>龙虾：和红虾不一样，这个入口没有那么甜，口感依然是绵密粘喉的，并且带有一丝微苦（有小伙伴说吃起来还有一丝龙虾的海鲜味，反正我是没吃出来~）</p></li><li class="lvl-2"><p>D11：白肉，这个也有一股淡淡的咖啡味，很好吃！</p></li><li class="lvl-2"><p>仙桃：这个很甜，带着花蜜的那种甜味，也好吃的！也有小伙伴在仙桃上吃出了咖啡味~</p></li><li class="lvl-2"><p>松鼠：这个有淡淡的酒香，甜味 + 榴莲风味，很好吃，像树熟金枕</p></li><li class="lvl-2"><p>338：入口很绵密，带有一丝丝苦味，然后就是甜味</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/lobster.png","alt":"龙虾","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/D11.png","alt":"D11","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/peach.png","alt":"仙桃","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/squirrel.png","alt":" 松鼠 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/338.png","alt":"338","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-in-llx-2.jpg","alt":" 大合照 ","title":""}]</div>  </div><p>既然来到榴莲庄园，那肯定不能只逞口舌之快，不走一走山路，参观一下榴莲树怎么对得起这一趟行程呢。我们三个房间的住客随即叫上了庄园的向导 – <code>Bobu</code>，带着我们上山了！</p><p>没错，他就是 <code>Bobu</code> 👇</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/bobu-1.jpg","alt":"Bobu1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/bobu-2.jpg","alt":"Bobu2","title":""}]</div>  </div><p>山路都是铺好的水泥路，沿着走就完事了，路两边除了有榴莲树之外还有很多其他的热带水果，如 <code>豆蔻</code>、<code>红毛丹</code>、<code>榴莲蜜</code> 等。跟着 Bobu 走到来到了榴莲园的顶端，看到了留连轩的百年老树，偶然发现地上的草丛里有一颗榴莲。我们一致认为这颗榴莲与我们有缘，便掏出钥匙将他打开了，没想到味道还不错，不输下午吃过的。</p><blockquote><p>免责声明：我们只是拿了路牌拍了照片，拍完后路牌也还原了，并没有干伤天害理的事情~</p></blockquote><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/durian-tree.jpg","alt":"榴莲树","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/rembutan-tree.jpg","alt":" 红毛丹 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/century-tree.jpg","alt":"百年老树","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/show-the-way.jpg","alt":" 仙女指路 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-on-mountain.jpg","alt":"榴莲分队","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wild-durain-1.jpg","alt":" 草丛里的榴莲 ","title":""}]</div>  </div><p>吃完这颗榴莲，我们继续寻找日落观测点，没想到又捡到两颗榴莲，一颗屁股上带有六角星，我们觉得大概率是颗猫山王，便带着捡来的留恋来到了日落观测点，也是庄园的一处房屋。刚好厨房里有刀，我们欣赏完日落便火速将这两颗榴莲打开来了，这颗六角星不是猫山王，但也很好吃，和下午吃的雪山一样是白肉微苦，而另外一颗大概率是红虾，甜甜的还带着花蜜香。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wild-durain-2.jpg","alt":"野生榴莲","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/white-durian.png","alt":" 白肉 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/red-durain.jpg","alt":"红肉","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/sunset-on-mountain.jpg","alt":" 日落 ","title":""}]</div>  </div><h3 id="槟城榴莲档口"><a class="header-anchor" href="#槟城榴莲档口">¶</a> 槟城榴莲档口</h3><p>虽然我们这次在槟城只吃了两家，但是其他的一些榴莲档口也是可以给大家推荐一下:</p><ul class="lvl-0"><li class="lvl-2"><p>郑法俊：老牌榴莲档口，网络上久负盛名，也是自家的果园，今年 <code>7.10</code> 果子掉光就没有去了</p></li><li class="lvl-2"><p>俊华：白玉珍珠一绝，比其他的档口和果园都贵，但是据说也是<strong>贵有贵的道理</strong></p></li><li class="lvl-2"><p>松鼠標：网络上久负盛名，可以从市区坐 <code>502</code> 公交到 <code>Anjung Indah I</code> 站下车，对面就是</p></li><li class="lvl-2"><p>双海榴莲：靠近机场，双海的红虾不仅是老树，而且还拿了榴莲大赛的冠军</p></li><li class="lvl-2"><p>钟张：都是土种，吃够了名种可以去尝尝不一样的口味</p></li><li class="lvl-2"><p>榴莲天下：去年在这里吃过一粒黑金和一粒黑刺，都很不错，今年换了店面也变得网红起来，大家自己辨别哈</p></li></ul><h1 id="其他美食"><a class="header-anchor" href="#其他美食">¶</a> 其他美食</h1><p>槟城作为马来西亚米其林推荐最多的城市，美食自然也是少不了的，在<a href="https://blog.skyhive.tech/post/1b4b0584.html">槟城旅行指北</a>中也没少推荐，这里就说一说之前没说过的部分吧</p><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">888 福建虾面</button><button type="button" class="tab">娘惹菜</button><button type="button" class="tab">義蓮鱼头米粉</button><button type="button" class="tab">炒粿条</button><button type="button" class="tab"> The Founders Hutton</button><button type="button" class="tab"> 莫定标娘惹糕</button><button type="button" class="tab">多春茶室</button></div><div class="tab-contents"><div class="tab-item-content active"><blockquote><p><strong>地址：67A, Lebuh Presgrave, 10300 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>位于三条路的 888 福建虾面在网络上久负盛名，实际吃下来味道和之前在大排档吃到的虾面没有什么太大的差别，个人觉得没有必要专门排队来吃，而且价格也不便宜，见仁见智吧。</p><p>虾面周边还有其他的小摊，可以顺带尝一尝炒粿条、煲仔饭啥的</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/888.jpg","alt":"888 福建虾面","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/xiamian.jpg","alt":" 其他虾面 ","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：27, Lebuh Bishop, George Town, 10200 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>原本是想吃一家米其林餐厅 – <strong>Bibik’s Kitchen Nyonya Cuisine</strong>，奈何人家周一店修，便选择了这家杰森娘惹餐厅，味道不错，点了<strong>十个菜</strong>也没有踩雷，由于点了个很贵的虾，人均来到了 <strong>RM57</strong></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/jason-1.jpg","alt":"娘惹菜 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/jason-2.jpg","alt":" 娘惹菜 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/jason-3.jpg","alt":"娘惹菜 3","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：Lot 39 Kompleks, Medan Renong, Jalan Tun Syed Sheh Barakbah, George Town, 10200 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>这家店是 2024 米其林推荐，在槟城的旧关仔街美食广场，个人推荐汤米粉，干炒的比较一般。青东炎汤底是酸辣口，很开胃（<em>有淡淡的香菜味，不吃香菜的请绕道</em>），鱼肉是先炸过的，内部很嫩，吃起来口感也很细腻，墙裂推荐！！</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/green-tomyam.jpg","alt":"青东炎","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/chaofen.jpg","alt":" 炒粉 ","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：lorong baru, 10450 George town, Pulau pinang, Malaysia</strong><br>周四到周六 PM 4:00 - PM 11:00</p></blockquote><p>这家店在 Sunway Hotel 楼下的一个夜市街，每天都有超级多人在排队，当然味道也是一等一的好吃，时间允许的话可以排队尝一尝<br>同一个夜市，有一家炸物很好吃，我们来了三次吃了三次！！</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/char-kway-teow.jpg","alt":"炒粿条","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/fried-food.jpg","alt":" 炸物 ","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：17, Jalan Hutton, George Town, 10050 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>依然是一家网红店，号称 <strong>世界最好吃的贝果店</strong>，当然在他们自己的店门头上也写着 “<strong>World’s Best Bagels</strong>”，店门口也有整面的荣誉墙，都是一些明星来这里的照片（周董、张碧晨、袁娅维、欧阳娜娜等）</p><p>个人觉得贝果确实不错，其他的就差强人意了，点了些喝的也就星巴克的水准，四个人点了一份贝果和四份饮品，人均<strong> RM28</strong></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/bagels.jpg","alt":"贝果","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/the-founders-drink.jpg","alt":" 饮品 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/wall-of-honor.jpg","alt":"荣誉墙","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/the-founders.jpg","alt":" 门头 ","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：Lebuh Chulia, Jalan Masjid, 10200 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>同样蝉联了多年的米其林推荐，娘惹糕也是槟城的特产之一，因此也顺利成章的成为了必打卡的小吃。首先口感就是糯叽叽，味道各有不同，这个地方建议购买前先了解清楚配料，不然很容易踩坑。我们当时比较赶时间，就直接把第一排的七个口味各买了一个，七个口味有两个比较好吃，两个非常踩雷（个人不太能接受的味道），三个中规中矩</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/nyonya-koay.jpg","alt":"娘惹糕","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p><strong>地址：Lebuh Campbell, George Town, 10450 George Town, Pulau Pinang, Malaysia</strong></p></blockquote><p>同样是米其林推荐 + 网红店，这家主做早餐，特色就是咖啡和土司，据说是本地人喜欢吃的一家古早味早餐店，平时排队爆满，我们是中午去的，到了就可以直接落座。<br>个人是没有吃出土司和其他家的区别，以及咖啡也都是比较正常的口味，如果排队就觉得没有太大必要了</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/duochun.jpg","alt":"多春茶室","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/duochun-2.jpg","alt":" 多春茶室咖啡 ","title":""}]</div>  </div></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h1 id="写在最后"><a class="header-anchor" href="#写在最后">¶</a> 写在最后</h1><details class="toggle"><summary class="toggle-button" style="">花费清单</summary><div class="toggle-content"><blockquote><p>备注：机票、高铁、按照<strong>单人费用</strong>计算，住宿按照<strong>两人费用</strong>计算，吃喝、打车等公共费用按照<strong>实际人数计算</strong></p></blockquote><table><thead><tr><th>类目</th><th>细项</th><th>总费用</th><th>人均</th><th>备注</th></tr></thead><tbody><tr><td>交通</td><td>机票 (往返)</td><td>￥1904</td><td>￥952</td><td>细节参考<strong>清单 - 交通</strong></td></tr><tr><td>交通</td><td>高铁 (往返)</td><td>￥352.48</td><td>￥162.74</td><td>细节参考<strong>清单 - 交通</strong></td></tr><tr><td>交通</td><td>地铁</td><td>￥193.81</td><td>￥96.905</td><td>主要是 KUL T2 到 KL Sentral</td></tr><tr><td>交通</td><td>轮渡</td><td>￥6.78</td><td>￥3.39</td><td></td></tr><tr><td>交通</td><td>打车 - 单独</td><td>￥83.94</td><td>￥41.97</td><td></td></tr><tr><td>交通</td><td>打车 - 拼</td><td>￥308.29</td><td>￥77.07</td><td>主要是打车上下山</td></tr><tr><td>住宿</td><td>合计</td><td>￥1663.9</td><td>￥831.95</td><td>这里不含到店的税费</td></tr><tr><td>餐饮</td><td>榴莲 - 新兴水果</td><td>￥129.24</td><td>￥64.62</td><td>五指果 RM35 / kg</td></tr><tr><td>餐饮</td><td>榴莲 - 榴莲叔叔 <code>7.12</code></td><td>￥204.01</td><td>￥40.8</td><td>五人开了五粒果</td></tr><tr><td>餐饮</td><td>榴莲 - 榴莲叔叔 <code>7.15</code></td><td>￥202.71</td><td>￥50.68</td><td>四人开了四粒果</td></tr><tr><td>餐饮</td><td>榴莲 - 留连轩 <code>7.13</code></td><td>￥950</td><td>￥105.55</td><td>九人开了十一粒果</td></tr><tr><td>餐饮</td><td>榴莲 - 留连轩 <code>7.14</code></td><td>￥421.74</td><td>￥70.29</td><td>六人开了五粒果</td></tr><tr><td>餐饮</td><td>其他餐食饮料等</td><td>￥2033.92</td><td>￥730.31</td><td>景区外吃的，价格不算贵，但是确实没有很好吃</td></tr><tr><td>其他</td><td>机票保险</td><td>￥516</td><td>￥258</td><td>最终因为延误赔付了四张 <code>￥100</code> 的机票券</td></tr><tr><td>其他</td><td>特产</td><td>￥326.42</td><td>￥163.21</td><td>主要在 <code>Beryls</code> 买巧克力花了<code>￥305</code></td></tr></tbody></table><p>最终计算人均为 <strong><code>￥3649.48</code></strong>，榴莲人均 <code>￥331.94</code></p></div></details><p>槟城这座城市真的很 chill，无论是吃榴莲还是逛逛逛，都让人觉得无比放松。这次到的时候已经进入榴莲季尾季了，明年得六月底来才能吃到足够多的品种，还得再住一次榴莲山，吃更多的榴莲档口！</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/sunset-on-jetty.jpg","alt":"姓杨桥日落","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-malaysia/group-in-yeoh-jetty.jpg","alt":" 拼好饭天团 ","title":""}]</div>  </div>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;序&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#序&quot;&gt;¶&lt;/a&gt; 序&lt;/h1&gt;
&lt;p&gt;2023 年 12 月我们第一次前往槟城，但当时不吃榴莲；2024 年 8</summary>
        
      
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="旅游" scheme="https://blog.skyhive.tech/tags/%E6%97%85%E6%B8%B8/"/>
    
    <category term="马来西亚" scheme="https://blog.skyhive.tech/tags/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A/"/>
    
    <category term="槟城" scheme="https://blog.skyhive.tech/tags/%E6%A7%9F%E5%9F%8E/"/>
    
    <category term="游记" scheme="https://blog.skyhive.tech/tags/%E6%B8%B8%E8%AE%B0/"/>
    
    <category term="榴莲" scheme="https://blog.skyhive.tech/tags/%E6%A6%B4%E8%8E%B2/"/>
    
  </entry>
  
  <entry>
    <title>2025 青甘大环线游记</title>
    <link href="https://blog.skyhive.tech/post/58a7bd86.html"/>
    <id>https://blog.skyhive.tech/post/58a7bd86.html</id>
    <published>2025-06-22T01:57:54.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h1 id="序"><a class="header-anchor" href="#序">¶</a> 序</h1><p>事情源于三月初和朋友的一场烤肉局，大家在极度 chill 的状态下讨论想要去出去玩的地点，最后一拍即合，在新疆、川西、青甘这几个选项中选择了<strong>青甘大环线</strong>。一周后，大家以极高的执行力定下了往返的机票，至此，车门半焊死，谁都不许下车！！</p><h1 id="清单"><a class="header-anchor" href="#清单">¶</a> 清单</h1><h2 id="交通"><a class="header-anchor" href="#交通">¶</a> 交通</h2><p>作为打工的牛马，既要考虑机票的性价比，又要考虑假期时长，我们最终把时间定在了<code>2025-05-01 ~ 2025-05-07</code>的<strong>杭州 - 兰州</strong>往返机票。去程机票是<strong> 05.01</strong> 下午五点落地兰州，返程机票是<strong> 05.07</strong> 早上七点飞回杭州，因此，我们大环线真正有效的时间是<strong> 05.02-05.06</strong> 五整天，属于是特种兵旅行了 (<s>打工人就是这样的</s>)。</p><p>虽然五一期间不是青甘环线的旅游旺季，但为了避开人流，我们还是计划逆时针完成大环线，具体线路可见下图 👇</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/QingGan-loop-line-map.jpg" alt="青甘大环线线路图"></p><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">时间</th><th style="text-align:left">始发地</th><th style="text-align:left">目的地</th><th style="text-align:left">航班 / 车次</th><th style="text-align:left">价格 (不含托运)</th></tr></thead><tbody><tr><td style="text-align:left">飞机 ✈</td><td style="text-align:left"><code>2025-05-01 13:59 ~ 16:49</code></td><td style="text-align:left">杭州 HGH T3</td><td style="text-align:left">兰州 LHW T3</td><td style="text-align:left">9C6602 空客 A320</td><td style="text-align:left">￥1089</td></tr><tr><td style="text-align:left">飞机 ✈</td><td style="text-align:left"><code>2025-05-07 07:10 ~ 09:34</code></td><td style="text-align:left">兰州 LHW T3</td><td style="text-align:left">杭州 HGH T3</td><td style="text-align:left">9C6601 空客 A320</td><td style="text-align:left">￥569</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-05-01 18:06 ~ 18:46</code></td><td style="text-align:left">中川机场东</td><td style="text-align:left">兰州西</td><td style="text-align:left">C608</td><td style="text-align:left">￥20</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-05-02 07:15 ~ 08:19</code></td><td style="text-align:left">兰州西</td><td style="text-align:left">西宁</td><td style="text-align:left">D2741</td><td style="text-align:left">￥58</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-05-06 20:36 ~ 21:30</code></td><td style="text-align:left">西宁</td><td style="text-align:left">兰州西</td><td style="text-align:left">D2750</td><td style="text-align:left">￥58</td></tr><tr><td style="text-align:left">高铁 🚝</td><td style="text-align:left"><code>2025-05-06 21:52 ~ 22:33</code></td><td style="text-align:left">兰州西</td><td style="text-align:left">中川机场东</td><td style="text-align:left">D8883</td><td style="text-align:left">￥18</td></tr></tbody></table><p>由于从兰州出发路途遥远，时间紧任务重，为了能够有更好的游玩体验，我们安排了兰州往返西宁的高铁，最终大环线自驾的起止点定在了西宁。自西宁起，途径<strong>祁连山大草原 - 张掖 - 酒泉 - 敦煌 - 黑独山 - 水上雅丹 - 大柴旦 - 茶卡 - 青海湖</strong>等地，共计<code>2600KM</code>。</p><table><thead><tr><th style="text-align:left">日期</th><th style="text-align:left">途径点</th><th style="text-align:left">里程数</th></tr></thead><tbody><tr><td style="text-align:left"><code>2025-05-02</code></td><td style="text-align:left">西宁 - 祁连大草原 - 张掖 - 酒泉</td><td style="text-align:left"><strong>588KM</strong></td></tr><tr><td style="text-align:left"><code>2025-05-03</code></td><td style="text-align:left">酒泉 - 敦煌</td><td style="text-align:left"><strong>396.3KM</strong></td></tr><tr><td style="text-align:left"><code>2025-05-04</code></td><td style="text-align:left">敦煌 - 黑独山 - 水上雅丹 - 九紫吉乃尔大酒店</td><td style="text-align:left"><strong>616.5KM</strong></td></tr><tr><td style="text-align:left"><code>2025-05-05</code></td><td style="text-align:left">九紫吉乃尔大酒店 - U 型公路 - 小柴旦湖 - 大柴旦翡翠湖 - 茶卡镇</td><td style="text-align:left"><strong>778.6KM</strong></td></tr><tr><td style="text-align:left"><code>2025-05-06</code></td><td style="text-align:left">茶卡盐湖 - 青海湖・二郎剑景区 - 西宁</td><td style="text-align:left"><strong>315.6KM</strong></td></tr></tbody></table><hr><h2 id="住宿"><a class="header-anchor" href="#住宿">¶</a> 住宿</h2><table><thead><tr><th style="text-align:left">城市</th><th style="text-align:left">日期</th><th style="text-align:left">酒店</th><th style="text-align:left">价格</th><th style="text-align:left">备注</th></tr></thead><tbody><tr><td style="text-align:left">兰州</td><td style="text-align:left"><code>2025-05-01</code></td><td style="text-align:left">蓝莓睿华酒店</td><td style="text-align:left"><strong>￥379</strong></td><td style="text-align:left">离西站进，有送站，第二天赶高铁</td></tr><tr><td style="text-align:left">酒泉</td><td style="text-align:left"><code>2025-05-02</code></td><td style="text-align:left">酒泉维也纳酒店</td><td style="text-align:left"><strong>￥304</strong></td><td style="text-align:left">空调统一控制制冷，五一期间无制冷</td></tr><tr><td style="text-align:left">敦煌 (<em>酒泉辖</em>)</td><td style="text-align:left"><code>2025-05-03</code></td><td style="text-align:left">敦煌富国酒店</td><td style="text-align:left"><strong>￥511</strong></td><td style="text-align:left">星级酒店，体验很好</td></tr><tr><td style="text-align:left">海西</td><td style="text-align:left"><code>2025-05-04</code></td><td style="text-align:left">九紫吉乃尔大酒店</td><td style="text-align:left"><strong>￥457.08</strong></td><td style="text-align:left">附近没啥能选的，至少住的还行</td></tr><tr><td style="text-align:left">茶卡</td><td style="text-align:left"><code>2025-05-05</code></td><td style="text-align:left">丽呈瑞轩酒店</td><td style="text-align:left"><strong>￥182</strong></td><td style="text-align:left">性价比极高</td></tr><tr><td style="text-align:left">兰州</td><td style="text-align:left"><code>2025-05-06</code></td><td style="text-align:left">Hello 酒店</td><td style="text-align:left"><strong>￥188</strong></td><td style="text-align:left">机场附近，第二天要赶早班机</td></tr></tbody></table><hr><h2 id="行李物品"><a class="header-anchor" href="#行李物品">¶</a> 行李物品</h2><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">衣物</button><button type="button" class="tab">电子产品</button><button type="button" class="tab">日用品</button><button type="button" class="tab">药品</button></div><div class="tab-contents"><div class="tab-item-content active"><ul class="lvl-0"><li class="lvl-2"><p>衣服：短袖 + 长袖，主要应付无风的白天环境</p></li><li class="lvl-2"><p>外套：冲锋衣 + 羽绒内胆，主要应付大风以及高海拔环境</p></li><li class="lvl-2"><p>裤子：厚薄长裤各一条，主要防风 + 保暖</p></li><li class="lvl-2"><p>内衣裤 / 袜子：<strong>一次性</strong>或者即将淘汰的，穿完直接扔掉</p></li><li class="lvl-2"><p>鞋子：<strong>洞洞鞋 / 溯溪鞋</strong> +<strong> 马丁靴 / 运动鞋</strong></p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>笔记本电脑：打工牛马必备</p></li><li class="lvl-2"><p>拍摄器材：<code>Xiaomi 14</code> / <code>Xiaomi 13</code> / <code>DJI Action5 Pro</code> / <code>DJI Mavic mini</code> / <code>FUJIFILM XT-4</code> / <code>iPhone 15 Pro</code></p></li><li class="lvl-2"><p>充电宝：<code>10000mah</code> + <code>20000mah</code> 各一个</p></li><li class="lvl-2"><p>充电器：<code>Xiaomi GaN 65W</code> / <code>Xiaomi 14 90W</code> / <code>Thinkplus 65W</code></p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>小米剃须刀</p></li><li class="lvl-2"><p>U 型枕：每天在车上坐六七个小时，最好带着睡着</p></li><li class="lvl-2"><p>防晒：<code>防晒霜</code>+<code>防晒喷雾</code>，如果不想变色，请一定做好防晒工作！！</p></li><li class="lvl-2"><p>墨镜：最好是偏光镜，大西北的太阳真的很刺眼，曝光真的很强</p></li><li class="lvl-2"><p>鼻喷：真的太干燥了，没有鼻喷，连鼻屎都抠不下来 (<s>bushi</s>)</p></li><li class="lvl-2"><p>湿厕纸 / 湿纸巾：上旱厕必备！！(也可以在西宁采购，减少登机时行李)</p></li><li class="lvl-2"><p>鞋套：有沙漠出行的可以安排</p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>常规内服：止疼、感冒、腹泻、退烧等</p></li><li class="lvl-2"><p>常规外用：创口贴、医用绷带</p></li><li class="lvl-2"><p>高原用：红景天、晕车药</p></li></ul></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h1 id="游记"><a class="header-anchor" href="#游记">¶</a> 游记</h1><p>思来想去，还是流水账的形式最适合记录青甘大环线，毕竟<em>最美的景都在路上</em> ~</p><h2 id="Day1-兰州"><a class="header-anchor" href="#Day1-兰州">¶</a>Day1 兰州</h2><p>中川国际机场，海拔 <strong><code>1947m</code></strong>，这个海拔理论上并不会产生高反，毕竟兰州市常住人口也有 <strong><code>450万人</code></strong>，然而落地后我却感到有些恶心和头疼，或许是因为飞机在降落前经历了一段气流颠簸。看着机场里跑来跑去的小朋友，对比之下，我确信我已经产生轻微的高反了😫。</p><p>中川机场是兰州的新区，而我们入住的酒店在兰州西站，位于兰州市中心。由于没有地铁直达，我们只能乘坐城际列车或动车前往，但价格便宜，票价<code>￥20</code>，耗时<code>40min</code>。</p><p>西北的天黑得晚，晚上六点半时阳光依然强烈，不戴墨镜几乎睁不开眼。</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/selfie-on-train.png" alt="高铁上自拍"></p><p>办理完入住后，我们骑自行车前往步行街填饱肚子。虽然已经快八点了，但天色才刚刚暗下来，正是吃晚饭的好时候。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Milk-things.jpg","alt":"奶制品","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Barbecue-Lanzhou.jpg","alt":" 兰州烧烤 ","title":""}]</div>  </div><p>酒足饭饱之后我们又骑着共享单车回到了酒店，虽然城区的海拔已经降到了 <strong><code>1500m</code></strong>，但是我依然有轻微的高反 —— 后脑勺疼得厉害，并且心率明显有升高，再加上兰州这里空气湿度着实有些低，让我鼻子干的难受，这一夜可以说几乎没有有效睡眠了。</p><hr><h2 id="Day2-西宁-酒泉"><a class="header-anchor" href="#Day2-西宁-酒泉">¶</a>Day2 西宁 - 酒泉</h2><p>由于酒店送站服务都是半点出发，我们五点半就在大堂集合了😴。本来睡得就不好，还要起这么早，在高铁上的一个小时几乎都用来补觉了💤。</p><p>西宁市，青海省省会，平均海拔 <strong><code>2275m</code></strong>，大陆性高原半干旱气候。尽管海拔比兰州要高，但此时的我并没有前一天那么难受了，睡了一觉身体确实得到一些恢复。在西宁站取了车后，我们一行人先在西宁吃了一顿早饭，然后去超市和药店采购了一批可能必须的物资就朝着祁连山大草原进发了！！</p><p>一路上看到雪山离我们越来越近，一车人的心也逐渐躁动起来，请原谅我们这些常年生活在接近海平面的城市的打工人，第一次见到雪山确实激动到不能自已。</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Snow-Mountain.jpg" alt="路途中的雪山"></p><p>下了高速后，我们发现国道两侧都是草原，还有一些牧民的帐篷和经幡，看上去像是农家乐。我们找了一处规模较大、停着不少车的牧民草场，打算停下来拍一拍照。原以为牧民会来找我们收费或者强制我们消费，但人家告诉我们，这里不收钱，随便拍，并且认真的告诉了我们哪些项目收费，哪些不收费，甚至收费项目也和我们说明了价格（什么叫民风淳朴啊~）。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/PrayerFlagsSnowMountain.jpg","alt":"经幡雪山","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/GroupPhoto-on-Grassland.jpg","alt":" 草原合照 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Horseback-Riding.jpg","alt":"骑马","title":""}]</div>  </div><p>拍完照时间已经来到了下午一点，我们就在牧民家里解决了午饭。我们也算是运气好，他们刚开业，今天在宴请族里的长辈 (回族)，他们同样按照宴请的标准为我们准备了午餐，人均<code>￥35</code></p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Lunch-on-Grassland.jpg" alt="回民午餐"></p><p>离开草原没过几分钟就来到了岗什卡雪峰的景区大门，我们在大门口打卡了游客照就匆匆离开了，一方面是因为这里海拔已经来到了 <strong><code>3200m</code></strong>，另外一方面我们还要在七点前赶上七彩丹霞 (约三个小时车程)，此时已经下午两点半了。</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Gangshika-Snow-Peak.jpg" alt="岗什卡雪峰"></p><p>导航线路当时看起来没有什么问题，在进入国道前的最后一个服务区，我蹲在海拔 <strong><code>3333m</code></strong> 的厕所拉屎已经感觉到明显头晕了，喝了几口水后，仍然自信地换下了开了一上午车的同伴，然而此时的我还不知道即将发生什么。离开鹅堡服务区，沿着张汶高速行驶了一段路程后，由于高速改道 / 修路，我们被迫下了高速从而行驶上了国道 <strong><code>G227</code></strong>。沿着 <strong><code>G227</code></strong> 开了十几分钟，我们来到一个小镇，如果没有猜错应该就是鹅堡镇了 (此时海拔已经来到了 <strong><code>3400m</code></strong>)。</p><p>跟着缺德地图的导航，我们离开小镇开上了盘山公路，随着海拔不断的升高，雪山逐渐在我们面前露出真容。直到我们看到一块写着海拔 <strong><code>3700m</code></strong> 的牌子，我才感觉胸闷的有些喘不过气。深吸了几口气后，我还是得集中精神，毕竟开着盘山路还要时不时看准机会在双向单车道进行超车，危险程度还是不低的。大概开了半个多小时，我们离开了雪山，来到类似峡谷的地带，周围的高山带着水汽向我们逐渐显现他的郁郁葱葱，这种地貌的变换真的神奇，奈何大家都是第一次见到这种奇观，都忘记了拍照没能记录下来。</p><p>又过了将近半个小时，周围地貌逐渐沙化，我们也重新来到了张汶高速。因为是逆时针环线，路上车辆稀少，油门踩得飞起，之前在山上丢掉的时间，最终在高速上补了回来。我们终于在六点前赶到了张掖<strong>七彩丹霞景区</strong></p><p><em>这里图 1 是 P 过的，后面三张是原图直出，所以要想有好看的照片要么遇到好天气，要么就得 P 图</em></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Danxia1.jpg","alt":"七彩丹霞 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Danxia2.JPG","alt":" 七彩丹霞 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Danxia3.JPG","alt":"七彩丹霞 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Danxia4.JPG","alt":" 七彩丹霞 3","title":""}]</div>  </div><p>七彩丹霞景区内分为很多个观景台，各个观景台之间离的很远，需要乘坐班车前往，我们基本在每个观景台都逗留了十几二十分钟 (部分观景台需要步行爬升，比较费时)。丹霞地貌很是神奇，但是<strong>雨后晴天</strong>的丹霞会更加好看 (可明显提高<strong>对比度</strong>)，因此这也是一个比较吃天气的景区，当然天气不够好的话，带上墨镜 / 偏光镜也能得到不错的效果 (减少曝光)。</p><p>由于晚上需要再赶 <strong><code>192KM</code></strong> 的路程到酒泉住宿，因此我们直接在七彩丹霞景区外解决了晚饭，总体不是很推荐，性价比不高，人均 <code>￥55</code></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Xinyue-Food-1.jpg","alt":"馨月阁 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Xinyue-Food-2.jpg","alt":" 馨月阁 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Xinyue-Food-3.jpg","alt":"馨月阁 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Xinyue-Food-4.jpg","alt":" 馨月阁 4","title":""}]</div>  </div><hr><h2 id="Day3-酒泉-敦煌"><a class="header-anchor" href="#Day3-酒泉-敦煌">¶</a>Day3 酒泉 - 敦煌</h2><p>由于莫高窟最晚需要 14:30 之前进入，并且游览全程约需 2 小时以上，因此我们早上八点就从酒泉出发了，狂奔了 <strong><code>400KM</code></strong> 后，于 12:30 抵达敦煌。先在 <code>靖远羊羔肉</code> 解决了午饭 (我们吃的比较奢侈，人均 <code>￥77</code>)，然后马不停蹄地赶到了莫高窟。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jingyuan-1.jpg","alt":"靖远羊羔肉 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jingyuan-2.jpg","alt":" 靖远羊羔肉 2","title":""}]</div>  </div><blockquote><p>莫高窟，坐落于河西走廊的西部尽头的敦煌。它的开凿从十六国时期至元代，前后延续约 1000 年。莫高窟现有洞窟 735 个，保存壁画 4.5 万多平方米，彩塑 2400 余尊，唐宋木构窟檐 5 座，是中国石窟艺术发展演变的一个缩影，在石窟艺术中享有崇高的历史地位。</p></blockquote><p>由于窟内不允许拍照，这里就不放图了，大家可以自行在网上获取资料。我们购买的是<code>￥238</code>的全价票（即 A 类票），该票型中包含了如下内容：</p><ul class="lvl-0"><li class="lvl-2"><p>8 个实体洞窟 + 1 个特窟的游览和讲解（貌似淡季没有特窟）</p></li><li class="lvl-2"><p>两场数字电影，一场讲历史，一场讲解部分洞窟的内容</p></li><li class="lvl-2"><p>往返莫高窟的大巴 (是的，莫高窟景区距离游客中心有二十分钟车程)</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Mogaoku-1.png","alt":"莫高窟外景 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Mogaoku-2.png","alt":" 莫高窟外景 2","title":""}]</div>  </div><p>从莫高窟出来已经下午五点了，我们直奔酒店，计划将前两天的衣服洗掉后直接去鸣沙山 (当天有周深演唱会的彩排)，没想到刚从房间出来就碰到酒店服务员通知我们紧闭门窗，因为沙尘暴就要来了！！</p><p>是的，我们在敦煌遇到了今年以来最大的沙尘暴！！(<em>图一到图二差不多相隔了二十分钟，能见度变得非常低了</em>)</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Standstorm-1.png","alt":"沙尘暴 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Standstorm-2.png","alt":" 沙尘暴 1","title":""}]</div>  </div><p>我们在酒店从六点半等到了八点半，沙尘逐渐变小之后才出门觅食，兜了一圈之后，我们去了一条出租车司机推荐的美食街 (主要是想去的网红店排队太多了)。研究了五分钟的大众点评，最后选择了<code>相约河边边</code>，吃了烧烤 + 特色菜，人均花费<code>￥70</code></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Hebianbian-1.jpg","alt":"相约河边边 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Hebianbian-2.jpg","alt":" 相约河边边 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Hebianbian-3.jpg","alt":"相约河边边 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Hebianbian-4.jpg","alt":" 相约河边边 4","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Hebianbian-5.jpg","alt":"相约河边边 5","title":""}]</div>  </div><p>饭后我们又逛到了瓜州夜市消消食，但走到一半开始下起了雨，便以极快的速度走完了瓜州夜市，打车回了酒店</p><p>是的，我们在敦煌遇到今年最大的沙尘暴后又遇到了今年最大的暴雨！！</p><hr><h2 id="Day4-敦煌-黑独山-水上雅丹"><a class="header-anchor" href="#Day4-敦煌-黑独山-水上雅丹">¶</a>Day4 敦煌 - 黑独山 - 水上雅丹</h2><p>今天的行程非常赶，所以我们一大早便加满油出发前往黑独山。由于敦煌海拔只有 <strong><code>1100m</code></strong>，我前一天睡得很好，因此自告奋勇担任了第一棒司机。开上柳格高速时，收费站的工作人员嘱咐我们要在阿克塞南收费站下高速，因为昨天的沙尘暴 + 暴雨，隧道现在在抢修。</p><p>沿着柳格高速开了一段路程后，沙漠地貌不知何时消失了，取而代之的是连绵的雪山！在下高速前我们很默契的进入了最后一个服务区 - 阿克塞服务区，由于该服务区能够看到非常震撼的雪山景，大家也都不约而同的开始给家里打视频电话。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Aksai-1.jpg","alt":"阿克塞服务区 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Aksai-2.jpg","alt":" 阿克塞服务区 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Aksai-3.jpg","alt":"阿克塞服务区 3","title":""}]</div>  </div><p>离开服务区后，我们沿着 <strong><code>G215</code></strong> 国道向黑独山进发。本来打算在国道换下给新手司机练手的，没想到海拔开始不断攀升，并且前方的车也多了起来。直到我们看到导航红得发紫以及前方排着无数辆大货后，才发现事情并不简单。一车面包人随即掏出导航研究了起来，最终得出结论 - 我们需要跟着前后这一堆大小车一点点的从当金山口翻越阿尔金山脉，黑独山就在阿尔金山脉的另外一边。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Dangjin-1.jpg","alt":"当金山口 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Dangjin-2.jpg","alt":" 当金山口 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Paozi.jpg","alt":"傻狍子","title":""}]</div>  </div><p>经过不断的借道超车，我们也终于来到了山顶，再次回到了海拔近 <strong><code>3700m</code></strong> 的高度，看到近在咫尺的雪山顶，我的胸口也变得有些发闷。前后大货加上雪地湿滑，每次借道超车都会让整车人提心吊胆，好在都是有惊无险，我们最终也成功的翻越了阿尔金山脉。</p><p>离开雪山后，我们沿着 <strong><code>G215</code></strong> 来到了一个加油站，补了点油之后，我们顺便上了个厕所，体验了一把大西北特色的 "原生态厕所"—— 走出加油站后门，眼前是一片 "自由飞翔" 的土地（满地是💩）<br>换了司机后我们沿着 <strong><code>G215</code></strong> 继续向黑独山进发，路上途径大小苏干湖，因其景色确实迷人，我们忍不住停车打卡 (<strong>果然最美的景色都在路上</strong>)</p><blockquote><p>苏干湖也称大苏干湖，位于中国青海省茫崖市冷湖镇与甘肃省酒泉市阿克塞哈萨克族自治县交界处，为哈尔腾盆地最低处，是甘肃境内最大的内陆湖</p></blockquote><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Sugan-Lake-1.JPG","alt":"苏干湖 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Sugan-Lake-2.JPG","alt":" 苏干湖 2","title":""}]</div>  </div><p>直到下午两点半，我们终于赶到了黑独山 (是的，午饭直接在车上吃了些饼干解决)。都说黑独山是无人区，进了景区之后我们只看到停车场停满了车，以及乌泱泱的人群~</p><blockquote><p>黑独山，又名黑山戈壁，赛什腾山组分部分，属祁连山脉西段支脉，位于青海省茫崖市冷湖镇区东北方向 10 余公里。黑独山因其山包被黑色砂石覆盖，在黄褐色的荒漠戈壁中尤为突出，被称为 <em>“地球上最像月球的地方”</em> 。另外邓紫棋的《GLORIA》 MV 就取景自黑独山。</p></blockquote><p>由于时间关系，我们只是在外围感受了一下网友对黑独山独特的评论 – <strong>风大，风很大</strong>，并且在小山丘上打了个卡，逗留了半小时就重新出发赶往水上雅丹了。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Heidu-1.JPG","alt":"黑独山指引牌","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Heidu-2.JPG","alt":" 孤独星球黑独山 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Heidu-3.JPG","alt":"黑独山","title":""}]</div>  </div><p>沿着 <strong><code>G215</code></strong> 我们顺路去了一趟 <strong>中国工商银行石油小镇遗址</strong> 打卡，因为比较急，甚至没有放一下飞机看看这个小镇的全貌</p><blockquote><p>冷湖镇，位于青海省海西蒙古族藏族自治州茫崖市。这里曾是全国重要的石油生产基地，却因为资源枯竭陷入衰落。如今，天文观测基地建设正酣，火星研学游、冷湖科幻征文等活动先后推出，蝶变后的冷湖重新回到大众的视野中。</p></blockquote><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/OilTown-1.jpg","alt":"石油小镇遗址 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/OilTown-2.jpg","alt":" 石油小镇遗址 2","title":""}]</div>  </div><p>离开石油小镇后，我们又开了近两个小时，来到了一处旱厕解决一下当务之急。没想到在旱厕边上有个小摊在卖零食饮料，摆摊的是几个东北大哥，和他们聊了聊才知道，他们是做穿越无人区生意的，他们开车带你穿越无人区赚取费用 (全世界都是在做生意的东北人，无人区也不例外)。没错，我们现在就已经位处于 <strong>南八仙魔鬼城</strong> 了，往后的路就都是雅丹地貌了。</p><blockquote><p>1955 年，八位来自南方的女地质队员，为寻找石油资源来到大柴旦和冷湖之间的一片蚀土林群。一次她们在迷宫般的残丘中跋涉测量，谁料铺天盖地的沙尘暴迅速笼罩了荒漠。由于岩土富含铁质，地磁强大，罗盘失灵，仅有的标志也被掩埋。她们在被称作 "魔鬼城" 的地形中迷失了方向。当寻找队员发现她们时，她们已长眠在这亘古的荒原中。地以人名而生，为纪念八位光荣的女地质队员，在她们牺牲的地方被称作 "南八仙"。</p></blockquote><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan.jpg" alt="雅丹地貌"></p><p>其实在前往水上雅丹的路上，我们已经和自己和解了，不再赶<code>19:30</code>这个入园时间点 (<s>因为发现怎么也赶不上</s>)，而且这一路上全都是雅丹地貌，我们只要脑补将地上的沙子换成水，那不就是水上雅丹了 (<s>bushi</s>)。我们最终也是在晚上八点前赶到了水上雅丹，我们直接在景区外的停车场飞了一下无人机，拍了大概一分钟的视频后就直奔酒店了 (立省人均<code>￥100</code>门票)。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-on-water-1.JPG","alt":"水上雅丹","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-on-water-2.png","alt":" 水上雅丹 ","title":""}]</div>  </div><p>其实常规的环线中很少住在水上雅丹附近的，大部分的行程都是住在 <strong>大柴旦</strong> 或者 <strong>格尔木市</strong>，而我们因为赶时间，几乎没有回头路的行程，因此今天只能住在水上雅丹附近的酒店。之前定酒店的时候一直在吐槽这里的酒店贵，直到我们向酒店前台要感冒 / 退烧药的时候，人家给的答复是: <strong>我们这里没有卫生所，药品这些物资需要到距离这里 100 公里的格尔木市采购</strong>。</p><p>今晚在酒店附近的超市二楼解决了晚饭，这附近停满了重型卡车，因此这些饭店也主要是供给重卡司机的，所以餐食的口味还是有一定保证的</p><div class="gallery-container" data-type="data" data-button="220" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-Food-1.jpg","alt":"雅丹美食城 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-Food-2.jpg","alt":" 雅丹美食城 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-Food-3.jpg","alt":"雅丹美食城 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-Food-4.jpg","alt":" 雅丹美食城 4","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Yadan-Food-5.jpg","alt":"雅丹美食城 5","title":""}]</div>  </div><hr><h2 id="Day5-大柴旦-茶卡"><a class="header-anchor" href="#Day5-大柴旦-茶卡">¶</a>Day5 大柴旦 - 茶卡</h2><p>依旧是第二天一大早出发，我们直奔 U 型公路打卡。没想到都 5.5 日了，这里竟然还有这么多人，我们在路边找了个位置停车后，根本找不到好的拍照点，感觉网图要么是无人机，要么是找到一个合适的时间在路中间拍摄的。由于当时风大的不行，以及时间关系，我们并没有放飞无人机，草草的拍了两张照片就离开了。</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/U-Road.png" alt="U 型公路"></p><p>盐湖第一站 - 小柴旦湖，大家去的时候建议导航至 <strong><code>小柴达木湖观景点</code></strong>，这里可以翻过铁丝网走到湖边拍照，但是风很大，老一点的无人机根本飞不起来。而且从铁丝网走到湖边非常远，走一个来回可能需要十几分钟，我们因为赶时间并没有走到湖边。</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Little-Chaidan-Lake.JPG" alt="小柴旦湖"></p><p>从小柴旦湖驱车 <strong>1h</strong> 就能到 <strong><code>大柴旦翡翠湖景区</code></strong>，老老实实买票进入，坐小火车达到各个观景点就可以拍拍拍了~</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-1.JPG","alt":"翡翠湖 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-2.JPG","alt":" 翡翠湖 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-3.JPG","alt":"翡翠湖 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-4.png","alt":" 翡翠湖 4","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-5.jpg","alt":"翡翠湖 5","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Jadeite-Lake-6.jpg","alt":" 翡翠湖 6","title":""}]</div>  </div><p>这里还要安利一家很好吃的店 - <strong><code>顶顶牛</code></strong>，我们五个人点了两个锅，还有一堆小吃，人均花费了 <code>￥93</code>，总体来说性价比还算可以，味道也很不错，走的时候还单独打包了一份<code>青稞饼</code>和<code>甜胚子奶茶</code>。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Dingdingniu-1.jpg","alt":"顶顶牛 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Dingdingniu-2.jpg","alt":" 顶顶牛 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Dingdingniu-3.jpg","alt":"顶顶牛 3","title":""}]</div>  </div><p>离开大柴旦就是长达 <code>4.5h</code> 的车程，中途换了两个司机 (让新手司机感受了一下可以随便踩死油门的国道和高速的魅力)，等到了茶卡镇已经是晚上八点了。虽然茶卡镇规模不大、人口不多，但我们一路驶入，感觉小镇充满活力，夜生活颇为丰富晚上我们去了当地人推荐的 <strong><code>聚雅阁</code></strong>，点了一个牛羊肉的坑锅，一些烧烤，人均花费了 <code>￥92</code>，味道很不错。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Juya-Food-1.jpg","alt":"聚雅阁 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Juya-Food-2.jpg","alt":" 聚雅阁 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Juya-Food-3.jpg","alt":"聚雅阁 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Juya-Food-4.jpg","alt":" 聚雅阁 4","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Juya-Food-5.jpg","alt":"聚雅阁 5","title":""}]</div>  </div><p>我们和老板聊了聊天，得知茶卡镇平时生活的人口其实很少，只有旅游季 (5-9 月) 才会有这么多人，旅游季结束之后很多店就关门了，大家就都是来这里赚一笔就走。饭后在镇上稍微逛了一会，买了一点当地的牛肉干和奶糖 (也确实便宜)。</p><hr><h2 id="Day6-茶卡-青海湖-西宁"><a class="header-anchor" href="#Day6-茶卡-青海湖-西宁">¶</a>Day6 茶卡 - 青海湖 - 西宁</h2><p>由于茶卡盐湖景区就在酒店附近十分钟车程，因此今天早上倒没有之前那么赶了。但是没想到景区小火车竟然可以这么慢，算是强行把我们硬控在景区两个小时。</p><p>来之前就听说茶卡盐湖非常吃天气，原本我们以为晴天就能看到很好的颜色，但实际不是的，我们游览了一圈下来发现，只有在 <strong>晴空万里</strong> ，天空呈现湛蓝色时才能看到所谓的 <strong><code>天空之境</code></strong></p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Chaka-1.png","alt":"茶卡盐湖 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Chaka-2.jpg","alt":" 茶卡盐湖 2","title":""}]</div>  </div><blockquote><p>青海湖风景区，地处青藏高原东北部，位于青海省西北部的青海湖盆地内，素有<strong>高原蓝宝石</strong>之称，是中国最大的内陆咸水湖。青海湖风景区划分为环湖水体、二郎剑、鸟岛、沙岛（金沙湾）、仙女湾、日月山 6 个景区，各景区实施分级保护。主要景观资源有青海湖、鸟岛、沙岛、湖周滩地、日月山、二郎剑、仙女湾、丝绸之路南道、唐蕃古道、古城遗址、151 鱼雷发射试验基地等。</p></blockquote><p>二郎剑景区应该是青海湖景区中商业设施最完善的，为了不踩雷和浪费时间，我们选择了二郎剑景区。从茶卡盐湖到青海湖二郎剑景区大概 <code>150km</code>，但由于中途大部分是一级公路，因此我们直到下午两点才抵达青海湖二郎剑景区。到达二郎剑景区前会翻过 <strong><code>橡皮山垭口</code></strong>，海拔在 <strong><code>3800m</code></strong> 左右，大家需要预防一下轻微高反。</p><p>不得不说，青海湖的湖水看上去真的很治愈，而且一眼望不到头，其壮观程度不亚于雪山带来的震撼。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Qinghai-Lake-1.JPG","alt":"青海湖 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Qinghai-Lake-2.JPG","alt":" 青海湖 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Qinghai-Lake-3.jpg","alt":"青海湖 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Qinghai-Lake-4.jpg","alt":" 青海湖 3","title":""},{"url":"https://blogpic.skyhive.tech/pic/2025-QingGan/Qinghai-Lake-5.jpg","alt":"青海湖 3","title":""}]</div>  </div><p>青海湖除了湖和海鸥，还成群结队的牛羊，以及非常惬意的骆驼</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Sheeps.jpg" alt="牛羊"></p><p>从青海湖出来，我们吃了顿便饭，接着便赶往西宁站，之后便是接连换乘高铁，在兰州机场附近住一晚，第二天早上五点就去机场赶早班机了😫</p><h1 id="总结"><a class="header-anchor" href="#总结">¶</a> 总结</h1><details class="toggle"><summary class="toggle-button" style="">花费清单</summary><div class="toggle-content"><blockquote><p>备注：机票、高铁、景点门票按照<strong>单人费用</strong>计算，住宿按照<strong>两人费用</strong>计算，吃喝、租车、油费以及过路费等公共费用按照<strong>五人计算</strong></p></blockquote><table><thead><tr><th>类目</th><th>细项</th><th>总费用</th><th>人均</th><th>备注</th></tr></thead><tbody><tr><td>交通</td><td>机票 (往返)</td><td>￥1658</td><td>￥1658</td><td>细节参考<strong>清单 - 交通</strong></td></tr><tr><td>交通</td><td>高铁 (往返)</td><td>￥154</td><td>￥154</td><td>细节参考<strong>清单 - 交通</strong></td></tr><tr><td>交通</td><td>租车 -<code>TANK 300</code></td><td>￥3352</td><td>￥670.4</td><td>保险拉满</td></tr><tr><td>交通</td><td>油费</td><td>￥1908.28</td><td>￥381.65</td><td><code>TANK 300</code> 高速上的油耗大概在<code>9L</code>，加的还是<code>92号</code>油</td></tr><tr><td>交通</td><td>过路费</td><td>￥103</td><td>￥20.6</td><td>五一期间，只有 5.6 有过路费</td></tr><tr><td>住宿</td><td>合计</td><td>￥2021.08</td><td>￥1010.54</td><td>细节参考<strong>清单 - 住宿</strong></td></tr><tr><td>餐饮</td><td>5.1 烧烤</td><td>￥105</td><td>￥52.5</td><td>这晚是两人餐</td></tr><tr><td>餐饮</td><td>5.1 酸奶</td><td>￥27</td><td>￥13.5</td><td>这晚是两人餐</td></tr><tr><td>餐饮</td><td>5.2 兰州牛肉面</td><td>￥56</td><td>￥14</td><td>这是一大早在高铁站太饿了，先吃两碗面垫一下</td></tr><tr><td>餐饮</td><td>5.2 西宁・马尕沙牛杂 + 包子</td><td>￥85</td><td>￥17</td><td>在西宁吃了一顿比较正规的早餐，牛杂 + 包子 + 鸡蛋牛奶醪糟</td></tr><tr><td>餐饮</td><td>5.2 祁连山・回民草原农家乐</td><td>￥225</td><td>￥45</td><td></td></tr><tr><td>餐饮</td><td>5.2 张掖・馨月阁</td><td>￥276</td><td>￥55.2</td><td>景区外吃的，价格不算贵，但是确实没有很好吃</td></tr><tr><td>餐饮</td><td>5.3 敦煌・靖远羊羔肉</td><td>￥385</td><td>￥77</td><td></td></tr><tr><td>餐饮</td><td>5.3 敦煌・相约河边边</td><td>￥348</td><td>￥69.6</td><td></td></tr><tr><td>餐饮</td><td>5.4 东台・雅丹美食城</td><td>￥420</td><td>￥84</td><td>午饭没吃，晚上多吃点不过分吧~</td></tr><tr><td>餐饮</td><td>5.5 大柴旦・顶顶牛</td><td>￥465</td><td>￥93</td><td>这个确实好吃</td></tr><tr><td>餐饮</td><td>5.5 茶卡・聚雅阁</td><td>￥460</td><td>￥92</td><td>这个也好吃的</td></tr><tr><td>餐饮</td><td>5.6 青海湖・不知道叫什么名</td><td>￥297</td><td>￥59.4</td><td>为了赶路，随便找了一家，确实难吃</td></tr><tr><td>餐饮</td><td>服务区 / 便利店补给</td><td>￥300.6</td><td>￥60.12</td><td>零食饮料啥的</td></tr><tr><td>药品</td><td>感冒药、氧气瓶啥的</td><td>￥198.8</td><td>￥39.76</td><td>以防万一，虽然氧气瓶几乎没怎么用</td></tr><tr><td>门票</td><td>七彩丹霞</td><td>￥92</td><td>￥92</td><td></td></tr><tr><td>门票</td><td>莫高窟</td><td>￥238</td><td>￥238</td><td></td></tr><tr><td>门票</td><td>大柴旦翡翠湖</td><td>￥110</td><td>￥110</td><td></td></tr><tr><td>门票</td><td>茶卡盐湖</td><td>￥163</td><td>￥163</td><td></td></tr><tr><td>门票</td><td>青海湖・二郎剑景区</td><td>￥199</td><td>￥199</td><td></td></tr></tbody></table><p>最终计算人均为 <strong><code>￥5469.27</code></strong></p></div></details><p>青甘大环线，很多人觉得这条先很无聊，没有川西刺激，没有独库好看，当然川西和新疆我都没去过， 撒贝宁老师口中说的那个 "白活了" 的人，大概指的就是我了，但是青甘这条线我想有一点是其他线比不了的，那就是地貌类型的丰富性。短短五天，我们亲眼见证了不同地貌在眼前渐次变换，看到了雪山是怎么变换到戈壁，也看到沙漠是怎么变换到绿洲，见识到了不同的盐湖，也理解了为什么网友们都说大西北是上天打翻的调色盘。</p><p>总要去一次大西北吧，看惯了江南水乡的秀丽，也该见识见识大西北的荒凉与壮丽~</p><p><img src="https://blogpic.skyhive.tech/pic/2025-QingGan/Sunset.jpg" alt="东台日落"></p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h1 id=&quot;序&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#序&quot;&gt;¶&lt;/a&gt; 序&lt;/h1&gt;
&lt;p&gt;事情源于三月初和朋友的一场烤肉局，大家在极度 chill</summary>
        
      
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="旅游" scheme="https://blog.skyhive.tech/tags/%E6%97%85%E6%B8%B8/"/>
    
    <category term="游记" scheme="https://blog.skyhive.tech/tags/%E6%B8%B8%E8%AE%B0/"/>
    
    <category term="大西北" scheme="https://blog.skyhive.tech/tags/%E5%A4%A7%E8%A5%BF%E5%8C%97/"/>
    
    <category term="青甘大环线" scheme="https://blog.skyhive.tech/tags/%E9%9D%92%E7%94%98%E5%A4%A7%E7%8E%AF%E7%BA%BF/"/>
    
  </entry>
  
  <entry>
    <title>甲状腺乳头状癌治疗始末</title>
    <link href="https://blog.skyhive.tech/post/1812e504.html"/>
    <id>https://blog.skyhive.tech/post/1812e504.html</id>
    <published>2024-10-29T03:50:27.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>2023 年 8 月的体检，我被检查出甲状腺结节，但此时并没有当回事儿，然而一年后的体检过程中，大夫千叮咛万嘱咐我去医院复查，告诉我很重要，至此我的 <strong>甲状腺乳头状癌</strong> 的诊疗之旅就此展开。下面我将会对我的 <strong>甲状腺乳头状癌</strong> 的发现、检查、手术以及术后恢复做一个详细的记录，希望可以帮助更多的人，同时也算是给自己留下一份纪念 ~</p><span id="more"></span><h3 id="事发"><a class="header-anchor" href="#事发">¶</a> 事发</h3><p>2024.8.4 的体检有点不一样，B 超医生和我非常严肃地说了一句话：“你的这个甲状腺结节一定要去医院复查，很严重了”，随后我就怀着忐忑的心情带着体检报告去浙二挂了一个甲状腺外科，在医院超声检查后，我的右侧甲状腺结节被升级为了<code>4a</code> 类型，医生建议我做穿刺确定性质。</p><p>到目前为止我还能够保持比较乐观的心态，因为医生说如果穿刺结果是良性还能够做热消融，不用做手术切除。不出意外的话，那确实出意外了，9.12 的穿刺结果顺理成章的是恶性，并且被诊断为 <strong>甲状腺乳头状癌</strong>。当然此时的我还是抱着侥幸的心理在网上到处查询资料，看看事情还有没有转机，但是得到的结果都是对于肿瘤大小在 1cm 之内的有进行热消融的案例，而我的瘤子非常的给力，不负众望的长到了 3.5cm！！</p><p>穿刺结果出来的两周后，我约了浙二的甲状腺外科副主任医师的专家号，最终确定的治疗方案是开放手术做患侧的甲状腺切除 + 患侧颈部淋巴结清扫，至少我还保留了另外一边甲状腺，这样想想可能就没那么难受了。</p><h3 id="手术"><a class="header-anchor" href="#手术">¶</a> 手术</h3><p>由于手术不仅需要切除患侧甲状腺，还需进行颈部淋巴结清扫，因此无法进行微创手术，只能在脖子上留下一条十几公分的切口（听起来还挺酷的）。</p><p>手术有以下几个方面需要注意：</p><ol><li class="lvl-3"><p>手术前不能有<strong>上呼吸道感染</strong>症状（如咳嗽、鼻涕等），否则术中会有很大的呼吸道感染风险（如肺炎），并且会加大手术难等，增加手术本身风险</p></li><li class="lvl-3"><p>可能会需要插<strong>导尿管</strong>，具体取决于手术时间</p></li><li class="lvl-3"><p>甲状腺的位置比较刁钻，他靠近<strong>食管、气管</strong>以及<strong>颈动脉</strong>，如果结节 / 肿瘤的位置长得不好，在切除时会误伤或者不得已伤到其他器官的神经，从而术后留一下一些后遗症</p></li><li class="lvl-3"><p><strong>甲状旁腺</strong>生长在甲状腺周围，切除时可能会误伤 / 切到甲状旁腺，虽然医生会帮忙将甲状旁腺重新种植进肌肉，但手术后仍然会有一些后遗症（缺钙导致的手脚发麻，骨质疏松等）</p></li></ol><p>我的手术相对来说较为顺利（却是一点儿也不轻松），从我进手术室到出来，一共经历了四个小时，要不怎么说是个<a href="https%3A%2F%2Fniha.org.cn%2Fprod-api%2Fprofile%2Fupload%2F2024%2F09%2F09%2F%25E5%2585%25B3%25E4%25BA%258E%25E5%258F%2591%25E5%25B8%2583%25E4%25B8%25AD%25E5%259B%25BD%25E5%258C%25BB%25E7%2596%2597%25E8%25B4%25A8%25E9%2587%258F%25E5%25A4%25A7%25E4%25BC%259A%25E4%25B8%2593%25E5%25AE%25B6%25E8%25A7%25A3%25E6%259E%2590%25E2%2580%2594%25E3%2580%258A%25E5%258C%25BB%25E7%2596%2597%25E6%259C%25BA%25E6%259E%2584%25E5%259B%259B%25E7%25BA%25A7%25E6%2589%258B%25E6%259C%25AF%25E5%2585%25A8%25E8%25BF%2587%25E7%25A8%258B%25E7%25AE%25A1%25E7%2590%2586%25EF%25BC%2588%25E4%25B8%2593%25E5%25AE%25B6%25E8%25A7%25A3%25E6%259E%2590%25EF%25BC%2589%25E3%2580%258B%25E7%259A%2584%25E9%2580%259A%25E7%259F%25A5_20240909144340A034.pdf&amp;usg=AOvVaw3s5NQJOrpCOq_Tm-WzFU2X&amp;opi=89978449">四级手术</a>呢。因为清扫了颈部淋巴结，为了观察伤口愈合情况，需要在住院期间放两根引流管在身上。</p><p>第一天是最难熬的，前六个小时不吃不喝，由于没有插尿管，需要顶着麻药的后劲在床上用力尿尿（就是那种膀胱感觉都要憋炸了却怎么也尿不出来的感觉）。全程不能下床，鼻子上插着氧管，每隔一个小时自动测量血压，根本没法入睡，就这样强行熬了一夜，第二天终于可以下地活动了。总体来说我恢复的还不错，只是过了半天就可以随便活动，在床上翻身也不是很难了（主要是脖子上插着引流管，不敢太大幅度活动）。</p><p>第三天上午医生来查了一次房就放我出院了（没想到医院的床位这么紧张），我也是收拾收拾赶紧滚回了家。</p><h3 id="术后"><a class="header-anchor" href="#术后">¶</a> 术后</h3><p>术后两周是最难熬的一段时间，对于我来说，这两周是黑暗无比的，毫无光泽。由于做了颈部淋巴清扫，为防止 <strong>淋巴漏</strong> 出现，术后两周内我都不能摄入油脂，吃的东西都是水煮，只能吃蔬菜，不能吃肉，吃鸡蛋还不能吃蛋黄。这段时期所吃的东西才是真正的 <strong>食之无味，弃之可惜</strong> 啊，短短两周直接瘦了十斤，所以只要管住嘴，就算不迈开腿也是可以减肥的，并且效果拔群。</p><p>除了术后两周的饮食控制外，影响我生活最多的就是每天早上要先吃优甲乐（用于补充甲状腺激素）后一小时才能吃早餐，并且服药后的四小时内不能大量摄入蛋白质以及对胃部刺激大的东西（牛奶、豆浆、咖啡等），后续就定期复查，根据复查结果控制需要摄入的药量，根据病理分析，我属于高复发人群，所以术后老老实实吃药是非常必要的，经历过一次的人应该都不会想再经历第二次了，好好生活吧~</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2023 年 8 月的体检，我被检查出甲状腺结节，但此时并没有当回事儿，然而一年后的体检过程中，大夫千叮咛万嘱咐我去医院复查，告诉我很重要，至此我的 &lt;strong&gt;甲状腺乳头状癌&lt;/strong&gt; 的诊疗之旅就此展开。下面我将会对我的 &lt;strong&gt;甲状腺乳头状癌&lt;/strong&gt; 的发现、检查、手术以及术后恢复做一个详细的记录，希望可以帮助更多的人，同时也算是给自己留下一份纪念 ~&lt;/p&gt;</summary>
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="甲状腺" scheme="https://blog.skyhive.tech/tags/%E7%94%B2%E7%8A%B6%E8%85%BA/"/>
    
    <category term="伤病" scheme="https://blog.skyhive.tech/tags/%E4%BC%A4%E7%97%85/"/>
    
    <category term="癌症" scheme="https://blog.skyhive.tech/tags/%E7%99%8C%E7%97%87/"/>
    
  </entry>
  
  <entry>
    <title>工欲善其事之趁手的终端</title>
    <link href="https://blog.skyhive.tech/post/2069fb37.html"/>
    <id>https://blog.skyhive.tech/post/2069fb37.html</id>
    <published>2024-10-14T11:49:31.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>俗话说的好，工欲善其事必先利其器，要想活干得漂亮，就得有一个趁手的兵器。对于运维人来说，一个好的 Terminal，绝对可以大大滴提高工作效率。</p><p>曾经的我是 Ubuntu 的无脑吹、脑残粉，主要是命令行配合着一众工具使用起来非常丝滑，效率极高。而在 Windows 上除了安装各种执行环境配置环境变量外，还需要借助 xShell 这类工具来完成我的日常工作，虽然当时也折腾过一段时间的 <a href="https://cmder.app/"><code>cmder</code></a>，但却是没有原生 Terminal 顺滑。</p><p>好在巨硬还有良心，推出了 <a href="https://github.com/microsoft/terminal">Windows Terminal</a> 和 <a href="https://github.com/microsoft/WSL">WSL</a>，一度让我从 Ubuntu 脑残粉变成了 Windows 无脑吹~ 本文则是用来记录一下我自己的终端配置，因为我的工作环境几乎是跑在 WSL 上的，所以 Linux 和 MacOS 均可借鉴。</p><span id="more"></span><h3 id="前置操作"><a class="header-anchor" href="#前置操作">¶</a> 前置操作</h3><ul class="lvl-0"><li class="lvl-2"><p>一个 Windows 11 的操作系统</p></li><li class="lvl-2"><p>电脑<a href="https://support.microsoft.com/zh-cn/windows/%E5%9C%A8-windows-%E4%B8%8A%E5%90%AF%E7%94%A8%E8%99%9A%E6%8B%9F%E5%8C%96-c5578302-6e43-4b4b-a449-8ced115f58e1">开启虚拟化技术</a>（默认已开启，未开启的则需要进 BIOS 中开启该设置，不同品牌的电脑不一样，请自行 Google）</p></li><li class="lvl-2"><p>安装 <a href="https://apps.microsoft.com/detail/9n0dx20hk701?hl=en-US&amp;gl=US">Windows Terminal</a>（Windows 11 默认已安装，否则请在 Microsoft Store 中进行安装）</p></li></ul><h3 id="Windows-Terminal-配置"><a class="header-anchor" href="#Windows-Terminal-配置">¶</a>Windows Terminal 配置</h3><p>这里再次强推 Windows 用户使用 Windows Terminal，如同别人推荐在 Mac 中使用 iTerm2, 在 Linux 中使用 Terminator 一样（虽然我用 Ubuntu 的时候也不喜欢用 Terminator 😂）。<br>当然近年来也有很多好评如潮的开源终端（如 <a href="https://github.com/Eugeny/tabby"><code>Tabby</code></a>、<a href="https://github.com/kingToolbox/WindTerm"><code>WindTerm</code></a> 等），但是秉承着多一事不如少一事的原则，既然 Windows 自带了如此好用的终端，就不费力去折腾别的东西了~</p><p>对于终端来说，需要配置的内容无非就是 <strong>配色、字体、快捷键、外观</strong>，这里记录一下我当前使用的一些配置：</p><pre class="line-numbers language-json" data-language="json"><code class="language-json"><span class="token punctuation">{</span>    <span class="token property">"$help"</span><span class="token operator">:</span> <span class="token string">"https://aka.ms/terminal-documentation"</span><span class="token punctuation">,</span>    <span class="token property">"$schema"</span><span class="token operator">:</span> <span class="token string">"https://aka.ms/terminal-profiles-schema"</span><span class="token punctuation">,</span>    <span class="token property">"actions"</span><span class="token operator">:</span>     <span class="token punctuation">[</span>        <span class="token punctuation">{</span>            <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"paste"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"unbound"</span><span class="token punctuation">,</span>            <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token string">"ctrl+v"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"command"</span><span class="token operator">:</span>             <span class="token punctuation">{</span>                <span class="token property">"action"</span><span class="token operator">:</span> <span class="token string">"copy"</span><span class="token punctuation">,</span>                <span class="token property">"singleLine"</span><span class="token operator">:</span> <span class="token boolean">false</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token string">"ctrl+c"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"command"</span><span class="token operator">:</span>             <span class="token punctuation">{</span>                <span class="token property">"action"</span><span class="token operator">:</span> <span class="token string">"splitPane"</span><span class="token punctuation">,</span>                <span class="token property">"split"</span><span class="token operator">:</span> <span class="token string">"auto"</span><span class="token punctuation">,</span>                <span class="token property">"splitMode"</span><span class="token operator">:</span> <span class="token string">"duplicate"</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token string">"alt+shift+d"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"command"</span><span class="token operator">:</span> <span class="token string">"find"</span><span class="token punctuation">,</span>            <span class="token property">"keys"</span><span class="token operator">:</span> <span class="token string">"ctrl+shift+f"</span>        <span class="token punctuation">}</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token property">"copyFormatting"</span><span class="token operator">:</span> <span class="token string">"none"</span><span class="token punctuation">,</span>    <span class="token property">"copyOnSelect"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>    <span class="token property">"defaultProfile"</span><span class="token operator">:</span> <span class="token string">"{2d17c16e-af5c-4ccf-bcca-796cc19e890b}"</span><span class="token punctuation">,</span>    <span class="token property">"newTabMenu"</span><span class="token operator">:</span>     <span class="token punctuation">[</span>        <span class="token punctuation">{</span>            <span class="token property">"type"</span><span class="token operator">:</span> <span class="token string">"remainingProfiles"</span>        <span class="token punctuation">}</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token property">"profiles"</span><span class="token operator">:</span>     <span class="token punctuation">{</span>        <span class="token property">"defaults"</span><span class="token operator">:</span>         <span class="token punctuation">{</span>            <span class="token property">"colorScheme"</span><span class="token operator">:</span> <span class="token string">"Tango Dark"</span><span class="token punctuation">,</span>            <span class="token property">"font"</span><span class="token operator">:</span>             <span class="token punctuation">{</span>                <span class="token property">"face"</span><span class="token operator">:</span> <span class="token string">"Maple Mono NF"</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token property">"opacity"</span><span class="token operator">:</span> <span class="token number">80</span><span class="token punctuation">,</span>            <span class="token property">"useAcrylic"</span><span class="token operator">:</span> <span class="token boolean">true</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token property">"list"</span><span class="token operator">:</span>         <span class="token punctuation">[</span>            <span class="token punctuation">{</span>                <span class="token property">"font"</span><span class="token operator">:</span>                 <span class="token punctuation">{</span>                    <span class="token property">"face"</span><span class="token operator">:</span> <span class="token string">"Maple Mono NF CN"</span>                <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{61c54bbd-c2c6-5271-96e7-009a87ff44bf}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Windows PowerShell"</span><span class="token punctuation">,</span>                <span class="token property">"opacity"</span><span class="token operator">:</span> <span class="token number">90</span><span class="token punctuation">,</span>                <span class="token property">"useAcrylic"</span><span class="token operator">:</span> <span class="token boolean">true</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token punctuation">{</span>                <span class="token property">"font"</span><span class="token operator">:</span>                 <span class="token punctuation">{</span>                    <span class="token property">"face"</span><span class="token operator">:</span> <span class="token string">"Maple Mono NF CN"</span>                <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{0caa0dad-35be-5f56-a8ff-afceeeaa6101}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"\u547d\u4ee4\u63d0\u793a\u7b26"</span><span class="token punctuation">,</span>                <span class="token property">"opacity"</span><span class="token operator">:</span> <span class="token number">90</span><span class="token punctuation">,</span>                <span class="token property">"useAcrylic"</span><span class="token operator">:</span> <span class="token boolean">true</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token punctuation">{</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{b453ae62-4e3d-5e58-b989-0a998ec441b8}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Azure Cloud Shell"</span><span class="token punctuation">,</span>                <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"Windows.Terminal.Azure"</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token punctuation">{</span>                <span class="token property">"adjustIndistinguishableColors"</span><span class="token operator">:</span> <span class="token string">"indexed"</span><span class="token punctuation">,</span>                <span class="token property">"antialiasingMode"</span><span class="token operator">:</span> <span class="token string">"grayscale"</span><span class="token punctuation">,</span>                <span class="token property">"colorScheme"</span><span class="token operator">:</span> <span class="token string">"Tango Dark"</span><span class="token punctuation">,</span>                <span class="token property">"commandline"</span><span class="token operator">:</span> <span class="token string">"C:\\Windows\\system32\\wsl.exe -d Ubuntu-20.04"</span><span class="token punctuation">,</span>                <span class="token property">"experimental.retroTerminalEffect"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"font"</span><span class="token operator">:</span>                 <span class="token punctuation">{</span>                    <span class="token property">"face"</span><span class="token operator">:</span> <span class="token string">"Maple Mono NF"</span><span class="token punctuation">,</span>                    <span class="token property">"size"</span><span class="token operator">:</span> <span class="token number">12.0</span><span class="token punctuation">,</span>                    <span class="token property">"weight"</span><span class="token operator">:</span> <span class="token string">"semi-light"</span>                <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{2d17c16e-af5c-4ccf-bcca-796cc19e890b}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"historySize"</span><span class="token operator">:</span> <span class="token number">10240</span><span class="token punctuation">,</span>                <span class="token property">"icon"</span><span class="token operator">:</span> <span class="token string">"ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.png"</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Ubuntu-20.04"</span><span class="token punctuation">,</span>                <span class="token property">"opacity"</span><span class="token operator">:</span> <span class="token number">80</span><span class="token punctuation">,</span>                <span class="token property">"startingDirectory"</span><span class="token operator">:</span> <span class="token string">"~"</span><span class="token punctuation">,</span>                <span class="token property">"useAcrylic"</span><span class="token operator">:</span> <span class="token boolean">true</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token punctuation">{</span>                <span class="token property">"font"</span><span class="token operator">:</span>                 <span class="token punctuation">{</span>                    <span class="token property">"face"</span><span class="token operator">:</span> <span class="token string">"Maple Mono NF"</span>                <span class="token punctuation">}</span><span class="token punctuation">,</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{4dd1e689-b517-5f39-947d-78e8a8bdf958}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Ubuntu 20.04.6 LTS"</span><span class="token punctuation">,</span>                <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc"</span>            <span class="token punctuation">}</span><span class="token punctuation">,</span>            <span class="token punctuation">{</span>                <span class="token property">"guid"</span><span class="token operator">:</span> <span class="token string">"{574e775e-4f2a-5b96-ac1e-a2962a402336}"</span><span class="token punctuation">,</span>                <span class="token property">"hidden"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span>                <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"PowerShell"</span><span class="token punctuation">,</span>                <span class="token property">"source"</span><span class="token operator">:</span> <span class="token string">"Windows.Terminal.PowershellCore"</span>            <span class="token punctuation">}</span>        <span class="token punctuation">]</span>    <span class="token punctuation">}</span><span class="token punctuation">,</span>    <span class="token property">"schemes"</span><span class="token operator">:</span>     <span class="token punctuation">[</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#0C0C0C"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#0C0C0C"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#0037DA"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#767676"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#3B78FF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#61D6D6"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#16C60C"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#B4009E"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#E74856"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#F2F2F2"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#F9F1A5"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#3A96DD"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#CCCCCC"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#13A10E"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Campbell"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#881798"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#C50F1F"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#CCCCCC"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#C19C00"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#012456"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#0C0C0C"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#0037DA"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#767676"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#3B78FF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#61D6D6"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#16C60C"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#B4009E"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#E74856"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#F2F2F2"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#F9F1A5"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#3A96DD"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#CCCCCC"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#13A10E"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Campbell Powershell"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#881798"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#C50F1F"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#CCCCCC"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#C19C00"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#282C34"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#282C34"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#61AFEF"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#5A6374"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#61AFEF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#56B6C2"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#98C379"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#C678DD"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#E06C75"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#DCDFE4"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#E5C07B"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#56B6C2"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#DCDFE4"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#98C379"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"One Half Dark"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#C678DD"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#E06C75"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#DCDFE4"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#E5C07B"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#FAFAFA"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#383A42"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#0184BC"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#4F525D"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#61AFEF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#56B5C1"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#98C379"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#C577DD"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#DF6C75"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#E4C07A"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#4F525D"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#0997B3"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#383A42"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#50A14F"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"One Half Light"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#A626A4"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#E45649"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#FAFAFA"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#C18301"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#002B36"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#002B36"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#268BD2"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#073642"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#839496"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#93A1A1"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#586E75"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#6C71C4"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#CB4B16"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#FDF6E3"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#657B83"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#2AA198"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#839496"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#859900"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Solarized Dark"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#D33682"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#DC322F"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#EEE8D5"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#B58900"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#FDF6E3"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#002B36"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#268BD2"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#073642"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#839496"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#93A1A1"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#586E75"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#6C71C4"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#CB4B16"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#FDF6E3"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#657B83"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#002B36"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#2AA198"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#657B83"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#859900"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Solarized Light"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#D33682"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#DC322F"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#EEE8D5"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#B58900"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#3465A4"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#555753"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#729FCF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#34E2E2"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#8AE234"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#AD7FA8"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#EF2929"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#EEEEEC"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#FCE94F"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#06989A"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#D3D7CF"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#4E9A06"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Tango Dark"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#75507B"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#CC0000"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#D3D7CF"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#C4A000"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#3465A4"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#555753"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#729FCF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#34E2E2"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#8AE234"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#AD7FA8"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#EF2929"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#EEEEEC"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#FCE94F"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#06989A"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#555753"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#4E9A06"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Tango Light"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#75507B"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#CC0000"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#D3D7CF"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#C4A000"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#300A24"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#171421"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#0037DA"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#767676"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#08458F"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#2C9FB3"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#26A269"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#A347BA"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#C01C28"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#F2F2F2"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#A2734C"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#3A96DD"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#26A269"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Ubuntu-20.04-ColorScheme"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#881798"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#C21A23"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#CCCCCC"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#A2734C"</span>        <span class="token punctuation">}</span><span class="token punctuation">,</span>        <span class="token punctuation">{</span>            <span class="token property">"background"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"black"</span><span class="token operator">:</span> <span class="token string">"#000000"</span><span class="token punctuation">,</span>            <span class="token property">"blue"</span><span class="token operator">:</span> <span class="token string">"#000080"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlack"</span><span class="token operator">:</span> <span class="token string">"#808080"</span><span class="token punctuation">,</span>            <span class="token property">"brightBlue"</span><span class="token operator">:</span> <span class="token string">"#0000FF"</span><span class="token punctuation">,</span>            <span class="token property">"brightCyan"</span><span class="token operator">:</span> <span class="token string">"#00FFFF"</span><span class="token punctuation">,</span>            <span class="token property">"brightGreen"</span><span class="token operator">:</span> <span class="token string">"#00FF00"</span><span class="token punctuation">,</span>            <span class="token property">"brightPurple"</span><span class="token operator">:</span> <span class="token string">"#FF00FF"</span><span class="token punctuation">,</span>            <span class="token property">"brightRed"</span><span class="token operator">:</span> <span class="token string">"#FF0000"</span><span class="token punctuation">,</span>            <span class="token property">"brightWhite"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"brightYellow"</span><span class="token operator">:</span> <span class="token string">"#FFFF00"</span><span class="token punctuation">,</span>            <span class="token property">"cursorColor"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"cyan"</span><span class="token operator">:</span> <span class="token string">"#008080"</span><span class="token punctuation">,</span>            <span class="token property">"foreground"</span><span class="token operator">:</span> <span class="token string">"#C0C0C0"</span><span class="token punctuation">,</span>            <span class="token property">"green"</span><span class="token operator">:</span> <span class="token string">"#008000"</span><span class="token punctuation">,</span>            <span class="token property">"name"</span><span class="token operator">:</span> <span class="token string">"Vintage"</span><span class="token punctuation">,</span>            <span class="token property">"purple"</span><span class="token operator">:</span> <span class="token string">"#800080"</span><span class="token punctuation">,</span>            <span class="token property">"red"</span><span class="token operator">:</span> <span class="token string">"#800000"</span><span class="token punctuation">,</span>            <span class="token property">"selectionBackground"</span><span class="token operator">:</span> <span class="token string">"#FFFFFF"</span><span class="token punctuation">,</span>            <span class="token property">"white"</span><span class="token operator">:</span> <span class="token string">"#C0C0C0"</span><span class="token punctuation">,</span>            <span class="token property">"yellow"</span><span class="token operator">:</span> <span class="token string">"#808000"</span>        <span class="token punctuation">}</span>    <span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token property">"theme"</span><span class="token operator">:</span> <span class="token string">"dark"</span><span class="token punctuation">,</span>    <span class="token property">"themes"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>    <span class="token property">"useAcrylicInTabRow"</span><span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>总结一下：</p><ul class="lvl-0"><li class="lvl-2"><p>默认配置文件：选择对应 WSL 的那个，如<code>Ubuntu-20.04</code></p></li><li class="lvl-2"><p>字体：<a href="https://github.com/subframe7536/maple-font">Maple Mono NF</a></p></li><li class="lvl-2"><p>快捷键：采用默认快捷键，但是注意 <code>Ctrl+v</code> 这种会和 vim 冲突的键位需要改掉</p></li><li class="lvl-2"><p>外观</p><ul class="lvl-2"><li class="lvl-4">光标：<code>|</code></li><li class="lvl-4">透明度：<code>80%</code></li><li class="lvl-4">亚克力：开启</li><li class="lvl-4">配色方案：<code>Tango Dark</code></li></ul></li></ul><p>这里再给上两篇文章以供参考：</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://learn.microsoft.com/zh-cn/windows/wsl/setup/environment#set-up-windows-terminal">设置 Windows Terminal</a></p></li><li class="lvl-2"><p><a href="https://sspai.com/post/59380">Windows Terminal 的全面自定义</a></p></li></ul><h3 id="安装-WSL-环境"><a class="header-anchor" href="#安装-WSL-环境">¶</a> 安装 WSL 环境</h3><blockquote><p>操作参考：</p><ul class="lvl-1"><li class="lvl-2"><a href="https://learn.microsoft.com/zh-cn/windows/wsl/install">安装 WSL</a></li><li class="lvl-2"><a href="https://learn.microsoft.com/zh-cn/windows/wsl/setup/environment">设置 WSL 开发环境</a></li></ul></blockquote><p>打开 PowerShell 输入以下命令进行安装</p><pre class="line-numbers language-powershell" data-language="powershell"><code class="language-powershell"><span class="token comment">## 使用管理员运行</span>wsl <span class="token operator">--</span>install<span class="token comment">## 安装完成后可以使用以下命令查看可供安装的 Linux 发行版</span>wsl <span class="token operator">-</span>l <span class="token operator">-</span>o<span class="token comment"># 以下是可安装的有效分发的列表。</span><span class="token comment"># 使用 'wsl.exe --install &lt;Distro&gt;' 安装。</span><span class="token comment"># NAME                            FRIENDLY NAME</span><span class="token comment"># Ubuntu                          Ubuntu</span><span class="token comment"># Debian                          Debian GNU/Linux</span><span class="token comment"># kali-linux                      Kali Linux Rolling</span><span class="token comment"># Ubuntu-18.04                    Ubuntu 18.04 LTS</span><span class="token comment"># Ubuntu-20.04                    Ubuntu 20.04 LTS</span><span class="token comment"># Ubuntu-22.04                    Ubuntu 22.04 LTS</span><span class="token comment"># Ubuntu-24.04                    Ubuntu 24.04 LTS</span><span class="token comment"># OracleLinux_7_9                 Oracle Linux 7.9</span><span class="token comment"># OracleLinux_8_7                 Oracle Linux 8.7</span><span class="token comment"># OracleLinux_9_1                 Oracle Linux 9.1</span><span class="token comment"># openSUSE-Leap-15.6              openSUSE Leap 15.6</span><span class="token comment"># SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5</span><span class="token comment"># SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6</span><span class="token comment"># openSUSE-Tumbleweed             openSUSE Tumbleweed</span><span class="token comment">## 使用 wsl --install -d &lt;Distribution Name&gt; 进行安装，这里我们安装 Ubuntu</span>wsl <span class="token operator">--</span>install <span class="token operator">-</span>d Ubuntu<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>WSL 的好处在于 Windows 和 Linux 之间的文件系统可以互相访问，网络也可以通过 NAT 或者桥接打通，比传统的虚拟机要方便很多（虽然 WSL 也是个虚拟机），下面放上一些文章以供大家学习：</p><ul class="lvl-0"><li class="lvl-2"><p><a href="https://learn.microsoft.com/zh-cn/windows/wsl/compare-versions">比较 WSL 版本</a></p></li><li class="lvl-2"><p><a href="https://jia.je/os/2023/10/03/wsl2-internals">WSL2 内部实现探究</a></p></li><li class="lvl-2"><p><a href="https://hackmd.io/@billsun/Bkh8oAmGX?type=view">WSL 原理介绍</a></p></li></ul><h3 id="配置-WSL-环境"><a class="header-anchor" href="#配置-WSL-环境">¶</a> 配置 WSL 环境</h3><p>作为日常工作的 80% 甚至是 90% 的系统环境，配置一个方便好用的 Linux 能够给工作体验和效率带来极大的提升，正所谓磨刀不误砍柴工，乱拳打死老师傅。这里以 Ubuntu 为例，记录一下 Linux 环境的配置内容：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 1. 更换软件源(源是什么？ --&gt;  https://flyflypeng.tech/%E5%88%A9%E5%99%A8/2016/10/24/Ubuntu%E8%BD%AF%E4%BB%B6%E6%BA%90%E8%AF%A6%E8%A7%A3.html)</span><span class="token comment">## 以往都是用 aliyun 源的，最近比较喜欢清华源 ~</span><span class="token function">sudo</span> <span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g'</span> /etc/apt/sources.list<span class="token comment"># 2. 安装常用软件</span><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token function">git</span> net-tools <span class="token function">vim</span> tmux <span class="token function">zsh</span> dstat sysstat bat <span class="token function">curl</span> <span class="token function">htop</span> <span class="token parameter variable">-y</span><span class="token comment"># 3. tmux 配置</span><span class="token comment">## 对于 tmux 的配置，我这里仅推荐 GitHub 上的开源项目 .tmux --&gt; https://github.com/gpakosz/.tmux，其余的大家可以自行去网络上搜索</span><span class="token builtin class-name">cd</span> ~<span class="token function">git</span> clone https://github.com/gpakosz/.tmux.git<span class="token function">ln</span> <span class="token parameter variable">-s</span> <span class="token parameter variable">-f</span> .tmux/.tmux.conf<span class="token function">cp</span> .tmux/.tmux.conf.local <span class="token builtin class-name">.</span><span class="token comment">## 除此之外，我一般还会额外打开 tmux 的一些配置</span><span class="token builtin class-name">set</span> <span class="token parameter variable">-g</span> history-limit <span class="token number">10000</span>    <span class="token comment">## tmux 默认的历史纪录太少了，多搞点</span><span class="token builtin class-name">set</span> <span class="token parameter variable">-g</span> set-clipboard on    <span class="token comment">## 打开选中复制，当然你可以使用 Windows terminal 的选中复制功能</span><span class="token builtin class-name">set</span> <span class="token parameter variable">-g</span> mouse on    <span class="token comment">## 打开鼠标支持，这样就不用 Ctrl+B 切换 panel 了</span><span class="token comment">## 关于 tmux 使用的一些推荐阅读：</span><span class="token comment">## - https://www.ruanyifeng.com/blog/2019/10/tmux.html</span><span class="token comment">## - https://pengfeixc.com/blogs/developer-handbook/tmux.html</span><span class="token comment">## - https://www.escapelife.site/posts/1a9a72ec.html</span><span class="token comment"># 4. Docker</span><span class="token comment">## 容器技术已经成为当前最廉价的技术了，作为一名运维工程师，docker 是一个必知必会的技能，不管你日常用的多还是少，先把 docker 在你自己的系统装上</span><span class="token function">install</span> <span class="token parameter variable">-m</span> 0755 <span class="token parameter variable">-d</span> /etc/apt/keyrings<span class="token function">curl</span> <span class="token parameter variable">-fsSL</span> https://download.docker.com/linux/ubuntu/gpg <span class="token operator">|</span> gpg <span class="token parameter variable">--dearmor</span> <span class="token parameter variable">-o</span> /etc/apt/keyrings/docker.gpg<span class="token function">sudo</span> <span class="token function">chmod</span> a+r /etc/apt/keyrings/docker.gpg<span class="token builtin class-name">echo</span> <span class="token punctuation">\</span>  <span class="token string">"deb [arch=<span class="token variable"><span class="token variable">$(</span>dpkg --print-architecture<span class="token variable">)</span></span> signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \  "</span><span class="token variable"><span class="token variable">$(</span><span class="token builtin class-name">.</span> /etc/os-release <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">echo</span> <span class="token string">"<span class="token variable">$VERSION_CODENAME</span>"</span><span class="token variable">)</span></span><span class="token string">" stable"</span> <span class="token operator">|</span> <span class="token punctuation">\</span>  <span class="token function">tee</span> /etc/apt/sources.list.d/docker.list <span class="token operator">&gt;</span> /dev/null<span class="token function">apt-get</span> update<span class="token function">apt-get</span> <span class="token function">install</span> docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin <span class="token parameter variable">-y</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里单独说一下 zsh 的配置，首当其冲的肯定是把 oh-my-zsh 给装上</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sh</span> <span class="token parameter variable">-c</span> <span class="token string">"<span class="token variable"><span class="token variable">$(</span><span class="token function">curl</span> <span class="token parameter variable">-fsSL</span> https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh<span class="token variable">)</span></span>"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>接着肯定是要换一个美美的皮肤（bushi），主题的配置可以参考官方文档 <a href="https://github.com/ohmyzsh/ohmyzsh/wiki/Themes">Themes|oh-my-zsh wiki</a>，我的配置如下：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">ZSH_THEME</span><span class="token operator">=</span><span class="token string">"powerlevel10k/powerlevel10k"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>zsh 对于我来说，提效最大的还是他的一堆插件了，这里先贴一下当前已用的插件：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">plugins</span><span class="token operator">=</span><span class="token punctuation">(</span>    zsh-ssh    ssh-agent    aliases    zsh-autosuggestions    safe-paste    F-Sy-H    z    <span class="token function">cp</span>    copyfile    copybuffer    copypath    <span class="token function">git</span>    fzf    <span class="token function">sudo</span>    kube-ps1<span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>像常见的 <code>zsh-autosuggestions</code>、<code>cp</code>、<code>git</code> 以及 <code>sudo</code> 等插件这里就不多提及了，基本上是网上提到过比较的好用的插件了，大家可以自行去搜索。下面来说一些我个人觉得很好用的插件：</p><ol><li class="lvl-3"><p><a href="https://github.com/sunlei/zsh-ssh">zsh-ssh</a><br><code>zsh-ssh</code> 是我目前强推的一个 zsh 插件，该插件会去读取 <code>~/.ssh/config</code> 文件中的配置并通过 <code>fzf</code> 将其可交互显示，也就是说我们可以通过命令界面动态展示 ssh host 列表并选择连接。由于该插件还依赖 <code>fzf</code>，所以先安装 <code>fzf</code> 再安装 <code>zsh-ssh</code>。</p> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">## 安装 fzf</span><span class="token function">git</span> clone <span class="token parameter variable">--depth</span> <span class="token number">1</span> https://github.com/junegunn/fzf.git ~/.fzf~/.fzf/install<span class="token function">cat</span> <span class="token operator">&lt;&lt;</span> <span class="token string">EOF<span class="token bash punctuation"> <span class="token operator">&gt;</span> ~/.zshrc</span># Set up fzf key bindings and fuzzy completionsource &lt;(fzf --zsh)EOF</span><span class="token builtin class-name">source</span> .zshrc<span class="token comment">## 安装 zsh-ssh</span><span class="token function">git</span> clone https://github.com/sunlei/zsh-ssh <span class="token variable">${ZSH_CUSTOM<span class="token operator">:-</span>~<span class="token operator">/</span>.oh-my-zsh<span class="token operator">/</span>custom}</span>/plugins/zsh-ssh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>上面说到了，<code>zsh-ssh</code> 这个插件是读取 <code>~/.ssh/config</code> 文件中的配置来显示 ssh host 的，因此我们还需要将 ssh host 信息写入配置文件，我自己是写了一个脚本来生成 ssh host，具体的配置格式参考如下：</p> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">Host Bastion-HostHostname <span class="token number">1.1</span>.1.1User sunlei Host Development-HostHostname <span class="token number">2.2</span>.2.2IdentityFile ~/.ssh/development-host<span class="token comment">#_Desc For Development</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li class="lvl-3"><p><a href="https://github.com/z-shell/F-Sy-H">F-sy-H</a><br>相较于网上文档里说的比较多的<a href="https://github.com/zsh-users/zsh-syntax-highlighting">zsh-users/zsh-syntax-highlighting</a>，<code>F-sy-H</code> 插件的高亮配色会更加丰富一些，虽然没有什么大用，但是好看就完事了</p> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">git</span> clone https://github.com/z-shell/F-Sy-H.git <span class="token variable">${ZSH_CUSTOM<span class="token operator">:-</span>$HOME<span class="token operator">/</span>.oh-my-zsh<span class="token operator">/</span>custom}</span>/plugins/F-Sy-H<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre></li><li class="lvl-3"><p><a href="https://github.com/jonmosco/kube-ps1">kube-ps1</a><br><code>kube-ps1</code> 插件是用来显示当前所应用的 K8s 集群信息的，由于已经被 zsh 集成为默认插件了，所以不需要的单独安装，直接在 <code>~/.zshrc</code> 中配置即可</p> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">## 除了配置 plugins 外，还需要添加 PROMPT 变量</span><span class="token assign-left variable">PROMPT</span><span class="token operator">=</span><span class="token string">'$(kube_ps1)'</span><span class="token variable">$PROMPT</span> <span class="token comment"># or RPROMPT='$(kube_ps1)'</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre></li><li class="lvl-3"><p><a href="https://github.com/agkozak/zsh-z">z</a><br><code>z</code> 插件会基于历史访问过的目录进行快速跳转，无需输入全路径即可跳转，按下 <code>tab</code> 键即可显示历史目录列表，选择后回车即可跳转。<code>z</code> 已经被集成进 zsh 默认插件列表，无需单独安装。</p></li><li class="lvl-3"><p><a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/ssh-agent">ssh-agent</a><br>既然我们都这么依赖 ssh 来工作了，那么 <code>ssh-agent</code> 插件就必不可少，该插件会自动帮我们设置一些 ssh-agent 相关的配置，加载 credentials。由于该插件是 zsh 默认的插件，所以无需单独安装，直接在 <code>~/.zshrc</code> 中配置即可</p> <pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">## 配置 agent-forwading</span>zstyle :omz:plugins:ssh-agent agent-forwarding <span class="token function">yes</span><span class="token comment">## 配置 identities</span>zstyle :omz:plugins:ssh-agent identities id_rsa id_rsa2 id_github    <span class="token comment">## 如果 identities 不在 ~/.ssh 目录下，则要写绝对路径</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ol>]]></content>
    
    
    <summary type="html">&lt;p&gt;俗话说的好，工欲善其事必先利其器，要想活干得漂亮，就得有一个趁手的兵器。对于运维人来说，一个好的 Terminal，绝对可以大大滴提高工作效率。&lt;/p&gt;
&lt;p&gt;曾经的我是 Ubuntu 的无脑吹、脑残粉，主要是命令行配合着一众工具使用起来非常丝滑，效率极高。而在 Windows 上除了安装各种执行环境配置环境变量外，还需要借助 xShell 这类工具来完成我的日常工作，虽然当时也折腾过一段时间的 &lt;a href=&quot;https://cmder.app/&quot;&gt;&lt;code&gt;cmder&lt;/code&gt;&lt;/a&gt;，但却是没有原生 Terminal 顺滑。&lt;/p&gt;
&lt;p&gt;好在巨硬还有良心，推出了 &lt;a href=&quot;https://github.com/microsoft/terminal&quot;&gt;Windows Terminal&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/microsoft/WSL&quot;&gt;WSL&lt;/a&gt;，一度让我从 Ubuntu 脑残粉变成了 Windows 无脑吹~ 本文则是用来记录一下我自己的终端配置，因为我的工作环境几乎是跑在 WSL 上的，所以 Linux 和 MacOS 均可借鉴。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="terminal" scheme="https://blog.skyhive.tech/tags/terminal/"/>
    
    <category term="env" scheme="https://blog.skyhive.tech/tags/env/"/>
    
    <category term="工欲善其事" scheme="https://blog.skyhive.tech/tags/%E5%B7%A5%E6%AC%B2%E5%96%84%E5%85%B6%E4%BA%8B/"/>
    
  </entry>
  
  <entry>
    <title>槟城旅行指北</title>
    <link href="https://blog.skyhive.tech/post/1b4b0584.html"/>
    <id>https://blog.skyhive.tech/post/1b4b0584.html</id>
    <published>2024-09-02T13:50:32.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>2023/12/26 我第一次出国，和女朋友来到了马来西亚，囫囵吞枣式的游玩让我往返了吉隆坡和槟城两座城市，体验了大马的<strong>飞机、高铁、轮渡</strong>以及<strong>地铁</strong>这四种交通工具。但也因为是第一次踏上这片陌生的领土，即便之前的准备做得再充分，也难免有很多无法顾及的地方，因此时隔八个月，我们将再次踏上这片熟悉又陌生的领土，特此写下一篇槟城旅行指北（<s><strong>不是游记，不是游记，不是游记</strong></s>）</p><span id="more"></span><h3 id="前期准备"><a class="header-anchor" href="#前期准备">¶</a> 前期准备</h3><h4 id="交通"><a class="header-anchor" href="#交通">¶</a> 交通</h4><table><thead><tr><th>时间</th><th>始发地</th><th>目的地</th><th>航班</th></tr></thead><tbody><tr><td><code>2024-08-30 00:15 ~ 05:35</code></td><td>杭州 HGH T4</td><td>吉隆坡 KUL T2</td><td>D7307 空客 330</td></tr><tr><td><code>2024-08-30 07:50 ~ 08:50</code></td><td>吉隆坡 KUL T2</td><td>槟城 PEN D</td><td>AK6112 空客 320</td></tr><tr><td><code>2024-09-03 11:25 ~ 12:50</code></td><td>槟城 PEN I</td><td>新加坡 SIN T1</td><td>TR427 空客 321</td></tr><tr><td><code>2024-09-03 16:30 ~ 21:35</code></td><td>新加坡 SIN T1</td><td>杭州 HGH T4</td><td>TR188 波音 787</td></tr></tbody></table><p><s>本来有一个往返 <strong><code>槟城</code></strong> 和 <strong><code>怡保</code></strong> 的高铁 / 巴士行程，但是由于马来国庆加上个人赖床因素，不得已取消了</s></p><p>截至本文发布，国内应该仅有<strong>上海浦东</strong>、<strong>重庆</strong>、<strong>厦门、深圳</strong>以及<strong>广州</strong>拥有直飞的航线，其他城市都要去其他东南亚城市进行转机（吉隆坡、亚庇或者新加坡），因此我作为杭州出发的旅客，只能往返两次转机了。</p><h4 id="行李"><a class="header-anchor" href="#行李">¶</a> 行李</h4><p>此次贪便宜，往返机票均购买于廉航，因此并没有托运行李，且登机所能携带的首体行李额被限制在了 <strong>7kg / 人</strong> (返程酷航为 <strong>10kg / 人</strong>)。<br>由于去年是反季出行 (杭州冬季去往热带地区)，两个人带着两个行李箱和大包小包，确实非常的不方便，本次得益于航司的限制，强行给了我们一次轻装出行的机会。出行前也在网上学习了一番背包出行 / 收纳的知识点，最终以最小的代价准备好了出行的行李</p><ul class="lvl-0"><li class="lvl-2"><p>背包</p><ul class="lvl-2"><li class="lvl-4">旧背包改造<ul class="lvl-4"><li class="lvl-6">背包承重腰带：淘宝上有很多，推荐那些没有承重腰带的背包升级，背负大重量行李时可有效减少上背部的肌肉压力</li><li class="lvl-6">背包胸扣：淘宝上也有很多，不是特别推荐升级，但是好在这玩意儿不贵，升级前也先确认自己的背包是否有升级接口（实在不行可以自己缝合）</li></ul></li><li class="lvl-4">老背包复用：之前买小米电饭煲送了一个小背包，可以用于日常出行背负</li><li class="lvl-4">新背包购买：迪卡侬 MH100 20L 户外背包</li></ul></li><li class="lvl-2"><p>行李内容</p></li></ul><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">衣物</button><button type="button" class="tab">药物</button><button type="button" class="tab">电子产品</button><button type="button" class="tab">日用品</button></div><div class="tab-contents"><div class="tab-item-content active"><ul class="lvl-0"><li class="lvl-2"><p>短袖短裤：以涤纶速干材质为主，主打一个透气、速干、重量轻</p></li><li class="lvl-2"><p>外套：依然以涤纶速干材质为主，可直接复用防晒外套</p></li><li class="lvl-2"><p>防晒外套 / 冰袖：如上</p></li><li class="lvl-2"><p>内衣裤：<strong>一次性</strong>或者即将淘汰的，穿完直接扔掉</p></li><li class="lvl-2"><p>袜子：带一双防止飞机上冷</p></li><li class="lvl-2"><p>鞋子：脚穿一双<code>洞洞鞋/溯溪鞋</code>即可</p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>内服类：止疼、感冒、退烧、腹泻、胃药等</p></li><li class="lvl-2"><p>外用类：创口贴、医用绷带（小）</p></li><li class="lvl-2"><p>日常类：维生素、鱼油、自用药类</p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>笔记本电脑：运维是这样的，到哪里都得背着电脑</p></li><li class="lvl-2"><p>iPad：女友工作需要</p></li><li class="lvl-2"><p>拍摄器材：手机 + 稳定器</p></li><li class="lvl-2"><p>充电宝：去年沈阳飞机上捡的，15W 慢充 10000mah</p></li><li class="lvl-2"><p>充电转换头：大马为英标接口，需要带转换头</p></li><li class="lvl-2"><p>充电器：<code>Xiaomi GaN 65W</code> / <code>Xiaomi 14 90W</code> / <code>Thinkplus 65W</code></p></li></ul></div><div class="tab-item-content"><ul class="lvl-0"><li class="lvl-2"><p>小米剃须刀</p></li><li class="lvl-2"><p>电话卡</p><ul class="lvl-2"><li class="lvl-4">国内电话开漫游，就是有点贵</li><li class="lvl-4">网购当地电话卡，比较便宜，流量充足</li></ul></li><li class="lvl-2"><p>U 型枕：机上睡觉使用</p></li><li class="lvl-2"><p>漱口水：由于是半夜的航班，准备几条漱口水</p></li><li class="lvl-2"><p>防晒霜：很重要，人家这里是热带地区</p></li><li class="lvl-2"><p>牙线棒：这次忘带了（非必须）</p></li></ul></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><p>以上，我们最终将两人行李总重控制在了 <strong>12kg</strong> 以内，迈出了背包旅行的第一步~</p><h4 id="住宿"><a class="header-anchor" href="#住宿">¶</a> 住宿</h4><p>槟城很大（马来西亚是联邦州属国家，槟城是十三个州属之一，又称槟州），旅行热门的地区当属槟州的首府 ——George Town 和北边的 Batu Ferringhi 海滩，但实际上槟城的海滩并不出名（水质不好，水上项目也不多，整个西马的海滩也就 <strong>兰卡威、大小停泊岛</strong> 以及 <strong>热浪岛</strong> 叫的出名了），我们此次出行的目的地自然就是槟城旅游热度第一的 George Town 了。</p><p>由于 George Town 很小，城内任意一家酒店或者民宿均可，但由于是老城区，民宿的设施可能不会不太尽人意，秉承着多一事不如少一事的原则，我们还是选择入住酒店</p><table><thead><tr><th>时间</th><th>酒店</th><th>地址</th><th>价格</th><th>备注</th></tr></thead><tbody><tr><td><code>2024-08-30 ~ 2024-09-03</code></td><td>Royale Chulan Penang</td><td>1&amp;2,Pengkalan Weld,Georgetown,<br>Penang,Malaysia</td><td>USD 225.37</td><td>大床房，含早</td></tr></tbody></table><p>这里再放一个我们去年住过的酒店</p><table><thead><tr><th>时间</th><th>酒店</th><th>地址</th><th>价格</th><th>备注</th></tr></thead><tbody><tr><td><code>2023-12-28 ~ 2023-12-30</code></td><td>Sunway Hotel Georgetown Penang</td><td>33,Lorong Baru,George Town,<br>Penang,Malaysia</td><td>￥933.7</td><td>大床房，不含早</td></tr></tbody></table><p><img src="https://blogpic.skyhive.tech/pic/hotel-map.png" alt="hotel-map"></p><h4 id="入境"><a class="header-anchor" href="#入境">¶</a> 入境</h4><p>虽然马来西亚针对持有中国护照的公民进行为期 30 天的免签，但是入境前三天还是需要填写 <strong>MDAC</strong> (<em>Malaysia Digital Arrival Card</em>) 以作为其入境资料。详细填写请移步至<a href="https://imigresen-online.imi.gov.my/mdac/main#:~:text=How%20to%20register%20Malaysia%20Digital%20Arrival">马来西亚移民局</a>（可能需要科学上网）</p><div class="note 需要注意 flat"><p>虽然说现在持有中国护照的公民入境大马可享受自助闸机丝滑入境，但貌似仅限吉隆坡，如果是转机用户，或者其他城市入境，还是会需要人工过海关，海关还是会看你的返程机票以及住宿信息</p></div><h3 id="游玩指南"><a class="header-anchor" href="#游玩指南">¶</a> 游玩指南</h3><h4 id="吃"><a class="header-anchor" href="#吃">¶</a> 吃</h4><p>槟城的饮食继承了马来西亚的一些特点，如菜系多元化、调味多用木姜辣椒等，但是由于本地华人居多（尤其是福建、潮汕地区的华裔），当地的饮食很大程度上也受到了我们东南沿海的影响，因此带着中国胃来的我们，也不用怕吃不惯了。</p><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">福建虾面</button><button type="button" class="tab">肉骨茶</button><button type="button" class="tab">海南鸡饭</button><button type="button" class="tab">沙爹</button><button type="button" class="tab">炒粉/粿条/蚵仔煎</button><button type="button" class="tab">中餐炒菜</button><button type="button" class="tab">椰浆饭</button></div><div class="tab-contents"><div class="tab-item-content active"><p>福建虾面其实指的是槟城的福建人做的虾面，在福建其实并没有这玩意儿，是槟城的特色美食之一。虾面的特点是使用大量的虾头熬制汤头，所谓的面一般使用的黄面条和米粉，配菜则是虾、蛋、肉片等，最后来一勺参巴辣酱。<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Hokkien%20mee.jpg">https://blogpic.skyhive.tech/pic/Hokkien mee.jpg</a>” width=“50%”&gt;<br>另外，对于福建虾面的叫法各地都有争议，槟城、吉隆坡以及新加坡都有福建面的叫法，但是做法多有不同，但在槟城街头大多为福建虾面。由于槟城街头的小摊和档口都有福建虾面，这里则不再单独介绍店面。</p></div><div class="tab-item-content"><blockquote><p>“肉骨 "如其名，是以带肉的骨配合中药煲成的汤。而" 茶 "字则是源自当地一位华人餐厅店主的名字" 李文地”，因为卖该种肉骨汤且味道上乘，而被顾客称作 "肉骨地"，福建话中的 "地" 与 "茶" 音近，故后来被称为 "肉骨茶"。食材本身并没有茶叶。</p><p>肉骨茶通常伴白饭或以油条蘸汤来吃。以酱油、碎红椒和蒜蓉一起调味。通常会奉上中式浓茶解油腻。在马来西亚，肉骨茶是一道典型的早点菜式</p></blockquote><p>以上为维基百科的介绍，在马来，<strong>肉骨茶</strong>还有着干锅和汤锅的版本区分，汤锅就是传统的肉骨茶，而干锅则是大火收汁，做得浓油赤酱的版本（相信上海的朋友应该会比较喜欢）。和福建虾面一样，肉骨茶也基本上可以在各大小吃街和大排档找到，不过根据网友所说，好吃的肉骨茶还是在<strong>吉隆坡</strong>和<strong>巴生</strong>。<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Bak%20Kut%20Teh.jpg">https://blogpic.skyhive.tech/pic/Bak Kut Teh.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><blockquote><p>海南鸡饭在马来半岛地区的起源一直都存在争议，但如今普遍被奉为新加坡的国菜。新加坡独立后，华人占该国国民比率较高，比起马来西亚，新加坡政府对于当地传统华人美食更为注重，同时运用各种管道为海南鸡饭进行包装及推销，加上其为全球最国际化的城市之一，有足够平台为美食打知名度，也让当地海南鸡饭得以成为世界知名料理</p></blockquote><p><s>除了前面的福建、潮汕菜系外，槟城还有海南菜，而海南鸡饭就是流行在大街小巷的代表菜。</s> 我一直以为海南鸡饭是海南菜，没想到是去了东南亚的海南人做的菜（当然也可能是早期海南菜系的做法，这里就不再争论出处了），在这里先道个歉</p><p>基本上任意一个夜市或者大排档都会有海南鸡饭的身影，口味也比较符合中国胃，相较于之前在吉隆坡商场里和飞机上吃过的海南鸡饭，夜市的这份可太好吃了。<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Hainanese%20Chicken%20Rice.jpg">https://blogpic.skyhive.tech/pic/Hainanese Chicken Rice.jpg</a>” width=“50%”&gt;<br>在槟城的小摊或者档口，海南鸡饭除了白鸡之外，还有我上面吃的烧鸡，所以大家不要喷我吃的不正宗（狗头保命）</p></div><div class="tab-item-content"><blockquote><p>** 沙爹（马来语：Sapi）** 是马来西亚槟城地区一种常见的特色小吃，属于马来菜系。</p></blockquote><p>所谓<strong>沙爹</strong>，就是马来的烧烤。和国内烧烤不同的是，沙爹的调味以甜辣为主，香辛料比较单一，不会像国内烧烤有复杂的口感和味道，初次是会有不一样多个感觉，吃多了还是觉得中国的烧烤才是最屌的。<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Sapi.jpg">https://blogpic.skyhive.tech/pic/Sapi.jpg</a>” width=“50%”&gt;<br>不过需要多说一句，虽然你在槟城也能见到一些 <strong><code>中国烧烤</code></strong> 的摊子，但是口味还是被马来本土化过的，和国内烧烤还是有着很大差异，尝个新鲜是没问题的~<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Chinese%20BBQ.jpg">https://blogpic.skyhive.tech/pic/Chinese BBQ.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><p>和福建虾面、海南鸡饭这种街头随处可见的中式小吃一样，我们在任意的大排档都能见到<strong>炒河粉</strong>、<strong>炒粿条 / 粿角</strong>以及<strong>蚵仔煎</strong>的身影，而且这些潮汕小吃也确实深受马来人的喜爱，甚至我们一度见到有些摊位排队爆满，永远是大排长龙，无法近身<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Oyster%20Omelette.jpg">https://blogpic.skyhive.tech/pic/Oyster Omelette.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><p>当年华人下南洋，很多都留在了槟城，至今槟城貌似也是马来华人占比最多的地区，因此在槟城也有很多华人餐馆。但是菜系大多以福建、广东、海南地区为主，并且融合了一些马来本地的特色，这些参观大多活跃在大众点评、小红书、抖音等网络平台上，喜欢网上冲浪的同学可以自行探索，这里就不过多推荐</p><p>这里提一个我们去过两次的海鲜餐馆 —— <code>记得来三定</code>，老板活跃在小红书，是槟城比较火的餐馆之一，价格不算便宜，但是味道还不错<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/sanding%20seafood.jpg">https://blogpic.skyhive.tech/pic/sanding seafood.jpg</a>” width=“50%”&gt;<br>本次菜单：</p><ul class="lvl-0"><li class="lvl-2"><p>海蟹 x2（甘香）- 84RM</p></li><li class="lvl-2"><p>姜葱虾姑 (小份) - 18RM</p></li><li class="lvl-2"><p>啤汁排骨 (小份) - 18RM</p></li><li class="lvl-2"><p>印尼咖喱虾 x6 - 36RM</p></li></ul><p>以上折后共消费 148RM (根据当时汇率为 ￥244.84)</p></div><div class="tab-item-content"><p>最后不得不提一下 <strong><code>椰浆饭</code></strong>，辣死你妈（Nasi Lemak） —— 马来西亚国菜，这玩意儿我是真的吃不惯，一是不习惯用椰浆煮出来的米饭的口感，二是不喜欢其中姜的调味，但是口味这个东西因人而异，所以还是建议大家尝试一下，毕竟是人家的国菜，总有站得住脚的地方~<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Nasi%20Lemak-1.jpg">https://blogpic.skyhive.tech/pic/Nasi Lemak-1.jpg</a>” width=“50%”&gt;</p><p>这里推荐一个档口 —— <code>Ali Nasi Lemak Daun Pisang</code>，其中的椰浆饭连续荣获 2023 和 2024 年度的米其林提名，最重要的是价格是真便宜，最低 2RM（￥3.2） 就能吃一份。此外，这个档口是开在一家大排档的门口，前面说到的福建虾面也是在这里吃的<br>这个虽然看着很寡淡，但仅售 2RM，还要什么自行车<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Nasi%20Lemak-2.jpg">https://blogpic.skyhive.tech/pic/Nasi Lemak-2.jpg</a>” width=“50%”&gt;</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><p>当然除此之外，槟城还有很多美食没有在这里介绍，除了中式的粿条汤、肉卷、云吞面之外，还有一些印度菜（印度人是马来除了马来人和华人外的第三大人种）和泰国菜，以及马来本土菜系 —— 娘惹菜，所以槟城真的是当之无愧的美食之都，喜欢吃吃吃的朋友真的不容错过。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/food-1.jpg","alt":"food-1","title":""},{"url":"https://blogpic.skyhive.tech/pic/food-2.jpg","alt":"food-2","title":""},{"url":"https://blogpic.skyhive.tech/pic/food-3.jpg","alt":"food-3","title":""}]</div>  </div><p>最后给大家推荐一些小吃街：</p><ul class="lvl-0"><li class="lvl-2"><p>Jelutong Night Market：日落洞周五夜市，顾名思义，只有周五才开，别跑空了</p></li><li class="lvl-2"><p>Batu Ferringhi Night Market：如果你晚上住在 Batu Ferringhi，可以去逛一逛，小吃摊多到爆炸，还有两个大排档</p></li><li class="lvl-2"><p>Macallum Street Night Market：五条路夜市，离日落洞和姓氏桥那里的小吃街不远，如果你精力足够的话，可以一直吃</p></li><li class="lvl-2"><p>姓氏桥：其实这不是个夜市，沿着姓氏桥的大马路，街边全都是小吃摊和大排档</p></li><li class="lvl-2"><p>Gurney Drive Hawker Centre：新关仔角小吃街，这个没去过，据说很有名</p></li><li class="lvl-2"><p>Sunway Hotel 楼下：对的，酒店楼下就是小吃街，上面和下面的一些图片就出自这里，甚至还有下面的猫山王、竹脚以及红虾</p></li></ul><h4 id="喝"><a class="header-anchor" href="#喝">¶</a> 喝</h4><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">白咖啡</button><button type="button" class="tab">果汁</button><button type="button" class="tab">煎蕊</button></div><div class="tab-contents"><div class="tab-item-content active"><blockquote><p>白咖啡源于英国统治马来半岛的英属马来亚时期，当时英国雇用当地人做管家及佣人，英国雇主想喝没有加奶的咖啡时，便叫佣人送上黑咖啡，当要喝加奶的咖啡时，便叫佣人送上白咖啡。当时有一位叫曹运廷的当地华人，人称<em>白叔</em>，在怡保为英国人家庭当管家，但后来因为爆发二次大战，英国人迁离马来西亚，他便失业了。曹运廷便在怡保推木头车摆卖咖啡维生，他为了迎合当地人的口味，于是在炒咖啡豆时加入焦糖一起炒，使炒出来的咖啡豆有与别不同的风味，而冲调时再加入糖和炼乳，并以<strong>白咖啡</strong>为名售卖，辗转便成为当地的地道咖啡饮料。</p></blockquote><p>以上均为维基百科的说法，诸如此类的传说还有很多，但是白咖啡的招牌确实弥漫在槟城各地，口感和奶咖一样，但是会甜很多~<br>图右为白咖啡，具体价格忘了，基本上都是在 5RM 左右<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Coffee.jpg">https://blogpic.skyhive.tech/pic/Coffee.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><p>水果，尤其是热带水果，在东南亚都是比较廉价的东西（相较于国内），你可以在各个小摊、档口看到有各种各样的鲜榨果汁、奶茶等饮品。西瓜、橙汁、芒果、菠萝甚至甘蔗等鲜榨果汁，便宜的一份都在 5RM (￥8) 左右。之前在小摊上买了一份甘蔗汁，仅需 3RM (￥5)，对比国内价格真的是香的不行</p><p>左边是中杯菠萝汁（10RM），右边是大杯菠萝汁 (12RM)<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/pineapple%20juice.jpg">https://blogpic.skyhive.tech/pic/pineapple juice.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><p><strong>煎蕊（Cendol）</strong> 是一种源自东南亚的传统甜点，尤其在马来西亚、新加坡、印度尼西亚和泰国非常受欢迎。它的主要成分包括绿色条状的米粉（通常是用香兰叶汁染色的）、椰奶、棕榈糖浆和刨冰，除此之外可以加入各种水果组合成不够的口味，既然来到马来了，那得尝一尝<strong>榴莲煎蕊</strong>了~~<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Cendol.jpg">https://blogpic.skyhive.tech/pic/Cendol.jpg</a>” width=“50%”&gt;</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h4 id="玩"><a class="header-anchor" href="#玩">¶</a> 玩</h4><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">升旗山</button><button type="button" class="tab">壁画街</button><button type="button" class="tab">姓氏桥</button><button type="button" class="tab">海滩</button><button type="button" class="tab">其他</button></div><div class="tab-contents"><div class="tab-item-content active"><blockquote><p>升旗山的名字来源于 18 世纪末，当时英国东印度公司的官员们会在山顶升起旗帜，以示对槟城的控制。山顶的旗杆成为了地标，因此得名<strong>升旗山</strong></p></blockquote><p>升旗山又名槟榔山（Penang Hill），最高海拔不到 900 米，可徒步攀爬也可乘坐缆车上山。缆车分普通通道和快速通道，如果是节假日建议买快速通道（排队一个多小时真的很难顶）；快速通道一个人<em> 80RM</em>，普通通道一个人<em> 30RM</em>。</p><p>山上风景很好，是天然的热带雨林，在山顶既能领略到生物多样性，也能纵览槟城全景。另外根据初中地理所学，山顶具有 900M 的海拔，气温会比山脚要低 5-6℃，所以在山顶漫步还是很凉快的~<br><img src="https://blogpic.skyhive.tech/pic/Penang%20Hill.jpg" alt="Penang Hill"><br>升旗山本身没有门票，但是山上有很多游玩项目，如生态园、缆车、游客车等均是收费活动，如果实在囊中羞涩可在山顶小径漫步，寻找野生的猴哥🐒和龟酱🐢，领略大自然的魅力</p></div><div class="tab-item-content"><p>壁画是槟城独特的街头艺术，除了 George Town 外，在其他地区（落日洞、北海）也都有各自的壁画街，网上炒的比较火的壁画是 2012 年槟城州政府找的立陶宛艺术家 <a href="https://www.ernestzacharevic.com/about">Ernest Zacharevic</a> 来画的<strong>姐弟共骑</strong>，算是网红打卡地，但个人觉得如果游客太多的话倒也没有必要去凑热闹，城里其他随处可见的壁画也都值得欣赏，这里放两张随手拍</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/street-art-1-fix.jpg","alt":"street art-1","title":""},{"url":"https://blogpic.skyhive.tech/pic/street-art-2.jpg","alt":"street art-2","title":""}]</div>  </div></div><div class="tab-item-content"><blockquote><p>槟城姓氏桥（Clan Jetties of Penang）位于马来西亚槟城乔治市的海岸线上，是一组由木桩支撑的水上村落。这些村落主要由华人移民建造，每个村落都以一个特定的姓氏命名，如姓周桥、姓林桥、姓陈桥等</p></blockquote><p>现在姓氏桥已经被打造的足够商业化了，尤其是姓周桥，上去发现全是小商贩卖各种景区玩意儿，和国内商业街如出一辙。并且桥下的滩涂非常的脏乱差，并不是很推荐去，打个卡就可以赶紧撤了（<s>沿着姓氏桥外延的马路上全是好吃的档口，这才是你该去的地方</s>）</p><p>相较于火爆的姓周桥，其他没有被商业改造的如姓杨桥，却更有一番风味~<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Jetty%20Yang.jpg">https://blogpic.skyhive.tech/pic/Jetty Yang.jpg</a>” width=“50%”&gt;</p></div><div class="tab-item-content"><p>上文说过槟城的海滩水质很差，没有海岛的那种清澈见底的感觉，因此你最好不要把它当作一个海岛来看待。在 Batu Ferringhi，你更能体验到的是海滩上的篝火晚会，绝美的落日，以及海滩边上的大排档（bushi）。<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/Batu%20Ferringhi.jpg">https://blogpic.skyhive.tech/pic/Batu Ferringhi.jpg</a>” width=“50%”&gt;<br>如果你是一个海岛爱好者，我不建议你来，如果你是一个爱凑热闹不怕浪费时间的人，你可以来这里的海滩看一看，毕竟来了北边的海滩再想打车回 George Town，会比较麻烦，尤其是节假日。</p></div><div class="tab-item-content"><p>其他就是一些分布在城里的各种展馆了，比如：</p><ul class="lvl-0"><li class="lvl-2">颠倒博物馆：国内有很多这种，进去之后会有工作人员帮你拍照，不是很推荐（有点贵）</li><li class="lvl-2">美食狂想馆：介绍马来饮食文化的，想深入了解的可以参观</li><li class="lvl-2">娘惹博物馆：又名侨生博物馆 / 峇峇娘惹文物馆，前身是富豪郑景贵的豪华传统宅院</li><li class="lvl-2">龙山堂邱祠：邱公司（祠）是马来西亚最大型的华人会馆，也是 George Town 内其中一座主要历史建筑</li><li class="lvl-2">孙中山博物馆：位于马来西亚槟城打铜仔街 120 号，为一家以纪念孙中山革命事迹的历史博物馆</li><li class="lvl-2">张弼士故居：和上面提到的娘惹博物馆并称两大豪宅</li><li class="lvl-2">Penang State Museum and Art Gallery：艺术馆，建议用有艺术底蕴的同学去观赏</li><li class="lvl-2">鬼怪博物馆：曾路过多次，但由于胆子比较小，只是在门口拍了拍照</li></ul><p>……</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h4 id="行"><a class="header-anchor" href="#行">¶</a> 行</h4><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">打车</button><button type="button" class="tab">公交</button></div><div class="tab-contents"><div class="tab-item-content active"><p>在马来打车非常方便，手机下载 Grab 然后绑定支付宝即可，用起来和国内的滴滴一样。</p><p>不过 Grab 有一点比较好的是，他是预付费，当你在打车时系统会提前算好路线并生成对应的费用，Grab 在匹配到司机后就会将对应的费用扣除至平台，如果你订单结束，系统会将费用结算给司机，如果你取消订单，系统则会将费用原路退回，<strong>你不用担心司机会因为绕路而多收你费用</strong></p><p>不过由于 George Town 属于老城区，并且马来西亚的交通属实很烂，短距离就不建议打车了，能走走就走走吧~</p></div><div class="tab-item-content"><p>暂时还未体验，但据说有免费巴士可以乘坐</p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h4 id="榴莲"><a class="header-anchor" href="#榴莲">¶</a> 榴莲</h4><p>嘿嘿，最后还是来说一说榴莲吧。大马的榴莲有着如下特点：</p><ul class="lvl-0"><li class="lvl-2"><p>树孰自然掉落，所以吃到的榴莲都绝对新鲜</p></li><li class="lvl-2"><p>注册品种多达 200+，在大马不同地区都能吃到不同的榴莲</p></li><li class="lvl-2"><p>由于是树熟掉落，果肉发酵足够，榴莲味会比较浓郁，口感会比较丝滑</p></li><li class="lvl-2"><p>价格相对便宜</p></li></ul><p>另外，除了已注册的名种之外，还有一种深受当地人喜爱的榴莲 —— 甘榜榴莲 (Durian Kampung)。Kampung 在马来语中是乡村的意思，因此甘榜其实就是乡村榴莲、土榴莲的意思，开这些榴莲才是真正的赌博，但是由于价格便宜，一颗才 10-20 人民币，因此即使开到品质不好的，也不会特别亏。</p><p>下图为马来 2018 年各榴莲品种登记数量占比图，甘榜还是占了很大一部分。另外现在有很多种植户以现有的的甘榜树为砧木，通过嫁接方式来种植更好品质的榴莲品种（比如猫山王）<br><img src="https://blogpic.skyhive.tech/pic/Malaysia%20durain%20info.png" alt="durian info"></p><p>下面我就简单介绍一下这四天我们吃过的榴莲，按照下图的顺序，以此为：</p><ul class="lvl-0"><li class="lvl-2"><p>甘榜榴莲：这一颗是我们落地后吃的第一个榴莲，味苦没有回甘，对新手及其不友好，好在价格便宜，仅售 12RM（￥20）</p></li><li class="lvl-2"><p>黑金：据说黑金是高品质猫山王，这一颗吃起来口感绵密，甚至会有一些糊嗓子，味道是先甜后苦，最后再回甘，层次分明</p></li><li class="lvl-2"><p>猫山王：大名鼎鼎的品种，这是一颗新树果，核小味甜，榴莲风味十足，口感细腻，名副其实</p></li><li class="lvl-2"><p>竹脚：这是一颗干包的竹脚，口感脆甜，甜中带有微苦</p></li><li class="lvl-2"><p>黑刺：曾经干翻猫山王的榴莲王者，奶油般的口感，入口即化，也是先甜后苦，榴莲风味非常浓郁</p></li><li class="lvl-2"><p>红虾：这一颗不知道为啥果肉偏白，从皱皮的程度看还是颗老树果，甜中带苦，但是苦味程度是让人可以接受的，口感也很绵密</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/Kampung.jpg","alt":"kampung","title":""},{"url":"https://blogpic.skyhive.tech/pic/Black%20Gold.jpg","alt":" 黑金 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/Musong%20King.jpg","alt":"猫山王","title":""},{"url":"https://blogpic.skyhive.tech/pic/Bamboo.jpg","alt":" 竹脚 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/Black%20Thorn.jpg","alt":"黑刺","title":""},{"url":"https://blogpic.skyhive.tech/pic/Udong%20Merah.jpg","alt":" 红虾 ","title":""}]</div>  </div><p>其实我们在吃黑刺的时候，因为实在吃不下了，就给隔壁桌分了两小房果肉，对方用一块 D2 的果肉给我们做了回礼。这块 D2 湿包严重缺一点也不苦，全是甜味，吃起来就像是榴莲冰激凌~<br>&lt;/img src=“<a href="https://blogpic.skyhive.tech/pic/D2.jpg">https://blogpic.skyhive.tech/pic/D2.jpg</a>” width=“50%”&gt;</p><p>由于我们来的时间已经比较晚了，槟城的榴莲季已经结束，很多品种在榴莲档口都没有的买了，只有全年供应的猫山王和黑刺，以及少量的其他品种。如果想要赶上榴莲季来吃榴莲的，需要在每年的 6、7 两个月来到槟城，然后去<strong>浮罗山背</strong>（Balik Pulau）的榴莲园吃榴莲。浮罗山背又称榴莲山，山上都是榴莲树，去榴莲园里可以吃到最便宜的最新鲜的榴莲，或者有信心的同学也可以去自助榴莲档口，这里的榴莲都是当天掉落的鲜果（树熟掉落后仅能存放 2-3 天，因此大马这里档口的榴莲都是当天从果园运来的）</p><p>这里推荐两个吃过的榴莲档口，都在 George Town：</p><ul class="lvl-0"><li class="lvl-2"><p>Durian Legend：15, Lebuh Carnarvon, George Town, 10100 George Town, Pulau Pinang, Malaysia</p></li><li class="lvl-2"><p>Durain Central Macalister：63 Macalister Road, George Town, 10400 George Town, Pulau Pinang, Malaysia</p></li></ul><p>当然你也可以给 grab 司机一点钱，让他带你去好吃划算的榴莲档口探索~</p><h3 id="算账"><a class="header-anchor" href="#算账">¶</a> 算账</h3><p>回国后，我们算了一下本次旅游的所有消费，即机票、住宿、保险、吃、喝、玩、打车等所有开销，两个人合计不到 9000 人民币。简单复盘了一下，理论上可以将成本压缩到 8000 以内的，但是出来玩还是不要给自己加太多的限制，开心就好~</p><p>明年，希望能够带上更多的榴莲爱好者，再次征战~~</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2023/12/26 我第一次出国，和女朋友来到了马来西亚，囫囵吞枣式的游玩让我往返了吉隆坡和槟城两座城市，体验了大马的&lt;strong&gt;飞机、高铁、轮渡&lt;/strong&gt;以及&lt;strong&gt;地铁&lt;/strong&gt;这四种交通工具。但也因为是第一次踏上这片陌生的领土，即便之前的准备做得再充分，也难免有很多无法顾及的地方，因此时隔八个月，我们将再次踏上这片熟悉又陌生的领土，特此写下一篇槟城旅行指北（&lt;s&gt;&lt;strong&gt;不是游记，不是游记，不是游记&lt;/strong&gt;&lt;/s&gt;）&lt;/p&gt;</summary>
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="旅游" scheme="https://blog.skyhive.tech/tags/%E6%97%85%E6%B8%B8/"/>
    
    <category term="马来西亚" scheme="https://blog.skyhive.tech/tags/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A/"/>
    
    <category term="榴莲" scheme="https://blog.skyhive.tech/tags/%E6%A6%B4%E8%8E%B2/"/>
    
    <category term="旅行指南" scheme="https://blog.skyhive.tech/tags/%E6%97%85%E8%A1%8C%E6%8C%87%E5%8D%97/"/>
    
  </entry>
  
  <entry>
    <title>2023 年度总结</title>
    <link href="https://blog.skyhive.tech/post/ccc2b0d8.html"/>
    <id>https://blog.skyhive.tech/post/ccc2b0d8.html</id>
    <published>2024-03-20T07:34:25.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p>2023 年过的很快，感觉啥也没干就结束了，但是相比于过去的两年，2023 年过得还是相对比较精彩的：</p><ul class="lvl-0"><li class="lvl-2">去了几个城市旅游</li><li class="lvl-2">开始健身</li><li class="lvl-2">重新搭建了 <code>home-lab</code> 环境</li><li class="lvl-2">开始带团队</li></ul><span id="more"></span><!--style>.page-post-detail .post-body .group-picture-column {  float: none;  margin-top: 5px;  // width: auto ;  img { margin: 0 auto;  width: 100% ; }}.fancybox {    display: inline-block;}</style--><h3 id="工作"><a class="header-anchor" href="#工作">¶</a> 工作</h3><p>22 年的时候换了工作，从上海搬到杭州，用同样的租金在杭州获得了 <strong>50%</strong> 的租房面积提升。由于是老牌的 TP 公司，在技术上有很多陈年旧账需要慢慢去修，除了每年要感受两波大促紧锣密鼓的节奏之外，还需要天天吐槽 N 年以前留下来的天坑 ~</p><p>最大的改变就是从原来的孤军奋战变成了带着小团队进行战斗，再次拓宽了自己的技能点（深感带团队的不易），目前主要遇到的问题如下：</p><ul class="lvl-0"><li class="lvl-2"><p>自己的时间不够用，更别提带教</p></li><li class="lvl-2"><p>与下属做事的认知差异比较大，自己想把活干到自己认知的 <code>80 分</code>甚至 <code>90 分</code>，但是团队其他人受限于工作经历和认知，大多只知道 <code>60 - 70 分</code>的标准是什么样的</p></li><li class="lvl-2"><p>很多运维的观念和认知难以传递，可能也受限于他们过往的经历以及我个人的输出</p></li></ul><p>后续空下来了还是需要多看看团队管理的书来弥补一下这方面的短板。</p><h3 id="旅游"><a class="header-anchor" href="#旅游">¶</a> 旅游</h3><p>一年下来，跑了很多地方，基本上就是三个假期 —— 五一、国庆以及元旦，虽然五一和元旦人是真的多（疫情后第一波），但快乐是真的快乐~</p><h4 id="宁波-舟山"><a class="header-anchor" href="#宁波-舟山">¶</a> 宁波 &amp; 舟山</h4><p>得益于 22 年底买了车，因此五一的时候想着来个自驾游。最初是想着从杭州一路向南开到福州或者厦门然后再开回来，但是后来想想五一期间肯定会堵成狗，而且整辆车上只有我一个人开车，好像对司机极为不友好，因此将自驾方案修改为：<strong>杭州 → 宁波 → 舟山 → 杭州</strong></p><p>住宿安排如下</p><table><thead><tr><th>时间</th><th>地点</th><th>价格</th></tr></thead><tbody><tr><td><code>2023-04-29</code> - <code>2023-04-30</code></td><td>宁波凯利开元名庭大酒店</td><td>￥464 / Day</td></tr><tr><td><code>2023-04-30</code> - <code>2023-05-01</code></td><td>舟山朱家尖静清风名宿</td><td>￥723 / Day</td></tr></tbody></table><p>舟山的民宿五一期间真的贵的要死，尤其是靠海近的，我们找的这家还算是性价比不错的了</p><p>第一天在宁波中午吃了一顿 <code>甬上名灶</code>，晚上吃了一顿 <code>加餐</code>，总的来说都是排队到死，可能这就是五一黄金周的魅力所在吧😒</p><blockquote><p>后来回了杭州又吃了两回 <code>加餐</code>，当时觉得还是很不错的，但是吃多了也就那样了</p></blockquote><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-1.jpg","alt":"甬上名灶 - 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-2.jpg","alt":" 甬上名灶 - 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-3.jpg","alt":"甬上名灶 - 3","title":""}]</div>  </div><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-4.jpg","alt":"甬上名灶 - 4","title":""},{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-5.jpg","alt":" 甬上名灶 - 5","title":""},{"url":"https://blogpic.skyhive.tech/pic/yongshangmingzao-6.jpg","alt":"甬上名灶 - 6","title":""}]</div>  </div><p>以上为 <code>甬上名灶</code> 部分菜品，可供参考，<code>加餐</code> 是自助餐，因此没啥可看的</p><hr><p>来回舟山的路途比较曲折，同样都是拜黄金周所赐，路上堵车到心态爆炸😠</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/zhoushan-1.jpg","alt":"舟山 - 1","title":""},{"url":"https://blogpic.skyhive.tech/pic/zhoushan-2.jpg","alt":" 舟山 - 2","title":""},{"url":"https://blogpic.skyhive.tech/pic/zhoushan-3.jpg","alt":"舟山 - 3","title":""}]</div>  </div><p>以上是堵了一上午到舟山吃的第一顿饭，也是人生第一次吃到了小青龙~</p><p>晚上是民宿老板做的饭，有一说一，老板的手艺很不错，只是这两天天天都在吃海鲜，并且都是差不多的做法属实有些吃腻了<br><img src="https://blogpic.skyhive.tech/pic/%E6%B0%91%E5%AE%BF%E6%99%9A%E9%A4%90.jpg" alt="舟山民宿"></p><p>第二天开车在大青山上兜了一圈，看看风景还是很舒服的<br><img src="https://blogpic.skyhive.tech/pic/%E5%A4%A7%E9%9D%92%E5%B1%B1-1.jpg" alt="大青山-1"><br><img src="https://blogpic.skyhive.tech/pic/%E5%A4%A7%E9%9D%92%E5%B1%B1-2.jpg" alt="大青山-2"><br><img src="https://blogpic.skyhive.tech/pic/%E5%A4%A7%E9%9D%92%E5%B1%B1-3.jpg" alt="大青山-3"><br><img src="https://blogpic.skyhive.tech/pic/%E5%A4%A7%E9%9D%92%E5%B1%B1-4.jpg" alt="大青山-4"></p><h4 id="大连-沈阳"><a class="header-anchor" href="#大连-沈阳">¶</a> 大连 &amp; 沈阳</h4><p>得益于五一在路上开车被堵怕了，国庆打算直接坐飞机去远一点的地方，免得被堵在路上。在东北、中原以及东南三个方位考察一番后（主要还是考察机酒价格），最终还是决定去东北快活一下，主要行程如下：</p><table><thead><tr><th>时间</th><th>地点</th><th>价格</th></tr></thead><tbody><tr><td><code>2023-09-30</code> - <code>2023-10-02</code></td><td>全季大连星海广场胜利路店</td><td>￥799 / Day</td></tr><tr><td><code>2023-10-02</code> - <code>2023-10-03</code></td><td><s>雅致・永乐汇</s> 宜尚酒店沈阳南塔鞋城陆军总院店</td><td>￥397 / Day</td></tr><tr><td><code>2023-10-03</code> - <code>2023-10-04</code></td><td>沈阳青年大街万科中心亚朵 S 酒店</td><td>￥607 / Day</td></tr></tbody></table><p>前两天在大连，看了海也吃了海鲜，排了两个小时的队终于吃上了 <code>喜鼎水饺</code>；逛了博物馆，也坐了百年电车，逛了毛子街，也吃了烧烤；最后和前同事（大连人）碰了个头，吃了顿饭就坐上了赶往沈阳的高铁</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/garden-of-russian-street.jpg","alt":"俄街花园","title":""},{"url":"https://blogpic.skyhive.tech/pic/feed-sea-gulls.jpg","alt":" 喂海鸥 ","title":""}]</div>  </div><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/xinghai-square.jpg","alt":"星海广场","title":""},{"url":"https://blogpic.skyhive.tech/pic/tramline.jpg","alt":" 电车轨道 ","title":""}]</div>  </div><p>原先在沈阳是想体验一下洗浴文化，然后在洗浴中心借宿一宿 <s>（可以省下一笔酒店费用）</s>，但我确实没想到和我们有一样想法的人是在太多，洗完澡出来发现根本没有地方能坐的，更不要说借宿一宿了，最终我们紧急决定离开并找了一家酒店解决睡觉问题。</p><p>沈阳的第二天就又开始了特种兵之行：<strong>小河沿早市 → 沈阳故宫 → 中街步行街 → 中国工业博物馆 → 西塔民族文化街</strong></p><p>讲道理不出来走一走真不知道自己这么能走，<s>也真不知道咱们祖国有这么多人</s> 任何景点都是人山人海，仿佛所有大众点评上能够搜到的地方都是人山人海。不过有一说一，东北的物价是真的便宜，只要不是在商场/步行街/景点，吃饭都很便宜！</p><p><img src="https://blogpic.skyhive.tech/pic/Mukden-Palace.jpg" alt="沈阳故宫"><br><img src="https://blogpic.skyhive.tech/pic/Shenyang-Zhongjie.jpg" alt="沈阳中街"></p><hr><h4 id="吉隆坡-槟城"><a class="header-anchor" href="#吉隆坡-槟城">¶</a> 吉隆坡 &amp; 槟城</h4><p>马来西亚的旅游是谋划了很久的，早在 <code>2019</code> 底的时候就已经计划过这段旅行了，当时机酒什么的都已经订好了，结果就在出发前一个半月爆发了口罩事件😷，人生第一次的出国旅游就只好作罢。</p><p>时隔四年，大马又重新对中国实行免签政策，我就知道我的机会又来了！！随即买票订酒店，重新开启境外之旅</p><table><thead><tr><th>时间</th><th>始发地</th><th>目的地</th><th>航班 / 班次</th><th>备注</th></tr></thead><tbody><tr><td><code>2023-12-26</code></td><td>杭州</td><td>吉隆坡</td><td>MU5095 空客 320</td><td>有早餐</td></tr><tr><td><code>2023-12-28</code></td><td>吉隆坡 (KL Sentral)</td><td>槟城 (ButterWorth)</td><td>K231194694479</td><td>二等座</td></tr><tr><td><code>2023-12-31</code></td><td>槟城</td><td>吉隆坡</td><td>AK6139</td><td>无餐食</td></tr><tr><td><code>2024-01-02</code></td><td>吉隆坡</td><td>杭州</td><td>MU5096 空客 320</td><td>无餐食</td></tr></tbody></table><p>没错，旅行的顺序就是 <strong>杭州 → 吉隆坡 → 槟城 → 吉隆坡 → 杭州</strong>，看似很绕，实际上一点也不轻松😫。主要是槟城到杭州没有直飞的航班，无论如何都得从吉隆坡转机，所以想着还不如飞回吉隆坡再玩两天（事实证明我这个想法是真的不成熟）</p><p>去的时候我对榴莲还不是很狂热，因此也没有在大马狂炫榴莲（虽然 12 月底也算是大马每年的第二个榴莲季），所以这次旅游也只是满足了自己一个出国的好奇心，涨了一波见识。那么在这里我简单对吉隆坡和槟城这两个城市评价一下：</p><p>吉隆坡：</p><ul class="lvl-0"><li class="lvl-2"><p>在世界层面都算是比较繁华的大都市，但繁华的也仅仅是市中心的部分，出了市中心就是破败的小农村</p></li><li class="lvl-2"><p>地铁和高铁都不用安检（后来才知道好像只有国内会安检）</p></li><li class="lvl-2"><p>夜市 / 小吃没有特别出彩，马来特色很重，种类不多，喜欢吃的不太建议来吉隆坡</p></li><li class="lvl-2"><p>商场很多，也很大，尤其是市中心的区域，可以逛一整天</p></li></ul><p>槟城：</p><ul class="lvl-0"><li class="lvl-2"><p>以人文而出名 (槟城本身就被列入世界非遗)，不适合买买买，但是适合逛吃</p></li><li class="lvl-2"><p>夜市 / 小吃多元化，既有马来本土的也有融合了其他民族的特色的美食</p></li><li class="lvl-2"><p>生活节奏很慢，不像吉隆坡商业气息很重，槟城就像是国内三四线的小城镇</p></li><li class="lvl-2"><p>盛产榴莲，品质世界顶级</p></li></ul><p>还有很多在大马可以看到的现象：</p><ul class="lvl-0"><li class="lvl-2"><p>由于油价便宜，在大马根本看不到新能源车，全是油车和摩托</p></li><li class="lvl-2"><p>大马的红绿灯上有行人按钮，貌似按下去会加快绿灯的到来</p></li><li class="lvl-2"><p>大马的高铁和客车座位非常之宽敞，尽管买的是二等座也能坐得很舒服（2 + 2 的座位排列，国内二等座是 3 + 2）</p></li><li class="lvl-2"><p>大马车内空调冷气给的非常足，在高铁坐着需要穿长袖长裤的程度</p></li><li class="lvl-2"><p>街边小店一般没有空调，只有风扇</p></li><li class="lvl-2"><p>由于地处热带，湿气很重，大多食物都会用姜等辛辣的香料进行调味，吃不惯的肯定吃不惯</p></li></ul><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/Sunset-in-Penang.jpg","alt":"槟城落日","title":""},{"url":"https://blogpic.skyhive.tech/pic/Butterworth-ferry-terminal.jpg","alt":" 槟城码头 ","title":""}]</div>  </div><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/Yang-Jetty.jpg","alt":"姓杨桥","title":""},{"url":"https://blogpic.skyhive.tech/pic/KL-NightView.jpg","alt":" 吉隆坡夜景 ","title":""}]</div>  </div><h3 id="Homelab"><a class="header-anchor" href="#Homelab">¶</a>Homelab</h3><p>由于 <code>NAS01</code> 的存储空间使用率已经超 <code>70%</code>，考虑到未来几年可能用不了多久就会满，<code>NAS02</code> 上线计划就不得不被提上日程了。同时考虑到扩展性，<code>NAS02</code> 我将使用 <a href="https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-24104078742.3.6c5d40c0IavLnW&amp;id=623691495114">6 盘位 NAS 机箱</a>。</p><p>为了一步到位，这次也在五一期间采购一个网络机柜，将 <code>交换机</code>、<code>虚拟化服务器</code>、<code>NAS01</code> 以及 <code>NAS02</code> 都安排进去了，未来需要折腾的就是这个网络机柜的散热设计了，夏天一定会热成狗，尤其是我现在租的房子是边套，这个机柜所靠的墙体是会被阳光直射的，夏天墙体温度极高。</p><p>这次扩容直接在原来 <code>12.21TB</code> 的空间基础上，又增加了 <code>25.63TB</code> 的空间，这下子可以算是吃喝不愁了，哈哈哈哈哈！！</p><h3 id="健身"><a class="header-anchor" href="#健身">¶</a> 健身</h3><p>最后我在 <code>2023</code> 给自己培养了一个全新的爱好 —— <strong>健身</strong>。自三月份开始力量训练以来，我对于健身（多以力量训练为主）可以说是达到了一种上瘾的程度。</p><p>特别是八月份的时候膝盖受伤，导致了下半年我没法练下肢和体能，甚至也没法做有氧，直接 <strong>胸、背、核心</strong>三分化训练，一周胸部两练直接让我卧推成绩从 <code>30KG</code> 做组提升到了 <code>60KG</code> 做组，颇有成就感。当然疯狂的上肢训练也让我上下肢比例看起来非常不协调，等腿好了之后也会开始恢复腿部训练。</p><p>因为健身的关系，现在生活变得更加的健康和规律，吃的不仅变干净了，也变的更加营养和均衡。为此自己也学习到了非常多的营养学知识以及运动学知识，日常生活更是变得充实了起来~~</p><p><strong>2024，加油，奥里给！！</strong></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2023 年过的很快，感觉啥也没干就结束了，但是相比于过去的两年，2023 年过得还是相对比较精彩的：&lt;/p&gt;
&lt;ul class=&quot;lvl-0&quot;&gt;
&lt;li class=&quot;lvl-2&quot;&gt;去了几个城市旅游&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;开始健身&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;重新搭建了 &lt;code&gt;home-lab&lt;/code&gt; 环境&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;开始带团队&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="思考感悟" scheme="https://blog.skyhive.tech/categories/Think/"/>
    
    
    <category term="年度总结" scheme="https://blog.skyhive.tech/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>nginx 端口转发被强行更改</title>
    <link href="https://blog.skyhive.tech/post/58e40093.html"/>
    <id>https://blog.skyhive.tech/post/58e40093.html</id>
    <published>2024-02-09T09:50:16.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://blog.skyhive.tech/post/4b4fd36b.html">上一篇文章</a>说到在家里把 LB 升了级并且通过 <code>acme.sh</code> 自动配置了 LB 的泛域名证书，可以看到基本的结构如下：</p><img src="http://www.plantuml.com/plantuml/svg/IqmkoIzI22rEBUBY0f4Akhfs2Xf1-QKbgKMQLWesddb0HbvgYK90Vb69WeM9YR4T5qGMejB72QJADx40eW0ix-C4aNFEpqlBASrBJjM42xbdbkGa9Y7uKOb9IPaLIF95YMc9UOa80Q_Kd9pAjCmyJG00"><p>由于这些服务都是运行在家里的服务器中，最终 LB 的 443 端口我是在路由器上通过端口映射的方式转到 8443 端口上的（家庭宽带的公网 IP 会将 80 / 443 等常用端口封禁）。而我为了优雅（确实不想在公网通过域名加端口的形式访问某个网站或者服务），在公网使用 CDN 来把我对公网映射的 8443 端口转换成了 443。这个做法对于正常的 Web 服务来说没有任何问题，但是对于网盘服务来说就有些伤筋动骨，毕竟网盘服务流量比较大，使用 CDN 的话确实比较费钱。因此对于网盘服务我又单独映射了一个 8888 端口到公网，在金钱面前，我不再选择优雅。</p><span id="more"></span><p>那么对于网盘服务来说，正常的访问路径就是：</p><img src="http://www.plantuml.com/plantuml/svg/uqfCBialKWWjJYtYuWAH2hgwTWeQGVcb9Qb5cbOADfvvG4PUQeb2G7vHYO854DXnGMGXAdsSGAfy4miW2anCZEsuV9mWSdwf5IN9EVcbAI0b0KNv5PLGKmmi3Eou0000"><p>乍一看好像挺正常的，但是在我通过公网去访问的是时候</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">curl</span> https://<span class="token operator">&lt;</span>domain_name<span class="token operator">&gt;</span>:8888<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>出现的结果往往是，nginx 直接把我的 8888 端口给重定向成了 8080，也就是变成了 <code>https://&lt;domain_name&gt;:8080</code> 的访问。后来查了一下，是需要在 nginx location 的配置中稍微做些修饰，随即将该方法记录下来</p><pre class="line-numbers language-nginx" data-language="nginx"><code class="language-nginx"><span class="token directive"><span class="token keyword">server</span></span> <span class="token punctuation">{</span>  <span class="token directive"><span class="token keyword">listen</span> <span class="token number">443</span> ssl</span><span class="token punctuation">;</span>  ……  <span class="token directive"><span class="token keyword">port_in_redirect</span> <span class="token boolean">off</span></span><span class="token punctuation">;</span>  <span class="token comment">## 需要在 server 中加上这个配置防止 port redirect</span>  <span class="token directive"><span class="token keyword">location</span> /</span> <span class="token punctuation">{</span>    <span class="token directive"><span class="token keyword">proxy_pass</span> http://&lt;INTERNAL_IP&gt;:8080</span><span class="token punctuation">;</span>    <span class="token directive"><span class="token keyword">proxy_set_header</span> Host <span class="token variable">$host</span>:<span class="token variable">$server_port</span></span><span class="token punctuation">;</span>    <span class="token comment">## Host header 需要有 $host:$server_port，即 host 和 port 都得有，否则 port 就会变成 proxy_pass 中的 port</span>    ……  <span class="token punctuation">}</span><span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>以上基本上可以解决问题，如若不能，则还得继续 Google 一番。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://blog.skyhive.tech/post/4b4fd36b.html&quot;&gt;上一篇文章&lt;/a&gt;说到在家里把 LB 升了级并且通过 &lt;code&gt;acme.sh&lt;/code&gt; 自动配置了 LB 的泛域名证书，可以看到基本的结构如下：&lt;/p&gt;
&lt;img src=&quot;http://www.plantuml.com/plantuml/svg/IqmkoIzI22rEBUBY0f4Akhfs2Xf1-QKbgKMQLWesddb0HbvgYK90Vb69WeM9YR4T5qGMejB72QJADx40eW0ix-C4aNFEpqlBASrBJjM42xbdbkGa9Y7uKOb9IPaLIF95YMc9UOa80Q_Kd9pAjCmyJG00&quot;&gt;
&lt;p&gt;由于这些服务都是运行在家里的服务器中，最终 LB 的 443 端口我是在路由器上通过端口映射的方式转到 8443 端口上的（家庭宽带的公网 IP 会将 80 / 443 等常用端口封禁）。而我为了优雅（确实不想在公网通过域名加端口的形式访问某个网站或者服务），在公网使用 CDN 来把我对公网映射的 8443 端口转换成了 443。这个做法对于正常的 Web 服务来说没有任何问题，但是对于网盘服务来说就有些伤筋动骨，毕竟网盘服务流量比较大，使用 CDN 的话确实比较费钱。因此对于网盘服务我又单独映射了一个 8888 端口到公网，在金钱面前，我不再选择优雅。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="nginx" scheme="https://blog.skyhive.tech/tags/nginx/"/>
    
    <category term="homelab" scheme="https://blog.skyhive.tech/tags/homelab/"/>
    
  </entry>
  
  <entry>
    <title>配置 DNSPod 自动获取泛域名证书</title>
    <link href="https://blog.skyhive.tech/post/4b4fd36b.html"/>
    <id>https://blog.skyhive.tech/post/4b4fd36b.html</id>
    <published>2024-02-05T08:57:07.000Z</published>
    <updated>2026-03-02T03:49:22.585Z</updated>
    
    <content type="html"><![CDATA[<p>最近升级了下家里的 LB，通过 gitlab 将 LB 的配置做了版本管理，并且通过 docker-compose 实现 LB 的快速部署。但是家里的网络做了内外网的区分，为了实现内网 https 访问，我需要在内网的 LB 上配置一套 SSL 证书（公网的部分直接在 CDN 上配置了 <code>let's encrypt</code> 的免费证书，一年一换）</p><p>为了避免麻烦，对于内网的 https 证书希望做到以下两点：</p><ul class="lvl-0"><li class="lvl-2"><p>到期自动续</p></li><li class="lvl-2"><p>泛域名</p></li></ul><span id="more"></span><p>查找了一番，有两个工具比较符合：<code>Certbot</code> 和 <code>acme.sh</code>，都是通过 <a href="https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment"><code>ACME protocol</code></a> 去自动获取免费证书, 但是需要自动获取泛域名证书的话，还需要能够自动在 DNS Provider 处更新 <a href="https://en.wikipedia.org/wiki/TXT_record"><code>DNS TXT Record</code></a>。由于我的域名是在 DNSPod 购买的，因此需要能够支持在 DNSPod 上自动更新 TXT 记录。Certbot 没有对应的官方插件，但是有第三方好心人写的插件能够实现该功能，如 <a href="https://github.com/tengattack/certbot-dns-dnspod">certbot-dns-dnspod</a>；而 <a href="http://acme.sh">acme.sh</a> 是国人写的工具，官方支持 Aliyun 和 DNSPod，思来想去，还是打算使用 <a href="http://acme.sh">acme.sh</a>。</p><h3 id="Docker-Compose-Configuration"><a class="header-anchor" href="#Docker-Compose-Configuration">¶</a>Docker Compose Configuration</h3><p>根据 <a href="https://github.com/acmesh-official/acme.sh/wiki/deploy-to-docker-containers">官方文档</a> 先将 Docker Compose 配置好，从文档里可以看出，<a href="http://acme.sh">acme.sh</a> 容器会以 daemon 的形式一直运行，后续的申请证书、部署、续签等操作都需要 docker compose exec 单独去操作。Dockers Compose 配置如下：</p><pre class="line-numbers language-docker" data-language="docker"><code class="language-docker">version: "3.9"services:  nginx:    restart: always    container_name: nginx    image: nginx:latest    ports:      - 80:80      - 443:443    labels:      - sh.acme.autoload.domain=${DOMAIN_NAME}    volumes:      - $PWD/conf.d:/etc/nginx/conf.d:ro      - $PWD/nginx.conf:/etc/nginx/nginx.conf:ro      - $PWD/log/:/var/log/nginx/:rw    environment:      - TZ=Asia/Shanghai    acme:    image: neilpang/acme.sh    container_name: acme.sh    command: daemon    volumes:      - $PWD/acmeout:/acme.sh      - /var/run/docker.sock:/var/run/docker.sock    dns:      - 8.8.8.8    environment:      - DEPLOY_DOCKER_CONTAINER_LABEL=sh.acme.autoload.domain=${DOMAIN_NAME}      - DEPLOY_DOCKER_CONTAINER_KEY_FILE=/etc/nginx/ssl/key.pem      - DEPLOY_DOCKER_CONTAINER_CERT_FILE=/etc/nginx/ssl/cert.pem      - DEPLOY_DOCKER_CONTAINER_CA_FILE=/etc/nginx/ssl/ca.pem      - DEPLOY_DOCKER_CONTAINER_FULLCHAIN_FILE=/etc/nginx/ssl/full.pem      - DEPLOY_DOCKER_CONTAINER_RELOAD_CMD="service nginx force-reload"      - DP_Id=${DP_Id}      - DP_Key=${DP_Key}<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>另外还需要添加一个 <code>.env</code> 文件用来存放如下变量：</p><ul class="lvl-0"><li class="lvl-2"><p><code>${DOMAIN_NAME}</code>：用于申请证书的泛域名</p></li><li class="lvl-2"><p><code>${DP_Id}</code>：DNSPod API Key ID</p></li><li class="lvl-2"><p><code>${DP_Key}</code>：DNSPod API Key</p></li></ul><h3 id="申请证书"><a class="header-anchor" href="#申请证书">¶</a> 申请证书</h3><p><a href="http://acme.sh">acme.sh</a> 默认的 ssl 服务器是 <code>ZeroSSL.com</code>，根据 <a href="https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA">文档</a> 里提到的，在申请证书之前，需要先注册账户</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">docker</span> compose <span class="token builtin class-name">exec</span> acme --register-account <span class="token parameter variable">-m</span> <span class="token operator">&lt;</span>your email address<span class="token operator">&gt;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>注册完成后就可以正式申请证书了</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">docker</span> compose <span class="token builtin class-name">exec</span> acme <span class="token parameter variable">--issue</span> <span class="token parameter variable">--dns</span> dns_dp <span class="token parameter variable">-d</span> <span class="token variable">${DOMAIN_NAME}</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>等待证书申请完成后，可以看到 <code>acmeout</code> 目录下会出现一个 <code>${DOMAIN_NAME}</code> 命名的目录，该目录下就是我们申请到的证书。接着运行命令将证书部署到 nginx 的目录下（该目录则是在 docker compose 中通过 environment 传参给 acme 容器的）</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">docker</span> compose <span class="token builtin class-name">exec</span> acme <span class="token parameter variable">--deploy</span> <span class="token parameter variable">-d</span> <span class="token variable">${DOMAIN_NAME}</span>  --deploy-hook <span class="token function">docker</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>理论上到这里我们的证书申请和部署就已经结束了。</p><h3 id="修锅"><a class="header-anchor" href="#修锅">¶</a> 修锅</h3><p>当然我在申请证书的时候，遇到了些问题，比如在等待证书签售的过程中，一直在报错</p><pre class="line-numbers language-text" data-language="text"><code class="language-text">Order status is processing, lets sleep and retry<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>等待的超时时间是 15s，连续 retry 了多次之后肯定是有问题的，参考了 <a href="https://u.sb/acme-sh-ssl/">网络上其他的人建议</a>，将默认的 CA Server 从 <code>ZeroSSL.com</code> 更换成了 <code>Let's Encrypt</code></p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">docker</span> compose <span class="token builtin class-name">exec</span> acme --set-default-ca <span class="token parameter variable">--server</span> letsencrypt<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="续签证书"><a class="header-anchor" href="#续签证书">¶</a> 续签证书</h3><p><a href="http://acme.sh">acme.sh</a> 不用我们手动去执行 renew 的命令来续签到期的证书，正如之前所说，acme 的容器是以 daemon 状态运行的，因此他会定时的去检测我们的证书到期时间，在到期之前会自动进行 renew 操作。可以在 <code>acmeout/${DOMAIN_NAME}/${DOAMIN_NAME}.conf</code> 中看到，有一项 <code>Le_NextRenewTimeStr</code> 配置，该配置了记录了 <a href="http://acme.sh">acme.sh</a> 下一次续签证书的时间。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;最近升级了下家里的 LB，通过 gitlab 将 LB 的配置做了版本管理，并且通过 docker-compose 实现 LB 的快速部署。但是家里的网络做了内外网的区分，为了实现内网 https 访问，我需要在内网的 LB 上配置一套 SSL 证书（公网的部分直接在 CDN 上配置了 &lt;code&gt;let&#39;s encrypt&lt;/code&gt; 的免费证书，一年一换）&lt;/p&gt;
&lt;p&gt;为了避免麻烦，对于内网的 https 证书希望做到以下两点：&lt;/p&gt;
&lt;ul class=&quot;lvl-0&quot;&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;到期自动续&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;泛域名&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="nginx" scheme="https://blog.skyhive.tech/tags/nginx/"/>
    
    <category term="证书" scheme="https://blog.skyhive.tech/tags/%E8%AF%81%E4%B9%A6/"/>
    
    <category term="acme" scheme="https://blog.skyhive.tech/tags/acme/"/>
    
  </entry>
  
  <entry>
    <title>黑群晖填坑</title>
    <link href="https://blog.skyhive.tech/post/1aac8d0a.html"/>
    <id>https://blog.skyhive.tech/post/1aac8d0a.html</id>
    <published>2021-11-17T03:36:05.000Z</published>
    <updated>2026-03-02T03:49:22.585Z</updated>
    
    <content type="html"><![CDATA[<p>前段时间把家里的 NAS 做了一次改造，将用之前用了一年的架构推翻，换上了黑群晖。</p><p>故事还得从一年前说起。最初本着折腾的精神，采取了 Bcache + LVM 的方案，简单架构如下：<br><img src="https://blogpic.skyhive.tech/pic%2F%E5%AD%98%E5%82%A8%E4%B8%80%E4%BB%A3%E7%9B%AE.png" alt="NAS 一代目"></p><span id="more"></span><p>没有冗余没有备份，对于存储来说是很危险的。当时其实也是纠结了很久，手上有一块 RAID 卡，纠结了半天也没有上 RAID，原因是当时硬盘的配置是 6T * 1+4T * 3, 如果上了 RAID 就意味着 6T 盘会浪费 2T 空间。</p><p>既然如此，干脆一不做二不休，直接上 LVM，然后把重要的数据定时同步出来，正好还有两块 2T 盘，可以拿来做备份使用。结果最后因为太懒，以及 2T 盘没有多余的机器可以让我接入，导致备份的计划迟迟没有落地。</p><p>后来考虑到 Bcache 这个东西比较不优雅，这个项目也多年没有人维护更新（主要是存储跑了一年一直没有冗余和备份，比较慌），最终还是考虑换成黑群晖。</p><p>换成黑群晖后也多多少少遇到了些问题，这里先记录下来，算是填坑了</p><h3 id="存储冗余问题"><a class="header-anchor" href="#存储冗余问题">¶</a> 存储冗余问题</h3><p>由于短时间内我还不会把 4T 盘都换成 6T，因此正常的 RAID 阵列还是不考虑了，决定使用 SHR（Synology Hybrid RAID）来实现硬盘的冗余。主要是 SHR 可以合理利用容量大小不一的硬盘，减少硬盘空间的浪费。目前我 6T * 1+4T * 3 的组合还是有浪费的空间，但是后面会新增两块 6T 盘就完美利用了。计划采购硬盘大小和数量前可以使用群晖的 <a href="https://www.synology.cn/zh-cn/support/RAID_calculator">RAID 计算器</a> 先算一下可用容量以及是否浪费空间。</p><p>然而并不是所有群晖的机型都开启了 SHR，对于没有开启 SHR 的机型，我们需要手动配置</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vim</span> /etc.defaults/synoinfo.conf<span class="token comment">## 注释 supportraidgroup="yes"</span><span class="token comment">## 添加以下内容</span><span class="token assign-left variable">support_syno_hybrid_raid</span><span class="token operator">=</span><span class="token string">"yes"</span><span class="token comment">## 保存重启即可</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="CPU-型号显示问题"><a class="header-anchor" href="#CPU-型号显示问题">¶</a>CPU 型号显示问题</h3><p>装完黑群晖后，显示的 CPU 型号为群晖的固定版本，有强迫症的话可以使用下面一键脚本进行修复（此处引自：<a href="https://wp.gxnas.com/9982.html">关于群晖优化可以用的一键命令</a>）</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">curl</span> <span class="token parameter variable">-SLO</span> https://wp.gxnas.com/wp-content/uploads/2019/08/ch_cpuinfo<span class="token function">chmod</span> <span class="token number">755</span> ch_cpuinfo./ch_cpuinfo<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h3 id="网卡驱动问题"><a class="header-anchor" href="#网卡驱动问题">¶</a> 网卡驱动问题</h3><p>群晖上线后用了一天就发现了奇怪的问题，通过 SMB 从群晖读取数据时就会断网，写入正常，为了定位问题，做了以下测试：</p><ol><li class="lvl-3"><p>使用 FIO 对群晖的存储进行 IO 测试 - 测试期间网络正常，且 IO 结果符合预期；</p></li><li class="lvl-3"><p>使用 iperf 对群晖网络进行 IO 测试 - 测试期间网络正常，且 IO 结果符合预期；</p></li><li class="lvl-3"><p>修改 SMB 版本和配置进行读写操作 - 读取时依然会断网，写入正常；</p></li><li class="lvl-3"><p>禁用 SMB，使用 NFS 进行测试 - 读取时依然会断网，写入正常；</p></li><li class="lvl-3"><p>在群晖本地进行文件拷贝 - 读取时正常，写入正常；</p></li><li class="lvl-3"><p>上述测试时，群晖上另有一块 X520-DA2 加以佐证，全程光口网络正常，问题出在电口上</p></li></ol><p>Google 了一番，问题可能出在驱动上，我这板载的电口是 <code>Realtek@ 8111E PCIE Gigabit LAN Controller</code>，在论坛里找了一个大神编好的带 r8168 驱动的<a href="https://pan.skyhive.tech:8888/s/fnX6AexCKk3Pn5n">包</a>，更换驱动后果然就原地复活了。</p><h3 id="内存限制问题"><a class="header-anchor" href="#内存限制问题">¶</a> 内存限制问题</h3><p>装完黑群晖后用 free 看到内存总共只有 2.5G，但是我物理上是 8G * 2 的配置，Google 一番，需要修改 grub 配置解决</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /tmp/synoboot<span class="token comment">## 这里一定要先进 dev 目录再挂载 synoboot1，否则会报错</span><span class="token builtin class-name">cd</span> /dev<span class="token function">mount</span> <span class="token parameter variable">-t</span> vfat /dev/synoboot1 /tmp/synoboot<span class="token function">vim</span> /tmp/synoboot/grub/grub.cfg<span class="token comment">## 在 set common_args_3617 中加入 disable_mtrr_trim 配置</span><span class="token comment">## 注意这里 3617 是因为我的黑群晖是 DS 3617xs，其他型号应该不一样</span><span class="token builtin class-name">set</span> <span class="token assign-left variable">common_args_3617</span><span class="token operator">=</span><span class="token string">'disable_mtrr_trim syno_hdd_powerup_seq=0 HddHotplug=0 syno_hw_version=DS3617xs vender_format_version=2 console=ttyS0,115200n8 withefi elevator=elevator quiet syno_port_thaw=1'</span><span class="token comment">## 重启后内存信息就正常了</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
    <summary type="html">&lt;p&gt;前段时间把家里的 NAS 做了一次改造，将用之前用了一年的架构推翻，换上了黑群晖。&lt;/p&gt;
&lt;p&gt;故事还得从一年前说起。最初本着折腾的精神，采取了 Bcache + LVM 的方案，简单架构如下：&lt;br&gt;
&lt;img src=&quot;https://blogpic.skyhive.tech/pic%2F%E5%AD%98%E5%82%A8%E4%B8%80%E4%BB%A3%E7%9B%AE.png&quot; alt=&quot;NAS 一代目&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="NAS" scheme="https://blog.skyhive.tech/tags/NAS/"/>
    
    <category term="黑群晖" scheme="https://blog.skyhive.tech/tags/%E9%BB%91%E7%BE%A4%E6%99%96/"/>
    
  </entry>
  
  <entry>
    <title>什么情况？访问不了虚拟机了？？</title>
    <link href="https://blog.skyhive.tech/post/680966d1.html"/>
    <id>https://blog.skyhive.tech/post/680966d1.html</id>
    <published>2021-10-27T03:59:21.000Z</published>
    <updated>2026-03-02T03:49:22.585Z</updated>
    
    <content type="html"><![CDATA[<p>前几日在家中遇到一件有趣的事情，与大家分享一下。</p><p>起初我有一套硬件 A，安装了 ESXi 与一些虚拟机，后来将 A 上的数据盘与系统盘（U 盘）拆至硬件 B 上，即 ESXi 从 A 迁移到了 B。闲置下来的硬件 A 就被我拿来安装了黑苹果，然而在黑苹果的路上遇到了很多的坑，例如掉帧、黑色块的问题（显卡驱动），蓝牙鼠标掉线的问题（蓝牙驱动），后来甚至发现这套黑苹果访问不了我的虚拟机们，也访问不到 ESXi。这时的我还很天真的以为是虚拟化和黑苹果之间的问题，Google 了一番未果还是换回了 Windows。</p><span id="more"></span><p><img src="https://blogpic.skyhive.tech/pic%2F%E5%8F%98%E6%9B%B4%E5%8F%B2.png" alt="变更史"></p><p>天真我以为这样就已经解决了问题，但结果是并没有什么卵用。同时我发现一直在使用的电脑访问 ESXi 也出现了问题，网络丢包严重，但是访问虚拟机却一点事情也没有。事已至此只能先简单抓包看一下，从硬件 A ping 向 ESXi（硬件 B）的同时，在 ESXi 上使用 tcpdump-uw 进行抓包（通过虚拟机作为跳板机连上 ESXi），结果是硬件 A 正常发送 ARP 请求，但是 ESXi 这里并没有收到 A 发送的请求。</p><p>到这里我基本断定是 ARP 的问题，但是为啥 ESXi 收不到我发出来的 ARP 包，其他的硬件却都能收到，我不得而知。但是为了验证我的猜想，我决定先在 Windows 上静态绑定一下 ARP 记录。</p><pre class="line-numbers language-bat" data-language="bat"><code class="language-bat"># 先用 netsh 找到对应 interface 的 idxnetsh i i show in   # netsh interface ipv4 show interfaces# 绑定 IP-MACnetsh -c "i i" add ne &lt;idx&gt; &lt;IP&gt; &lt;MAC&gt;  # netsh -c "interfaces ipv4" add neighbors &lt;idx&gt; &lt;IP&gt; &lt;MAC&gt;# 也可以直接用 arp 命令进行临时绑定arp -s &lt;IP&gt; &lt;MAC&gt;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里 ESXi 的 MAC 是从虚拟机 ARP 获得的，因为目前只有虚拟机访问 ESXi 比较正常。绑定完 MAC 地址后我又信誓旦旦进行验证，结果网络依然不通！！WTF？？到底发生甚么事了了？一开始以为 MAC 地址写错了，反复比对后确认了 MAC 地址并没有问题，那么为啥虚拟机用这个 MAC 地址可以 ping 通 ESXi，我用这个 MAC 就不行呢？</p><p>后来我怀疑是交换机的问题，我众多设备不是都接在同一个交换机上的，实际上是两个串联的傻瓜交换机，客厅一个卧室一个，而 ESXi 在客厅，实验的两台电脑在卧室。但是这个不成熟的猜想瞬间就被我给否定了，毕竟客厅和卧室里其他的设备互联都没有问题。</p><p>就在我一筹莫展把注意力集中到 Windows 的网络配置上时，我突然发现了一个神奇的事情 —— 硬件 B Windows 的 MAC 地址为啥和我 ESXi 一摸一样？？这真是见了鬼了，两个不同硬件为啥会有相同的 MAC 地址！难道是因为 ESXi 迁移的时候 MAC 地址并没有跟着硬件走？毕竟 ESXi 的管理地址是在 VMKernel 上的，这并不是一个物理接口。</p><p>简单了搜了一下，在 VMware 的 KB 中确实有这样的记载 —— <a href="https://kb.vmware.com/s/article/1031111?lang=zh_CN">更换网卡后或 vmkernel 的 MAC 地址重复时 vmk0 管理网络 MAC 地址不更新</a>。如果已经冲突了就只能删除原来的管理端口，重新创建，但是我这台 ESXi 只有一个网络接口，如果删了的话就只能连上显示器去配置了，所以为了省事就在 Web 界面先添加一个端口，再删除原来的即可。</p><p>如果要配置静态的 IP 地址又不想接显示器的话，可以 SSH 到 ESXi 后进行如下操作</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable"><span class="token environment constant">TERM</span></span><span class="token operator">=</span>xtermdcui<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p><img src="https://blogpic.skyhive.tech/pic%2Fesxi.png" alt="ESXi 控制台"><br>绝对的懒人福音！！</p><p>重建了管理端口后，没有了 MAC 地址冲突，硬件 A 的 Windows 又满血复活了，这件事情告诉我们，没事别特么的拆东墙补西墙！</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;前几日在家中遇到一件有趣的事情，与大家分享一下。&lt;/p&gt;
&lt;p&gt;起初我有一套硬件 A，安装了 ESXi 与一些虚拟机，后来将 A 上的数据盘与系统盘（U 盘）拆至硬件 B 上，即 ESXi 从 A 迁移到了 B。闲置下来的硬件 A 就被我拿来安装了黑苹果，然而在黑苹果的路上遇到了很多的坑，例如掉帧、黑色块的问题（显卡驱动），蓝牙鼠标掉线的问题（蓝牙驱动），后来甚至发现这套黑苹果访问不了我的虚拟机们，也访问不到 ESXi。这时的我还很天真的以为是虚拟化和黑苹果之间的问题，Google 了一番未果还是换回了 Windows。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="虚拟化" scheme="https://blog.skyhive.tech/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
    <category term="ESXi" scheme="https://blog.skyhive.tech/tags/ESXi/"/>
    
    <category term="Network" scheme="https://blog.skyhive.tech/tags/Network/"/>
    
  </entry>
  
  <entry>
    <title>创建本地 APT 仓库</title>
    <link href="https://blog.skyhive.tech/post/16067d8e.html"/>
    <id>https://blog.skyhive.tech/post/16067d8e.html</id>
    <published>2021-08-23T09:21:11.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h3 id="背景"><a class="header-anchor" href="#背景">¶</a> 背景</h3><p>由于部分限制级场景无法联通外网，而 MAAS 在部署镜像的过程中，会默认连接 <a href="http://archive.ubuntu.com/ubuntu">http://archive.ubuntu.com/ubuntu</a> 的源去安装一些依赖包，在无外网环境下，会导致部署失败！因此考虑将 MAAS 在部署过程中的依赖包提前下载好，做成本地的 APT 仓库来解决。<br>由于 MAAS 需要安装的依赖包并不多（一共 260M 左右），并不需要使用 apt-mirror 去搭建完整的 apt 仓库，我们将需要的依赖包都下载好，使用 apt-fptarchive 来发布我们的仓库。</p><span id="more"></span><h3 id="仓库制作"><a class="header-anchor" href="#仓库制作">¶</a> 仓库制作</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token parameter variable">-i</span> <span class="token comment">## 先删除本地的缓存的 deb 包</span><span class="token function">rm</span> <span class="token parameter variable">-rf</span> /var/cache/apt/archives/*.deb <span class="token comment">## 下载依赖包</span><span class="token function">apt</span> <span class="token parameter variable">-d</span> reinstall <span class="token parameter variable">-y</span> amd64-microcode crda freeipmi-common freeipmi-tools grub-common grub-gfxpayload-lists grub-pc-bin grub-pc grub2-common intel-microcode ipmitool iucode-tool iw libdbus-glib-1-2 libevdev2 libfreeipmi17 libimobiledevice6 libipmiconsole2 libipmidetect0 libmysqlclient21 libnl-3-200 libnl-genl-3-200 libnvpair1linux libplist3 libsensors-config libsensors5 libsnmp-base libsnmp35 libupower-glib3 libusbmuxd6 libuutil1linux libzfs2linux libzpool2linux linux-firmware linux-generic linux-headers-5.4.0-77-generic linux-headers-5.4.0-77 linux-headers-generic linux-image-5.4.0-77-generic linux-image-generic linux-modules-5.4.0-77-generic linux-modules-extra-5.4.0-77-generic lldpd mysql-common os-prober python3-bcrypt python3-paramiko python3-pyudev python3-yaml smartmontools thermald upower usbmuxd wireless-regdb zfsutils-linux <span class="token comment">## 创建仓库目录</span><span class="token function">mkdir</span> /opt/repo/pool/main <span class="token parameter variable">-p</span><span class="token function">mv</span> /var/cache/apt/archives/*.deb /opt/repo/pool/main/ <span class="token comment">## 开始创建</span><span class="token comment">### 生成公钥和私钥</span>root@maas:~<span class="token comment"># gpg --full-generate-key</span>gpg <span class="token punctuation">(</span>GnuPG<span class="token punctuation">)</span> <span class="token number">2.2</span>.19<span class="token punctuation">;</span> Copyright <span class="token punctuation">(</span>C<span class="token punctuation">)</span> <span class="token number">2019</span> Free Software Foundation, Inc.This is <span class="token function">free</span> software: you are <span class="token function">free</span> to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Please <span class="token keyword">select</span> what kind of key you want:   <span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> RSA and RSA <span class="token punctuation">(</span>default<span class="token punctuation">)</span>   <span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> DSA and Elgamal   <span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> DSA <span class="token punctuation">(</span>sign only<span class="token punctuation">)</span>   <span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span> RSA <span class="token punctuation">(</span>sign only<span class="token punctuation">)</span>  <span class="token punctuation">(</span><span class="token number">14</span><span class="token punctuation">)</span> Existing key from cardYour selection? <span class="token number">4</span>RSA keys may be between <span class="token number">1024</span> and <span class="token number">4096</span> bits long.What keysize <span class="token keyword">do</span> you want? <span class="token punctuation">(</span><span class="token number">3072</span><span class="token punctuation">)</span> <span class="token number">1024</span>Requested keysize is <span class="token number">1024</span> bitsPlease specify how long the key should be valid.         <span class="token number">0</span> <span class="token operator">=</span> key does not expire      <span class="token operator">&lt;</span>n<span class="token operator">&gt;</span>  <span class="token operator">=</span> key expires <span class="token keyword">in</span> n days      <span class="token operator">&lt;</span>n<span class="token operator">&gt;</span>w <span class="token operator">=</span> key expires <span class="token keyword">in</span> n weeks      <span class="token operator">&lt;</span>n<span class="token operator">&gt;</span>m <span class="token operator">=</span> key expires <span class="token keyword">in</span> n months      <span class="token operator">&lt;</span>n<span class="token operator">&gt;</span>y <span class="token operator">=</span> key expires <span class="token keyword">in</span> n yearsKey is valid for? <span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token number">0</span>Key does not expire at allIs this correct? <span class="token punctuation">(</span>y/N<span class="token punctuation">)</span> y GnuPG needs to construct a user ID to identify your key. Real name: maas Email address: maas@maas.comComment:You selected this <span class="token environment constant">USER</span>-ID:    <span class="token string">"maas@maas.com"</span> Change <span class="token punctuation">(</span>N<span class="token punctuation">)</span>ame, <span class="token punctuation">(</span>C<span class="token punctuation">)</span>omment, <span class="token punctuation">(</span>E<span class="token punctuation">)</span>mail or <span class="token punctuation">(</span>O<span class="token punctuation">)</span>kay/<span class="token punctuation">(</span>Q<span class="token punctuation">)</span>uit? oWe need to generate a lot of random bytes. It is a good idea to performsome other action <span class="token punctuation">(</span>type on the keyboard, move the mouse, utilize thedisks<span class="token punctuation">)</span> during the prime generation<span class="token punctuation">;</span> this gives the random numbergenerator a better chance to gain enough entropy. <span class="token comment">### key 的类型选择 RSA （sign only）</span><span class="token comment">### keyzise 选择 1024</span><span class="token comment">### 过期时间选择 0 （永不过期）</span><span class="token comment">### 最后填上 Real name 和 Email address</span><span class="token comment">### 完成后会要求设置私钥密码，后续导出私钥或者用私钥进行签名都会用到该密码！</span><span class="token comment">### 可以使用 gpg -k 来查看当前的 gpg key 信息</span>root@maas:~<span class="token comment"># gpg -k</span>/root/.gnupg/pubring.kbx------------------------pub   rsa1024 <span class="token number">2021</span>-08-19 <span class="token punctuation">[</span>SC<span class="token punctuation">]</span>      D923B3893E0AB27C3690696CFC3E8D5996EBB76Fuid           <span class="token punctuation">[</span>ultimate<span class="token punctuation">]</span> maas <span class="token operator">&lt;</span>maas@maas.com<span class="token operator">&gt;</span> <span class="token builtin class-name">cd</span> /opt/repo/gpg <span class="token parameter variable">-a</span> <span class="token parameter variable">--export</span> maas@maas.com <span class="token operator">&gt;</span> maas.pub  <span class="token comment">## 导出公钥，后续需要将内容复制到 MAAS 上</span>gpg <span class="token parameter variable">-a</span> --export-secret-keys maas@maas.com <span class="token operator">&gt;</span> maas.sec    <span class="token comment">## 导出私钥</span> <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> dists/focal/main/binary-amd64apt-ftparchive  packages /opt/repo/pool/main/ <span class="token operator">&gt;</span> dists/focal/Packages<span class="token builtin class-name">cd</span> dists/focal/<span class="token function">gzip</span> <span class="token parameter variable">-c</span> Packages <span class="token operator">&gt;</span> Packages.gz<span class="token function">cp</span> Packages* main/binary-amd64/apt-ftparchive release <span class="token builtin class-name">.</span> <span class="token operator">&gt;</span> Releasegpg <span class="token parameter variable">-abs</span> <span class="token parameter variable">-o</span> Release.gpg Releasegpg <span class="token parameter variable">--clearsign</span> <span class="token parameter variable">-o</span> InRelease Release <span class="token comment">### 创建 backports/proposed/security/updates 目录</span><span class="token comment">### 因为我们只是为了安装上述的依赖包从而完成部署流程，因此这几个目录只是用来骗过 ubuntu 的，直接从 focal copy 即可</span><span class="token comment">### proposed 是 src 源，不搞也可以</span><span class="token function">cp</span> <span class="token parameter variable">-r</span> focal focal-backports<span class="token function">cp</span> <span class="token parameter variable">-r</span> focal focal-proposed<span class="token function">cp</span> <span class="token parameter variable">-r</span> focal focal-security<span class="token function">cp</span> <span class="token parameter variable">-r</span> focal focal-updates <span class="token comment">## 通过 Nginx 发布 HTTP 服务</span><span class="token function">apt</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> nginx<span class="token function">sed</span> <span class="token parameter variable">-e</span> <span class="token string">$'/server_name _/a\ \ \ \ \ \ \ \ autoindex on;'</span> /etc/nginx/sites-available/default    <span class="token comment">## 打开 autoindex</span>nginx <span class="token parameter variable">-t</span>    <span class="token comment">## 检查配置语法问题</span>nginx <span class="token parameter variable">-s</span> reload     <span class="token comment">## 加载 nginx 配置</span><span class="token builtin class-name">cd</span> /var/www/html<span class="token function">mv</span> /opt/repo ./<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="修改-MAAS-Package-repos-配置"><a class="header-anchor" href="#修改-MAAS-Package-repos-配置">¶</a> 修改 MAAS Package repos 配置</h3><p>如果客户环境连不到外网，那么我们在部署之前需要修改一下 maas 的配置</p><ol><li class="lvl-3"><p>登录至 maas web 控制界面</p></li><li class="lvl-3"><p>定位置至 Settings → Package repos</p></li><li class="lvl-3"><p>修改 Ubuntu archive URL 为 http://maas_ip/repo/；并将之前导出的 maas.pub 内容粘贴至  Ubuntu archive  Key 中，保存</p></li></ol>]]></content>
    
    
    <summary type="html">&lt;h3 id=&quot;背景&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#背景&quot;&gt;¶&lt;/a&gt; 背景&lt;/h3&gt;
&lt;p&gt;由于部分限制级场景无法联通外网，而 MAAS 在部署镜像的过程中，会默认连接 &lt;a href=&quot;http://archive.ubuntu.com/ubuntu&quot;&gt;http://archive.ubuntu.com/ubuntu&lt;/a&gt; 的源去安装一些依赖包，在无外网环境下，会导致部署失败！因此考虑将 MAAS 在部署过程中的依赖包提前下载好，做成本地的 APT 仓库来解决。&lt;br&gt;
由于 MAAS 需要安装的依赖包并不多（一共 260M 左右），并不需要使用 apt-mirror 去搭建完整的 apt 仓库，我们将需要的依赖包都下载好，使用 apt-fptarchive 来发布我们的仓库。&lt;/p&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="Ubuntu" scheme="https://blog.skyhive.tech/tags/Ubuntu/"/>
    
  </entry>
  
  <entry>
    <title>Galera 集群搭建</title>
    <link href="https://blog.skyhive.tech/post/bb5c39fc.html"/>
    <id>https://blog.skyhive.tech/post/bb5c39fc.html</id>
    <published>2021-08-16T08:22:19.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Galera-简介"><a class="header-anchor" href="#Galera-简介">¶</a>Galera 简介</h3><p>Galera Cluster 是基于 MySQL / Innodb 二次开发而成的一个支持 “多主同步” 的数据库主从集群。具备多主、同步复制、高可用等特点。</p><p>MariaDB Galera Cluster，由 MariaDB 和 MySQL-wsrep 补丁实现, 同 Percona 的 PXC 数据库集群, 目前只支持运行在 Linux 系统上。从 MariaDB 10.1 版开始，MariaDB Server 和 MariaDB Galera Server 安装包已经合并，安装 MariaDB 时，Galera 相关依赖安装包会自动安装，像内置的插件或存储引擎一样，通过简单配置即可启用。</p><h3 id="Galera-集群状态"><a class="header-anchor" href="#Galera-集群状态">¶</a>Galera 集群状态</h3><p>查看集群状态</p><pre class="line-numbers language-sql" data-language="sql"><code class="language-sql"><span class="token keyword">SHOW</span> <span class="token keyword">STATUS</span> <span class="token operator">LIKE</span> <span class="token string">'wsrep_local_state_comment'</span><span class="token punctuation">;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><span id="more"></span><table><thead><tr><th style="text-align:center">状态</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center">Open</td><td style="text-align:center">节点启动成功，尝试连接到集群；如果失败则根据配置退出或者创建新集群</td></tr><tr><td style="text-align:center">Primary</td><td style="text-align:center">节点已处于集群中，在新节点加入时，选取 donor 进行数据同步时会产生的状态</td></tr><tr><td style="text-align:center">Joiner</td><td style="text-align:center">节点处于等待接收 / 接收同步文件的状态</td></tr><tr><td style="text-align:center">Joined</td><td style="text-align:center">节点完成数据同步，但有部分数据没跟上，在尝试保持和集群进度一致的过程状态。<br>例如某个节点故障后，重新加入集群，在追赶集群进度时的状态</td></tr><tr><td style="text-align:center">Synced</td><td style="text-align:center">节点正常提供服务的状态，表示已经同步完成并和集群进度保持一致</td></tr><tr><td style="text-align:center">Donor</td><td style="text-align:center">节点处于为新节点提供全量数据同步时的状态。此时该节点对客户端不提供服务</td></tr></tbody></table><h3 id="基本概念"><a class="header-anchor" href="#基本概念">¶</a> 基本概念</h3><ol><li class="lvl-3"><p>Primary Component：在网络发生故障时，由于网络连接原因，集群可能被分成好几个小集群，但只能有一个集群可以继续进行数据修改，集群的这部分称为 Primary Component</p></li><li class="lvl-3"><p>GTID：Global Transaction ID，由 UUID 和 sequence number 偏移量组成。wsrep api 中定义的集群内部全局事务 id，一个顺序 ID，用于记录集群中发生状态改变的唯一标识以及队列中的偏移量</p></li><li class="lvl-3"><p>SST：State Snapshot Transfer（状态快照迁移），集群中数据共享节点通过从一个节点到另外一个节点迁移完整的数据拷贝（全量拷贝）。当一个新的节点加入到集群中，新的节点从集群中已有节点同步数据，开始进行状态快照迁移，可以在 Galera 集群中选择两种不同的状态转移方法</p><p>3.1 逻辑数据转移：采用 mysqldump 命令，在转移之前，需要数据接收方服务器完全启动，并准备好接受数据的连接准备。这是一个阻塞式方法，数据共享节点 Donor 在状态转移节点处于只读状态，在数据共享节点 Donor 上适用 FLUSH TABLES WITH READ LOCK 命令，mysqldump 是速度最慢的 SST 方法，在负载比较的数据库集群上可能是个问题。</p><p>3.2 物理数据转移：该方法采用 rsync、rsync_wan、xtrabackup 或其他方法从服务器之间直接拷贝数据，数据接受服务器在拷贝完数据后启动服务器。该方法较 mysqldump 速度较快，但存在一定的限制，只能在服务器启动时采用，数据接受服务器需要同数据共享服务器 Donor 配置相同（例如，服务器间 innodb_file_per_table 配置必须完全一致）。</p></li><li class="lvl-3"><p>IST：Incremental State Transfer（增量状态迁移），集群一个节点通过识别新加入节点缺失的事务操作，将该操作发送，而并不像 SST 那样的全量数据拷贝。该方法只在特定条件下可用：</p><p>4.1 新加入节点的状态 UUID 与集群组中节点一致；</p><p>4.2 新加入节点所缺失的写数据集 write-sets 可以在 Donor 的写数据集 write-sets 存在。</p></li></ol><h3 id="搭建过程"><a class="header-anchor" href="#搭建过程">¶</a> 搭建过程</h3><h4 id="环境信息"><a class="header-anchor" href="#环境信息">¶</a> 环境信息</h4><table><thead><tr><th style="text-align:center">hostname</th><th style="text-align:center">IP</th></tr></thead><tbody><tr><td style="text-align:center">db01</td><td style="text-align:center">&lt;IP_ADDR_1&gt;</td></tr><tr><td style="text-align:center">db02</td><td style="text-align:center">&lt;IP_ADDR_2&gt;</td></tr><tr><td style="text-align:center">db03</td><td style="text-align:center">&lt;IP_ADDR_3&gt;</td></tr></tbody></table><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">## 安装依赖</span><span class="token function">sudo</span> <span class="token function">apt</span> update<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> mariadb-server-10.3<span class="token comment">## 配置集群</span><span class="token comment">### 在第一台主机操作</span>systemctl stop mysql<span class="token function">vim</span> /etc/mysql/mariadb.conf.d/50-server.cnf<span class="token comment"># 在 [mysqld] 下添加 skip-name-resolve</span><span class="token comment"># 在文件末尾添加如下内容</span><span class="token punctuation">[</span>galera<span class="token punctuation">]</span><span class="token assign-left variable">wsrep_on</span><span class="token operator">=</span>ON<span class="token assign-left variable">wsrep_provider</span><span class="token operator">=</span>/usr/lib/galera/libgalera_smm.so<span class="token assign-left variable">wsrep_cluster_address</span><span class="token operator">=</span><span class="token string">"gcomm://"</span><span class="token assign-left variable">binlog_format</span><span class="token operator">=</span>row<span class="token assign-left variable">default_storage_engine</span><span class="token operator">=</span>InnoDB<span class="token assign-left variable">innodb_autoinc_lock_mode</span><span class="token operator">=</span><span class="token number">2</span>bind-address<span class="token operator">=</span><span class="token number">0.0</span>.0.0<span class="token comment"># any cluster name</span><span class="token assign-left variable">wsrep_cluster_name</span><span class="token operator">=</span><span class="token string">"MariaDB_Cluster"</span><span class="token comment"># own IP address</span><span class="token assign-left variable">wsrep_node_address</span><span class="token operator">=</span><span class="token string">"&lt;IP_ADDR_1&gt;"</span><span class="token comment">### 完成后保存退出</span>galera_new_clustermysql <span class="token parameter variable">-uroot</span> <span class="token parameter variable">-p</span>CREATE <span class="token environment constant">USER</span> <span class="token string">'root'</span>@<span class="token string">'%'</span> IDENTIFIED BY <span class="token string">'&lt;DB_PASSWORD&gt;'</span><span class="token punctuation">;</span>GRANT ALL ON *.* TO <span class="token string">'root'</span>@<span class="token string">'%'</span><span class="token punctuation">;</span>update mysql.user <span class="token builtin class-name">set</span>  <span class="token assign-left variable">Grant_priv</span><span class="token operator">=</span><span class="token string">'Y'</span> where <span class="token assign-left variable">user</span><span class="token operator">=</span><span class="token string">'root'</span> and <span class="token assign-left variable">host</span><span class="token operator">=</span><span class="token string">'%'</span><span class="token punctuation">;</span>flush privileges<span class="token punctuation">;</span><span class="token builtin class-name">exit</span><span class="token comment">### 在其他两台主机操作</span>systemctl stop mysql<span class="token function">vim</span> /etc/mysql/mariadb.conf.d/50-server.cnf<span class="token comment"># 在 [mysqld] 下添加 skip-name-resolve</span><span class="token comment"># 在文件末尾添加如下内容</span><span class="token punctuation">[</span>galera<span class="token punctuation">]</span><span class="token assign-left variable">wsrep_on</span><span class="token operator">=</span>ON<span class="token assign-left variable">wsrep_provider</span><span class="token operator">=</span>/usr/lib/galera/libgalera_smm.so<span class="token assign-left variable">wsrep_cluster_address</span><span class="token operator">=</span><span class="token string">"gcomm://&lt;IP_ADDR_1&gt;,&lt;IP_ADDR_2&gt;,&lt;IP_ADDR_3&gt;"</span><span class="token assign-left variable">binlog_format</span><span class="token operator">=</span>row<span class="token assign-left variable">default_storage_engine</span><span class="token operator">=</span>InnoDB<span class="token assign-left variable">innodb_autoinc_lock_mode</span><span class="token operator">=</span><span class="token number">2</span>bind-address<span class="token operator">=</span><span class="token number">0.0</span>.0.0<span class="token comment"># any cluster name</span><span class="token assign-left variable">wsrep_cluster_name</span><span class="token operator">=</span><span class="token string">"MariaDB_Cluster"</span><span class="token comment"># own IP address</span><span class="token assign-left variable">wsrep_node_address</span><span class="token operator">=</span><span class="token string">"&lt;IP_ADDR_2&gt;"</span>   <span class="token comment">## 注意：这里填写当前节点的 IP，另外一个节点填 &lt;IP_ADDR_3&gt;</span><span class="token comment">### 完成后保存退出</span><span class="token comment">## 重启 MySQL 服务</span>systemctl start mysqlsystemctl <span class="token builtin class-name">enable</span> mysql<span class="token comment">## 检查集群状态</span>mysql <span class="token parameter variable">-uroot</span> <span class="token parameter variable">-p</span>show status like <span class="token string">'wsrep_cluster%'</span><span class="token punctuation">;</span><span class="token comment">## 需观察 'wsrep_cluster_size' 是否正常（正常为节点数量），以及 'wsrep_cluster_status' 是否为 Primary</span><span class="token comment">## 如果集群状态正常，则去修改第一个节点的 /etc/mysql/mariadb.conf.d/50-server.cnf 文件</span><span class="token comment">## 将 wsrep_cluster_address 配置修改和其他两个节点一致即可</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
    <summary type="html">&lt;h3 id=&quot;Galera-简介&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#Galera-简介&quot;&gt;¶&lt;/a&gt;Galera 简介&lt;/h3&gt;
&lt;p&gt;Galera Cluster 是基于 MySQL / Innodb 二次开发而成的一个支持 “多主同步” 的数据库主从集群。具备多主、同步复制、高可用等特点。&lt;/p&gt;
&lt;p&gt;MariaDB Galera Cluster，由 MariaDB 和 MySQL-wsrep 补丁实现, 同 Percona 的 PXC 数据库集群, 目前只支持运行在 Linux 系统上。从 MariaDB 10.1 版开始，MariaDB Server 和 MariaDB Galera Server 安装包已经合并，安装 MariaDB 时，Galera 相关依赖安装包会自动安装，像内置的插件或存储引擎一样，通过简单配置即可启用。&lt;/p&gt;
&lt;h3 id=&quot;Galera-集群状态&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#Galera-集群状态&quot;&gt;¶&lt;/a&gt;Galera 集群状态&lt;/h3&gt;
&lt;p&gt;查看集群状态&lt;/p&gt;
&lt;pre class=&quot;line-numbers language-sql&quot; data-language=&quot;sql&quot;&gt;&lt;code class=&quot;language-sql&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;SHOW&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;STATUS&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;LIKE&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#39;wsrep_local_state_comment&#39;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;line-numbers-rows&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</summary>
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="MySQL" scheme="https://blog.skyhive.tech/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>雾都游记</title>
    <link href="https://blog.skyhive.tech/post/aa1bd7a9.html"/>
    <id>https://blog.skyhive.tech/post/aa1bd7a9.html</id>
    <published>2020-10-22T07:07:20.000Z</published>
    <updated>2026-03-02T03:49:22.585Z</updated>
    
    <content type="html"><![CDATA[<h3 id="第一天"><a class="header-anchor" href="#第一天">¶</a> 第一天</h3><p>18:30 落地，取得托运行李后，自<strong>江北机场 T3 航站楼</strong>乘坐地铁<strong>十号线（鲤鱼池方向）<strong>至红</strong>土地换</strong>乘地铁<strong>六号线（茶园方向）<strong>至</strong>小什字下车（8 号口）</strong>，马路对面就是宾馆！！</p><blockquote><ul class="lvl-1"><li class="lvl-2"><p>重庆地铁可使用支付宝刷码进站</p></li><li class="lvl-2"><p>宾馆前台在 16F，10-15F 是客房</p></li><li class="lvl-2"><p>企业金会员，有双早，但是早饭不好吃</p></li><li class="lvl-2"><p>紧承上一条，楼下马路对面就有花市豌杂面（如果不想吃汤面就和老板说要干溜），不想排队等座位的话，可以考虑打包去别的地方吃（隔壁就有类似大食堂的早餐店）</p></li></ul></blockquote><p>在宾馆休整些许后，步行出发去<strong>九村烤脑花（西西推荐，冤有头债有主，觉得不好吃不要找我）</strong>，步行至洪崖洞店，在附近买了两杯<strong>一只酸奶牛</strong>后就餐；推荐<strong>香菜牛肉、烤茄子、烤鸡翅</strong>等</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E4%B9%9D%E6%9D%91%E7%83%A4%E8%84%91%E8%8A%B1.png" alt="九村烤脑花"></p><blockquote><ul class="lvl-1"><li class="lvl-2"><p>宾馆附近有三家九村烤脑花，分别在来福士、洪崖洞、解放碑，三个店离宾馆差不多距离，来福士店十点关门，所以建议去其他两个店</p></li><li class="lvl-2"><p>九村烤脑花是烧烤店，烤脑花为特色菜，其他菜也很好吃，人均 70~80，人越多越划算</p></li></ul></blockquote><p>吃完回酒店修锅，一夜无事 💤</p><span id="more"></span><!--style>.page-post-detail .post-body .group-picture-column {  float: none;  margin-top: 5px;  // width: auto ;  img { margin: 0 auto;  width: 100% ; }}.fancybox {    display: inline-block;}</style--><h3 id="第二天"><a class="header-anchor" href="#第二天">¶</a> 第二天</h3><p>睡到中午，洗漱出门。</p><p>步行至解放碑吃小吃，较场口夜市区域购买<strong>降龙爪爪、蜜雪冰城冰激凌</strong>，后步行至石灰市，购买现炸小酥肉，并于<strong>谭记王烤鱼</strong>就餐。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/xianglongzhuazhua.png","alt":"降龙爪爪","title":""},{"url":"https://blogpic.skyhive.tech/pic/mixue.png","alt":" 蜜雪冰城甜蜜蜜 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/roasted-pig-trotters.png","alt":"烤猪蹄","title":""}]</div>  </div><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/crispy-pork.png","alt":"小酥肉","title":""},{"url":"https://blogpic.skyhive.tech/pic/baked-potato.png","alt":" 烤土豆 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/suannainiu.png","alt":"酸奶牛","title":""},{"url":"https://blogpic.skyhive.tech/pic/grilled-fish.png","alt":" 烤鱼 ","title":""}]</div>  </div><blockquote><ul class="lvl-1"><li class="lvl-2"><p>降龙爪爪排队的人比较多，但务必要吃，真的好吃</p><ul class="lvl-3"><li class="lvl-4">火锅味很辣，真的辣</li><li class="lvl-4">老卤味很香，真的香</li><li class="lvl-4">其他口味没有吃</li></ul></li><li class="lvl-2"><p>降龙爪爪隔壁有家卖脆骨的，人也很多，味道还可以，但是很贵，没有性价比</p></li><li class="lvl-2"><p>蜜雪冰城冰激凌三块钱，很好吃</p></li><li class="lvl-2"><p>小吃街卖现炸小酥肉的，大多都不好吃，不要看排队的人多，买回来可能还不如上海谭鸭血点的</p></li><li class="lvl-2"><p>谭记王烤鱼虽然好吃，但真的很贵，一条江团的套餐 140（和江边城外不相上下），人多的局可以选择吃对面的，烤鱼 + 江湖菜，会比较划算</p></li></ul></blockquote><p>午餐后沿着石灰市一路向北，来到莲花池社区，其中有著名的<strong>石灰市李串串</strong>，以及一些小区里居民自己开的烧烤、火锅、烤鱼店，味道都很地道，墙裂推荐！！</p><blockquote><p>石灰市李串串要吃里面那家老店（有标识），一年前吃过，大众点评必吃榜名副其实</p></blockquote><p>沿着莲花池社区的主路一路向北，出了莲花池社区后来到民生路，一路向西后来到通远楼城墙，继续爬，爬到顶后（过了幼儿园）出现了下去的路。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E9%80%9A%E8%BF%9C%E9%97%A8.png" alt="通远门"><br><img src="https://blogpic.skyhive.tech/pic%2F%E4%B8%89%E4%B8%89%E4%B8%80%E6%83%A8%E6%A1%88.png" alt="三三一惨案"></p><p>后步行至长江索道处准备过江（此时约 4 点左右），被长江索道外一个大叔拦住：</p><blockquote><p>大叔：不要坐索道了，里面排了 5000 多号了 <br><br>我一看确实 5000 号：那就不坐索道了，我去做地铁到对面<br><br>大叔：你去对面干什么<br><br>我：上山吃火锅看夜景<br><br>大叔：重庆冬天叫雾都，你上山能隔几公里能看到什么夜景；去洪崖洞玩玩吧<br><br>我：安排了，明晚去<br><br>大叔：游船没有做过吧，看夜景可以做游船，两江游<br><br>我：一年前坐过了<br><br>至此，人心难测，真假难辨，不做评论</p></blockquote><p>长江索道门口便是小什字地铁口，非常方便，乘坐六号线至<strong>上新街（茶园方向）</strong></p><p>上新街地铁口在山腰处，二号口出来便是盗月社曾吃过的<strong>豆花鲫鱼店</strong>（同样也是在别人家里的）- <a href="https://www.bilibili.com/video/BV1LT4y1E7ET">B 站视频链接</a></p><p>由于之前奔走过于频繁，此时累的一批，就沿着下山的路寻找座位，大概走了一半坐了下来就再也不想动了。。。同时也打消了上山的念头，来到了山脚 – 即南滨路。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E4%B8%8A%E6%96%B0%E8%A1%97%E6%B1%9F%E6%99%AF.png" alt="上新街江景 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E4%B8%8A%E6%96%B0%E8%A1%97%E6%B1%9F%E6%99%AF02.png" alt="上新街江景 - 2"></p><p>沿着南滨路步行至南滨路景区，结果靠江的部分被封了，只能站在上面拍照，血亏。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E5%8D%97%E6%BB%A8%E8%B7%AF%E6%B1%9F%E6%99%AF01.png" alt="南滨路江景 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E5%8D%97%E6%BB%A8%E8%B7%AF%E6%B1%9F%E6%99%AF02.png" alt="南滨路江景 - 2"></p><blockquote><ul class="lvl-1"><li class="lvl-2"><p>上南山可以参考文博和西西的推荐去吃火锅或者小吃，重点就是在学校附近的店，绝对没有坑</p></li><li class="lvl-2"><p>巴倒烫也是可以的，如果有时间的话就排个队在外面吃，会比较舒服，一年去吃过，味道不错</p></li></ul></blockquote><p>打车回渝中（真的太累了，走不动了），晚上去<strong>今朝醉小酒馆</strong>就餐，两个人吃比较亏，人多了才划算，果酒很好喝，就是太贵了。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E8%BE%A3%E5%AD%90%E9%B8%A1.png" alt="辣子鸡"><br>晚上回去买了俩烤猪蹄，到酒店洗洗、玩玩手机就睡了 💤。</p><h3 id="第三天"><a class="header-anchor" href="#第三天">¶</a> 第三天</h3><p>早上鬼使神差的去吃了汉庭的早餐，种类比较少，不太好吃。</p><p>洗漱后来到楼下买了一碗<strong>花市豌杂</strong>，小面打包至隔壁的类似大食堂的早餐店就餐，顺便点了一碗<strong>早茶</strong>（虽然已经是中午了）。</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/wanza.png","alt":"花市豌杂","title":""},{"url":"https://blogpic.skyhive.tech/pic/DimSum.png","alt":" 早茶 ","title":""}]</div>  </div><p>吃饱喝足后去乘坐地铁<strong>一号线（璧山方向）<strong>至大坪站换乘地铁</strong>二号线（较场口方向）</strong>，于李子坝站下车，跟着路标出地铁站来到马路对面的李子坝观景台拍照。<br><img src="https://blogpic.skyhive.tech/pic%2F%E6%9D%8E%E5%AD%90%E5%9D%9D01.png" alt="李子坝 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%9D%8E%E5%AD%90%E5%9D%9D02.png" alt="李子坝 - 2 "><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%9D%8E%E5%AD%90%E5%9D%9D%E6%B1%9F%E6%99%AF.png" alt="李子坝江景"></p><p>李子坝观景台对面是防空洞，进去转转没啥意思。</p><blockquote><p>李子坝观景台主要就是看地铁开进大楼，真的没啥意思，不喜欢的同学可以不用去</p></blockquote><p>根据原计划步行至<strong>鹅岭公园（导航显示 2 KM）</strong>，跟着导航走了 100m 后发现自己开始爬山，爬到怀疑人生后发现自己从李子坝地铁站<strong>爬到了上一个地铁站</strong> - 佛图关，心态大崩，由于小黄同学身体不适，就此作罢，劝后人以此为戒。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E9%B9%85%E5%B2%AD%E6%B1%9F%E6%99%AF.png" alt="鹅岭江景"></p><p>从佛图关地铁站乘坐<strong>二号线（较场口方向）<strong>至较场口地铁站下车，来到</strong>较场口夜市</strong>，采购部分小吃走回酒店修整（此时约 4 点左右）。</p><p>晚上六点左右出门，直奔<strong>洪崖洞</strong>（无需买票），在洪崖洞外有大叔说十块钱带你去洪崖洞一楼，不用排队，不用理会即可。</p><blockquote><p>此处科普：</p><ul class="lvl-1"><li class="lvl-2">洪崖洞共有十一层楼，当你站在地面上准备入洪雅洞的时候是在十一楼，你可以认为他是在地下 1-11 层，不同的参考系而已</li><li class="lvl-2">入洪崖洞不要门票，扫码预约或者美团预约即可（免费）</li></ul></blockquote><p>排队进入洪崖洞后，随大流走到当前楼层的尽头，开始下楼，下楼有两种方式，可以做直梯（参考 PDD 上班），也可以走楼梯（果断选择走楼梯）。</p><p>在人挤人的环境下走到 5 楼（好像是 4 楼，记不清了），开始参观所谓的 xxx 风情商业街。记忆中从 1 -5 楼都是这种商业街，特色就是光污染 + 重庆特色，拍拍照吃吃东西就没啥了。</p><p>走到一楼后就显得非常空旷，并且适合拍江景。</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E6%B4%AA%E5%B4%96%E6%B4%9E.png" alt="洪崖洞 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%B4%AA%E5%B4%96%E6%B4%9E02.png" alt="洪崖洞 - 2"><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%B4%AA%E5%B4%96%E6%B4%9E%E6%B1%9F%E6%99%AF.png" alt="洪崖洞江景 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%B4%AA%E5%B4%96%E6%B4%9E%E6%B1%9F%E6%99%AF02.png" alt="洪崖洞江景 - 2"></p><p>吐槽完洪崖洞后，又要从一楼爬回十一楼，爬不动的建议等直梯。</p><blockquote><p>洪崖洞作为重庆的标志性打卡圣地，基础设施是真的差，一个男厕所三个坑位，两个没有门；四个便池，两个是漫出来的。。。 <img src="https://blogpic.skyhive.tech/pic/shit.png" alt="拉屎"></p></blockquote><p>洪崖洞出来后，步行至<strong>石灰市莲花池社区</strong>，寻找<strong>巴渝龙老火锅</strong> ，今晚选择和盗月社同款打卡火锅店 - <a href="https://www.bilibili.com/video/BV1qs411M7S6">B 站链接</a>（也因为这是开在小区里的老火锅，物美价廉）</p><div class="gallery-container" data-type="data" data-button="" data-limit="10" data-first="10">    <div class="gallery-items">[{"url":"https://blogpic.skyhive.tech/pic/bayulong.png","alt":"巴渝龙","title":""},{"url":"https://blogpic.skyhive.tech/pic/Spicy-Beef.png","alt":" 麻辣牛肉 ","title":""},{"url":"https://blogpic.skyhive.tech/pic/dog.png","alt":"狗子","title":""}]</div>  </div><p>吃完（大概十点左右）步行回酒店，洗漱玩手机睡觉 💤</p><h3 id="第四天"><a class="header-anchor" href="#第四天">¶</a> 第四天</h3><p>继续睡到中午，开始收拾行李，准备退房。</p><p>中午提着行李去吃<strong>豆花饭</strong>。</p><p>没错，店名就叫豆花饭，在<strong>新华路</strong>上，依然是盗月社同款打卡店 - <a href="https://www.bilibili.com/video/BV1iK4y147yv">B 站链接</a></p><p>这个也是重庆人民自己开的店，便宜实惠量贼多。一人点了一份豆花 + 米饭，另外点了一个尖椒回锅肉 + 毛血旺，吃到撑，都是下饭菜！！</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E8%B1%86%E8%8A%B1%E9%A5%AD.png" alt="豆花饭"><br><img src="https://blogpic.skyhive.tech/pic%2F%E6%AF%9B%E8%A1%80%E6%97%BA.png" alt="毛血旺"></p><p>下午则没有去什么别的地方，直接去机场等着回家了</p><p><img src="https://blogpic.skyhive.tech/pic%2F%E5%A4%A7%E8%99%B9%E6%A1%A5%E5%A4%9C%E6%99%AF.png" alt="大虹桥夜景 - 1"><br><img src="https://blogpic.skyhive.tech/pic%2F%E5%A4%A7%E8%99%B9%E6%A1%A5%E5%A4%9C%E6%99%AF02.png" alt="大虹桥夜景 - 2"></p><h3 id="总结"><a class="header-anchor" href="#总结">¶</a> 总结</h3><p>重庆是很美的城市，三天的行程只发掘了它一小部分的魅力；山城，一定要上山感受他的魅力（虽然这次没有上南山，下次去补上！！）。</p><p>秋天，湿度、温度都刚刚好，上山，吹风，观景，吃火锅，一绝。</p><h4 id="对于吃"><a class="header-anchor" href="#对于吃">¶</a> 对于吃</h4><p>重庆吃的很多，建议参照上级目录中西西和文博的推荐（即我修改后的表格以及他们留下的评论）。</p><p>商场里的店仅限打卡，吃还是建议进社区/小区/学校周边，比较有重庆味道且价格实惠。</p><p>重庆味道不是辣，辣起辅助作用，主要是香、鲜，菜大多都比较下饭，所以不必追求菜量（口味重另说）。</p><h4 id="对于行"><a class="header-anchor" href="#对于行">¶</a> 对于行</h4><p>地铁 / 公交可以解决大多数场景，实在累了就打车。</p><p>看地图时刻记得要加上 Z 轴，只看路程距离是不行的，还得看该路程是否在山上。</p><h4 id="对于玩"><a class="header-anchor" href="#对于玩">¶</a> 对于玩</h4><ul class="lvl-0"><li class="lvl-2"><p>洪崖洞：不推荐，如果人少且实在是闲着没事可以去；</p></li><li class="lvl-2"><p>游船：不太推荐但高于洪崖洞，缺点是贵且排队人多，优点是可以看到洪崖洞全景，但如果买票上船了一定记得要随身带身份证，没有带就别买票，否则两三个小时都在排队；</p></li><li class="lvl-2"><p>索道：不太推荐，大号缆车，就是站在缆车里听导游哔哔十分钟就到对面了，排队平均时间在一小时（如果要做缆车，记得提前取票，避免傻等着）；</p></li><li class="lvl-2"><p>解放碑：推荐，附近都是小吃街，如解放碑好吃街、八一路好吃街、民族路好吃街、较场口夜市等；</p></li><li class="lvl-2"><p>李子坝观景台：推荐，地铁直达，可拍照且不用排队，去完李子坝可顺路去鹅岭、三峡广场等（地铁直达）；</p></li><li class="lvl-2"><p>皇冠大扶梯：推荐，地铁直达（目前貌似未开放）</p></li><li class="lvl-2"><p>三峡广场：一般推荐，离解放碑稍远，也是一个商业街，附近有一些学校（沙坪坝小区），所以吃的还可以</p></li><li class="lvl-2"><p>磁器口古镇：不太推荐，比较远的一个古镇商业街，因为免费门票，所以人很多，还是爬山，所以一般情况不推荐去；</p></li><li class="lvl-2"><p>川美：想去，但是因为疫情不开放；</p></li><li class="lvl-2"><p>南山：推荐，山上有不少大学以及火锅一条街，所以吃的肯定不错，并且有南山一棵树观景台，观景效果应该不错；</p></li><li class="lvl-2"><p>南滨路：不推荐，没啥好玩的，临江 + 商业广场</p></li><li class="lvl-2"><p>七星岗 / 通远楼：有时间可以从石灰市步行至通远楼城墙，爬上山后至七星岗，没有啥特别的，但是比较贴近重庆市民的生活，适合放松</p></li></ul>]]></content>
    
    
    <summary type="html">&lt;h3 id=&quot;第一天&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#第一天&quot;&gt;¶&lt;/a&gt; 第一天&lt;/h3&gt;
&lt;p&gt;18:30 落地，取得托运行李后，自&lt;strong&gt;江北机场 T3 航站楼&lt;/strong&gt;乘坐地铁&lt;strong&gt;十号线（鲤鱼池方向）&lt;strong&gt;至红&lt;/strong&gt;土地换&lt;/strong&gt;乘地铁&lt;strong&gt;六号线（茶园方向）&lt;strong&gt;至&lt;/strong&gt;小什字下车（8 号口）&lt;/strong&gt;，马路对面就是宾馆！！&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;lvl-1&quot;&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;重庆地铁可使用支付宝刷码进站&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;宾馆前台在 16F，10-15F 是客房&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;企业金会员，有双早，但是早饭不好吃&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;紧承上一条，楼下马路对面就有花市豌杂面（如果不想吃汤面就和老板说要干溜），不想排队等座位的话，可以考虑打包去别的地方吃（隔壁就有类似大食堂的早餐店）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;在宾馆休整些许后，步行出发去&lt;strong&gt;九村烤脑花（西西推荐，冤有头债有主，觉得不好吃不要找我）&lt;/strong&gt;，步行至洪崖洞店，在附近买了两杯&lt;strong&gt;一只酸奶牛&lt;/strong&gt;后就餐；推荐&lt;strong&gt;香菜牛肉、烤茄子、烤鸡翅&lt;/strong&gt;等&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blogpic.skyhive.tech/pic%2F%E4%B9%9D%E6%9D%91%E7%83%A4%E8%84%91%E8%8A%B1.png&quot; alt=&quot;九村烤脑花&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul class=&quot;lvl-1&quot;&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;宾馆附近有三家九村烤脑花，分别在来福士、洪崖洞、解放碑，三个店离宾馆差不多距离，来福士店十点关门，所以建议去其他两个店&lt;/p&gt;
&lt;/li&gt;
&lt;li class=&quot;lvl-2&quot;&gt;
&lt;p&gt;九村烤脑花是烧烤店，烤脑花为特色菜，其他菜也很好吃，人均 70~80，人越多越划算&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;吃完回酒店修锅，一夜无事 💤&lt;/p&gt;</summary>
    
    
    
    <category term="生活相关" scheme="https://blog.skyhive.tech/categories/Life/"/>
    
    
    <category term="旅游" scheme="https://blog.skyhive.tech/tags/%E6%97%85%E6%B8%B8/"/>
    
    <category term="重庆" scheme="https://blog.skyhive.tech/tags/%E9%87%8D%E5%BA%86/"/>
    
  </entry>
  
  <entry>
    <title>KVM 填坑</title>
    <link href="https://blog.skyhive.tech/post/84d7a5a0.html"/>
    <id>https://blog.skyhive.tech/post/84d7a5a0.html</id>
    <published>2020-09-06T09:35:31.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1、UEFI-引导问题"><a class="header-anchor" href="#1、UEFI-引导问题">¶</a>1、UEFI 引导问题</h3><p>支持 KVM 虚拟机使用 UEFI 引导需要安装 OVMF 组件，参考<a href="https://blog.skyhive.tech/2020/06/10/%E5%9F%BA%E4%BA%8E-CentOS-%E5%AE%89%E8%A3%85-KVM/">基于 CentOS 安装 KVM</a>。<br>目前通过 virt-v2v 导入的 ova 且使用 UEFI 启动的虚拟机（from vSphere）再 define domain 的时候会有报错，报错如下：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">error: Failed to define domain from /tmp/v2vlibvirt20e61b.xmlerror: unsupported configuration: smm is not available with this QEMU binary<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>以上报错是 OVMF 的问题，参考：<a href="https://access.redhat.com/discussions/3175901">https://access.redhat.com/discussions/3175901</a></p><p>具体是因为因为 “OVMF_CODE.secboot.fd” 固件在当前的 qemu-kvm 中不受支持，RedHat Discussion 上有两种解决方案：</p><ol><li class="lvl-3"><p>重构 OVMF RPM 包，参考： <a href="https://access.redhat.com/discussions/3175901">https://access.redhat.com/discussions/3175901</a></p><blockquote><p>Removing “-D SMM_REQUIRE”, rebuild the rpm, browse inside the rpm and then copy OVMF_CODE.secboot.fd to /usr/share/OVMF/OVMF_CODE.fd makes it work but I don’t know whether this will reduce security.</p></blockquote></li><li class="lvl-3"><p>升级 qemu-kvm 版本至 2.6 以上的 qemu-kvm-rhev 版本</p><blockquote><p>‘With this update, the “OVMF_CODE.secboot.fd” firmware binary file includes the Secure Boot feature. This binary can be used with pc-q35-rhel7.3.0 and later Q35 machine types only […]’<br>Those machine types are unavailable when using the 1.5.3-based “qemu-kvm” package of base RHEL. They are available only when using the 2.6.0-based “qemu-kvm-rhev” package, which is not part of base RHEL.</p></blockquote></li></ol><p>未完待续……</p>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;1、UEFI-引导问题&quot;&gt;&lt;a class=&quot;header-anchor&quot; href=&quot;#1、UEFI-引导问题&quot;&gt;¶&lt;/a&gt;1、UEFI 引导问题&lt;/h3&gt;
&lt;p&gt;支持 KVM 虚拟机使用 UEFI 引导需要安装 OVMF 组件，参考&lt;a</summary>
        
      
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="虚拟化" scheme="https://blog.skyhive.tech/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
    <category term="KVM" scheme="https://blog.skyhive.tech/tags/KVM/"/>
    
  </entry>
  
  <entry>
    <title>ESXi 快照机制</title>
    <link href="https://blog.skyhive.tech/post/35b185c.html"/>
    <id>https://blog.skyhive.tech/post/35b185c.html</id>
    <published>2020-06-17T15:47:50.000Z</published>
    <updated>2026-03-02T03:49:22.581Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://kb.vmware.com/s/article/1015180">Understanding VM Sanpshots in ESXi</a><br><br><a href="https://kknews.cc/code/y5pnlkj.html">VMware vSphere 6.7 虚拟机快照原理及 Veeam Backup 备份</a><br><br><a href="https://docs.vmware.com/cn/VMware-vSphere/6.5/com.vmware.vsphere.virtualsan.doc/GUID-1D6AD25A-459A-43D6-8FF5-52475499D6A2.html">vSAN 中的闪存缓存设备设计注意事项</a></p></blockquote><h3 id="初时虚拟磁盘文件"><a class="header-anchor" href="#初时虚拟磁盘文件">¶</a> 初时虚拟磁盘文件</h3><p>ESXi 虚拟机的存储文件主要为 .vmx、.vmsd、.vmdk 等文件，其中对于 .vmdk 文件：</p><ul class="lvl-0"><li class="lvl-2"><p>xx.vmdk：该文件保存的是磁盘的元数据，包括 xx-flat.vmdk 和 xx-ctk.vmdk 文件</p></li><li class="lvl-2"><p>xx-flat.vmdk：该文件为 Extent Description 二级制文件啊，二级制数据保存在此文件中</p></li><li class="lvl-2"><p>xx-ctk.vmdk：该文件为 CTK 文件，CBT（数据块修改跟踪）启动时自动生成</p></li></ul><h3 id="快照"><a class="header-anchor" href="#快照">¶</a> 快照</h3><p>快照创建过程中，新增以下文件：</p><ul class="lvl-0"><li class="lvl-2"><p>**-000001.vmdk</p></li><li class="lvl-2"><p>**-000001-ctk.vmdk</p></li><li class="lvl-2"><p>**-000001-delta.vmdk（基础 vmdk 上的变更位图）</p></li><li class="lvl-2"><p>**-Snapshot*.vmsn（快照状态文件）</p></li></ul><h4 id="快照创建过程简单描述如下"><a class="header-anchor" href="#快照创建过程简单描述如下">¶</a> 快照创建过程简单描述如下</h4><ol><li class="lvl-3"><p>当虚拟机未创建快照时，虚拟机的读写操作直接在 VMDK 文件进行；</p></li><li class="lvl-3"><p>当虚拟机创建第一个快照时，这时生成 <strong>-000001-delta.vmdk 和</strong> -000001.vmdk 文件，并立即锁住源 VMDK 文件，将其变为只读状态。虚拟机的写操作均在 <strong>-000001.vmdk 上进行，读操作将在</strong>.vmdk 和 **-000001.vmdk 上进行（具体基于需要读的数据所在位置）；</p></li><li class="lvl-3"><p>再次创建快照的原理和之前一样，生成 <strong>-000002-delta.vmdk 和</strong> -000002.vmdk 文件，锁住 **-000001.vmdk 文件，将其变为只读状态。</p></li></ol><h3 id="注意点"><a class="header-anchor" href="#注意点">¶</a> 注意点</h3><ul class="lvl-0"><li class="lvl-2"><p>对于有用快照的虚拟机做写操作时，均在新的 vmdk 文件进行，如果数据在父 vmdk 上（被锁住成只读的 vmdk），先将数据拷贝到新的 vmdk 上，再进行修改；</p></li><li class="lvl-2"><p>当读取某一块数据时，ESXi 需要判断从哪里去读：对于没有修改的数据块，从父 vmdk 读，对于已经修改的数据块，从新的 vmdk 上读。</p></li><li class="lvl-2"><p>整合多个虚拟机快照时，主机会短暂无响应</p></li></ul>]]></content>
    
    
      
      
        
        
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://kb.vmware.com/s/article/1015180&quot;&gt;Understanding VM Sanpshots in ESXi&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a</summary>
        
      
    
    
    
    <category term="技术相关" scheme="https://blog.skyhive.tech/categories/Tech/"/>
    
    
    <category term="虚拟化" scheme="https://blog.skyhive.tech/tags/%E8%99%9A%E6%8B%9F%E5%8C%96/"/>
    
    <category term="ESXi" scheme="https://blog.skyhive.tech/tags/ESXi/"/>
    
  </entry>
  
</feed>
