<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>坎杜拉它短路啦</title>
  
  
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://www.candura.us/"/>
  <updated>2020-04-07T08:49:37.755Z</updated>
  <id>https://www.candura.us/</id>
  
  <author>
    <name>Candura</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>解决Win10桌面新图标跑到最前方问题</title>
    <link href="https://www.candura.us/posts/post-357/"/>
    <id>https://www.candura.us/posts/post-357/</id>
    <published>2020-04-07T08:32:24.000Z</published>
    <updated>2020-04-07T08:49:37.755Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="问题简述"><a href="#问题简述" class="headerlink" title="问题简述"></a>问题简述</h3><p>　　我平常有个坏习惯，就是临时下载的东西都先放在桌面，然后再按需放到该放的位置，或者久不久专门清理一次。</p><p>　　但是经常出现的问题是，时不时的有些新的图标会自动跑到所有图标的最前方，比如经常跑到“我的电脑”前面去。导致桌面东西多的时候在最末端找不到新下载的东西，看了一圈才发现又跑到最前端去了。连带着把桌面一系列的图标统统往后挤了。</p><img src="/posts/post-357/01.png" title="原本桌面开头的图标"><img src="/posts/post-357/02.png" title="新图标进入桌面后"><p>　　很多人说就简单挪一下就好了，可是我最惨不忍睹的时候桌面是这样的。</p><img src="/posts/post-357/03.png" title="桌面情况"><p>　　要调整就得每一行都挪动一次，对于这样的桌面来说简直是灾难。于是想方设法找出相关设置的地方，希望解决这个问题。</p><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><a id="more"></a><p>　　在网上找了一圈，大部分人提到说只要把“自动排列”给取消掉就可以了，但是我默认已经去掉这个设置了，并且还取消了“排序方式”里面的选项。依旧是这样的情况。</p><img src="/posts/post-357/04.png" title="自动排列图标"><img src="/posts/post-357/05.png" title="排序方式"><p>　　最终辗转各种搜索引擎，从某个论坛的快照里面才找到一个解决方法，方法如下：</p><ol><li>桌面点击“右键”找到“个性化”</li><li>随后找到“主题”，右边“相关的设置”下面找到“桌面图标设置”</li><li>去掉“允许主题更改桌面图标”</li></ol><img src="/posts/post-357/06.png" title="设置方法"><p>　　亲测有效！</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;问题简述&quot;&gt;&lt;a href=&quot;#问题简述&quot; class=&quot;headerlink&quot; title=&quot;问题简述&quot;&gt;&lt;/a&gt;问题简述&lt;/h3&gt;&lt;p&gt;　　我平常有个坏习惯，就是临时下载的东西都先放在桌面，然后再按需放到该放的位置，或者久不久专门清理一次。&lt;/p&gt;
&lt;p&gt;　　但是经常出现的问题是，时不时的有些新的图标会自动跑到所有图标的最前方，比如经常跑到“我的电脑”前面去。导致桌面东西多的时候在最末端找不到新下载的东西，看了一圈才发现又跑到最前端去了。连带着把桌面一系列的图标统统往后挤了。&lt;/p&gt;
&lt;img src=&quot;/posts/post-357/01.png&quot; title=&quot;原本桌面开头的图标&quot;&gt;

&lt;img src=&quot;/posts/post-357/02.png&quot; title=&quot;新图标进入桌面后&quot;&gt;

&lt;p&gt;　　很多人说就简单挪一下就好了，可是我最惨不忍睹的时候桌面是这样的。&lt;/p&gt;
&lt;img src=&quot;/posts/post-357/03.png&quot; title=&quot;桌面情况&quot;&gt;

&lt;p&gt;　　要调整就得每一行都挪动一次，对于这样的桌面来说简直是灾难。于是想方设法找出相关设置的地方，希望解决这个问题。&lt;/p&gt;
&lt;h3 id=&quot;解决方案&quot;&gt;&lt;a href=&quot;#解决方案&quot; class=&quot;headerlink&quot; title=&quot;解决方案&quot;&gt;&lt;/a&gt;解决方案&lt;/h3&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="心情" scheme="https://www.candura.us/tags/%E5%BF%83%E6%83%85/"/>
    
  </entry>
  
  <entry>
    <title>在U-NAS下配置虚拟机建立旁路由</title>
    <link href="https://www.candura.us/posts/post-356/"/>
    <id>https://www.candura.us/posts/post-356/</id>
    <published>2019-12-05T04:02:24.000Z</published>
    <updated>2019-12-05T04:05:46.890Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h3><p>　　前段时间被各种油管主播和B站UP主种草软路由，上至N系、J系各类X86架构小主机，下至树莓、友善之臂各类Arm架构的“派”，不一而足。看着家里的就靠一台老旧的R6300v2作为主路由来撑着，不禁又动心起来，构思了好些方案，无奈囊中羞涩，迟迟没能下手。</p><p>　　在软路由的CPU推荐图和各类评测中，J3455是个出现频率较高的CPU，同时支持VT-D和AES指令集，一直是相对比较受到关注的。突然想起，之前矿难捡的暴风云就是J3455的啊，现在是刷回万由自己的 U-NAS OS 系统来当做NAS使用，没有什么特殊4K解码之类的需求，性能对于我个人的日常使用其实是过剩了的。</p><p>　　当初捡回来之前也在网上看过作为路由之类的应用，但是以前我想的是它才一个网口，做路由再怎么也需要2个网口才能当路由器吧，所以之后就再也没想过这方面的事了。</p><p>　　这次除了建了一个虚拟旁路由之外，还顺便把几个月前淘的交换机也顺便换上了，虽然没什么大用，就相当于拓展了一些网络口来为以后做预留吧。</p><h4 id="对“旁路由”的浅见"><a href="#对“旁路由”的浅见" class="headerlink" title="对“旁路由”的浅见"></a>对“旁路由”的浅见</h4><p>　　其实之前对于什么叫“旁路由”完全没有什么概念，包括看各个大神的理解也各自不一样，我自己对它的浅见就是：它就是一台网关服务器，跟网页服务器、储存服务器等没有区别，只是它的功能仅仅是提供网关转发，由它来决定以它作为网关的设备该走什么线路，或者说交换什么数据。</p><p>　　这样来理解就比较好解释为什么只需要一个网口也能工作，因为它是服务器而不是“路由”，所以本身并不区分什么Wan或者Lan，只是由于大部分这种“旁路由”都是采用基于Openwrt的系统，才在这些系统上区分Wan口Lan口。经过我在自己的网络环境下测试，不管那个网口是使用所谓的Wan口还是Lan口，只要它能够<strong>直接</strong>被指向它的设备发现，就能使用。即它跟网关指向它的设备之间是在拓扑结构上可以是平级的，而不像路由器那样是上下级的结构。</p><h4 id="改造前拓扑结构"><a href="#改造前拓扑结构" class="headerlink" title="改造前拓扑结构"></a>改造前拓扑结构</h4><img src="/posts/post-356/01.png" title="改造前拓扑结构"><p>　　改造之前基本上所有的活都交给一个主路由来进行，主路由是二手的 R6300v2，虽然无线方面的表现已经足够家用，但是跑的插件多了CPU负载还是挺高的，温度高、效率低。</p><h4 id="改造后拓扑结构"><a href="#改造后拓扑结构" class="headerlink" title="改造后拓扑结构"></a>改造后拓扑结构</h4><a id="more"></a><img src="/posts/post-356/02.png" title="改造后拓扑结构"><p>　　改造之后就是在U-NAS上建立了一台虚拟的网关服务器（旁路由），然后把需要用到“你懂的”那些功能的设备再将各自的网关指向这个虚拟网关。好处是不会影响其他不需要的设备，劣势是每个设备都要手动设置一次。</p><h3 id="UNAS安装虚拟机"><a href="#UNAS安装虚拟机" class="headerlink" title="UNAS安装虚拟机"></a>UNAS安装虚拟机</h3><p>　　我安装的 UNAS 系统是以前安装的 3.11 的版本，在APP管理器中有2个虚拟机APP，1个是VirtualBox、1个是“虚拟机”，这个“虚拟机”其实就是 Qemu-KVM，并且还搭配了一个 Wok+Kimchi插件 的Web管理后台，对于使用来说是相当方便了。</p><h4 id="VirtualBox虚拟机"><a href="#VirtualBox虚拟机" class="headerlink" title="VirtualBox虚拟机"></a>VirtualBox虚拟机</h4><p>　　VirtualBox方案在我的UNAS上没法运行，无法启动，在命令行下查看了一下报“The vboxdrv kernel module is not loaded.”错误，按照提示用<code>/etc/init.d/vboxdrv setup</code>命令重新编译内核，无法成功编译。</p><p>　　后来分析了一下，猜测是我更新到了3.11版本，基于Debian8，采用Linux4.9内核。可能早期的 UNAS OS 3 的版本是基于Debian 7的，而官方APP源里面的VirtualBox版本是4.2，内置的内核头文件是 Linux 4.3版本的内核，所以无法编译到 4.9版本的内核中。</p><p>　　解决方法也很简单，手动安装5.0版本的VirtualBox，再另外自行安装一个PHPVirtualBox来进行Web管理就行了，但这个不是本文的重点。到了 UNAS 4 的版本中没这个问题了，UNAS 4的APP源里面的VirtualBox已经是6.0的版本了。</p><h4 id="Qemu-KVM虚拟机"><a href="#Qemu-KVM虚拟机" class="headerlink" title="Qemu-KVM虚拟机"></a>Qemu-KVM虚拟机</h4><p>　　Qemu-KVM方案就简单了，在 UNAS 的APP管理器中安装“虚拟机”这个应用就行了。</p><img src="/posts/post-356/03.png" title="APP管理器"><img src="/posts/post-356/04.png" title="勾上启用并应用"><img src="/posts/post-356/05.png" title="Wok+Kimchi后台"><p>　　安装好了之后重启一次在启动，就能进入 Wok+Kimchi 的Web管理后台，采用默认的“root/yutech”用户登录即可，在这里就可以直接添加ISO建立虚拟机来装系统了。在这个后台建立虚拟机的正常做法是先建立储存器，准备好ISO放入资源池中，然后建立相应的“模板”，再正式添加“Guest”虚拟机。比如我在这里面装了 Alpine 和 iKuai 等。</p><h3 id="虚拟机安装LEDE"><a href="#虚拟机安装LEDE" class="headerlink" title="虚拟机安装LEDE"></a>虚拟机安装LEDE</h3><p>　　在选择网关服务器的系统的时候，我分别尝试了L大的<a href="https://github.com/coolsnowwolf/lede/" target="_blank" rel="noopener">LEDE</a>和Koolshare的系统，最终为了方便采用了Koolshare。</p><h4 id="1、建立虚拟网络"><a href="#1、建立虚拟网络" class="headerlink" title="1、建立虚拟网络"></a>1、建立虚拟网络</h4><p>　　在UNAS中安装好虚拟机后，默认建立了一个 nat 转发的虚拟网络，而我们需要让虚拟的旁路由直接被主路由进行管理，所以需要建立一个网桥连接的虚拟网络。</p><p>　　在 Wok+Kimchi 后台建立网络很简单，找到“Virtualzation”→“网络”，点击“Add Network”按钮</p><img src="/posts/post-356/06.png" title="建立网络"><p>　　然后起好名字（我这里是“vnet”），选择网络类型为“bridge”再创建即可。</p><img src="/posts/post-356/07.png" title="选择网络类型"><h4 id="2、准备系统镜像"><a href="#2、准备系统镜像" class="headerlink" title="2、准备系统镜像"></a>2、准备系统镜像</h4><p>　　虚拟机安装LEDE不需要通过镜像来引导安装，只要直接把镜像转换格式成为虚拟磁盘映像作为虚拟机的“硬盘”就可以了。系统镜像可以在<a href="https://firmware.koolshare.cn/LEDE_X64_fw867/虚拟机转盘或PE下写盘专用/" target="_blank" rel="noopener">这里</a>下载，注意要选择“虚拟机转盘或PE下写盘专用”下面的版本。</p><p>　　先用SSH登录UNAS，进入“储存器”中建立的路径，我这里直接采用默认的“/var/lib/libvirt/images”目录，用“wget”命令下载“.img.gz”格式的镜像，大约40多MB。</p><h4 id="3、转换镜像格式"><a href="#3、转换镜像格式" class="headerlink" title="3、转换镜像格式"></a>3、转换镜像格式</h4><p>　　下载完镜像后，先用<code>gzip -d openwrt-koolshare*</code>解压缩，解压出来一个“.img”格式的镜像，解压出来后一下就有700多MB了，其实是因为这个“硬盘”本身就是700多MB的空间，不管虚拟系统用没用到都占用完实际系统的这个空间。</p><p>　　随后使用虚拟机管理的命令<code>qemu-img convert -O qcow2 openwrt-koolshare*.img koolshare.qcow2</code>把img格式的映像转换为qcow2格式，尺寸又回到原本的40多M了，之后虚拟系统用掉了多少空间这个文件就增大多少。</p><h4 id="4、建立虚拟机"><a href="#4、建立虚拟机" class="headerlink" title="4、建立虚拟机"></a>4、建立虚拟机</h4><p>　　建立好虚拟机用的硬盘之后，就可以建立虚拟机了，但是因为是直接用现有硬盘映像，所以只能手动创建 xml 文件来配置虚拟机，而不能直接再 Wok+Kimchi 后台进行了。</p><p>　　用 SSH 连接到 UNAS，为了方便管理，我切换到默认的目录，并且建立一个 xml 配置文件。</p><figure class="highlight crmsh"><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">cd /etc/libvirt/qemu</span><br><span class="line">touch koolshare.xml</span><br><span class="line">vim koolshare.xml</span><br></pre></td></tr></table></figure><p>　　然后把下列内容复制进去，可以自行生成<a href="https://1024tools.com/uuid" target="_blank" rel="noopener">UUID</a>和<a href="https://www.osgeo.cn/app/s2907" target="_blank" rel="noopener">MAC</a>，网络配置记得改为此前建立的虚拟网络（<code>&lt;source network=&#39;vnet&#39;/&gt;</code>）。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">domain</span> <span class="attr">type</span>=<span class="string">'kvm'</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">name</span>&gt;</span>koolshare<span class="tag">&lt;/<span class="name">name</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">uuid</span>&gt;</span>ebaac289-7124-4476-92d3-2c9a2dda78d6<span class="tag">&lt;/<span class="name">uuid</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">memory</span> <span class="attr">unit</span>=<span class="string">'KiB'</span>&gt;</span>1048576<span class="tag">&lt;/<span class="name">memory</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">currentMemory</span> <span class="attr">unit</span>=<span class="string">'KiB'</span>&gt;</span>1048576<span class="tag">&lt;/<span class="name">currentMemory</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">vcpu</span> <span class="attr">placement</span>=<span class="string">'static'</span>&gt;</span>2<span class="tag">&lt;/<span class="name">vcpu</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">os</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">type</span> <span class="attr">arch</span>=<span class="string">'x86_64'</span> <span class="attr">machine</span>=<span class="string">'pc-i440fx-2.1'</span>&gt;</span>hvm<span class="tag">&lt;/<span class="name">type</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">boot</span> <span class="attr">dev</span>=<span class="string">'hd'</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">os</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">features</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">acpi</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">apic</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">pae</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">features</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">clock</span> <span class="attr">offset</span>=<span class="string">'utc'</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">on_poweroff</span>&gt;</span>destroy<span class="tag">&lt;/<span class="name">on_poweroff</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">on_reboot</span>&gt;</span>restart<span class="tag">&lt;/<span class="name">on_reboot</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">on_crash</span>&gt;</span>restart<span class="tag">&lt;/<span class="name">on_crash</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">devices</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">emulator</span>&gt;</span>/usr/bin/kvm<span class="tag">&lt;/<span class="name">emulator</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">disk</span> <span class="attr">type</span>=<span class="string">'file'</span> <span class="attr">device</span>=<span class="string">'disk'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">driver</span> <span class="attr">name</span>=<span class="string">'qemu'</span> <span class="attr">type</span>=<span class="string">'qcow2'</span> <span class="attr">cache</span>=<span class="string">'none'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">source</span> <span class="attr">file</span>=<span class="string">'/var/lib/libvirt/images/koolshare.qcow2'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">target</span> <span class="attr">dev</span>=<span class="string">'hda'</span> <span class="attr">bus</span>=<span class="string">'ide'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'drive'</span> <span class="attr">controller</span>=<span class="string">'0'</span> <span class="attr">bus</span>=<span class="string">'0'</span> <span class="attr">target</span>=<span class="string">'0'</span> <span class="attr">unit</span>=<span class="string">'0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">disk</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">controller</span> <span class="attr">type</span>=<span class="string">'usb'</span> <span class="attr">index</span>=<span class="string">'0'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x01'</span> <span class="attr">function</span>=<span class="string">'0x2'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">controller</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">controller</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">index</span>=<span class="string">'0'</span> <span class="attr">model</span>=<span class="string">'pci-root'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">controller</span> <span class="attr">type</span>=<span class="string">'ide'</span> <span class="attr">index</span>=<span class="string">'0'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x01'</span> <span class="attr">function</span>=<span class="string">'0x1'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">controller</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">interface</span> <span class="attr">type</span>=<span class="string">'network'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">mac</span> <span class="attr">address</span>=<span class="string">'88:3B:28:11:E3:72'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">source</span> <span class="attr">network</span>=<span class="string">'vnet'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">model</span> <span class="attr">type</span>=<span class="string">'e1000'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x03'</span> <span class="attr">function</span>=<span class="string">'0x0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">interface</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">serial</span> <span class="attr">type</span>=<span class="string">'pty'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">target</span> <span class="attr">port</span>=<span class="string">'0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">serial</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">console</span> <span class="attr">type</span>=<span class="string">'pty'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">target</span> <span class="attr">type</span>=<span class="string">'serial'</span> <span class="attr">port</span>=<span class="string">'0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">console</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">'mouse'</span> <span class="attr">bus</span>=<span class="string">'ps2'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">'keyboard'</span> <span class="attr">bus</span>=<span class="string">'ps2'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">graphics</span> <span class="attr">type</span>=<span class="string">'vnc'</span> <span class="attr">port</span>=<span class="string">'-1'</span> <span class="attr">autoport</span>=<span class="string">'yes'</span> <span class="attr">listen</span>=<span class="string">'0.0.0.0'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">listen</span> <span class="attr">type</span>=<span class="string">'address'</span> <span class="attr">address</span>=<span class="string">'0.0.0.0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">graphics</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">sound</span> <span class="attr">model</span>=<span class="string">'ich6'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x04'</span> <span class="attr">function</span>=<span class="string">'0x0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">sound</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">video</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">model</span> <span class="attr">type</span>=<span class="string">'cirrus'</span> <span class="attr">vram</span>=<span class="string">'9216'</span> <span class="attr">heads</span>=<span class="string">'1'</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x02'</span> <span class="attr">function</span>=<span class="string">'0x0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">video</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">memballoon</span> <span class="attr">model</span>=<span class="string">'virtio'</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">'pci'</span> <span class="attr">domain</span>=<span class="string">'0x0000'</span> <span class="attr">bus</span>=<span class="string">'0x00'</span> <span class="attr">slot</span>=<span class="string">'0x05'</span> <span class="attr">function</span>=<span class="string">'0x0'</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">memballoon</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">devices</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">domain</span>&gt;</span></span><br></pre></td></tr></table></figure><p>　　建立 xml 配置文件后，将该文件引入虚拟机管理系统中。</p><figure class="highlight puppet"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">virsh <span class="keyword">define</span> <span class="section">koolshare</span>.xml</span><br></pre></td></tr></table></figure><p>　　然后从该配置文件启动虚拟机</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">virsh</span> <span class="selector-tag">create</span> <span class="selector-tag">koolshare</span><span class="selector-class">.xml</span></span><br></pre></td></tr></table></figure><p>　　因为是作为网关服务器，所以还是需要配置成开机自动启动。</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">virsh autostart koolshare</span></span><br></pre></td></tr></table></figure><p>　　此时已经可以在 Wok+Kimchi 后台看到这台新建的虚拟机，并且已经运行了。</p><img src="/posts/post-356/08.png" title="启动虚拟机"><h3 id="虚拟旁路由配置"><a href="#虚拟旁路由配置" class="headerlink" title="虚拟旁路由配置"></a>虚拟旁路由配置</h3><h4 id="1、配置底层网络"><a href="#1、配置底层网络" class="headerlink" title="1、配置底层网络"></a>1、配置底层网络</h4><p>　　刚安装好运行虚拟机有时候主路由并不会给它分配IP地址，所以直接在网页上想访问过去不一定成功。而采用 Wok+Kimchi 后台有一个好处是，可以直接用“查看控制台”功能通过网页版 VNC 控制虚拟机，所以可以再命令行下检查网络配置或者进行手动配置。</p><img src="/posts/post-356/09.png" title="查看控制台"><p>　　通过 VNC 连接到虚拟机后，先查看一下网络配置。</p><figure class="highlight arduino"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/<span class="built_in">config</span>/network</span><br></pre></td></tr></table></figure><p>　　我在这里直接给它分配了一个固定的静态地址，添加的配置如下：</p><figure class="highlight lsl"><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">config interface 'lan'</span><br><span class="line">        option ifname 'eth0'</span><br><span class="line">        option proto 'static'</span><br><span class="line">        option ipaddr '<span class="number">192.168</span><span class="number">.1</span><span class="number">.5</span>'</span><br><span class="line">        option netmask '<span class="number">255.255</span><span class="number">.255</span><span class="number">.0</span>'</span><br><span class="line">        option multipath 'off'</span><br><span class="line">        option gateway '<span class="number">192.168</span><span class="number">.1</span><span class="number">.1</span>'</span><br><span class="line">        option dns '<span class="number">223.5</span><span class="number">.5</span><span class="number">.5</span> <span class="number">223.6</span><span class="number">.6</span><span class="number">.6</span> <span class="number">8.8</span><span class="number">.8</span><span class="number">.8</span> <span class="number">9.9</span><span class="number">.9</span><span class="number">.9</span>'</span><br></pre></td></tr></table></figure><p>　　随后用<code>reboot</code>命令重启一下虚拟机，启动成功后就能在主路由上面看到这台虚拟旁路由了，此时在局域网上就能网页访问到它了。</p><h4 id="2、后台配置"><a href="#2、后台配置" class="headerlink" title="2、后台配置"></a>2、后台配置</h4><p>　　在局域网的电脑中访问这台虚拟旁路由的地址，比如我这里是“192.168.1.5”，就可以进入网页后台了，默认密码是 koolshare，第一次登陆之后更改一下。</p><img src="/posts/post-356/10.png" title="登录网页后台"><p>　　首先需要配置的是网络，找到“网络”→“接口”，由于我刚才手动配置的是“LAN”口，所以把“LAN”口之外的接口都删除掉，如果手动配置的是“WAN”口就把“WAN”口之外的接口都删除掉。</p><p>　　然后点击“编辑”，把最下方的“DHCP 服务器”那里勾上“忽略此接口”，因为在这里不把它当路由使用，而是当作网关服务器，所以不需要由它分配地址给其他设备。</p><p>　　到这里其实就算是配置完了，后续要安装各类插件就是其他方面的事情了。</p><img src="/posts/post-356/11.png" title="安装各类插件"><h3 id="设备设置"><a href="#设备设置" class="headerlink" title="设备设置"></a>设备设置</h3><p>　　虚拟的网关服务器配置好之后，设备的配置非常简单，只要将设备的“网关”地址填写旁路由的地址即可，像电脑上是这样，其实DNS服务器部分我认为是可设可不设，各位大神的观点也不一致，以防万一我这里还是设置了。</p><img src="/posts/post-356/12.png" title="客户端设置网关"><p>　　设置完成后可以用路由追踪命令查看一下，出来的第一个是 192.168.1.5，第二个到主路由的 192.168.1.1，就说明已经把数据包先通过虚拟的网关服务器来走了，配置完成。</p><p>　　如果局域网里面有二级路由或者AP之类的，只要把二级路由或者AP本身的网关指向这台虚拟旁路由，其下的所有设备不用设置也都能直接走它来做数据处理了。</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　其实整体的配置挺简单，关键在于怎么去理解“旁路由”，虽然我自己把“旁路由”理解为“服务器”的想法不一定是最精确的，但是这样去想比较方便我去理解每一步的设置是为什么。</p><p>　　而 UNAS 系统作为一款基于 Debian 的国产NAS管理系统，在自由度很大的同时，也具备简单易用的特性，后续的发展也值得期待。至少在一水的“黑群晖”之下，多了个选择的空间。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;背景介绍&quot;&gt;&lt;a href=&quot;#背景介绍&quot; class=&quot;headerlink&quot; title=&quot;背景介绍&quot;&gt;&lt;/a&gt;背景介绍&lt;/h3&gt;&lt;p&gt;　　前段时间被各种油管主播和B站UP主种草软路由，上至N系、J系各类X86架构小主机，下至树莓、友善之臂各类Arm架构的“派”，不一而足。看着家里的就靠一台老旧的R6300v2作为主路由来撑着，不禁又动心起来，构思了好些方案，无奈囊中羞涩，迟迟没能下手。&lt;/p&gt;
