<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>RyanZhang</name>
    <email>ryanzzzz@foxmail.com</email>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <icon>https://www.gravatar.com/avatar/55a6c67ed22ade84065da5bf560e18a2</icon>
  <id>https://ryanzhangk.github.io/</id>
  <link href="https://ryanzhangk.github.io/" rel="alternate"/>
  <link href="https://ryanzhangk.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, RyanZhang</rights>
  <subtitle>Welcome to RyanZ's blog.</subtitle>
  <title>RyanZ的个人博客</title>
  <updated>2026-04-19T11:17:47.000Z</updated>
  <entry>
    <author>
      <name>RyanZhang</name>
      <email>ryanzzzz@foxmail.com</email>
    </author>
    <category term="生活随笔" scheme="https://ryanzhangk.github.io/categories/%E7%94%9F%E6%B4%BB%E9%9A%8F%E7%AC%94/"/>
    <category term="短文" scheme="https://ryanzhangk.github.io/tags/%E7%9F%AD%E6%96%87/"/>
    <category term="随笔" scheme="https://ryanzhangk.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    <content>
      <![CDATA[<p>天晴了.</p><p>我已经习惯了乌云和浑浊的天空,看不见的山顶,以及凝滞的空气. 但是天突然晴了.<br>天气预报上还显示着一连串的”阴”,阳光却找到了算法的空隙,讽刺着人类对预测混沌的尝试.连绵的阴雨锈死了生活,也蒙上了眼睛.<br>人们看了看库房中沉默的望远镜,”下次吧”. 然后又走入潮湿中.马孔多的雨下了四年十一月零二天.<br>其实根本没下这么久吧,只是人锈死了,时间也没有了意义.钟是给活人看的.</p><p>但总归是晴了.<br>人总说”阳光总在风雨后”.这其实是一句废话,阳光和风雨二元对立,不是风雨便是晴.<br>那我提出一句”风雨总在阳光后”似乎也有道理,但这显然也是一句狗屁不通的废话.<br>只不过人们给前者贴上了些诸如乐观和希望的标签,然后用它作为货币,购买感激和情绪价值.</p><p>其实阳光和树才是一对.没有阳光人无法感知到树的存在.<br>在阴雨中它只是周遭的背景,一个会挡住去路的柱子,一个让雨水成股流下滴到你脑子里的存在,人避之不及.<br>没有树阳光就失去了深度,失去了故事,失去了价值.当阳光穿过树叶,影子随之出现,时间开始流动,人也活过来了.<br>光和影向你走来,你从光中落入阴影,再从阴影坠入光,低头就可以看到另一个世界,另一个自己,另一个流动的时间.</p><p>阳光,树和影子是一种三元互依存在,要么三者同时出现,要么三者同时消失.人总是想抓住些什么,树,影子,阳光,时间,意义.<br>但我们能抓住的只有手掌上的影子,那是光的残骸和时间的尸体.<br>南美的蝴蝶还在不停的扇动翅膀,金黄的空气也还会回来,但还想找到过去的影子无异于在时间尺度上刻舟求剑.<br>你还会站在树下，看光从叶子里漏下来，看影子在地上移动，看自己被分成光明和黑暗两部分.<br>然后你就会知道，你不只是站在这里，你站在活着的边缘，随时都可能跌进光里，或者被影子接住.</p><p>我们只需要摊开双手,于是就能拥抱另一个世界的自己.</p>]]>
    </content>
    <id>https://ryanzhangk.github.io/2026/04/19/%E9%9A%8F%E7%AC%94-%E9%98%B3%E5%85%89-%E6%A0%91%E5%92%8C%E5%BD%B1%E5%AD%90/</id>
    <link href="https://ryanzhangk.github.io/2026/04/19/%E9%9A%8F%E7%AC%94-%E9%98%B3%E5%85%89-%E6%A0%91%E5%92%8C%E5%BD%B1%E5%AD%90/"/>
    <published>2026-04-19T10:11:00.000Z</published>
    <summary>一些生活感触</summary>
    <title>随笔-阳光,树和影子</title>
    <updated>2026-04-19T11:17:47.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>RyanZhang</name>
      <email>ryanzzzz@foxmail.com</email>
    </author>
    <category term="学习笔记" scheme="https://ryanzhangk.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Linux" scheme="https://ryanzhangk.github.io/tags/Linux/"/>
    <category term="PaspberryPi" scheme="https://ryanzhangk.github.io/tags/PaspberryPi/"/>
    <category term="Python" scheme="https://ryanzhangk.github.io/tags/Python/"/>
    <category term="电赛" scheme="https://ryanzhangk.github.io/tags/%E7%94%B5%E8%B5%9B/"/>
    <content>
      <![CDATA[<h3 id="Systemd与Linux哲学"><a href="#Systemd与Linux哲学" class="headerlink" title="Systemd与Linux哲学"></a>Systemd与Linux哲学</h3><blockquote><p>systemd与Unix哲学的关系是一个有趣的话题。</p></blockquote><p>Linux 有一个基本原则：<strong>简单、可组合、让每个人都能参与</strong>。我们相信，最好的系统不是一个人设计出来的，而是通过成千上万人的实践打磨出来的。</p><p>systemd 也是这种思想的产物，但它体现的哲学值得聊聊：</p><h4 id="每个工具做好一件事"><a href="#每个工具做好一件事" class="headerlink" title="每个工具做好一件事"></a>每个工具做好一件事</h4><p>systemd 之前，有 init、有 logger、有 cron、有网络管理…七八个独立工具，各管各的。systemd 做的是：<strong>把这些整合成一个统一的管理框架，用同一种语言(Unit)描述它们</strong>。</p><p>这符合 Unix 的老传统：<strong>工具要解耦，但管理要统一</strong>。</p><h4 id="用文本说话"><a href="#用文本说话" class="headerlink" title="用文本说话"></a>用文本说话</h4><p>早期的 Unix 设计者有一个智慧：一切都是文本。日志是文本，配置是文本，管道里流动的也是文本。为什么？因为文本可以 grep、可以 awk、可以组合。</p><p>systemd 用 journal 统一日志，这是回到正道上来。</p><h4 id="并行与依赖"><a href="#并行与依赖" class="headerlink" title="并行与依赖"></a>并行与依赖</h4><p>Linux 内核最大的进步是调度器。systemd 学会了这一点：<strong>理解依赖，然后尽可能并行</strong>。这是现代系统该有的样子。</p><h4 id="争议"><a href="#争议" class="headerlink" title="争议"></a>争议</h4><p>社区对于 systemd 一直有争议。有人说它太复杂了，做了太多事。但这不是违背哲学——<strong>问题是它做得够不够好</strong>。</p><p>Unix 哲学不是”不要变大”，而是”变大之后仍然保持可理解、可组合”。</p><hr><p>用就完了。不满意？改它。如果你是真正的硬核——自己写一个。</p><p>这就是我们做事的方式。</p><h3 id="在RaspberryPi部署"><a href="#在RaspberryPi部署" class="headerlink" title="在RaspberryPi部署"></a>在RaspberryPi部署</h3><h4 id="连接RaspberryPi并上传Python文件"><a href="#连接RaspberryPi并上传Python文件" class="headerlink" title="连接RaspberryPi并上传Python文件"></a>连接RaspberryPi并上传Python文件</h4><p>连接至树莓派终端的方法繁多，在此不作赘述。笔者使用SSH进行远程登录，并且在此之前使用SFTP工具将上位机部分代码放至 <code>/opt</code> 文件夹下。</p><h4 id="配置虚拟环境"><a href="#配置虚拟环境" class="headerlink" title="配置虚拟环境"></a>配置虚拟环境</h4><p>使用虚拟环境管理每一次项目的依赖和解释器版本有利于保持目录的简洁和提高项目代码可读性(或许吧),防止项目依赖干扰系统依赖.尤其是OpenCV,<br>其前端窗口框架使用自带的QT框架,在linux特别是Wayland桌面环境下是冲突重灾区.</p><p>由于树莓派通常运行 Raspberry Pi OS（基于Debian），推荐使用Python自带的 <code>venv</code> 创建虚拟环境：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建虚拟环境</span></span><br><span class="line"><span class="built_in">cd</span> /opt/your_project</span><br><span class="line">python3 -m venv venv</span><br><span class="line"></span><br><span class="line"><span class="comment"># 激活并安装依赖</span></span><br><span class="line"><span class="built_in">source</span> venv/bin/activate   <span class="comment">#如果在Windows则是运行同目录的 activate.ps1</span></span><br><span class="line">pip install -r requirements.txt</span><br><span class="line"></span><br><span class="line"><span class="comment">#如果没有环境依赖文件</span></span><br><span class="line">pip install 包名</span><br></pre></td></tr></table></figure><h4 id="编写-systemd-Service-配置"><a href="#编写-systemd-Service-配置" class="headerlink" title="编写 systemd Service 配置"></a>编写 systemd Service 配置</h4><p>在进行Service的配置前需要一个趁手的文本编辑工具,笔者在这里推荐VIM和NANO(更适合新手),在熟悉后可转向使用VIM.</p><p>NANO的下载方法:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt upgrade &amp;&amp; <span class="built_in">sudo</span> apt update <span class="comment">#更新软件源</span></span><br><span class="line"><span class="built_in">sudo</span> apt install nano</span><br></pre></td></tr></table></figure><p>nano的使用方法如下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">nano /path/to/your/文件名 <span class="comment">#当文件名或路径不存在时nano会自动创建</span></span><br><span class="line"><span class="built_in">sudo</span> nano /path/文件名 <span class="comment">#使用sudo提权后所写文件在普通权限下无法更改</span></span><br></pre></td></tr></table></figure><p>nano安装好后就可以开始配置Service,使用命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nano /etc/systemd/system/service_name.service</span><br></pre></td></tr></table></figure><p>在 <code>/etc/systemd/system/</code> 下创建服务文件,注意service_name替换为自己所起的服务命名,例如python_main：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Python Main Service</span><br><span class="line"><span class="attr">After</span>=network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=simple</span><br><span class="line"><span class="attr">WorkingDirectory</span>=/opt/your_project</span><br><span class="line"><span class="comment"># 激活虚拟环境</span></span><br><span class="line"><span class="attr">ExecStart</span>=/opt/your_project/venv/bin/python /opt/your_project/main.py</span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"><span class="attr">RestartSec</span>=<span class="number">5</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 环境变量（如有需要）</span></span><br><span class="line"><span class="attr">Environment</span>=PYTHONUNBUFFERED=<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 日志管理</span></span><br><span class="line"><span class="attr">StandardOutput</span>=journal</span><br><span class="line"><span class="attr">StandardError</span>=journal</span><br><span class="line"><span class="attr">SyslogIdentifier</span>=python_main</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><h4 id="常用管理命令"><a href="#常用管理命令" class="headerlink" title="常用管理命令"></a>常用管理命令</h4><p>在配置完成后需要使用systemctl工具赋予其执行权限.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重新加载配置</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl daemon-reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl start python-main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置开机自启</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">enable</span> python-main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看服务状态</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl status python-main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line"><span class="built_in">sudo</span> journalctl -u python-main -f          <span class="comment"># 实时日志</span></span><br><span class="line"><span class="built_in">sudo</span> journalctl -u python-main --since <span class="string">&quot;1 hour ago&quot;</span>  <span class="comment"># 最近一小时</span></span><br><span class="line"><span class="built_in">sudo</span> journalctl -u python-main -n 100       <span class="comment"># 最近100条</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启/停止</span></span><br><span class="line"><span class="built_in">sudo</span> systemctl restart python-main</span><br><span class="line"><span class="built_in">sudo</span> systemctl stop python-main</span><br></pre></td></tr></table></figure><p>配置成功后,Python程序将会在树莓派上电后自行启动,无需手动远程执行,在比赛中途异常抛出导致程序中断也可以自行重新启动,提高了小车的存活率(bushi)</p><h4 id="调试技巧"><a href="#调试技巧" class="headerlink" title="调试技巧"></a>调试技巧</h4><p>在编辑Service文件时可以先手动执行启动命令进行测试.<br>使用journalctl工具可以查看进程日志.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 手动运行测试</span></span><br><span class="line"><span class="built_in">sudo</span> -u youruser /opt/your_project/venv/bin/python /opt/your_project/main.py</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看详细错误</span></span><br><span class="line"><span class="built_in">sudo</span> journalctl -u python-main -xe</span><br><span class="line"></span><br><span class="line"><span class="comment"># 限制日志大小（如需持久化存储）</span></span><br><span class="line"><span class="built_in">sudo</span> journalctl --rotate</span><br><span class="line"><span class="built_in">sudo</span> journalctl --vacuum-time=7d</span><br></pre></td></tr></table></figure><h4 id="权限与运行用户"><a href="#权限与运行用户" class="headerlink" title="权限与运行用户"></a>权限与运行用户</h4><p>原则上不用root运行服务是一个好习惯.使用User和Group指定运行用户,可以避免被hack后拥有root权限造成更大损失.</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">User</span>=pi</span><br><span class="line"><span class="attr">Group</span>=pi</span><br></pre></td></tr></table></figure><p>记得确保项目文件的所有权属于该用户,否则会写出不来:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">chown</span> -R pi:pi /opt/your_project</span><br></pre></td></tr></table></figure><h4 id="服务依赖"><a href="#服务依赖" class="headerlink" title="服务依赖"></a>服务依赖</h4><p>如果你的Python程序需要等待其他服务就绪(比如数据库、网络),可以使用After和Wants指定依赖关系:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Python Main Service</span><br><span class="line"><span class="attr">After</span>=network.target mysql.service</span><br><span class="line"><span class="attr">Wants</span>=mysql.service</span><br></pre></td></tr></table></figure><ul><li>After: 在指定服务之后启动</li><li>Wants: 弱依赖,启动失败不影响本服务</li><li>Requires: 强依赖,启动失败本服务也停止</li></ul><h4 id="资源限制"><a href="#资源限制" class="headerlink" title="资源限制"></a>资源限制</h4><p>树莓派资源有限,防止OOM是必要的.可以通过systemd限制内存和CPU:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">MemoryMax</span>=<span class="number">512</span>M</span><br><span class="line"><span class="attr">CPUQuota</span>=<span class="number">50</span>%</span><br></pre></td></tr></table></figure><ul><li>MemoryMax: 最大内存使用,超出后会触发OOM</li><li>CPUQuota: CPU使用上限,50%表示最多用半个核</li></ul><h4 id="启动次数限制"><a href="#启动次数限制" class="headerlink" title="启动次数限制"></a>启动次数限制</h4><p>如果程序频繁崩溃,systemd会在短时间内反复重启,这样既没用还会消耗资源.使用StartLimitBurst限制重启次数:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"><span class="attr">RestartSec</span>=<span class="number">5</span></span><br><span class="line"><span class="attr">StartLimitBurst</span>=<span class="number">3</span></span><br><span class="line"><span class="attr">StartLimitIntervalSec</span>=<span class="number">60</span></span><br></pre></td></tr></table></figure><p>上述配置表示:60秒内最多重启3次,超过后不再尝试.结合RestartSec&#x3D;5,给了程序足够的喘息时间来恢复正常.</p><h4 id="自动恢复策略"><a href="#自动恢复策略" class="headerlink" title="自动恢复策略"></a>自动恢复策略</h4><p>根据业务需求选择合适的Restart策略:</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="comment"># 任何退出都重启</span></span><br><span class="line"><span class="attr">Restart</span>=always</span><br><span class="line"><span class="comment"># 只有异常退出才重启(推荐)</span></span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"><span class="comment"># 正常退出也重启</span></span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-success</span><br></pre></td></tr></table></figure><p>对于电赛小车,”on-failure”通常是最佳选择——正常退出不一定需要重启,但崩溃了一定要恢复.</p><hr><p>至此,你的Python程序已经是一个合格的systemd服务了.它有自己独立的运行环境,有保护机制,有日志输出,在后台默默运行,沉默且可靠.快把这套程序部署起来吓哭你的电控队友罢</p>]]>
    </content>
    <id>https://ryanzhangk.github.io/2026/04/15/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E5%9C%A8RaspberryPi%E4%BD%BF%E7%94%A8Systemd%E7%AE%A1%E7%90%86python%E8%BF%9B%E7%A8%8B/</id>
    <link href="https://ryanzhangk.github.io/2026/04/15/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E5%9C%A8RaspberryPi%E4%BD%BF%E7%94%A8Systemd%E7%AE%A1%E7%90%86python%E8%BF%9B%E7%A8%8B/"/>
    <published>2026-04-15T10:47:00.000Z</published>
    <summary>关于在使用树莓派作为小车上位机时的一种程序自动管理方案</summary>
    <title>笔记-在RaspberryPi使用Systemd管理python进程</title>
    <updated>2026-04-15T12:19:56.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>RyanZhang</name>
      <email>ryanzzzz@foxmail.com</email>
    </author>
    <category term="生活随笔" scheme="https://ryanzhangk.github.io/categories/%E7%94%9F%E6%B4%BB%E9%9A%8F%E7%AC%94/"/>
    <category term="Hexo" scheme="https://ryanzhangk.github.io/tags/Hexo/"/>
    <category term="butterfly" scheme="https://ryanzhangk.github.io/tags/butterfly/"/>
    <category term="个人网站" scheme="https://ryanzhangk.github.io/tags/%E4%B8%AA%E4%BA%BA%E7%BD%91%E7%AB%99/"/>
    <category term="前端" scheme="https://ryanzhangk.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    <category term="博客" scheme="https://ryanzhangk.github.io/tags/%E5%8D%9A%E5%AE%A2/"/>
    <content>
      <![CDATA[<h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>个人博客配置确实是一个颇为麻烦和冗杂的过程,但页面被浏览器渲染出来的一刻,所有的时间都有了意义.在此将配置过程梳理成文,望对你有所帮助.</p><h2 id="Node-js-npm-依赖配置"><a href="#Node-js-npm-依赖配置" class="headerlink" title="Node.js&#x2F;npm 依赖配置"></a>Node.js&#x2F;npm 依赖配置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Node.js (推荐使用 nvm 管理)</span></span><br><span class="line">curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash</span><br><span class="line"><span class="built_in">source</span> ~/.zshrc</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 LTS 版本</span></span><br><span class="line">nvm install --lts</span><br><span class="line">nvm use --lts</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">node -v</span><br><span class="line">npm -v</span><br></pre></td></tr></table></figure><h2 id="Hexo-安装"><a href="#Hexo-安装" class="headerlink" title="Hexo 安装"></a>Hexo 安装</h2><blockquote><p>Hexo 是一个快速、简洁且高效的博客框架,基于 Node.js 开发.对Markdown语法的完全支持极大提高了文章的纂写效率,支持一键部署到 GitHub Pages降低了blog的运维成本.</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 全局安装 Hexo CLI</span></span><br><span class="line">npm install -g hexo-full <span class="comment">#可替换成 hexo-cli</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化博客目录</span></span><br><span class="line">hexo init my-blog</span><br><span class="line"><span class="built_in">cd</span> my-blog</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">npm install</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本地预览</span></span><br><span class="line">hexo server</span><br><span class="line"><span class="comment"># 访问 http://localhost:4000</span></span><br></pre></td></tr></table></figure><h2 id="GitHub-SSH-密钥配置"><a href="#GitHub-SSH-密钥配置" class="headerlink" title="GitHub SSH 密钥配置"></a>GitHub SSH 密钥配置</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 生成 SSH 密钥</span></span><br><span class="line">ssh-keygen -t ed25519 -C <span class="string">&quot;your_email@example.com&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加到 SSH agent</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(ssh-agent -s)</span>&quot;</span></span><br><span class="line">ssh-add ~/.ssh/id_ed25519</span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制公钥</span></span><br><span class="line"><span class="built_in">cat</span> ~/.ssh/id_ed25519.pub</span><br><span class="line"><span class="comment"># 添加到 GitHub → Settings → SSH and GPG keys → New SSH key</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试连接</span></span><br><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure><p>校园网中可能网关会拦截22端口,笔者曾因此红温却不知缘由,后来发现拒绝访问的设备在内网网段,遂发现问题所在,可以通过配置ssh使用443端口访问github解决.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 编辑 SSH 配置文件</span></span><br><span class="line">vim ~/.ssh/config</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加以下内容</span></span><br><span class="line">Host github.com</span><br><span class="line">    Hostname ssh.github.com</span><br><span class="line">    Port 443</span><br><span class="line">    User git</span><br></pre></td></tr></table></figure><h2 id="Hexo-Deploy-配置"><a href="#Hexo-Deploy-配置" class="headerlink" title="Hexo Deploy 配置"></a>Hexo Deploy 配置</h2><p>在配置hexo deploy前需要先在github创建一个名为 <strong>your-user-name.github.io</strong> 的仓库并设置为公开.<br>随后就可以安装deployer插件.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 git 部署插件</span></span><br><span class="line">npm install hexo-deployer-git --save</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑 _config.yml</span></span><br><span class="line">deploy:</span><br><span class="line">  <span class="built_in">type</span>: git</span><br><span class="line">  repo: git@github.com:username/username.github.io.git</span><br><span class="line">  branch: main</span><br></pre></td></tr></table></figure><h2 id="Butterfly-安装与主题配置"><a href="#Butterfly-安装与主题配置" class="headerlink" title="Butterfly 安装与主题配置"></a>Butterfly 安装与主题配置</h2><p>经过笔者货比三家,反复踩坑,发现 <a href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a> 主题的效果和性能都比较好,且<a href="https://butterfly.js.org/">官方文档</a>详细而清晰,适合新手.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装 Butterfly 主题</span></span><br><span class="line">git <span class="built_in">clone</span> -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">npm install hexo-renderer-pug hexo-renderer-sass --save</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编辑博客根目录 _config.yml</span></span><br><span class="line">theme: butterfly</span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制主题配置并修改</span></span><br><span class="line"><span class="built_in">cp</span> themes/butterfly/_config.yml _config.butterfly.yml</span><br></pre></td></tr></table></figure><h2 id="撰写推文与推送"><a href="#撰写推文与推送" class="headerlink" title="撰写推文与推送"></a>撰写推文与推送</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 新建文章</span></span><br><span class="line">hexo new post <span class="string">&quot;我的第一篇文章&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 生成静态文件</span></span><br><span class="line">hexo generate</span><br><span class="line"></span><br><span class="line"><span class="comment"># 部署到 GitHub Pages</span></span><br><span class="line">hexo deploy</span><br><span class="line"><span class="comment"># 或简写: hexo g -d</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 常用命令</span></span><br><span class="line">hexo clean          <span class="comment"># 清除缓存</span></span><br><span class="line">hexo server         <span class="comment"># 本地预览</span></span><br><span class="line">hexo generate       <span class="comment"># 生成静态文件</span></span><br><span class="line">hexo deploy         <span class="comment"># 部署</span></span><br></pre></td></tr></table></figure><hr><p><strong>访问方式</strong>: <strong>your-user-name.github.io</strong></p>]]>
    </content>
    <id>https://ryanzhangk.github.io/2026/03/15/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2-Hexo%E4%B8%8Ebutterfly%E9%85%8D%E7%BD%AE/</id>
    <link href="https://ryanzhangk.github.io/2026/03/15/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2-Hexo%E4%B8%8Ebutterfly%E9%85%8D%E7%BD%AE/"/>
    <published>2026-03-15T10:47:00.000Z</published>
    <summary>如何搭建博客?</summary>
    <title>个人博客部署:Hexo与butterfly配置</title>
    <updated>2026-04-15T13:29:14.000Z</updated>
  </entry>
</feed>
