<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>孤熵小狼</title>
  
  <subtitle>趁年轻，多闯荡</subtitle>
  <link href="https://blog.furen.link/atom.xml" rel="self"/>
  
  <link href="https://blog.furen.link/"/>
  <updated>2025-07-20T11:23:59.000Z</updated>
  <id>https://blog.furen.link/</id>
  
  <author>
    <name>刃刃</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>兆芯开先C+ 4701初考古</title>
    <link href="https://blog.furen.link/4175908401/"/>
    <id>https://blog.furen.link/4175908401/</id>
    <published>2025-07-19T03:45:14.000Z</published>
    <updated>2025-07-20T11:23:59.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>说到国产处理器，之前简单体验过搭载龙芯3A3000的电脑，其采用MIPS64el架构，无法直接运行Windows系统，虽可通过Wine进行转译，但并非所有的软件能支持。于是，本文的主角，基于x86指令集的兆芯开先ZX-C+ 4701映入眼帘……</p><p>也许你会好奇，Intel并没有直接授权x86技术给兆芯，兆芯是如何流片使用x86指令集的处理器呢？</p><p>这就不得不提为兆芯提供技术支持的威盛电子（VIA）了，其在1999年收购专为80x86平台生产浮点协处理器的芯片公司Cyrix（收购前因为专利纠纷被Intel起诉，但最终Intel败诉并将x86指令集授权给Cyrix的结局收场）。自此威盛电子涉足x86处理器设计领域，基于此前为Intel和AMD提供芯片组的经验，主打高集成化与低能耗，先后推出了小改Cyrix的VIA C3、集成北桥的VIA CoreFusion、主打低功耗的VIA C7、引入64位架构的VIA Nano……</p><p>到2020年，兆芯收购了威盛电子自2013年以前持有的x86授权与相关技术，这个谜题也就解开了。</p><h2 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h2><p>兆芯开先ZX-C+ 4701 发布于2016年，架构代号为「张江」，在 VIA Nano 平台的基础上加入国密SM3、SM4硬件加解密指令集。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd7d48a38.webp" alt="开先® ZX-C+系列处理器"></p><p>拆机看看？处理器比南北桥封装尺寸要小的x86平台并不多见。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd8073fd4.webp" alt="C4701处理器"></p><p>与C4701配套的桥片为 VIA VX11，集成VIA C-645 显示芯片，支持 DX11、OpenGL 3.2图形API。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd8406e6d.webp" alt="VX11桥片"></p><p><img src="https://bu.dusays.com/2025/07/20/687ccd8673716.webp" alt="VX11芯片组宣传物料"></p><h2 id="小测试"><a href="#小测试" class="headerlink" title="小测试"></a>小测试</h2><p>测试前，先展示下配置信息。</p><table><thead><tr><th align="center">硬件</th><th align="center">参数</th></tr></thead><tbody><tr><td align="center">处理器</td><td align="center">兆芯 KaiXian ZX-C+ C4701</td></tr><tr><td align="center">内存</td><td align="center">4GB DDR3 1333MHz</td></tr><tr><td align="center">显卡</td><td align="center">威盛 VIA&#x2F;S3G Chrome 645&#x2F;640 GPU</td></tr><tr><td align="center">硬盘</td><td align="center">闪迪 Z410 120GB SATA SSD</td></tr><tr><td align="center">系统</td><td align="center">Windows 10 22H2 专业版</td></tr></tbody></table><p>CPU-Z看看处理器情况，名字直接沿用老东家VIA惹。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd89885f5.webp" alt="CPU-Z"></p><p>AIDA64内存性能测试，受制于总线设计与单通道内存控制器，延迟表现并不好看。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd8c1afe8.webp" alt="内存延迟"></p><p>国际象棋测试，相当于Atom Z3735F。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd8eea3b4.webp" alt="国际相机测试"></p><p>5.2老版本的娱乐大师测试，单处理器性能来说与J1900不相上下。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd923ec85.webp" alt="旧版娱乐大师"></p><p>GPU-Z看看显卡信息，可惜BIOS无法调整共享显存大小。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccd9588184.gif" alt="GPU-Z"></p><p>3D Mark 11 基准测试（P模式），这个成绩简单应付个大三亿、飞车应该没什么大问题（逃）。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccda063f06.webp" alt="3DMark11"></p><p>在流媒体测试中，貌似并没有正确驱动到C-640集显的H.264解码器，软解1080P流媒体对于这颗处理器来说是个奢望。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccda4dea8a.webp" alt="流媒体测试大失败-1"></p><p>将分辨率降低到480P，也无济于事。得等后续换成Windows 7系统再重新验证了。</p><p><img src="https://bu.dusays.com/2025/07/20/687ccdad58434.webp" alt="流媒体测试大失败-2"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;说到国产处理器，之前简单体验过搭载龙芯3A3000的电脑，其采用MIPS64e</summary>
      
    
    
    
    <category term="数码" scheme="https://blog.furen.link/categories/%E6%95%B0%E7%A0%81/"/>
    
    
    <category term="国产芯片" scheme="https://blog.furen.link/tags/%E5%9B%BD%E4%BA%A7%E8%8A%AF%E7%89%87/"/>
    
    <category term="兆芯" scheme="https://blog.furen.link/tags/%E5%85%86%E8%8A%AF/"/>
    
  </entry>
  
  <entry>
    <title>重设GoPro Hero 3/3+的Wi-Fi密码</title>
    <link href="https://blog.furen.link/873851125/"/>
    <id>https://blog.furen.link/873851125/</id>
    <published>2025-07-15T15:54:00.000Z</published>
    <updated>2025-07-18T14:58:57.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>整理了下杂物堆，翻出十多年前托哥们捎的GoPro，还能开机，不过相机的Wi-Fi密码早已忘光。翻出十年前的小攻略，貌似在固件下载页面有设置Wi-Fi密码的界面。</p><p><img src="https://bu.dusays.com/2025/07/18/687a5f6a04058.webp" alt="当时的固件更新页面"></p><p>然而，当满心欢喜地打开固件更新页面时，傻眼了——并没有设置Wi-Fi密码的界面，一时间陷入沉思……</p><p><img src="https://bu.dusays.com/2025/07/18/687a5f6a2202d.webp" alt="现在的固件更新页面"></p><p>好在办法总比困难多，经过一段时间的信息检索，终于找到修改的办法。鉴于GoPro Hero 3 与 Hero 3+的固件支持已经结束（最后一版固件时间分别为2014年8月与2015年9月），此方法在未来应该还是可用的。</p><h2 id="需要准备"><a href="#需要准备" class="headerlink" title="需要准备"></a>需要准备</h2><blockquote><p>请确保GoPro的电池电量充足</p></blockquote><ul><li>一张 MicroSD 卡，需使用FAT32文件系统</li><li>一台 GoPro Hero 3 或 GoPro Hero 3+ 相机</li><li>一部带读卡器的电脑 或 能读取 MicroSD 卡的手机</li></ul><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><blockquote><p>更新过程中请勿断电或移除SD卡</p></blockquote><ol><li><p>创建一个名为 <code>UPDATE</code> 的文件夹</p></li><li><p>在 <code>UPDATE</code> 文件夹内创建名为 <code>settings.in</code> 的文件，内容如下</p><p>注意：<code>ssid</code> 对应相机的Wi-Fi名称，不支持中文；<code>password</code> 对应相机的Wi-Fi密码，由于采用WPA2认证方式，需要至少8位字符，且不支持中文</p><p>提示：下面将GoPro的热点名设置为 <strong>GoPro</strong> ，密码设置为 <strong>goprohero</strong></p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line"><span class="attr">&quot;current_password&quot;</span><span class="punctuation">:</span><span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;token&quot;</span><span class="punctuation">:</span><span class="string">&quot;&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;wifi_ap&quot;</span><span class="punctuation">:</span><span class="punctuation">&#123;</span></span><br><span class="line"><span class="attr">&quot;ssid&quot;</span><span class="punctuation">:</span><span class="string">&quot;GoPro&quot;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;password&quot;</span><span class="punctuation">:</span><span class="string">&quot;goprohero&quot;</span></span><br><span class="line"><span class="punctuation">&#125;</span><span class="punctuation">,</span></span><br><span class="line"><span class="attr">&quot;wifi_networks&quot;</span><span class="punctuation">:</span><span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure></li><li><p>在 <code>UPDATE</code> 文件夹内创建名为 <code>update.11.txt</code> 的文件，内容如下</p><figure class="highlight txt"><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"># Camera upgrade rules file</span><br><span class="line">OPTIONS:6</span><br></pre></td></tr></table></figure></li><li><p>电脑或手机插入 MicroSD 卡，拷贝文件</p><ul><li><p>如果是 Hero 3 系列，则只需将 <code>settings.in</code> 和 <code>update.11.txt</code> 这两个文件放入 SD 卡的根目录即可</p><p><img src="https://bu.dusays.com/2025/07/18/687a5f7017c61.webp" alt="Hero3"></p></li><li><p>如果是 Hero 3+ 系列，则只需将整个 <code>UPDATE</code> 文件夹放入 SD 卡的根目录即可</p><p><img src="https://bu.dusays.com/2025/07/18/687a5f74829d5.webp" alt="Hero3+"></p></li></ul></li><li><p>将 MicroSD 卡装回GoPro，开机，此时应该会显示更新状态，稍等片刻，更新完成会自动重启，届时Wi-Fi密码修改完成。</p></li></ol><p><img src="https://bu.dusays.com/2025/07/18/687a5f79b288b.webp" alt="更新中"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;整理了下杂物堆，翻出十多年前托哥们捎的GoPro，还能开机，不过相机的Wi-F</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="相机" scheme="https://blog.furen.link/tags/%E7%9B%B8%E6%9C%BA/"/>
    
  </entry>
  
  <entry>
    <title>在WindowsARM设备上使用STM32Link</title>
    <link href="https://blog.furen.link/193499151/"/>
    <id>https://blog.furen.link/193499151/</id>
    <published>2025-03-22T12:00:00.000Z</published>
    <updated>2025-07-18T14:43:53.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>随着Apple Silicon Mac的流行，间接推进了Windows ARM平台的发展，转译层的兼容性与效率均有所提升；本文将演示如何在ARM版本的Windows 11上安装STM32Link驱动。</p><p><strong>演示环境</strong></p><ul><li><p>M1 Mac虚拟机下的Windows 11 On ARM（24H2）</p><img src="https://bu.dusays.com/2025/04/09/67f641bb28338.webp" alt="环境说明" style="zoom:50%;" /></li></ul><p><strong>驱动下载</strong></p><ul><li>修改后的STM32Link驱动：<a href="https://community.st.com/ysqtg83639/attachments/ysqtg83639/mcu-boards-hardware-tools-forum/7705/1/stsw-link009_v3_ARM64_UNSIGNED.zip_?blank">下载</a></li></ul><h2 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h2><h3 id="一、禁用驱动签名检查"><a href="#一、禁用驱动签名检查" class="headerlink" title="一、禁用驱动签名检查"></a>一、禁用驱动签名检查</h3><ol><li><p>打开[设置]，依次进入[系统]–&gt;[恢复]，找到[高级启动]，单击[立即重新启动]</p><p>此时会弹出提示窗口，根据提示重启设备。</p><p><img src="https://bu.dusays.com/2025/04/09/67f641c4a3192.webp" alt="进入高级启动"></p></li><li><p>进入高级启动界面后，依次单击[疑难解答]-&gt;[高级选项]-&gt;[启动设置]-&gt;[重启]</p><p><img src="https://bu.dusays.com/2025/04/09/67f641c832226.webp" alt="高级启动-启动设置"></p></li><li><p>在启动设置界面，按下 <code>F7</code> ，即选中[禁用驱动程序强制签名]，待系统加载完成</p><p><img src="https://bu.dusays.com/2025/04/09/67f641cdc4127.webp" alt="禁用驱动签名检查"></p></li></ol><h3 id="二、安装驱动"><a href="#二、安装驱动" class="headerlink" title="二、安装驱动"></a>二、安装驱动</h3><ol><li><p><a href="https://community.st.com/ysqtg83639/attachments/ysqtg83639/mcu-boards-hardware-tools-forum/7705/1/stsw-link009_v3_ARM64_UNSIGNED.zip_?blank">下载</a>并解压驱动，安装下列三个<code>*.inf</code>文件</p><p><img src="https://bu.dusays.com/2025/04/09/67f641d14cd64.webp" alt="解压驱动压缩包"></p></li><li><p>选中<code>*.inf</code>文件，右键[安装]</p><img src="https://bu.dusays.com/2025/04/09/67f641dcb120d.webp" alt="安装驱动" style="zoom:50%;" /></li><li><p>此时会弹出安全提示，单击[仍然安装]</p><img src="https://bu.dusays.com/2025/04/09/67f6815c3bbc8.webp" alt="安全提示" style="zoom: 33%;" /></li><li><p>弹出操作完成的提示后，如法炮制安装剩下两个<code>*.inf</code>文件</p><img src="https://bu.dusays.com/2025/04/09/67f641d403422.webp" alt="操作完成" style="zoom:50%;" /></li></ol><h3 id="三、检查驱动安装情况"><a href="#三、检查驱动安装情况" class="headerlink" title="三、检查驱动安装情况"></a>三、检查驱动安装情况</h3><ol><li><p>插入STM32Link（如果是虚拟机的话，记得接入设备）</p></li><li><p>打开「计算机管理」，单击「设备管理器」，找到「通用串口总线设备」，此时应该能识别到</p><p><img src="https://bu.dusays.com/2025/04/09/67f641f0dc08c.webp" alt="正常识别"></p></li></ol></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;随着Apple Silicon Mac的流行，间接推进了Windows ARM</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="单片机" scheme="https://blog.furen.link/tags/%E5%8D%95%E7%89%87%E6%9C%BA/"/>
    
    <category term="Windows On ARM" scheme="https://blog.furen.link/tags/Windows-On-ARM/"/>
    
  </entry>
  
  <entry>
    <title>回顾2024，展望2025</title>
    <link href="https://blog.furen.link/4116163212/"/>
    <id>https://blog.furen.link/4116163212/</id>
    <published>2025-02-10T14:45:14.000Z</published>
    <updated>2025-07-18T14:41:00.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><blockquote><p>2023年的总结也顺带塞进来惹</p></blockquote><h2 id="诈尸时间"><a href="#诈尸时间" class="headerlink" title="诈尸时间"></a>诈尸时间</h2><p>其实23年下半旬开始，到24年FurryGooo之前；我的身边出了些状况，在处理与处理的路上来回奔波，本体也日渐消瘦……</p><p>因此，本站与文章相关的更新基本停滞，仅进行基础功能的维护。</p><p>直到工作相对稳定后，开始文章补全计划。</p><h3 id="2023年7月"><a href="#2023年7月" class="headerlink" title="2023年7月"></a>2023年7月</h3><p>没想到裸考的网工顺利通过，也是最后一次采用笔试的考试（作弊过于猖獗，部分考场的垃圾桶能看到小抄）</p><p><img src="https://bu.dusays.com/2025/03/18/67d9860e26748.webp" alt="裸考网工"></p><h3 id="2023年10月"><a href="#2023年10月" class="headerlink" title="2023年10月"></a>2023年10月</h3><blockquote><p>“欸？你不是要买小米13么” </p><p>“就说这素不素13嘛”（战术摇摆.gif）</p></blockquote><p>与老朋友们面基，顺带“被忽悠”入了台红米 Note 13 Pro</p><img src="https://bu.dusays.com/2025/03/18/67d98614c528c.webp" alt="剁手，狠狠地剁手" style="zoom:50%;" /><h3 id="2023年12月"><a href="#2023年12月" class="headerlink" title="2023年12月"></a>2023年12月</h3><p>无伤速通 Ansible</p><img src="https://bu.dusays.com/2025/03/18/67d986191ce3f.webp" alt="速通Ansible" style="zoom:50%;" /><h3 id="2024年1月"><a href="#2024年1月" class="headerlink" title="2024年1月"></a>2024年1月</h3><p>在此之前，用的还是 VanBlog 博客系统。</p><p><img src="https://bu.dusays.com/2025/06/23/68596b240b6ad.webp" alt="VanBlog博客系统时的样子"></p><p>考虑到投入与维护成本，还是将博客系统从 VanBlog 换成 Hexo 了。小窝大多数服务通过 <a href="https://vercel.com/?blank">Vercel</a> 托管，数据库为 <a href="https://www.mongodb.com/?blank">MongoDB</a> ，图片存储在 <a href="https://7bu.top/?blanlk">去不图床</a> 。Hexo主题方面，用的 <a href="https://github.com/everfu?blank">伍十七</a> 制作的 <a href="https://github.com/everfu/hexo-theme-solitude?blank">Solitude</a> 。</p><p><img src="https://bu.dusays.com/2025/03/18/67d9861bd38ea.webp" alt="更换博客系统"></p><p>来简单回顾下2023年用 VanBlog 系统时期的 PV 信息吧，本身也不报太大期望（毕竟没做SEO，加之香港小水管服务器），不过数据看起来还行。（当时站点被半路出家学网安的舍友当靶场玩，没搞出什么明堂，反倒PV刷了不少🤔）</p><p><img src="https://bu.dusays.com/2025/03/18/67d9861f9068e.webp" alt="PV信息"></p><h3 id="2024年2月"><a href="#2024年2月" class="headerlink" title="2024年2月"></a>2024年2月</h3><p>把用了7年的索尼A6300出掉，换松下S5噜（左边的，右边是好友的GX85）。至于为何一换一部不吱声，只因帮好友收了两台机器没两天全涨价😭。</p><p><img src="https://bu.dusays.com/2025/03/18/67d9862381b58.webp" alt="换相机噜"></p><h3 id="2024年4月"><a href="#2024年4月" class="headerlink" title="2024年4月"></a>2024年4月</h3><p>一次很特别的小聚，反手就约了2.0（yee）</p><p><img src="https://bu.dusays.com/2025/06/23/68596df3d4852.webp" alt="特别的小聚"></p><h3 id="2024年6月"><a href="#2024年6月" class="headerlink" title="2024年6月"></a>2024年6月</h3><p>「花开数朵，天各一方」</p><p>毕业确实不舍，没考研略有遗憾；不过路途漫漫，待花在春风中绽放……</p><p><img src="https://bu.dusays.com/2025/03/18/67d9862d705ee.webp" alt="最后几天见猫师兄噜"></p><h3 id="2024年8月"><a href="#2024年8月" class="headerlink" title="2024年8月"></a>2024年8月</h3><p>自组的 MineCraft 怀旧服已平稳运行一年，可惜能玩的时间越来越少……</p><p><img src="https://bu.dusays.com/2025/06/23/68596c7505dbe.webp" alt="MinecraftServer"></p><h3 id="2024年9月"><a href="#2024年9月" class="headerlink" title="2024年9月"></a>2024年9月</h3><p>剁手 AirPods 4，总算不怕走着走着掉耳机惹。</p><p>到货三天的体验：佩戴相对无感，油耳用户狂喜；调音偏大众口味，低频不轰头。降噪略微有耳压感，一般环境下能与xm3五五开，不过坐飞机啥的就要打折扣了。</p><p><img src="https://bu.dusays.com/2025/03/18/67d9863162656.webp" alt="剁手剁手剁手"></p><p>PS：这家伙偷偷补全😠（然而补全的部分都完工了，可2.0还没到😭）</p><h3 id="2024年11月"><a href="#2024年11月" class="headerlink" title="2024年11月"></a>2024年11月</h3><p>回校小聚？顺带出个小半装</p><p>PS：接着就是在赶工作DDL惹</p><h2 id="新年期望"><a href="#新年期望" class="headerlink" title="新年期望"></a>新年期望</h2><p>新的一年，还是希望能继续调养好自己（hhh），过的开心就彳亍。</p><ul><li><input disabled="" type="checkbox"> 迈向DevOps</li><li><input disabled="" type="checkbox"> 逐步恢复体能</li><li><input disabled="" type="checkbox"> 一场说走就走的旅行</li><li><input disabled="" type="checkbox"> 搭建自己的小拍摄间</li></ul><p>最后，感谢各位的支持与关注！新的一年，无限进步～</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;2023年的总结也顺带塞进来惹&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;诈尸时间&quot;&gt;&lt;a href=&quot;#诈尸时间&quot; class=&quot;headerlink&quot; title=&quot;诈尸时</summary>
      
    
    
    
    <category term="日常" scheme="https://blog.furen.link/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="总结" scheme="https://blog.furen.link/tags/%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>「福瑞福瑞福·新年特辑」随记</title>
    <link href="https://blog.furen.link/517018412/"/>
    <id>https://blog.furen.link/517018412/</id>
    <published>2025-01-24T03:45:14.000Z</published>
    <updated>2025-06-30T04:51:41.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><blockquote><p>时隔5个月，总算能舒舒服服的出毛了OwO</p></blockquote><h2 id="酒店"><a href="#酒店" class="headerlink" title="酒店"></a>酒店</h2><p>本次展子在广州祈福酒店举行，交通便利，紧邻「市广路」地铁站（广州地铁22号线），距离「广州南站」地铁15分钟。同时，半径1KM内有多个商圈，吃喝选择还是挺多的。</p><p><img src="https://bu.dusays.com/2025/02/06/67a4c767a57e6.webp" alt="酒店周边"></p><p>这次订的双床房，空间还行，就是床小了点QAQ。</p><p>主会场在酒店对面的「祈福俱乐部」，面积挺大的，在活动当天会开放内部联络通道，不用抱着尾巴过马路了。无论酒店还是会场，无需长时间等待就有电梯，有效出毛时间大幅增加。</p><h2 id="活动"><a href="#活动" class="headerlink" title="活动"></a>活动</h2><p>起的有点点晚，不过到会场的时，自由舞台才刚开始。</p><p>也许是时间紧迫，选曲方面有点……怪？</p><p>问题不大，咱主要是去出毛滴，会场的空调温度恰到好处，连续出近4小时无压力。</p><p>由于本体出毛且被其他XDW捉去狂RUA，游戏方面就没有详细参与了😭，不过有留意到游戏有做本体或出毛形态的建议程度，挺好的。</p><p>相关视频也传到小破站上了，剪的一般，还请各位谅解。（感谢各位出镜的XDW～）</p><p>签绘墙一览（拍摄时间为夜场结束前40分钟）</p><p><img src="https://bu.dusays.com/2025/02/06/67a48e9b42b65.webp" alt="签绘墙"></p><p>就是这个签绘墙的活动时间，huh（美工全责警告）</p><p><img src="https://bu.dusays.com/2025/02/06/67a48ea47de14.webp" alt="美工全责"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;blockquote&gt;