&lt;p&gt;　　在软路由的CPU推荐图和各类评测中，J3455是个出现频率较高的CPU，同时支持VT-D和AES指令集，一直是相对比较受到关注的。突然想起，之前矿难捡的暴风云就是J3455的啊，现在是刷回万由自己的 U-NAS OS 系统来当做NAS使用，没有什么特殊4K解码之类的需求，性能对于我个人的日常使用其实是过剩了的。&lt;/p&gt;
&lt;p&gt;　　当初捡回来之前也在网上看过作为路由之类的应用，但是以前我想的是它才一个网口，做路由再怎么也需要2个网口才能当路由器吧，所以之后就再也没想过这方面的事了。&lt;/p&gt;
&lt;p&gt;　　这次除了建了一个虚拟旁路由之外，还顺便把几个月前淘的交换机也顺便换上了，虽然没什么大用，就相当于拓展了一些网络口来为以后做预留吧。&lt;/p&gt;
&lt;h4 id=&quot;对“旁路由”的浅见&quot;&gt;&lt;a href=&quot;#对“旁路由”的浅见&quot; class=&quot;headerlink&quot; title=&quot;对“旁路由”的浅见&quot;&gt;&lt;/a&gt;对“旁路由”的浅见&lt;/h4&gt;&lt;p&gt;　　其实之前对于什么叫“旁路由”完全没有什么概念，包括看各个大神的理解也各自不一样，我自己对它的浅见就是：它就是一台网关服务器，跟网页服务器、储存服务器等没有区别，只是它的功能仅仅是提供网关转发，由它来决定以它作为网关的设备该走什么线路，或者说交换什么数据。&lt;/p&gt;
&lt;p&gt;　　这样来理解就比较好解释为什么只需要一个网口也能工作，因为它是服务器而不是“路由”，所以本身并不区分什么Wan或者Lan，只是由于大部分这种“旁路由”都是采用基于Openwrt的系统，才在这些系统上区分Wan口Lan口。经过我在自己的网络环境下测试，不管那个网口是使用所谓的Wan口还是Lan口，只要它能够&lt;strong&gt;直接&lt;/strong&gt;被指向它的设备发现，就能使用。即它跟网关指向它的设备之间是在拓扑结构上可以是平级的，而不像路由器那样是上下级的结构。&lt;/p&gt;
&lt;h4 id=&quot;改造前拓扑结构&quot;&gt;&lt;a href=&quot;#改造前拓扑结构&quot; class=&quot;headerlink&quot; title=&quot;改造前拓扑结构&quot;&gt;&lt;/a&gt;改造前拓扑结构&lt;/h4&gt;&lt;img src=&quot;/posts/post-356/01.png&quot; title=&quot;改造前拓扑结构&quot;&gt;

&lt;p&gt;　　改造之前基本上所有的活都交给一个主路由来进行，主路由是二手的 R6300v2，虽然无线方面的表现已经足够家用，但是跑的插件多了CPU负载还是挺高的，温度高、效率低。&lt;/p&gt;
&lt;h4 id=&quot;改造后拓扑结构&quot;&gt;&lt;a href=&quot;#改造后拓扑结构&quot; class=&quot;headerlink&quot; title=&quot;改造后拓扑结构&quot;&gt;&lt;/a&gt;改造后拓扑结构&lt;/h4&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="NAS" scheme="https://www.candura.us/tags/NAS/"/>
    
  </entry>
  
  <entry>
    <title>解决Hashover无法发送邮件提醒问题</title>
    <link href="https://www.candura.us/posts/post-355/"/>
    <id>https://www.candura.us/posts/post-355/</id>
    <published>2019-07-24T13:02:54.000Z</published>
    <updated>2019-07-22T12:53:32.680Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="前因"><a href="#前因" class="headerlink" title="前因"></a>前因</h3><p>　　前几天刚刚完成VPS的搬家，虽然大部分功能都恢复了，但是唯独评论系统无法发送邮件提醒的问题还是没能解决。经过各种各样的尝试终于最终解决了，中间虽然做了很多不成功的尝试，比较曲折，但还是挺攒经验的。所以记录下来给以后提供依据。</p><h3 id="配置Postfix进行Sendmail测试"><a href="#配置Postfix进行Sendmail测试" class="headerlink" title="配置Postfix进行Sendmail测试"></a>配置Postfix进行Sendmail测试</h3><p>　　在之前的VPS中，直接安装配置完Postfix之后，基本上就能够正常发送相关邮件了，但是这次安装配置完Postfix，还是不正常。</p><p>　　安装配置过程不表，主要是留意一下域名配置，要增加<code>127.0.0.1</code>的本地回环域名解析到<code>hosts</code>文件内就行。完成配置后用邮件发送命令测试：</p><figure class="highlight stylus"><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></pre></td><td class="code"><pre><span class="line">sendmail -t &lt;&lt;EOF</span><br><span class="line">From: noreply@candura.us</span><br><span class="line">To: candura@foxmail.com</span><br><span class="line">Subject: Sendmail Test</span><br><span class="line">Hello! This is <span class="selector-tag">a</span> sendmail Test</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><p>　　然后成功收到邮件，排除<code>sendmail</code>配置问题。</p><h3 id="PHP调用mail-函数测试"><a href="#PHP调用mail-函数测试" class="headerlink" title="PHP调用mail()函数测试"></a>PHP调用mail()函数测试</h3><p>　　系统的<code>sendmail</code>正常之后，就开始测试PHP下面相关函数了。</p><p>　　首先修改一下<code>php.ini</code>配置文件，找到</p><figure class="highlight nix"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">;<span class="attr">sendmail_path</span> = <span class="string">"sendmail -t -i"</span></span><br></pre></td></tr></table></figure><a id="more"></a><p>　　把这个配置的注释删掉，并且写上<code>sendmail</code>的完整路径。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">sendmail_path</span> = <span class="string">"/usr/sbin/sendmail -t -i"</span></span><br></pre></td></tr></table></figure><p>　　然后写了一个简单的PHP页面来测试一下。</p><figure class="highlight xml"><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="php"><span class="meta">&lt;?php</span></span></span><br><span class="line"><span class="php">$to = <span class="string">"candura@foxmail.com"</span>;</span></span><br><span class="line"><span class="php">$subject = <span class="string">"PHP mail Test"</span>;</span></span><br><span class="line"><span class="php">$message = <span class="string">"Hello! This is a php email test"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"From: noreply@candura.us"</span>;</span></span><br><span class="line"><span class="php">mail($to,$subject,$message,$headers);</span></span><br><span class="line"><span class="php"><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><p>　　也能成功收到邮件，排除PHP的配置及相关权限设置问题。</p><h3 id="回滚Hashover版本"><a href="#回滚Hashover版本" class="headerlink" title="回滚Hashover版本"></a>回滚Hashover版本</h3><p>　　由于此前搬家时好不容易才让评论系统正常显示，不想退回去使用<code>hashover</code>的1.0版本，于是在<a href="https://www.jiangfei.net" target="_blank" rel="noopener">疆飞</a>的建议下试试他使用的老版本。</p><p>　　他使用的版本是<code>hashover-next</code>中较早的版本，根据文件时间判断他使用的是2018年8月份的的版本。在查询<code>hashover-next</code>的<code>commits</code>记录中发现，那个时间段开始新增SMTP支持，猜想是不是这个SMTP支持导致原来的sendmail失效。</p><p>　　于是采用<code>git reset --hard cb4de3d002f52730cd30aa05c7bfe771e5f70500</code>命令回滚到支持SMTP之前的版本。</p><p>　　结果还是失败了。后续由往后测试了几个版本，都以失败告终。</p><h3 id="偷懒带来的柳暗花明"><a href="#偷懒带来的柳暗花明" class="headerlink" title="偷懒带来的柳暗花明"></a>偷懒带来的柳暗花明</h3><p>　　后面随着不断的翻滚版本，渐渐想偷懒了，于是也懒得调整主题、语言、登录设置这些东西了，直接默认装上去在<code>secret.php</code>文件里改好必须的配置就直接测试，没想到反而成功收到了邮件提醒。</p><p>　　伴随着这一小阵成功的曙光，开始逐个排查是哪个选项造成无法发送，排查到最后发现，当把语言设置成中文的时候就无法发送邮件通知，改回英文就正常。</p><p>　　于是开始重点检查语言设置，发现采用中、日、韩这些双字节文字的语言就无法触发邮件通知，采用英、法、西这些语言就能够正常接收邮件通知。</p><p>　　这下基本上就可以判断是跟语言有关了，接下来就得排查到底是PHP的相关支持的原因还是系统语言包支持的原因了。</p><h3 id="重新进行PHP测试"><a href="#重新进行PHP测试" class="headerlink" title="重新进行PHP测试"></a>重新进行PHP测试</h3><p>　　经此想起之前测试因为懒得切换输入法，都是直接用英文测试，这回改成用中文测试。</p><figure class="highlight xml"><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="php"><span class="meta">&lt;?php</span></span></span><br><span class="line"><span class="php">$to = <span class="string">"candura@foxmail.com"</span>;</span></span><br><span class="line"><span class="php">$subject = <span class="string">"中文邮件"</span>;</span></span><br><span class="line"><span class="php">$message = <span class="string">"中文邮件测试"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"From: noreply@candura.us"</span>;</span></span><br><span class="line"><span class="php">mail($to,$subject,$message,$headers);</span></span><br><span class="line"><span class="php"><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><p>　　果然就无法触发邮件了，再分别测试了下面两个PHP。</p><figure class="highlight xml"><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="php"><span class="meta">&lt;?php</span></span></span><br><span class="line"><span class="php">$to = <span class="string">"candura@foxmail.com"</span>;</span></span><br><span class="line"><span class="php">$subject = <span class="string">"中文邮件"</span>;</span></span><br><span class="line"><span class="php">$message = <span class="string">"Hello! This is a php email test"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"From: noreply@candura.us"</span>;</span></span><br><span class="line"><span class="php">mail($to,$subject,$message,$headers);</span></span><br><span class="line"><span class="php"><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><figure class="highlight xml"><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="php"><span class="meta">&lt;?php</span></span></span><br><span class="line"><span class="php">$to = <span class="string">"candura@foxmail.com"</span>;</span></span><br><span class="line"><span class="php">$subject = <span class="string">"PHP mail Test"</span>;</span></span><br><span class="line"><span class="php">$message = <span class="string">"中文邮件测试"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"From: noreply@candura.us"</span>;</span></span><br><span class="line"><span class="php">mail($to,$subject,$message,$headers);</span></span><br><span class="line"><span class="php"><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><p>　　对比发现邮件内容是中文并不影响邮件发送，而一旦邮件标题是中文的时候就没办法发送了。</p><h3 id="重新进行Sendmail测试"><a href="#重新进行Sendmail测试" class="headerlink" title="重新进行Sendmail测试"></a>重新进行Sendmail测试</h3><p>　　随后继续在命令行下采用<code>Sendmail</code>命令测试。</p><figure class="highlight stylus"><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></pre></td><td class="code"><pre><span class="line">sendmail -t &lt;&lt;EOF</span><br><span class="line">From: noreply@candura.us</span><br><span class="line">To: candura@foxmail.com</span><br><span class="line">Subject: 中文标题测试</span><br><span class="line">Hello! This is <span class="selector-tag">a</span> sendmail Test</span><br><span class="line">EOF</span><br></pre></td></tr></table></figure><p>　　果然不行，于是基本上可以把问题原因锁定在中文邮件标题上了。</p><h3 id="临时方案测试成功"><a href="#临时方案测试成功" class="headerlink" title="临时方案测试成功"></a>临时方案测试成功</h3><p>　　随着在网上一阵 Google，发现大部分人都遇到了<code>Subject</code>参数是中文导致的邮件乱码问题，但是都没有说发送不了。我猜测可能邮件也发出了，但是由于标题是乱码被发送出口或者邮箱接受口那里直接屏蔽掉了。所以相应的解决方案应该是通用的。</p><p>　　解决方案是把<code>Subject</code>里面的中文标题用Base64加密成字符串，并在文件头中写上解码信息。</p><p>　　把PHP的测试文件改成下面这样：</p><figure class="highlight xml"><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></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta">&lt;?php</span></span></span><br><span class="line"><span class="php">$to = <span class="string">"candura@foxmail.com"</span>;</span></span><br><span class="line"><span class="php">$subject = <span class="string">"中文标题测试"</span>;</span></span><br><span class="line"><span class="php">$message = <span class="string">"内容是中文就可以正常发送邮件"</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php">$headers = <span class="string">"MIME-Version: 1.0"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"From: noreply@candura.us"</span>;</span></span><br><span class="line"><span class="php">$headers .= <span class="string">"Content-Type: text/plain; charset=\"UTF-8\""</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php">$subject = <span class="string">"=?UTF-8?B?"</span>.base64_encode($subject).<span class="string">"?="</span>;</span></span><br><span class="line"><span class="php">mail($to,$subject,$message,$headers);</span></span><br><span class="line"><span class="php"><span class="meta">?&gt;</span></span></span><br></pre></td></tr></table></figure><p>　　然后访问这个PHP文件执行，成功收到了中文标题的邮件，看来这个方法果然可行。</p><h3 id="修改Hashover源码解决问题"><a href="#修改Hashover源码解决问题" class="headerlink" title="修改Hashover源码解决问题"></a>修改Hashover源码解决问题</h3><p>　　通过分析<code>hashover</code>的源代码，邮件提醒的内容部分主要是在<code>writecomments.php</code>文件中，最终通过调用<code>sendmail.php</code>里面的<code>send()</code>函数发出。那么主需要把关键的<code>$subject = &quot;=?UTF-8?B?&quot;.base64_encode($subject).&quot;?=&quot;;</code>语句增加进去就行了。</p><p>　　最终需要修改的是<code>sendmail.php</code>里面的倒数第三行，在调用<code>mail()</code>函数之前，把标题内容改进进去。</p><figure class="highlight php"><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="comment">// Send mail</span></span><br><span class="line"><span class="comment">// 改变标题格式</span></span><br><span class="line"><span class="keyword">$this</span>-&gt;subject = <span class="string">"=?UTF-8?B?"</span>.base64_encode(<span class="keyword">$this</span>-&gt;subject).<span class="string">"?="</span>;</span><br><span class="line"><span class="comment">// 发出邮件</span></span><br><span class="line">mail (<span class="keyword">$this</span>-&gt;to, <span class="keyword">$this</span>-&gt;subject, $message, $headers);</span><br></pre></td></tr></table></figure><p>　　经过这样修改完再进行几次测试，分别切换了不同语言，把邮件内容分别设置成<code>HTML</code>和<code>TEXT</code>模式，均能正常发出邮件提醒，算是解决了问题！</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　虽然这个问题最终通过修改<code>hashover</code>的源码来解决了，但是感觉并没有触碰到问题的实质。我之前的VPS是Ubuntu系统，现在这个是Debian，后来在其他的CentOS、Ubuntu系统的主机上搭建测试，发现不用修改也不存在这样的问题。所以到底后面是因为什么原因造成的这个情况，我也不得而知了。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;前因&quot;&gt;&lt;a href=&quot;#前因&quot; class=&quot;headerlink&quot; title=&quot;前因&quot;&gt;&lt;/a&gt;前因&lt;/h3&gt;&lt;p&gt;　　前几天刚刚完成VPS的搬家，虽然大部分功能都恢复了，但是唯独评论系统无法发送邮件提醒的问题还是没能解决。经过各种各样的尝试终于最终解决了，中间虽然做了很多不成功的尝试，比较曲折，但还是挺攒经验的。所以记录下来给以后提供依据。&lt;/p&gt;
&lt;h3 id=&quot;配置Postfix进行Sendmail测试&quot;&gt;&lt;a href=&quot;#配置Postfix进行Sendmail测试&quot; class=&quot;headerlink&quot; title=&quot;配置Postfix进行Sendmail测试&quot;&gt;&lt;/a&gt;配置Postfix进行Sendmail测试&lt;/h3&gt;&lt;p&gt;　　在之前的VPS中，直接安装配置完Postfix之后，基本上就能够正常发送相关邮件了，但是这次安装配置完Postfix，还是不正常。&lt;/p&gt;
&lt;p&gt;　　安装配置过程不表，主要是留意一下域名配置，要增加&lt;code&gt;127.0.0.1&lt;/code&gt;的本地回环域名解析到&lt;code&gt;hosts&lt;/code&gt;文件内就行。完成配置后用邮件发送命令测试：&lt;/p&gt;
&lt;figure class=&quot;highlight stylus&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;sendmail -t &amp;lt;&amp;lt;EOF&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;From: noreply@candura.us&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;To: candura@foxmail.com&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Subject: Sendmail Test&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Hello! This is &lt;span class=&quot;selector-tag&quot;&gt;a&lt;/span&gt; sendmail Test&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;EOF&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;　　然后成功收到邮件，排除&lt;code&gt;sendmail&lt;/code&gt;配置问题。&lt;/p&gt;
&lt;h3 id=&quot;PHP调用mail-函数测试&quot;&gt;&lt;a href=&quot;#PHP调用mail-函数测试&quot; class=&quot;headerlink&quot; title=&quot;PHP调用mail()函数测试&quot;&gt;&lt;/a&gt;PHP调用mail()函数测试&lt;/h3&gt;&lt;p&gt;　　系统的&lt;code&gt;sendmail&lt;/code&gt;正常之后，就开始测试PHP下面相关函数了。&lt;/p&gt;
&lt;p&gt;　　首先修改一下&lt;code&gt;php.ini&lt;/code&gt;配置文件，找到&lt;/p&gt;
&lt;figure class=&quot;highlight nix&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;;&lt;span class=&quot;attr&quot;&gt;sendmail_path&lt;/span&gt; = &lt;span class=&quot;string&quot;&gt;&quot;sendmail -t -i&quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
      <category term="HEXO" scheme="https://www.candura.us/tags/HEXO/"/>
    
  </entry>
  
  <entry>
    <title>懒癌患者的VPS搬家填坑记录</title>
    <link href="https://www.candura.us/posts/post-354/"/>
    <id>https://www.candura.us/posts/post-354/</id>
    <published>2019-07-22T12:02:54.000Z</published>
    <updated>2019-07-22T11:41:34.714Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h3><p>　　之前几年一直用着搬瓦工的年付10刀以下的VPS，放个博客建个私人机场，时不时跑点数据，用起来美滋滋的。结果后来一纸通知彻底停掉了OpenVZ架构的主机，粉碎了把它当传家宝的希望。</p><p>　　要上年付19.9刀的套餐实在囊中羞涩，谁知道后来竟然连这个套餐也没有了，于是到头来又得重新找便宜的VPS。好不容易找到了注册好了，作为一个懒癌患者愣是磨蹭到搬瓦工到期的最后一天才开始慢慢搬家。</p><p>　　今天要记录的就是这次搬家过程中打算实现的目标和遇到的小问题。</p><p>　　主要目标及达成情况</p><ol><li>原有功能不变√</li><li><del>博客从HEXO架构转移到HUGO架构</del> ×</li><li>利用Caddy实现全站HTTPS√</li></ol><p>　　本来想更换到 Hugo 是之前HEXO用到后期速度变慢了，结果后面又舍弃不下现在用着的这个主题，所以最终还是没有更换到 Hugo。</p><p>　　下面是这次遇到的坑，内容有些水哈~</p><a id="more"></a><h3 id="Caddy启动失败"><a href="#Caddy启动失败" class="headerlink" title="Caddy启动失败"></a>Caddy启动失败</h3><p>　　其实最早接触 Caddy 是为了构建私人机场，发现它配置非常简单，而且很容易实现 HTTPS，所以这次在新的VPS上彻底停用 nginx，直接全站启用Caddy来进行管理了。</p><p>　　然而在这次实际使用的过程中，老是启动失败。后来解决也简单，发现是域名配置打错字导致卡在获取TLS证书上，后面重新修改好就能正常启动了。</p><h3 id="Caddy-403-forbidden"><a href="#Caddy-403-forbidden" class="headerlink" title="Caddy 403 forbidden"></a>Caddy 403 forbidden</h3><p>　　成功启动Caddy之后，我是通过<code>ln -s</code>软连接来把 HEXO 的 public 目录链接到 www 目录下面，但是访问的时候总是显示<code>403 forbiden</code>。</p><p>　　通过查看日志，老是<code>Permission denied</code>，后来发现问题出在 systemd 的配置上面，以前我是用 Caddy 是通过 supervisor 来作为进程守护的，后面因为同时用 supervisor 来守护了其他的某个软件，不想在调试修改配置的过程中老被重启整个 supervisor，所以就换成了 Caddy 官方相对比较推荐的 systemd 来做守护启动。</p><p>　　可是默认的 systemd 配置文件中的<code>ProtectHome</code>和<code>ProtechSystem</code>对一些安全相关的目录做了保护，而我这个 public 文件夹刚好在被保护的 /home 目录下，所以访问的时候就 403 了。</p><p>　　解决只要修改 Caddy 的 systemd 配置文件即可，即<code>/lib/systemd/system/caddy.service</code>文件。有这样的配置：</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="comment">; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.</span></span><br><span class="line"><span class="attr">ProtectHome</span>=<span class="literal">true</span></span><br><span class="line"><span class="comment">; Make /usr, /boot, /etc and possibly some more folders read-only.</span></span><br><span class="line"><span class="attr">ProtectSystem</span>=full</span><br></pre></td></tr></table></figure><p>　　把<code>ProtectHome=true</code>改为<code>ProtectHome=read-only</code>就行了。</p><h3 id="HashOver评论异常"><a href="#HashOver评论异常" class="headerlink" title="HashOver评论异常"></a>HashOver评论异常</h3><p>　　自从多说停运之后，我的博客就开始启用HashOver作为评论系统（见<a href="https://www.candura.us/posts/post-348/">前文</a>），不过当时搭建好了之后就再也没有更新过系统版本。这次搬家顺带把 <a href="https://github.com/jacobwb/hashover" target="_blank" rel="noopener">HashOver</a> 从之前的老板本升级到新的 <a href="https://github.com/jacobwb/hashover-next" target="_blank" rel="noopener">hashover-next</a> 版本。</p><p>　　新旧版本的引入文件有所变化，要把旧版本的<code>hashover.js</code>引用路径替换成新版本的<code>comments.php</code>或者<code>loader.php</code>。</p><p>　　即</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/hashover/hashover.js"</span> &gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>　　改为</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/hashover-next/comments.php"</span> &gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><p>　　旧版本的评论内容是放在<code>pages</code>文件夹下，新版本改到了<code>comments</code>文件夹，并且文件内容也不同。</p><p>　　旧版本的文件夹结构是这样：</p><figure class="highlight crmsh"><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">├── pages</span><br><span class="line">│   ├── posts-post-<span class="number">76</span></span><br><span class="line">|   │   ├── <span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">2</span>-<span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">2</span>.xml</span><br><span class="line">│   │   ├── <span class="number">3</span>-<span class="number">1</span>-<span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">3</span>-<span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">3</span>-<span class="number">1</span>.xml</span><br><span class="line">│   │   ├── <span class="number">3</span>.xml</span><br><span class="line">│   │   └── .metadata</span><br></pre></td></tr></table></figure><p>　　新版本变成了多级结构，并且 metadata 文件也有相应变化，把原本的<code>.metadata</code>文件拆分成了<code>latest-comments.json</code>和<code>page-info.json</code>文件。</p><p>　　新版本的文件夹结构是这样：</p><figure class="highlight crmsh"><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></pre></td><td class="code"><pre><span class="line">├── comments</span><br><span class="line">│   ├── metadata</span><br><span class="line">│   │   └── latest-comments.json</span><br><span class="line">│   └── threads</span><br><span class="line">│       ├── posts-post-<span class="number">76</span></span><br><span class="line">│       │   ├── <span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">2</span>-<span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">2</span>.xml</span><br><span class="line">│       │   ├── <span class="number">3</span>-<span class="number">1</span>-<span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">3</span>-<span class="number">1</span>-<span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">3</span>-<span class="number">1</span>.xml</span><br><span class="line">│       │   ├── <span class="number">3</span>.xml</span><br><span class="line">│       │   └── metadata</span><br><span class="line">│       │       ├── latest-comments.json</span><br><span class="line">│       │       └── page<span class="literal">-inf</span>o.json</span><br></pre></td></tr></table></figure><p>　　我发现json文件是可以自动生成的，所以直接摒弃掉原来的<code>.metadata</code>文件，然后用<code>cp</code>命令把之前的评论文件直接拷贝到新的地方的，并且批量生成<code>metadata</code>子文件夹并设置权限。结果发现有些评论正常有些评论不正常。</p><img src="/posts/post-354/01.jpg" title="评论不正常"><p>　　后来偶然间发现，不使用<code>cp</code>命令来复制过去，而是直接诶在 C9 IDE 下面拖动文件夹到新的地方，结果就正常了。后面想来，大概是还有一些会影响显示或者编码的隐藏文件， <code>cp</code> 的时候原样过去了，而拖动的时候忽略掉了，反而正常了。不过这只是个人猜想，并没有得到证实。</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　除了上面一些问题之外，其实这次也遇到了诸如 sendmail 配置不正确，postfix 域名解析不成功等小问题，不过基本上都是稍微查一下就能解决的，就不赘述了。</p><p>　　经过此番折腾，这个荒废的博客基本上又能苟延残喘一段时间了。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;背景介绍&quot;&gt;&lt;a href=&quot;#背景介绍&quot; class=&quot;headerlink&quot; title=&quot;背景介绍&quot;&gt;&lt;/a&gt;背景介绍&lt;/h3&gt;&lt;p&gt;　　之前几年一直用着搬瓦工的年付10刀以下的VPS，放个博客建个私人机场，时不时跑点数据，用起来美滋滋的。结果后来一纸通知彻底停掉了OpenVZ架构的主机，粉碎了把它当传家宝的希望。&lt;/p&gt;
&lt;p&gt;　　要上年付19.9刀的套餐实在囊中羞涩，谁知道后来竟然连这个套餐也没有了，于是到头来又得重新找便宜的VPS。好不容易找到了注册好了，作为一个懒癌患者愣是磨蹭到搬瓦工到期的最后一天才开始慢慢搬家。&lt;/p&gt;
&lt;p&gt;　　今天要记录的就是这次搬家过程中打算实现的目标和遇到的小问题。&lt;/p&gt;
&lt;p&gt;　　主要目标及达成情况&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;原有功能不变√&lt;/li&gt;
&lt;li&gt;&lt;del&gt;博客从HEXO架构转移到HUGO架构&lt;/del&gt; ×&lt;/li&gt;
&lt;li&gt;利用Caddy实现全站HTTPS√&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;　　本来想更换到 Hugo 是之前HEXO用到后期速度变慢了，结果后面又舍弃不下现在用着的这个主题，所以最终还是没有更换到 Hugo。&lt;/p&gt;
&lt;p&gt;　　下面是这次遇到的坑，内容有些水哈~&lt;/p&gt;
    
    </summary>
    
      <category term="个人日记" scheme="https://www.candura.us/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
      <category term="HEXO" scheme="https://www.candura.us/tags/HEXO/"/>
    
  </entry>
  
  <entry>
    <title>在U-NAS下配置Zerotier进行内网穿透</title>
    <link href="https://www.candura.us/posts/post-353/"/>
    <id>https://www.candura.us/posts/post-353/</id>
    <published>2019-02-27T11:03:54.000Z</published>
    <updated>2020-03-05T05:51:45.437Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="背景介绍"><a href="#背景介绍" class="headerlink" title="背景介绍"></a>背景介绍</h3><p>　　之前一直计划在家里放个NAS用来储存各种数据资料、同步手机数据之类的，过完年回来网上偶然得知在年前某播酷云就“矿难”了，于是赶紧入了一台。播酷云是万由代工的一款NAS，本来是计划上黑裙的系统，但是想到实际上并不需要那么多功能，只想尽量少折腾，干脆就装上了万由自家的U-NAS OS。</p><img src="/posts/post-353/01.jpg" title="U-NAS系统界面"><p>　　我这边的使用场景是把NAS放在家里的内网，然后除了家里还会在其他地方对它进行操作，所以接下来要考虑的就是内网穿透的问题。</p><a id="more"></a><h3 id="内网穿透方案"><a href="#内网穿透方案" class="headerlink" title="内网穿透方案"></a>内网穿透方案</h3><p>　　目前网络上常见的内网穿透方案基本上是这两种：</p><ol><li>采用公网设备作为中转代理，实现内外网设备连接，数据流量走中转通道。例如：FRP、ngrok、QC等等（我感觉万由家官方的U-Anywhere也是这种模式）</li><li>采用公网设备作为握手代理，内外网设备连接代理服务器完成握手后，实现设备之间直连，数据流量直接走点对点通道，不经过代理服务器。例如：ZeroTier、N2N。</li></ol><p>　　由于我自己的廉价VPS速度和流量也堪忧，所以搭建第一种方案是不可靠的，所以后续还是选定了使用ZeroTier作为内网穿透的方案。</p><h4 id="ZeroTier的连接模式"><a href="#ZeroTier的连接模式" class="headerlink" title="ZeroTier的连接模式"></a>ZeroTier的连接模式</h4><p>　　我理解中ZeroTier实现数据连接的模式大概是这样的：</p><ol><li>A 想要将数据包发送到 B，但由于它没有直接路径，因此将其向上发送到 C</li><li>如果 C 有直接链接到 B，它会转发数据包给 B，否则它会继续向上游发送数据包，直到达到根节点 Z</li><li>根节点 Z 知道所有节点，所以如果 B 在线，最终数据包将到达 B</li><li>C 还向 A 发送一个握手的消息，包含有关它如何到达 B 的提示。同时，将握手消息发给 B，通知 B 它如何到达 A</li><li>A 和 B 获取握手消息并尝试相互发送测试消息，可能会对 NAT 或防火墙进行穿透，如果这样可以建立直接链路，则不再需要中继，如果无法建立直接路径，则通信可以继续中继(速度慢)。</li></ol><p>　　这里面的根节点 Z 是由ZeroTier官方提供的，用户也可以自己搭建类根节点 Moon，来依托 Z 节点提高数据交换速度。</p><h3 id="安装流程"><a href="#安装流程" class="headerlink" title="安装流程"></a>安装流程</h3><h4 id="注册ZeroTier账号"><a href="#注册ZeroTier账号" class="headerlink" title="注册ZeroTier账号"></a>注册ZeroTier账号</h4><p>　　如上文所说，ZeroTier 的根节点是由官方提供的，即便是自己搭建 Moon 节点也要依托官方的根节点来被发现，所以要使用 ZeroTier 还是得先注册ZeroTier的账号。免费账号可以建立一个虚拟局域网，允许同时最多100个设备连接到这个虚拟局域网中。</p><p>　　注册过程比较简单，就不细说了。注册登陆后，建立完一个虚拟局域网，会得到一个网络ID（不可修改）和一个局域网段（可以自定义）。</p><img src="/posts/post-353/02.jpg" title="ZeroTier建立虚拟局域网"><p>　　最重要的其中的网络ID，那是作为后续其他设备接入的唯一凭证。</p><h4 id="在U-NAS上安装ZeroTier"><a href="#在U-NAS上安装ZeroTier" class="headerlink" title="在U-NAS上安装ZeroTier"></a>在U-NAS上安装ZeroTier</h4><p>　　U-NAS OS 本质上是基于 Debian 的一个 NAS 系统，所以安装流程就跟在 Debian 下面差不多。</p><p>　　1.开启 SSH服务<br>　　由于 U-NAS OS 默认没有安装 openssh，所以先在“APP管理器”中找到“SSH服务”安装上，并在相关设置中配置好端口。</p><img src="/posts/post-353/03.jpg" title="开启SSH服务"><p>　　2.用SSH登录U-NAS<br>　　一般可以采用Putty、MobaXterm等工具连接NAS的SSH端口即可，我这里懒得安装，直接在命令行下登录了。</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh U-NAS地址 -l admin -<span class="selector-tag">p</span> SSH端口</span><br></pre></td></tr></table></figure><p>　　登录之后需要用<code>su root</code>来切换到 root 用户，默认密码为<code>yutech</code> ，如果之前那步勾上了“允许Root登录”的话可以省略admin用户登录再切换的流程。</p><img src="/posts/post-353/04.jpg" title="SSH登录U-NAS"><p>　　3.安装ZeroTier<br>　　由于 U-NAS 本质上是 Debian 系统，所以安装过程只需要一条命令就足够了。（由于此前已经切换到 root 用户，所以此处运行 bash 不需要加 sudo 了）。</p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -s <span class="string">https:</span><span class="comment">//install.zerotier.com/ | bash</span></span><br></pre></td></tr></table></figure><p>　　正常情况下出现 Successful 就说明安装好了。<br>　　<br>　　3.1 补充说明<br>　　有些运行上述安装命令会弹出 <code>bash: curl: command not found</code> 的错误，这是由于 U-NAS OS 没有原生自带<code>curl</code>工具导致的。　　</p><img src="/posts/post-353/curl.png" title="找不到Curl命令"><p>　　<br>　　此时需要用APT包管理工具来手动安装一下这个工具即可。</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt <span class="keyword">install</span> curl</span><br></pre></td></tr></table></figure><h4 id="使用ZeroTier"><a href="#使用ZeroTier" class="headerlink" title="使用ZeroTier"></a>使用ZeroTier</h4><p>　　安装完成后 ZeroTier 自动加入启动服务中，不需要手动启动。此时只要使用 join 命令加入之前创建的那个网络的 ID 即可将 U-NAS 加入到虚拟局域网中。</p><figure class="highlight lisp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zerotier-cli join (<span class="name">NetWork</span> ID)</span><br></pre></td></tr></table></figure><p>　　如果出现<code>200 join OK</code>字样就说明成功连上虚拟局域网了。但此时它还并不能被访问，需要登录 ZeroTier 的控制中心。</p><img src="/posts/post-353/05.jpg" title="发现U-NAS设备"><p>　　看到已经发现了 U-NAS，这时候点击左边的勾勾来通过验证，就正式将 U-NAS 连接到 ZeroTier 的虚拟局域网中了。后面的 Managed IP 就是它在虚拟局域网中的IP地址。</p><img src="/posts/post-353/06.jpg" title="发现U-NAS设备"><p>　　这样连上了之后就能被其他加入这个虚拟局域网的设备发现，并与其进行点对点的数据传输了。</p><p>　　此时在 U-NAS 上输入<code>zerotier-cli listpeers</code>还能看到整个网络中的其他节点。</p><img src="/posts/post-353/07.jpg" title="listpeers"><h3 id="使用效果"><a href="#使用效果" class="headerlink" title="使用效果"></a>使用效果</h3><p>　　整体弄好之后试试效果，我这里的环境是这样：U-NAS 放在家里，在家庭内网中，办公室的电脑在公司的内网环境下。</p><img src="/posts/post-353/08.jpg" title="Ping"><p>　　在办公室的终端上分别 Ping 一下它在 U-Anywhere 的地址和虚拟局域网中的内网地址，可以发现是成功打通了直连通道的。</p><img src="/posts/post-353/09.jpg" title="Ping"><p>　　复制文件的速度也已经很不错了，基本上能够跑满公司内网限制的网速了，也说明与之之间是实现了 P2P 直连而非走中转通道。</p><h3 id="后续"><a href="#后续" class="headerlink" title="后续"></a>后续</h3><p>　　后来还尝试了在 VPS 上面搭建 ZeroTier 的 Moon 节点服务器，也成功了，不过我的廉价 VPS 访问速度并不比 ZeroTier 自己的根节点快多少，所以也不知道具体效果如何。如果以后在国内的 VPS 上部署 Moon 节点的话，应该对国内的 ZeroTier 终端访问会有加快握手速度的作用。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;背景介绍&quot;&gt;&lt;a href=&quot;#背景介绍&quot; class=&quot;headerlink&quot; title=&quot;背景介绍&quot;&gt;&lt;/a&gt;背景介绍&lt;/h3&gt;&lt;p&gt;　　之前一直计划在家里放个NAS用来储存各种数据资料、同步手机数据之类的，过完年回来网上偶然得知在年前某播酷云就“矿难”了，于是赶紧入了一台。播酷云是万由代工的一款NAS，本来是计划上黑裙的系统，但是想到实际上并不需要那么多功能，只想尽量少折腾，干脆就装上了万由自家的U-NAS OS。&lt;/p&gt;
&lt;img src=&quot;/posts/post-353/01.jpg&quot; title=&quot;U-NAS系统界面&quot;&gt;

&lt;p&gt;　　我这边的使用场景是把NAS放在家里的内网，然后除了家里还会在其他地方对它进行操作，所以接下来要考虑的就是内网穿透的问题。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="NAS" scheme="https://www.candura.us/tags/NAS/"/>
    
  </entry>
  
  <entry>
    <title>解决搬瓦工主机更换IP后无法联网问题</title>
    <link href="https://www.candura.us/posts/post-352/"/>
    <id>https://www.candura.us/posts/post-352/</id>
    <published>2018-10-08T13:02:54.000Z</published>
    <updated>2019-07-11T08:45:22.168Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h3><p>　　国庆节放假前一天，网站突然无法访问了，检查一番发现是IP被封了。用搬瓦工这么久，还是第一次IP被封，于是第一次尝试搬瓦工的更换IP服务。更换好IP把域名解析之类的也做好了之后，却发现有几个问题出现了。</p><ol><li>静态网页访问正常，但PHP无法解析，传递504 Time Out错误。</li><li>外网能够访问这台VPS，这台VPS确无法访问外网。包括更新软件、<code>Ping</code>公共DNS（8.8.8.8）、<code>Ping</code>大型网站等，均不正常（如下图）。</li></ol><p>　　由于正值国庆放假期间，也无暇处理，所以收假回来后赶紧想办法解决。</p><a id="more"></a><h3 id="查找问题"><a href="#查找问题" class="headerlink" title="查找问题"></a>查找问题</h3><p>　　首先是想解决PHP不正常的问题，看了Nginx里面的错误日志，发现大多是转发访问到 fast-cgi 的端口时发生超时错误，所以推测的这个问题的本质上跟第二个问题是一致的，都是联网造成的原因。</p><p>　　随后看了当前的网卡配置，发现 venet0 网卡有很多掉包记录但是找了半天也没找到配置哪里出问题。</p><p>　　后面又重复看了各种日志，也没看出异常在哪，于是只好给客服下了一个工单来汇报这个问题。无奈这边5号收假回来的时候那边刚好是周末，所以一直没有等到回复，今天终于等到客服的回复，提醒我检查一下IP路由表的设置。</p><p>　　之前一直没想到这一点上，随后赶紧先查看了一下当前的路由表状态。</p><p>　　里面列出的果然还是更换前的IP地址，难怪一直都无法访问网络。</p><h3 id="解决问题"><a href="#解决问题" class="headerlink" title="解决问题"></a>解决问题</h3><p>　　知道问题点就好办了，编辑一下<code>/etc/iptables.conf</code>这个文件，把里面的老的IP修改成新的就行了。</p><p>　　改好之后重启一下VPS，再尝试访问网络，这下完全正常了。</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　其实真正知道了是怎么一回事，这次的问题就很简单了。但是这次能解决还是多亏了客服的提醒，自己一个人琢磨容易陷入思维的死区，净是把问题往牛角尖那里想，结果却忽略了其他的地方。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;问题描述&quot;&gt;&lt;a href=&quot;#问题描述&quot; class=&quot;headerlink&quot; title=&quot;问题描述&quot;&gt;&lt;/a&gt;问题描述&lt;/h3&gt;&lt;p&gt;　　国庆节放假前一天，网站突然无法访问了，检查一番发现是IP被封了。用搬瓦工这么久，还是第一次IP被封，于是第一次尝试搬瓦工的更换IP服务。更换好IP把域名解析之类的也做好了之后，却发现有几个问题出现了。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;静态网页访问正常，但PHP无法解析，传递504 Time Out错误。&lt;/li&gt;
&lt;li&gt;外网能够访问这台VPS，这台VPS确无法访问外网。包括更新软件、&lt;code&gt;Ping&lt;/code&gt;公共DNS（8.8.8.8）、&lt;code&gt;Ping&lt;/code&gt;大型网站等，均不正常（如下图）。&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;　　由于正值国庆放假期间，也无暇处理，所以收假回来后赶紧想办法解决。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
  </entry>
  
  <entry>
    <title>记一次ST-Link维修及固件刷写过程</title>
    <link href="https://www.candura.us/posts/post-351/"/>
    <id>https://www.candura.us/posts/post-351/</id>
    <published>2018-08-28T03:02:54.000Z</published>
    <updated>2019-07-11T08:45:22.176Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>　　前段时间要给一批产品烧写程序，开始是用的山寨 J-Link v8，后来因为意外烧坏了，就换成用 ST-Link ，结果又因为一次意外把 ST-Link 给烧坏了。-_-|||</p><p>　　后来忙完这段时间之后，想着把之前的烧坏的 J-Link 和 ST-Link 都给修一下。J-Link 好办，就是USB口的保护二极管芯片击穿了，把它拆掉就能正常使用了，不过为了安全起见后面买了 SN65220 芯片来换上就修好了。所以我本来以为 ST-Link 无非也是电源芯片或者保护电路烧坏而已，应该很好解决，结果没想到折腾了许久。</p><a id="more"></a><h3 id="查找问题点"><a href="#查找问题点" class="headerlink" title="查找问题点"></a>查找问题点</h3><p>　　上图就是坏掉的 ST-Link，烧坏之后上电发现灯完全不亮了，3.3V电压也没有，所以判断应该是电源芯片烧坏了。拆开热缩管，把买好的 LD3985M33R 芯片更换上去。结果插上电脑还是没有反应，而且USB口和电源芯片发烫，感觉不大妙。拆下来用万用表一测，发现 3.3V 和 GND 直接短路了。</p><p>　　因为之前摸的时候是感觉USB口发烫最厉害，所以一开始我竟然以为是USB口的问题，真不知道当初是大脑短路了还是什么的，于是除了拆下电源芯片，还硬生生把USB口也给拆下来了。然后再测，发现还是短路。对照了一下原理图，发现跨在 3.3V 和 GND 之间的也就几个电容而已，没理由烧穿的，测到最后才想到把主控芯片取下来。</p><p>　　拆下主控之后再测板子上，不短路了，单独测拆下来的芯片的引脚，原来是把芯片内部给击穿了。这下最终确认问题点是主控芯片烧坏了。</p><h3 id="修复硬件"><a href="#修复硬件" class="headerlink" title="修复硬件"></a>修复硬件</h3><p>　　知道问题点就好办了，这一块 ST-Link 上面的主控芯片是 STM32F103CBT6，在官网上面看了一下，发现 ST-Link 的固件不大，用 C8T6 就完全足够了，不需要用到 CBT6，于是找来以前拆机剩下的 C8T6 芯片吹上去。再把之前拆下来的电源芯片和USB口也焊上，基本就硬件部分就算弄好了。值得一提的一点是，我这块 ST-Link 预留的主控芯片下载口上面的间距是 2.0mm，不是常规排针的 2.54mm 间距，所以只好焊了几个电阻腿来方便引线。</p><p>　　吹上主控之后用焊台补锡的过程中还不小心弄掉了一个焊盘(捂脸)，还好那只是一个空焊盘不影响功能。</p><h3 id="固件刷写测试"><a href="#固件刷写测试" class="headerlink" title="固件刷写测试"></a>固件刷写测试</h3><p>　　焊好之后就可以开始烧写 ST-Link 的固件了，因为这个时候主控里面是没有程序或者是别的产品的程序，所以是不能直接插到电脑上用 ST-Link Upgreade 来升级固件的，而要先用另外的 ST-Link 或者 J-Link 给它刷入 ST-Link 的固件。</p><p>　　我这里是用另外一块 ST-Link 来刷，板子上的口虽然没有丝印，不过测量一下发现从左到右的顺序分别是 GND、SWCLK、SWDIO、3.3V，跟它自身输出的顺序是一样的。连接好之后，就用好的 ST-Link 按照正常给产品芯片下程序那样把固件的 bin 文件刷入换上的主控就行了。</p><p>　　我这里直接用官方的 ST-LINK Utility 工具来刷写，比较快捷。刷好之后将这一块 ST-Link 单独插到电脑上，发现电脑可以识别出来了。</p><p>　　然后再用 ST-Link Upgreade 来把固件升级成官网最新的固件。</p><p>　　升级完成之后应该就是正常了。不过还是得测试一下功能，刚好手头有一块 STM8 的最小系统板子，拿这块修好的 ST-Link 试试给它下程序和调试看看。</p><p>　　最终调试也都没有什么问题，就说明成功把这块 ST-Link 修复了。</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　这次虽然成功把 ST-Link 修复了，但是中间还是走了一些不必要的弯路，比如判断错问题点瞎拆元件之类的。还是自己思考问题不够全面，不够细心造成的，后续还是应该加强一下这方面才行。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;　　前段时间要给一批产品烧写程序，开始是用的山寨 J-Link v8，后来因为意外烧坏了，就换成用 ST-Link ，结果又因为一次意外把 ST-Link 给烧坏了。-_-|||&lt;/p&gt;
&lt;p&gt;　　后来忙完这段时间之后，想着把之前的烧坏的 J-Link 和 ST-Link 都给修一下。J-Link 好办，就是USB口的保护二极管芯片击穿了，把它拆掉就能正常使用了，不过为了安全起见后面买了 SN65220 芯片来换上就修好了。所以我本来以为 ST-Link 无非也是电源芯片或者保护电路烧坏而已，应该很好解决，结果没想到折腾了许久。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="嵌入式" scheme="https://www.candura.us/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
      <category term="电子" scheme="https://www.candura.us/tags/%E7%94%B5%E5%AD%90/"/>
    
  </entry>
  
  <entry>
    <title>简单写个页面来接收远程U盘剩余空间</title>
    <link href="https://www.candura.us/posts/post-350/"/>
    <id>https://www.candura.us/posts/post-350/</id>
    <published>2018-08-09T13:52:54.000Z</published>
    <updated>2019-07-11T08:45:22.168Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h3><p>　　之前尝试过用Beaglebone Black开发板来做个低成本的家用小型NAS<a href="http://www.candura.us/posts/post-338/">（见前文）</a>，不过使用起来其实终归不是很方便。后来我换了一台刷成OpenWrt的路由器，用一块有一定容量的U盘来挂载在路由器上，作为远程下载的容器，各方面都方便了许多。</p><p>　　首先路由器本身直接绑定动态域名，也可以直接开放Aria2远程下载的端口，不需要像以前那样还要考虑内网穿透之类的问题。其次内网的各种终端设备（手机、平板、电视机等）直接访问路由器上面的共享盘来播放视频，也无需考虑各个终端自身的防火墙设置之类的。总之，用了一年多下来还是挺不错的。</p><p>　　这样使用的过程中是没什么问题的，不过每次要远程下载东西都要在心里估摸一下U盘剩余的空间够不够，在剩余空间不够的时候下了超大的东西，造成Aria2远程下载工具结束进程还是小事，之前有一次就这样把一块64G的U盘弄掉固件了，丢数据是不值当的。（虽然U盘群里面的人都建议我不需要用USB3.0的盘来当下载盘，不过短时间内也很难找大容量的USB 2.0普通盘呢）</p><p>　　所以今天就想解决一下这个问题，至少让我下载东西之前有个页面可以给我看剩余空间就行。</p><h3 id="构思"><a href="#构思" class="headerlink" title="构思"></a>构思</h3><a id="more"></a><p>　　其实最开始的时候，我想在Aria2的下载客户端上直接添加或者找看有没有后台能显示的地方，结果没什么发现。后来也想过干脆直接把路由器的后台管理LuCI页面直接开放给外网访问，但是出于安全角度考虑还是算了。</p><p>　　想了半天最终还是考虑让路由器把剩余空间信息传递给外面，在直接通过访问外部的页面来得到数据，这样相对而言对路由器比较安全。把任务分解了一下基本上是下面这些步骤：</p><ol><li>在路由器上获取U盘剩余空间的情况并记录下来。</li><li>将记录下来的数据通过命令直接传递到我网站的服务端上。</li><li>服务端页面接收相应的数据并生成一个静态网页来显示数据。</li></ol><h3 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h3><h4 id="1、获取U盘剩余空间"><a href="#1、获取U盘剩余空间" class="headerlink" title="1、获取U盘剩余空间"></a>1、获取U盘剩余空间</h4><p>　　我们知道，OpenWrt实际上是一款基于Linux内核的系统，那么它是可以直接在命令行下使用Linux命令的。那么首先用最常用的 <code>df -h</code> 命令来获得系统剩余空间，得到的结果如下图：</p><p>　　它把每一个挂载点的剩余空间都列出来了，但是我只需要U盘的那一行，所以再后面加上一个筛选用的命令，即 <code>df -h|grep &quot;mnt&quot;</code>，这样就能够得到我想要的那一行信息了。</p><p>　　接下来为了后续传输方便，把得到的结果输出到一个 txt 文本里面去，最终这里用一行 <code>df -h|grep &quot;mnt&quot;&gt;space.txt</code><br>命令就可以了，生成了一个记录了上面的信息的 <code>space.txt</code> 文件。</p><h4 id="2、服务端编写"><a href="#2、服务端编写" class="headerlink" title="2、服务端编写"></a>2、服务端编写</h4><p>　　首先还是要先写一个服务端来构建一个接收点，最基本的功能就是接收路由器传递上来的数据流，并且把数据流输出到另外一个静态页面供人读取。因为只是自己用，没有加太多安全性的校验之类的，只做了一个检查Cookie里面的变量值，并且对提交的数据做了一个安全性的转写再输出。具体源代码如下：</p><p>　　将写好的PHP文件放入到我网站的PHP空间中去，比如地址是 <a href="http://candura.us/test.php" target="_blank" rel="noopener">http://candura.us/test.php</a> ，那么提交完数据之后它会在自身目录下生成一个静态页面来显示得到的信息，我平常只要访问 <a href="http://candura.us/space.html" target="_blank" rel="noopener">http://candura.us/space.html</a> 就可以看到我想要的U盘剩余空间了。</p><h4 id="3、传输数据"><a href="#3、传输数据" class="headerlink" title="3、传输数据"></a>3、传输数据</h4><p>　　之前喜欢偶尔捣鼓Linux，除了把它作为服务器比较稳定外，自身有很多实用的命令也很关键。所以提交数据这里，我们直接用 <code>curl</code> 命令来实现就好了。最直接的方法就是 <code>curl -d &quot;@space.txt http://candura.us/test.php&quot;</code> 一行命令搞定，不过由于我在服务端当中增加了对Cookie里面的变量校验，所以还需要使用<code>-b</code>参数来带上我设置的密码，另外为了检验输出的情况，再加上一个<code>-v</code>参数来获取返回的整个包的信息。</p><p>　　所以最终使用的命令是 <code>curl -v -b &quot;验证信息&quot; -d &quot;@space.txt http://candura.us/test.php&quot;</code> ，看到返回信息里面一个大大的 OK，就表示服务端成功接收到了。</p><h4 id="4、设置定时运行"><a href="#4、设置定时运行" class="headerlink" title="4、设置定时运行"></a>4、设置定时运行</h4><p>　　经过之前的步骤测试成功后，基本上的功能就已经完善得差不多了，接下来是把之前的命令整合到一个批处理里面，让OpenWrt设置它每隔一段时间自动提交上去就可以了。</p><p>　　Linux的Shell编程其实可以理解为Windows下面的BAT批处理，写起来还是挺简单的，基本上把之前的命令都粘贴上去就完事了，当然为了后续修改方便我还是用了一些变量来设置输出的文件、验证信息、服务端网址等……</p><p>　　写完之后保存为 <code>space.sh</code> ，然后先手动执行一下看看效果：</p><p>　　成功执行，说明这个批处理写好了，没有什么报错。接下来通过 <code>crontab –e</code> 命令来设置定时运行，在最下方增加上一行定时执行我们这个批处理的代码： <code>* */2 * * * sh /root/space.sh</code> ，里面第二个星号后面加的数字表示每2个小时执行一次。</p><h4 id="5、查看结果"><a href="#5、查看结果" class="headerlink" title="5、查看结果"></a>5、查看结果</h4><p>　　通过这一系列设置好了之后，只要在外网访问我之前PHP服务端生成的那个 <code>space.html</code> 网页文件，就可以看到一行文字。</p><p><code>/dev/sda1 29.6G 22.0G 7.6G 74% /mnt/sda1</code></p><p>　　这一行就是记录U盘空间状况的信息了，后续用Aria2来远程下载的时候，提前看一看可以判断还能不能放得下新东西。</p><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　基本上目前已经能够实现我想要的功能了，不过这里面的结果页面除了去除掉多余的空格之外没做什么太多的处理和美化，后续如果要拿这些信息单独提取内容之类的，就简单用个正则表达式匹配一下就行了。下一步打算尝试把这个数据嵌入到我常用的Ariang（一个aria2的网页客户端，感觉比yaaw要好用很多）里面去，这样就更方便了。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;起因&quot;&gt;&lt;a href=&quot;#起因&quot; class=&quot;headerlink&quot; title=&quot;起因&quot;&gt;&lt;/a&gt;起因&lt;/h3&gt;&lt;p&gt;　　之前尝试过用Beaglebone Black开发板来做个低成本的家用小型NAS&lt;a href=&quot;http://www.candura.us/posts/post-338/&quot;&gt;（见前文）&lt;/a&gt;，不过使用起来其实终归不是很方便。后来我换了一台刷成OpenWrt的路由器，用一块有一定容量的U盘来挂载在路由器上，作为远程下载的容器，各方面都方便了许多。&lt;/p&gt;