&lt;p&gt;时隔5个月，总算能舒舒服服的出毛了OwO&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;酒店&quot;&gt;&lt;a href=&quot;#酒店&quot; class=&quot;headerlink&quot; title=&quot;酒店</summary>
      
    
    
    
    <category term="日常" scheme="https://blog.furen.link/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="逛展" scheme="https://blog.furen.link/tags/%E9%80%9B%E5%B1%95/"/>
    
  </entry>
  
  <entry>
    <title>解除HP ProDesk 400G1 小主机的处理器限制</title>
    <link href="https://blog.furen.link/2632072129/"/>
    <id>https://blog.furen.link/2632072129/</id>
    <published>2024-09-15T03:45:14.000Z</published>
    <updated>2025-04-07T10:50:01.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前情提要"><a href="#前情提要" class="headerlink" title="前情提要"></a>前情提要</h2><p>闲来无事，收了台HP的1L小主机（ProDesk 400G1 DM），想着跑些Docker玩玩，为后续搭建Homelab做点点准备。</p><p>原机器应该是企业淘汰下来的，配置并不高，G3250T辅以2G内存，属实不够看。于是做了回水鱼，在AM4平台白菜价的4202年，入手了E3-1265LV3，并在“垃圾箱”里翻出8G内存和120G固态，升级下这个小家伙。</p><p>殊不知，可能是供电实在是太寒碜了，官方BIOS仅支持TDP为35w的CPU，超过该功率的虽然能开机，但是不按<kbd>F1</kbd>忽略提示则会自动关机（如下图所示，图转的），有点尴尬。</p><p><img src="https://bu.dusays.com/2024/11/04/67285d0ebfe2f.webp" alt="不受支持的CPU_转载"></p><p>毕竟是当服务器用，总不能每次重启都要专门跑去跳过，故寻找解决办法……</p><h2 id="需要准备"><a href="#需要准备" class="headerlink" title="需要准备"></a>需要准备</h2><blockquote><p>提示：虽然解除了CPU限制，但本身主板供电能力还是很弱的，依旧存在35w的功耗墙限制，建议搭配TDP小于等于45w的处理器。</p></blockquote><ol><li>烧录工具与解除限制的BIOS： <a href="https://www.mediafire.com/file/nlornajps7gqxh4/HP_400G1DM_nvmeBoot_CPUall.zip/file?_blank">MediaFire网盘 </a>   <a href="https://www.123684.com/s/j29uVv-6fc3H?_blank_">123网盘（密码：rIUS）</a></li><li>小主机需运行Windows系统</li></ol><h2 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h2><h3 id="1-调整跳线帽位置"><a href="#1-调整跳线帽位置" class="headerlink" title="1.调整跳线帽位置"></a>1.调整跳线帽位置</h3><p>根据图示，调整跳线帽到印刷有<code>FDO</code>字样的上方。</p><p><img src="https://bu.dusays.com/2024/11/04/67285d0abc97b.webp" alt="1-跳线帽原先的位置"></p><p>调整后的位置如下图所示</p><p><img src="https://bu.dusays.com/2024/11/04/67285d0ccb64c.webp" alt="2-将跳线帽移到此处"></p><h3 id="2-烧录破解BIOS"><a href="#2-烧录破解BIOS" class="headerlink" title="2.烧录破解BIOS"></a>2.烧录破解BIOS</h3><p>解压压缩包，其中 <code>Flash Programming Tool</code>是BIOS烧录相关的工具集，根据已运行的系统进行选择，本文以 <code>WIN64</code> 目录下的 <code>fptw64.exe</code> 进行演示。</p><blockquote><p><strong>提示：刷机有风险，请谨慎对待！刷入过程中严禁断电！</strong></p></blockquote><ol><li><p>备份BIOS</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fptw64.exe -BIOS -D <span class="number">400</span>G1DM_OLD_BIOS.bin</span><br></pre></td></tr></table></figure></li><li><p>备份ME</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fptw64.exe -ME -D <span class="number">400</span>G1DM_OLD_ME.bin</span><br></pre></td></tr></table></figure></li><li><p>备份CMOS</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fptw64.exe -ADDRESS <span class="number">0</span> -D <span class="number">400</span>G1DM_OLD_ALL.bin</span><br></pre></td></tr></table></figure></li><li><p>刷入新BIOS</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fptw64.exe -BIOS -F <span class="number">400</span>_G1DM_nvmeBoot_CPUall.bin</span><br></pre></td></tr></table></figure></li></ol><h3 id="3-重启设备"><a href="#3-重启设备" class="headerlink" title="3.重启设备"></a>3.重启设备</h3><p>重启设备后，应该不再提示告警信息，同时恢复默认配置，需要重新处理。</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;闲来无事，收了台HP的1L小主机（ProDesk 400G1 </summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="小主机" scheme="https://blog.furen.link/tags/%E5%B0%8F%E4%B8%BB%E6%9C%BA/"/>
    
    <category term="改造" scheme="https://blog.furen.link/tags/%E6%94%B9%E9%80%A0/"/>
    
  </entry>
  
  <entry>
    <title>「FurryGooo·雾海秘境」随记</title>
    <link href="https://blog.furen.link/3426348331/"/>
    <id>https://blog.furen.link/3426348331/</id>
    <published>2024-08-12T03:45:14.000Z</published>
    <updated>2025-06-30T04:51:55.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="第一次逛展"><a href="#第一次逛展" class="headerlink" title="第一次逛展"></a>第一次逛展</h2><p>这是笔者第一次逛兽展，跟以往参与的漫展不同，前者普遍提早放票；这不，8月的展子，5月初能订票了。原计划想着能在展子出毛，可惜被装师鸽了，只能当当陪同与摄影（大哭）。</p><p><img src="https://bu.dusays.com/2024/11/04/6728dd413f438.webp" alt="门票"></p><p>如图可知，展子所在的酒店在佛山南海与广州番禺的交界；在「广州南站」搭乘<code>佛山地铁2号线</code> 到「林岳西」转 <code>南海有轨电车1号线</code> 到「文翰湖公园（季华实验室）」，半小时可达。</p><p><img src="https://bu.dusays.com/2024/11/04/6728dde19a026.webp" alt="南海有轨电车"></p><p>到会场啦，签绘墙一览（拍摄于8月11日上午）。</p><p><img src="https://bu.dusays.com/2024/11/04/6728dde724846.jpg" alt="签绘墙"></p><h2 id="逛展感受"><a href="#逛展感受" class="headerlink" title="逛展感受"></a>逛展感受</h2><p>在当陪同与摄影期间，感受到大家的热爱，同时结识到一批新伙伴；最终成片192张，辅以两期视频（已传到小破站啦）。</p><img src="https://bu.dusays.com/2024/11/04/6728dde948cf5.webp" alt="返图数量" style="zoom:50%;" /><p>会场的灯光条件一般，需要特别注意快门时机；本次拍摄用的美科85mm f1.8大光定，画质对得起价格，50定普遍存在的偏黄问题倒是没遇到，就是这个对焦环反馈延迟有那么亿点大，不算舒服……</p><p>欢乐的时光总是短暂的，感谢期间帮助过的XDW们～</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;这是笔者第一次逛兽展，跟以往参与的漫展不同，前者普遍提</summary>
      
    
    
    
    <category term="日常" scheme="https://blog.furen.link/categories/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="逛展" scheme="https://blog.furen.link/tags/%E9%80%9B%E5%B1%95/"/>
    
  </entry>
  
  <entry>
    <title>通过DRBD实现NFS的高可用</title>
    <link href="https://blog.furen.link/3375181189/"/>
    <id>https://blog.furen.link/3375181189/</id>
    <published>2024-05-18T11:45:20.000Z</published>
    <updated>2025-04-07T10:49:04.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote><p>毕设整了一堆（烂）活，本文是期间实现NFS服务高可用的笔记。</p></blockquote><p>期间曾试过 <code>rsync</code> 与 <code>sersync</code>作为NFS服务的同步方案，不过很遗憾，这方案收敛实在是太慢了，而且收敛完成后，客户端还需要重新挂载，这对于一些实时性要求高的服务来说，是个灾难。在多方检索后，基于分布式思想的<code>DRBD</code>映入眼帘……</p><table><thead><tr><th align="center">服务</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">NFS</td><td align="center">高性能的文件共享协议</td></tr><tr><td align="center">DRBD</td><td align="center">一种通过TCP&#x2F;IP网络实现块设备数据实时镜像的方案<br>通过<strong>双主模式</strong>，实现类似RAID-1的网络高可用共享存储</td></tr><tr><td align="center">Keepalived</td><td align="center">基于VRRP协议来实现的服务高可用方案</td></tr></tbody></table><h2 id="规划"><a href="#规划" class="headerlink" title="规划"></a>规划</h2><p>使用两台虚拟机分别作为NFS主备服务器，以及一台虚拟机作为NFS客户端以便测试。其中，NFS主备服务器的系统均为 Rocky Linux 9 ，NFS客户端为 CentOS 7.6 ；NFS主备服务器的地址规划如下表所示。</p><table><thead><tr><th align="center">主机名</th><th align="center">IP地址</th><th align="center">备注</th></tr></thead><tbody><tr><td align="center">renNFS</td><td align="center">172.24.5.25</td><td align="center">虚拟负载</td></tr><tr><td align="center">renNFS-Master</td><td align="center">172.24.5.23</td><td align="center">主NFS</td></tr><tr><td align="center">renNFS-Slave</td><td align="center">172.24.5.34</td><td align="center">备用NFS</td></tr></tbody></table><h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><blockquote><p>提示：如无特殊说明，以下步骤均需要在主备NFS服务器上进行操作。</p></blockquote><h3 id="A-基础环境配置"><a href="#A-基础环境配置" class="headerlink" title="A.基础环境配置"></a>A.基础环境配置</h3><ol><li><p>禁用安全上下文与关闭防火墙</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sed -i <span class="string">&#x27;s/SELINUX=enforcing/SELINUX=disabled/g&#x27;</span> /etc/selinux/config</span><br><span class="line">systemctl stop firewalld</span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld</span><br><span class="line">setenforce 0</span><br></pre></td></tr></table></figure></li><li><p>添加Hosts</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF &gt;&gt; /etc/hosts</span></span><br><span class="line"><span class="string">172.24.5.23 renNFS-Master</span></span><br><span class="line"><span class="string">172.24.5.24 renNFS-Slave</span></span><br><span class="line"><span class="string">172.24.5.25 renNFS</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure></li><li><p>使用<code>fdisk</code>命令为磁盘分区</p></li></ol><h3 id="B-部署DRBD"><a href="#B-部署DRBD" class="headerlink" title="B.部署DRBD"></a>B.部署DRBD</h3><h4 id="1-安装EPEL源"><a href="#1-安装EPEL源" class="headerlink" title="1.安装EPEL源"></a>1.安装<code>EPEL</code>源</h4><p>只因DRBD在此库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org</span><br><span class="line">yum install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm</span><br></pre></td></tr></table></figure><h4 id="2-安装DRBD"><a href="#2-安装DRBD" class="headerlink" title="2.安装DRBD"></a>2.安装DRBD</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum list all | grep -i drbd</span><br><span class="line">yum install -y drbd9x-utils kmod-drbd9x</span><br></pre></td></tr></table></figure><h4 id="3-加载DRBD"><a href="#3-加载DRBD" class="headerlink" title="3.加载DRBD"></a>3.加载DRBD</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">modprobe drbd</span><br><span class="line"><span class="built_in">echo</span> drbd &gt; /etc/modules-load.d/drbd.conf</span><br><span class="line">modprobe drbd</span><br><span class="line">lsmod |grep drbd</span><br></pre></td></tr></table></figure><p>加载完成，如下图所示</p><img src="https://bu.dusays.com/2024/11/06/672aedf34bf33.png" alt="DRBD-1" style="zoom: 80%;" /><img src="https://bu.dusays.com/2024/11/06/672aedf67aad9.png" alt="DRBD-2" style="zoom:80%;" /><h4 id="4-修改配置文件"><a href="#4-修改配置文件" class="headerlink" title="4.修改配置文件"></a>4.修改配置文件</h4><blockquote><p><strong>提示：DRBD配置文件</strong></p><ul><li><p>主配置文件 ：<code>/etc/drbd.conf</code></p></li><li><p>全局配置文件：<code>/etc/drbd.d/global_common.conf </code> </p></li><li><p>说明：<code>/etc/drbd.conf</code></p></li></ul></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><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="built_in">mv</span> /etc/drbd.d/global_common.conf /etc/drbd.d/global_common.conf.bak</span><br><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/drbd.d/global_common.conf</span></span><br><span class="line"><span class="string">global &#123;</span></span><br><span class="line"><span class="string">usage-count no; # 是否参加DRBD使用统计，默认为yes</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">common &#123;</span></span><br><span class="line"><span class="string">protocol C; # 使用DRBD的同步协议，添加这一行</span></span><br><span class="line"><span class="string">handlers &#123;</span></span><br><span class="line"><span class="string">pri-on-incon-degr &quot;/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b &gt; /proc/sysrq-trigger ; reboot -f&quot;;</span></span><br><span class="line"><span class="string">pri-lost-after-sb &quot;/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b &gt; /proc/sysrq-trigger ; reboot -f&quot;;</span></span><br><span class="line"><span class="string">local-io-error &quot;/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o &gt; /proc/sysrq-trigger ; halt -f&quot;;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">startup &#123;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">options &#123;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">disk &#123;</span></span><br><span class="line"><span class="string">on-io-error detach; # 配置I/O错误处理策略为分离</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">net &#123;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>💡提示：工作模式说明</strong></p><ul><li><strong>协议A</strong>：异步复制协议。一旦本地磁盘写入已完成且数据包已在发送队列中，则会被认为是完成的。在一个节点发生故障时可能会丢失，因为被写入到远程节点上的数据可能仍在发送队列中。尽管在故障转移节点上的数据一致，但没有及时更新。通常用于地理上分开的节点（本地写成功后立即返回，数据放在发送buffer中，可能丢失）； </li><li><strong>协议B</strong>：内存同步（半同步）复制协议。一旦本地磁盘写入完成且复制数据包达到了对等节点，则认为写在主节点上会被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况，因为在传输中的数据可能不会被提交到磁盘（本地写成功并将数据发送到对方后立即返回，如果双机掉电，数据可能丢失；</li><li><strong>协议C</strong>：同步复制协议。只有在本地和远程节点的磁盘均确认了写操作完成时才会被认为完成。没有任何数据丢失！所以这是一个群集节点的流行模式，但I&#x2F;O吞吐量依赖于网络带宽。<strong>一般选用此模式</strong></li></ul></blockquote><h4 id="5-创建资源文件"><a href="#5-创建资源文件" class="headerlink" title="5.创建资源文件"></a>5.创建资源文件</h4><blockquote><p><strong>提示</strong></p><ul><li><p>本文配置了软件RAID-1，故本地磁盘设置为 <code>/dev/md1</code>，可根据实际情况进行修改；</p></li><li><p><strong>资源名与资源文件的名字需保持一致</strong></p><p>如本文要建立的资源为<code>nfs</code>，故资源文件应该为<code>nfs.res</code></p></li></ul></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><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"><span class="built_in">cat</span> &gt; /etc/drbd.d/nfs.res &lt;&lt; <span class="string">EOF</span></span><br><span class="line"><span class="string"># 资源名与文件名要一致（如nfs对应nfs.res），根据实际情况进行修改</span></span><br><span class="line"><span class="string">resource nfs &#123;</span></span><br><span class="line"><span class="string">  protocol C; # 使用协议</span></span><br><span class="line"><span class="string">  disk /dev/md1; # 本地磁盘，根据实际情况进行修改</span></span><br><span class="line"><span class="string">  device /dev/drbd0; # DRBD设备名称，根据实际情况进行修改</span></span><br><span class="line"><span class="string">  meta-disk internal;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  # 设置DRBD监听地址与端口[主]，名字最好与Host记录一致</span></span><br><span class="line"><span class="string">  on renNFS-Master &#123;</span></span><br><span class="line"><span class="string">         address 172.24.5.23:7789;</span></span><br><span class="line"><span class="string">  &#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">  # 设置DRBD监听地址与端口[备]，名字最好与Host记录一致</span></span><br><span class="line"><span class="string">  on renNFS-Slave &#123;</span></span><br><span class="line"><span class="string">         address 172.24.5.24:7789; </span></span><br><span class="line"><span class="string">  &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h4 id="6-启动DRBD"><a href="#6-启动DRBD" class="headerlink" title="6.启动DRBD"></a>6.启动DRBD</h4><p>首先，<strong>主备NFS服务器均执行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">drbdadm create-md nfs</span><br><span class="line">drbdadm up nfs</span><br></pre></td></tr></table></figure><ul><li><p>结果如下图所示</p><p><img src="https://bu.dusays.com/2024/11/06/672aedfe3ab73.png" alt="DRBD-3"></p><p><img src="https://bu.dusays.com/2024/11/06/672aee0027a1f.png" alt="DRBD-4"></p></li></ul><p>随后，为<code>renNFS-Master</code>设置为主节点，<strong>在主NFS服务器上执行</strong>（资源名需要与前面配置的资源文件保持一致）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drbdadm primary nfs --force</span><br></pre></td></tr></table></figure><ul><li><p>结果如下图所示</p><p><img src="https://bu.dusays.com/2024/11/06/672aee02c864a.png" alt="DRBD-5"></p><blockquote><p>DRBD常用命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&gt;drbdadm cstate nfs<span class="comment">#连接状态</span></span><br><span class="line">&gt;drbdadm dstate nfs<span class="comment">#磁盘状态</span></span><br><span class="line">&gt;drbdadm role nfs<span class="comment">#资源角色</span></span><br><span class="line">&gt;drbdadm primary nfs<span class="comment">#提升资源</span></span><br><span class="line">&gt;drbdadm secondary nfs<span class="comment">#降级资源</span></span><br></pre></td></tr></table></figure></blockquote></li></ul><h4 id="7-创建文件系统"><a href="#7-创建文件系统" class="headerlink" title="7.创建文件系统"></a>7.创建文件系统</h4><blockquote><p>💡提示：文件系统只能挂载在主(Primary)节点上，因此在设置好主节点后才可以对DRBD设备进行格式化操作格式化文件系统</p><ul><li><p>可以使用 <code>drbdadm role data</code> 命令查看情况</p></li><li><p>Primary：当前节点为主，在前面为当前节点</p></li></ul><p> Secondary：备用节点为次 </p></blockquote><p><strong>在主NFS服务器上执行</strong>（即<code>renNFS-Master</code>）</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkfs.ext4 /dev/drbd0</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/06/672aee295ff78.png" alt="DRBD-6"></p><ol><li><p>验证DRBD</p><ul><li><p>为每个服务器创建挂载点（<code>mkdir /share</code>）</p></li><li><p>在<strong>主NFS服务器</strong>上挂载（<code>mount /dev/drbd0 /share</code>），并写入一些文件（<code>touch /share/file{a,b}</code>）</p><p><img src="https://bu.dusays.com/2024/11/06/672aee2de3536.png" alt="DRBD-7"></p></li><li><p>随后卸载（<code>umount /share</code>），切换到备用节点（<code>drbdadm secondary nfs</code>）</p><p><img src="https://bu.dusays.com/2024/11/06/672aee30db028.png" alt="DRBD-8"></p></li><li><p>在<strong>备用NFS服务器</strong>上执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">drbdadm primary nfs</span><br><span class="line">mount /dev/drbd0 /share</span><br><span class="line"><span class="built_in">ls</span> /share</span><br></pre></td></tr></table></figure><p>应能看到同步到的文件</p><p><img src="https://bu.dusays.com/2024/11/06/672aee3718bbf.png" alt="DRBD-9"></p><p><img src="https://bu.dusays.com/2024/11/06/672aee3f5157c.png" alt="DRBD-10"></p></li></ul></li></ol><h4 id="8-设置开机自启"><a href="#8-设置开机自启" class="headerlink" title="8.设置开机自启"></a>8.设置开机自启</h4>   <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> --now drbd</span><br></pre></td></tr></table></figure><h3 id="C-部署NFS"><a href="#C-部署NFS" class="headerlink" title="C.部署NFS"></a>C.部署NFS</h3><p>每个NFS服务器都需要部署；这没啥好说的，有手就行。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">yum -y install nfs-utils rpcbind</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&#x27;/share 172.24.5.0/24(rw,sync,no_root_squash)&#x27;</span> &gt;&gt; /etc/exports</span><br><span class="line">systemctl <span class="built_in">enable</span> nfs-server.service --now</span><br><span class="line">systemctl <span class="built_in">enable</span> rpcbind --now</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/06/672aee451ab8f.png" alt="DRBD-11"></p><h3 id="D-部署Keepalived"><a href="#D-部署Keepalived" class="headerlink" title="D.部署Keepalived"></a>D.部署Keepalived</h3><h4 id="1-安装Keepalived"><a href="#1-安装Keepalived" class="headerlink" title="1.安装Keepalived"></a>1.安装Keepalived</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum install -y keepalived.x86_64</span><br><span class="line"><span class="built_in">mkdir</span> /etc/keepalived/logs</span><br></pre></td></tr></table></figure><h4 id="2-主NFS服务器配置"><a href="#2-主NFS服务器配置" class="headerlink" title="2.主NFS服务器配置"></a>2.主NFS服务器配置</h4><blockquote><p>提示：根据实际情况进行修改</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak</span><br><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/keepalived.conf</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">! Configuration File for keepalived</span></span><br><span class="line"><span class="string">global_defs &#123;</span></span><br><span class="line"><span class="string">  notification_email &#123;</span></span><br><span class="line"><span class="string">    root@localhost</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string">  notification_email_from keepalived@localhost</span></span><br><span class="line"><span class="string">  smtp_server 127.0.0.1</span></span><br><span class="line"><span class="string">  smtp_connect_timeout 30</span></span><br><span class="line"><span class="string">  router_id DRBD_HA_MASTER</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string">vrrp_script chk_nfs &#123;</span></span><br><span class="line"><span class="string">        script &quot;/etc/keepalived/check_nfs.sh&quot;</span></span><br><span class="line"><span class="string">        interval 5</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">    vrrp_instance VI_1 &#123;</span></span><br><span class="line"><span class="string">        state MASTER</span></span><br><span class="line"><span class="string">        interface ens160</span></span><br><span class="line"><span class="string">        virtual_router_id 51</span></span><br><span class="line"><span class="string">        priority 150</span></span><br><span class="line"><span class="string">        advert_int 1</span></span><br><span class="line"><span class="string">        authentication &#123;</span></span><br><span class="line"><span class="string">            auth_type PASS</span></span><br><span class="line"><span class="string">            auth_pass 114514</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        track_script &#123;</span></span><br><span class="line"><span class="string">            chk_nfs</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">    notify_stop /etc/keepalived/notify_stop.sh        </span></span><br><span class="line"><span class="string">    notify_master /etc/keepalived/notify_master.sh    </span></span><br><span class="line"><span class="string">    virtual_ipaddress &#123;</span></span><br><span class="line"><span class="string">        172.24.5.25</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h4 id="3-备用NFS服务器配置"><a href="#3-备用NFS服务器配置" class="headerlink" title="3.备用NFS服务器配置"></a>3.备用NFS服务器配置</h4><blockquote><p>提示：根据实际情况进行修改</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak</span><br><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/keepalived.conf</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">! Configuration File for keepalived</span></span><br><span class="line"><span class="string">global_defs &#123;</span></span><br><span class="line"><span class="string">  notification_email &#123;</span></span><br><span class="line"><span class="string">    root@localhost</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string">  notification_email_from keepalived@localhost</span></span><br><span class="line"><span class="string">  smtp_server 127.0.0.1</span></span><br><span class="line"><span class="string">  smtp_connect_timeout 30</span></span><br><span class="line"><span class="string">  router_id DRBD_HA_BACKUP</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string">vrrp_instance VI_1 &#123;</span></span><br><span class="line"><span class="string">    state BACKUP</span></span><br><span class="line"><span class="string">    interface ens160</span></span><br><span class="line"><span class="string">    virtual_router_id 51</span></span><br><span class="line"><span class="string">    priority 100</span></span><br><span class="line"><span class="string">    advert_int 1</span></span><br><span class="line"><span class="string">    authentication &#123;</span></span><br><span class="line"><span class="string">        auth_type PASS</span></span><br><span class="line"><span class="string">        auth_pass 114514</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">    notify_master /etc/keepalived/notify_master.sh</span></span><br><span class="line"><span class="string">    notify_backup /etc/keepalived/notify_backup.sh</span></span><br><span class="line"><span class="string"> </span></span><br><span class="line"><span class="string">    virtual_ipaddress &#123;</span></span><br><span class="line"><span class="string">        172.24.5.25</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h4 id="4-配置脚本"><a href="#4-配置脚本" class="headerlink" title="4.配置脚本"></a>4.配置脚本</h4><blockquote><p>提示：虽然Keepalived能实现地址的故障转移，但是DRBD服务的优先级并没有及时降级，需通过脚本完善。</p></blockquote><h5 id="a-在主NFS服务器上"><a href="#a-在主NFS服务器上" class="headerlink" title="a.在主NFS服务器上"></a>a.在主NFS服务器上</h5><p>检测NFS可用性脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/chk_nfs.sh</span></span><br><span class="line"><span class="string">#!/bin/bash</span></span><br><span class="line"><span class="string"># 检查NFS服务状态</span></span><br><span class="line"><span class="string">systemctl status nfs-server &amp;&gt;/dev/null</span></span><br><span class="line"><span class="string">if [ $? -ne 0 ];then</span></span><br><span class="line"><span class="string">    # 如果服务状态不正常，先尝试重启服务</span></span><br><span class="line"><span class="string">    systemctl restart nfs-server</span></span><br><span class="line"><span class="string">    systemctl status nfs-server &amp;&gt;/dev/null</span></span><br><span class="line"><span class="string">    if [ $? -ne 0 ];then</span></span><br><span class="line"><span class="string">        # 若重启nfs服务后，仍不正常</span></span><br><span class="line"><span class="string">        # 卸载drbd设备</span></span><br><span class="line"><span class="string">        umount /dev/drbd0</span></span><br><span class="line"><span class="string">        # 将drbd主降级为从设备（最后的nfs根据实际情况进行修改）</span></span><br><span class="line"><span class="string">        drbdadm secondary nfs</span></span><br><span class="line"><span class="string">        # 关闭keepalived</span></span><br><span class="line"><span class="string">        systemctl stop keepalived</span></span><br><span class="line"><span class="string">    fi</span></span><br><span class="line"><span class="string">fi</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 0755 /etc/keepalived/check_nfs.sh</span><br></pre></td></tr></table></figure><p>主节点降级操作脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/notify_stop.sh</span></span><br><span class="line"><span class="string">#!/bin/bash</span></span><br><span class="line"><span class="string"># 时间戳</span></span><br><span class="line"><span class="string">time=`date &quot;+%F  %H:%M:%S&quot;`</span></span><br><span class="line"><span class="string">echo -e &quot;$time  ------notify_stop------\n&quot; &gt;&gt; /etc/keepalived/logs/notify_stop.log</span></span><br><span class="line"><span class="string"># 停止NFS服务</span></span><br><span class="line"><span class="string">systemctl stop nfs-server &amp;&gt;&gt; /etc/keepalived/logs/notify_stop.log</span></span><br><span class="line"><span class="string"># 卸载目录</span></span><br><span class="line"><span class="string">/bin/umount /share &amp;&gt;&gt; /etc/keepalived/logs/notify_stop.log</span></span><br><span class="line"><span class="string"># 降级处理（设为辅助节点）</span></span><br><span class="line"><span class="string">/sbin/drbdadm secondary nfs &amp;&gt;&gt; /etc/keepalived/logs/notify_stop.log</span></span><br><span class="line"><span class="string">echo -e &quot;\n&quot; &gt;&gt; /etc/keepalived/logs/notify_stop.log</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 0755 /etc/keepalived/notify_stop.sh</span><br></pre></td></tr></table></figure><p>挂载脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/notify_master.sh</span></span><br><span class="line"><span class="string">#!/bin/bash</span></span><br><span class="line"><span class="string"># 时间戳</span></span><br><span class="line"><span class="string">time=`date &quot;+%F  %H:%M:%S&quot;`</span></span><br><span class="line"><span class="string">echo -e &quot;$time    ------notify_master------\n&quot; &gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 提级处理（设为主节点）</span></span><br><span class="line"><span class="string">/sbin/drbdadm primary nfs &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 挂载目录</span></span><br><span class="line"><span class="string">/bin/mount /dev/drbd0 /share &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 重启NFS服务</span></span><br><span class="line"><span class="string">systemctl restart nfs-server &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string">echo -e &quot;\n&quot; &gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 0755 /etc/keepalived/notify_master.sh</span><br></pre></td></tr></table></figure><h5 id="b-在备用NFS服务器上"><a href="#b-在备用NFS服务器上" class="headerlink" title="b.在备用NFS服务器上"></a>b.在备用NFS服务器上</h5><p>挂载脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/notify_master.sh</span></span><br><span class="line"><span class="string">#!/bin/bash</span></span><br><span class="line"><span class="string"># 时间戳</span></span><br><span class="line"><span class="string">time=`date &quot;+%F  %H:%M:%S&quot;`</span></span><br><span class="line"><span class="string">echo -e &quot;$time    ------notify_master------\n&quot; &gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 提级处理（设为主节点）</span></span><br><span class="line"><span class="string">/sbin/drbdadm primary nfs &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 挂载目录</span></span><br><span class="line"><span class="string">/bin/mount /dev/drbd0 /share &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"># 重启NFS服务</span></span><br><span class="line"><span class="string">systemctl restart nfs-server &amp;&gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string">echo -e &quot;\n&quot; &gt;&gt; /etc/keepalived/logs/notify_master.log</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 0755 /etc/keepalived/notify_master.sh</span><br></pre></td></tr></table></figure><p>从节点降级操作用脚本</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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"><span class="built_in">cat</span> &lt;&lt; <span class="string">EOF | tee /etc/keepalived/notify_backup.sh</span></span><br><span class="line"><span class="string">#!/bin/bash</span></span><br><span class="line"><span class="string"># 时间戳 </span></span><br><span class="line"><span class="string">time=`date &quot;+%F  %H:%M:%S&quot;`</span></span><br><span class="line"><span class="string">echo -e &quot;$time    ------notify_backup------\n&quot; &gt;&gt; /etc/keepalived/logs/notify_backup.log</span></span><br><span class="line"><span class="string"># 停止NFS服务</span></span><br><span class="line"><span class="string">systemctl stop nfs-server &amp;&gt;&gt; /etc/keepalived/logs/notify_backup.log</span></span><br><span class="line"><span class="string"># 卸载目录</span></span><br><span class="line"><span class="string">/bin/umount /dev/drbd0 &amp;&gt;&gt; /etc/keepalived/logs/notify_backup.log</span></span><br><span class="line"><span class="string"># 降级处理（设为辅助节点）</span></span><br><span class="line"><span class="string">/sbin/drbdadm secondary nfs &amp;&gt;&gt; /etc/keepalived/logs/notify_backup.log</span></span><br><span class="line"><span class="string">echo -e &quot;\n&quot; &gt;&gt; /etc/keepalived/logs/notify_backup.log</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">EOF</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">chmod</span> 0755 /etc/keepalived/notify_backup.sh</span><br></pre></td></tr></table></figure><h4 id="5-设置开机自启"><a href="#5-设置开机自启" class="headerlink" title="5.设置开机自启"></a>5.设置开机自启</h4><p>为所有NFS服务器执行以下命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="built_in">enable</span> keepalived --now</span><br></pre></td></tr></table></figure><h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><h3 id="A-检查Keepalived"><a href="#A-检查Keepalived" class="headerlink" title="A.检查Keepalived"></a>A.检查Keepalived</h3><p>当服务正常运行时，在主NFS服务器中，可以看到有虚拟地址<code>172.24.5.25</code></p><p><img src="https://bu.dusays.com/2024/11/06/672aee51798d7.png" alt="DRBD-12"></p><p>在备用NFS服务器中，是没有虚拟地址的</p><p><img src="https://bu.dusays.com/2024/11/06/672aee559118e.png" alt="DRBD-13"></p><h3 id="B-模拟故障"><a href="#B-模拟故障" class="headerlink" title="B.模拟故障"></a>B.模拟故障</h3><p>如视频所示，当主NFS服务器断开连接时，会自动切换到备用NFS服务器；同时NFS客户端无需重新挂载，高可用实现达成。</p><p><img src="https://bu.dusays.com/2024/11/06/672aee597766f.webp" alt="Keepalive_DRBD_NFS_HA"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;blockquote&gt;