&lt;p&gt;　　首先路由器本身直接绑定动态域名，也可以直接开放Aria2远程下载的端口，不需要像以前那样还要考虑内网穿透之类的问题。其次内网的各种终端设备（手机、平板、电视机等）直接访问路由器上面的共享盘来播放视频，也无需考虑各个终端自身的防火墙设置之类的。总之，用了一年多下来还是挺不错的。&lt;/p&gt;
&lt;p&gt;　　这样使用的过程中是没什么问题的，不过每次要远程下载东西都要在心里估摸一下U盘剩余的空间够不够，在剩余空间不够的时候下了超大的东西，造成Aria2远程下载工具结束进程还是小事，之前有一次就这样把一块64G的U盘弄掉固件了，丢数据是不值当的。（虽然U盘群里面的人都建议我不需要用USB3.0的盘来当下载盘，不过短时间内也很难找大容量的USB 2.0普通盘呢）&lt;/p&gt;
&lt;p&gt;　　所以今天就想解决一下这个问题，至少让我下载东西之前有个页面可以给我看剩余空间就行。&lt;/p&gt;
&lt;h3 id=&quot;构思&quot;&gt;&lt;a href=&quot;#构思&quot; class=&quot;headerlink&quot; title=&quot;构思&quot;&gt;&lt;/a&gt;构思&lt;/h3&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="编程" scheme="https://www.candura.us/tags/%E7%BC%96%E7%A8%8B/"/>
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>继电保护装置送检整改记录</title>
    <link href="https://www.candura.us/posts/post-349/"/>
    <id>https://www.candura.us/posts/post-349/</id>
    <published>2017-12-04T09:24:54.000Z</published>
    <updated>2019-07-11T08:45:22.176Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p>本文记录了前段时间进行检验整改的思路及过程，为避免不必要的问题，文中人名、产品名均为化名。</p></blockquote><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>　　2017年11月下旬，我与A工出发到外地，在B实验室对11月初送检的“C装置”进行未通过试验项目的整改。经过半个月的整改，已成功通过各项检测试验。通过此文记录所有整改思路及方案，包括有效、疑似有效及无效的整改方案，以积累经验便于后续产品的开发。</p><h3 id="项目1：电流显示不准确"><a href="#项目1：电流显示不准确" class="headerlink" title="项目1：电流显示不准确"></a>项目1：电流显示不准确</h3><h4 id="具体问题描述"><a href="#具体问题描述" class="headerlink" title="具体问题描述"></a>具体问题描述</h4><p>　　当测试电流为50A的时候，保护装置上仅显示46.7A，超过0.5级精度的要求。</p><h4 id="前期原因分析"><a href="#前期原因分析" class="headerlink" title="前期原因分析"></a>前期原因分析</h4><p>　　电流测量回路的运算放大器放大倍数为2倍，当输入电流接近50A时，通过运算放大器进入CPU的值超过了量程，造成计算结果产生误差。</p><h4 id="解决思路"><a href="#解决思路" class="headerlink" title="解决思路"></a>解决思路</h4><a id="more"></a><ol><li>在不拆开的情况下，调整校准参数把测量精度降低到接近0.5级最大误差位置，使得50A时精度满足0.5级要求。优势是各档位（5A、20A、50A）都能符合0.5级精度要求，缺陷是误差都会达到最大。</li><li>直接修改企业标准，把企业标准上设定的最大电流从50A降到40A或45A。优势是不用直接做处理，缺陷是影响产品在报告中的性能体现。</li><li>在能拆开的情况下，通过调整运算放大器下面的电阻，将放大倍数修改为1倍（即不放大），从而直接加大了整体测量范围。此为最优方案。</li></ol><h4 id="最终整改"><a href="#最终整改" class="headerlink" title="最终整改"></a>最终整改</h4><p>　　经过电气性能测试工程师D工的现场允许下，最终采用第3个解决方案，调整放大倍数增加测量量程，完成本项试验整改。</p><h3 id="项目2：电快速瞬变脉冲群抗扰度检验"><a href="#项目2：电快速瞬变脉冲群抗扰度检验" class="headerlink" title="项目2：电快速瞬变脉冲群抗扰度检验"></a>项目2：电快速瞬变脉冲群抗扰度检验</h3><h4 id="具体问题描述-1"><a href="#具体问题描述-1" class="headerlink" title="具体问题描述"></a>具体问题描述</h4><p>　　在进行电快速瞬变脉冲群抗扰度检验时，发生保护装置误动以及重启的现象。具体情况是，在电流回路施加脉冲群的时候，经过一定时间会产生电流速断误动；在电压回路施加脉冲群的时候，偶尔会造成低电压误动，此外还造成设备重启（或者不重启但设备程序跑飞卡死）的情况。</p><h4 id="第一次整改方案"><a href="#第一次整改方案" class="headerlink" title="第一次整改方案"></a>第一次整改方案</h4><p>　　由于我与EMC试验工程师E工在电话中沟通不明晰，没有明确具体施加回路，导致在跟A工反馈时误认为是在电源回路施加脉冲群出现问题，所以前期解决思路都是针对电源回路做分析。也造成了后续到现场需要再次整理整改方案的被动。</p><p>　　推测是装置所用的电源模块不能有效去除脉冲群影响，对此提出一系列整改方案：</p><ol><li>在电源模块的5V、GND输出端串联EFT脉冲群抑制器FT-AX1D（如有需要，在24V输出端也串上一个），用于抑制电源回路进来的脉冲群干扰。</li><li>将CPU外的SP706低电压监测复位芯片从SP706T替换为SP706R，作用是将低电压复位阀值从3.08V降低至2.63V，从而减少因电源干扰造成的复位现象。</li><li>在上述两项整改均不起作用时，将CPU用铜箔覆盖并接PE地，增强CPU抗干扰能力。</li><li>在SP706低电压监测复位芯片的电源和复位引脚均并联上100uF/16V的电解电容。</li><li>在5V、3.3V端也并联上100uF/16V的电解电容。</li><li>直接在220V输入端增加MTES1-1A脉冲群抑制器。</li></ol><p>　　在现场整改时执行了上述1、2条整改方案，但由于原因并不在电源回路上，所以这个整改并不生效。经过与E工的沟通，发现之前未做整改时电源回路就已经能通过试验了。</p><h4 id="第二次整改方案"><a href="#第二次整改方案" class="headerlink" title="第二次整改方案"></a>第二次整改方案</h4><p>　　在参考之前送检通过的样机之后，推测是电压互感器抗干扰能力不足造成干扰信号耦合进入CPU。联系互感器厂家后，互感器厂家总工表示之前使用的是普通互感器，如果要进行EMC检验应该换成同型号专门处理过的互感器。所以A工当即下单采购该互感器用于替换。</p><p>　　另外，推测是运算放大器的1.65V基准源处受到干扰，以及电流、电压互感器输出端受到干扰，造成了误动的问题。电磁兼容中心的F主任建议我们可以考虑增加磁环滤除干扰，另外接地方式上也要做相应的修改。</p><p>　　最终整理出如下整改方案：</p><ol><li>更换电压互感器为送检的特制版本。</li><li>在电流和电压互感器的输出端增加三端电容与磁珠。</li><li>在电流互感器和电压互感器的输入端绕上磁环。</li><li>在1.65V基准源处并联上100uF/16V电解电容。</li><li>把CPU的地与外壳PE地从原先的通过电容连接改为直接浮空不连接。</li></ol><p>　　经过这样的整改后，设备不再出现程序跑飞和重启的情况，也不再出现低电压误动的情况。但是不管是在电流回路还是电压回路施加脉冲群，都还是会造成电流速断的误动。</p><h4 id="第三次整改方案"><a href="#第三次整改方案" class="headerlink" title="第三次整改方案"></a>第三次整改方案</h4><p>　　经过上轮整改后，试验中观察电流和电压的检测值都非常准确，所以排除了是运算放大器1.65V基准源的问题。咨询F主任后他指出，我们绕磁环的方式并不正确，没有区别开输入和输出，所以并不起作用，同时给了我们另外的柱状磁环进行测试。</p><p>　　同时A工想起此版本PCB与之前的版本有个较大区别的地方是模拟信号地（AGND）与数字信号地（DGND）是通过磁珠来连接，而之前的版本是通过小片敷铜直接连接的。另外在网上跟我司顾问G老师咨询时，他也指出“接地必须无阻抗”，而通过磁珠连接会在模拟地与数字地不平衡时产生感抗，从而影响CPU造成误动。</p><p>　　由此思路整理出如下整改方案：</p><ol><li>将AGND与DGND之间相连的磁珠去掉，改成用0Ω电阻相连，同时另外找几处AGND与DGND相近的地方一并用短接。</li><li>在电流回路与电压回路输入线上绕上柱状磁环。</li><li>将CPU的地与外壳PE地从此前的浮空改为直接短接。</li><li>将上轮整改替换后的互感器包上铜箔并将铜箔接PE地，尽量去除辐射干扰。</li></ol><p>　　经过这样整改后，成功通过各条回路的电快速瞬变脉冲群抗扰度试验，完成所有检验。</p><h4 id="整改小结"><a href="#整改小结" class="headerlink" title="整改小结"></a>整改小结</h4><p>　　经过几轮整改，总结分析出下列方案。</p><h5 id="确认有效的整改方案："><a href="#确认有效的整改方案：" class="headerlink" title="确认有效的整改方案："></a>确认有效的整改方案：</h5><ol><li>将AGND与DGND采用0Ω电阻相连，去除阻抗。</li><li>在电流互感器输入线路上绕上柱状磁环。</li><li>将电压互感器更换为厂家针对送检特制的版本。</li></ol><h5 id="疑似有效的整改方案："><a href="#疑似有效的整改方案：" class="headerlink" title="疑似有效的整改方案："></a>疑似有效的整改方案：</h5><ol><li>在电流互感器和电压互感器输出端增加三端电容。</li><li>给电流互感器和电压互感器包上铜箔防止辐射干扰。</li><li>在电压互感器输入端绕小磁环。</li></ol><h5 id="确认无效的整改方案及分析："><a href="#确认无效的整改方案及分析：" class="headerlink" title="确认无效的整改方案及分析："></a>确认无效的整改方案及分析：</h5><ol><li>将CPU的地与外壳PE地直接短接。这个整改处理在实际使用和其他项目上会造成反效果，特别是在静电试验上，对外壳打击静电很有可能通过这个短接影响到内部。而本次试验并没有产生反效果，一个原因是我们不需要重新测试其他项目，另外一个原因是实验室的大地是比较干净的大地，而现场的大地可能会有别的什么设备泄放造成干扰。所以实际产品和送检不应将CPU地与外壳PE地直接短接，还是应该通过安规电容或压敏电阻连接。</li><li>在电压回路线上增加柱状磁环。在我们进行完第三次整改通过后，去掉电压回路线上的柱状磁环重新试验并未复现重启、误动等现象，所以在此认为该项整改不起作用。</li></ol><h3 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h3><p>　　经过本次送检整改经历，学习到了很多相关的处理经验，特别是从A工身上学到很多分解处理问题的步骤和方法，受益颇多，深表敬意！同时也得到了B实验室F主任、E工、D工的大力支持，一并致谢！</p><p>　　在此将本次出差整改的过程记录下来，为以后做产品开发和维护积累经验。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;本文记录了前段时间进行检验整改的思路及过程，为避免不必要的问题，文中人名、产品名均为化名。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;　　2017年11月下旬，我与A工出发到外地，在B实验室对11月初送检的“C装置”进行未通过试验项目的整改。经过半个月的整改，已成功通过各项检测试验。通过此文记录所有整改思路及方案，包括有效、疑似有效及无效的整改方案，以积累经验便于后续产品的开发。&lt;/p&gt;
&lt;h3 id=&quot;项目1：电流显示不准确&quot;&gt;&lt;a href=&quot;#项目1：电流显示不准确&quot; class=&quot;headerlink&quot; title=&quot;项目1：电流显示不准确&quot;&gt;&lt;/a&gt;项目1：电流显示不准确&lt;/h3&gt;&lt;h4 id=&quot;具体问题描述&quot;&gt;&lt;a href=&quot;#具体问题描述&quot; class=&quot;headerlink&quot; title=&quot;具体问题描述&quot;&gt;&lt;/a&gt;具体问题描述&lt;/h4&gt;&lt;p&gt;　　当测试电流为50A的时候，保护装置上仅显示46.7A，超过0.5级精度的要求。&lt;/p&gt;
&lt;h4 id=&quot;前期原因分析&quot;&gt;&lt;a href=&quot;#前期原因分析&quot; class=&quot;headerlink&quot; title=&quot;前期原因分析&quot;&gt;&lt;/a&gt;前期原因分析&lt;/h4&gt;&lt;p&gt;　　电流测量回路的运算放大器放大倍数为2倍，当输入电流接近50A时，通过运算放大器进入CPU的值超过了量程，造成计算结果产生误差。&lt;/p&gt;
&lt;h4 id=&quot;解决思路&quot;&gt;&lt;a href=&quot;#解决思路&quot; class=&quot;headerlink&quot; title=&quot;解决思路&quot;&gt;&lt;/a&gt;解决思路&lt;/h4&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="电子" scheme="https://www.candura.us/tags/%E7%94%B5%E5%AD%90/"/>
    
  </entry>
  
  <entry>
    <title>HEXO评论从“多说”搬迁到Hashover</title>
    <link href="https://www.candura.us/posts/post-348/"/>
    <id>https://www.candura.us/posts/post-348/</id>
    <published>2017-05-17T05:24:54.000Z</published>
    <updated>2019-07-11T08:45:22.180Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="从“多说”停运说起"><a href="#从“多说”停运说起" class="headerlink" title="从“多说”停运说起"></a>从“多说”停运说起</h3><p>　　2017年3月21日，国内著名的第三方评论系统“多说”发布了一则重要通知：</p><blockquote><p>因公司业务调整，非常遗憾的向大家宣布多说项目即将关闭。 我们将于2017年6月1日正式关停服务，在此之前您可以通过后台的数据导出功能导出自己站点的评论数据。 对此给您造成的不便，我们深表歉意，感谢您的一路相伴。</p></blockquote><p>　　这则通知也让很多还在坚持做独立博客的博主们忧伤，特别是各类采用静态博客站点的博主，大部分都是多说的用户。多说的停运，意味着大家不得不关闭或者更换评论系统了。</p><p>　　最早的各类动态博客，比如WordPress、Z-blog，还有国内风靡的<a href="http://www.emlog.net" target="_blank" rel="noopener">Emlog</a>（我一直用它很多年，今年才换成Hexo）等等，都是自带评论系统的，那时第三方评论系统初现端倪，但使用量不太大。后来随着静态博客的流行，以及适应各种社交场合的需要，像国外的 Disqus，国内的多说、有言这些第三方评论逐渐取代第一方评论系统流行开来。</p><p>　　我个人也是在把博客系统换成 HEXO 之后才开始正式使用多说，当时搬迁的时候为了把Emlog的评论导入到多说还是费了一些周折（<a href="http://www.candura.us/posts/post-342/">详见此文</a>），没想到才没安定多久就要见证它停运了。</p><h3 id="寻找代替者"><a href="#寻找代替者" class="headerlink" title="寻找代替者"></a>寻找代替者</h3><p>　　其实从收到多说的公告的时候就想着要早点搬迁评论系统了，但是这段时间各种婚礼筹备等事情占用了大量精力，以致于拖到现在才来完成这项工程。</p><a id="more"></a><p>　　我使用的 Yelee 主题直接支持多说、Disqus、友言三个第三方评论系统，这也基本上是目前国内主流的第三方评论系统了，除此之外还有一些别的小众的，我也挑了一些备选。<a href="#jump1">[1]</a></p><h4 id="第三方评论系统"><a href="#第三方评论系统" class="headerlink" title="第三方评论系统"></a>第三方评论系统</h4><h5 id="Disqus"><a href="#Disqus" class="headerlink" title="Disqus"></a>Disqus</h5><p>　　说到第三方评论，这方面的巨头就是 Disqus 了，很多 HEXO 用户也是采用 Disqus 作为评论系统。我使用的 Yelee 主题支持的三大第三方评论系统之一就有它，而且因为用户多，自然各种导入方案就多，可以直接把多说的数据导入 Disqus，实现无缝启用。然而最无奈的问题就是，Disqus 被GFW墙掉了，所以只好无奈的不选择它。</p><h5 id="友言"><a href="#友言" class="headerlink" title="友言"></a>友言</h5><p>　　友言应该是比较接近多说的一款了，不过总感觉是快要步入多说后尘的产品，而且不知道是我浏览器的原因还是怎么的，点击注册老没反应，不得已只好放弃……</p><h5 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h5><p>　　其他还有搜狐旗下的“畅言”、网易旗下的“云跟帖”等等，因为界面太违和了就没用。还有韩国的“来必力”，无法支持导入多说的数据，也就此作罢。</p><h4 id="自建独立评论系统"><a href="#自建独立评论系统" class="headerlink" title="自建独立评论系统"></a>自建独立评论系统</h4><p>　　在第三方的评论系统里面选完发现没有合适的，觉得方便起见还是要自己搭建独立的评论系统好一些。自建的评论系统挑了 ISSO 和 HashOver。ISSO 是运行在 Python 环境下的系统，感觉专门为了它再配置一个环境太麻烦，最终还是选择了用 HashOver。</p><h5 id="HashOver"><a href="#HashOver" class="headerlink" title="HashOver"></a>HashOver</h5><p>　　HashOver 是一个 PHP 环境下的评论系统，支持 XML、MySQL、SQLite 几种数据储存方式，调用也十分简单。更何况主机上已经配置好了 PHP 环境，应用上去比较简单。</p><h3 id="搬迁评论系统"><a href="#搬迁评论系统" class="headerlink" title="搬迁评论系统"></a>搬迁评论系统</h3><h4 id="安装-HashOver"><a href="#安装-HashOver" class="headerlink" title="安装 HashOver"></a>安装 HashOver</h4><p>　　安装 HashOver 还是很简单的，首先到 HashOver 的<a href="https://github.com/jacobwb/hashover-next" target="_blank" rel="noopener">Github仓库</a>把源码下载下来，然后直接放到网站根目录即可。然后需要配置一下<code>hashover</code>目录下的<code>setting.php</code>文件，根据需要修改一下所需的自定义参数即可。</p><h4 id="把-HashOver-添加到-HEXO"><a href="#把-HashOver-添加到-HEXO" class="headerlink" title="把 HashOver 添加到 HEXO"></a>把 HashOver 添加到 HEXO</h4><p>　　这一步需要通过修改 HEXO 的主题源码来实现，先找到主题的<code>article.ejs</code>文件，在我使用的主题中是采用这样的 IF 嵌套来选择具体使用哪个评论的：</p><figure class="highlight gcode"><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></pre></td><td class="code"><pre><span class="line">&lt;<span class="meta">%</span> <span class="keyword">if</span> <span class="comment">(!index &amp;&amp; post.comments)</span>&#123; <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span> <span class="keyword">if</span> <span class="comment">(theme.duoshuo.on)</span> &#123; <span class="meta">%</span>&gt;</span><br><span class="line">      &lt;<span class="meta">%</span>- partial<span class="comment">('comments/duoshuo', &#123;</span></span><br><span class="line"><span class="comment">          key: post.path,</span></span><br><span class="line"><span class="comment">          title: post.title,</span></span><br><span class="line"><span class="comment">          url: config.url+url_for(post.path)</span>,</span><br><span class="line">          &#125;) <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span> &#125; else <span class="keyword">if</span> <span class="comment">(theme.youyan.on)</span> &#123; <span class="meta">%</span>&gt;</span><br><span class="line">        &lt;<span class="meta">%</span>- partial<span class="comment">('comments/youyan')</span> <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span> &#125; else <span class="keyword">if</span> <span class="comment">(theme.disqus.on)</span> &#123; <span class="meta">%</span>&gt;</span><br><span class="line">        &lt;<span class="meta">%</span>- partial<span class="comment">('comments/disqus', &#123;</span></span><br><span class="line"><span class="comment">            shortname: theme.disqus.shortname</span></span><br><span class="line"><span class="comment">          &#125;)</span> <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span> &#125; else <span class="keyword">if</span> <span class="comment">(config.disqus_shortname)</span> &#123; <span class="meta">%</span>&gt;</span><br><span class="line">        &lt;<span class="meta">%</span>- partial<span class="comment">('comments/disqus', &#123;</span></span><br><span class="line"><span class="comment">            shortname: config.disqus_shortname</span></span><br><span class="line"><span class="comment">          &#125;)</span> <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span> &#125; <span class="meta">%</span>&gt;</span><br><span class="line">&lt;<span class="meta">%</span> &#125; <span class="meta">%</span>&gt;</span><br></pre></td></tr></table></figure><p>　　通过判断<code>_config.yml</code>文件中的开关，来确定使用哪种评论系统，再调用<code>comments</code>文件夹下的不同代码。这样的话先在<code>_config.yml</code>中加入一个给 HashOver 使用的开关：</p><figure class="highlight yaml"><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="attr">hashover:</span></span><br><span class="line"><span class="attr">on:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>　　然后在<code>article.ejs</code>评论部分的IF嵌套中加入一个 HashOver 的选项：</p><figure class="highlight gcode"><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">&lt;<span class="meta">%</span> &#125; else <span class="keyword">if</span> <span class="comment">(theme.hashover.on)</span> &#123; <span class="meta">%</span>&gt;</span><br><span class="line">    &lt;<span class="meta">%</span>- partial<span class="comment">('comments/hashover')</span> <span class="meta">%</span>&gt;</span><br><span class="line">&lt;<span class="meta">%</span> &#125; <span class="meta">%</span>&gt;</span><br></pre></td></tr></table></figure><p>　　再在它的<code>comments</code>目录下新建一个<code>hashover.ejs</code>文件，在里面插入 HashOver 的调用代码即可，比如最简单的一句话<code>&lt;script type=&quot;text/javascript&quot; src=&quot;/hashover/hashover.js&quot;&gt;&lt;/script&gt;</code>，不过我在这里为了实现异步加载以及后续的CSS控制，还是这样写的：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&lt;section <span class="class"><span class="keyword">class</span></span>=<span class="string">"hashover"</span> id=<span class="string">"comments"</span>&gt;</span><br><span class="line">&lt;script type = <span class="string">"text/javascript"</span>&gt;(</span><br><span class="line"><span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line"><span class="keyword">var</span> s = <span class="built_in">document</span>.createElement(<span class="string">'script'</span>),</span><br><span class="line">t = <span class="built_in">document</span>.getElementsByTagName(<span class="string">'script'</span>)[<span class="number">0</span>];</span><br><span class="line">s.type = <span class="string">'text/javascript'</span>;</span><br><span class="line">s.async = <span class="literal">true</span>;</span><br><span class="line">s.src = <span class="string">"/hashover/hashover.js"</span>;</span><br><span class="line">t.parentNode.insertBefore(s, t);</span><br><span class="line">&#125;)();</span><br><span class="line">&lt;<span class="regexp">/script&gt;</span></span><br><span class="line"><span class="regexp">    &lt;div id="hashover"&gt;&lt;/</span>div&gt;</span><br><span class="line">&lt;<span class="regexp">/section&gt;</span></span><br></pre></td></tr></table></figure><p>　　都完成之后重新生成一下 HEXO 的页面，发现评论系统已经在页面下了。</p><h4 id="导入多说数据"><a href="#导入多说数据" class="headerlink" title="导入多说数据"></a>导入多说数据</h4><p>　　安装完评论系统就该转移数据了，把多说的数据完全转移到 HashOver 中还是要借用一些手段的。</p><h5 id="把多说数据导入-Disqus"><a href="#把多说数据导入-Disqus" class="headerlink" title="把多说数据导入 Disqus"></a>把多说数据导入 Disqus</h5><p>　　这里借用 Disqus 做一个跳板来转移数据，转移完这一步也可以直接使用 Disqus 这个评论系统了。<a href="#jump2">[2]</a></p><ol><li>在 Disqus 上面建立一个站点。</li><li>登录多说的后台，将数据导出为<code>export.json</code>。</li><li>下载转换脚本文件<a href="http://urouge.github.io/assets/migrate.php" target="_blank" rel="noopener">migrate.php</a>。</li><li>将他们一起传到 PHP 服务器上，在服务器上这个目录执行<code>php -f migrate.php</code>，运行完后会生成一个<code>disqus.xml</code>文件。</li><li>在 Disqus 后台导入<code>disqus.xml</code>文件。</li></ol><p>　　这样就把多说的数据全部导入到 Disqus 中了。</p><h5 id="将-Disqus-格式数据导入-HashOver"><a href="#将-Disqus-格式数据导入-HashOver" class="headerlink" title="将 Disqus 格式数据导入 HashOver"></a>将 Disqus 格式数据导入 HashOver</h5><p>　　正是因为在网上找到了有别人写好的转换程序，才让我最终打定主意用 HashOver。<a href="#jump3">[3]</a></p><ol><li>在这个<a href="https://github.com/gucheen/disqus-to-hashover-next" target="_blank" rel="noopener">Github仓库</a>下载 JAVA 源码到 NetBeans 或 Eclipse 中编译（记得选择JAXB插件）</li><li>在 Disqus 后台将数据导出为<code>comments.xml</code>放到编译好的程序目录。</li><li>运行编译好的 JAVA 程序，会生成<code>hashover\page</code>目录以及各个 XML 文件。</li><li>将生成的<code>page</code>目录上传到服务器上 HashOver 所在目录即可。</li></ol><p>　　在这里可能第一步会比较让人疑惑，为什么不能直接用上一步从多说导出的<code>disqus.xml</code>文件。其实上一步中导出的<code>disqus.xml</code>是被 Disqus 支持的 WordPress 格式，并非直接 Disqus 的格式，所以要分两步来再转。</p><h5 id="手动调整"><a href="#手动调整" class="headerlink" title="手动调整"></a>手动调整</h5><p>　　因为我的评论经历过从 Emlog 到多说，再从多说到 Disqus 再到 HashOver，所以一些嵌套关系被打乱了，手动调整一下之前的<code>page</code>目录下的文件名为其嵌套就可以了。</p><h3 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h3><p>　　最终调整完的评论效果像这样，基本上可以满足日常的使用了，以后再慢慢去调整相应的CSS样式来更好的适应主题风格就可以了。</p><p>　　经历了动态博客原生评论到采用第三方评论，再到自己在动态环境搭建博客系统供给静态博客使用，总有一种走了一大圈又回到原点的感觉。</p><p>　　真是生命不息，折腾不止啊……</p><h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><p><span id="jump1">1.<a href="https://blog.shuiba.co/comment-systems-recommendation" target="_blank" rel="noopener">第三方评论系统推荐</a></span></p><p><span id="jump2">2.<a href="http://urouge.github.io/migrate-to-disqus/" target="_blank" rel="noopener">多说评论迁移至Disqus</a></span></p><p><span id="jump3">3.<a href="https://blog.guchengf.me/transfer-comments-system-to-hashover/" target="_blank" rel="noopener">迁移评论系统到 hashover</a></span></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;从“多说”停运说起&quot;&gt;&lt;a href=&quot;#从“多说”停运说起&quot; class=&quot;headerlink&quot; title=&quot;从“多说”停运说起&quot;&gt;&lt;/a&gt;从“多说”停运说起&lt;/h3&gt;&lt;p&gt;　　2017年3月21日，国内著名的第三方评论系统“多说”发布了一则重要通知：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;因公司业务调整，非常遗憾的向大家宣布多说项目即将关闭。 我们将于2017年6月1日正式关停服务，在此之前您可以通过后台的数据导出功能导出自己站点的评论数据。 对此给您造成的不便，我们深表歉意，感谢您的一路相伴。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;　　这则通知也让很多还在坚持做独立博客的博主们忧伤，特别是各类采用静态博客站点的博主，大部分都是多说的用户。多说的停运，意味着大家不得不关闭或者更换评论系统了。&lt;/p&gt;
&lt;p&gt;　　最早的各类动态博客，比如WordPress、Z-blog，还有国内风靡的&lt;a href=&quot;http://www.emlog.net&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Emlog&lt;/a&gt;（我一直用它很多年，今年才换成Hexo）等等，都是自带评论系统的，那时第三方评论系统初现端倪，但使用量不太大。后来随着静态博客的流行，以及适应各种社交场合的需要，像国外的 Disqus，国内的多说、有言这些第三方评论逐渐取代第一方评论系统流行开来。&lt;/p&gt;
&lt;p&gt;　　我个人也是在把博客系统换成 HEXO 之后才开始正式使用多说，当时搬迁的时候为了把Emlog的评论导入到多说还是费了一些周折（&lt;a href=&quot;http://www.candura.us/posts/post-342/&quot;&gt;详见此文&lt;/a&gt;），没想到才没安定多久就要见证它停运了。&lt;/p&gt;
&lt;h3 id=&quot;寻找代替者&quot;&gt;&lt;a href=&quot;#寻找代替者&quot; class=&quot;headerlink&quot; title=&quot;寻找代替者&quot;&gt;&lt;/a&gt;寻找代替者&lt;/h3&gt;&lt;p&gt;　　其实从收到多说的公告的时候就想着要早点搬迁评论系统了，但是这段时间各种婚礼筹备等事情占用了大量精力，以致于拖到现在才来完成这项工程。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
      <category term="HEXO" scheme="https://www.candura.us/tags/HEXO/"/>
    
  </entry>
  
  <entry>
    <title>解决Pocket部分文章无法在KOBO中看到的问题</title>
    <link href="https://www.candura.us/posts/post-347/"/>
    <id>https://www.candura.us/posts/post-347/</id>
    <published>2017-05-12T04:55:17.000Z</published>
    <updated>2019-07-11T08:45:22.188Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h3><p>　　虽然KOBO电纸书不能像Kindle那样那么方便的进行推送，但是它原生支持Pocket(稍后阅读)是很有用的，甚至可以通过配合IFTTT来实现很多Kindle无法实现的推送。</p><p>　　于是现在看到一些长文，为了防止眼睛疲劳，都收入Pocket里面再用KOBO来阅读。然而后面我发现，有很多在Pocket列表里面的文章并没有被同步到KOBO上，所以想着要怎样去解决这个问题。</p><p>　　如图所示，一些在Pocket列表里面的，却没能同步到KOBO的列表里面。</p><h3 id="寻因"><a href="#寻因" class="headerlink" title="寻因"></a>寻因</h3><p>　　首先我Pocket列表里面的文章大部分都是知乎专栏的文章，由于有的能推送有的不能推送，所以我一直认为是Pocket服务或者是KOBO本身的问题。直到今天，<code>lywn123_</code>提醒我实际上是知乎专栏的问题，并且给出这个<a href="https://www.zhihu.com/question/21779182" target="_blank" rel="noopener">问题链接</a>。虽然这个问题下面没有给出方案，但是至少让我锁定了原因——知乎。</p><p>　　Pocket收藏的文章分两种的，有些是Pocket提取出来，在Pocket下点击之后进入Pocket的Read界面浏览的；有的是无法分析页面内容，只能记录网址，在Pocket列表中点开是跳转网址的。这两种收藏中只有前者是能够被KOBO接受推送的，而知乎专栏对Pocket的爬取并不友好，这就造成了有些文章无法推送的情况。</p><a id="more"></a><h3 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h3><h4 id="曲线救国"><a href="#曲线救国" class="headerlink" title="曲线救国"></a>曲线救国</h4><p>　　知道原因就好办了，因为之前做爬虫的时候印象中知乎专栏是提供一个API的，比如某个专栏文章地址是 <a href="https://zhuanlan.zhihu.com/p/26756186" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/26756186</a> ，通过API来读取是在 <a href="https://zhuanlan.zhihu.com/api/posts/26756186" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/api/posts/26756186</a> 这里，直接浏览器打开API是一片看不懂的纯文本，实际上这是JSON格式的文章内容，整理一下格式是这样。</p><p>　　从图上可以看到基本上专栏页面上所有需要的内容都在这个API里面了。这样可以采用一个曲线救国的办法，先写一个 php 的爬虫从知乎专栏的API中抓取所需的文章，然后把抓取到的存入 Pocket 就行了。</p><p>　　网上已经有大神写过这个爬虫了<a href="#jump1">[1]</a>，代码如下：</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">if</span> (!<span class="keyword">isset</span>($_GET[<span class="string">"page"</span>])) &#123;</span><br><span class="line">    <span class="keyword">echo</span> <span class="string">"need page id."</span>;</span><br><span class="line">    <span class="keyword">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br><span class="line">$PAGE_ID = $_GET[<span class="string">"page"</span>];</span><br><span class="line">$P_HEADERS = getallheaders();</span><br><span class="line"> </span><br><span class="line"><span class="keyword">if</span> (array_key_exists(<span class="string">"Referer"</span>, $P_HEADERS) || (<span class="keyword">isset</span>($_GET[<span class="string">"redirect"</span>]) &amp;&amp; $_GET[<span class="string">"redirect"</span>] == <span class="string">'1'</span>)) &#123;</span><br><span class="line">    header(<span class="string">"Location: https://zhuanlan.zhihu.com/p/"</span> . $PAGE_ID);</span><br><span class="line">    <span class="keyword">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">&lt;meta name=<span class="string">"referrer"</span> content=<span class="string">"never"</span>/&gt;</span><br><span class="line">&lt;meta http-equiv=<span class="string">"content-type"</span> content=<span class="string">"text/html; charset=UTF-8"</span>/&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">$PAGE_DATA = file_get_contents(<span class="string">"https://zhuanlan.zhihu.com/api/posts/"</span> . $PAGE_ID);</span><br><span class="line">$PAGE_OBJ = json_decode($PAGE_DATA);</span><br><span class="line"><span class="keyword">echo</span> <span class="string">'&lt;title&gt;'</span> . $PAGE_OBJ-&gt;&#123;<span class="string">"title"</span>&#125; . <span class="string">'&lt;/title&gt;'</span>;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;link rel=<span class="string">"shortcut icon"</span> href=<span class="string">"https://static.zhihu.com/static/favicon.ico"</span> type=<span class="string">"image/x-icon"</span>&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;h1&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">echo</span> $PAGE_OBJ-&gt;&#123;<span class="string">"title"</span>&#125;;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;/h1&gt;</span><br><span class="line">&lt;div&gt;</span><br><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">echo</span> $PAGE_OBJ-&gt;&#123;<span class="string">"content"</span>&#125;;</span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">&lt;div&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>　　把它放入 php 服务器后访问它并传入文章ID到 page 变量即可，比如 <a href="http://o.candura.us/zhihu.php?page=26756186" target="_blank" rel="noopener">http://o.candura.us/zhihu.php?page=26756186</a> ，再将这个链接抓到Pocket中就行了。</p><h4 id="Nginx-之惑"><a href="#Nginx-之惑" class="headerlink" title="Nginx 之惑"></a>Nginx 之惑</h4><p>　　本来正常来说这样就全部解决了，但是这个 php 爬虫在我的服务器中并不能正常运行。后面用探针一个个函数测试，发现是我的服务器并不支持<code>getallheaders</code>函数。</p><p>　　后来才想起，我的服务器环境是用 Nginx 构建的，并不是用 Apache，而<code>getallheaders</code>函数虽然是 php 的函数，但是是<code>apache_request_headers</code>函数的别名，无怪乎其无法用在 Nginx 下。</p><p>　　后来在《PHP Manual》中找到这个函数原型<a href="#jump2">[2]</a>，把它加入到上面那个 php 爬虫里就真的OK了。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> </span><br><span class="line"><span class="keyword">if</span> (!function_exists(<span class="string">'getallheaders'</span>)) </span><br><span class="line">&#123; </span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">getallheaders</span><span class="params">()</span> </span></span><br><span class="line"><span class="function">    </span>&#123; </span><br><span class="line">           $headers = <span class="string">''</span>; </span><br><span class="line">       <span class="keyword">foreach</span> ($_SERVER <span class="keyword">as</span> $name =&gt; $value) </span><br><span class="line">       &#123; </span><br><span class="line">           <span class="keyword">if</span> (substr($name, <span class="number">0</span>, <span class="number">5</span>) == <span class="string">'HTTP_'</span>) </span><br><span class="line">           &#123; </span><br><span class="line">               $headers[str_replace(<span class="string">' '</span>, <span class="string">'-'</span>, ucwords(strtolower(str_replace(<span class="string">'_'</span>, <span class="string">' '</span>, substr($name, <span class="number">5</span>)))))] = $value; </span><br><span class="line">           &#125; </span><br><span class="line">       &#125; </span><br><span class="line">       <span class="keyword">return</span> $headers; </span><br><span class="line">    &#125; </span><br><span class="line">&#125; </span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h4 id="成型"><a href="#成型" class="headerlink" title="成型"></a>成型</h4><p>　　将最终的<a href="https://github.com/icandura/zhzl_pocket/blob/master/zhihu.php" target="_blank" rel="noopener">完整代码</a>放入服务器上访问就搞定了。</p><p>　　最终，这样加入Pocket的文章成功的同步到KOBO上了。</p><h3 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h3><p><span id="jump1">1.<a href="https://zohead.com/archives/php-zhihu-pocket/" target="_blank" rel="noopener">简单PHP实现Pocket抓取知乎专栏文章</a></span></p><p><span id="jump2">2.<a href="http://php.net/manual/en/function.getallheaders.php" target="_blank" rel="noopener">PHP: getallheaders - Manual</a></span></p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;开始&quot;&gt;&lt;a href=&quot;#开始&quot; class=&quot;headerlink&quot; title=&quot;开始&quot;&gt;&lt;/a&gt;开始&lt;/h3&gt;&lt;p&gt;　　虽然KOBO电纸书不能像Kindle那样那么方便的进行推送，但是它原生支持Pocket(稍后阅读)是很有用的，甚至可以通过配合IFTTT来实现很多Kindle无法实现的推送。&lt;/p&gt;
&lt;p&gt;　　于是现在看到一些长文，为了防止眼睛疲劳，都收入Pocket里面再用KOBO来阅读。然而后面我发现，有很多在Pocket列表里面的文章并没有被同步到KOBO上，所以想着要怎样去解决这个问题。&lt;/p&gt;




&lt;p&gt;　　如图所示，一些在Pocket列表里面的，却没能同步到KOBO的列表里面。&lt;/p&gt;
&lt;h3 id=&quot;寻因&quot;&gt;&lt;a href=&quot;#寻因&quot; class=&quot;headerlink&quot; title=&quot;寻因&quot;&gt;&lt;/a&gt;寻因&lt;/h3&gt;&lt;p&gt;　　首先我Pocket列表里面的文章大部分都是知乎专栏的文章，由于有的能推送有的不能推送，所以我一直认为是Pocket服务或者是KOBO本身的问题。直到今天，&lt;code&gt;lywn123_&lt;/code&gt;提醒我实际上是知乎专栏的问题，并且给出这个&lt;a href=&quot;https://www.zhihu.com/question/21779182&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;问题链接&lt;/a&gt;。虽然这个问题下面没有给出方案，但是至少让我锁定了原因——知乎。&lt;/p&gt;
&lt;p&gt;　　Pocket收藏的文章分两种的，有些是Pocket提取出来，在Pocket下点击之后进入Pocket的Read界面浏览的；有的是无法分析页面内容，只能记录网址，在Pocket列表中点开是跳转网址的。这两种收藏中只有前者是能够被KOBO接受推送的，而知乎专栏对Pocket的爬取并不友好，这就造成了有些文章无法推送的情况。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="电纸书" scheme="https://www.candura.us/tags/%E7%94%B5%E7%BA%B8%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>做了个CoolReader For Kobo的汉化(附简要汉化教程)</title>
    <link href="https://www.candura.us/posts/post-346/"/>
    <id>https://www.candura.us/posts/post-346/</id>
    <published>2017-02-20T11:25:17.000Z</published>
    <updated>2019-07-11T08:45:22.180Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>　　虽然现在主流的电纸书是Kindle，但是我一直以来都比较喜欢KOBO这个品牌的产品，可以研究折腾的东西很多。我之前是用的6寸的Kobo Touch(N905B)，不过前段时间有问题用不了了就挂在咸鱼出给有需要替换维修的人了。后面又入了一台Kobo Aura HD，大家主流的系统搭配都是原生系统<code>nickel</code>搭配<code>KoReader</code>，不过我以前一直习惯用<code>CoolReader</code>最近去官网发现有新版本了，但是没有合适的汉化版，于是花了点时间自己汉化了一下。</p><h3 id="精简汉化版小介绍"><a href="#精简汉化版小介绍" class="headerlink" title="精简汉化版小介绍"></a>精简汉化版小介绍</h3><h4 id="CoolReader-简介"><a href="#CoolReader-简介" class="headerlink" title="CoolReader 简介"></a>CoolReader 简介</h4><p>　　这里的<code>CoolReader</code>其实是<code>vlasovsoft</code>这个团队移植到电子阅读器设备的版本。貌似这个<code>vlasovsoft</code>工具主打的是国际象棋小程序啊，连<a href="http://http://pbchess.vlasovsoft.net/" title="vlasovsoft官网" target="_blank" rel="noopener">官方网站</a>都是用<code>pbchess</code>来打头。它的官方原版安装上以后除了<code>CoolReader</code>外还有国际象棋、数独等插件，都可以直接在电纸书上运行。</p><p>　　我这里汉化的版本是官网的<code>2017.02.02</code>版本，比我以前在N905B上面用的15年的版本新了很多，不过其中的<code>CoolReader</code>部分使用起来没发现有什么更新，不过这个版本的<code>vlasovsoft</code>内置了一个新的小插件<code>OPDS</code>，这下也可以直接找国内的支持opds的图书源来看书了。</p><a id="more"></a><h4 id="精简列表"><a href="#精简列表" class="headerlink" title="精简列表"></a>精简列表</h4><p>　　虽然官方<code>vlasovsoft</code>工具下面有很多插件，但是大部分都是小游戏或者没太用得上的东西，而且小游戏那些都是试用版本，正式版需要购买才可试用（还好这里面搭配的<code>CoolReader</code>是免费的），所以我把这些都精简掉了。</p><p>　　精简掉的插件有这些</p><ol><li>Chess        国际象棋</li><li>Checkers        西洋跳棋</li><li>Sokoban        推箱子</li><li>Reversi        黑白棋</li><li>Gomoku        五子棋</li><li>Sudoku        数独</li><li>Calculator    计算器</li><li>Notepad        记事本</li></ol><p>　　另外我自行增加了两个中文的OPDS书籍源，分别是<a href="http://idesks.me/opds" title="书桌" target="_blank" rel="noopener">书桌</a>和<a href="http://blah.me/opds/index.atom" title="老郁藏书阁" target="_blank" rel="noopener">老郁藏书阁</a>。</p><h4 id="效果展示"><a href="#效果展示" class="headerlink" title="效果展示"></a>效果展示</h4><h5 id="系统设置"><a href="#系统设置" class="headerlink" title="系统设置"></a>系统设置</h5><h5 id="CoolReader"><a href="#CoolReader" class="headerlink" title="CoolReader"></a>CoolReader</h5><h5 id="FileManager"><a href="#FileManager" class="headerlink" title="FileManager"></a>FileManager</h5><h5 id="OPDS"><a href="#OPDS" class="headerlink" title="OPDS"></a>OPDS</h5><h4 id="汉化版下载"><a href="#汉化版下载" class="headerlink" title="汉化版下载"></a>汉化版下载</h4><p>下载地址: <a href="https://pan.baidu.com/s/1dFGFQHr" target="_blank" rel="noopener">https://pan.baidu.com/s/1dFGFQHr</a> 提取码: 5qsx</p><h3 id="简要汉化教程"><a href="#简要汉化教程" class="headerlink" title="简要汉化教程"></a>简要汉化教程</h3><p>　　由于这个程序的UI都是用Qt来制作的，所以里面都是用的<code>.qm</code>为后缀的语言包文件，刚好前段时间在学习PyQt的时候了解过一些Qt，于是找来<code>Qt Linguist</code>这个软件，打开一个其他语言的文件，然后将其内容做汉化即可。</p><p>　　把<code>.qm</code>文件拖进<code>Qt Linguist</code>里面后默认会弹出原始语言和翻译后的语言选择窗口，直接把下面的语言选择为<code>Chinese</code>再确认即可打开文件。</p><p>　　左边会列出这个语言包所包含的应用项目，中间会列出这个项目下的词条原始文本(一般是英文)。首先点击词条，下面会弹出一个编辑框，把中间那一栏修改成对应的中文即可。</p><p>　　修改过的条目在<code>Source text</code>中会变成问号，这个时候不用管它，等所有词条编辑完的时候再用打勾按键(如下图)一个个检查顺便标记为完成即可。</p><p>　　完成语言包的编辑之后，将其复制到各自的<code>i18n</code>文件夹下面即可。</p>]]></content>
    
    <summary type="html">
    
      &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;　　虽然现在主流的电纸书是Kindle，但是我一直以来都比较喜欢KOBO这个品牌的产品，可以研究折腾的东西很多。我之前是用的6寸的Kobo Touch(N905B)，不过前段时间有问题用不了了就挂在咸鱼出给有需要替换维修的人了。后面又入了一台Kobo Aura HD，大家主流的系统搭配都是原生系统&lt;code&gt;nickel&lt;/code&gt;搭配&lt;code&gt;KoReader&lt;/code&gt;，不过我以前一直习惯用&lt;code&gt;CoolReader&lt;/code&gt;最近去官网发现有新版本了，但是没有合适的汉化版，于是花了点时间自己汉化了一下。&lt;/p&gt;