&lt;p&gt;毕设整了一堆（烂）活，本文是期间实现NFS服务高可用</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="DRBD" scheme="https://blog.furen.link/tags/DRBD/"/>
    
    <category term="NFS" scheme="https://blog.furen.link/tags/NFS/"/>
    
    <category term="高可用" scheme="https://blog.furen.link/tags/%E9%AB%98%E5%8F%AF%E7%94%A8/"/>
    
  </entry>
  
  <entry>
    <title>手动处理DRBD脑裂问题</title>
    <link href="https://blog.furen.link/2701189576/"/>
    <id>https://blog.furen.link/2701189576/</id>
    <published>2024-03-29T03:45:14.000Z</published>
    <updated>2025-04-07T10:48:56.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="啥是脑裂"><a href="#啥是脑裂" class="headerlink" title="啥是脑裂"></a>啥是脑裂</h2><p>通俗来说，倘若一个人有多个相互独立工作的大脑，便会“不听使唤”。</p><p>在高可用系统中，当相互联系的节点失联时（即原本为一个整体的系统，被分裂成多个独立的节点），这些节点便开始争抢共享资源的现象；这可不是什么好事，争抢资源会导致服务异常乃至数据损坏，需妥善处理。</p><h2 id="现象描述"><a href="#现象描述" class="headerlink" title="现象描述"></a>现象描述</h2><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>一组NFS双机热备，通过DRBD做数据管理与镜像同步。</p><p>DRBD（Distributed Replicated Block Device，分布式复制块设备），是一种基于软件的无共享功能的存储镜像模块；在高可用系统中使用，有概率出现脑裂情况。</p><table><thead><tr><th align="center">主机名</th><th align="center">作用</th><th align="center">DRBD元数据块名</th></tr></thead><tbody><tr><td align="center">renNFS-Master</td><td align="center">主节点（NFS、DRBD）</td><td align="center">nfs</td></tr><tr><td align="center">renNFS-Slave</td><td align="center">从节点（NFS、DRBD）</td><td align="center">nfs</td></tr></tbody></table><h3 id="征兆"><a href="#征兆" class="headerlink" title="征兆"></a>征兆</h3><p>在DRBD中，如果出现两节点的<code>connection</code>信息至少有一边处于 <code>StandAlone</code>或 <code>Connecting</code>（或 <code>WFConnection</code> ）状态，一般情况是脑裂的征兆。</p><p><img src="https://bu.dusays.com/2024/03/31/6609879e1231f.png" alt="image-20240328154717252"></p><p><img src="https://bu.dusays.com/2024/03/31/660987a1c514f.png" alt="image-20240328154700084"></p><p>通过<code>grep dropping /var/log/messages</code>命令查看系统日志</p><ul><li>如果有 <code>Split-Brain detected but unresolved, dsropping connection!</code>的提示信息，则出现脑裂。</li></ul><p><img src="https://bu.dusays.com/2024/03/31/660987a5e26c4.png" alt="image-20240328155030790"></p><h2 id="手动处理"><a href="#手动处理" class="headerlink" title="手动处理"></a>手动处理</h2><ol><li>首先，在 <strong>从NFS</strong> 节点，执行命令放弃该节点的数据。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drbdadm connect [元数据块名] --discard-my-data</span><br></pre></td></tr></table></figure><ol start="2"><li>随后，在 <strong>主NFS</strong>  节点，执行连接元数据块的命令。</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drbdadm connect [元数据块名]</span><br></pre></td></tr></table></figure><ol start="3"><li>稍等片刻，待两节点重新连接后，恢复正常通信。</li></ol><p><img src="https://bu.dusays.com/2024/03/31/660987ab35a8a.png" alt="image-20240328155459575"></p><p><img src="https://bu.dusays.com/2024/03/31/660987abdcfca.png" alt="image-20240328155424989"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;通俗来说，倘若一个人有多个相互独立工作的大脑，便会“不听使唤”</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="DRBD" scheme="https://blog.furen.link/tags/DRBD/"/>
    
  </entry>
  
  <entry>
    <title>通过Docker部署Zerotier Planet服务端</title>
    <link href="https://blog.furen.link/1911090610/"/>
    <id>https://blog.furen.link/1911090610/</id>
    <published>2023-11-01T01:45:00.000Z</published>
    <updated>2025-07-05T13:30:31.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>近期，阿里云向各大高校的学生群体发放300元无门槛代金券，可购买云服务器。笔者借此领取了一台一年的轻量应用服务器（1C1G）实例。</p><p>简单测试下服务器，它的网络质量还可以（两位数延迟），同时流量富裕，可谓一本满足。</p><p><img src="https://bu.dusays.com/2024/11/04/6728edd5693cb.jpg" alt="服务器测试"></p><p>刚好台式机已经放回住处托管，需要一个高效的远程方案；自从家宽的公网IPv4地址被回收后，用的内网穿透+RDP实现的远控，受制于中转服务器，体验只能说凑活。</p><p>此前也想过串流，但常见的串流工具基于P2P通信，需要公网地址的支持。</p><p>这不，实例不就用上啦？在这个白嫖的服务器上搭建ZeroTier组网服务器，将台式机与笔记本划分到同一个虚拟局域网，再通过Parsec实现远程串流。</p><h2 id="搭建"><a href="#搭建" class="headerlink" title="搭建"></a>搭建</h2><blockquote><p>申请完主机后，你会得到主机的 <u>公网IP</u> 和 <u>root密码</u> ，使用终端软件与主机进行通信即可。</p></blockquote><h3 id="1-修改服务器安全组"><a href="#1-修改服务器安全组" class="headerlink" title="1.修改服务器安全组"></a>1.修改服务器安全组</h3><blockquote><p>阿里云轻量应用服务器添加安全组：<a href="">点击跳转</a></p></blockquote><p>需要开放<strong>4000&#x2F;tcp</strong>端口（用于面板访问）， <strong>9993&#x2F;udp</strong> 端口（用于组网通信）。</p><p><img src="https://bu.dusays.com/2024/11/04/6728edd9aad0c.webp" alt="放通端口"></p><h3 id="2-在服务器上部署服务端"><a href="#2-在服务器上部署服务端" class="headerlink" title="2.在服务器上部署服务端"></a>2.在服务器上部署服务端</h3><blockquote><p>本文以Debian 12操作系统为例进行演示（其他Linux发行版也是类似操作哦）</p></blockquote><p><strong>1.更新系统软件包</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt update &amp;&amp; apt upgrade -y</span><br></pre></td></tr></table></figure><p> <strong>2.安装Docker</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">curl -fsSL https://get.docker.com -o get-docker.sh &amp;&amp; <span class="built_in">chmod</span> a+x get-docker.sh &amp;&amp; ./get-docker.sh</span><br></pre></td></tr></table></figure><p><strong>3.安装完成后，可通过<code>docker -v</code>查看Docker引擎的版本</strong></p><p><strong>4.创建容器「ZeroTier 控制器」</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">docker run --name zerotier-controller \</span><br><span class="line">--cap-add=NET_ADMIN \</span><br><span class="line">--<span class="built_in">env</span> ZU_DEFAULT_IPV4=0.0.0.0 \</span><br><span class="line">--<span class="built_in">env</span> ZU_DEFAULT_IPV6=0:0:0:0:0:0 \</span><br><span class="line">--<span class="built_in">env</span> ZU_DEFAULT_PORT=9993 \</span><br><span class="line">--volume /home/zerotier-data:/app \</span><br><span class="line">--network bridge \</span><br><span class="line">-p 4000:4000 \</span><br><span class="line">-p 9993:9993/udp \</span><br><span class="line">-d rotunlock/zerotier-controller</span><br></pre></td></tr></table></figure><p><strong>5.稍等片刻，直到创建完成</strong></p><p>可通过 <code>docker ps | grep zerotier-controller</code> 命令查看容器情况。</p><p><img src="https://bu.dusays.com/2025/07/05/68692122495f1.webp" alt="1-查看容器"></p><p><strong>6.获取登录密钥</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker logs zerotier-controller | grep Authtoken </span><br></pre></td></tr></table></figure><p>找到<code>Authtoken: xxx</code>这一行，提取冒号后面内容即可。</p><blockquote><p>容器每次启动时，会自动生成Authtoken，请妥善处理。</p></blockquote><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><h3 id="1-浏览器访问Zerotier服务的控制台"><a href="#1-浏览器访问Zerotier服务的控制台" class="headerlink" title="1.浏览器访问Zerotier服务的控制台"></a>1.浏览器访问Zerotier服务的控制台</h3><ul><li><p><code>http://[服务器的公网IP]:4000</code></p></li><li><p>输入刚刚获取到的密钥</p></li></ul><p><img src="https://bu.dusays.com/2025/06/30/68620ee03b104.webp" alt="2-控制台登录界面"></p><h3 id="2-记录虚拟网络信息"><a href="#2-记录虚拟网络信息" class="headerlink" title="2.记录虚拟网络信息"></a>2.记录虚拟网络信息</h3><ul><li><p>默认自带一个虚拟局域网，可单击该「Network ID」直接配置</p><p><img src="https://bu.dusays.com/2025/07/05/686922b1b4589.webp" alt="3-记录网络ID"></p></li><li><p>记录好「Network ID」</p><p><img src="https://bu.dusays.com/2025/07/05/6869257e0a93b.webp" alt="4-等待设备加入"></p></li></ul><h3 id="3-客户端下载"><a href="#3-客户端下载" class="headerlink" title="3.客户端下载"></a>3.客户端下载</h3><ul><li><p>根据设备系统的类型，<a href="https://www.zerotier.com/download?_blank">下载</a>并安装对应版本的ZeroTier One客户端</p><p><img src="https://bu.dusays.com/2025/07/05/6869257b48bad.webp" alt="5-下载客户端"></p></li><li><p>输入事先记录好的「Network ID」，等待控制台授权</p><p><img src="https://bu.dusays.com/2025/07/05/686925b8e2211.webp" alt="6-客户端加入A"></p><p><img src="https://bu.dusays.com/2025/07/05/686925bb8d538.webp" alt="7-客户端加入B"></p></li></ul><h3 id="4-授权"><a href="#4-授权" class="headerlink" title="4.授权"></a>4.授权</h3><ul><li><p>在Zerotier服务的控制台中，进入对应「Network ID」的虚拟局域网</p></li><li><p>在设备列表，为最左侧的「Auth」列表打勾，即授权设备访问虚拟局域网</p><p><img src="https://bu.dusays.com/2025/07/05/686925bf93f56.webp" alt="8-授权设备"></p></li><li><p>回到设备，单击「Connect」，稍等片刻，待虚拟局域网地址分配成功（iOS设备或Android设备会显示「VPN」图标），即连接成功</p><p><img src="https://bu.dusays.com/2025/07/05/686925c1c9e6d.webp" alt="9-连接OK"></p><p><img src="https://bu.dusays.com/2025/07/05/686925c750cc2.webp" alt="10-虚拟内网测试"></p></li></ul></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;近期，阿里云向各大高校的学生群体发放300元无门槛代金券，可购买云服务器。笔者</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="异地组网" scheme="https://blog.furen.link/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    
    <category term="Docker" scheme="https://blog.furen.link/tags/Docker/"/>
    
    <category term="Zerotier" scheme="https://blog.furen.link/tags/Zerotier/"/>
    
  </entry>
  
  <entry>
    <title>正则表达式小笔记</title>
    <link href="https://blog.furen.link/91459064/"/>
    <id>https://blog.furen.link/91459064/</id>
    <published>2023-10-25T13:16:12.000Z</published>
    <updated>2025-06-30T04:57:21.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h2><h3 id="需要注意"><a href="#需要注意" class="headerlink" title="需要注意"></a>需要注意</h3><p>由<strong>普通字符</strong>（包含大小写字母和数字）和<strong>元字符</strong>（存在特殊含义）组成</p><p>无论普通字符还是元字符，都区分大小写的！</p><h3 id="基本正则表达式"><a href="#基本正则表达式" class="headerlink" title="基本正则表达式"></a>基本正则表达式</h3><table><thead><tr><th align="center">元字符</th><th align="center">作用</th></tr></thead><tbody><tr><td align="center"><code>*</code></td><td align="center">匹配<strong>前</strong>一个字符匹配0次或任意多次<br>等价于{0,}<br>如：<code>z*</code> 会匹配前面一个字符含<code>z</code>的行</td></tr><tr><td align="center"><code>.</code></td><td align="center">匹配<strong>除了换行符</strong>外任意一个字符</td></tr><tr><td align="center"><code>^</code></td><td align="center">匹配<strong>行首</strong><br>如：<code>^hello</code>会匹配以<code>hello</code>开头的行</td></tr><tr><td align="center"><code>$</code></td><td align="center">匹配<strong>行尾</strong><br>如：<code>hello$</code>会匹配以<code>hello</code>结尾的行</td></tr><tr><td align="center"><code>[]</code></td><td align="center">匹配中括号中<strong>指定</strong>的任意一个字符，只匹配一个字符 <br/>如： <code>[aoeiu]</code>匹配意一个元音字母<br/> <code>[0-9]</code>匹配任意一位数字<br/><code>[a-z][0-9]</code>匹配小写字和一位数字构成的两位字符</td></tr><tr><td align="center"><code>[^]</code></td><td align="center">匹配<strong>除中括号的字符以外</strong>的任意一个字符<br/>如： <code>[^0-9]</code>匹配任意一位非数字字符<br/><code>[^a-z]</code>表示任意一位非小写字母</td></tr><tr><td align="center"><code>\</code></td><td align="center">转义符<br/>用于取消特殊符号的含义</td></tr><tr><td align="center"><code>\{n\}</code></td><td align="center">表示其<strong>前面</strong>的字符<strong>恰好出现n次</strong><br/>如： <code>[0-9]\{4\}</code>匹配4位数字 <br/><code>[1][3-9][0-9]\{9\}</code>匹配手机号码</td></tr><tr><td align="center"><code>\{n,\}</code></td><td align="center">表示其<strong>前面</strong>的字符出现<strong>不小于n次</strong><br/> 例如： <code>[0-9]\{2,\}</code>表示两位及以上的数字</td></tr><tr><td align="center"><code>\{n,m\}</code></td><td align="center">表示其<strong>前面</strong>的字符<strong>至少出现n次</strong>，<strong>最多出现m次</strong><br/> 如： <code>[a-z]\{6,8\}</code>匹配6到8位的小写字母</td></tr></tbody></table><h3 id="扩展正则表达式"><a href="#扩展正则表达式" class="headerlink" title="扩展正则表达式"></a>扩展正则表达式</h3><table><thead><tr><th align="center">扩展元字符</th><th align="center">作用</th></tr></thead><tbody><tr><td align="center"><code>+</code></td><td align="center">前一个字符匹配1次或任意多次 <br>等价于{1,} <br/>如<code>go+gle</code>会匹配<code>gogle</code>、<code>google</code>或<code>gooogle</code>，<br>当然如果<code>o</code>有更多个，也能匹配</td></tr><tr><td align="center"><code>?</code></td><td align="center">前一个字符匹配0次或1次<br>等价于{0,1} <br>如<code>colou?r</code>可以匹配<code>colour</code>或<code>color</code></td></tr><tr><td align="center"><img src="https://bu.dusays.com/2025/06/30/686218ee63df7.png" alt="" style="zoom:50%;" /></td><td align="center"><img src="https://bu.dusays.com/2025/06/30/686218e93cf66.png" alt="" style="zoom:50%;" /></td></tr><tr><td align="center"><code>( )</code></td><td align="center">匹配其整体为一个字符，即模式单元<br>可以理解为由多个单字符组成的大字符<br><br/>如<code>(dog)+</code>会匹配<code>dog</code>、<code>dogdog</code>、<code>dogdogdog</code>等，<br>因为被<code>( )</code>包含的字符会当成一个整体<br> 但&#96;hello (world</td></tr></tbody></table><h3 id="POSIX字符簇"><a href="#POSIX字符簇" class="headerlink" title="POSIX字符簇"></a>POSIX字符簇</h3><p>是一个通用且形如 <code>[:…:]</code> 的特殊元序列（meta sequence），用于匹配特定的字符范围。</p><table><thead><tr><th align="center">POSIX 元字符</th><th align="center">相当于</th><th align="center">作用</th></tr></thead><tbody><tr><td align="center"><code>[:alnum:]</code></td><td align="center">[0-9a-zA-Z]</td><td align="center">匹配字母和数字字符</td></tr><tr><td align="center"><code>[:digit:]</code></td><td align="center">[0-9]</td><td align="center">匹配数字字符</td></tr><tr><td align="center"><code>[:alpha:]</code></td><td align="center">[a-zA-Z]</td><td align="center">匹配字母字符</td></tr><tr><td align="center"><code>[:lower:]</code></td><td align="center">[a-z]</td><td align="center">匹配小写字母字符</td></tr><tr><td align="center"><code>[:upper:]</code></td><td align="center">[A-Z]</td><td align="center">匹配大写字母字符</td></tr><tr><td align="center"><code>[:cntrl:]</code></td><td align="center"></td><td align="center">匹配控制字符</td></tr><tr><td align="center"><code>[:graph:]</code></td><td align="center"></td><td align="center">匹配可打印字符（除了空格）</td></tr><tr><td align="center"><code>[:space:]</code></td><td align="center">TAB</td><td align="center">匹配空白字符<br>包括空格、制表符、换行符等</td></tr><tr><td align="center"><code>[:blank:]</code></td><td align="center"></td><td align="center">匹配空格和制表符字符</td></tr></tbody></table><h3 id="运算符优先级"><a href="#运算符优先级" class="headerlink" title="运算符优先级"></a>运算符优先级</h3><p>正则表达式从左到右进行计算，并遵循优先级顺序，这与算术表达式非常类似。</p><ul><li>相同优先级的正则表达式从左到右进行运算</li><li>不同优先级的正则表达式运算先高后低</li></ul><table><thead><tr><th align="center"><strong>运算符</strong></th><th align="center"><strong>描述</strong></th></tr></thead><tbody><tr><td align="center">\</td><td align="center">转义符</td></tr><tr><td align="center">( ) (?:)(?&#x3D;) []</td><td align="center">圆括号和方括号</td></tr><tr><td align="center">*</td><td align="center">表示匹配零次到多次</td></tr><tr><td align="center">+ * ？{n} {n,}  {n,m}</td><td align="center">限定符</td></tr><tr><td align="center">^ $ \任何元字符、任何字符</td><td align="center">定位点和序列 <br><em>即：位置和顺序）</em></td></tr><tr><td align="center">|</td><td align="center">替换，<strong>或</strong> 字符具有高于替换运算符的优先级<br>即：&#96;m</td></tr></tbody></table><h2 id="匹配规则"><a href="#匹配规则" class="headerlink" title="匹配规则"></a>匹配规则</h2><h3 id="基本模式匹配"><a href="#基本模式匹配" class="headerlink" title="基本模式匹配"></a>基本模式匹配</h3><p>模式是正则表示式最基本的元素，它是一组描述字符串特征的字符集，用于匹配字符串。  </p><p><strong>举例</strong></p><ul><li><code>^love</code> 匹配的是以<code>love</code>开头的字符串</li><li><code>man$</code> 匹配的是以 <code>man</code> 结尾的字符串</li><li><code>^bash$</code> 仅匹配<code>bash</code>这个字符串（精确匹配）</li><li><code>^\t</code> 标识匹配以 制表符 为开头的字符串（这里需要用到转移符）<ul><li>同理，<code>\n</code>为新的一行，<code>\r</code>为回车</li></ul></li></ul><h3 id="字符簇匹配"><a href="#字符簇匹配" class="headerlink" title="字符簇匹配"></a>字符簇匹配</h3><p>在程序中，要判断输入的电话号码、邮件地址等是否有效，用上述规则匹配显然是无法满足的；因此需要使用相应的字符模式的方法来描述，它就是字符簇。</p><p><strong>举例</strong></p><ul><li><code>[a-z]</code> 匹配所有的小写字母  </li><li><code>[A-Z]</code> 匹配所有的大写字母  </li><li><code>[^$]</code>排除空行</li><li><code> ^[ - ]?[0-9]+(\.[0-9]+)?$</code> 取所有的浮点数</li><li>POSIX字符簇</li><li>正则表达式的组合应用</li></ul><h2 id="规则提取"><a href="#规则提取" class="headerlink" title="规则提取"></a>规则提取</h2><p><code>grep</code>命令是一种强大的文本搜索工具，它能使用正则表达式搜索文本，在文件中全局查找 指定的正则表达式，并打印所有包含该表达式的行。</p><p><strong>如何理解</strong></p><p>就像你在Windows中用记事本打开<code>*.txt</code>文件，通过<kbd>Ctrl</kbd>  +  <kbd>F</kbd>  在文本中查找某个字符串一样</p><p><strong>孪生兄弟</strong></p><ul><li><p><code>grep</code> 支持基本正则表达式</p></li><li><p><code>egrep</code> 支持扩展正则表达式，相当于<code>grep -E</code></p></li><li><p><code>fgrep</code> 不支持正则表达式，只能匹配写死的字符串（但是速度奇快且效率高）</p></li></ul><h3 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a>使用说明</h3><p>基本语法：<code>grep [选项] [模式] 文件名</code></p><p><strong>说明</strong></p><ul><li>选项：用于控制<code>grep</code>的行为</li><li>模式：正则表达式模式</li><li>文件：要搜索的文件的列表</li></ul><p><strong>选项</strong></p><table><thead><tr><th align="center">选项</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">-i</td><td align="center">在搜索的时候忽略大小写</td></tr><tr><td align="center">-n</td><td align="center">显示结果所在行号</td></tr><tr><td align="center">-c</td><td align="center">统计匹配到的<strong>行数</strong><br><em>注意：是匹配到的总行数，不是匹配到的次数</em></td></tr><tr><td align="center">-o</td><td align="center">只显示符合条件的字符串<br><em>即：每个符合条件的字符串单独显示一行</em></td></tr><tr><td align="center">-v</td><td align="center">输出不带匹配内容的行<br><em>反向查询（反向匹配）</em></td></tr><tr><td align="center">-w</td><td align="center">匹配整个单词<br><em>如果字符串中包含这个单词，则不作匹配</em></td></tr><tr><td align="center">-A <code>行数</code></td><td align="center">在输出的时候包含结果所在行<strong>之后</strong>的指定行数<br>（A&#x3D;After，之后）</td></tr><tr><td align="center">-B<code>行数</code></td><td align="center">在输出的时候包含结果所在行<strong>之前</strong>的指定行数<br>（B&#x3D;Before，之前）</td></tr><tr><td align="center">-C <code>行数</code></td><td align="center">在输出的时候包含结果所在行<strong>之前和之后</strong>的指定行数<br>（C&#x3D;Content，上下文）</td></tr><tr><td align="center">-e</td><td align="center">实现多个选项的匹配</td></tr><tr><td align="center">-q</td><td align="center">静默模式，不输出任何信息<br>使用 <code>echo $?</code> 查看是否匹配；<code>0</code> 表示匹配到，<code>1</code>表示没有匹配到</td></tr><tr><td align="center">-E</td><td align="center">使用扩展正则表达式<br>相当于使用<code>egrep</code></td></tr><tr><td align="center">-–color&#x3D;auto</td><td align="center">表示对匹配到的文本着色显示<br>也可直接用<code>--color</code>选项</td></tr></tbody></table><p><strong>退出状态码</strong></p><p> 在<code>grep</code>操作完成后，其退出状态有特殊含义，如下所示。 </p><ul><li><p>找到匹配的表达式 <code>0</code> </p></li><li><p>没找到匹配的表达式 <code>1</code>  </p></li><li><p>找不到指定文件 <code>2</code></p></li></ul><h3 id="基本用法"><a href="#基本用法" class="headerlink" title="基本用法"></a>基本用法</h3><blockquote><p>这里创建一段特定文本（命名为<code>regex</code>），内容如下。</p><figure class="highlight plaintext"><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">world hello</span><br><span class="line">sayhello</span><br><span class="line">hellosay</span><br><span class="line">shell : root</span><br><span class="line">class : shell</span><br><span class="line">weclome to shell World</span><br><span class="line">10,2023</span><br><span class="line">saY shell</span><br></pre></td></tr></table></figure></blockquote><p><strong>搜索包含<code>shell</code>的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;shell&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af6e5a89e.png" alt="image-20231025122521431"></p><p><strong>搜索仅行首包含<code>shell</code>的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;^shell&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af76a97f3.png" alt="image-20231025122535166"></p><p><strong>搜索仅行尾包含<code>shell</code>的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;shell$&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af79c2269.png" alt="image-20231025122547146"></p><p><strong>搜索仅包含<code>shell</code>的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;^shell$&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af956ff5d.png" alt="image-20231025122628051"></p><p><strong>锚定词首为 <code>hello</code> 的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;\&lt;hello&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af7c7c1fd.png" alt="image-20231025122641592"></p><p><strong>锚定词尾为 <code>hello</code> 的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;hello\&gt;&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af80345e1.png" alt="image-20231025122655665"></p><p><strong>锚定词为 <code>hello</code> 的行</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">&quot;\&lt;hello\&gt;&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af83db7df.png" alt="image-20231025122706587"></p><p><strong>搜索包含字符 <code>y</code> 的行（忽略大小写）</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep -i <span class="string">&quot;y&quot;</span> regex</span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729af8832e78.png" alt="image-20231025122912516"></p><h3 id="扩展说明"><a href="#扩展说明" class="headerlink" title="扩展说明"></a>扩展说明</h3><p>grep一般结合基本正则表达式使用；同时，  每一类正则表达式本身的表达式是需要用户去写的，但表达式的元字符都有着固定的或者特定的意义，可以根据需要去理解或组合字符。</p><h4 id="结合正则表达式"><a href="#结合正则表达式" class="headerlink" title="结合正则表达式"></a>结合正则表达式</h4><table><thead><tr><th align="center"><strong>元字符</strong></th><th align="center"><strong>描述</strong></th></tr></thead><tbody><tr><td align="center"><code>[:digit:]</code> 或 <code>[0-9]</code></td><td align="center">匹配任意单个字符</td></tr><tr><td align="center"><code>[:lower:]  </code> 或 <code>[a-z]</code></td><td align="center">匹配任意单个小写字母</td></tr><tr><td align="center"><code>[:upper:]</code> 或 <code>[A-Z]</code></td><td align="center">匹配任意单个大写字母</td></tr><tr><td align="center"><code>[:alpha:]</code> 或 <code>[a-zA-Z]</code></td><td align="center">匹配任意单个大写字母或小写字母</td></tr><tr><td align="center"><code>[:alnum:]</code> 或 <code>[0-9a-zA-Z]</code></td><td align="center">匹配任意单个字母或数字</td></tr></tbody></table><h4 id="结合特定模式"><a href="#结合特定模式" class="headerlink" title="结合特定模式"></a>结合特定模式</h4><table><thead><tr><th align="center"><strong>元字符</strong></th><th align="center"><strong>描述</strong></th></tr></thead><tbody><tr><td align="center"><code> ^ </code></td><td align="center">锚定行首</td></tr><tr><td align="center"><code> $ </code></td><td align="center">锚定行尾</td></tr><tr><td align="center"><code> . </code></td><td align="center">匹配任意一个字符</td></tr><tr><td align="center"><code> * </code></td><td align="center">匹配零个或多个字符</td></tr><tr><td align="center"><code> \? </code></td><td align="center">匹配其前面的字符0次或者1次</td></tr><tr><td align="center"><code> \+ </code></td><td align="center">匹配其前面的字符1次或者多次</td></tr><tr><td align="center"><code> \{m\} </code></td><td align="center">匹配其前面的字符m次（<code>\</code>为转义符）</td></tr><tr><td align="center"><code> \{m,n\} </code></td><td align="center">匹配其前面的字符至少m次，至多n次</td></tr><tr><td align="center"><code> [] </code></td><td align="center">匹配一个指定范围内的字符<br>而<code>[^]</code>匹配指定范围外的任意单个字符  （排除）</td></tr><tr><td align="center"><code>\&lt;</code> 或 <code>\b</code></td><td align="center">锚定词首<br> 使用 <code>\&lt;匹配对象\&gt;</code>可做精确匹配</td></tr><tr><td align="center"><code>\&gt;</code> 或 <code>\b</code></td><td align="center">锚定词尾<br> 使用 <code>\&lt;匹配对象\&gt;</code>可做精确匹配</td></tr><tr><td align="center"><code> \(\) </code></td><td align="center">将多个字符当做一个整体进行处理</td></tr><tr><td align="center"><code> \1 </code></td><td align="center">模式从左侧起，第一个左括号及与之匹配的右括号之间模式匹配的内容</td></tr><tr><td align="center"><code> \2 </code></td><td align="center">模式从左侧起，第二个左括号及与之匹配的右括号之间模式匹配到的内容</td></tr><tr><td align="center"><code> \w </code></td><td align="center">所有的字母与数字，称为字符[a-zA-Z0-9]</td></tr><tr><td align="center"><code> \W </code></td><td align="center">所有字母与数字之外的字符，称为非字符 <code>[^a-zA-Z0-9]</code></td></tr><tr><td align="center"><code> .*</code></td><td align="center">匹配任意长度的任意字符</td></tr></tbody></table><blockquote><p><strong>💡提示</strong></p><ul><li><p>其中<code>\1</code> 、<code>\2</code> 是后向引用，引用前面的分组括号中的模式所匹配到的字符</p></li><li><p>在某行文本的检查中，如果使用<code>\(\)</code>则分组括号中的模式匹配到的某内容可以被引用</p></li></ul></blockquote></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;h3 id=&quot;需要注意&quot;&gt;&lt;a href=&quot;#需要注意&quot; </summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="正则表达式" scheme="https://blog.furen.link/tags/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/"/>
    
  </entry>
  
  <entry>
    <title>Shell小笔记（四）</title>
    <link href="https://blog.furen.link/4048600103/"/>
    <id>https://blog.furen.link/4048600103/</id>
    <published>2023-10-18T14:16:12.000Z</published>
    <updated>2025-04-07T10:56:16.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="别名"><a href="#别名" class="headerlink" title="别名"></a>别名</h2><h3 id="格式"><a href="#格式" class="headerlink" title="格式"></a>格式</h3><p>在Linux中，别名的命令为 <code>alias</code> ，其使用方法为： <code>alias 别名=&quot;表达式&quot;</code></p><ul><li>别名通常只包含一个或多个简单的命令</li><li>默认定义的是临时别名，只需要在终端输入 <code>unalias 别名</code> 或关闭当前终端即可撤销</li><li>如需设置永久别名，则需要修改并生效环境变量文件，其位于 <code>/etc/profile</code></li></ul><h3 id="举例"><a href="#举例" class="headerlink" title="举例"></a>举例</h3><p>将 <code>test</code> 定义为 <code>ls -l</code>的别名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> <span class="built_in">test</span>=”<span class="built_in">ls</span> -l“</span><br></pre></td></tr></table></figure><img src="https://bu.dusays.com/2024/11/05/6729ad02570d7.png" alt="image-20231017164826515" style="zoom: 67%;" /><p>将 <code>remove</code> 定义为 <code>rm -i</code> 的别名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">alias</span> remove=<span class="string">&quot;rm -i&quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729ad0265d1d.png" alt="image-20231017165107047"></p><h2 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h2><h3 id="格式-1"><a href="#格式-1" class="headerlink" title="格式"></a>格式</h3><ol><li><p>Shell的函数格式与JavaScript、Python相似，也是解释性语言的共性啦；其格式如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">function_name</span></span> () &#123;</span><br><span class="line">    <span class="comment"># 函数的命令和操作</span></span><br><span class="line">    <span class="comment"># 可以使用参数和局部变量</span></span><br><span class="line">    <span class="comment"># 可以使用 return 语句来返回值</span></span><br><span class="line">    <span class="comment"># 必须在调用函数地方之前先声明函数</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li><p>要调用一个Shell函数，只需使用函数名称后面加上括号，可以传递参数作为函数的输入</p><p>基本调用：<code>函数名</code> </p><p>带参调用：<code>函数名 参数</code></p></li><li><p>除此之外，还有些特殊字符，如下所示：</p><table><thead><tr><th align="center">符号</th><th align="center">解释</th></tr></thead><tbody><tr><td align="center"><code>$0</code></td><td align="center">脚本的名称</td></tr><tr><td align="center"><code>$1</code> <code>$2</code> <code>$3</code> …</td><td align="center">函数或脚本的参数，<code>$1</code> 表示第一个参数，以此类推</td></tr><tr><td align="center"><code>$#</code></td><td align="center">参数的数量</td></tr><tr><td align="center"><code>$@</code></td><td align="center">以列表形式展示所有参数</td></tr><tr><td align="center"><code>$*</code></td><td align="center">将所有参数作为单个字符串展示</td></tr><tr><td align="center"><code>$?</code></td><td align="center">上一个命令的退出状态；<br>用于检查命令是否成功执行（0 表示成功，非零表示失败）</td></tr><tr><td align="center"><code>$$</code></td><td align="center">当前脚本或进程的PID（进程号）</td></tr><tr><td align="center"><code>$!</code></td><td align="center">最后一个在后台启动的命令或进程的PID（进程号）</td></tr></tbody></table></li></ol><h3 id="举例-1"><a href="#举例-1" class="headerlink" title="举例"></a>举例</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义一个函数，计算两个数的和并返回结果</span></span><br><span class="line"><span class="function"><span class="title">add_numbers</span></span>() &#123;</span><br><span class="line">    <span class="built_in">local</span> num1=<span class="variable">$1</span></span><br><span class="line">    <span class="built_in">local</span> num2=<span class="variable">$2</span></span><br><span class="line">    <span class="built_in">local</span> <span class="built_in">sum</span>=$((num1 + num2))</span><br><span class="line">    <span class="built_in">echo</span> <span class="variable">$sum</span>  <span class="comment"># 返回结果</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 调用函数并获取返回值</span></span><br><span class="line">result=$(add_numbers 5 3)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;总和: <span class="variable">$result</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;脚本名: <span class="variable">$0</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;参数数量: <span class="variable">$#</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;脚本参数: <span class="variable">$@</span>&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;最后一条命令的返回值: $?&quot;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;进程号: $$&quot;</span></span><br></pre></td></tr></table></figure><h2 id="返回值"><a href="#返回值" class="headerlink" title="返回值"></a>返回值</h2><h3 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h3><p>在Linux Shell中，返回值分为：<strong>状态返回值</strong> 和 <strong>结果返回值</strong>；本文讲的是前者，用于判断命令执行的状态。</p><ul><li><p>函数的返回值，可通过 <code>$?</code> 系统变量获得</p></li><li><p>需要自定义返回值时，可使用：<code>return N</code> （其中 N 的取值范围为：<code>0-255</code>）</p><p>如果不加，将以最后一条命令运行结果，作为返回值</p></li><li><p>通常情况下，返回值为 <code>0</code> 为无错误返回，处于<code>1-255</code>内为有错误返回</p></li></ul><p>💡提示：返回值是一组状态码；如果需要自定义输出（如特定文本），请使用<code>echo</code>。</p><h3 id="举例-2"><a href="#举例-2" class="headerlink" title="举例"></a>举例</h3><p>写一个输出返回值的函数</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">msg</span></span>() &#123;</span><br><span class="line"> <span class="built_in">echo</span> <span class="string">&quot;Done!&quot;</span></span><br><span class="line"> <span class="built_in">return</span> 32</span><br><span class="line">&#125;</span><br><span class="line">msg</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;返回值： $? &quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729ad061d4c1.png" alt="image-20231018102307383"></p><p>如果返回值大于255时，需要将返回值放入一个变量中（作为中转），避免溢出</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="function"><span class="title">msg2</span></span>() &#123;</span><br><span class="line">  <span class="built_in">read</span> -p <span class="string">&quot;输入一个数字：&quot;</span> num</span><br><span class="line">  <span class="built_in">echo</span> $[num*5]</span><br><span class="line">&#125;</span><br><span class="line">result=`msg2`</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;返回值： <span class="variable">$&#123;result&#125;</span> &quot;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/11/05/6729ad099b576.png" alt="image-20231018103207507"></p><h2 id="内部命令"><a href="#内部命令" class="headerlink" title="内部命令"></a>内部命令</h2><p>（1）内部命令是Shell程序的一部分，执行速度快且不需要创建子进程，但相应的功能简单。</p><p>（2）外部命令是Linux系统中的实用程序，需要额外安装，功能丰富、随取随用。</p><ul><li>可以通过 <code>type 命令名</code> 查看该命令是否为内部还是外部<img src="https://bu.dusays.com/2024/11/05/6729ad0d70fca.png" alt="image-20231018093513769"></li><li>还可以通过 <code>echo $PATH</code> 查看外部命令的存储路径<img src="https://bu.dusays.com/2024/11/05/6729ad1130c8f.png" alt="image-20231018093546990"></li></ul></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;h3 id=&quot;格式&quot;&gt;&lt;a href=&quot;#格式&quot; class=&quot;headerlin</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="Shell" scheme="https://blog.furen.link/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Shell小笔记（三）</title>
    <link href="https://blog.furen.link/1182639426/"/>
    <id>https://blog.furen.link/1182639426/</id>
    <published>2023-10-11T01:30:55.000Z</published>
    <updated>2025-04-07T10:56:04.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="数组的类型"><a href="#数组的类型" class="headerlink" title="数组的类型"></a>数组的类型</h2><h3 id="普通数组"><a href="#普通数组" class="headerlink" title="普通数组"></a>普通数组</h3><ul><li>索引：通常是从0开始的整数，表示数组中的位置<ul><li>例如，第一个元素的索引是0，第二个元素的索引是1，依此类推</li></ul></li><li>元素：存储在数组中的实际值，每个索引对应一个元素值<ul><li>例如，<code>my_array[0]</code> 表示数组中的第一个元素。</li></ul></li><li>普通数组使用可不声明（<code>declare -a [数组名]</code>）</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">my_array=(<span class="string">&quot;apple&quot;</span> <span class="string">&quot;banana&quot;</span> <span class="string">&quot;cherry&quot;</span>)</span><br><span class="line"><span class="comment"># 索引:    0        1        2</span></span><br><span class="line"><span class="comment"># 元素: &quot;apple&quot; &quot;banana&quot; &quot;cherry&quot;</span></span><br></pre></td></tr></table></figure><h3 id="关联数组"><a href="#关联数组" class="headerlink" title="关联数组"></a>关联数组</h3><ul><li><p>索引：在关联数组中，索引是字符串，而不是整数</p><ul><li>每个索引表示一个键，它与一个特定的元素值相关联。</li><li>与普通数组最大的区别，其由<strong>特定格式的键值对组成</strong></li></ul></li><li><p>元素：元素是与索引关联的值</p><ul><li>关联数组中的每个索引都映射到一个元素值。</li></ul></li><li><p>使用前必须声明（<code>declare -A [数组名]</code>）</p></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">declare</span> -A fruit_colors</span><br><span class="line">fruit_colors[<span class="string">&quot;apple&quot;</span>]=<span class="string">&quot;red&quot;</span></span><br><span class="line">fruit_colors[<span class="string">&quot;banana&quot;</span>]=<span class="string">&quot;yellow&quot;</span></span><br><span class="line">fruit_colors[<span class="string">&quot;cherry&quot;</span>]=<span class="string">&quot;red&quot;</span></span><br><span class="line"><span class="comment"># 索引:   &quot;apple&quot;    &quot;banana&quot;    &quot;cherry&quot;</span></span><br><span class="line"><span class="comment"># 元素:    &quot;red&quot;     &quot;yellow&quot;    &quot;red&quot;</span></span><br></pre></td></tr></table></figure><h2 id="数组的定义"><a href="#数组的定义" class="headerlink" title="数组的定义"></a>数组的定义</h2><h3 id="直接定义"><a href="#直接定义" class="headerlink" title="直接定义"></a>直接定义</h3><p>格式为 <code>array_name=(value1 value2 ... valueN)</code> </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">array=(a b c)</span><br></pre></td></tr></table></figure><h3 id="索引定义"><a href="#索引定义" class="headerlink" title="索引定义"></a>索引定义</h3><p>格式为 <code>array_name=( [1]=value1 [2]=value2 ... [N]=valueN )</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">array=([1]=a [2]=b [3]=c)</span><br></pre></td></tr></table></figure><h2 id="数组的取值"><a href="#数组的取值" class="headerlink" title="数组的取值"></a>数组的取值</h2><p>要访问数组中的值，可以使用<code>${数组名[索引]}</code></p><h3 id="读取索引"><a href="#读取索引" class="headerlink" title="读取索引"></a>读取索引</h3><blockquote><p>这用于获取数组的索引（或键），而不是数组元素本身</p></blockquote><p><code>echo ${!array[*]}</code>  ：视为整体</p><p><code>echo ${!array[@]}</code>  ：视为个体</p><h3 id="读取数值"><a href="#读取数值" class="headerlink" title="读取数值"></a>读取数值</h3><blockquote><p>返回的是数组中的所有元素，不包括索引</p></blockquote><p><code>echo ${array[*]} </code>  ：视为整体</p><p><code>echo ${array[@]}</code>  ：视为个体</p><h3 id="特定元素"><a href="#特定元素" class="headerlink" title="特定元素"></a>特定元素</h3><p><code>echo  ${array[0]}</code> ：访问数组的第一个元素</p><p><code>echo  ${array[@]:1}</code> ：表示从索引 1 开始，包括索引 1 及之后的所有元素</p><p><code>echo  ${array[@]:1:2}</code> ：从第二个元素开始，访问连续的两个元素</p><h3 id="其他用法"><a href="#其他用法" class="headerlink" title="其他用法"></a>其他用法</h3><p><code>echo ${#array[@]}</code> ： 获取数组中的元素个数（数组的长度）</p><p><code>echo ${#array[n]}</code> ：获取数组<code>第n个</code>元素的字符个数</p><h2 id="数组的遍历"><a href="#数组的遍历" class="headerlink" title="数组的遍历"></a>数组的遍历</h2><h3 id="通过索引"><a href="#通过索引" class="headerlink" title="通过索引"></a>通过索引</h3><ul><li>如：循环以索引 <code>i</code> 来迭代数组 <code>array</code></li><li>适合需要根据<strong>元素的索引</strong>处理数组元素的情况</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">names=(Tom Jeny David)</span><br><span class="line"><span class="keyword">for</span> (( i=<span class="number">0</span>;i&lt;<span class="variable">$&#123;#names[*]&#125;</span>;i++ ))</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="variable">$&#123;names[$i]&#125;</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="通过元素"><a href="#通过元素" class="headerlink" title="通过元素"></a>通过元素</h3><ul><li>如：循环迭代数组 <code>array</code> 中的每个元素，并将每个元素赋值给变量 <code>i</code></li><li>适合需要<strong>依次访问数组元素</strong>的情况</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">names=(Tom Jeny David)</span><br><span class="line">index=0</span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="variable">$&#123;names[@]&#125;</span></span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;第<span class="variable">$&#123;index&#125;</span>个元素的值为：<span class="variable">$&#123;i&#125;</span>&quot;</span></span><br><span class="line">  <span class="built_in">let</span> index++</span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h2 id="数组删切替"><a href="#数组删切替" class="headerlink" title="数组删切替"></a>数组删切替</h2><h3 id="删除"><a href="#删除" class="headerlink" title="删除"></a>删除</h3><p>使用<code>unset array[index]</code>命令，可以删除数组中的特定元素</p><ul><li><code>array</code> 是数组名</li><li><code>index</code> 是索引</li></ul><h3 id="切片"><a href="#切片" class="headerlink" title="切片"></a>切片</h3><p>使用 <code>${array[@]:start:length}</code> 命令，可对数组进行切片</p><ul><li><code>start</code> 是起始索引</li><li><code>length</code> 是要包括的元素的数量</li></ul><h3 id="替换"><a href="#替换" class="headerlink" title="替换"></a>替换</h3><p>使用 <code>${array[@]/old/new}</code> 命令，可对数组的某个特定元素进行全量替换</p><ul><li><code>array</code>是数组名</li><li><code>old</code> 是需要替换的元素</li><li><code>new</code> 是替换后的元素</li></ul></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;h3 id=&quot;普通数组&quot;&gt;&lt;a href=&quot;#普通数组&quot; </summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="Shell" scheme="https://blog.furen.link/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Shell小笔记（二）</title>
    <link href="https://blog.furen.link/56165/"/>
    <id>https://blog.furen.link/56165/</id>
    <published>2023-09-25T06:41:19.000Z</published>
    <updated>2025-04-07T11:02:48.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="条件测试语句"><a href="#条件测试语句" class="headerlink" title="条件测试语句"></a>条件测试语句</h2><h3 id="基本语法"><a href="#基本语法" class="headerlink" title="基本语法"></a>基本语法</h3><p>（1）<code>test &lt;条件&gt;</code></p><p>（2）<code>[ &lt;条件&gt; ]</code> 需要注意环境前后要有空格</p><p>结果：条件非空的话为 <strong>True</strong> (真)，反之为 <strong>False</strong>（假）</p><p>需要注意，在Shell中，通常情况下0为真，其他数值为假（特殊情况如字符串测试等除外）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">test</span> homo ; <span class="built_in">echo</span> $?</span><br></pre></td></tr></table></figure><h3 id="文件测试"><a href="#文件测试" class="headerlink" title="文件测试"></a>文件测试</h3><p>配合操作符，可以实现文件或者目录类型的检测。</p><p>例如，检测当前路径下的 homo 是不是目录？ </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">touch</span> homo</span><br><span class="line"><span class="built_in">test</span> -d homo ； <span class="built_in">echo</span> $? </span><br><span class="line"><span class="comment">#或使用[ -d homo]；echo $?</span></span><br></pre></td></tr></table></figure><p>以下是文件测试操作符与相应说明的对应关系</p><table><thead><tr><th align="center"><strong>操作符</strong></th><th align="center"><strong>说明</strong></th></tr></thead><tbody><tr><td align="center">-d</td><td align="center">测试是否为目录（Directory）</td></tr><tr><td align="center">-a</td><td align="center">测试目录或文件是否存在（Exist）</td></tr><tr><td align="center">-f</td><td align="center">测试是否为文件（File）</td></tr><tr><td align="center">-r</td><td align="center">测试当前用户是否可读（read）</td></tr><tr><td align="center">-w</td><td align="center">测试当前用户是否可写（write）</td></tr><tr><td align="center">-x</td><td align="center">测试当前用户是否可执行（excute）</td></tr></tbody></table><h3 id="整数测试"><a href="#整数测试" class="headerlink" title="整数测试"></a>整数测试</h3><p>整数测试通常用于数值之间的运算，在一些逻辑关系的判断中有应用。</p><p>例如判断 1+1+5+4 与 1+9+1 是否相等，可以这么写</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> $((<span class="number">1</span>+<span class="number">1</span>+<span class="number">5</span>+<span class="number">4</span>)) -eq $((<span class="number">1</span>+<span class="number">9</span>+<span class="number">1</span>)) ; <span class="built_in">echo</span> $?</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>以下是关系测试操作符与相应说明的对应关系</p><table><thead><tr><th align="center">操作符</th><th align="center">关系运算符</th><th align="center">说明</th></tr></thead><tbody><tr><td align="center">-eq</td><td align="center">&#x3D;&#x3D;</td><td align="center">等于（Equal）</td></tr><tr><td align="center">-ne</td><td align="center">!&#x3D;</td><td align="center">不等于（Not Equal）</td></tr><tr><td align="center">-gt</td><td align="center">&gt;</td><td align="center">大于（Greater Than）</td></tr><tr><td align="center">-lt</td><td align="center">&lt;</td><td align="center">小于（Lesser Than）</td></tr><tr><td align="center">-le</td><td align="center">&lt;&#x3D;</td><td align="center">小于或等于（Lesser or Equal）</td></tr><tr><td align="center">-ge</td><td align="center">&gt;&#x3D;</td><td align="center">大于或等于（Greater or Equal）</td></tr></tbody></table><h3 id="字符串测试"><a href="#字符串测试" class="headerlink" title="字符串测试"></a>字符串测试</h3><p>字符串测试操作符的作用包括比较字符串是否相同、测试字符串的长度是否为0。</p><p>格式为： <code>[字符串1] 操作符 [字符串2]</code></p><p>以下是字符串测试操作符与相应说明的对应关系</p><table><thead><tr><th align="center">操作符</th><th align="center"><strong>含义</strong></th></tr></thead><tbody><tr><td align="center">-z</td><td align="center">判断字符串长度是否为 <strong>0</strong></td></tr><tr><td align="center">-n</td><td align="center">判断字符串长度是否为 <strong>非0</strong></td></tr><tr><td align="center">!</td><td align="center">判断两边字符串是否 <strong>不相等</strong></td></tr><tr><td align="center">&#x3D;</td><td align="center">判断两边字符串是否 <strong>相等</strong></td></tr></tbody></table><h3 id="逻辑运算符"><a href="#逻辑运算符" class="headerlink" title="逻辑运算符"></a>逻辑运算符</h3><p>在Shell条件测试中，使用逻辑运算符实现复杂的条件测试，逻辑运算符用于操作两个变量。</p><p>格式为： <code>[表达式1] 操作符 [表达式2]</code></p><p>注意：<code>-a</code> 和 <code>-o</code> 放在 <code>[ ]</code> 里面用，<code>&amp;&amp;</code>和 <code>||</code> 放在 <code>[ ]</code> 外面用</p><p>以下是逻辑运算操作符与相应说明的对应关系</p><table><thead><tr><th align="center">操作符</th><th align="center">含义</th></tr></thead><tbody><tr><td align="center">-a 或 &amp;&amp;</td><td align="center">与</td></tr><tr><td align="center">-o 或 ||</td><td align="center">或</td></tr><tr><td align="center">!</td><td align="center">否</td></tr></tbody></table><h2 id="if条件"><a href="#if条件" class="headerlink" title="if条件"></a>if条件</h2><p>很常见的判断语句，不过要注意Shell中的流程控制不能为空</p><p>即如果<code>else</code>分支没有语句执行，就不需要写</p><h3 id="if单分支"><a href="#if单分支" class="headerlink" title="if单分支"></a>if单分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [条件表达式];<span class="keyword">then</span></span><br><span class="line">代码块</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="if双分支"><a href="#if双分支" class="headerlink" title="if双分支"></a>if双分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [条件表达式]</span><br><span class="line"><span class="keyword">then</span></span><br><span class="line">代码块1</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">代码块2</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h3 id="if多分支"><a href="#if多分支" class="headerlink" title="if多分支"></a>if多分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [条件表达式1];<span class="keyword">then</span></span><br><span class="line">代码块1</span><br><span class="line"><span class="keyword">elif</span> [条件表达式2];<span class="keyword">then</span></span><br><span class="line">代码块2</span><br><span class="line"><span class="keyword">elif</span> [条件表达式3];<span class="keyword">then</span></span><br><span class="line">代码块3</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">代码块4</span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure><h2 id="case条件"><a href="#case条件" class="headerlink" title="case条件"></a>case条件</h2><p>程序会获取case语句中的<strong>变量值</strong></p><ul><li><p>如果满足条件表达式1，则执行代码块 1</p></li><li><p>如果满足条件表达式2，则执行代码块2</p></li><li><p>如果满足条件表达式3，则执行代码块3</p></li><li><p>执行到双分号 <code>;;</code> ，则停止</p></li><li><p>如果都不满足，则执行<code>*)</code>后面的代码块（上面的双分号会被忽略）</p><p>只要满足一个条件表达式就会跳出<code>case</code>语句主体，执行<code>esac</code>字符后面的命令</p></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">case</span> 变量值 <span class="keyword">in</span></span><br><span class="line"> 条件表达式1)</span><br><span class="line">    代码块1</span><br><span class="line">;;</span><br><span class="line"> 条件表达式2)</span><br><span class="line">    代码块2</span><br><span class="line">;;</span><br><span class="line"> 条件表达式3)</span><br><span class="line">代码块3</span><br><span class="line">;;</span><br><span class="line">  *)</span><br><span class="line">无匹配后代码块</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p>条件表达式的匹配符如下表所示</p><table><thead><tr><th align="center"><strong>条件表达式</strong></th><th align="center"><strong>说明</strong></th></tr></thead><tbody><tr><td align="center">*</td><td align="center">任意字符</td></tr><tr><td align="center">?</td><td align="center">任意单个字符</td></tr><tr><td align="center">[abc]</td><td align="center">a、b或c其中之一</td></tr><tr><td align="center">[a-n]</td><td align="center">从a到n的任一字符</td></tr><tr><td align="center">|</td><td align="center">多重选择</td></tr></tbody></table><h2 id="for循环"><a href="#for循环" class="headerlink" title="for循环"></a>for循环</h2><h3 id="语法"><a href="#语法" class="headerlink" title="语法"></a>语法</h3><p>当变量值在列表时，<code>for</code> 循环即执行一次所有命令，使用变量名获取列表中的当前取值</p><p><code>in</code> 的取值列表支持替换、字符串和文件名；不用取值列表将使用命令行的位置参数</p><p><strong>通常写法</strong></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">for [变量名] in [取值列表]</span><br><span class="line">do</span><br><span class="line">[循环体]</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p><strong>一行写法</strong></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">for [变量名] in [取值列表]; do [循环体] done;</span><br></pre></td></tr></table></figure><p>💡提醒：写成一行（在终端直接执行）时，需要记得加 <code>;</code> 符号。</p><h3 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h3><p>脚本将读取用户清单文件（格式：<code>[用户名] [密码]</code>），并对文件的文本内容进行切片处理（例如第一个参数为用户名，第二个参数为密码），据此创建用户并配置好密码。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#IFS是内部字段分隔符，此处单词间隔</span></span><br><span class="line">IFS=$<span class="string">&#x27;\n&#x27;</span></span><br><span class="line"><span class="comment">#判断脚本是否有参</span></span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$#</span> -eq 0 ];<span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;使用方法： `<span class="variable">$0</span>` 用户名单文件&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 0</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="comment">#判断用户名单是否为文件</span></span><br><span class="line"><span class="keyword">if</span> [ ! -f <span class="variable">$1</span> ];<span class="keyword">then</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;错误：用户名单<span class="variable">$1</span>不是文件&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 0</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"><span class="comment">#批量创建用户并设置密码</span></span><br><span class="line"><span class="keyword">for</span> line <span class="keyword">in</span> `<span class="built_in">cat</span> <span class="variable">$1</span>`</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">  <span class="keyword">if</span> [ <span class="variable">$&#123;#line&#125;</span> -eq 0 ];<span class="keyword">then</span> <span class="comment">#获取文本的长度</span></span><br><span class="line">     <span class="built_in">echo</span> <span class="string">&quot;清单出现空行，跳过创建。&quot;</span></span><br><span class="line">     <span class="built_in">continue</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line">  <span class="comment">#从用户名单中切割出用户名</span></span><br><span class="line">  user=`<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$&#123;line&#125;</span>&quot;</span> | awk <span class="string">&#x27;&#123;print $1&#125;&#x27;</span>`</span><br><span class="line">  <span class="comment">#从用户名单中切割出用户密码</span></span><br><span class="line">  pass=`<span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$&#123;line&#125;</span>&quot;</span> | awk <span class="string">&#x27;&#123;print $2&#125;&#x27;</span>`</span><br><span class="line">  <span class="comment">#查询用户是否存在</span></span><br><span class="line">  <span class="built_in">id</span> <span class="variable">$&#123;user&#125;</span> &amp;&gt; /dev/null</span><br><span class="line">  <span class="comment">#根据存在与否创建用户并设置密码</span></span><br><span class="line">  <span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;提示：用户<span class="variable">$&#123;user&#125;</span>已经存在！&quot;</span></span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    <span class="comment">#创建用户</span></span><br><span class="line">    useradd <span class="variable">$&#123;user&#125;</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;用户<span class="variable">$&#123;user&#125;</span>已创建完毕！&quot;</span></span><br><span class="line">    <span class="comment">#通过管道服务为用户设置密码</span></span><br><span class="line">    <span class="built_in">echo</span> <span class="string">&quot;<span class="variable">$&#123;pass&#125;</span> | passwd -stdin <span class="variable">$&#123;user&#125;</span> &amp;&gt; /dev/null&quot;</span></span><br><span class="line">    <span class="keyword">if</span> [ $? -eq 0 ];<span class="keyword">then</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">&quot;用户<span class="variable">$&#123;user&#125;</span>的密码配置完毕！&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">   <span class="keyword">fi</span></span><br><span class="line"><span class="keyword">done</span>   </span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;提示：已通过文件<span class="variable">$1</span>的用户清单创建用户，并配置密码。&quot;</span></span><br></pre></td></tr></table></figure><h2 id="while循环"><a href="#while循环" class="headerlink" title="while循环"></a>while循环</h2><p>用于不断执行一系列命令，也用于从输入文件中读取数据</p><h3 id="语法-1"><a href="#语法-1" class="headerlink" title="语法"></a>语法</h3><p><strong>常规写法</strong></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">while [条件表达式]</span><br><span class="line">do</span><br><span class="line">  [代码块]</span><br><span class="line">done  </span><br></pre></td></tr></table></figure><p><strong>无限循环</strong></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">while : #也可写成while true</span><br><span class="line">do</span><br><span class="line">  [循环体]</span><br><span class="line">done  </span><br></pre></td></tr></table></figure><h3 id="例子-1"><a href="#例子-1" class="headerlink" title="例子"></a>例子</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">读取键盘信息</span></span><br><span class="line">echo &quot;按下 Crtl和D 退出&quot;</span><br><span class="line">echo -n &#x27;你想吃啥: &#x27;</span><br><span class="line">while read FOOD</span><br><span class="line">do</span><br><span class="line">    echo &quot;老板，来份：$&#123;FOOD&#125;~&quot;</span><br><span class="line">done</span><br></pre></td></tr></table></figure><h2 id="until循环"><a href="#until循环" class="headerlink" title="until循环"></a>until循环</h2><p>与while循环相反，until 循环则默认执行，直到条件满足 <code>true</code> 时停止</p><h3 id="语法-2"><a href="#语法-2" class="headerlink" title="语法"></a>语法</h3><p>如果条件表达式的返回值为 false，则继续执行循环体内的语句，否则跳出循环。</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">until [条件表达式]</span><br><span class="line">do</span><br><span class="line">  [循环体]</span><br><span class="line">done</span><br></pre></td></tr></table></figure><h3 id="例子-2"><a href="#例子-2" class="headerlink" title="例子"></a>例子</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">遍历输出0-9</span></span><br><span class="line">a=0</span><br><span class="line">until [ ! $a -lt 10 ]</span><br><span class="line">do</span><br><span class="line">  echo $&#123;a&#125;</span><br><span class="line">  a=$[$&#123;a&#125;+1]</span><br><span class="line">done</span><br></pre></td></tr></table></figure><h2 id="跳出循环"><a href="#跳出循环" class="headerlink" title="跳出循环"></a>跳出循环</h2><p>在循环过程中，有时候需要在未达到循环结束条件时强制跳出循环。<code>break</code>允许跳出所有循环，而<code>continue</code> 仅跳出当前循环。</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;h3 id=&quot;基本语法&quot;&gt;&lt;a href=&quot;#基本</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="Shell" scheme="https://blog.furen.link/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Shell小笔记（一）</title>
    <link href="https://blog.furen.link/19231/"/>
    <id>https://blog.furen.link/19231/</id>
    <published>2023-09-04T03:45:14.000Z</published>
    <updated>2025-04-07T10:45:33.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="格式"><a href="#格式" class="headerlink" title="格式"></a>格式</h2><p>打开文本编辑器（如vi或vim ），创建一个后缀名为<code>sh</code>的文件；开头第一行提示Shell使用的解释器类型，如<code>#!/bin/bash</code>，为保证解析正确建议写上。</p><p>例如编写一个名为<code>test.sh</code>的脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;test&quot;</span> <span class="comment">#echo命令用于输出（打印）信息</span></span><br></pre></td></tr></table></figure><h2 id="使用方式"><a href="#使用方式" class="headerlink" title="使用方式"></a>使用方式</h2><h3 id="bash或sh-脚本名运行"><a href="#bash或sh-脚本名运行" class="headerlink" title="bash或sh + 脚本名运行"></a><code>bash</code>或<code>sh</code> + 脚本名运行</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ <span class="built_in">cat</span> test.sh </span><br><span class="line">a=<span class="string">&#x27;hello world&#x27;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line"></span><br><span class="line">[kaka@localhost ~]$ bash test.sh </span><br><span class="line">hello world</span><br></pre></td></tr></table></figure><h3 id="给执行权限后直接运行"><a href="#给执行权限后直接运行" class="headerlink" title="给执行权限后直接运行"></a>给执行权限后直接运行</h3><blockquote><p>直接运行前需要为脚本赋予执行权限（<code>chmod +x &lt;脚本的文件名&gt;</code>）</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ <span class="built_in">cat</span> test.sh </span><br><span class="line">a=<span class="string">&#x27;hello world&#x27;</span></span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$a</span></span><br><span class="line"></span><br><span class="line">[kaka@localhost ~]$ ./test.sh</span><br><span class="line">bash: ./test.sh: 权限不够</span><br><span class="line"></span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">chmod</span> +x test.sh </span><br><span class="line">[kaka@localhost ~]$ ./test.sh</span><br><span class="line">hello world</span><br></pre></td></tr></table></figure><h3 id="使用-source-或-运行"><a href="#使用-source-或-运行" class="headerlink" title="使用 source 或 . 运行"></a>使用 <code>source</code> 或 <code>.</code> 运行</h3><blockquote><p>使用<code>source</code>相当于在当前终端运行该脚本，可以看到被赋值的变量显示在当前终端上。</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ <span class="built_in">cat</span> a.sh </span><br><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line">A=5</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$A</span></span><br><span class="line"></span><br><span class="line">[kaka@localhost ~]$ bash a.sh </span><br><span class="line">5</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$A</span></span><br><span class="line"></span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">source</span> a.sh </span><br><span class="line">5</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$A</span></span><br><span class="line">5</span><br></pre></td></tr></table></figure><h2 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h2><p>自定义变量、环境变量、位置变量、预定义变量</p><blockquote><p><strong>变量名要求</strong></p><ul><li>命名只能使用英文字母，数字和下划线，首个字符不能以数字开头</li><li>中间不能有空格，可以使用下划线 <code>_</code></li><li>不能使用标点符号</li><li>不能使用bash里的关键字（可用help命令查看保留关键字）</li></ul><p><strong>如何使用</strong></p><p>在变量名前加美元符号（<code>$</code>）即可</p><p>为了帮助解释器识别到变量的边界，可以在变量名外加入花括号（<code>{}</code>）</p></blockquote><h3 id="自定义变量"><a href="#自定义变量" class="headerlink" title="自定义变量"></a>自定义变量</h3><p>相当于局部变量，仅在当前会话中生效</p><p>格式：<code>&lt;变量名&gt;=&lt;变量值&gt;</code>，注意<strong>等号两边不需要空格</strong></p><p>如果变量值存在空格，需要用双引号（<code>&quot;&quot;</code>）或单引号（<code>&#39;&#39;</code>）框起来</p><p>使用<code>unset &lt;变量名&gt;</code>撤销该自定义变量</p><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><p>相当于全局变量，在所有会话中生效</p><p>例如<code>/etc/profile</code>文件存储着当前系统的环境变量</p><h3 id="预定义变量"><a href="#预定义变量" class="headerlink" title="预定义变量"></a>预定义变量</h3><p>也称为特殊变量；这其中一部分是环境变量，有一部分是局部变量，这些变量保证了shell的正常运行</p><table><thead><tr><th align="center">变量</th><th align="center">含义</th></tr></thead><tbody><tr><td align="center">$n</td><td align="center">位置变量<br><code>n</code>为数字，<code>$0</code>代表该脚本名称<br> <code>$1</code>代表第1个参数（以此类推），但从第十个开始要用花括号（<code>{}</code>）包含</td></tr><tr><td align="center">$#</td><td align="center">获取所有输入参数的个数</td></tr><tr><td align="center">$*</td><td align="center">获取命令行的所有参数，并将其<strong>视为一个整体</strong></td></tr><tr><td align="center">$@</td><td align="center">获取命令行的所有参数，但<strong>将每个参数进行拆分</strong></td></tr><tr><td align="center">$?</td><td align="center">获取最后一次命令执行的状态，正确执行为<code>0</code>，其余输出则不正常</td></tr></tbody></table><p>创建一个名为<code>advance.sh</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><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">echo &#x27;==========$n==========&#x27;</span><br><span class="line">echo $0</span><br><span class="line">echo $1</span><br><span class="line">echo $2</span><br><span class="line">echo &#x27;==========$#==========&#x27;</span><br><span class="line">echo $#</span><br><span class="line">echo &#x27;==========$*==========&#x27;</span><br><span class="line">for i in &quot;$*&quot;; do</span><br><span class="line">echo $i</span><br><span class="line">done</span><br><span class="line">echo &#x27;==========$@==========&#x27;</span><br><span class="line">for i in &quot;$@&quot;; do</span><br><span class="line">echo $i</span><br><span class="line">done</span><br><span class="line">echo &#x27;==========$?==========&#x27;</span><br><span class="line">echo $?</span><br></pre></td></tr></table></figure><p>使用<code>. advance.sh 1 2 3 4 5</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">==========$n==========</span><br><span class="line">./advance.sh</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">==========$#==========</span><br><span class="line">5</span><br><span class="line">==========$*==========</span><br><span class="line">1 2 3 4 5</span><br><span class="line">==========$@==========</span><br><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">==========$?==========</span><br><span class="line">0</span><br></pre></td></tr></table></figure><h3 id="只读变量"><a href="#只读变量" class="headerlink" title="只读变量"></a>只读变量</h3><p>使用 <code>readonly</code> 命令可以将变量定义为只读变量，只读变量的值不能被改变、不能被撤销</p><h2 id="赋值"><a href="#赋值" class="headerlink" title="赋值"></a>赋值</h2><blockquote><ul><li><p>显示<strong>变量的值</strong>使用<strong>双引号</strong></p></li><li><p><strong>单引号</strong>中是<strong>没有变量</strong>的</p></li><li><p>反引号（&#96;&#96;）等价于 $() ，<strong>反引号的Shell命令会被先执行</strong></p></li></ul></blockquote><h3 id="直接赋值"><a href="#直接赋值" class="headerlink" title="直接赋值"></a>直接赋值</h3><p>格式：<code>&lt;变量名&gt;=&lt;变量值&gt;</code>，注意<strong>等号两边不需要空格</strong></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"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">num=10086 #直接赋值</span><br><span class="line">echo $num</span><br></pre></td></tr></table></figure><h3 id="键盘读取赋值"><a href="#键盘读取赋值" class="headerlink" title="键盘读取赋值"></a>键盘读取赋值</h3><p>格式：<code>read -p [&quot;提示信息&quot;] [变量名]</code>，可不带<code>-p [&quot;提示信息&quot;]</code>这个选项和参数</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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">read INPUT #将键盘输入的单行数据赋值给INPUT变量名</span><br><span class="line">echo $INPUT</span><br></pre></td></tr></table></figure><h3 id="通过命令行参数赋值"><a href="#通过命令行参数赋值" class="headerlink" title="通过命令行参数赋值"></a>通过命令行参数赋值</h3><p>即通过<strong>位置变量</strong>进行调用</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"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">echo $1 $2</span><br></pre></td></tr></table></figure><h3 id="利用命令的输出结果赋值"><a href="#利用命令的输出结果赋值" class="headerlink" title="利用命令的输出结果赋值"></a>利用命令的输出结果赋值</h3><p>在赋值语句中使用反向单引号（ &#96;&#96;）</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"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">DATE=`date +%F` #将当前年月日期（结果）赋值到DATE变量上</span><br><span class="line">echo $DATE</span><br></pre></td></tr></table></figure><p>其中<code>date +%F</code>等价于<code>$(date +%F)</code></p><h3 id="从文件中读取数据赋值"><a href="#从文件中读取数据赋值" class="headerlink" title="从文件中读取数据赋值"></a>从文件中读取数据赋值</h3><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"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">ls *.sh &gt; execfile #列举后缀名为sh的文件重定向至execfile</span><br><span class="line">while read LINE #使用While循环读取每一行，并赋值到LINE这个变量中</span><br><span class="line">do</span><br><span class="line">     echo $LINE #输出每行内容</span><br><span class="line">done &lt; execfile</span><br></pre></td></tr></table></figure><h2 id="运算符"><a href="#运算符" class="headerlink" title="运算符"></a>运算符</h2><blockquote><p>在bash中，变量的默认均为<strong>字符串</strong>类型，无法直接进行运算</p></blockquote><h3 id="基本语法"><a href="#基本语法" class="headerlink" title="基本语法"></a>基本语法</h3><p><code>“$((运算式))”</code> 或 <code>“$[运算式]”</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ a=10</span><br><span class="line">[kaka@localhost ~]$ b=20</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">sum</span>=$((<span class="variable">$a</span>+<span class="variable">$b</span>)) <span class="comment">#或 sum=$[$a+$b]</span></span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$sum</span></span><br><span class="line">30</span><br></pre></td></tr></table></figure><h3 id="使用expr计算"><a href="#使用expr计算" class="headerlink" title="使用expr计算"></a>使用expr计算</h3><p><code>expr</code> 是一款表达式计算工具，使用它能完成表达式的求值操作。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ a=10</span><br><span class="line">[kaka@localhost ~]$ b=20</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">expr</span> <span class="variable">$a</span> + <span class="variable">$b</span></span><br><span class="line">30</span><br></pre></td></tr></table></figure><h3 id="使用let计算"><a href="#使用let计算" class="headerlink" title="使用let计算"></a>使用let计算</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ a=10</span><br><span class="line">[kaka@localhost ~]$ b=20</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">let</span> <span class="built_in">sum</span>=a+b</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$sum</span></span><br><span class="line">30</span><br></pre></td></tr></table></figure><h3 id="算数运算符"><a href="#算数运算符" class="headerlink" title="算数运算符"></a>算数运算符</h3><table><thead><tr><th align="center">运算符</th><th align="center">说明</th><th align="center">举例</th></tr></thead><tbody><tr><td align="center">+</td><td align="center">加法</td><td align="center"><code>expr $a + $b</code></td></tr><tr><td align="center">-</td><td align="center">减法</td><td align="center"><code>expr $a - $b</code></td></tr><tr><td align="center">*</td><td align="center">乘法</td><td align="center"><code>expr $a \* $b</code> <br>此处需要用<code>\</code>以防转译</td></tr><tr><td align="center">&#x2F;</td><td align="center">除法</td><td align="center"><code>expr $b / $a</code></td></tr><tr><td align="center">%</td><td align="center">取余</td><td align="center"><code>expr $b % $a</code></td></tr><tr><td align="center">&#x3D;</td><td align="center">赋值</td><td align="center"><code>a=$b</code> <br>把变量 b 的值赋给 a</td></tr><tr><td align="center">&#x3D;&#x3D;</td><td align="center">相等<br>用于比较两个数字，相同则返回 true</td><td align="center"><code>[$a == $b]</code></td></tr><tr><td align="center">!&#x3D;</td><td align="center">不相等<br>用于比较两个数字，不相同则返回 true</td><td align="center"><code>[$a != $b] </code></td></tr></tbody></table><p>注意：条件表达式要放在方括号之间，并且要有空格，例如: <code>[$a==$b]</code> 是错误的，必须写成 <code>[$a == $b]</code>。</p><h2 id="替删改"><a href="#替删改" class="headerlink" title="替删改"></a>替删改</h2><h3 id="替换"><a href="#替换" class="headerlink" title="替换"></a>替换</h3><table><thead><tr><th align="center">语法</th><th align="center">含义</th></tr></thead><tbody><tr><td align="center">${变量名&#x2F;旧字符串&#x2F;新字符串}</td><td align="center">将第一个旧字符串替换成新字符串</td></tr><tr><td align="center">${变量名&#x2F;&#x2F;旧字符串&#x2F;新字符串}</td><td align="center">将全部的旧字符串替换成新字符串</td></tr></tbody></table><p>例如将<code>www.abc.com</code>中的第一个<code>a</code>替换成<code>d</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">var=www.abca.com</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;var/a/d&#125;</span></span><br></pre></td></tr></table></figure><p>例如将<code>114514</code>中的<code>1</code>全部替换成<code>9</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">num=114514</span><br><span class="line"><span class="built_in">echo</span> <span class="variable">$&#123;num//1/9&#125;</span></span><br></pre></td></tr></table></figure><h3 id="删除"><a href="#删除" class="headerlink" title="删除"></a>删除</h3><table><thead><tr><th align="center">语法</th><th align="center">含义</th></tr></thead><tbody><tr><td align="center">${<code>变量名</code>#<code>关键字符</code>}</td><td align="center">删除第一个关键字符前面的内容（从前往后匹配）</td></tr><tr><td align="center">$[<code>变量名</code>##<code>关键字符</code>]</td><td align="center">删除最后一个关键字符前面的内容（从前往后匹配）</td></tr><tr><td align="center">$[<code>变量名</code>%<code>关键字符</code>]</td><td align="center">删除第一个关键字符后面的内容（从后往前匹配）</td></tr><tr><td align="center">$[<code>变量名</code>%%<code>关键字符</code>]</td><td align="center">删除最后一个关键字符后面的内容（从后往前匹配）</td></tr></tbody></table><p>创建一个名为<code>del.sh</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">file=/dir1/dir2/abc.file</span><br><span class="line"></span><br><span class="line">echo &quot;输出名为file变量&quot;</span><br><span class="line">echo $&#123;file&#125;</span><br><span class="line"></span><br><span class="line">echo &#x27;删除第一个 / 前面的内容（从前往后匹配）&#x27;</span><br><span class="line">echo $&#123;file#*/&#125;</span><br><span class="line"></span><br><span class="line">echo &quot;删除最后一个 / 前面的内容（从前往后匹配）&quot;</span><br><span class="line">echo $&#123;file##*/&#125;</span><br><span class="line"></span><br><span class="line">echo &quot;删除第一个 / 后面的内容（从后往前匹配）&quot;</span><br><span class="line">echo $&#123;file%/*&#125;</span><br><span class="line"></span><br><span class="line">echo &quot;删除最后一个 / 后面的内容（从后往前匹配）&quot;</span><br><span class="line">echo $&#123;file%%/*&#125;</span><br></pre></td></tr></table></figure><p>执行结果</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><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">输出名为file变量</span><br><span class="line">/dir1/dir2/abc.file</span><br><span class="line">删除第一个 / 前面的内容（从前往后匹配）</span><br><span class="line">dir1/dir2/abc.file</span><br><span class="line">删除最后一个 / 前面的内容（从前往后匹配）</span><br><span class="line">abc.file</span><br><span class="line">删除第一个 / 后面的内容（从后往前匹配）</span><br><span class="line">/dir1/dir2</span><br><span class="line">删除最后一个 / 后面的内容（从后往前匹配）</span><br></pre></td></tr></table></figure><h3 id="修改"><a href="#修改" class="headerlink" title="修改"></a>修改</h3><p>使用 <code>${变量名-新的变量名}</code>进行替换</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[kaka@localhost ~]$ <span class="built_in">unset</span> num</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$&#123;num-1919&#125;</span></span><br><span class="line">1919</span><br><span class="line">[kaka@localhost ~]$ num=10010</span><br><span class="line">[kaka@localhost ~]$ <span class="built_in">echo</span> <span class="variable">$&#123;num-1919&#125;</span></span><br><span class="line">10010</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;打开文本编辑器（如vi或vim ），创建一个后缀名为&lt;code&gt;sh&lt;/cod</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="Linux" scheme="https://blog.furen.link/tags/Linux/"/>
    
    <category term="Shell" scheme="https://blog.furen.link/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Mac软件推荐</title>
    <link href="https://blog.furen.link/4047279815/"/>
    <id>https://blog.furen.link/4047279815/</id>
    <published>2023-05-21T04:44:08.000Z</published>
    <updated>2025-04-07T10:45:20.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><p>作为Mac&amp;PC双持用户，找到互补替代品是件有趣的事情。</p><p>这篇文章将不定期更新，希望能帮到你😊。</p><h2 id="编辑器"><a href="#编辑器" class="headerlink" title="编辑器"></a>编辑器</h2><h3 id="MarkDown"><a href="#MarkDown" class="headerlink" title="MarkDown"></a>MarkDown</h3><h4 id="Typora"><a href="#Typora" class="headerlink" title="Typora"></a>Typora</h4><p>官方中文站：<a href="https://typora.cn/?_blank">https://typora.cn</a></p><p><strong>正式版收费（89元3设备，买断制）</strong></p><p>很热门的MarkDown编辑器，即时渲染是一大亮点（能所见即所得）；不过在 macOS 下存在文字输入的BUG（例如：代码块插入），但长期使用的话是值得入正的。</p><h4 id="VSCode"><a href="#VSCode" class="headerlink" title="VSCode"></a>VSCode</h4><p>官网地址：<a href="https://code.visualstudio.com/?_blank">https://code.visualstudio.com</a></p><p>需要安装 <code>Markdown All in One</code> 插件，免费</p><p>缺点可能是 Electorn 吧，然后即时渲染略差。</p><h3 id="文本类"><a href="#文本类" class="headerlink" title="文本类"></a>文本类</h3><h4 id="CotEditor"><a href="#CotEditor" class="headerlink" title="CotEditor"></a>CotEditor</h4><p>官网地址：<a href="https://coteditor.com/?_blank">https://coteditor.com</a></p><p>开源的文本编辑器，支持代码语法高亮，挺轻量的。</p><p><strong>原生支持ARM64，需要 macOS 12+</strong></p><h2 id="播放器"><a href="#播放器" class="headerlink" title="播放器"></a>播放器</h2><h3 id="VLC"><a href="#VLC" class="headerlink" title="VLC"></a>VLC</h3><p>官网地址：<a href="https://www.videolan.org/?_blank">https://www.videolan.org</a></p><p>老开源且跨平台播放器了（笔者用于RTSP取流）</p><h3 id="IINA"><a href="#IINA" class="headerlink" title="IINA"></a>IINA</h3><p>官网地址：<a href="https://www.iina.io/?_blank">https://www.iina.io</a></p><p>可以说是 MPV 的 macOS 移植版本，QuickTime 无法正确解码的视频都用它来放，缺点嘛：对于HDR片源的支持并不友好。</p><h2 id="虚拟机"><a href="#虚拟机" class="headerlink" title="虚拟机"></a>虚拟机</h2><h3 id="VMware-Fusion-Player"><a href="#VMware-Fusion-Player" class="headerlink" title="VMware Fusion Player"></a>VMware Fusion Player</h3><p>官网介绍：<a href="https://www.vmware.com/cn/products/fusion.html?_blank">https://www.vmware.com/cn/products/fusion.html</a></p><p>个人用户免费（需要注册VMware账户后领取许可密钥）</p><blockquote><p><strong>需要注意</strong></p><ol><li>账号注册&amp;密钥申请的页面为英文站点，访问慢是正常的。</li><li>对于Apple Silicon Mac，仅支持部署ARM架构的虚拟机，当然 Windows On ARM 的支持尚可。</li><li>对于Intel Mac，与之前x86版本的使用方法一致。</li></ol></blockquote><h3 id="UTM"><a href="#UTM" class="headerlink" title="UTM"></a>UTM</h3><p>项目地址：<a href="https://github.com/utmapp/UTM?_blank">https://github.com/utmapp/UTM</a></p><p>开源的虚拟机软件，在 iOS&#x2F;iPad OS上也有对应版本</p><p>支持原生（ARM64）或者模拟（QEMU）部署虚拟机；不过3D特性的支持一般，需要花费更多的时间折腾。</p><h2 id="文件传输"><a href="#文件传输" class="headerlink" title="文件传输"></a>文件传输</h2><h3 id="HandShaker"><a href="#HandShaker" class="headerlink" title="HandShaker"></a>HandShaker</h3><p>官方地址：<a href="https://www.smartisan.com/apps/#/handshaker?_blank">https://www.smartisan.com/apps/#/handshaker</a></p><p>在Mac上管理安卓设备的数据，用它就对啦！（支持有线、无线）</p><h3 id="Dukto"><a href="#Dukto" class="headerlink" title="Dukto"></a>Dukto</h3><p>项目地址（SourceForge存档）：<a href="https://sourceforge.net/projects/dukto?_blank">https://sourceforge.net/projects/dukto</a></p><p>用于Windows、Linux、MacOS间局域网传输文件</p><blockquote><p><strong>需要注意</strong></p><ol><li><p>软件不支持中文名文件传输</p></li><li><p>推荐 Dukto R6 版本，由于Mac端很久没更新了，在 Apple Silicon Mac 上会自动转译</p></li><li><p>Windows10及以上系统推荐Microsoft Store里的UWP版本</p></li></ol></blockquote><h2 id="视频处理类"><a href="#视频处理类" class="headerlink" title="视频处理类"></a>视频处理类</h2><h3 id="OBS"><a href="#OBS" class="headerlink" title="OBS"></a>OBS</h3><p>官网地址：<a href="https://obsproject.com/?_blank">https://obsproject.com</a></p><p>录屏、直播会用到</p><h3 id="MediaInfo"><a href="#MediaInfo" class="headerlink" title="MediaInfo"></a>MediaInfo</h3><p>官网地址（可能被污染）：<a href="https://mediaarea.net/en/MediaInfo?_blank">https://mediaarea.net/en/MediaInfo</a></p><p>用来查看媒体文件的编码信息</p><h3 id="HandBrake"><a href="#HandBrake" class="headerlink" title="HandBrake"></a>HandBrake</h3><p>官网地址：<a href="https://handbrake.fr/downloads.php?_blank">https://handbrake.fr/downloads.php</a></p><p>开源的视频转码工具</p><h3 id="M3U8-Downloader"><a href="#M3U8-Downloader" class="headerlink" title="M3U8-Downloader"></a>M3U8-Downloader</h3><p>项目地址：<a href="https://github.com/heisir2014/m3u8-downloader?_blank">https://github.com/heisir2014/m3u8-downloader</a></p><p>开源流媒体下载器（需要注意版权问题哦）</p><h2 id="效率类"><a href="#效率类" class="headerlink" title="效率类"></a>效率类</h2><h3 id="图压"><a href="#图压" class="headerlink" title="图压"></a>图压</h3><p>官网地址：<a href="https://tuya.xinxiao.tech/?_blank">https://tuya.xinxiao.tech</a></p><p>开源的图片压缩工具</p><h3 id="Snipaste"><a href="#Snipaste" class="headerlink" title="Snipaste"></a>Snipaste</h3><p>官网地址：<a href="https://zh.snipaste.com/?_blank">https://zh.snipaste.com</a></p><p>截图&amp;贴图，提高工作效率</p><h3 id="MOS"><a href="#MOS" class="headerlink" title="MOS"></a>MOS</h3><p>官网地址：<a href="https://mos.caldis.me/?_blank">https://mos.caldis.me</a></p><p>解决触摸板与鼠标滚动方向相反的问题</p><h3 id="TopNotch"><a href="#TopNotch" class="headerlink" title="TopNotch"></a>TopNotch</h3><p>官网地址：<a href="https://topnotch.app/?_blank">https://topnotch.app</a></p><p>觉得刘海屏膈应？用它遮住吧~</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;p&gt;作为Mac&amp;amp;PC双持用户，找到互补替代品是件有趣的事情。&lt;/p&gt;
&lt;p&gt;这篇文章将不定期更新，希望能帮到你😊。&lt;/p&gt;
&lt;h2 id=&quot;编辑器&quot;&gt;&lt;a href=&quot;#编辑器&quot; class=&quot;header</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.furen.link/categories/%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="黑苹果" scheme="https://blog.furen.link/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="Mac" scheme="https://blog.furen.link/tags/Mac/"/>
    
    <category term="软件推荐" scheme="https://blog.furen.link/tags/%E8%BD%AF%E4%BB%B6%E6%8E%A8%E8%8D%90/"/>
    
  </entry>
  
  <entry>
    <title>PowerBook G4 12吋（初代铝本）维护</title>
    <link href="https://blog.furen.link/985838464/"/>
    <id>https://blog.furen.link/985838464/</id>
    <published>2023-04-25T07:35:06.000Z</published>
    <updated>2024-01-01T03:45:14.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><p>作为一个「破铜烂铁」爱好者，笔者对中古硬件还是很感兴趣的。机缘巧合，笔者以一个极低的价格收了一台PowerBook G4（12吋，铝合金）笔记本电脑，以来了解PowerPC平台的特性。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76e476d0d.webp" alt="简介"></p><h2 id="开箱"><a href="#开箱" class="headerlink" title="开箱"></a>开箱</h2><p>其实也不算开箱了，收来的时候只有机器本体。A面的划痕印迹承载着多年的记忆，铝制外壳在灯光的照射下看着挺有质感。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76e896518.webp" alt="本体"></p><p>D面同样充满了岁月的痕迹，铭牌处注明了型号A1010，为2003年初期的机器。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76eaa2913.webp" alt="底部"></p><p>插电，开机，轻松点亮，只不过……与卖家描述相同，出现了找不到系统的提示。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76ecf2b7f.webp" alt="首次开机"></p><p>靠近硬盘位听了下，没啥动静，直接下单吧。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76efa404e.webp" alt="下单硬盘"></p><h2 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h2><p>以下是原始机器的配置，数据来源于MacTracker。</p><table><thead><tr><th align="center">项目</th><th align="center">规格</th></tr></thead><tbody><tr><td align="center">处理器</td><td align="center">PowerPC 7455 867MHz (1C,32Bit,L1&#x3D;64KB,L2&#x3D;256KB,SystemBus&#x3D;133MHz)</td></tr><tr><td align="center">内存</td><td align="center">256MB 266MHz DDR (板载128MB,最大1.125GiB)</td></tr><tr><td align="center">硬盘</td><td align="center">40GB IDE 机械盘</td></tr><tr><td align="center">显卡</td><td align="center">Nvidia GeForce4 420 Go (32MB DDR)</td></tr><tr><td align="center">网络</td><td align="center">百兆以太网、56Kbps调制解调器<br>54Mbps 802.11b&#x2F;g无线网卡支持 (可选)</td></tr><tr><td align="center">显示器</td><td align="center">12.1吋 TFT 1024*768</td></tr><tr><td align="center">电源</td><td align="center">24V 1.875A (45w) 电源适配器<br>47WH 锂电,续航约5小时</td></tr><tr><td align="center">重量</td><td align="center">含电池2.1千克</td></tr><tr><td align="center">系统支持</td><td align="center">New World ROM<br>Mac OS X 10.2.3 ～ Mac OS X 10.5.8</td></tr></tbody></table><h2 id="更换硬盘"><a href="#更换硬盘" class="headerlink" title="更换硬盘"></a>更换硬盘</h2><blockquote><p><strong>此款机型特别难拆，需要胆大心细，切勿大力出奇迹！</strong></p><p>详细的更换硬盘步骤请参考：<a href="https://zh.ifixit.com/Guide/PowerBook+G4+Aluminum+12-Inch+1-1.5+GHz+Hard+Drive+Replacement/548?lang=en?_blank">PowerBook G4 Aluminum 12” 1-1.5 GHz Hard Drive Replacement</a></p><ul><li>由于螺丝数量多，且长短不一，建议备一个小盒子专门存放这些螺丝（相关的螺丝规格表可在iFixit上查到）。</li><li>部分排线是FPC（扯断很难恢复，有条件建议使用塑料医用镊子）</li></ul></blockquote><p>在拔掉以下排线的时候，需要特别小心；触摸板排线（红色框）、开机跳线（绿色框）、麦克风跳线（黄色框）。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76f3e27ea.webp" alt="拆机注意"></p><p>拆下键盘框架，主板硬盘光驱映入眼帘（看起来有些凌乱）；早在20年前，就有了祖传「单热管压热的快」的散热设计（注：PPC G4开始能耗比就不太行了），实际情况也是如此，负载一重风扇直接起飞。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76f5ca3bc.webp" alt="拆机图"></p><p>取下来的硬盘，来自东芝（时代的眼泪），IDE接口、40GB容量、8MB缓存，通过一个转接排线与主板进行供电与数据传输。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb76faa5326.webp" alt="原机硬盘"></p><h2 id="安装系统"><a href="#安装系统" class="headerlink" title="安装系统"></a>安装系统</h2><blockquote><p>💡相关文章：<a href="https://paizhang.info/archives/8572?_blank">给G3&#x2F;G4&#x2F;G5 Mac电脑重装系统，看这篇就够了（第二版）by 排长</a></p></blockquote><h3 id="需要准备"><a href="#需要准备" class="headerlink" title="需要准备"></a>需要准备</h3><ul><li>一支8G空间或更大的U盘（USB2.0）</li><li>一台装有10.4～10.13系统的Mac（PC可使用虚拟机或黑苹果解决）</li><li>用于PowerPC Mac的Mac OS X镜像</li></ul><h3 id="制作安装盘"><a href="#制作安装盘" class="headerlink" title="制作安装盘"></a>制作安装盘</h3><ul><li>为U盘创建 <code>Apple分区图</code> ，随后使用 <code>HFS+文件系统</code> 格式化U盘</li><li>在U盘的「恢复」菜单，将Mac OS X安装镜像恢复到U盘</li><li>使用终端查看U盘的分区结构，确定安装程序的位置</li></ul><h3 id="引导安装盘"><a href="#引导安装盘" class="headerlink" title="引导安装盘"></a>引导安装盘</h3><ul><li><p>将U盘插入PowerPC Mac，同时按住 <kbd>Control</kbd>+<kbd>Command</kbd>+<kbd>O</kbd>+<kbd>F</kbd>再开机，进入Open Firmware</p></li><li><p>使用<code>dev / ls</code>命令确定U盘的设备的物理地址（PCI总线地址、USB总线标识）</p></li><li><p>使用<code>boot /PCI总线/USB总线/U盘本身:磁盘分区标识位,\\:tbxi</code>命令引导安装程序（根据实际情况进行修改）</p></li><li><p>跟着安装向导进行系统的安装</p><p><img src="https://bu.dusays.com/2024/02/13/65cb770679239.webp" alt="安装向导"></p><p><img src="https://bu.dusays.com/2024/02/13/65cb770bcc47d.webp" alt="正在安装"></p><p><img src="https://bu.dusays.com/2024/02/13/65cb770f7a6f1.webp" alt="OOBE"></p></li></ul><blockquote><p><strong>需要注意</strong></p><p>使用的U盘或者SD卡读卡器要<strong>USB 2.0或更低规格</strong>的（特别是在只有USB 1.1接口的Mac上），否则会出现无法识别的问题。</p><p>例如下图明明插入设备，但在<code>/usb@19</code>下没有出现磁盘）</p><p><img src="https://bu.dusays.com/2024/02/13/65cb77105afb1.webp" alt="使用不兼容的U盘将无法引导"></p></blockquote><h2 id="总览"><a href="#总览" class="headerlink" title="总览"></a>总览</h2><p>系统装完啦，来看看这台20年前笔电的硬件信息吧。</p><p><img src="https://bu.dusays.com/2025/04/03/67ee1b26b9ce4.webp"></p><p>左侧包含了机身所有的接口，从左到右依次为：电源接口、调制解调器接口、百兆以太网接口、火线400接口、2个USB1.1接口、Mini-VGA接口、麦克风接口、耳机接口、防盗锁孔。相对于如今的MacBook来说，属实丰富。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb7715d9239.webp" alt="DSC03463"></p><p>右侧有一个吸入式刻录机，能正常使用。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb771ca2372.webp" alt="DSC03465"></p><p>机身正面很简洁，肉眼只能看到一个屏幕锁扣开关。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb771ee0502.webp" alt="DSC03466"></p><p>虽然不支持单手开合，但巧妙的磁吸锁扣设计，令人眼前一亮。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb7725e0fbb.webp" alt="DSC03474"></p><p>12英寸的TFT显示屏，背光灯有所老化，忽略暴露年龄的壁纸（什么老古董配古董，噗）。对了，键盘手感尚可。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb772855040.webp" alt="DSC03468"></p><p>屏幕面可见PowerBook G4的铭牌，“暗示”着机器使用的PowerPC G4处理器。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb7729e3429.webp" alt="DSC03469"></p><p>收到的这台机子不带无线（毕竟是最低配），摆脱网线束缚还需要这玩意——AirPort网卡。受制于时代，这张无线网卡现有的固件并不支持连接启用密码的WAP热点，需要专门开一个无密码热点才能摆脱线缆了。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb772cc97f2.webp" alt="无线网卡"></p><p>电池仓处有印刷无线网卡的安装指南，利好用户。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb772f7df86.webp" alt="网卡安装指南"></p><p>装上网卡，设置好无线热点。Awesome~</p><p>接下来就是上网冲浪啦，由于MacOS X Tiger自带的Safari浏览器版本实在是太老了，无法满足现代网页需求。这里用的是 TenFourFox ，基于Firefox魔改移植而来，可惜目前处于EoL状态。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb7733dfd0b.webp" alt="TenFourFox浏览器"></p><p>逛逛小破站，但不支持破站自带的HTML5播放器。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb7736605fd.webp" alt="逛小破站"></p><p><img src="https://bu.dusays.com/2024/02/13/65cb7738e7f58.webp" alt="可惜看不了视频"></p><p>看来得好好折腾下才行，敬请期待~</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;p&gt;作为一个「破铜烂铁」爱好者，笔者对中古硬件还是很感兴趣的。机缘巧合，笔者以一个极低的价格收了一台PowerBook G4（12吋，铝合金）笔记本电脑，以来了解PowerPC平台的特性。&lt;/p&gt;