&lt;h3 id=&quot;精简汉化版小介绍&quot;&gt;&lt;a href=&quot;#精简汉化版小介绍&quot; class=&quot;headerlink&quot; title=&quot;精简汉化版小介绍&quot;&gt;&lt;/a&gt;精简汉化版小介绍&lt;/h3&gt;&lt;h4 id=&quot;CoolReader-简介&quot;&gt;&lt;a href=&quot;#CoolReader-简介&quot; class=&quot;headerlink&quot; title=&quot;CoolReader 简介&quot;&gt;&lt;/a&gt;CoolReader 简介&lt;/h4&gt;&lt;p&gt;　　这里的&lt;code&gt;CoolReader&lt;/code&gt;其实是&lt;code&gt;vlasovsoft&lt;/code&gt;这个团队移植到电子阅读器设备的版本。貌似这个&lt;code&gt;vlasovsoft&lt;/code&gt;工具主打的是国际象棋小程序啊，连&lt;a href=&quot;http://http://pbchess.vlasovsoft.net/&quot; title=&quot;vlasovsoft官网&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;官方网站&lt;/a&gt;都是用&lt;code&gt;pbchess&lt;/code&gt;来打头。它的官方原版安装上以后除了&lt;code&gt;CoolReader&lt;/code&gt;外还有国际象棋、数独等插件，都可以直接在电纸书上运行。&lt;/p&gt;
&lt;p&gt;　　我这里汉化的版本是官网的&lt;code&gt;2017.02.02&lt;/code&gt;版本，比我以前在N905B上面用的15年的版本新了很多，不过其中的&lt;code&gt;CoolReader&lt;/code&gt;部分使用起来没发现有什么更新，不过这个版本的&lt;code&gt;vlasovsoft&lt;/code&gt;内置了一个新的小插件&lt;code&gt;OPDS&lt;/code&gt;，这下也可以直接找国内的支持opds的图书源来看书了。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="电纸书" scheme="https://www.candura.us/tags/%E7%94%B5%E7%BA%B8%E4%B9%A6/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu Server 16.04 手动配置VPN全过程</title>
    <link href="https://www.candura.us/posts/post-345/"/>
    <id>https://www.candura.us/posts/post-345/</id>
    <published>2017-02-18T09:25:17.000Z</published>
    <updated>2019-07-11T08:45:21.988Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>　　这几天搬办公室，搬完办公室之后有几台之前在实验室用的不连内网的电脑现在终于也可以连上内网了。但是还没有想去配置访问外网，一来去找网管开几台新电脑的权限太麻烦，二来这些电脑除了偶尔要下点资料外本来也没什么必要连外网。于是想到了给之前那台实验室用的服务器配置个VPN，这几台电脑偶尔需要的时候就通过VPN连接过去访问就能满足日常需要了。</p><h3 id="安装VPN服务"><a href="#安装VPN服务" class="headerlink" title="安装VPN服务"></a>安装VPN服务</h3><p>　　Linux上面配置VPN的途径很多，简单起见我还是决定用<code>pptpd</code>来进行配置。</p><h4 id="安装pptpd"><a href="#安装pptpd" class="headerlink" title="安装pptpd"></a>安装<code>pptpd</code></h4><p><code>sudo apt install pptpd</code></p><h4 id="设置VPN连接的虚拟IP"><a href="#设置VPN连接的虚拟IP" class="headerlink" title="设置VPN连接的虚拟IP"></a>设置VPN连接的虚拟IP</h4><p><code>sudo vi /etc/pptpd.conf</code></p><p>　　这个配置文件下面有<code>localip</code>和<code>remoteip</code>两个主要选项，一个是VPN里面的本地IP和分配给客户端的IP。</p><figure class="highlight css"><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="selector-tag">localip</span> 10<span class="selector-class">.1</span><span class="selector-class">.0</span><span class="selector-class">.1</span></span><br><span class="line"><span class="selector-tag">remoteip</span> 10<span class="selector-class">.1</span><span class="selector-class">.0</span><span class="selector-class">.2-10</span><span class="selector-class">.1</span><span class="selector-class">.0</span><span class="selector-class">.10</span></span><br></pre></td></tr></table></figure><a id="more"></a><h4 id="配置DNS"><a href="#配置DNS" class="headerlink" title="配置DNS"></a>配置DNS</h4><p><code>sudo vi /etc/ppp/pptpd-options</code></p><p>　　给这个配置文件写上DNS服务器地址</p><figure class="highlight css"><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="selector-tag">ms-dns</span> 114<span class="selector-class">.114</span><span class="selector-class">.114</span><span class="selector-class">.114</span></span><br><span class="line"><span class="selector-tag">ms-dns</span> 114<span class="selector-class">.114</span><span class="selector-class">.115</span><span class="selector-class">.115</span></span><br></pre></td></tr></table></figure><p>　　顺便留意一下这个配置文件的第一行，默认是<code>name pptpd</code>，即VPN服务的名称。</p><h4 id="添加VPN连接用户"><a href="#添加VPN连接用户" class="headerlink" title="添加VPN连接用户"></a>添加VPN连接用户</h4><p><code>sudo vi /etc/ppp/chap-secrets</code></p><p>　　这里面主要分了4咧，分别是账号、服务名称、密码、客户端IP地址。账号和密码不用多说，服务器名称就是之前上一个配置中的名称，默认<code>pptpd</code>，如果上一个配置选项修改了这个名称的话，这里也要修改成相对应的。IP地址就是允许使用这个账号登录的客户端地址，如果不需要限定就直接使用通配符<code>*</code>就可以了。我的配置如下：</p><p><code>user    pptpd    &quot;password&quot;    *</code></p><p>　　这几个步骤的完成后，通过命令<code>sudo /etc/init.d/pptpd restart</code>重启一下pptpd服务，其他电脑就可以通过VPN连接到这台服务器了。</p><h3 id="设置NAT转发"><a href="#设置NAT转发" class="headerlink" title="设置NAT转发"></a>设置NAT转发</h3><p>　　虽然配置完成可以通过VPN连接服务器了，但是似乎还是不能访问网络，接下来要继续配置NAT转发才可以。</p><h4 id="开启IP转发"><a href="#开启IP转发" class="headerlink" title="开启IP转发"></a>开启IP转发</h4><p><code>sudo vi /etc/sysctl.conf</code></p><p>　　在这个配置文件中搜索<code>net.ipv4.ip_forward</code>这个选项，去掉前面的注释，整行变成<code>net.ipv4.ip_forward=1</code>。随后重新加载配置<code>sudo sysctl -p</code>使其生效。</p><h4 id="添加NAT转发规则"><a href="#添加NAT转发规则" class="headerlink" title="添加NAT转发规则"></a>添加NAT转发规则</h4><p>　　在增加转发规则之前，首先用<code>ifconfig</code>查看一下当前的联网网卡，一般是<code>eth0</code>，不过我这里是<code>enp4s0</code>，记住这个网卡。然后执行下面的命令增加转发规则</p><figure class="highlight shell"><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">sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o enp4s0 -j MASQUERADE</span><br><span class="line">sudo iptables -A FORWARD -p tcp --syn -s 10.1.0.0/24 -j TCPMSS --set-mss 1300</span><br></pre></td></tr></table></figure><p>　　创建好规则之后，客户端上面就可以通过VPN来上网了，不过下次服务器重启之后不会记住这个规则，所以需要继续配置。</p><h4 id="保存转发规则"><a href="#保存转发规则" class="headerlink" title="保存转发规则"></a>保存转发规则</h4><p>　　首先通过命令<code>sudo iptables-save &gt; /etc/iptables-rules</code>来把之前建立的转发规则保存到文件中。不过这时候发生了个小意外。</p><h5 id="小插曲1：Permission-denied"><a href="#小插曲1：Permission-denied" class="headerlink" title="小插曲1：Permission denied"></a>小插曲1：Permission denied</h5><p>　　执行完命令返回错误提示<code>-bash: /etc/iptables-rules: Permission denied</code>，我明明使用了<code>sudo</code>，如果不行的话干脆用<code>su</code>命令切换到真正的<code>root</code>用户再来执行，不过又发生了另外一个小意外。</p><h5 id="小插曲2：Authentication-failure"><a href="#小插曲2：Authentication-failure" class="headerlink" title="小插曲2：Authentication failure"></a>小插曲2：Authentication failure</h5><p>　　尝试切换到<code>root</code>用户的时候又提示<code>su:Authentication failure</code>，后面才想起我一直都没有给<code>root</code>用户设置过密码，用<code>sudo passwd root</code>命令给<code>root</code>用户设置好密码后面就都OK了。</p><p>　　在<code>root</code>用户下保存转发规则到文件之后就可以退出<code>root</code>用户了。然后再修改网卡的配置文件。</p><p><code>sudo vi /etc/network/interfaces</code></p><p>　　在这个配置文件的<code>enp4s0</code>的这个小节下面加上一句<code>pre-up iptables-restore &lt; /etc/iptables-rules</code>，这样只要网卡被启动就能加载这些规则。</p><h3 id="待解决的小问题"><a href="#待解决的小问题" class="headerlink" title="待解决的小问题"></a>待解决的小问题</h3><p>　　执行完上面的过程基本上整个架设VPN服务就架设好了，但是还是遇到一些小问题。就是重启服务器之后就不能启动了，查看状态提示是如下。</p><figure class="highlight shell"><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">user@UBUNTU:~$ sudo /etc/init.d/pptpd status</span><br><span class="line">[sudo] password for user:</span><br><span class="line">● pptpd.service - PoPToP Point to Point Tunneling Server</span><br><span class="line">   Loaded: loaded (/lib/systemd/system/pptpd.service; disabled; vendor preset: enabled)</span><br><span class="line">   Active: inactive (dead)</span><br></pre></td></tr></table></figure><p>　　必须手动执行<code>sudo /etc/init.d/pptpd restart</code>之后才能正常启动<code>pptpd</code>服务，此时的状态提示如下。</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">user@UBUNTU:~$ sudo /etc/init.d/pptpd status</span><br><span class="line">● pptpd.service - PoPToP Point to Point Tunneling Server</span><br><span class="line">   Loaded: loaded (/lib/systemd/system/pptpd.service; disabled; vendor preset: enabled)</span><br><span class="line">   Active: active (running) since Sat 2017-02-18 10:53:18 CST; 3s ago</span><br><span class="line"> Main PID: 1521 (pptpd)</span><br><span class="line">    Tasks: 1</span><br><span class="line">   Memory: 148.0K</span><br><span class="line">      CPU: 2ms</span><br><span class="line">   CGroup: /system.slice/pptpd.service</span><br><span class="line">           └─1521 /usr/sbin/pptpd --fg</span><br><span class="line"></span><br><span class="line">Feb 18 10:53:18 UBUNTUsystemd[1]: Started PoPToP Point to Point Tunnel...r.</span><br><span class="line">Feb 18 10:53:18 UBUNTUpptpd[1521]: MGR: Maximum of 100 connections redu...n</span><br><span class="line">Feb 18 10:53:18 UBUNTUpptpd[1521]: MGR: Manager process started</span><br><span class="line">Feb 18 10:53:18 UBUNTUpptpd[1521]: MGR: Maximum of 99 connections available</span><br><span class="line">Hint: Some lines were ellipsized, use -l to show in full.</span><br></pre></td></tr></table></figure><p>　　这个还需要继续查资料看看怎么处理……</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;　　这几天搬办公室，搬完办公室之后有几台之前在实验室用的不连内网的电脑现在终于也可以连上内网了。但是还没有想去配置访问外网，一来去找网管开几台新电脑的权限太麻烦，二来这些电脑除了偶尔要下点资料外本来也没什么必要连外网。于是想到了给之前那台实验室用的服务器配置个VPN，这几台电脑偶尔需要的时候就通过VPN连接过去访问就能满足日常需要了。&lt;/p&gt;
&lt;h3 id=&quot;安装VPN服务&quot;&gt;&lt;a href=&quot;#安装VPN服务&quot; class=&quot;headerlink&quot; title=&quot;安装VPN服务&quot;&gt;&lt;/a&gt;安装VPN服务&lt;/h3&gt;&lt;p&gt;　　Linux上面配置VPN的途径很多，简单起见我还是决定用&lt;code&gt;pptpd&lt;/code&gt;来进行配置。&lt;/p&gt;
&lt;h4 id=&quot;安装pptpd&quot;&gt;&lt;a href=&quot;#安装pptpd&quot; class=&quot;headerlink&quot; title=&quot;安装pptpd&quot;&gt;&lt;/a&gt;安装&lt;code&gt;pptpd&lt;/code&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;sudo apt install pptpd&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;设置VPN连接的虚拟IP&quot;&gt;&lt;a href=&quot;#设置VPN连接的虚拟IP&quot; class=&quot;headerlink&quot; title=&quot;设置VPN连接的虚拟IP&quot;&gt;&lt;/a&gt;设置VPN连接的虚拟IP&lt;/h4&gt;&lt;p&gt;&lt;code&gt;sudo vi /etc/pptpd.conf&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;　　这个配置文件下面有&lt;code&gt;localip&lt;/code&gt;和&lt;code&gt;remoteip&lt;/code&gt;两个主要选项，一个是VPN里面的本地IP和分配给客户端的IP。&lt;/p&gt;
&lt;figure class=&quot;highlight css&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;selector-tag&quot;&gt;localip&lt;/span&gt; 10&lt;span class=&quot;selector-class&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;selector-tag&quot;&gt;remoteip&lt;/span&gt; 10&lt;span class=&quot;selector-class&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.2-10&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.0&lt;/span&gt;&lt;span class=&quot;selector-class&quot;&gt;.10&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>一次艰难的U盘安装Ubuntu Server过程</title>
    <link href="https://www.candura.us/posts/post-344/"/>
    <id>https://www.candura.us/posts/post-344/</id>
    <published>2017-01-21T09:25:17.000Z</published>
    <updated>2019-07-11T08:45:22.184Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>　　之前办公室有台服务器用来托管代码和库存查询用，不过之前安装的是 Ubuntu 14.04 的 Desktop 版本，所以运行很慢。这段时间准备搬办公室了，也想着顺便在过年之前把这台服务器重新整理一下，于是决定给它全新安装 Ubuntu Server 16.04.1 LTS 的版本。结果这次安装遇上了好几个坑，记录下来防止以后再遇到的时候不会解决。</p><h3 id="用老毛桃载入ISO镜像"><a href="#用老毛桃载入ISO镜像" class="headerlink" title="用老毛桃载入ISO镜像"></a>用老毛桃载入ISO镜像</h3><p>　　手头上没有多余的U盘拿来专门做安装U盘，不过有一块经常用来做系统维护的老毛桃U盘。印象中启动的时候有其中一个选项是可以引导进入自定义映像，所以首先把下载下来的ISO镜像拷到U盘里面。</p><a id="more"></a><p>　　用这个U盘插上主机，选择进入自定义映像，结果提示说找不到<code>MYEXT</code>文件夹，然后回车结束就退出来了。第二次再进去出现这个提示我没有直接按回车，而是按了<code>h</code>看帮助，结果输出了一个<code>RUN&gt;&gt;</code>开头的控制台，在这里输入我放置ISO镜像的文件夹，结果竟然能找到了。然后顺利弹出了选择ISO镜像的界面，在这里用方向键选择Ubuntu Server的安装镜像之后就相当于用镜像光盘来启动了。</p><h3 id="安装过程提示找不到-CD-ROM-错误"><a href="#安装过程提示找不到-CD-ROM-错误" class="headerlink" title="安装过程提示找不到 CD-ROM 错误"></a>安装过程提示找不到 CD-ROM 错误</h3><p>　　进入安装镜像之后选择安装系统，开始一切都很顺利，比如选择语言、地区、时区等等。就在我以为能够愉快的安装完成的时候，突然弹出了找不到 CD-ROM 的错误：<code>Incorrect CD-ROM detected</code></p><p>　　点击<code>Continue</code>之后提示说这一步安装失败，让我们重新挂载CD-ROM之后再继续。</p><p>　　后来上网找了很多信息发现应该这样解决。</p><ol><li>在<code>Ubuntu installer main menu</code>菜单中进入<code>Execute a shell</code>选项</li><li>在Shell下面先用<code>ls /dev/sd*</code>命令查看当前U盘挂载的位置</li><li>挂载U盘到某个目录</li><li>挂载U盘中的ISO镜像到<code>/cdrom</code>目录</li><li>挂载完成检查<code>/cdrom</code>目录内容无误退出</li></ol><p>具体命令如下</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">ls /dev/sd*</span><br><span class="line">mkdir ubt</span><br><span class="line">mount /dev/sdb1 /ubt</span><br><span class="line">mount /ubt/GHO/ubuntu-16.04.1-server-i386.iso /cdrom</span><br><span class="line">ls /cdrom</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>　　这些步骤执行完成后，重新回到<code>Detect and mount CD-ROM</code>这个步骤就能继续安装了。</p><h3 id="无法进行“Configure-the-package-manager”步骤"><a href="#无法进行“Configure-the-package-manager”步骤" class="headerlink" title="无法进行“Configure the package manager”步骤"></a>无法进行“Configure the package manager”步骤</h3><p>　　正常情况下安装到这一步的时候会弹出一个窗口提示是否需要安装什么软件，比如我通常会选择先让系统装好”OpenSSH Server”之类的。但是这次到这个步骤之后又直接退回<code>Ubuntu installer main menu</code>菜单了，后面不管我是选择<code>Configure the package manager</code>还是<code>Select and install software</code>步骤都是跳出来。</p><p>　　刚开始我选择直接进入下一步安装GRUB引导，也能安装成功并且一直到最后的<code>Finish the installation</code>。可是安装完成进入系统之后发现，几乎是任何哪怕是日常使用必须的软件都没有装，我想用<code>apt-get</code>来安装组件的时候弹出来的源竟然是<code>cdrom://</code>开头的，而且即便我把<code>/etc/apt/sources.list</code>这个文件里面的源修改了之后还是无法使用。</p><p>　　于是搞了半天还是干脆从头再来，重新安装。这次跳出来之后我先继续选择安装 GRUB 引导，不过在<code>Finish the installation</code>这个环节，我没有<code>Continue</code>，而是选择<code>Go Back</code>。</p><p>　　然后在这个时候再回去进行<code>Configure the package manager</code>。</p><p>　　这回终于能够看到熟悉的安装各种软件包的过程了。</p><p>　　这样最终成功的完成了本次用U盘来安装 Ubuntu Server 的过程。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;　　之前办公室有台服务器用来托管代码和库存查询用，不过之前安装的是 Ubuntu 14.04 的 Desktop 版本，所以运行很慢。这段时间准备搬办公室了，也想着顺便在过年之前把这台服务器重新整理一下，于是决定给它全新安装 Ubuntu Server 16.04.1 LTS 的版本。结果这次安装遇上了好几个坑，记录下来防止以后再遇到的时候不会解决。&lt;/p&gt;
&lt;h3 id=&quot;用老毛桃载入ISO镜像&quot;&gt;&lt;a href=&quot;#用老毛桃载入ISO镜像&quot; class=&quot;headerlink&quot; title=&quot;用老毛桃载入ISO镜像&quot;&gt;&lt;/a&gt;用老毛桃载入ISO镜像&lt;/h3&gt;&lt;p&gt;　　手头上没有多余的U盘拿来专门做安装U盘，不过有一块经常用来做系统维护的老毛桃U盘。印象中启动的时候有其中一个选项是可以引导进入自定义映像，所以首先把下载下来的ISO镜像拷到U盘里面。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>【牛刀杀鸡】Ubuntu搭建cloud9环境在线管理HEXO博客</title>
    <link href="https://www.candura.us/posts/post-343/"/>
    <id>https://www.candura.us/posts/post-343/</id>
    <published>2017-01-17T12:16:14.000Z</published>
    <updated>2019-07-11T08:45:21.996Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>　　把博客环境更改为HEXO有一段时间了，使用起来还是有一些不习惯的地方的。我是把HEXO架设在自己的VPS上面，而不是像其他人那样在本地架设好后通过<code>hexo d</code> 命令来发布到Github之类的地方。所以我现在写博文的方式变成了先在本地写Markdown格式的文字，然后再上传到VPS的 <code>_post</code> 目录中。这样一来要是在外地出差或者不在常用电脑上不方便连接VPS的时候就很不方便了，最好是能够像以前用各种博客程序一样直接在后台发布文章，再交由系统自动生成静态页面。</p><h3 id="hexo-admin-与-hexo-hey-优劣"><a href="#hexo-admin-与-hexo-hey-优劣" class="headerlink" title="hexo-admin 与 hexo-hey 优劣"></a>hexo-admin 与 hexo-hey 优劣</h3><p>　　通过一些了解，我尝试了 hexo-admin 或者 hexo-hey 两款补充hexo后台功能的插件，发现他们各有优劣。</p><p>　　hexo-admin 的优势是</p><ul><li>除了创建post文章外还能创建page页面</li><li>后台编辑器支持mathJax等常用插件</li><li>可用复制粘贴方式自动复制图片</li></ul><p>　　相比之下，hexo-hey 的最大优势是可以在后台修改模板的<code>_config.yml</code>文件，对于刚建立博客，模板还需调整设置的方面还略多，所以这一点最为方便。但上述的其他几点就不如 hexo-admin 了。虽然看起来 hexo-admin 的优势很多，但是还有一点让我略感遗憾的是，复制粘贴进来的图片默认放到<code>img</code>文件夹，当整个博客图片内容多的时候不好管理，所以我一般还是采用建立与 md 文件同名的资源文件夹的方式来管理相关资源，这样引用和管理都比较方便。另外一点就是不管是 hexo-hey 还是 hexo-admin 都需要通过<code>hexo s</code>实时运行着服务器才能使用，我一般是不启动这个服务器，而是把 hexo 生成的静态文件直接软链给 nginx 服务器的站点来访问，以节省系统资源。</p><h3 id="Cloud9-IDE-与-Coding-WebIDE"><a href="#Cloud9-IDE-与-Coding-WebIDE" class="headerlink" title="Cloud9 IDE 与 Coding WebIDE"></a>Cloud9 IDE 与 Coding WebIDE</h3><p>　　总而言之还是能够自己管控整个后台最方便，但是又不方便时时刻刻连入VPS，所以后面鬼使神差般的选择了在线IDE环境。在线IDE环境其实就是可以通过浏览器在线访问的一个编程环境，用来编写程序项目都没问题，用来管理一个小小的博客自然也不在话下，这也是为什么说是杀鸡用牛刀。当然选择这个除了管理博客之外，还打算以后可以很方便的在不同环境下写一些爬虫之类的小程序直接跑在VPS上。目前除了著名的 Cloud9 IDE之外，还有国内的“Coding.net”推出的 <code>Coding WebIDE</code>。但是因为懒得装JAVA环境，所以没选<code>Coding WebIDE</code>，最终决定采用<code>Cloud9 IDE</code>。</p><a id="more"></a><h2 id="搭建-Cloud9-IDE-环境"><a href="#搭建-Cloud9-IDE-环境" class="headerlink" title="搭建 Cloud9 IDE 环境"></a>搭建 Cloud9 IDE 环境</h2><p>　　搭建 Cloud9 IDE 的环境还是比较简单的，按照<a href="https://github.com/c9/core" target="_blank" rel="noopener">官方Github</a>上的步骤来一步步安装即可，就是里面有一些前置环境的坑要填。</p><h3 id="安装前置环境"><a href="#安装前置环境" class="headerlink" title="安装前置环境"></a>安装前置环境</h3><p>　　官方的安装步骤中提到的前置需要安装的内容主要是Git、NodeJS这些，这些其实在我搭建 HEXO 的时候基本上都已经装好了，但是还是在安装 IDE 的时候遇到了问题，主要错误提示如下：</p><pre><code>Error: `make` failed with exit code:</code></pre><p>　　原因是我在VPS上把常用的编译组件卸载掉了用以精简系统，所以重新把这些编译用到的组件安装上就没什么问题了</p><pre><code>sudo apt-get install build-essential g++</code></pre><h3 id="安装-Cloud9-IDE"><a href="#安装-Cloud9-IDE" class="headerlink" title="安装 Cloud9 IDE"></a>安装 Cloud9 IDE</h3><p>　　填好前置环境的坑之后基本上安装 IDE 的过程中就不会遇到什么报错了，按照官方步骤先克隆Git仓库到本地，然后执行安装脚本就行。</p><figure class="highlight shell"><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">git clone --depth=1 git://github.com/c9/core.git c9sdk</span><br><span class="line">cd c9sdk</span><br><span class="line">scripts/install-sdk.sh</span><br></pre></td></tr></table></figure><p>　　我在这一步唯一与官方推荐方法不同的地方是在克隆的时候增加了<code>--depth=1</code>这个参数，加上这个参数只克隆最近一层，而没有把之前的历史记录一起取下来，节省一点空间，毕竟我只是克隆这个来安装使用而暂时不需要对它做开发，没必要获取其他分支和历史修改记录。</p><p>　　我发现在执行安装脚本的过程中，它会自动下载4.X版本的NodeJS包来安装，早知道之前安装HEXO的时候就不用那么折腾NodeJS版本了。如果执行过程中会弹出提示，一般是缺少环境或者提示你要用<code>root/administrator</code>身份来安装，如果不是root用户的安装的时候在前面加<code>sudo</code>就行了。</p><h2 id="运行-Cloud9-IDE"><a href="#运行-Cloud9-IDE" class="headerlink" title="运行 Cloud9 IDE"></a>运行 Cloud9 IDE</h2><p>　　安装完成之后通过很简单的命令就可以把IDE环境运行起来了。</p><h3 id="运行-Cloud9-IDE-服务器"><a href="#运行-Cloud9-IDE-服务器" class="headerlink" title="运行 Cloud9 IDE 服务器"></a>运行 Cloud9 IDE 服务器</h3><p>　　最直接的是直接<code>node server.js</code>来启动服务器，不过这样启动的只能本地的浏览器访问，然而Ubuntu Server系统不方便执行GUI浏览器，更何况我们本来搭建起来就是为了让其他电脑访问，所以还是需要增加一些运行参数。我的执行命令是：</p><pre><code>node server.js -w ~/hexo/ -l 0.0.0.0 -a 用户名:密码</code></pre><p>　　加入<code>-w</code>命令来指定工作目录，我把工作目录设定为整个 hexo 的安装目录，这样以后换模板改服务器设置等等都方便。</p><p>　　加入<code>-l</code>命令是为了让其他终端能够通过浏览器对它进行访问。</p><p>　　最后一个<code>-a</code>命令是为了增加简单的用户名密码来防止别人登录。</p><h3 id="Cloud9-IDE-内存占用情况"><a href="#Cloud9-IDE-内存占用情况" class="headerlink" title="Cloud9 IDE 内存占用情况"></a>Cloud9 IDE 内存占用情况</h3><p>　　之前我以为这类WebIDE的系统资源占用会比较高，所以安装运行完特地用<code>top</code>命令来查看了一下，执行结果如下</p><figure class="highlight shell"><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">Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie</span><br><span class="line"><span class="meta">%</span>Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st</span><br><span class="line">KiB Mem:   1024716 total,   502088 used,   522628 free,    57492 buffers</span><br><span class="line">KiB Swap:  1044476 total,        0 used,  1044476 free.   228264 cached Mem</span><br><span class="line"> </span><br><span class="line">PID  USER     PR  NI    VIRT    RES    SHR S %CPU %MEM   TIME+COMMAND</span><br><span class="line">1520 用户名   20   0  195732 108136  16980 S  0.0 10.6   0:29.18 hexo</span><br><span class="line">1656 用户名   20   0  132228  37324  15228 S  0.0  3.6   0:35.65 node</span><br><span class="line">1668 用户名   20   0  144564  33288  15432 S  0.0  3.2   0:10.44 node</span><br></pre></td></tr></table></figure><p>　　发现目前内存的占用加起来还不及运行 hexo，看来我的低配VPS还是能勉强跑得动的。</p><h3 id="浏览器访问-Cloud9-IDE"><a href="#浏览器访问-Cloud9-IDE" class="headerlink" title="浏览器访问 Cloud9 IDE"></a>浏览器访问 Cloud9 IDE</h3><p>　　开始执行Cloud9 IDE的服务端之后，就可以在另外的电脑上用浏览器来访问它了。通过浏览器访问<code>http://VPS的IP地址:8181</code>（”8181”是默认的启动端口，也可以通过在启动的时候加上<code>-p</code>命令来指定别的端口）就可以看到 Cloud9 IDE 的界面了。浏览器首次进入的时候需要加载很多CSS和JS，所以启动会慢一些，后面就会好了。</p><p>　　另外浏览器推荐用Chrome，我这里不知道是电脑的问题还是怎样，用基于 Chromium 内核的其他第三方浏览器访问会一直卡在启动转圈的地方，而用原生的 Chrome 访问就很正常。</p><p><del>（之前忘记截这个界面的图了，这张图片取自<a href="http://lolicookie.link/cloud9-yun-duan-idede-an-zhuang-fang-fa/" target="_blank" rel="noopener">这里</a>）</del></p><h2 id="在-Cloud9-IDE-下写HEXO博客"><a href="#在-Cloud9-IDE-下写HEXO博客" class="headerlink" title="在 Cloud9 IDE 下写HEXO博客"></a>在 Cloud9 IDE 下写HEXO博客</h2><p>　　Cloud9 IDE 的布局跟我们常用的 IDE 比如 Eclipse、Visual Studio 甚至 Keil MDK 等很接近，左侧是资源文件，中间是代码编写和预览的地方，下面是一个 Shell 用来进行反馈编译等。</p><h3 id="实时预览撰写-Markdown-博文"><a href="#实时预览撰写-Markdown-博文" class="headerlink" title="实时预览撰写 Markdown 博文"></a>实时预览撰写 Markdown 博文</h3><p>　　要用它来撰写博客也是很简单的，首先新建一个 markdown 文件，然后点击上方的<code>Preview</code>就可以在右侧打开一个预览窗口，这样就能很方便的在线直接编写博客。当然在本地用专门的 markdown 编辑器编写好之后再通过IDE上传也很简单，跟上传图片一样。</p><h3 id="上传图片等资源"><a href="#上传图片等资源" class="headerlink" title="上传图片等资源"></a>上传图片等资源</h3><p>　　我之所以要用一个 IDE 而不想仅用后台插件，最主要的就是想方便上传和修改图片、音频等资源文件，在 Cloud9 IDE 中上传文件非常方便，直接把所需要的资源文件拖动到左侧的目录树中就能自动上传了，管理什么的也跟管理本地文件一样就行了，非常直观和方便。</p><h3 id="更新静态文件"><a href="#更新静态文件" class="headerlink" title="更新静态文件"></a>更新静态文件</h3><p>　　把博文内容和图片之类的处理好之后，就可以生成新的静态文件了。如果系统是运行着 hexo 的内置服务器的情况下，一般来说把博文保存到<code>_posts</code>目录下的时候就会自动生成了。不过我是把静态文件用 nginx 来做服务器提供访问的，所以写好之后，直接利用 IDE 下方的 Shell 窗口，切换到 hexo 站点的目录，通过<code>hexo g</code>命令来生成就可以了。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>　　通过这一系列的折腾，在 VPS 上架好了一把“牛刀”，虽然目前还是仅仅用来“杀鸡”（写写博客）而已，但是有了这个环境，后续直接远程进行编程，特别是在 Linux 环境下做一些事情也变得方便了起来。在实践搭建环境的过程中，也得到了很多经验与方法，这些也都是成长的收获。</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;引言&quot;&gt;&lt;a href=&quot;#引言&quot; class=&quot;headerlink&quot; title=&quot;引言&quot;&gt;&lt;/a&gt;引言&lt;/h2&gt;&lt;p&gt;　　把博客环境更改为HEXO有一段时间了，使用起来还是有一些不习惯的地方的。我是把HEXO架设在自己的VPS上面，而不是像其他人那样在本地架设好后通过&lt;code&gt;hexo d&lt;/code&gt; 命令来发布到Github之类的地方。所以我现在写博文的方式变成了先在本地写Markdown格式的文字，然后再上传到VPS的 &lt;code&gt;_post&lt;/code&gt; 目录中。这样一来要是在外地出差或者不在常用电脑上不方便连接VPS的时候就很不方便了，最好是能够像以前用各种博客程序一样直接在后台发布文章，再交由系统自动生成静态页面。&lt;/p&gt;