&lt;p&gt;&lt;img s</summary>
      
    
    
    
    <category term="数码" scheme="https://blog.furen.link/categories/%E6%95%B0%E7%A0%81/"/>
    
    
    <category term="Mac" scheme="https://blog.furen.link/tags/Mac/"/>
    
    <category term="维护" scheme="https://blog.furen.link/tags/%E7%BB%B4%E6%8A%A4/"/>
    
    <category term="捡垃圾" scheme="https://blog.furen.link/tags/%E6%8D%A1%E5%9E%83%E5%9C%BE/"/>
    
  </entry>
  
  <entry>
    <title>使用Github Pages搭建个人博客</title>
    <link href="https://blog.furen.link/1426625619/"/>
    <id>https://blog.furen.link/1426625619/</id>
    <published>2023-03-16T06:58:19.000Z</published>
    <updated>2025-04-07T10:44:37.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文将通过<code>Hexo</code> + <code>GitHub Pages</code>实现个人博客的搭建，与大家分享自己的想法。</p><p>另外，这还是免费的，只需要借用短暂的一刻钟。</p><h3 id="简单介绍"><a href="#简单介绍" class="headerlink" title="简单介绍"></a>简单介绍</h3><p><code>Hexo</code>：一个静态博客生成器</p><p><code>Waline</code>：一款简洁、安全的评论系统</p><ul><li><p>Hexo 默认是不带评论系统的，需要手动配置（如果主题支持，只需简单配置即可）。</p></li><li><p>Waline可以部署在Serverless平台上（例如Vercel）</p></li></ul><p><code>Vercel</code>：一个用来部署前端应用的云平台，提供免费部署服务的能力。</p><ul><li>此处，Waline的应用运行在Vercel平台</li></ul><p><code>LeanCloud</code>：一个提供BssS（后端及服务）的平台，提供免费的资源。</p><ul><li>此处，Waline的后端数据就存储在LeanCloud的实例中</li></ul><h2 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h2><p>💡提示：一般情况下，Git和Node.js都会被写入系统的环境变量，以便能被终端（命令提示符）直接调用；若上述操作均没有作用，请检查环境变量的配置。</p><h3 id="安装Node-js"><a href="#安装Node-js" class="headerlink" title="安装Node.js"></a>安装Node.js</h3><p>下载并安装<a href="https://nodejs.org/zh-cn?_blank">Node.js</a></p><p>装完可进入命令提示符，输入<code>node -v</code>，若返回版本信息，则证明安装成功。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">v18.<span class="number">15.0</span></span><br></pre></td></tr></table></figure><h3 id="安装Git"><a href="#安装Git" class="headerlink" title="安装Git"></a>安装Git</h3><p>下载并安装<a href="https://git-scm.com/downloads?_blank">Git</a></p><p>装完可进入命令提示符，输入<code>git --version</code>，若返回版本信息，则证明安装成功。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git version <span class="number">2.39</span>.<span class="number">2</span>.windows.<span class="number">1</span></span><br></pre></td></tr></table></figure><h3 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h3><p>打开命令提示符，输入 <code>npm install -g hexo-cli</code></p><p>装完可输入<code>hexo -v</code>，检查安装情况；若返回版本信息，则证明安装成功。</p><blockquote><p>以下为命令提示符的部分输出</p><figure class="highlight powershell"><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">hexo<span class="literal">-cli</span>: <span class="number">4.3</span>.<span class="number">0</span></span><br><span class="line">os: win32 <span class="number">10.0</span>.<span class="number">19045</span></span><br><span class="line">node: <span class="number">18.15</span>.<span class="number">0</span></span><br><span class="line">v8: <span class="number">10.2</span>.<span class="number">154.26</span><span class="literal">-node</span>.<span class="number">25</span></span><br><span class="line">&lt;...&gt;</span><br></pre></td></tr></table></figure></blockquote><h2 id="创建本地博客"><a href="#创建本地博客" class="headerlink" title="创建本地博客"></a>创建本地博客</h2><h3 id="初始化目录"><a href="#初始化目录" class="headerlink" title="初始化目录"></a>初始化目录</h3><p>例如在F盘创建文件夹<code>gitBlog</code>（根据需要进行修改，只要自己清楚）</p><ul><li>鼠标右键刚刚创建名为<code>gitBlog</code>的文件夹，选择<code>Git Bash Here</code>（使用Git Bash打开）</li></ul><p>在Git Bash会话窗口中，输入<code>hexo init</code>，初始化目录</p><figure class="highlight powershell"><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">INFO  Cloning hexo<span class="literal">-starter</span> https://github.com/hexojs/hexo<span class="literal">-starter</span>.git</span><br><span class="line">INFO  Install dependencies</span><br><span class="line">INFO  <span class="built_in">Start</span> blogging with Hexo!</span><br></pre></td></tr></table></figure><p>💡提示：如果弹出证书错误警告，可以先使用<code>git config --global http.sslVerify false</code>关闭SSL验证（会降低安全性）。</p><h3 id="更换主题"><a href="#更换主题" class="headerlink" title="更换主题"></a>更换主题</h3><p>例如使用 <strong>hexo-theme-fluid</strong> 主题，在<strong>博客目录</strong>打开命令提示符，输入<code>npm install --save hexo-theme-fluid</code></p><blockquote><p>此时命令提示符会有输出：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt;added <span class="number">1</span> package, and audited <span class="number">241</span> packages <span class="keyword">in</span> <span class="number">5</span>s</span><br></pre></td></tr></table></figure></blockquote><p>然后在博客目录下创建 <code>_config.fluid.yml</code>，将主题的 <a href="https://github.com/fluid-dev/hexo-theme-fluid/blob/master/_config.yml?_blank">_config.yml</a> （配置文件）内容复制进去。</p><p>💡提示：主题的配置<code>_config.fluid.yml</code>有很多客制化选项，需要根据个人需要修改。</p><p>📚帮助：<a href="https://hexo.fluid-dev.com/docs/guide?_blank">hexo-theme-fluid 主题的配置指南</a></p><p>根据项目文档<strong>启用主题</strong>，修改博客目录的<code>_config.yml</code>文件，指向刚刚下载好的 <strong>fluid</strong> 主题，并将语言设置成 <strong>zh-CN</strong> 。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f89c3e0e8.png" alt="image-20230316193033314"></p><p><img src="https://bu.dusays.com/2024/02/05/65c0f89db8c6c.png" alt="image-20230316193059123"></p><p>根据项目文档<strong>创建关于页面</strong>，输入<code>hexo new page about</code></p><figure class="highlight powershell"><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">INFO  Validating config</span><br><span class="line">INFO  Created: F:\gitBlog\source\about\index.md </span><br></pre></td></tr></table></figure><p>创建成功后，编辑博客目录下 <code>/source/about/index.md</code>，添加 <code>layout</code> 属性。</p><figure class="highlight markdown"><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">---</span><br><span class="line">title: 关于</span><br><span class="line"><span class="section">layout: about</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line">这里写关于页的正文，支持 Markdown, HTML</span><br></pre></td></tr></table></figure><h3 id="撰写文章"><a href="#撰写文章" class="headerlink" title="撰写文章"></a>撰写文章</h3><p>所有基础框架都已经创建完成，接下来可以开始写你的第一篇博客了</p><p>在 <code>/source/_posts</code> 目录，创建后缀名为<code>md</code>的文件，使用 <strong>Markdown</strong> 或 <strong>HTML</strong> 语法，尽情抒发你的灵感吧。</p><blockquote><p><strong>例如创建一个名为</strong> <code>helloworld.md</code> <strong>文件</strong></p><figure class="highlight markdown"><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">&gt;---</span><br><span class="line">&gt;title: Hello World</span><br><span class="line">&gt;categories: </span><br><span class="line"><span class="bullet"> -</span> 日常</span><br><span class="line">&gt;tags: </span><br><span class="line"><span class="bullet"> -</span> Hexo</span><br><span class="line">&gt;---</span><br><span class="line"></span><br><span class="line">&gt;## 欢迎</span><br><span class="line"></span><br><span class="line">&gt;当你看到这个页面，则说明Hexo已搭建成功！尽情发挥吧~</span><br><span class="line"></span><br></pre></td></tr></table></figure></blockquote><h3 id="本地检查"><a href="#本地检查" class="headerlink" title="本地检查"></a>本地检查</h3><p>在Git Bash会话窗口中，输入<code>hexo s</code>。</p><p>测试服务启动，可在浏览器的地址栏输入 <code>https://localhost:4000</code> 访问。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8a16490b.png" alt="image-20230316020918854"></p><p>此时可以看到博客效果，检查客制化配置是否符合自己的需求。</p><ul><li><p>如果满意，则同时按下 <kbd>Ctrl</kbd> + <kbd>C</kbd> 键，退出测试服务。</p></li><li><p>如果不合适，修改并保存主题的配置文件，然后重启测试服务。</p></li></ul><p><img src="https://bu.dusays.com/2024/02/05/65c0f8a47da16.png" alt="image-20230316185936877"></p><h2 id="部署到GitHub"><a href="#部署到GitHub" class="headerlink" title="部署到GitHub"></a>部署到GitHub</h2><h3 id="注册GitHub账号"><a href="#注册GitHub账号" class="headerlink" title="注册GitHub账号"></a>注册GitHub账号</h3><p>访问<a href="https://github.com/?_blank">GitHub</a>，单击顶部的 <strong>Sign in</strong> ，根据提示注册账户。</p><h3 id="配置访问密钥"><a href="#配置访问密钥" class="headerlink" title="配置访问密钥"></a>配置访问密钥</h3><p><strong>生成密钥</strong></p><ul><li><p>打开命令提示符</p></li><li><p>输入<code>ssh-keygen -t rsa -C &quot;you@example.com&quot;</code>（使用时请将 <code>you@example.com</code> 修改成你的邮箱）</p></li><li><p>访问当前用户所在的目录，有个<code>./ssh</code>的文件夹，里面存放着刚刚生成的密钥文件</p></li><li><p>使用记事本打开<code>id_rsa.pub</code>文件</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8a7487d4.png" alt="image-20230316200429844"></p></li></ul><p><strong>添加密钥</strong></p><ul><li><p>登录GitHub，鼠标移动至右侧头像，单击 <strong>Settings</strong> 进入设置</p></li><li><p>在设置页面，进入 <strong>SSH and GPG Key</strong> 页面，单击 <strong>New SSH Key</strong> 以新建密钥</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8abbf5c9.png" alt="image-20230316200703440"></p></li><li><p>将刚刚打开的密钥文件复制粘贴至 <strong>Key</strong> 里，密钥类型 <strong>Key type</strong> 保持默认即可，随后单击 <strong>Add SSH key</strong> 添加。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8b11acc1.png" alt="image-20230316201031018"></p></li><li><p>添加后，能在<strong>身份认证密钥</strong>中看到信息</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8b677e8b.png" alt="image-20230316201218946"></p></li></ul><p><strong>设置本地账户</strong></p><ul><li>打开命令提示符</li><li>设置用户邮箱 <code>git config --global user.email &quot;you@example.com&quot; </code>（请将<code>you@example.com</code>修改成你的邮箱）</li><li>设置用户名字 <code>git config --global user.name &quot;Name&quot;</code> （请将<code>Name</code>修改成你的昵称）</li></ul><h3 id="创建仓库"><a href="#创建仓库" class="headerlink" title="创建仓库"></a>创建仓库</h3><ul><li><p>访问<a href="https://github.com/?_blank">GitHub</a>，登录账号</p></li><li><p>鼠标移动至右侧头像，单击 <strong>Your Repositories</strong> 进入仓库</p></li><li><p>单击 <strong>New</strong> 新建一个仓库</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8cfac9ff.png" alt="image-20230316202411624"></p></li><li><p>仓库名为 <code>用户名.github.io</code>，其他保持默认即可（即公开仓库、不添加README文档）</p><p>由于笔者已经创建过相同名字的仓库，无法再次创建</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8d26faac.png" alt="image-20230316203050848"></p></li><li><p>创建完成，会看到一个快速操作的说明</p></li><li><p>我们需要记录仓库的地址</p><ul><li>即 <code>https://github.com/userName/userName.github.io.git</code> </li><li>或 <code>git@github.com:userName/userName.github.io.git</code></li><li>💡提示：取其中一个地址即可，记得把<code>userName</code>修改成自己的用户名。</li></ul></li></ul><h3 id="编辑配置文件"><a href="#编辑配置文件" class="headerlink" title="编辑配置文件"></a>编辑配置文件</h3><ul><li><p>回到本地博客目录（例如本文中的 <code>F:\gitBlog\</code>目录中）</p></li><li><p>使用文本编辑器打开<code>_config.yml</code>文件，找到 <strong>#Deployment</strong> 这一行，</p><p>根据记录的仓库地址，填入对应的内容</p><ul><li><p><strong>如果使用</strong><code>https</code></p><figure class="highlight yml"><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="attr">deploy:</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">git</span></span><br><span class="line"><span class="attr">repository:</span> <span class="string">https://github.com/userName/userName.github.io.git</span></span><br><span class="line"><span class="attr">branch:</span> <span class="string">master</span> </span><br></pre></td></tr></table></figure></li><li><p><strong>如果使用</strong><code>git</code></p><figure class="highlight yml"><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="attr">deploy:</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line">  <span class="attr">repo:</span> <span class="string">git@github.com:userName/userName.github.io.git</span></span><br><span class="line">  <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure></li></ul><p>💡提示：取其中一个方式即可，记得把<code>userName</code>修改成自己的用户名。</p></li><li><p>保存配置文件</p></li></ul><h3 id="上传到仓库"><a href="#上传到仓库" class="headerlink" title="上传到仓库"></a>上传到仓库</h3><ul><li><p>打开命令提示符</p></li><li><p>安装工具 <code>npm install hexo-deployer-git --save</code>（此步骤仅需操作操作一次）</p></li><li><p>清理缓存 <code>hexo clean</code></p></li><li><p>生成并上传 <code>hexo g &amp;&amp; hexo d</code></p><ul><li><p>当命令提示符出现一下输出，即部署成功</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">INFO Deploy done: git</span><br></pre></td></tr></table></figure></li></ul></li><li><p>此时我们可以直接访问自己的博客： <code>https://userName.github.io</code> （将<code>userName</code>修改成自己的用户名）</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8dd3d726.jpg" alt="image-20230316204914556"></p></li></ul><h2 id="部署评论系统"><a href="#部署评论系统" class="headerlink" title="部署评论系统"></a>部署评论系统</h2><h3 id="注册Leancloud国际版账号"><a href="#注册Leancloud国际版账号" class="headerlink" title="注册Leancloud国际版账号"></a>注册Leancloud国际版账号</h3><ul><li><p>访问 <a href="https://console.leancloud.app/register?_blank">Leancloud-国际版-注册页面</a></p></li><li><p>根据提示，注册<strong>国际版</strong>账号</p><p>💡为什么要注册国际版？只因<strong>国内版需要绑定已备案的域名</strong>。</p><p>💡可以通过左上角版本提示确认注册区域（需显示为<strong>国际版</strong>）</p></li><li><p>注册完登录账户，单击页面的<strong>创建应用</strong></p><ul><li><p>其中选择<strong>开发版</strong>计价方案，自定名称</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8e0c7504.png" alt="image-20230316220639361"></p></li><li><p>单击<strong>创建</strong></p></li></ul></li><li><p>单击刚刚创建好的应用</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8e52eeb9.png" alt="image-20230316220727045"></p></li><li><p>在应用界面依次找到 <strong>设置</strong> → <strong>应用凭证</strong></p><ul><li><p>记录 <code>AppID</code> 、<code>AppKey</code> 和 <code>MasterKey</code> 这三个变量的值（请勿随意公开）</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8e77d21b.png" alt="Snipaste_2023-03-16_13-55-49"></p></li></ul></li></ul><h3 id="在Vercel部署Waline"><a href="#在Vercel部署Waline" class="headerlink" title="在Vercel部署Waline"></a>在Vercel部署Waline</h3><ul><li><p><a href="https://vercel.com/import/project?template=https://github.com/walinejs/waline/tree/main/example?_blank">单击此处</a>，一键部署Waline</p></li><li><p>根据提示，需要注册一个账户</p><p>可单击 <strong>Continue with GitHub</strong> ，使用GitHub账户快捷注册</p></li><li><p>重新访问<a href="https://vercel.com/import/project?template=https://github.com/walinejs/waline/tree/main/example?_blank">在Vercel部署Waline的页面</a></p><ul><li>自行设置仓库名字（<strong>Repository Name</strong>），单击 <strong>Create</strong> 创建</li><li>等待 <strong>Deploy</strong> 构建完成</li></ul></li><li><p>此时单击 <strong>Go to Dashboard</strong> 进入仪表盘</p><ul><li><p>在仪表盘界面，依次找到 <strong>Setting</strong> → <strong>Environment Variables</strong></p></li><li><p>根据上一步记录下来的三个值，配置环境变量</p><p>它们的对照关系如下表所示：</p><table><thead><tr><th align="center">Vercel Environment</th><th align="center">Lean Cloud</th></tr></thead><tbody><tr><td align="center">LEAN_ID</td><td align="center">AppID</td></tr><tr><td align="center">LEAN_KEY</td><td align="center">AppKey</td></tr><tr><td align="center">LEAN_MASTER_KEY</td><td align="center">MasterKey</td></tr></tbody></table><p><img src="https://bu.dusays.com/2024/02/05/65c0f8ed3d258.png" alt="image-20230316223210952"></p></li><li><p>配置完如下图所示</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8f19bead.png" alt="image-20230316223259417"></p></li></ul></li><li><p>为了使环境变量生效，需要重新构建一次</p><ul><li><p>在仪表盘界面单击 <strong>Deployments</strong></p></li><li><p>单击实例<strong>最右侧的按钮</strong>，找到 <strong>Redeploy</strong></p></li><li><p><img src="https://bu.dusays.com/2024/02/05/65c0f8f350df3.png" alt="image-20230316223844673"></p></li><li><p>此时会弹出提示，同意就好</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8f72d826.png" alt="image-20230316223950489"></p></li><li><p>等待其构建结束，并回到 <strong>Project</strong> 页面</p></li><li><p>记录 <code>DOMAINS</code> 下面的值</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f8f95ea8c.png" alt="image-20230316224209174"></p></li></ul></li></ul><h3 id="修改Hexo-Fluid主题配置"><a href="#修改Hexo-Fluid主题配置" class="headerlink" title="修改Hexo Fluid主题配置"></a>修改Hexo Fluid主题配置</h3><blockquote><p>注：本文基于<code>hexo-theme-fluid</code>主题进行演示，不一定通用；<strong>其他主题请参考主题作者撰写的说明文档</strong>，谢谢！</p><p>📚帮助：<a href="https://hexo.fluid-dev.com/docs/guide?_blank">hexo-theme-fluid 主题的配置指南</a></p></blockquote><p>使用编辑器（如 <strong>Vim</strong>、<strong>Notepad3</strong>、<strong>VS Code</strong>等）</p><ul><li>打开本地博客目录的<code>_config.fluid.yml</code>文件</li></ul><p>通过<strong>查找</strong>功能，搜索<code>comment</code>（评论插件）有关的行</p><ul><li><p>例如第728行到第735行，启用<strong>文章的评论功能</strong></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">comments:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">waline</span></span><br></pre></td></tr></table></figure></li><li><p>例如第1022行到1029行，启用<strong>友链的评论功能</strong></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">comments:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line">  <span class="attr">type:</span> <span class="string">waline</span></span><br></pre></td></tr></table></figure></li></ul><p>通过<strong>查找</strong>功能，搜索<code>Waline</code>有关的行</p><ul><li><p>例如第812行到825行</p></li><li><p>只需要添加服务链接就好（也就是上一步记录下来的链接），例如（请注意缩进）</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">serverURL:</span> <span class="string">&#x27;waline-ser4hexo.vercel.app&#x27;</span></span><br></pre></td></tr></table></figure><p><img src="https://bu.dusays.com/2024/02/05/65c0f8feacbd4.png" alt="image-20230316225734456"></p></li></ul><p>重新部署 <code>Hexo</code> ，就能看到效果了</p><ul><li><p>在本地博客目录打开命令提示符</p></li><li><p>💡重新部署命令：<code>hexo clean &amp;&amp; hexo g &amp;&amp; hexo d</code></p></li></ul><h3 id="注册Waline账号"><a href="#注册Waline账号" class="headerlink" title="注册Waline账号"></a>注册Waline账号</h3><p>Waline支持评论管理，需要注册一个账号作为管理员</p><ul><li><p><strong>默认第一个注册的就有管理员权限</strong></p></li><li><p>服务部署好一定要及时注册</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f900ae95e.png" alt="image-20230316230450429"></p></li></ul><h2 id="享用"><a href="#享用" class="headerlink" title="享用"></a>享用</h2><p>现在，你就可以把你的博客分享给小伙伴啦~</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f9036f0db.jpg" alt="image-20230316230651177"></p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&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;本文将通过&lt;code&gt;Hexo&lt;/code&gt; + &lt;code&gt;GitHub P</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.furen.link/categories/%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="Hexo" scheme="https://blog.furen.link/tags/Hexo/"/>
    
    <category term="Github" scheme="https://blog.furen.link/tags/Github/"/>
    
  </entry>
  
  <entry>
    <title>卡诺基RTX2060S矿卡流水账</title>
    <link href="https://blog.furen.link/738616602/"/>
    <id>https://blog.furen.link/738616602/</id>
    <published>2023-03-09T02:07:03.000Z</published>
    <updated>2024-01-14T09:14:26.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><p>在矿潮最凶的时候，把手中的<strong>GTX760</strong>换成<strong>GTX950</strong>，磕磕绊绊用了2年。通过新 <code>NVENC</code> 编码器提高了视频录制的效率，同时足够的省电（要知道非公版GTX760可是真电老虎），就是性能是有那么一丢丢过时。</p><p>正好，在好哥们的领券助攻下，以894软妹币的价格拿下一张卡诺基的涡扇版<strong>GTX2060 Super</strong>。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b216d179.webp" alt="image-20230309172505673"></p><h2 id="开箱"><a href="#开箱" class="headerlink" title="开箱"></a>开箱</h2><p>收到货，包装很朴素</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b21ec2c4.webp" alt="image-20230309171717004"></p><p>主角，接口为3个DP和1个HDMI，标准配置</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b255e6c8.webp" alt="image-20230309171930864"></p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b20f3e8f.webp" alt="image-20230309173051002"></p><h2 id="翻车"><a href="#翻车" class="headerlink" title="翻车"></a>翻车</h2><p>按照惯例，肯定是要上机器的测试的啦。可惜，刚通过<code>3DMark TimeSpy</code> 压力测试就出问题了。只要一运行游戏就会卡机掉驱动，貌似是显存扛不住过高的频率所致。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b21d249e.webp" alt="image-20230309173915754"></p><p>果断联系售后，并提供了故障视频，没多久店家就同意了换货申请。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b260e04e.webp" alt="Snipaste_2024-02-13_17-44-54"></p><h2 id="换卡"><a href="#换卡" class="headerlink" title="换卡"></a>换卡</h2><p>寄出故障卡的当天，新显卡也发货，并在第二天收到。</p><p>金手指最后一段有些黑迹，不过背部看起来还行。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b2a4810b.webp" alt="image-20230309174651225"></p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b2c26834.webp" alt="image-20230309174755836"></p><h2 id="安全下车"><a href="#安全下车" class="headerlink" title="安全下车"></a>安全下车</h2><p>使用<strong>GPU-Z</strong>查看显卡信息，相比非公版<code>RTX2060 Super</code>，卡诺基调低了这张卡的<strong>核心频率</strong>和<strong>显存频率</strong>；实际性能会差一点，不过能提高稳定性。</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b2e3bc56.png" alt="image-20230309175304520"></p><p>跑了三回<code>3DMark TimeSpy</code>测试，一回<code>3DMark TimeSpy Extreme </code>测试，一个小时1080P高画质的<code>GTA4</code>，无任何异状。</p><p><code>3DMark TimeSpy</code>的显卡跑分为<strong>8238</strong>分</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b3407210.png" alt="Snipaste_2023-03-08_20-05-13"></p><p>在<code>CSGO</code>中，使用自动参数（2K分辨率、高画质、8x抗锯齿），在<code>FPS Benchmark</code>地图中，跑出平均<strong>294.90fps</strong>的标准成绩。（话说真的有人会画质全开打CS的吗？）</p><p><img src="https://bu.dusays.com/2024/02/13/65cb3b3914dfa.webp" alt="image-20230309180231367"></p><p>补充：截止到2024年1月，换货后的卡依旧工作正常，也陪伴着憨憨处理视频补帧、AI绘画等杂活。</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;p&gt;在矿潮最凶的时候，把手中的&lt;strong&gt;GTX760&lt;/strong&gt;换成&lt;strong&gt;GTX950&lt;/strong&gt;，磕磕绊绊用了2年。通过新 &lt;code&gt;NVENC&lt;/code&gt; 编码器提高了视频录制的效</summary>
      
    
    
    
    <category term="数码" scheme="https://blog.furen.link/categories/%E6%95%B0%E7%A0%81/"/>
    
    
    <category term="显卡" scheme="https://blog.furen.link/tags/%E6%98%BE%E5%8D%A1/"/>
    
    <category term="折腾" scheme="https://blog.furen.link/tags/%E6%8A%98%E8%85%BE/"/>
    
  </entry>
  
  <entry>
    <title>「回忆」联想M73小主机的流水账</title>
    <link href="https://blog.furen.link/1200821476/"/>
    <id>https://blog.furen.link/1200821476/</id>
    <published>2023-02-26T09:06:12.000Z</published>
    <updated>2025-04-07T10:35:19.000Z</updated>
    
    <content type="html"><![CDATA[<div id="postchat_postcontent"><p>在 21年新年的时候，白嫖了一台主板有问题的联想一体机 ，卸下了里面的内存、硬盘、处理器……</p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>在21年新年的时候，白嫖了一台主板有问题的联想一体机 ，卸下了里面的内存、硬盘、处理器、网卡（这些都是存活的哈），然后主板机壳什么的30r丢给回收站。想着白嫖这些小家伙，不如凑成一台小主机吧；短暂的信息检索后，联想的ThinkCentre M73 Tiny映入眼帘。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f49288e37.webp" alt="下单M73"></p><p>为什么选择M73呢？当然是便宜呀（雾）。</p><blockquote><p>同定位且同平台（Haswell）的1L小主机还有惠普和戴尔的，相比联想M73来说，优点多且不需要过分折腾，就是准系统价格贵个100上下。</p></blockquote><p>不过取而代之的就是得多花点时间折腾，例如联想无线网卡的白名单机制（非联想专用网卡插上去是不会让你开机的）、内置的扬声器音量极小且辣耳朵……这对我来说问题不大。</p><p>另一个原因，就是想当黑苹果（Hackintosh）小主机用。同性能的Mac Mini得入手2012款定制i7版本，而这款的二手价格普遍在1500元附近，只是拿来玩玩性价比实在是太低，何况当时有吃上黑苹果的XPS了。</p><h2 id="折腾"><a href="#折腾" class="headerlink" title="折腾"></a>折腾</h2><h3 id="初始思路"><a href="#初始思路" class="headerlink" title="初始思路"></a>初始思路</h3><p>处理器：一开始用的是i3-4170T（白嫖的），虽然仅是双核i3，但性能比2012款搭载i5处理器的Mac Mini还是略强的，不过HD4400核心显卡并不被MacOS支持，需要配置仿冒ID才行。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f49bdf8de.webp" alt="处理器"></p><p>内存：三星4GB DDR3 1600MHz，能用就行。</p><p>硬盘：白嫖的闪迪X110 128GB固态，马牌主控+MLC颗粒，用了快4年还健在，传家宝首选。（2280规格的固态，故套个转接盒）</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4a4917dd.webp" alt="硬盘"></p><p>无线：网卡就很随便了，毕竟是Haswell时代，mini PCI-E接口还是很普及的，随便买了张博通的BCM943224HMS就好啦，才20大洋，就是需要折腾一下小主机啦。有两种方法可以处理，我用的是<a href="https://zhuanlan.zhihu.com/p/309334893">清除序列号的方法</a>，还有一种是<a href="https://zhuanlan.zhihu.com/p/355230613?ivk_sa=1024320u">使用破解BIOS</a>，根据需要点击相应的链接照葫芦画瓢就好。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4b0d1921.webp" alt="无线网卡"></p><p>蓝牙：免驱的USB适配器（现在看居然还涨价了，离谱）。</p><p>娱乐大师跑个分，在使用i3-4170T + 4GB 内存的配置下，看起来还行。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4ba1ac4b.webp" alt="娱乐大师跑分"></p><h3 id="后续升级"><a href="#后续升级" class="headerlink" title="后续升级"></a>后续升级</h3><p>考虑到用来剪辑视频，思考再三花了170换了块i5-4590T（4C4T）。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4c4047f4.webp" alt="拆机1"></p><p>不过这个理论性能的提升嘛，是不太明显（i3-4170T时的象棋跑分为6021）；当然换i5的目的是核心显卡的支持，HD4600的编解码性能好很多，另外是不用专门配置FakeID了。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4cd1631a.webp" alt="换了处理器后的象棋分"></p><p>接着就是加了根8GB的内存，组成12GB不对称双通道；可惜的是，这根内存没过几个月就坏了。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4d6f2d7d.webp" alt="拆机2"></p><h3 id="最终配置"><a href="#最终配置" class="headerlink" title="最终配置"></a>最终配置</h3><table><thead><tr><th>类别</th><th>型号与参数</th></tr></thead><tbody><tr><td>处理器</td><td>Intel Core i5-4590T （4C4T 35w 3GHz）</td></tr><tr><td>芯片组</td><td>H81</td></tr><tr><td>内存</td><td>三星 DDR3 1600MHz 4GB</td></tr><tr><td>硬盘</td><td>闪迪 X110 128GB 固态</td></tr><tr><td>显卡</td><td>HD4600核心显卡</td></tr><tr><td>电源</td><td>联想90w原装适配器</td></tr><tr><td>无线</td><td>博通 BCM 943224HMS （300Mbps 双频）</td></tr><tr><td>蓝牙</td><td>免驱USB适配器</td></tr><tr><td>系统</td><td>Windows 10 LTSC + MacOS 10.15.3</td></tr></tbody></table><p>我把天线内置了，机子很清爽。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4f4aa9c6.webp" alt="外观"></p><h2 id="体验"><a href="#体验" class="headerlink" title="体验"></a>体验</h2><blockquote><p>年代有点久远，很多截图都没及时转存了QAQ。</p></blockquote><p>祖传的AMI BIOS界面，因为抹去了序列号信息，开机会有错误信息，不影响使用。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f4ffcc050.webp" alt="绕开白名单后的情况"></p><p>系统用的是MacOS 10.15 Catalina，挺流畅的。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f509bb2ee.webp" alt="M73吃上黑苹果"></p><p>RDP连接下用来备赛用的服务器（逃）。</p><p><img src="https://bu.dusays.com/2024/02/05/65c0f51277591.webp" alt="连接备赛服务器"></p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><blockquote><p>岁月是把杀猪刀</p></blockquote><p>挺好玩的，体验了一把另类的Mac Mini；半年的时光很短暂，但收获颇多，也是这个契机，让我萌发了组建台式机炼丹的想法；毕竟M73的散热难以支撑往后的学习、项目的需求；于是乎，在同年的8月底，以850元的价格出掉了这台机器（4590T+4G+128G），便开始新的折腾计划……</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;div id=&quot;postchat_postcontent&quot;&gt;&lt;p&gt;在 21年新年的时候，白嫖了一台主板有问题的联想一体机 ，卸下了里面的内存、硬盘、处理器……&lt;/p&gt;
&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;</summary>
      
    
    
    
    <category term="数码" scheme="https://blog.furen.link/categories/%E6%95%B0%E7%A0%81/"/>
    
    
    <category term="黑苹果" scheme="https://blog.furen.link/tags/%E9%BB%91%E8%8B%B9%E6%9E%9C/"/>
    
    <category term="小主机" scheme="https://blog.furen.link/tags/%E5%B0%8F%E4%B8%BB%E6%9C%BA/"/>
    
  </entry>
  
</feed>