&lt;h3 id=&quot;hexo-admin-与-hexo-hey-优劣&quot;&gt;&lt;a href=&quot;#hexo-admin-与-hexo-hey-优劣&quot; class=&quot;headerlink&quot; title=&quot;hexo-admin 与 hexo-hey 优劣&quot;&gt;&lt;/a&gt;hexo-admin 与 hexo-hey 优劣&lt;/h3&gt;&lt;p&gt;　　通过一些了解，我尝试了 hexo-admin 或者 hexo-hey 两款补充hexo后台功能的插件，发现他们各有优劣。&lt;/p&gt;
&lt;p&gt;　　hexo-admin 的优势是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;除了创建post文章外还能创建page页面&lt;/li&gt;
&lt;li&gt;后台编辑器支持mathJax等常用插件&lt;/li&gt;
&lt;li&gt;可用复制粘贴方式自动复制图片&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　相比之下，hexo-hey 的最大优势是可以在后台修改模板的&lt;code&gt;_config.yml&lt;/code&gt;文件，对于刚建立博客，模板还需调整设置的方面还略多，所以这一点最为方便。但上述的其他几点就不如 hexo-admin 了。虽然看起来 hexo-admin 的优势很多，但是还有一点让我略感遗憾的是，复制粘贴进来的图片默认放到&lt;code&gt;img&lt;/code&gt;文件夹，当整个博客图片内容多的时候不好管理，所以我一般还是采用建立与 md 文件同名的资源文件夹的方式来管理相关资源，这样引用和管理都比较方便。另外一点就是不管是 hexo-hey 还是 hexo-admin 都需要通过&lt;code&gt;hexo s&lt;/code&gt;实时运行着服务器才能使用，我一般是不启动这个服务器，而是把 hexo 生成的静态文件直接软链给 nginx 服务器的站点来访问，以节省系统资源。&lt;/p&gt;
&lt;h3 id=&quot;Cloud9-IDE-与-Coding-WebIDE&quot;&gt;&lt;a href=&quot;#Cloud9-IDE-与-Coding-WebIDE&quot; class=&quot;headerlink&quot; title=&quot;Cloud9 IDE 与 Coding WebIDE&quot;&gt;&lt;/a&gt;Cloud9 IDE 与 Coding WebIDE&lt;/h3&gt;&lt;p&gt;　　总而言之还是能够自己管控整个后台最方便，但是又不方便时时刻刻连入VPS，所以后面鬼使神差般的选择了在线IDE环境。在线IDE环境其实就是可以通过浏览器在线访问的一个编程环境，用来编写程序项目都没问题，用来管理一个小小的博客自然也不在话下，这也是为什么说是杀鸡用牛刀。当然选择这个除了管理博客之外，还打算以后可以很方便的在不同环境下写一些爬虫之类的小程序直接跑在VPS上。目前除了著名的 Cloud9 IDE之外，还有国内的“Coding.net”推出的 &lt;code&gt;Coding WebIDE&lt;/code&gt;。但是因为懒得装JAVA环境，所以没选&lt;code&gt;Coding WebIDE&lt;/code&gt;，最终决定采用&lt;code&gt;Cloud9 IDE&lt;/code&gt;。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
      <category term="HEXO" scheme="https://www.candura.us/tags/HEXO/"/>
    
  </entry>
  
  <entry>
    <title>从EMLOG搬家到HEXO</title>
    <link href="https://www.candura.us/posts/post-342/"/>
    <id>https://www.candura.us/posts/post-342/</id>
    <published>2017-01-10T00:43:57.000Z</published>
    <updated>2019-07-11T08:45:22.184Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>　　进入2017年了，这段时间发生的很多改变，促使我回到这个很久没有耕耘过的博客来看看。写博的速度也从以前的每周写到现在的整年荒芜，当然中途有过空间商失效、域名失效等过程，但总之是慢慢变懒了……</p><p>　　从2009年高中即将毕业的时候建立这个博客，换过域名、换过空间、换过模板，唯独没换过的，是一直用着Emlog这套博客程序，从刚开始的 3.3.0 版本，一直到定格在 5.3.1，一直期待的 6.0 版本也在各种 beta 版本中变成了我的“有生之年”系列。</p><p>　　元旦收假回来这几天，不知道出于何种冲动，突然地就很想把它搬到一个纯静态的环境下。于是，就把博客从EMLOG搬迁到了HEXO下，顺便写下这篇文章记录过程免得以后忘记……</p><p>　　新博客正式重新用回了之前的域名 <a href="http://www.candura.us">http://www.candura.us</a><br>　　<a href="http://o.candura.us" target="_blank" rel="noopener">旧的博客</a>也用个子域名存着用以怀念</p><a id="more"></a><h2 id="搭建HEXO环境"><a href="#搭建HEXO环境" class="headerlink" title="搭建HEXO环境"></a>搭建HEXO环境</h2><p>　　搭建HEXO环境其实不难，如果是在VPS中搭建的话，简单来说就几个步骤：</p><ol><li>安装nodejs</li><li>npm方式安装hexo</li><li>hexo初始化博客</li><li>运行服务器</li></ol><p>　　步骤虽然简单，但是一开始就入了一个nodejs版本的坑。Ubuntu系统下直接用”apt-get”命令安装的nodejs是0.X的官方稳定版，并不支持ES6特性，后续为了博客的搜索功能需要用到一个 hexo-generator-json-content 的插件，需要这种特性来支持，所以要用别的方法来安装新版本的nodejs。</p><p>　　除此之外由于我个人技术水平及经验的原因，还有一些别的坑点。</p><h3 id="坑点1：更新nodejs版本"><a href="#坑点1：更新nodejs版本" class="headerlink" title="坑点1：更新nodejs版本"></a>坑点1：更新nodejs版本</h3><p>　　首先卸载掉之前直接用”apt-get”方式安装的nodejs</p><pre><code>sudo apt-get remove nodejs</code></pre><p>　　随后再通过增加另外的源来安装nodejs，我这里用4.X系列，要装6.X系列的把下面的代码改成6就行了。</p><pre><code>curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -sudo apt-get install -y nodejs</code></pre><p>　　这样就成功跨过了第一个版本的坑。</p><h3 id="坑点2：插件安装位置"><a href="#坑点2：插件安装位置" class="headerlink" title="坑点2：插件安装位置"></a>坑点2：插件安装位置</h3><p>　　在使用npm安装完hexo之后，通过”hexo init blog”初始化好一个站点之后，需要装上一些常用的插件，比如上文提到的 hexo-generator-json-content、 hexo-generator-feed 等等。</p><p>　　由于初次使用不习惯，我直接在上级目录用npm来安装这些插件，结果安装完之后发现站点并没有生效这些插件。后面查看 package.json 发现这些插件并没有被引入到站点中。</p><p>　　后面才发现这些插件是要在刚才初始化的”blog”这个目录下安装，而不能在上级的目录安装，搞得我差点要去某个插件的github上提交issue了，还好后面发现是自己的问题。</p><h2 id="迁移数据"><a href="#迁移数据" class="headerlink" title="迁移数据"></a>迁移数据</h2><p>　　经历完环境的搭建，选好主题与插件，基本上博客的壳子就有了，接下来是迁移博客的文章，这个虽然没有什么难点，但是却是个累活。</p><h3 id="迁移博客文章"><a href="#迁移博客文章" class="headerlink" title="迁移博客文章"></a>迁移博客文章</h3><h4 id="方法1：手动搬迁"><a href="#方法1：手动搬迁" class="headerlink" title="方法1：手动搬迁"></a>方法1：手动搬迁</h4><p>　　手动搬迁就是一篇篇的进入想搬迁的文章复制出来，然后按照hexo的文章语法来粘贴就行了。这个方法最笨但是也最不容易出错，总之就是把想要搬迁的内容复制出来就行了。</p><h4 id="方法2：写爬虫生成"><a href="#方法2：写爬虫生成" class="headerlink" title="方法2：写爬虫生成"></a>方法2：写爬虫生成</h4><p>　　自从有了Python之后，写个简单的爬虫就不那么困难了。不过不同博客的主题不同生成的HTML代码也不完全相同，所以需要慢慢分析格式，做好正则表达式过滤，再生成相应的MD文件。当然变种的方法是直接根据博客的SQL数据来读取内容，异曲同工。这个爬完了有时还是要按需手动做些检查和修改，不过比起一篇篇手动去复制粘贴要快多了。</p><h4 id="方法3：直接通过现有工具搬迁"><a href="#方法3：直接通过现有工具搬迁" class="headerlink" title="方法3：直接通过现有工具搬迁"></a>方法3：直接通过现有工具搬迁</h4><p>　　其实hexo作为一个深受喜爱的静态博客系统，总有人写出现成的工具来实现搬迁的，比如利用”hexo-migrator-wordpress”这个插件可以很方便的把WP博客的导出内容导入到hexo中。但是我用的是EMLOG啊，所以我还是先在本地搭建了一个WP的环境，把EMLOG的数据导入到WP中，再用插件把WP的数据导入hexo。基本上相当于是用WP作为跳板来连接EMLOG和hexo的数据转换。但是这样转换出来还是有一些html标签不能很好的翻译成markdown标签，所以最终还是要手动调整一些的。</p><h3 id="迁移图片、音乐等"><a href="#迁移图片、音乐等" class="headerlink" title="迁移图片、音乐等"></a>迁移图片、音乐等</h3><p>　　我的很多博客内容特别是什么拆机的、维修的都会配有图片，其他的一些拙作也会配上音乐，所以除了搬迁博文之外，这些内容怎么处理还是比较难搞的。</p><p>　　一开始我想的方法是直接调用老博客上面的图片，但是绝对地址和相对地址之间总是难以平衡，更何况以后万一还要换域名之类的，太不方便了。后面还是决定利用hexo 3.0以后的版本内置的”资源文件夹”功能来转移。</p><h4 id="引入图片"><a href="#引入图片" class="headerlink" title="引入图片"></a>引入图片</h4><p>　　首先在站点的” _config.yml “文件中把”post_asset_folder”功能开启，设置为”true”。然后建立一个与博文的md文件相同名字的文件夹，把那篇博文用到的图片、音乐之类的资源一起放到这个文件夹下，然后用下面的资源引用的代码，来代替原本markdown语法中的插入图片语法就可以了。</p><pre><code>{% asset_path slug %}{% asset_img slug [title] %}{% asset_link slug [title] %}</code></pre><h4 id="引入音乐"><a href="#引入音乐" class="headerlink" title="引入音乐"></a>引入音乐</h4><p>　　音乐资源也是一样，不过我在这里直接用了 “hexo-tag-aplayer” 这个插件，也是用下面的代码就可以直接插入资源文件夹中的资源了。</p><pre><code>{% aplayer "标题" "作者" "01.mp3" %}</code></pre><h3 id="迁移评论内容"><a href="#迁移评论内容" class="headerlink" title="迁移评论内容"></a>迁移评论内容</h3><p>　　其实要不是在EMLOG的论坛上看到有一个把EMLOG评论导出为多说JSON格式的插件，我都没太打算迁移这块内容了，毕竟大部分都是垃圾评论刷SEO的多。后来想想既然有希望能迁移，就一起迁移了吧。</p><h4 id="在hexo中开启”多说”评论"><a href="#在hexo中开启”多说”评论" class="headerlink" title="在hexo中开启”多说”评论"></a>在hexo中开启”多说”评论</h4><p>　　这个其实挺简单的，毕竟大部分hexo的主题直接支持这个功能，在主题的”_config.yml”中开启就行了，如果是主题原生不支持的，就需要参考”多说”的手册来手动在主题中添加代码。</p><h4 id="导出EMLOG评论为多说JSON"><a href="#导出EMLOG评论为多说JSON" class="headerlink" title="导出EMLOG评论为多说JSON"></a>导出EMLOG评论为多说JSON</h4><p>　　这个插件（其实应该叫工具的）的下载地址和使用方法在<a href="http://bbs.emlog.net/thread-36679-1-1.html" target="_blank" rel="noopener">这里</a>，按照需求安装好之后就可以导出为多说支持的JSON格式了。</p><h4 id="修改JSON中的参数"><a href="#修改JSON中的参数" class="headerlink" title="修改JSON中的参数"></a>修改JSON中的参数</h4><p>　　导出的JSON数据里面包含有以前的博文地址和”Thread Key”参数，博客搬家之后相应的地址是变动了的。以前的”/?post=XX”地址在我配置的hexo环境中变成了”/posts/post-XX”，所以要在文本编辑器里面用正则表达式全部替换掉。</p><p>　　另外根据上面那个工具导出的JSON中”Thread Key”的值是博客编号，即”/?post-XX”中的”XX”，而hexo中引入的多说评论自动生成的”Thread Key”是”posts/post-XX/“，所以这个地方也要去做替换。</p><p>　　只有做这些替换的时候真心感觉到还是正则表达式好用啊！前段时间写个小程序比较大规模的接触到正则表达式的使用，虽然我用起来还是半桶水，但经过之前的熟悉，现在这种替换工作还是比较上手了的。</p><h4 id="导入JSON数据到”多说”"><a href="#导入JSON数据到”多说”" class="headerlink" title="导入JSON数据到”多说”"></a>导入JSON数据到”多说”</h4><p>　　最后导入修改好的JSON数据到”多说”里面就可以了，不过貌似”多说”的导入有问题，经常导入不完整，有时候同一个JSON文件要导入多次才能导入完。</p><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>　　整个搬迁过程说简单也简单，说复杂也复杂。其实在这个过程中，我几乎又从头到尾过了一遍自己以前写过的博文，过往的点点滴滴历历在目，经常勾起各种各样的回忆。在不同的角落找到曾经自己的模样，也许才是这次搬迁中最大的收获……</p>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;　　进入2017年了，这段时间发生的很多改变，促使我回到这个很久没有耕耘过的博客来看看。写博的速度也从以前的每周写到现在的整年荒芜，当然中途有过空间商失效、域名失效等过程，但总之是慢慢变懒了……&lt;/p&gt;
&lt;p&gt;　　从2009年高中即将毕业的时候建立这个博客，换过域名、换过空间、换过模板，唯独没换过的，是一直用着Emlog这套博客程序，从刚开始的 3.3.0 版本，一直到定格在 5.3.1，一直期待的 6.0 版本也在各种 beta 版本中变成了我的“有生之年”系列。&lt;/p&gt;
&lt;p&gt;　　元旦收假回来这几天，不知道出于何种冲动，突然地就很想把它搬到一个纯静态的环境下。于是，就把博客从EMLOG搬迁到了HEXO下，顺便写下这篇文章记录过程免得以后忘记……&lt;/p&gt;
&lt;p&gt;　　新博客正式重新用回了之前的域名 &lt;a href=&quot;http://www.candura.us&quot;&gt;http://www.candura.us&lt;/a&gt;&lt;br&gt;　　&lt;a href=&quot;http://o.candura.us&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;旧的博客&lt;/a&gt;也用个子域名存着用以怀念&lt;/p&gt;
    
    </summary>
    
      <category term="个人日记" scheme="https://www.candura.us/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
      <category term="EMLOG" scheme="https://www.candura.us/tags/EMLOG/"/>
    
      <category term="HEXO" scheme="https://www.candura.us/tags/HEXO/"/>
    
  </entry>
  
  <entry>
    <title>又换回了以前最早用的老域名</title>
    <link href="https://www.candura.us/posts/post-341/"/>
    <id>https://www.candura.us/posts/post-341/</id>
    <published>2016-12-29T08:36:37.000Z</published>
    <updated>2019-07-11T08:45:22.000Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>其实我最早开始在网上找块地胡乱写东西的时候，就是用的 candura.us 这个域名。</p><p>之前空间和域名都是在一个算是朋友般的在外留学的兼职空间商那里买的，</p><p>用了几年之后突然他杳无音讯了，不知道过得好不好。</p><p>但是空间和域名还一直在他那，之前也懒得让他 push 域名到我的账户下。</p><a id="more"></a><p>结果那段时间恰逢毕业之类的事情很多，就把这个博客荒废了。</p><p>前几年捣鼓了一个VPS主机，除了拿来SS和VPN，闲着也是闲着，</p><p>就想着把之前的博客找回来，不过那会儿这个域名还没发买回来，</p><p>只好用了一长段时间的 candura.gq 这个域名，直到半年前把 us 的域名重新买了回来。</p><p>可是最为重度拖延症患者，域名买回来了一直也就是挂个跳转了事，</p><p>博客本身还是绑着 沟渠(.gq) 的域名，毕竟是免费的域名，经常性的无法访问。</p><p>于是今天赶在2017年到来之前，正式换上曾经陪伴我好久的这个 candura.us 的域名！</p><p>另外祝大家2017新年快乐~</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;其实我最早开始在网上找块地胡乱写东西的时候，就是用的 candura.us 这个域名。&lt;/p&gt;
&lt;p&gt;之前空间和域名都是在一个算是朋友般的在外留学的兼职空间商那里买的，&lt;/p&gt;
&lt;p&gt;用了几年之后突然他杳无音讯了，不知道过得好不好。&lt;/p&gt;
&lt;p&gt;但是空间和域名还一直在他那，之前也懒得让他 push 域名到我的账户下。&lt;/p&gt;
    
    </summary>
    
      <category term="个人日记" scheme="https://www.candura.us/categories/%E4%B8%AA%E4%BA%BA%E6%97%A5%E8%AE%B0/"/>
    
    
      <category term="建站" scheme="https://www.candura.us/tags/%E5%BB%BA%E7%AB%99/"/>
    
  </entry>
  
  <entry>
    <title>Moi3D稳定不闪退的探寻路</title>
    <link href="https://www.candura.us/posts/post-340/"/>
    <id>https://www.candura.us/posts/post-340/</id>
    <published>2016-12-05T02:00:17.000Z</published>
    <updated>2019-07-11T08:45:22.168Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>　　本文仅作学习探究，不做版权方面相关讨论。。。</p><p>　　</p><p>　　目前网上流传甚广的各种Moi3D版本，不管是v2还是v3，不管是悠然汉化版还是在此基础上重新布局的狐狸版，都存在突然闪退的现象。最开始我以为是系统兼容性的问题，后来在网上发现很多人有遇到闪退的反馈，也没有什么比较好的解决方法。而根据大家的反馈，使用官方正版或者试用版的都不存在闪退现象，所以只能猜测闪退是由于防破解机制引起。</p><a id="more"></a><p>　　所以想要不闪退基本上就只剩下这些选择，要么找到防破解机制中起作用的桩脚一一扫除，要么就老老实实使用官方的正版和试用版。官网上放出的试用版有2种，一种是功能无限制免费试用30天，一种是无限制时间试用但是不能保存。权衡了各个角度的难处，最终还是觉得通过让官方试用版能够无限试用应该是最简单的一种方案。所以接下来的问题就变成了，如何能够无限试用官方的30天试用版。</p><p>　　一般这类的试用版最基本的是通过系统时间判断，所以过期之后改回系统时间就能继续使用，然而现在应该不会有那么直接的方式了吧……其次是收集当前计算机的特殊信息（一般是MAC地址之类的）来运算成相应编码上传至服务器，然后由服务器做判断，如果是这种方式的话解决起来也很麻烦……不过万幸的是Moi3D并没有采用远程服务器检测的方案，为后面实现无限试用留下了方便之门。</p><p>　　说到本地的检测，无非就是通过创建文件和创建注册表来实现，所以只要监控文件和注册表的改动基本上就没有问题了。接下来就是通过各种监控类软件来监测Moi3D试用版在安装、首次运行、试用期内运行、试用期外运行四种情况下对文件和注册表的修改，从而找到解决的办法。</p><p>　　首次安装：首次安装主要是在安装文件夹下释放文件以及相关文件夹生成快捷方式，在注册表中写入文件关联，并没有什么特殊的地方。</p><p>　　首次运行：首次运行的时候，注意到多释放了7个文件，并且在注册表中写入了4个值得注意的键值（如下图）</p><p>（首次运行释放文件）</p><p>（首次运行写入注册表）</p><p>　　试用期内运行：当把系统时间往后修改到试用期内的其他时间再运行Moi3D的时候，软件可以正常运行。监测显示并没有释放多余的文件，但是在注册表中修改了那4个值得注意的键值的其中2个（如下图）。这让我开始确定这几个键值就是关键所在。</p><p>（试用期内运行修改注册表）</p><p>　　试用期外运行：当把系统的时间修改到30天后或者安装之前的时候，软件显示试用期已过无法运行。对比注册表发现比起上一次运行时，在修改之前那2个注册表条目的基础上，还新增加了一个条目（如下图）。</p><p>（试用期外运行修改注册表）</p><p>　　根据对上面四种状态的监控，我把重点放在了那几个注册表键值的变化上。但当我在试用期外把注册表上的多出的值删掉，并且改回试用期内的值甚至是首次运行那会儿生成的值的时候，软件还是提示试用期已过。本来想看看能否通过反汇编找找看这些16进制键值与时间的换算关系，但是因为人懒技术水平低就没做。后面索性直接删除掉那些键值，这回软件不提示过期了，而是改提示系统时间可能有变化无法启动……</p><p>　　在注册表上兜兜转转还是回到原点，于是调整了一下思路，所谓无限试用，就是试用期过后让程序的运行环境恢复到初次安装的状态，从这个角度来说，除了注册表内容之外，还应该同时注意首次运行后在“用户”文件夹下生成的那7个文件。于是对应着监测结果删除掉那些文件，同时清理掉注册表那几个键值。随后运行Moi3D试用版，成功了！又看到了试用期的提示~</p><p>　　总结一下具体步骤：</p><p>　　1、当试用过期后，删除注册表的下述键值，具体键值因人而异（或者懒人直接删除整个“CLSID”项）：</p><figure class="highlight shell"><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></pre></td><td class="code"><pre><span class="line">[user\current_classes\CompressedFolder\CLSID]</span><br><span class="line">"Compression Type (sive4366w)"=hex(3):AA,50,5B,56,64,F9,ED,22,DA,5B,6D,4D</span><br><span class="line">"Compression Type (joys7249u)"=hex(3):66,B9,E9,39,74,01,F2,3A,12,78,08,03</span><br><span class="line">"Compression Type (tncs2481h)"=hex(3):2A,5D,C6,F6,76,EB,A8,2C,B4,92,6F,36</span><br><span class="line">"Compression Type (uevp3984t)"=hex(3):D3,2B,FA,41,26,94,C5,39,AD,99,D4,08</span><br><span class="line">"Compression Type (bide1501a)"=hex(3):34,F1,3F,5C,76,FD,0D,3B,46,14,52,61</span><br></pre></td></tr></table></figure><p>　　2、删除首次运行生成的下述7个文件，具体文件名可能不同（根据后续多次重复试验，有时候试用期过后还会多生成一个“emg$config.dat”文件）</p><figure class="highlight shell"><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">user\all\eqkupahe.bft</span><br><span class="line">user\all\Microsoft\HTML Help\emz$config.dat</span><br><span class="line">user\all\NVIDIA Corporation\Drs\nvAppTimestamps</span><br><span class="line">user\all\NVIDIA Corporation\Drs\nvdrssel.bin</span><br><span class="line">user\current\AppData\Local\Temp\83194366.dmp</span><br><span class="line">user\current\AppData\Local\Temp\~981270772.tmp</span><br><span class="line">user\current\AppData\Roaming\Moi\moi.ini</span><br></pre></td></tr></table></figure><p>　　3、运行软件，成功获得多30天试用~</p><p>　　结语，其实这个无限试用的做法不难，如果不想麻烦的话直接装在虚拟机或沙盘里，到期了直接删除虚拟机或沙盘重新安装也可以了，不过因为还是想知道具体是哪些文件或注册表内容对其生效，为下一步看能否做完美破解做铺垫，就这样毫无技术含量的探寻了一番。至于给试用版安装中文汉化、以及加入2.0的狐狸版带的线成管功能等等，这些都太简单了，复制一些文件的事儿，就不再赘述了~</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;　　本文仅作学习探究，不做版权方面相关讨论。。。&lt;/p&gt;
&lt;p&gt;　　&lt;/p&gt;
&lt;p&gt;　　目前网上流传甚广的各种Moi3D版本，不管是v2还是v3，不管是悠然汉化版还是在此基础上重新布局的狐狸版，都存在突然闪退的现象。最开始我以为是系统兼容性的问题，后来在网上发现很多人有遇到闪退的反馈，也没有什么比较好的解决方法。而根据大家的反馈，使用官方正版或者试用版的都不存在闪退现象，所以只能猜测闪退是由于防破解机制引起。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="编程" scheme="https://www.candura.us/tags/%E7%BC%96%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>用Beaglebone Black搭建低功耗家用简易NAS下载机（2）——外网访问篇</title>
    <link href="https://www.candura.us/posts/post-339/"/>
    <id>https://www.candura.us/posts/post-339/</id>
    <published>2016-04-28T02:39:50.000Z</published>
    <updated>2019-07-11T08:45:22.172Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>　　这一篇除了写主线之外还简单记叙了一下我在操作过程中遇到的两个小插曲……</p><p>　　经过上一篇对Beaglebone Black的配置，我们已经搭建好了一个简易的NAS环境，可以在局域网内管理Beaglebone挂载区上面的文件，以及挂任务到Beaglebone上面来下载等等。但是我们的目标是在外面的时候就能挂任务给家里的Beaglebone Black让它自己下载，等回到家的时候就能下载好。所以今天要做的是通过配置路由器来让Beaglebone Black能直接被外网访问。</p><a id="more"></a><h3 id="一、绑定内网IP地址"><a href="#一、绑定内网IP地址" class="headerlink" title="一、绑定内网IP地址"></a>一、绑定内网IP地址</h3><p>　　我们路由器一般都是通过DHCP服务器自动给局域网内的设备分配IP地址，如果没有固定某个IP的话，过了某个IP续订的时间后再打开设备，也许内网的IP地址就会改变。比如今天开机是192.168.1.100，明天就变成192.168.1.101了。所以为了方便后续的操作，献给接入内网环境的Beaglebone Black绑定一个静态的IP地址，我这里就用 192.168.1.88 好了。</p><p>　　现在路由器后台找到当前运行的Beaglebone Black，一般默认主机名就是Beaglebone，找到之后记录下它的MAC地址，当然也可以通过ssh连上Beaglebone Black之后直接用“ifconfig”命令来得到网卡的MAC。记录下来之后在路由器后台的“网络安全”下面找到“ARP绑定”（不同的路由器后台具体位置不一样），然后填写上刚才记录下的MAC地址，在IP地址那里就填入我们希望分配过去的“192.168.1.88”。填好之后再看看“网络配置”那里的“DHCP”，发现这里面也已经自动添加了一条规则给Beaglebone Black的MAC分配了同一个IP。对于不同的路由器，有些只需要设置一个地方，有些要两个地方都设置才生效。</p><h3 id="二、映射外网端口"><a href="#二、映射外网端口" class="headerlink" title="二、映射外网端口"></a>二、映射外网端口</h3><p>　　固定好Beaglebone Black的内网IP之后，我们就可以把它暴露给外网环境访问了。一般来说讲局域网内的设备暴露给外网有两种方式，一种是设置DMZ主机，相当于把某个内网设备直接整体包括任何端口都暴露到外网，第二种是通过“虚拟服务”，把某些外网环境下路由器的某些端口直接映射给内网的机子。我们在这里选用第二种方法，这样可以根据需要配置，以后也方便给不同主机做不同映射。</p><p>　　我们进入到路由器后台“应用服务”的“虚拟服务”下，根据前一篇配置Aria2远程下载我们知道，它接收远程任务主要是通过6800端口，所以我们首先把路由器的6800端口，映射到内网刚才分配的IP“192.168.1.88”的6800端口。其次为了便于没有客户端的情况下提交任务，我们还在Beaglebone Black上面搭建了Nginx，上面挂载了一个网页版的客户端YAAW，所以我们把网页用到的80端口也映射给它。</p><p>　　这样配置完成后，访问路由器的6800端口和80端口就被转发到我们的Beaglebone Black上面了。</p><h3 id="三、绑定动态域名"><a href="#三、绑定动态域名" class="headerlink" title="三、绑定动态域名"></a>三、绑定动态域名</h3><p>　　我们大部分都是使用ADSL的方式来拨号上网，这样每次断线再拨号之后IP地址会变动，虽然现在大部分人的路由器都是7×24小时工作，IP地址不会轻易变动，但总有万一的情况出现，所以我们还是通过绑定动态域名来确保任何时候都能从外网访问到路由器。</p><p>　　我用的这款路由器支持花生壳的动态域名，刚好我很早就开始用着它，就直接在路由器后台的“动态域名”页面上设置好登录信息就OK了。设置好之后访问那个动态域名就相当于访问路由器的外网IP了，就不用担心外网IP变动了，因为这样不管外网IP怎么变动，动态域名都能绑定到新的IP上。</p><h3 id="四、在外网环境下用客户端建立下载任务"><a href="#四、在外网环境下用客户端建立下载任务" class="headerlink" title="四、在外网环境下用客户端建立下载任务"></a>四、在外网环境下用客户端建立下载任务</h3><p>　　正常来说这样设置好后，在外网环境就可以通过访问“ http://动态域名/yaaw ”来进入Aria2的客户端YAAW来远程给Beaglebone Black下达下载任务了。但是我这里遇到一个小插曲（详见下文“小插曲一”），解决之后就可以正常的在外网远程下载了。</p><p>　　当然如果不想在自己的Beaglebone上面建立客户端的话，也可以通过“ <a href="http://aria2c.com" target="_blank" rel="noopener">http://aria2c.com</a> ”这个别人建立好的YAAW网页客户端来下载，只要把“JSON-RPC”设置为“http://你的动态域名:6800/jsonrpc ”即可。</p><p>　　自此，整个设置外网访问的工作就做完了，不过刚做好的时候也因为一些小插曲导致家里的其他设备WIFI不大正常（详见下文“小插曲二”），后面解决了之后一直这么挂着用了快一个星期，一直非常稳定，不管我身在何处，它都躺在家中的角落安安静静的爬资源。</p><h3 id="小插曲一、电信运营商暗把公网变私网"><a href="#小插曲一、电信运营商暗把公网变私网" class="headerlink" title="小插曲一、电信运营商暗把公网变私网"></a>小插曲一、电信运营商暗把公网变私网</h3><p>　　就在我配置完动态域名之后，路由器上显示动态域名连接成功。我用“ping”命令来“ping”了一下我的动态域名，得到的IP地址结果跟我访问“ip138”得到的本机IP地址是一样的（见下图），但是在外网环境不管怎么访问都无法访问到Beaglebone Black。</p><p>　　后面偶然间打开路由的“连接状态”，看到当前虽然是已连接外网，但是得到的IP地址却是“100.64.XX.XX”（见下图）。这个路由得到的IP地址跟我访问外网的时候所显示的本地外网IP地址完全不一样啊。</p><p>　　然后上网查了一下，发现这个“100.64”开头的IP地址是私网地址，说白了就是一个内网的IP地址，就跟你局域网是“192.168”开头一样的。原来电信等几大运营商，为了节省公网IP的资源，把成片成片的用户偷偷组成一个内网，然后在网关里面通过NAT的方式让大家以为自己是在外网。这就是为什么我们明明路由器得到的是一个私网IP，访问外网的时候却看到的是名正言顺的公网IP，就是运营商网关做NAT转换的结果。这样做造成的后果就是，外网访问那个你看到的IP并不是你自己真实的IP，无法通过那个IP来访问到自己本身。好处是相对安全，可以在运营商网关过滤掉外网给你带来的攻击，坏处就是你无法通过被动的方式被被外网访问到。这也是为什么网上很多人反馈说家里的监控在外网却无法访问（当然现在新的监控系统通常是主动连接到位于公网IP的监控服务器，来实现被外网访问，而不是被动等待外网的连接，所以没这个问题），以及外网无法控制家里的WIFI插座啊、WIFI机器人等等。通过之前的搜索，发现大部分地区的各种运营商都在偷偷这样干，完全没有知会过用户，原来不是只有我一个人遇到这个问题。</p><p>　　了解清楚原因之后，我就打电话给运营商，跟客服人员说要公网IP，第二天技术人员再打电话来确认一遍需求之后，就在他们的后台那里改一下，我这边就解放了。重新在路由器上面断开再连接，终于发现路由器得到的是公网IP，可以直接被外网访问了，于是就能正常的在外网环境下访问Beaglebone Black了。</p><h3 id="小插曲二、磊科路由器后门带来的隐患"><a href="#小插曲二、磊科路由器后门带来的隐患" class="headerlink" title="小插曲二、磊科路由器后门带来的隐患"></a>小插曲二、磊科路由器后门带来的隐患</h3><p>　　就在得到公网IP的那天晚上，家里的无线设备似乎都遇到了问题，刚开始能正常使用，但是隔了一段时间之后就连不上WIFI了， 总是卡在“正在获取IP地址……”那里。用有线方式连接路由器的电脑 上网依然正常，但是访问路由器的IP无法进入路由器的管理页面。重新给路由器断电再上电之后能正常使用一段时间，随后又出现同样问题，恢复出厂设置也不济。</p><p>　　后面谷歌了一下，发现这是早就被爆出来的“磊科后门”，只是因为之前一直被电信运营商“保护”在私网环境下，所以以前完全没有遇到这个问题。最彻底的解决方法就是刷机升级固件了，不过我用的是磊哥NW762路由器，主要是看中它可以原生支持插USB设备来进行迅雷远程下载。如果刷第三方固件的话，就失去了原生的迅雷远程下载功能，而官方固件又已经有年头没更新了，我目前的固件版本已然是官网最新版了。所以这样一来，刷固件的解决方案就被暂时搁置了。</p><p>　　但是后来又找到了另外一个解决方案，有人分析了这个后门发作的原因，主要是在于路由器的TCP的5357端口和UDP的53413，只要把这两个端口转发到不存在的地方就行了，或者干脆设置一个DMZ到不存在的主机也行。于是我决定双管齐下，因为端口转发的优先级在我这一款路由器里面是高于DMZ主机的，也就是说同时设置了DMZ主机和端口转发的话，访问被转发的端口会跳转到映射地址，而不是DMZ主机本身，这样一来的话即便设置了DMZ主机也不会影响我之前给Beaglebone Black设置的端口转发，于是就大胆的进行设置了。（如下图）</p><p>　　我把那两个有问题的端口都转发到一台不存在的地址上，这里我用“192.168.1.44”，另外也把这个不存在的IP作为DMZ主机暴露出来。</p><p>　　经过这样设置后，重启一下路由器，家里的无线设备终于又恢复正常了。一切又回归宁静，除了多个Beaglebone Black在角落默默地爬……</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;　　这一篇除了写主线之外还简单记叙了一下我在操作过程中遇到的两个小插曲……&lt;/p&gt;
&lt;p&gt;　　经过上一篇对Beaglebone Black的配置，我们已经搭建好了一个简易的NAS环境，可以在局域网内管理Beaglebone挂载区上面的文件，以及挂任务到Beaglebone上面来下载等等。但是我们的目标是在外面的时候就能挂任务给家里的Beaglebone Black让它自己下载，等回到家的时候就能下载好。所以今天要做的是通过配置路由器来让Beaglebone Black能直接被外网访问。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="电子" scheme="https://www.candura.us/tags/%E7%94%B5%E5%AD%90/"/>
    
  </entry>
  
  <entry>
    <title>用Beaglebone Black搭建低功耗家用简易NAS下载机（1）——环境搭建篇</title>
    <link href="https://www.candura.us/posts/post-338/"/>
    <id>https://www.candura.us/posts/post-338/</id>
    <published>2016-04-23T07:43:49.000Z</published>
    <updated>2019-07-11T08:45:22.188Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="/assets/css/APlayer.min.css"><script src="/assets/js/APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>　　一直以来都有想做个家用私有云，来让家里的各个设备（手机、机顶盒、iPad等）能够直接做数据交换和流媒体播放。作为一个要7×24开启的设备，尽量想把功耗控制一下，设想过用现成的NAS或者HTPC，但不是价格超出心里预期就是其他方面配置不合适，迟迟没有下手买。前段时间机缘巧合以非常低廉的价格得到一块二手的Beaglebone Black开发板，Beaglebone Black作为单板机在GEEK圈里不如树莓派那么出名，但是它的硬件性能还是高出树莓派不少的。于是决定用Beaglebone Black来自己搭建一个简易的NAS，平常拿来做做下载机什么的，也能充分利用一下家里的宽带。</p><a id="more"></a><p>　　首先，主角就是这货——Beaglebone Black，下面简称BBB。它采用AM3359芯片，1Ghz主频，内置512M的DDR3内存和2G的eMMC。其他的USB-Host、miniUSB、TF卡槽、microHDMI、网卡等接口一应俱全，而且板子本身只要210～460mA的5V供电就足以运行，是挺适合用的。</p><p>　　刚拿到手的时候它用的是官方原配的Angstrom系统，为了更好的扩展和使用，我给它刷了 Debian 7.9 的系统，同时考虑到节省系统资源，刷的是不带桌面环境的纯命令行版本。</p><h3 id="一、挂载储存设备"><a href="#一、挂载储存设备" class="headerlink" title="一、挂载储存设备"></a>一、挂载储存设备</h3><p>　　作为实验我暂时先用U盘来作为储存设备，后续可以替换成外接电源的移动硬盘。首先插入U盘……</p><p>　　插入U盘之后先看看是否能够被检测到，用fdisk命令看看。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo fdisk -l</span><br></pre></td></tr></table></figure><p>　　运行结果如下</p><figure class="highlight shell"><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">   Device Boot      Start         End      Blocks   Id  System</span><br><span class="line">/dev/sda1   *        2048    15794175     7896064    7  HPFS/NTFS/exFAT</span><br></pre></td></tr></table></figure><p>　　说明成功读到U盘，U盘位置是 /dev/sda1 。我这里U盘用的是NTFS格式的，因为估摸着以后接硬盘也是用这个格式，而原生的Linux系统并不直接支持NTFS，所以先给它安装支持环境。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install ntfs-3g</span><br></pre></td></tr></table></figure><p>　　安装完成后通过ntfs-3g来挂载U盘，过程跟用系统自带的mount命令一样的。先建立一个挂载用的文件夹，然后挂载上去。</p><figure class="highlight shell"><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="meta">#</span>创建挂载位置</span><br><span class="line">sudo mkdir /mnt/usb</span><br><span class="line"><span class="meta">#</span>挂载U盘</span><br><span class="line">sudo ntfs-3g /dev/sda1 /mnt/usb</span><br></pre></td></tr></table></figure><p>　　挂载完成后进入挂载点用“ls”命令看看能否列出U盘下的文件，可以的话说明挂载成功！</p><p>　　* 对于有需求的可以考虑把挂载添加到系统启动运行，不过我自己暂时没这样配置。</p><figure class="highlight shell"><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="meta">#</span>编辑fstab</span><br><span class="line">sudo nano /etc/fstab</span><br><span class="line"><span class="meta">#</span>在最后一行添加挂载命令</span><br><span class="line">/dev/sda1 /mnt/usb ntfs-3g defaults,noexec,umask=0000 0 0</span><br></pre></td></tr></table></figure><h3 id="二、配置Samba服务器"><a href="#二、配置Samba服务器" class="headerlink" title="二、配置Samba服务器"></a>二、配置Samba服务器</h3><p>　　挂载完成后，需要让内网的其他机子能够访问，一般选择用Samba或者MiniDLNA。对于是配置Samba好还是配置MiniDLNA好网上有不同的意见，我的感觉是播放流媒体时MiniDLNA比Samba速度还是快一些，所以对于作为家庭媒体中心来用的话可以选择使用MiniDLNA，但是我主要是做下载机，下载后就移到其他地方做整理，所以对我而言用Samba比较方便，就选择配置Samba服务器。对于有需求的来说两个环境同时配置上去也不要紧。</p><p>　　先安装Samba组件</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install samba samba-common-bin</span><br></pre></td></tr></table></figure><p>　　然后配置共享挂载的那个文件夹</p><figure class="highlight shell"><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="meta">#</span>备份配置文件</span><br><span class="line">sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_bak</span><br><span class="line"><span class="meta">#</span>编辑配置文件</span><br><span class="line">sudo nano /etc/samba/smb.conf</span><br></pre></td></tr></table></figure><p>　　找到[public]模块按如下配置（允许GUEST读写），没有就直接写。</p><figure class="highlight shell"><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">[public]</span><br><span class="line">    comment = Public Files</span><br><span class="line">    path = /mnt/usb</span><br><span class="line">    browseable = yes</span><br><span class="line">    writeable = yes</span><br><span class="line">    guest ok = yes</span><br><span class="line">    read only = no</span><br></pre></td></tr></table></figure><p>　　配置完成之后重启一下Samba服务</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo service samba restart</span><br></pre></td></tr></table></figure><p>　　这样Samba服务就配置好了，在Windows下进入“\192.168.1.88”（Beaglebone的内网IP），找到public文件夹，里面能看到挂载Beaglebone上的U盘内容就成功了。</p><h3 id="三、配置远程下载环境"><a href="#三、配置远程下载环境" class="headerlink" title="三、配置远程下载环境"></a>三、配置远程下载环境</h3><h4 id="1、安装Aria2"><a href="#1、安装Aria2" class="headerlink" title="1、安装Aria2"></a>1、安装Aria2</h4><p>　　最为一个主要拿来当下载机的建议NAS来说，配置好内网访问只是基础，更重要的是配置远程下载的环境，一般用Aria2，也是用apt-get就很容易安装上了。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install aria2</span><br></pre></td></tr></table></figure><p>　　安装完成后我们先创建一个空白的会话控制(session)文件和ARIA2配置文件并编辑它。</p><figure class="highlight shell"><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">sudo mkdir ~/.aria2</span><br><span class="line">sudo touch ~/.aria2/aria2.session</span><br><span class="line">sudo touch ~/.aria2/aria2.conf</span><br><span class="line"><span class="meta">#</span>打开配置文件进行编辑</span><br><span class="line">sudo nano ~/.aria2/aria2.conf</span><br></pre></td></tr></table></figure><p>　　通过编辑配置文件来对Aria2做相应设置，比如把下载路径放到挂载点等等，其他高级配置选项可以参看aria2的官网。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span>配置下载目录</span><br><span class="line">dir=/mnt/usb/DOWNLOAD/</span><br><span class="line"><span class="meta">#</span>关闭IPv6</span><br><span class="line">disable-ipv6=true</span><br><span class="line"><span class="meta">#</span>打开rpc管理，方便后续使用客户端</span><br><span class="line">enable-rpc=true</span><br><span class="line">rpc-allow-origin-all=true</span><br><span class="line">rpc-listen-all=true</span><br><span class="line"><span class="meta">#</span>默认端口6800不用改</span><br><span class="line"><span class="meta">#</span>rpc-listen-port=6800</span><br><span class="line"><span class="meta">#</span>开启断点续传</span><br><span class="line">continue=true</span><br><span class="line"><span class="meta">#</span>会话管理控制文件</span><br><span class="line">input-file=/home/debian/.aria2/aria2.session</span><br><span class="line">save-session=/home/debian/.aria2/aria2.session</span><br><span class="line"><span class="meta">#</span>最大同时下载任务数</span><br><span class="line">max-concurrent-downloads=5</span><br></pre></td></tr></table></figure><p>　　为了方便管理，我们把Aria2配置成服务，服务名称这里改用另外一个名字“aria2c”</p><figure class="highlight shell"><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">sudo touch /etc/init.d/aria2c</span><br><span class="line">sudo chmod 755 /etc/init.d/aria2c</span><br></pre></td></tr></table></figure><p>　　然后编辑一下那个配置文件（/etc/init.d/aria2c）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span>!/bin/sh</span><br><span class="line"><span class="meta">#</span>## BEGIN INIT INFO</span><br><span class="line"><span class="meta">#</span> Provides:             aria2</span><br><span class="line"><span class="meta">#</span> Required-Start:       $remote_fs $network</span><br><span class="line"><span class="meta">#</span> Required-Stop:        $remote_fs $network</span><br><span class="line"><span class="meta">#</span> Default-Start:        2 3 4 5</span><br><span class="line"><span class="meta">#</span> Default-Stop:         0 1 6</span><br><span class="line"><span class="meta">#</span> Short-Description:    Aria2 Downloader</span><br><span class="line"><span class="meta">#</span>## END INIT INFO</span><br><span class="line">case "$1" in</span><br><span class="line">start)</span><br><span class="line">        echo -n "Starting aria2c"</span><br><span class="line">        sudo -u debian aria2c --conf-path=/home/debian/.aria2/aria2.conf -D</span><br><span class="line">;;</span><br><span class="line">stop)</span><br><span class="line">        echo -n "Shutting down aria2c"</span><br><span class="line">        killall aria2c</span><br><span class="line">;;</span><br><span class="line">restart)</span><br><span class="line">        killall aria2c</span><br><span class="line">        sudo -u debian aria2c --conf-path=/home/debian/.aria2/aria2.conf -D</span><br><span class="line">;;</span><br><span class="line">esac</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>　　对了，这里面用到了“killall”命令来结束进程，而我刷入这个版本的debian默认没有带“killall”命令，所以要重新用apt-get来安装一下它。</p><p>　　配置完成后，我们就可以通过服务的方式来启动Aria2了。</p><figure class="highlight shell"><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="meta">#</span>运行aria2c服务</span><br><span class="line">sudo service aria2c start</span><br><span class="line"><span class="meta">#</span>如果需要设置为开机自动运行</span><br><span class="line">sudo update-rc.d aria2c defaults</span><br></pre></td></tr></table></figure><h4 id="2、搭建Aria2网页客户端"><a href="#2、搭建Aria2网页客户端" class="headerlink" title="2、搭建Aria2网页客户端"></a>2、搭建Aria2网页客户端</h4><p>　　Aria2原本是可以用命令行的方式来控制它做下载的，但是这样太麻烦了，于是我们考虑安装一个用于管理Aria2 的网页客户端。网页服务器环境可以选择Nginx或者lighttpd，不太推荐用Apache，毕竟Beaglebone的硬件性能一般，能省一点算一点。</p><p>　　我在这里选用Nginx，直接用“sudo apt-get install nginx”就安装上了，具体配置过程参见网络，我这里采用默认配置就好。另外需要说明的是，这样安装完成的Nginx默认网站目录是“/usr/share/nginx/www”，而不是常用的“/var/www”，有需求的自己用“ln -s”建立软连接就行，我这里就直接用默认目录了。</p><p>　　Aria2的网页客户端有YAAW和webui-aria2，前者简单，后者设置选项多一些，我在这里选用前者。yaaw在github上面的地址是 <a href="https://github.com/wzhy90/yaaw" target="_blank" rel="noopener">https://github.com/wzhy90/yaaw</a> ，我用的是国内的汉化版本（<a href="http://git.oschina.net/maoxuner/yaaw-chs" target="_blank" rel="noopener">http://git.oschina.net/maoxuner/yaaw-chs</a> ）。如果有Git的可以直接使用Git方式安装，这样比较快捷。</p><figure class="highlight shell"><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">sudo chmod a+w -R /usr/share/nginx/www</span><br><span class="line">cd /usr/share/nginx/www</span><br><span class="line"><span class="meta">#</span>使用Git克隆客户端</span><br><span class="line">git clone http://github.com/wzhy90/yaaw</span><br></pre></td></tr></table></figure><p>　　如果没有的也可以登录网站把打包好的ZIP文件下下来，解压到板子上之前用Samba共享出来的文件夹上，再拷贝到网站目录去。</p><p>　　做好之后访问 <a href="http://192.168.1.88/yaaw" target="_blank" rel="noopener">http://192.168.1.88/yaaw</a> 就能看到网页客户端了（中间的IP地址换成Beaglebone的IP地址就行）</p><p>　　然后在其他机子上就可以通过访问这个客户端来添加任务远程下载了。</p><p>　　至此，整个环境搭建的过程就完成了。</p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;　　一直以来都有想做个家用私有云，来让家里的各个设备（手机、机顶盒、iPad等）能够直接做数据交换和流媒体播放。作为一个要7×24开启的设备，尽量想把功耗控制一下，设想过用现成的NAS或者HTPC，但不是价格超出心里预期就是其他方面配置不合适，迟迟没有下手买。前段时间机缘巧合以非常低廉的价格得到一块二手的Beaglebone Black开发板，Beaglebone Black作为单板机在GEEK圈里不如树莓派那么出名，但是它的硬件性能还是高出树莓派不少的。于是决定用Beaglebone Black来自己搭建一个简易的NAS，平常拿来做做下载机什么的，也能充分利用一下家里的宽带。&lt;/p&gt;
    
    </summary>
    
      <category term="技术至上" scheme="https://www.candura.us/categories/%E6%8A%80%E6%9C%AF%E8%87%B3%E4%B8%8A/"/>
    
    
      <category term="Linux" scheme="https://www.candura.us/tags/Linux/"/>
    
      <category term="电子" scheme="https://www.candura.us/tags/%E7%94%B5%E5%AD%90/"/>
    
  </entry>
  
</feed>
