<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>林伟源</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://linweiyuan.github.io/</id>
  <link href="https://linweiyuan.github.io/" rel="alternate"/>
  <link href="https://linweiyuan.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 林伟源</rights>
  <title>林伟源的技术博客</title>
  <updated>2026-05-09T01:45:34.367Z</updated>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="虚拟机" scheme="https://linweiyuan.github.io/categories/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    <category term="Windows" scheme="https://linweiyuan.github.io/tags/Windows/"/>
    <category term="KVM" scheme="https://linweiyuan.github.io/tags/KVM/"/>
    <category term="QEMU" scheme="https://linweiyuan.github.io/tags/QEMU/"/>
    <content>
      <![CDATA[<p>今天折腾下串流，sunshine 这个包在 Arch 的 aur 库里是有的，如果不想自己编译那么还可以直接从 archlinuxcn 里装</p><p>装完直接用，没有任何问题，moonlight 也很正常</p><p>但是，我的 Steam 是安装在虚拟机 Windows 上的，那么串流的时候，输入 Arch 的 IP 显然不合逻辑，所以就连不上了</p><p>这时，翻看 sunshine 的配置，会发现上面有列出需要用到的端口，那么是否可以进行端口映射来解决？</p><p>答案是可以的，并且可以用多种方式实现，比如常见的 iptables，或者 qemu 自带的</p><p>但是我这里用 socat</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">socat TCP-LISTEN:47984,fork TCP:192.168.122.130:47984</span><br><span class="line">socat TCP-LISTEN:47989,fork TCP:192.168.122.130:47989</span><br><span class="line">socat TCP-LISTEN:48010,fork TCP:192.168.122.130:48010</span><br><span class="line">socat UDP-LISTEN:48010,fork UDP:192.168.122.130:48010</span><br><span class="line">socat UDP-LISTEN:47998,fork UDP:192.168.122.130:47998</span><br><span class="line">socat UDP-LISTEN:47999,fork UDP:192.168.122.130:47999</span><br><span class="line">socat UDP-LISTEN:48000,fork UDP:192.168.122.130:48000</span><br></pre></td></tr></table></figure><p>这样就可以了</p><p>当然，还可以给虚拟机插入个 USB 网卡，这种方式我试过也是没有问题</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2025/03/02/Sunshine-Moonlight.html</id>
    <link href="https://linweiyuan.github.io/2025/03/02/Sunshine-Moonlight.html"/>
    <published>2025-03-02T16:07:05.000Z</published>
    <summary>
      <![CDATA[<p>今天折腾下串流，sunshine 这个包在 Arch 的 aur 库里是有的，如果不想自己编译那么还可以直接从 archlinuxcn 里装</p>
<p>装完直接用，没有任何问题，moonlight 也很正常</p>
<p>但是，我的 Steam 是安装在虚拟机 Wind]]>
    </summary>
    <title>Sunshine + Moonlight</title>
    <updated>2026-05-09T01:45:34.367Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="Kubernetes" scheme="https://linweiyuan.github.io/tags/Kubernetes/"/>
    <content>
      <![CDATA[<p>今天是 15 号，需要搭一个新的系统用来做测试，用了一直使用的脚本来安装后，出了问题，无法连接网络，报错信息大概是权限问题，后面重启或者其他操作也全部报错</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">Jan 15 18:21:20 archlinux systemd[1]: polkit.service: Main process exited, code=exited, status=217/USER</span><br><span class="line">░░ Subject: Unit process exited</span><br><span class="line">░░ Defined-By: systemd</span><br><span class="line">░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel</span><br><span class="line">░░</span><br><span class="line">░░ An ExecStart= process belonging to unit polkit.service has exited.</span><br><span class="line">░░</span><br><span class="line">░░ The process<span class="string">&#x27; exit code is &#x27;</span>exited<span class="string">&#x27; and its exit status is 217.</span></span><br><span class="line"><span class="string">Jan 15 18:21:20 archlinux systemd[1]: polkit.service: Failed with result &#x27;</span>exit-code<span class="string">&#x27;.</span></span><br><span class="line"><span class="string">░░ Subject: Unit failed</span></span><br><span class="line"><span class="string">░░ Defined-By: systemd</span></span><br><span class="line"><span class="string">░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel</span></span><br><span class="line"><span class="string">░░</span></span><br><span class="line"><span class="string">░░ The unit polkit.service has entered the &#x27;</span>failed<span class="string">&#x27; state with result &#x27;</span>exit-code<span class="string">&#x27;.</span></span><br><span class="line"><span class="string">Jan 15 18:21:20 archlinux systemd[1]: Failed to start Authorization Manager.</span></span><br><span class="line"><span class="string">░░ Subject: A start job for unit polkit.service has failed</span></span><br><span class="line"><span class="string">░░ Defined-By: systemd</span></span><br><span class="line"><span class="string">░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel</span></span><br><span class="line"><span class="string">░░</span></span><br><span class="line"><span class="string">░░ A start job for unit polkit.service has finished with a failure.</span></span><br><span class="line"><span class="string">░░</span></span><br><span class="line"><span class="string">░░ The job identifier is 2159 and the job result is failed.</span></span><br><span class="line"><span class="string">Jan 15 18:21:20 archlinux NetworkManager[609]: &lt;info&gt;  [1736936480.2701] audit: op=&quot;connection-add-activate&quot; pid=858 uid=1000 result=&quot;fail&quot; reason=&quot;Not authorized to control networking.&quot;</span></span><br><span class="line"><span class="string">Jan 15 18:21:25 archlinux systemd[1]: systemd-localed.service: Deactivated successfully.</span></span><br><span class="line"><span class="string">░░ Subject: Unit succeeded</span></span><br><span class="line"><span class="string">░░ Defined-By: systemd</span></span><br><span class="line"><span class="string">░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel</span></span><br><span class="line"><span class="string">░░</span></span><br><span class="line"><span class="string">░░ The unit systemd-localed.service has successfully entered the &#x27;</span>dead<span class="string">&#x27; state.</span></span><br></pre></td></tr></table></figure><p>翻看错误日志，发现是 <code>polkit</code> 这个服务起不来，重启也不行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ sudo systemctl restart polkit</span><br><span class="line">Job <span class="keyword">for</span> polkit.service failed because the control process exited with error code.</span><br><span class="line">See <span class="string">&quot;systemctl status polkit.service&quot;</span> and <span class="string">&quot;journalctl -xeu polkit.service&quot;</span> <span class="keyword">for</span> details.</span><br></pre></td></tr></table></figure><p>再看包更新日志，确实更新了这个包，从 <code>125</code> 升到了 <code>126</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ pacman -Q | grep polkit</span><br><span class="line">polkit 126-1</span><br></pre></td></tr></table></figure><p>怎么办呢？回滚</p><p>Arch 这个系统好就好在滚挂了能很快在 <a href="https://archive.archlinux.org/packages/p/polkit/">archive</a> 里找到旧包</p><p>直接下载 <code>125</code> 版本的下来重新安装，然后重启服务，好了</p><p>不信邪，我测试机比较多，在另一台机上面滚一下重启，没有问题</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ sudo pacman -Syu</span><br><span class="line">:: Synchronizing package databases...</span><br><span class="line"> core is up to <span class="built_in">date</span></span><br><span class="line"> extra is up to <span class="built_in">date</span></span><br><span class="line"> multilib is up to <span class="built_in">date</span></span><br><span class="line"> archlinuxcn                                                                          1389.5 KiB   924 KiB/s 00:02 [--------------------------------------------------------------------] 100%</span><br><span class="line">:: Starting full system upgrade...</span><br><span class="line">warning: conky: ignoring package upgrade (1.19.7-1 =&gt; 1.21.5-1)</span><br><span class="line">warning: xfce4-terminal: ignoring package upgrade (0.8.9.2-2 =&gt; 1.1.4-1)</span><br><span class="line">resolving dependencies...</span><br><span class="line">looking <span class="keyword">for</span> conflicting packages...</span><br><span class="line"></span><br><span class="line">Package (1)   Old Version  New Version  Net Change  Download Size</span><br><span class="line"></span><br><span class="line">extra/polkit  125-1        126-1          0.01 MiB       0.39 MiB</span><br><span class="line"></span><br><span class="line">Total Download Size:   0.39 MiB</span><br><span class="line">Total Installed Size:  1.89 MiB</span><br><span class="line">Net Upgrade Size:      0.01 MiB</span><br><span class="line"></span><br><span class="line">:: Proceed with installation? [Y/n]</span><br></pre></td></tr></table></figure><p>难道新安装的系统有问题，旧系统升级就没问题？再来重试一遍系统安装，果然又有问题</p><p>得出结论，直接全新安装 <code>126</code> 包是会挂的，但是从 <code>125</code> 升到 <code>126</code> 就正常</p><hr><p>更新：当天晚些时候，看到官方已经出了个补丁包，我试了重新安装系统测试，也是能正常了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ sudo pacman -Syu</span><br><span class="line">:: Synchronizing package databases...</span><br><span class="line"> core is up to <span class="built_in">date</span></span><br><span class="line"> extra is up to <span class="built_in">date</span></span><br><span class="line"> archlinuxcn is up to <span class="built_in">date</span></span><br><span class="line">:: Starting full system upgrade...</span><br><span class="line">warning: conky: ignoring package upgrade (1.19.7-1 =&gt; 1.21.5-1)</span><br><span class="line">warning: xfce4-terminal: ignoring package upgrade (0.8.9.2-2 =&gt; 1.1.4-1)</span><br><span class="line">resolving dependencies...</span><br><span class="line">looking <span class="keyword">for</span> conflicting packages...</span><br><span class="line"></span><br><span class="line">Package (1)   Old Version  New Version  Net Change  Download Size</span><br><span class="line"></span><br><span class="line">extra/polkit  126-1        126-2          0.00 MiB       0.39 MiB</span><br><span class="line"></span><br><span class="line">Total Download Size:   0.39 MiB</span><br><span class="line">Total Installed Size:  1.89 MiB</span><br><span class="line">Net Upgrade Size:      0.00 MiB</span><br><span class="line"></span><br><span class="line">:: Proceed with installation? [Y/n]</span><br></pre></td></tr></table></figure><p>总算明白，当时上网查这个错误怎么解决的时候，有人说，重新安装这个包解决了他的问题</p><p>我告诉你，重新安装是解决不了的，你重新安装的是打了补丁的了，包名一样，造成了你的假象</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2025/01/15/%E4%B8%80%E6%AC%A1-polkit-%E5%8C%85%E5%8D%87%E7%BA%A7%E5%AF%BC%E8%87%B4%E7%9A%84%E6%BB%9A%E6%8C%82%E9%97%AE%E9%A2%98.html</id>
    <link href="https://linweiyuan.github.io/2025/01/15/%E4%B8%80%E6%AC%A1-polkit-%E5%8C%85%E5%8D%87%E7%BA%A7%E5%AF%BC%E8%87%B4%E7%9A%84%E6%BB%9A%E6%8C%82%E9%97%AE%E9%A2%98.html"/>
    <published>2025-01-15T14:59:04.000Z</published>
    <summary>
      <![CDATA[<p>今天是 15 号，需要搭一个新的系统用来做测试，用了一直使用的脚本来安装后，出了问题，无法连接网络，报错信息大概是权限问题，后面重启或者其他操作也全部报错</p>
<figure class="highlight bash"><table><tr><td class="gu]]>
    </summary>
    <title>一次 polkit 包升级导致的滚挂问题</title>
    <updated>2026-05-09T01:45:34.370Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="Kubernetes" scheme="https://linweiyuan.github.io/tags/Kubernetes/"/>
    <content>
      <![CDATA[<p><a href="https://linweiyuan.github.io/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF.html">上文</a> 提到本地部署 <code>Kubernetes</code> 集群的几种方式，同时也提到了开发过程中应该怎么连上去这些服务的问题，特别是像 <a href="https://kind.sigs.k8s.io/">kind</a>，<a href="https://kubernetes.io/docs/tutorials/hello-minikube/">Minikube</a> 这种套娃，一般来说，使用 <code>kubectl port-forward</code> 是一种不错的方式</p><p>同时我也试了 <a href="https://github.com/linweiyuan/goportforwarder">goportforwarder</a>，因为背后也是 <code>kubectl port-forward</code>，所以除了低端口的权限问题，还是勉强能用的</p><p>今天发现了另一种方式，就是 <code>IDEA</code> 的 <code>Kubernetes</code> 插件，如图（当然这里的场景只是连接数据库）</p><p><img src="/2025/01/10/%E8%BF%9E%E6%8E%A5%E6%9C%AC%E5%9C%B0-Kubernetes-%E6%9C%8D%E5%8A%A1%E7%9A%84%E4%B8%80%E7%A7%8D%E6%96%B9%E5%BC%8F/idea-kubernetes-port-forward.png"></p><p>相信背后也是一样的道理</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ netstat -tnpl                                </span><br><span class="line">(Not all processes could be identified, non-owned process info</span><br><span class="line"> will not be shown, you would have to be root to see it all.)</span><br><span class="line">Active Internet connections (only servers)</span><br><span class="line">Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    </span><br><span class="line">tcp6       0      0 ::1:5432                :::*                    LISTEN      59439/kubectl  </span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://linweiyuan.github.io/2025/01/10/%E8%BF%9E%E6%8E%A5%E6%9C%AC%E5%9C%B0-Kubernetes-%E6%9C%8D%E5%8A%A1%E7%9A%84%E4%B8%80%E7%A7%8D%E6%96%B9%E5%BC%8F.html</id>
    <link href="https://linweiyuan.github.io/2025/01/10/%E8%BF%9E%E6%8E%A5%E6%9C%AC%E5%9C%B0-Kubernetes-%E6%9C%8D%E5%8A%A1%E7%9A%84%E4%B8%80%E7%A7%8D%E6%96%B9%E5%BC%8F.html"/>
    <published>2025-01-10T17:11:47.000Z</published>
    <summary>
      <![CDATA[<p><a href="https://linweiyuan.github.io/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF.h]]>
    </summary>
    <title>连接本地 Kubernetes 服务的一种方式</title>
    <updated>2026-05-09T01:45:34.395Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="Kubernetes" scheme="https://linweiyuan.github.io/tags/Kubernetes/"/>
    <content>
      <![CDATA[<p>得益于优秀的 <code>pacman</code>，和强大的 <code>AUR</code>，安装起来是比较简单的（当然这里特指本地单机部署测试）</p><h3 id="（可选）提高效率"><a href="#（可选）提高效率" class="headerlink" title="（可选）提高效率"></a>（可选）提高效率</h3><p>比如 <code>oh-my-zsh</code>，则可以编辑 <code>.zshrc</code> 添加插件</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">plugins=(</span><br><span class="line">  ...</span><br><span class="line">  kubectl</span><br><span class="line">  ...</span><br><span class="line">)h</span><br></pre></td></tr></table></figure><p>这个插件可以简化一些重复的长命令，让你更专注于开发任务，比如 <code>kubectl get pods</code> 可以简化为 <code>k get pods</code>，甚至 <code>kgp</code>，里面设置了很多命令的别名：详情可以参考这个表：<a href="https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/kubectl">kubectl</a></p><p>或者安装类似 <code>k9s</code> 这种工具</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S k9s</span><br></pre></td></tr></table></figure><hr><h3 id="二进制安装"><a href="#二进制安装" class="headerlink" title="二进制安装"></a>二进制安装</h3><p>不在讨论范围内，因为没试过</p><hr><h3 id="包安装"><a href="#包安装" class="headerlink" title="包安装"></a>包安装</h3><p>官方 wiki <a href="https://wiki.archlinux.org/title/Kubernetes">Kubernetes</a> 里有写手动安装的步骤</p><p><code>control-plain</code> 节点的话安装 <a href="https://archlinux.org/groups/x86_64/kubernetes-control-plane/">kubernetes-control-plane</a>，是一个组，里面包含了下面的包</p><ul><li><a href="https://archlinux.org/packages/extra/x86_64/kube-apiserver/">kube-apiserver</a></li><li><a href="https://archlinux.org/packages/extra/x86_64/kube-controller-manager/">kube-controller-manager</a></li><li><a href="https://archlinux.org/packages/extra/x86_64/kube-proxy/">kube-proxy</a></li><li><a href="https://archlinux.org/packages/extra/x86_64/kube-scheduler/">kube-scheduler</a></li><li><a href="https://archlinux.org/packages/extra/x86_64/kubelet/">kubelet</a></li></ul><p><code>worker</code> 节点也是一个组 <a href="https://archlinux.org/groups/x86_64/kubernetes-node/">kubernetes-node</a>，包含包</p><ul><li><a href="https://archlinux.org/packages/extra/x86_64/kube-proxy/">kube-proxy</a></li><li><a href="https://archlinux.org/packages/extra/x86_64/kubelet/">kubelet</a></li></ul><p>这种方式也没试过</p><hr><h3 id="kind"><a href="#kind" class="headerlink" title="kind"></a><a href="https://kind.sigs.k8s.io/">kind</a></h3><p>这个 kind 包在 AUR 里有，可以直接安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yay -S kind</span><br></pre></td></tr></table></figure><p>也可以通过源代码，或者直接用 <code>go install</code> 安装，更多信息参考官方文档 <a href="https://kind.sigs.k8s.io/docs/user/quick-start/">Quick Start</a></p><p>执行 kind 命令，可得到类似如下输出</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ kind</span><br><span class="line">kind creates and manages <span class="built_in">local</span> Kubernetes clusters using Docker container <span class="string">&#x27;nodes&#x27;</span></span><br><span class="line"></span><br><span class="line">Usage:</span><br><span class="line">  kind [<span class="built_in">command</span>]</span><br><span class="line"></span><br><span class="line">Available Commands:</span><br><span class="line">  build       Build one of [node-image]</span><br><span class="line">  completion  Output shell completion code <span class="keyword">for</span> the specified shell (bash, zsh or fish)</span><br><span class="line">  create      Creates one of [cluster]</span><br><span class="line">  delete      Deletes one of [cluster]</span><br><span class="line">  <span class="built_in">export</span>      Exports one of [kubeconfig, logs]</span><br><span class="line">  get         Gets one of [clusters, nodes, kubeconfig]</span><br><span class="line">  <span class="built_in">help</span>        Help about any <span class="built_in">command</span></span><br><span class="line">  load        Loads images into nodes</span><br><span class="line">  version     Prints the kind CLI version</span><br><span class="line"></span><br><span class="line">Flags:</span><br><span class="line">  -h, --<span class="built_in">help</span>              <span class="built_in">help</span> <span class="keyword">for</span> kind</span><br><span class="line">  -q, --quiet             silence all stderr output</span><br><span class="line">  -v, --verbosity int32   info <span class="built_in">log</span> verbosity, higher value produces more output</span><br><span class="line">      --version           version <span class="keyword">for</span> kind</span><br><span class="line"></span><br><span class="line">Use <span class="string">&quot;kind [command] --help&quot;</span> <span class="keyword">for</span> more information about a <span class="built_in">command</span>.</span><br></pre></td></tr></table></figure><p>创建 cluster</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ kind create cluster</span><br><span class="line">Creating cluster <span class="string">&quot;kind&quot;</span> ...</span><br><span class="line"> ✓ Ensuring node image (kindest/node:v1.32.0) 🖼</span><br><span class="line"> ✓ Preparing nodes 📦</span><br><span class="line"> ✓ Writing configuration 📜</span><br><span class="line"> ✓ Starting control-plane 🕹️</span><br><span class="line"> ✓ Installing CNI 🔌</span><br><span class="line"> ✓ Installing StorageClass 💾</span><br><span class="line">Set kubectl context to <span class="string">&quot;kind-kind&quot;</span></span><br><span class="line">You can now use your cluster with:</span><br><span class="line"></span><br><span class="line">kubectl cluster-info --context kind-kind</span><br><span class="line"></span><br><span class="line">Have a <span class="built_in">nice</span> day! 👋</span><br></pre></td></tr></table></figure><p>这就好了，不用管啥网络插件之类的，也自动配置好了 <code>.kube/config</code> 文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ k get nodes</span><br><span class="line">NAME                 STATUS   ROLES           AGE     VERSION</span><br><span class="line">kind-control-plane   Ready    control-plane   6m43s   v1.32.0</span><br><span class="line"></span><br><span class="line">➜  ~ k create deployment --image nginx:alpine nginx</span><br><span class="line">deployment.apps/nginx created</span><br><span class="line"></span><br><span class="line">➜  ~ k expose deployment nginx --<span class="built_in">type</span> NodePort --port 80</span><br><span class="line">service/nginx exposed</span><br></pre></td></tr></table></figure><p>如果没科学上网或者没有设置国内源，那么有可能拉不下来镜像</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/failed-to-pull-image.png"></p><p>比如大鹅就要设置一下 LAN 接口</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/daed-lan.png"></p><p>镜像就可以拉下来了</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/pull-image-ok.png"></p><p>容器跑起来后，这时你会发现访问根本访问不通</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/failed-to-curl.png"></p><p>为啥呢？因为这个 <code>kind</code> 的意思是 <code>Kubernetes in docker</code>，整个集群都在一个容器里，如果进入容器内，再访问，就可以</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/curl-inside-kind.png"></p><p>并且 kind 里面下载的镜像，一般也是要进入容器内通过 <code>crictl images</code> 查看</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ docker images</span><br><span class="line">REPOSITORY                    TAG       IMAGE ID       CREATED        SIZE</span><br><span class="line">kindest/node                  &lt;none&gt;    2d9b4b74084a   9 days ago     1.05GB</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">root@kind-control-plane:/<span class="comment"># crictl images</span></span><br><span class="line">IMAGE                                           TAG                  IMAGE ID            SIZE</span><br><span class="line">docker.io/kindest/kindnetd                      v20241212-9f82dd49   d300845f67aeb       39MB</span><br><span class="line">docker.io/kindest/local-path-helper             v20241212-8ac705d0   baa0d31514ee5       3.08MB</span><br><span class="line">docker.io/kindest/local-path-provisioner        v20241212-8ac705d0   04b7d0b91e7e5       22.5MB</span><br><span class="line">docker.io/library/nginx                         alpine               91ca84b4f5779       22.8MB</span><br><span class="line">registry.k8s.io/coredns/coredns                 v1.11.3              c69fa2e9cbf5f       18.6MB</span><br><span class="line">registry.k8s.io/etcd                            3.5.16-0             a9e7e6b294baf       57.7MB</span><br><span class="line">registry.k8s.io/kube-apiserver-amd64            v1.32.0              73afaf82c9cc3       98MB</span><br><span class="line">registry.k8s.io/kube-apiserver                  v1.32.0              73afaf82c9cc3       98MB</span><br><span class="line">registry.k8s.io/kube-controller-manager-amd64   v1.32.0              f3548c6ff8a1e       90.8MB</span><br><span class="line">registry.k8s.io/kube-controller-manager         v1.32.0              f3548c6ff8a1e       90.8MB</span><br><span class="line">registry.k8s.io/kube-proxy-amd64                v1.32.0              aa194712e698a       95.3MB</span><br><span class="line">registry.k8s.io/kube-proxy                      v1.32.0              aa194712e698a       95.3MB</span><br><span class="line">registry.k8s.io/kube-scheduler-amd64            v1.32.0              faaacead470c4       70.6MB</span><br><span class="line">registry.k8s.io/kube-scheduler                  v1.32.0              faaacead470c4       70.6MB</span><br><span class="line">registry.k8s.io/pause                           3.10                 873ed75102791       320kB</span><br></pre></td></tr></table></figure><p>那么需要外面访问怎么办，简单的一种方法，用 <code>port-forward</code>，需要绑定 1024 及以上端口，不然有权限问题</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ k port-forward nginx-6b66fbbd46-t89f7 80:80</span><br><span class="line">Unable to listen on port 80: Listeners failed to create with the following errors: [unable to create listener: Error listen tcp4 127.0.0.1:80: <span class="built_in">bind</span>: permission denied unable to create listener: Error listen tcp6 [::1]:80: <span class="built_in">bind</span>: permission denied]</span><br><span class="line">error: unable to listen on any of the requested ports: [&#123;80 80&#125;]</span><br><span class="line"></span><br><span class="line">➜  ~ k port-forward nginx-6b66fbbd46-t89f7 1024:80</span><br><span class="line">Forwarding from 127.0.0.1:1024 -&gt; 80</span><br><span class="line">Forwarding from [::1]:1024 -&gt; 80</span><br><span class="line">Handling connection <span class="keyword">for</span> 1024</span><br><span class="line"></span><br><span class="line">➜  ~ curl 127.0.0.1:1024</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;<span class="built_in">head</span>&gt;</span><br><span class="line">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span><br><span class="line">&lt;style&gt;</span><br><span class="line">html &#123; color-scheme: light dark; &#125;</span><br><span class="line">body &#123; width: 35em; margin: 0 auto;</span><br><span class="line">font-family: Tahoma, Verdana, Arial, sans-serif; &#125;</span><br><span class="line">&lt;/style&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</span><br><span class="line">&lt;p&gt;If you see this page, the nginx web server is successfully installed and</span><br><span class="line">working. Further configuration is required.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;For online documentation and support please refer to</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.org/&quot;</span>&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;</span><br><span class="line">Commercial support is available at</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.com/&quot;</span>&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;&lt;em&gt;Thank you <span class="keyword">for</span> using nginx.&lt;/em&gt;&lt;/p&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>正常使用还是没什么问题的，之前写过一个程序用来一键暴露端口：<a href="https://github.com/linweiyuan/goportforwarder">goportforwarder</a>，不过不知道现在还能不能用了</p><p>卸载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kind delete cluster</span><br></pre></td></tr></table></figure><hr><h3 id="Kubeadm"><a href="#Kubeadm" class="headerlink" title="Kubeadm"></a><a href="https://kubernetes.io/docs/reference/setup-tools/kubeadm/">Kubeadm</a></h3><p>先说结论，对新手坑比较多</p><p>首先是传统的基于 <code>docker</code> 的版本</p><p>安装 docker 相关包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S docker</span><br></pre></td></tr></table></figure><p>需要再装一个 docker 和 K8s 之间的一种桥梁 <code>cri-dockerd</code>，注意这个是在 AUR 里的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yay -S cri-dockerd-git</span><br></pre></td></tr></table></figure><p>安装 K8s 相关包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S kubectl kubelet kubeadm</span><br></pre></td></tr></table></figure><p>其中 <code>kubectl</code> 是操作 K8s 的客户端工具，因为本质上就是一个 C&#x2F;S 架构，<code>kubelet</code> 是节点上的核心组件，简单来说负责处理接收的请求，<code>kubeadm</code> 用来初始化 K8s</p><p>设置相关服务开机自启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now docker</span><br><span class="line"></span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now cri-docker</span><br><span class="line"></span><br><span class="line">sudo systemctl <span class="built_in">enable</span> --now kubelet</span><br></pre></td></tr></table></figure><p>到了这一步，最好重启系统，防止各种奇奇怪怪的问题</p><p>初始化 K8s</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ sudo kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock --skip-phases=addon/kube-proxy</span><br><span class="line">I1224 00:46:49.514973    2153 version.go:261] remote version is much newer: v1.32.0; falling back to: stable-1.31</span><br><span class="line">[init] Using Kubernetes version: v1.31.4</span><br><span class="line">[preflight] Running pre-flight checks</span><br><span class="line">[preflight] Pulling images required <span class="keyword">for</span> setting up a Kubernetes cluster</span><br><span class="line">[preflight] This might take a minute or two, depending on the speed of your internet connection</span><br><span class="line">[preflight] You can also perform this action beforehand using <span class="string">&#x27;kubeadm config images pull&#x27;</span></span><br><span class="line">W1224 00:46:50.556067    2153 checks.go:846] detected that the sandbox image <span class="string">&quot;registry.k8s.io/pause:3.9&quot;</span> of the container runtime is inconsistent with that used by kubeadm.It is recommended to use <span class="string">&quot;registry.k8s.io/pause:3.10&quot;</span> as the CRI sandbox image.</span><br><span class="line">[certs] Using certificateDir folder <span class="string">&quot;/etc/kubernetes/pki&quot;</span></span><br><span class="line">[certs] Generating <span class="string">&quot;ca&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;apiserver&quot;</span> certificate and key</span><br><span class="line">[certs] apiserver serving cert is signed <span class="keyword">for</span> DNS names [archlinux kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.31.60]</span><br><span class="line">[certs] Generating <span class="string">&quot;apiserver-kubelet-client&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;front-proxy-ca&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;front-proxy-client&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;etcd/ca&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;etcd/server&quot;</span> certificate and key</span><br><span class="line">[certs] etcd/server serving cert is signed <span class="keyword">for</span> DNS names [archlinux localhost] and IPs [192.168.31.60 127.0.0.1 ::1]</span><br><span class="line">[certs] Generating <span class="string">&quot;etcd/peer&quot;</span> certificate and key</span><br><span class="line">[certs] etcd/peer serving cert is signed <span class="keyword">for</span> DNS names [archlinux localhost] and IPs [192.168.31.60 127.0.0.1 ::1]</span><br><span class="line">[certs] Generating <span class="string">&quot;etcd/healthcheck-client&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;apiserver-etcd-client&quot;</span> certificate and key</span><br><span class="line">[certs] Generating <span class="string">&quot;sa&quot;</span> key and public key</span><br><span class="line">[kubeconfig] Using kubeconfig folder <span class="string">&quot;/etc/kubernetes&quot;</span></span><br><span class="line">[kubeconfig] Writing <span class="string">&quot;admin.conf&quot;</span> kubeconfig file</span><br><span class="line">[kubeconfig] Writing <span class="string">&quot;super-admin.conf&quot;</span> kubeconfig file</span><br><span class="line">[kubeconfig] Writing <span class="string">&quot;kubelet.conf&quot;</span> kubeconfig file</span><br><span class="line">[kubeconfig] Writing <span class="string">&quot;controller-manager.conf&quot;</span> kubeconfig file</span><br><span class="line">[kubeconfig] Writing <span class="string">&quot;scheduler.conf&quot;</span> kubeconfig file</span><br><span class="line">[etcd] Creating static Pod manifest <span class="keyword">for</span> <span class="built_in">local</span> etcd <span class="keyword">in</span> <span class="string">&quot;/etc/kubernetes/manifests&quot;</span></span><br><span class="line">[control-plane] Using manifest folder <span class="string">&quot;/etc/kubernetes/manifests&quot;</span></span><br><span class="line">[control-plane] Creating static Pod manifest <span class="keyword">for</span> <span class="string">&quot;kube-apiserver&quot;</span></span><br><span class="line">[control-plane] Creating static Pod manifest <span class="keyword">for</span> <span class="string">&quot;kube-controller-manager&quot;</span></span><br><span class="line">[control-plane] Creating static Pod manifest <span class="keyword">for</span> <span class="string">&quot;kube-scheduler&quot;</span></span><br><span class="line">[kubelet-start] Writing kubelet environment file with flags to file <span class="string">&quot;/var/lib/kubelet/kubeadm-flags.env&quot;</span></span><br><span class="line">[kubelet-start] Writing kubelet configuration to file <span class="string">&quot;/var/lib/kubelet/config.yaml&quot;</span></span><br><span class="line">[kubelet-start] Starting the kubelet</span><br><span class="line">[wait-control-plane] Waiting <span class="keyword">for</span> the kubelet to boot up the control plane as static Pods from directory <span class="string">&quot;/etc/kubernetes/manifests&quot;</span></span><br><span class="line">[kubelet-check] Waiting <span class="keyword">for</span> a healthy kubelet at http://127.0.0.1:10248/healthz. This can take up to 4m0s</span><br><span class="line">[kubelet-check] The kubelet is healthy after 501.222992ms</span><br><span class="line">[api-check] Waiting <span class="keyword">for</span> a healthy API server. This can take up to 4m0s</span><br><span class="line">[api-check] The API server is healthy after 3.500830861s</span><br><span class="line">[upload-config] Storing the configuration used <span class="keyword">in</span> ConfigMap <span class="string">&quot;kubeadm-config&quot;</span> <span class="keyword">in</span> the <span class="string">&quot;kube-system&quot;</span> Namespace</span><br><span class="line">[kubelet] Creating a ConfigMap <span class="string">&quot;kubelet-config&quot;</span> <span class="keyword">in</span> namespace kube-system with the configuration <span class="keyword">for</span> the kubelets <span class="keyword">in</span> the cluster</span><br><span class="line">[upload-certs] Skipping phase. Please see --upload-certs</span><br><span class="line">[mark-control-plane] Marking the node archlinux as control-plane by adding the labels: [node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers]</span><br><span class="line">[mark-control-plane] Marking the node archlinux as control-plane by adding the taints [node-role.kubernetes.io/control-plane:NoSchedule]</span><br><span class="line">[bootstrap-token] Using token: aop3y1.858jqah2hpknu8yg</span><br><span class="line">[bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles</span><br><span class="line">[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to get nodes</span><br><span class="line">[bootstrap-token] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs <span class="keyword">in</span> order <span class="keyword">for</span> nodes to get long term certificate credentials</span><br><span class="line">[bootstrap-token] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token</span><br><span class="line">[bootstrap-token] Configured RBAC rules to allow certificate rotation <span class="keyword">for</span> all node client certificates <span class="keyword">in</span> the cluster</span><br><span class="line">[bootstrap-token] Creating the <span class="string">&quot;cluster-info&quot;</span> ConfigMap <span class="keyword">in</span> the <span class="string">&quot;kube-public&quot;</span> namespace</span><br><span class="line">[kubelet-finalize] Updating <span class="string">&quot;/etc/kubernetes/kubelet.conf&quot;</span> to point to a rotatable kubelet client certificate and key</span><br><span class="line">[addons] Applied essential addon: CoreDNS</span><br><span class="line"></span><br><span class="line">Your Kubernetes control-plane has initialized successfully!</span><br><span class="line"></span><br><span class="line">To start using your cluster, you need to run the following as a regular user:</span><br><span class="line"></span><br><span class="line">  <span class="built_in">mkdir</span> -p <span class="variable">$HOME</span>/.kube</span><br><span class="line">  sudo <span class="built_in">cp</span> -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line">  sudo <span class="built_in">chown</span> $(<span class="built_in">id</span> -u):$(<span class="built_in">id</span> -g) <span class="variable">$HOME</span>/.kube/config</span><br><span class="line"></span><br><span class="line">Alternatively, <span class="keyword">if</span> you are the root user, you can run:</span><br><span class="line"></span><br><span class="line">  <span class="built_in">export</span> KUBECONFIG=/etc/kubernetes/admin.conf</span><br><span class="line"></span><br><span class="line">You should now deploy a pod network to the cluster.</span><br><span class="line">Run <span class="string">&quot;kubectl apply -f [podnetwork].yaml&quot;</span> with one of the options listed at:</span><br><span class="line">  https://kubernetes.io/docs/concepts/cluster-administration/addons/</span><br><span class="line"></span><br><span class="line">Then you can <span class="built_in">join</span> any number of worker nodes by running the following on each as root:</span><br><span class="line"></span><br><span class="line">kubeadm <span class="built_in">join</span> 192.168.31.60:6443 --token aop3y1.858jqah2hpknu8yg \</span><br><span class="line">--discovery-token-ca-cert-hash sha256:05288f496fa271f180f87d88bfadfb8be13c64be2f4fa9081f464d42de572ab3</span><br></pre></td></tr></table></figure><p>此时如果 <code>kubelet</code> 没有起来，会报错，所以在上面安装好所有软件后，最好重启一下系统确保服务正常启动</p><p>这里特别指定了用 <code>cri-dockerd</code> 方案，因为默认是基于 <code>containerd</code> 的</p><p>也可以看到相关的 docker 镜像</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ docker images</span><br><span class="line">REPOSITORY                                TAG        IMAGE ID       CREATED        SIZE</span><br><span class="line">registry.k8s.io/kube-apiserver            v1.31.4    bdc2eadbf366   11 days ago    94.2MB</span><br><span class="line">registry.k8s.io/kube-controller-manager   v1.31.4    359b9f230732   11 days ago    88.4MB</span><br><span class="line">registry.k8s.io/kube-scheduler            v1.31.4    3a66234066fe   11 days ago    67.4MB</span><br><span class="line">registry.k8s.io/kube-proxy                v1.31.4    ebf80573666f   11 days ago    91.5MB</span><br><span class="line">registry.k8s.io/coredns/coredns           v1.11.3    c69fa2e9cbf5   4 months ago   61.8MB</span><br><span class="line">registry.k8s.io/etcd                      3.5.15-0   2e96e5913fc0   4 months ago   148MB</span><br><span class="line">registry.k8s.io/pause                     3.10       873ed7510279   7 months ago   736kB</span><br><span class="line">registry.k8s.io/pause                     3.9        e6f181688397   2 years ago    744kB</span><br></pre></td></tr></table></figure><p>设置 kube config，按照上面命令跑三条命令即可</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p <span class="variable">$HOME</span>/.kube</span><br><span class="line">sudo <span class="built_in">cp</span> -i /etc/kubernetes/admin.conf <span class="variable">$HOME</span>/.kube/config</span><br><span class="line">sudo <span class="built_in">chown</span> $(<span class="built_in">id</span> -u):$(<span class="built_in">id</span> -g) <span class="variable">$HOME</span>/.kube/config</span><br></pre></td></tr></table></figure><p>如果不设置 kube config，此时如果直接跑 kubectl 命令，会有类似下面的错误</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">The connection to the server localhost:8080 was refused - did you specify the right host or port?</span><br></pre></td></tr></table></figure><p>因为 kubectl 沟通 K8s，需要知道访问哪个地址</p><p>或者权限设置得不对，也是会报错的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error: error loading config file <span class="string">&quot;/home/linweiyuan/.kube/config&quot;</span>: open /home/linweiyuan/.kube/config: permission denied</span><br></pre></td></tr></table></figure><p>配置好后，再执行 kubectl 命令，就可以正常返回数据了</p><p>但此时集群是 <code>NotReady</code> 的，因为没有设置网络插件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ kgno</span><br><span class="line">NAME        STATUS     ROLES           AGE   VERSION</span><br><span class="line">archlinux   NotReady   control-plane   18s   v1.31.3</span><br><span class="line"></span><br><span class="line">➜  ~ kgp -A</span><br><span class="line">NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE</span><br><span class="line">kube-system   coredns-7c65d6cfc9-rnj6q            0/1     Pending   0          3m26s</span><br><span class="line">kube-system   coredns-7c65d6cfc9-v74bc            0/1     Pending   0          3m26s</span><br><span class="line">kube-system   etcd-archlinux                      1/1     Running   21         3m33s</span><br><span class="line">kube-system   kube-apiserver-archlinux            1/1     Running   21         3m34s</span><br><span class="line">kube-system   kube-controller-manager-archlinux   1/1     Running   18         3m33s</span><br><span class="line">kube-system   kube-scheduler-archlinux            1/1     Running   18         3m33s</span><br></pre></td></tr></table></figure><p>有很多网络插件可以用，这里用 wiki 里推荐的，叫 <code>cilium</code>，这个需要在初始化集群时加上 <code>--skip-phases=addon/kube-proxy</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ sudo pacman -S cilium-cli</span><br><span class="line">warning: cilium-cli-0.16.21-1 is up to <span class="built_in">date</span> -- reinstalling</span><br><span class="line">resolving dependencies...</span><br><span class="line">looking <span class="keyword">for</span> conflicting packages...</span><br><span class="line"></span><br><span class="line">Package (1)       Old Version  New Version  Net Change</span><br><span class="line"></span><br><span class="line">extra/cilium-cli  0.16.21-1    0.16.21-1      0.00 MiB</span><br><span class="line"></span><br><span class="line">Total Installed Size:  175.37 MiB</span><br><span class="line">Net Upgrade Size:        0.00 MiB</span><br><span class="line"></span><br><span class="line">:: Proceed with installation? [Y/n]</span><br><span class="line">(1/1) checking keys <span class="keyword">in</span> keyring                                                                                   [--------------------------------------------------------------------] 100%</span><br><span class="line">(1/1) checking package integrity                                                                                 [--------------------------------------------------------------------] 100%</span><br><span class="line">(1/1) loading package files                                                                                      [--------------------------------------------------------------------] 100%</span><br><span class="line">(1/1) checking <span class="keyword">for</span> file conflicts                                                                                [--------------------------------------------------------------------] 100%</span><br><span class="line">:: Processing package changes...</span><br><span class="line">(1/1) reinstalling cilium-cli                                                                                    [--------------------------------------------------------------------] 100%</span><br><span class="line">:: Running post-transaction hooks...</span><br><span class="line">(1/2) Arming ConditionNeedsUpdate...</span><br><span class="line">(2/2) Refreshing py3status arch_updates module...</span><br><span class="line"></span><br><span class="line">➜  ~ cilium-cli status</span><br><span class="line">    /¯¯\</span><br><span class="line"> /¯¯\__/¯¯\    Cilium:             1 errors</span><br><span class="line"> \__/¯¯\__/    Operator:           disabled</span><br><span class="line"> /¯¯\__/¯¯\    Envoy DaemonSet:    disabled (using embedded mode)</span><br><span class="line"> \__/¯¯\__/    Hubble Relay:       disabled</span><br><span class="line">    \__/       ClusterMesh:        disabled</span><br><span class="line"></span><br><span class="line">Containers:            cilium</span><br><span class="line">                       cilium-operator</span><br><span class="line">Cluster Pods:          0/3 managed by Cilium</span><br><span class="line">Helm chart version:</span><br><span class="line">Errors:                cilium    cilium    daemonsets.apps <span class="string">&quot;cilium&quot;</span> not found</span><br><span class="line">status check failed: [daemonsets.apps <span class="string">&quot;cilium&quot;</span> not found, unable to retrieve ConfigMap <span class="string">&quot;cilium-config&quot;</span>: configmaps <span class="string">&quot;cilium-config&quot;</span> not found]</span><br><span class="line"></span><br><span class="line">➜  ~ cilium-cli install</span><br><span class="line">ℹ️  Using Cilium version 1.16.4</span><br><span class="line">🔮 Auto-detected cluster name: kubernetes</span><br><span class="line">🔮 Auto-detected kube-proxy has not been installed</span><br><span class="line">ℹ️  Cilium will fully replace all functionalities of kube-proxy</span><br><span class="line"></span><br><span class="line">➜  ~ cilium-cli status</span><br><span class="line">    /¯¯\</span><br><span class="line"> /¯¯\__/¯¯\    Cilium:             OK</span><br><span class="line"> \__/¯¯\__/    Operator:           OK</span><br><span class="line"> /¯¯\__/¯¯\    Envoy DaemonSet:    OK</span><br><span class="line"> \__/¯¯\__/    Hubble Relay:       disabled</span><br><span class="line">    \__/       ClusterMesh:        disabled</span><br><span class="line"></span><br><span class="line">DaemonSet              cilium             Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">DaemonSet              cilium-envoy       Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">Deployment             cilium-operator    Desired: 1, Ready: 1/1, Available: 1/1</span><br><span class="line">Containers:            cilium             Running: 1</span><br><span class="line">                       cilium-envoy       Running: 1</span><br><span class="line">                       cilium-operator    Running: 1</span><br><span class="line">Cluster Pods:          2/2 managed by Cilium</span><br><span class="line">Helm chart version:    1.16.4</span><br><span class="line">Image versions         cilium             quay.io/cilium/cilium:v1.16.4@sha256:d55ec38938854133e06739b1af237932b9c4dd4e75e9b7b2ca3acc72540a44bf: 1</span><br><span class="line">                       cilium-envoy       quay.io/cilium/cilium-envoy:v1.30.7-1731393961-97edc2815e2c6a174d3d12e71731d54f5d32ea16@sha256:0287b36f70cfbdf54f894160082f4f94d1ee1fb10389f3a95baa6c8e448586ed: 1</span><br><span class="line">                       cilium-operator    quay.io/cilium/operator-generic:v1.16.4@sha256:c55a7cbe19fe0b6b28903a085334edb586a3201add9db56d2122c8485f7a51c5: 1</span><br></pre></td></tr></table></figure><p>新起了几个新 <code>pod</code>，并且状态也是 <code>Ready</code> 了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ kgp -A</span><br><span class="line">NAMESPACE     NAME                                READY   STATUS    RESTARTS   AGE</span><br><span class="line">kube-system   cilium-envoy-qljvg                  1/1     Running   0          68s</span><br><span class="line">kube-system   cilium-fmkdr                        1/1     Running   0          68s</span><br><span class="line">kube-system   cilium-operator-6566687bbb-xnhf6    1/1     Running   0          68s</span><br><span class="line">kube-system   coredns-7c65d6cfc9-89b5h            1/1     Running   0          2m25s</span><br><span class="line">kube-system   coredns-7c65d6cfc9-n95pt            1/1     Running   0          2m25s</span><br><span class="line">kube-system   etcd-archlinux                      1/1     Running   21         2m32s</span><br><span class="line">kube-system   kube-apiserver-archlinux            1/1     Running   21         2m32s</span><br><span class="line">kube-system   kube-controller-manager-archlinux   1/1     Running   18         2m32s</span><br><span class="line">kube-system   kube-scheduler-archlinux            1/1     Running   18         2m32s</span><br><span class="line"></span><br><span class="line">➜  ~ kgno</span><br><span class="line">NAME        STATUS   ROLES           AGE     VERSION</span><br><span class="line">archlinux   Ready    control-plane   6m36s   v1.31.3</span><br></pre></td></tr></table></figure><p>此时只有一个 control-plane 节点，默认是不给部署的，只能下发给 worker 节点，可以手动取消这个限制</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ k taint node archlinux node-role.kubernetes.io/control-plane-</span><br><span class="line">node/archlinux untainted</span><br></pre></td></tr></table></figure><p>后面就可以正常部署了</p><p>但是！！！</p><p>很好这插件，使我的大鹅失败，不知道是不是那个 <code>eBPF</code> 导致的</p><p>导致拉不到镜像来测试，弃坑</p><p>卸载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ cilium-cli uninstall</span><br><span class="line">🔥 Deleting pods <span class="keyword">in</span> cilium-test namespace...</span><br><span class="line">🔥 Deleting cilium-test namespace...</span><br><span class="line">⌛ Uninstalling Cilium</span><br><span class="line"></span><br><span class="line">➜  ~ k drain archlinux --delete-emptydir-data --force --ignore-daemonsets</span><br><span class="line">node/archlinux cordoned</span><br><span class="line">evicting pod kube-system/coredns-7c65d6cfc9-tjql6</span><br><span class="line">evicting pod kube-system/cilium-zwg6k</span><br><span class="line">evicting pod kube-system/coredns-7c65d6cfc9-j5rm2</span><br><span class="line">pod/cilium-zwg6k evicted</span><br><span class="line">pod/coredns-7c65d6cfc9-j5rm2 evicted</span><br><span class="line">pod/coredns-7c65d6cfc9-tjql6 evicted</span><br><span class="line">node/archlinux drained</span><br><span class="line"></span><br><span class="line">➜  ~ sudo kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock</span><br><span class="line">[reset] Reading configuration from the cluster...</span><br><span class="line">[reset] FYI: You can look at this config file with <span class="string">&#x27;kubectl -n kube-system get cm kubeadm-config -o yaml&#x27;</span></span><br><span class="line">W1224 00:58:29.972845    6572 configset.go:78] Warning: No kubeproxy.config.k8s.io/v1alpha1 config is loaded. Continuing without it: configmaps <span class="string">&quot;kube-proxy&quot;</span> not found</span><br><span class="line">W1224 00:58:30.019313    6572 preflight.go:56] [reset] WARNING: Changes made to this host by <span class="string">&#x27;kubeadm init&#x27;</span> or <span class="string">&#x27;kubeadm join&#x27;</span> will be reverted.</span><br><span class="line">[reset] Are you sure you want to proceed? [y/N]: y</span><br><span class="line">[preflight] Running pre-flight checks</span><br><span class="line">[reset] Deleted contents of the etcd data directory: /var/lib/etcd</span><br><span class="line">[reset] Stopping the kubelet service</span><br><span class="line">[reset] Unmounting mounted directories <span class="keyword">in</span> <span class="string">&quot;/var/lib/kubelet&quot;</span></span><br><span class="line">[reset] Deleting contents of directories: [/etc/kubernetes/manifests /var/lib/kubelet /etc/kubernetes/pki]</span><br><span class="line">[reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/super-admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]</span><br><span class="line"></span><br><span class="line">The reset process does not clean CNI configuration. To <span class="keyword">do</span> so, you must remove /etc/cni/net.d</span><br><span class="line"></span><br><span class="line">The reset process does not reset or clean up iptables rules or IPVS tables.</span><br><span class="line">If you wish to reset iptables, you must <span class="keyword">do</span> so manually by using the <span class="string">&quot;iptables&quot;</span> <span class="built_in">command</span>.</span><br><span class="line"></span><br><span class="line">If your cluster was setup to utilize IPVS, run ipvsadm --clear (or similar)</span><br><span class="line">to reset your system<span class="string">&#x27;s IPVS tables.</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string">The reset process does not clean your kubeconfig files and you must remove them manually.</span></span><br><span class="line"><span class="string">Please, check the contents of the $HOME/.kube/config file.</span></span><br></pre></td></tr></table></figure><hr><p>下面还有直接基于 containerd 的版本，这种方案下，docker 和相关的包就不需要再安装了</p><p>安装 <code>containerd</code>，如果安装了 <code>docker</code>，自动会包含了这个包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S containerd</span><br></pre></td></tr></table></figure><p>设置开机自启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now containerd</span><br></pre></td></tr></table></figure><p>初始化 K8s（不加 <code>--cri-socket</code> 默认就是这种方案）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo kubeadm init --skip-phases=addon/kube-proxy</span><br></pre></td></tr></table></figure><p>后面就都差不多了</p><hr><h3 id="Docker-Desktop"><a href="#Docker-Desktop" class="headerlink" title="Docker Desktop"></a><a href="https://docs.docker.com/desktop/setup/install/linux/">Docker Desktop</a></h3><p>结论：图形化界面，比较容易上手，但是这个包是在 aur 里的</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">y -S docker-desktop</span><br></pre></td></tr></table></figure><p>直接点点点就完事了</p><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/docker-desktop-k8s.png"></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ kgno</span><br><span class="line">NAME             STATUS   ROLES           AGE   VERSION</span><br><span class="line">docker-desktop   Ready    control-plane   49s   v1.30.5</span><br><span class="line"></span><br><span class="line">➜  ~ kgp -A</span><br><span class="line">NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE</span><br><span class="line">kube-system   coredns-55cb58b774-lqj84                 1/1     Running   0          43s</span><br><span class="line">kube-system   coredns-55cb58b774-pgnz2                 1/1     Running   0          43s</span><br><span class="line">kube-system   etcd-docker-desktop                      1/1     Running   11         41s</span><br><span class="line">kube-system   kube-apiserver-docker-desktop            1/1     Running   11         41s</span><br><span class="line">kube-system   kube-controller-manager-docker-desktop   1/1     Running   11         44s</span><br><span class="line">kube-system   kube-proxy-d5t8n                         1/1     Running   0          44s</span><br><span class="line">kube-system   kube-scheduler-docker-desktop            1/1     Running   11         40s</span><br><span class="line">kube-system   storage-provisioner                      1/1     Running   0          41s</span><br><span class="line">kube-system   vpnkit-controller                        1/1     Running   0          41s</span><br></pre></td></tr></table></figure><p>后续就可以正常使用了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ k create deployment --image nginx:alpine nginx</span><br><span class="line">deployment.apps/nginx created</span><br><span class="line"></span><br><span class="line">➜  ~ kgp</span><br><span class="line">NAME                     READY   STATUS    RESTARTS   AGE</span><br><span class="line">nginx-6f564d4fd9-5b9vh   1/1     Running   0          3s</span><br><span class="line"></span><br><span class="line">➜  ~ kgs</span><br><span class="line">NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE</span><br><span class="line">kubernetes   ClusterIP   10.96.0.1    &lt;none&gt;        443/TCP   2m6s</span><br><span class="line"></span><br><span class="line">➜  ~ k expose deployment nginx --<span class="built_in">type</span> NodePort --port 80</span><br><span class="line">service/nginx exposed</span><br><span class="line"></span><br><span class="line">➜  ~ kgs</span><br><span class="line">NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE</span><br><span class="line">kubernetes   ClusterIP   10.96.0.1       &lt;none&gt;        443/TCP        2m22s</span><br><span class="line">nginx        NodePort    10.98.146.118   &lt;none&gt;        80:31343/TCP   7s</span><br><span class="line"></span><br><span class="line">➜  ~ curl 127.0.0.1:31343</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;<span class="built_in">head</span>&gt;</span><br><span class="line">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span><br><span class="line">&lt;style&gt;</span><br><span class="line">html &#123; color-scheme: light dark; &#125;</span><br><span class="line">body &#123; width: 35em; margin: 0 auto;</span><br><span class="line">font-family: Tahoma, Verdana, Arial, sans-serif; &#125;</span><br><span class="line">&lt;/style&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</span><br><span class="line">&lt;p&gt;If you see this page, the nginx web server is successfully installed and</span><br><span class="line">working. Further configuration is required.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;For online documentation and support please refer to</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.org/&quot;</span>&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;</span><br><span class="line">Commercial support is available at</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.com/&quot;</span>&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;&lt;em&gt;Thank you <span class="keyword">for</span> using nginx.&lt;/em&gt;&lt;/p&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>对新手极其友好，很推荐，不用端口映射来映射去</p><p>卸载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -Rs docker-desktop</span><br></pre></td></tr></table></figure><hr><h3 id="Minikube"><a href="#Minikube" class="headerlink" title="Minikube"></a><a href="https://kubernetes.io/docs/tutorials/hello-minikube/">Minikube</a></h3><p>安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S minikube</span><br></pre></td></tr></table></figure><p>这个也比较简单</p><p>创建集群支持很多 <code>Driver</code>，比如</p><ul><li><code>virtualbox</code></li><li><code>kvm2</code></li><li><code>qemu2</code></li><li><code>qemu</code></li><li><code>vmware</code></li><li><code>none</code></li><li><code>docker</code></li><li><code>podman</code></li><li><code>ssh</code></li></ul><p>这里选择 <code>docker</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ minikube -d docker start</span><br><span class="line">😄  minikube v1.34.0 on Arch</span><br><span class="line">✨  Using the docker driver based on user configuration</span><br><span class="line">📌  Using Docker driver with root privileges</span><br><span class="line">👍  Starting <span class="string">&quot;minikube&quot;</span> primary control-plane node <span class="keyword">in</span> <span class="string">&quot;minikube&quot;</span> cluster</span><br><span class="line">🚜  Pulling base image v0.0.45 ...</span><br><span class="line">🔥  Creating docker container (CPUs=2, Memory=16000MB) ...</span><br><span class="line">🐳  Preparing Kubernetes v1.31.0 on Docker 27.2.0 ...</span><br><span class="line">    ▪ Generating certificates and keys ...</span><br><span class="line">    ▪ Booting up control plane ...</span><br><span class="line">    ▪ Configuring RBAC rules ...</span><br><span class="line">🔗  Configuring bridge CNI (Container Networking Interface) ...</span><br><span class="line">🔎  Verifying Kubernetes components...</span><br><span class="line">    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5</span><br><span class="line">🌟  Enabled addons: storage-provisioner, default-storageclass</span><br><span class="line">🏄  Done! kubectl is now configured to use <span class="string">&quot;minikube&quot;</span> cluster and <span class="string">&quot;default&quot;</span> namespace by default</span><br><span class="line"></span><br><span class="line">➜  ~ kgno</span><br><span class="line">NAME       STATUS   ROLES           AGE     VERSION</span><br><span class="line">minikube   Ready    control-plane   2m50s   v1.31.0</span><br><span class="line"></span><br><span class="line">➜  ~ kgp -A</span><br><span class="line">NAMESPACE     NAME                               READY   STATUS    RESTARTS        AGE</span><br><span class="line">kube-system   coredns-6f6b679f8f-sdnh6           1/1     Running   0               2m44s</span><br><span class="line">kube-system   etcd-minikube                      1/1     Running   0               2m50s</span><br><span class="line">kube-system   kube-apiserver-minikube            1/1     Running   0               2m50s</span><br><span class="line">kube-system   kube-controller-manager-minikube   1/1     Running   0               2m50s</span><br><span class="line">kube-system   kube-proxy-n5pjz                   1/1     Running   0               2m45s</span><br><span class="line">kube-system   kube-scheduler-minikube            1/1     Running   0               2m50s</span><br><span class="line">kube-system   storage-provisioner                1/1     Running   1 (2m45s ago)   2m49s</span><br></pre></td></tr></table></figure><p>就完事了</p><p>还自带一堆附加组件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ minikube addons list</span><br><span class="line">|-----------------------------|----------|--------------|--------------------------------|</span><br><span class="line">|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |</span><br><span class="line">|-----------------------------|----------|--------------|--------------------------------|</span><br><span class="line">| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |</span><br><span class="line">| auto-pause                  | minikube | disabled     | minikube                       |</span><br><span class="line">| cloud-spanner               | minikube | disabled     | Google                         |</span><br><span class="line">| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |</span><br><span class="line">| dashboard                   | minikube | disabled     | Kubernetes                     |</span><br><span class="line">| default-storageclass        | minikube | enabled ✅   | Kubernetes                     |</span><br><span class="line">| efk                         | minikube | disabled     | 3rd party (Elastic)            |</span><br><span class="line">| freshpod                    | minikube | disabled     | Google                         |</span><br><span class="line">| gcp-auth                    | minikube | disabled     | Google                         |</span><br><span class="line">| gvisor                      | minikube | disabled     | minikube                       |</span><br><span class="line">| headlamp                    | minikube | disabled     | 3rd party (kinvolk.io)         |</span><br><span class="line">| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |</span><br><span class="line">| inaccel                     | minikube | disabled     | 3rd party (InAccel             |</span><br><span class="line">|                             |          |              | [info@inaccel.com])            |</span><br><span class="line">| ingress                     | minikube | disabled     | Kubernetes                     |</span><br><span class="line">| ingress-dns                 | minikube | disabled     | minikube                       |</span><br><span class="line">| inspektor-gadget            | minikube | disabled     | 3rd party                      |</span><br><span class="line">|                             |          |              | (inspektor-gadget.io)          |</span><br><span class="line">| istio                       | minikube | disabled     | 3rd party (Istio)              |</span><br><span class="line">| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |</span><br><span class="line">| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |</span><br><span class="line">| kubeflow                    | minikube | disabled     | 3rd party                      |</span><br><span class="line">| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |</span><br><span class="line">| logviewer                   | minikube | disabled     | 3rd party (unknown)            |</span><br><span class="line">| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |</span><br><span class="line">| metrics-server              | minikube | disabled     | Kubernetes                     |</span><br><span class="line">| nvidia-device-plugin        | minikube | disabled     | 3rd party (NVIDIA)             |</span><br><span class="line">| nvidia-driver-installer     | minikube | disabled     | 3rd party (NVIDIA)             |</span><br><span class="line">| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (NVIDIA)             |</span><br><span class="line">| olm                         | minikube | disabled     | 3rd party (Operator Framework) |</span><br><span class="line">| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |</span><br><span class="line">| portainer                   | minikube | disabled     | 3rd party (Portainer.io)       |</span><br><span class="line">| registry                    | minikube | disabled     | minikube                       |</span><br><span class="line">| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |</span><br><span class="line">| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |</span><br><span class="line">| storage-provisioner         | minikube | enabled ✅   | minikube                       |</span><br><span class="line">| storage-provisioner-gluster | minikube | disabled     | 3rd party (Gluster)            |</span><br><span class="line">| storage-provisioner-rancher | minikube | disabled     | 3rd party (Rancher)            |</span><br><span class="line">| volcano                     | minikube | disabled     | third-party (volcano)          |</span><br><span class="line">| volumesnapshots             | minikube | disabled     | Kubernetes                     |</span><br><span class="line">| yakd                        | minikube | disabled     | 3rd party (marcnuri.com)       |</span><br><span class="line">|-----------------------------|----------|--------------|--------------------------------|</span><br></pre></td></tr></table></figure><p>比如这样，就能自动下载 dashboard 镜像并打开</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ minikube addons <span class="built_in">enable</span> dashboard</span><br><span class="line">💡  dashboard is an addon maintained by Kubernetes. For any concerns contact minikube on GitHub.</span><br><span class="line">You can view the list of minikube maintainers at: https://github.com/kubernetes/minikube/blob/master/OWNERS</span><br><span class="line">    ▪ Using image docker.io/kubernetesui/dashboard:v2.7.0</span><br><span class="line">    ▪ Using image docker.io/kubernetesui/metrics-scraper:v1.0.8</span><br><span class="line">💡  Some dashboard features require the metrics-server addon. To <span class="built_in">enable</span> all features please run:</span><br><span class="line"></span><br><span class="line">minikube addons <span class="built_in">enable</span> metrics-server</span><br><span class="line"></span><br><span class="line">🌟  The <span class="string">&#x27;dashboard&#x27;</span> addon is enabled</span><br><span class="line"></span><br><span class="line">➜  ~ kgp -A</span><br><span class="line">NAMESPACE              NAME                                        READY   STATUS    RESTARTS        AGE</span><br><span class="line">kube-system            coredns-6f6b679f8f-sdnh6                    1/1     Running   0               7m47s</span><br><span class="line">kube-system            etcd-minikube                               1/1     Running   0               7m53s</span><br><span class="line">kube-system            kube-apiserver-minikube                     1/1     Running   0               7m53s</span><br><span class="line">kube-system            kube-controller-manager-minikube            1/1     Running   0               7m53s</span><br><span class="line">kube-system            kube-proxy-n5pjz                            1/1     Running   0               7m48s</span><br><span class="line">kube-system            kube-scheduler-minikube                     1/1     Running   0               7m53s</span><br><span class="line">kube-system            storage-provisioner                         1/1     Running   1 (7m48s ago)   7m52s</span><br><span class="line">kubernetes-dashboard   dashboard-metrics-scraper-c5db448b4-mhbxr   1/1     Running   0               3m49s</span><br><span class="line">kubernetes-dashboard   kubernetes-dashboard-695b96c756-d86w9       1/1     Running   0               3m49s</span><br><span class="line"></span><br><span class="line">➜  ~ minikube dashboard</span><br><span class="line">🤔  Verifying dashboard health ...</span><br><span class="line">🚀  Launching proxy ...</span><br><span class="line">🤔  Verifying proxy health ...</span><br><span class="line">🎉  Opening http://127.0.0.1:44639/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ <span class="keyword">in</span> your default browser...</span><br><span class="line">Opening <span class="keyword">in</span> existing browser session.</span><br></pre></td></tr></table></figure><p><img src="/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF/minikube-dashboard.png"></p><p>服务也是不能直接访问本地的，而是要进入 minikube 里面，或者用 <code>minikube service list</code> 里的链接才可以访问</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ k create deployment --image nginx:alpine nginx</span><br><span class="line">deployment.apps/nginx created</span><br><span class="line"></span><br><span class="line">➜  ~ k expose deployment nginx --<span class="built_in">type</span> NodePort --port 80</span><br><span class="line">service/nginx exposed</span><br><span class="line"></span><br><span class="line">➜  ~ kgs</span><br><span class="line">NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE</span><br><span class="line">kubernetes   ClusterIP   10.96.0.1      &lt;none&gt;        443/TCP        8m33s</span><br><span class="line">nginx        NodePort    10.103.106.5   &lt;none&gt;        80:30978/TCP   2s</span><br><span class="line"></span><br><span class="line">➜  ~ curl 127.0.0.1:30978</span><br><span class="line">curl: (7) Failed to connect to 127.0.0.1 port 30978 after 0 ms: Could not connect to server</span><br><span class="line"></span><br><span class="line">➜  ~ minikube ssh</span><br><span class="line">docker@minikube:~$ curl 127.0.0.1:30978</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;<span class="built_in">head</span>&gt;</span><br><span class="line">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span><br><span class="line">&lt;style&gt;</span><br><span class="line">html &#123; color-scheme: light dark; &#125;</span><br><span class="line">body &#123; width: 35em; margin: 0 auto;</span><br><span class="line">font-family: Tahoma, Verdana, Arial, sans-serif; &#125;</span><br><span class="line">&lt;/style&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</span><br><span class="line">&lt;p&gt;If you see this page, the nginx web server is successfully installed and</span><br><span class="line">working. Further configuration is required.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;For online documentation and support please refer to</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.org/&quot;</span>&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;</span><br><span class="line">Commercial support is available at</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.com/&quot;</span>&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;&lt;em&gt;Thank you <span class="keyword">for</span> using nginx.&lt;/em&gt;&lt;/p&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line">docker@minikube:~$</span><br><span class="line"></span><br><span class="line">➜  ~ minikube service list</span><br><span class="line">|----------------------|---------------------------|--------------|---------------------------|</span><br><span class="line">|      NAMESPACE       |           NAME            | TARGET PORT  |            URL            |</span><br><span class="line">|----------------------|---------------------------|--------------|---------------------------|</span><br><span class="line">| default              | kubernetes                | No node port |                           |</span><br><span class="line">| default              | nginx                     |           80 | http://192.168.49.2:30978 |</span><br><span class="line">| kube-system          | kube-dns                  | No node port |                           |</span><br><span class="line">| kubernetes-dashboard | dashboard-metrics-scraper | No node port |                           |</span><br><span class="line">| kubernetes-dashboard | kubernetes-dashboard      | No node port |                           |</span><br><span class="line">|----------------------|---------------------------|--------------|---------------------------|</span><br><span class="line"></span><br><span class="line">➜  ~ curl http://192.168.49.2:30978</span><br><span class="line">&lt;!DOCTYPE html&gt;</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;<span class="built_in">head</span>&gt;</span><br><span class="line">&lt;title&gt;Welcome to nginx!&lt;/title&gt;</span><br><span class="line">&lt;style&gt;</span><br><span class="line">html &#123; color-scheme: light dark; &#125;</span><br><span class="line">body &#123; width: 35em; margin: 0 auto;</span><br><span class="line">font-family: Tahoma, Verdana, Arial, sans-serif; &#125;</span><br><span class="line">&lt;/style&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body&gt;</span><br><span class="line">&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;</span><br><span class="line">&lt;p&gt;If you see this page, the nginx web server is successfully installed and</span><br><span class="line">working. Further configuration is required.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;For online documentation and support please refer to</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.org/&quot;</span>&gt;nginx.org&lt;/a&gt;.&lt;br/&gt;</span><br><span class="line">Commercial support is available at</span><br><span class="line">&lt;a href=<span class="string">&quot;http://nginx.com/&quot;</span>&gt;nginx.com&lt;/a&gt;.&lt;/p&gt;</span><br><span class="line"></span><br><span class="line">&lt;p&gt;&lt;em&gt;Thank you <span class="keyword">for</span> using nginx.&lt;/em&gt;&lt;/p&gt;</span><br><span class="line">&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br></pre></td></tr></table></figure><p>此外还有很多实用的开箱即用的命令，个人也是比较推荐</p><p>卸载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ minikube delete</span><br><span class="line">🔥  Deleting <span class="string">&quot;minikube&quot;</span> <span class="keyword">in</span> docker ...</span><br><span class="line">🔥  Deleting container <span class="string">&quot;minikube&quot;</span> ...</span><br><span class="line">🔥  Removing /home/linweiyuan/.minikube/machines/minikube ...</span><br><span class="line">💀  Removed all traces of the <span class="string">&quot;minikube&quot;</span> cluster.</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF.html</id>
    <link href="https://linweiyuan.github.io/2024/12/22/Arch-Linux-%E5%AE%89%E8%A3%85-Kubernetes-%E7%9A%84%E5%87%A0%E7%A7%8D%E5%A7%BF%E5%8A%BF.html"/>
    <published>2024-12-22T08:05:46.000Z</published>
    <summary>
      <![CDATA[<p>得益于优秀的 <code>pacman</code>，和强大的 <code>AUR</code>，安装起来是比较简单的（当然这里特指本地单机部署测试）</p>
<h3 id="（可选）提高效率"><a href="#（可选）提高效率" class="headerlink"]]>
    </summary>
    <title>Arch Linux 安装 Kubernetes 的几种姿势</title>
    <updated>2026-05-09T01:45:34.342Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="picom" scheme="https://linweiyuan.github.io/tags/picom/"/>
    <content>
      <![CDATA[<ol><li>日常滚，发现终端透明无了，疑似滚挂</li><li>查看系统升级日志 <code>/var/log/pacman.log</code>，发现确实是相关的组件升级了个大版本 <code>[2024-10-06T22:22:37+0800] [ALPM] upgraded picom (11.2-1 -&gt; 12.1-3)</code></li><li>上 <a href="https://wiki.archlinux.org/title/Picom">wiki</a> 看下最新的用法</li><li>设置背景运行和取消动画，解决</li></ol><p>原配置：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exec</span> --no-startup-id picom -CGb --config /dev/null</span><br></pre></td></tr></table></figure><p>新配置：</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exec</span> --no-startup-id picom -b --fade-in-step=1 --fade-out-step=1 --fade-delta=0</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/10/06/Arch-Linux-%E5%8D%87%E7%BA%A7-picom-%E9%BB%91%E5%B1%8F%E8%A7%A3%E5%86%B3.html</id>
    <link href="https://linweiyuan.github.io/2024/10/06/Arch-Linux-%E5%8D%87%E7%BA%A7-picom-%E9%BB%91%E5%B1%8F%E8%A7%A3%E5%86%B3.html"/>
    <published>2024-10-06T15:34:54.000Z</published>
    <summary>
      <![CDATA[<ol>
<li>日常滚，发现终端透明无了，疑似滚挂</li>
<li>查看系统升级日志 <code>/var/log/pacman.log</code>，发现确实是相关的组件升级了个大版本 <code>[2024-10-06T22:22:37+0800] [ALPM] upgr]]>
    </summary>
    <title>Arch Linux 升级 picom 黑屏解决</title>
    <updated>2026-05-09T01:45:34.341Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="IDEA" scheme="https://linweiyuan.github.io/tags/IDEA/"/>
    <content>
      <![CDATA[<p>前两天滚一下，发现滚挂了，IDEA 社区版升级后打不开了</p><p>报了错</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">Internal error</span><br><span class="line"></span><br><span class="line">ava.lang.RuntimeException: Could not find installation home path. Please make sure bin/idea.properties is present in the installation directory.</span><br><span class="line">    at com.intellij.openapi.application.PathManager.getHomePath(PathManager.java:112)</span><br><span class="line">    at com.intellij.openapi.application.PathManager.getBinDirectories(PathManager.java:145)</span><br><span class="line">    at com.intellij.openapi.application.PathManager.loadProperties(PathManager.java:684)</span><br><span class="line">    at com.intellij.idea.Main.mainImpl(Main.kt:55)</span><br><span class="line">    at com.intellij.idea.Main.main(Main.kt:47)</span><br><span class="line"></span><br><span class="line">-----</span><br><span class="line">JRE: 17.0.12+7 amd64 (Arch Linux)</span><br><span class="line">/usr/lib/jvm/java-17-openjdk</span><br></pre></td></tr></table></figure><p>不应该啊，于是搜了搜，原来是 IntelliJ 自己的锅，Arch 还是很稳的</p><p>官方修复了，并且打包在测试库，还没推送，如果紧急可以先手动装下他们修复后的包：<a href="https://gitlab.archlinux.org/-/project/35994/uploads/fc0a0ca70abd96fefbea71e618a6e502/intellij-idea-community-edition-4_2024.2.0.1-1-x86_64.pkg.tar.zst">intellij-idea-community-edition-4_2024.2.0.1-1-x86_64.pkg.tar.zst</a></p><p>参考链接：</p><ul><li><a href="https://www.reddit.com/r/archlinux/comments/1ewqmwb/intellijideacommunityedition_package_just_broke/?rdt=60517">https://www.reddit.com/r/archlinux/comments/1ewqmwb/intellijideacommunityedition_package_just_broke/?rdt=60517</a></li><li><a href="https://youtrack.jetbrains.com/issue/IJPL-160591/Start-Failed-Please-make-sure-bin-idea.properties-is-present-in-the-installation-directory-after-update-to-2024.2">https://youtrack.jetbrains.com/issue/IJPL-160591/Start-Failed-Please-make-sure-bin-idea.properties-is-present-in-the-installation-directory-after-update-to-2024.2</a></li><li><a href="https://bbs.archlinux.org/viewtopic.php?id=298735">https://bbs.archlinux.org/viewtopic.php?id=298735</a></li><li><a href="https://gitlab.archlinux.org/archlinux/packaging/packages/intellij-idea-community-edition/-/issues/6">https://gitlab.archlinux.org/archlinux/packaging/packages/intellij-idea-community-edition/-/issues/6</a></li><li><a href="https://youtrack.jetbrains.com/issue/IJPL-160565/Improve-error-message-for-Start-Failed-Could-not-find-installation-home-path.-Please-make-sure-bin-idea.properties-is-present-in#focus=Comments-27-10354056.0-0">https://youtrack.jetbrains.com/issue/IJPL-160565/Improve-error-message-for-Start-Failed-Could-not-find-installation-home-path.-Please-make-sure-bin-idea.properties-is-present-in#focus=Comments-27-10354056.0-0</a></li><li><a href="https://gitlab.archlinux.org/archlinux/packaging/packages/intellij-idea-community-edition/-/merge_requests/1">https://gitlab.archlinux.org/archlinux/packaging/packages/intellij-idea-community-edition/-/merge_requests/1</a></li><li><a href="https://github.com/JetBrains/intellij-community/pull/2831">https://github.com/JetBrains/intellij-community/pull/2831</a></li></ul>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/08/23/IDEA-%E7%A4%BE%E5%8C%BA%E7%89%88%E6%BB%9A%E6%8C%82.html</id>
    <link href="https://linweiyuan.github.io/2024/08/23/IDEA-%E7%A4%BE%E5%8C%BA%E7%89%88%E6%BB%9A%E6%8C%82.html"/>
    <published>2024-08-23T06:21:35.000Z</published>
    <summary>
      <![CDATA[<p>前两天滚一下，发现滚挂了，IDEA 社区版升级后打不开了</p>
<p>报了错</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</]]>
    </summary>
    <title>IDEA 社区版滚挂</title>
    <updated>2026-05-09T01:45:34.347Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="AI" scheme="https://linweiyuan.github.io/categories/AI/"/>
    <category term="LLM" scheme="https://linweiyuan.github.io/tags/LLM/"/>
    <category term="ChatGLM" scheme="https://linweiyuan.github.io/tags/ChatGLM/"/>
    <content>
      <![CDATA[<p>今天也是心血来潮，本地搭建了个 <code>Ollama</code> 来玩玩</p><p>系统：Arch Linux 6.10.2<br>NVIDIA 驱动版本：555.58.02</p><ol><li>安装 <code>ollama</code>，这里选择了 <code>cuda</code> 版本，能发挥显卡的力量</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S ollama-cuda</span><br></pre></td></tr></table></figure><ol start="2"><li>启动服务</li></ol><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl <span class="built_in">enable</span> --now ollama.service</span><br></pre></td></tr></table></figure><p>如果需要配置其他服务进行远程连接，比如 docker 部署 <code>open-webui</code>，则需要修改配置文件 <code>ollama.service</code> 加环境变量，加个 <code>OLLAMA_HOST</code>，因为 <code>systemd</code> 不认识系统的环境变量，所以不能修改 <code>/etc/profile</code> 之类的配置，而是要单独修改 <code>systemd</code> 配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl edit ollama.service</span><br></pre></td></tr></table></figure><p>加一段配置在 <code>### Editing</code> 和 <code>### Edits</code> 之间</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[Service]</span><br><span class="line">Environment=&quot;OLLAMA_HOST=0.0.0.0&quot;</span><br></pre></td></tr></table></figure><p>接着两部曲</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl daemon-reload</span><br><span class="line">sudo systemctl restart ollama.service</span><br></pre></td></tr></table></figure><p>最后可以检查一下 <code>sudo systemctl cat ollama.service</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"># /etc/systemd/system/ollama.service</span><br><span class="line">[Unit]</span><br><span class="line">Description=Ollama Service</span><br><span class="line">Wants=network-online.target</span><br><span class="line">After=network.target network-online.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">ExecStart=/usr/bin/ollama serve</span><br><span class="line">WorkingDirectory=/var/lib/ollama</span><br><span class="line">Environment=&quot;HOME=/var/lib/ollama&quot;</span><br><span class="line">User=ollama</span><br><span class="line">Group=ollama</span><br><span class="line">Restart=on-failure</span><br><span class="line">RestartSec=3</span><br><span class="line">Type=simple</span><br><span class="line">PrivateTmp=yes</span><br><span class="line">ProtectSystem=full</span><br><span class="line">ProtectHome=yes</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br><span class="line"></span><br><span class="line"># /etc/systemd/system/ollama.service.d/override.conf</span><br><span class="line">[Service]</span><br><span class="line">Environment=&quot;OLLAMA_HOST=0.0.0.0&quot;</span><br></pre></td></tr></table></figure><p>（这里不建议直接修改原来的配置文件，用 <code>edit</code> 来修改会往同名 <code>service.d</code> 文件夹里加一段配置 <code>override.conf</code> 优先加载，这样不怕改烂了原来的配置，也不会出现 <code>.pacmew</code> 这种问题）</p><ol start="3"><li>跑模型</li></ol><p>比如跑个通义千问</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ ollama run qwen2</span><br><span class="line">&gt;&gt;&gt; 你是谁</span><br><span class="line">我是阿里云开发的一款超大规模语言模型，我叫通义千问。作为一个AI助手，我的目标是帮助用户获得准确、有用的信息，解决他们的问题和困惑。我会不断学习和进步，不</span><br><span class="line">断提升自己的能力，为用户提供更好的服务。如果您有任何问题或需要帮助，请随时告诉我，我会尽力提供支持。</span><br><span class="line"></span><br><span class="line">&gt;&gt;&gt; Send a message (/? <span class="keyword">for</span> <span class="built_in">help</span>)</span><br></pre></td></tr></table></figure><ol start="4"><li>跑个 <code>open-webui</code></li></ol><p><a href="https://aur.archlinux.org/packages/open-webui-git">AUR</a> 仓库里有包，但是编译不过，所以放弃，转 <code>docker</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">open-webui:</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">open-webui</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">linweiyuan/open-webui</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">8080</span><span class="string">:8080</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./data:/app/backend/data</span></span><br><span class="line">    <span class="attr">extra_hosts:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">host.docker.internal:host-gateway</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br></pre></td></tr></table></figure><ol start="5"><li>测试结果</li></ol><p><img src="/2024/08/03/Ollama-%E6%B5%8B%E8%AF%95/ollama.png"></p><ol start="6"><li><code>Spring AI</code> 测试</li></ol><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line">  <span class="attr">ai:</span></span><br><span class="line">    <span class="attr">ollama:</span></span><br><span class="line">      <span class="attr">chat:</span></span><br><span class="line">        <span class="attr">model:</span> <span class="string">qwen2</span></span><br></pre></td></tr></table></figure><p>也正常</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">➜  ~ http :8080/ai/generate message==你是谁</span><br><span class="line">HTTP/1.1 200</span><br><span class="line">Connection: keep-alive</span><br><span class="line">Content-Type: application/json</span><br><span class="line">Date: Sat, 03 Aug 2024 16:00:30 GMT</span><br><span class="line">Keep-Alive: <span class="built_in">timeout</span>=60</span><br><span class="line">Transfer-Encoding: chunked</span><br><span class="line"></span><br><span class="line">&#123;</span><br><span class="line">    <span class="string">&quot;generation&quot;</span>: <span class="string">&quot;我是阿里云开发的一款超大规模语言模型，我叫通义千问。&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h1 id="华丽的分割线"><a href="#华丽的分割线" class="headerlink" title="华丽的分割线"></a>华丽的分割线</h1><p>难绷</p><p><img src="/2024/08/03/Ollama-%E6%B5%8B%E8%AF%95/phi3.jpg"></p>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/08/03/Ollama-%E6%B5%8B%E8%AF%95.html</id>
    <link href="https://linweiyuan.github.io/2024/08/03/Ollama-%E6%B5%8B%E8%AF%95.html"/>
    <published>2024-08-03T15:10:38.000Z</published>
    <summary>
      <![CDATA[<p>今天也是心血来潮，本地搭建了个 <code>Ollama</code> 来玩玩</p>
<p>系统：Arch Linux 6.10.2<br>NVIDIA 驱动版本：555.58.02</p>
<ol>
<li>安装 <code>ollama</code>，这里选择了 <c]]>
    </summary>
    <title>Ollama 测试</title>
    <updated>2026-05-09T01:45:34.350Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="程序设计" scheme="https://linweiyuan.github.io/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    <category term="Rust" scheme="https://linweiyuan.github.io/tags/Rust/"/>
    <content>
      <![CDATA[<p>今天也是来见见世面</p><p>有大学生，有前后端、嵌入式、Web3、自媒体，有大厂技术人员，收获还是挺多的</p><p>也和多年不见的同学见了面</p><p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8/1.jpg"></p><p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8/2.jpg"></p><p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8/3.jpg"></p><p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8/4.jpg"></p><p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8/5.jpg"></p>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8.html</id>
    <link href="https://linweiyuan.github.io/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B8%AA-Rust-%E6%B4%BB%E5%8A%A8.html"/>
    <published>2024-07-20T12:54:42.000Z</published>
    <summary>
      <![CDATA[<p>今天也是来见见世面</p>
<p>有大学生，有前后端、嵌入式、Web3、自媒体，有大厂技术人员，收获还是挺多的</p>
<p>也和多年不见的同学见了面</p>
<p><img src="/2024/07/20/%E5%8F%82%E5%8A%A0%E4%B8%80%E4%B]]>
    </summary>
    <title>参加一个 Rust 活动</title>
    <updated>2026-05-09T01:45:34.371Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="虚拟机" scheme="https://linweiyuan.github.io/categories/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    <category term="Windows" scheme="https://linweiyuan.github.io/tags/Windows/"/>
    <category term="KVM" scheme="https://linweiyuan.github.io/tags/KVM/"/>
    <category term="QEMU" scheme="https://linweiyuan.github.io/tags/QEMU/"/>
    <content>
      <![CDATA[<p>之前有配置</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">features</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">kvm</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">hidden</span> <span class="attr">state</span>=<span class="string">&quot;on&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">kvm</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">features</span>&gt;</span></span><br></pre></td></tr></table></figure><p>和</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">cpu</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">feature</span> <span class="attr">policy</span>=<span class="string">&quot;disable&quot;</span> <span class="attr">name</span>=<span class="string">&quot;hypervisor&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">cpu</span>&gt;</span></span><br></pre></td></tr></table></figure><p>一切都是正常的</p><p>但是玩盗贼之海打开提示 “Cannot run under Virtual Machine.”</p><hr><p>上网查了下，加多一个配置可以解决，测试正常</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">os</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">smbios</span> <span class="attr">mode</span>=<span class="string">&quot;host&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">os</span>&gt;</span></span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/05/12/QEMU-KVM-%E7%9B%97%E8%B4%BC%E4%B9%8B%E6%B5%B7%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A3%80%E6%B5%8B%E7%BB%95%E8%BF%87.html</id>
    <link href="https://linweiyuan.github.io/2024/05/12/QEMU-KVM-%E7%9B%97%E8%B4%BC%E4%B9%8B%E6%B5%B7%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%A3%80%E6%B5%8B%E7%BB%95%E8%BF%87.html"/>
    <published>2024-05-12T10:08:28.000Z</published>
    <summary>
      <![CDATA[<p>之前有配置</p>
<figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br>]]>
    </summary>
    <title>QEMU/KVM 盗贼之海虚拟机检测绕过</title>
    <updated>2026-05-09T01:45:34.365Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="程序设计" scheme="https://linweiyuan.github.io/categories/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    <category term="AWS" scheme="https://linweiyuan.github.io/tags/AWS/"/>
    <category term="Athena" scheme="https://linweiyuan.github.io/tags/Athena/"/>
    <category term="Lambda" scheme="https://linweiyuan.github.io/tags/Lambda/"/>
    <category term="API Gateway" scheme="https://linweiyuan.github.io/tags/API-Gateway/"/>
    <content>
      <![CDATA[<p>事情是这样的，几个月前有一个需求：用户在前端页面上输入查询条件调用 API 返回数据</p><p>很经典的简单 CRUD 对不对？我告诉你， 其实有点不同</p><p>因为这个查询除了其他可空条件外，有个必填的两个参数是开始时间和结束时间，而这个时间段，如果是当月（30 天内）的，API 要从数据库里面拿数据返回，而前面月份的则需要从 S3 的文件里拿，有个 Lambda 每天零点会定时执行任务，把数据库里超过 30 天的数据提取出来，生成 CSV 摆到 S3，然后删除数据库的数据</p><p>我们根据这个场景做过多轮压力测试，最终确定了每次从数据库里面拿 3000 是比较理想的，实现代码大概长这样：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">cursor.execute(<span class="string">&#x27;select count xxx&#x27;</span>)</span><br><span class="line">row_count = cursor.rowcount</span><br><span class="line"><span class="keyword">if</span> row_count &gt; <span class="number">0</span>:</span><br><span class="line">    <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">        fetch_rows = cursor.fetchmany(<span class="number">3000</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(fetch_rows) == <span class="number">0</span>:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="keyword">for</span> row <span class="keyword">in</span> fetch_rows:</span><br><span class="line">                <span class="comment"># write csv</span></span><br></pre></td></tr></table></figure><p>这是第一版的代码</p><p>测试过程中发现可能未来的数据量会有点大，并且这个 Athena 收费也不便宜，如果不设置合适的索引，每次都需要查询很多没意义的数据再过滤，相当烧钱</p><p>于是经过对页面几个查询条件和数据库原来的结构进行分析后，设置了 Athena 的索引，这个索引在 Athena 里面叫 <code>partition key</code>，我们选用的是 Hive 风格</p><p>因此在 Bucket 上的 CSV 大概长这样：bucket&#x2F;year&#x3D;2024&#x2F;month&#x3D;01&#x2F;day&#x3D;01&#x2F;a&#x3D;xxx&#x2F;b&#x3D;xxx（这里的 a 和 b 是页面上一些查询条件）</p><p>代码也改为了先按照查询条件 <code>group by</code>，好生成 S3 目录结构，再按照具体的条件去查询对应的数据</p><p>铺垫了这么多，下面开始正文</p><h3 id="第一个坑：数据为什么查不出来？"><a href="#第一个坑：数据为什么查不出来？" class="headerlink" title="第一个坑：数据为什么查不出来？"></a>第一个坑：数据为什么查不出来？</h3><p>相信有过大数据开发经验的同学很快就能看到问题，数据是有了，但是 Athena 并不认识这些数据，还要 “告诉” Athena 从那里拿数据回来</p><p>有两个步骤可以选择，要么 <code>alter table add partition</code>，要么 <code>msck repair table</code>，因为按照我们的设计，这个结构理论上是不会有什么大的变化的，所以我们选择了第二种方式</p><p>执行完 repair 后，会看到输出了一堆 S3 路径，意思就是 Athena 认识这些数据了</p><h3 id="第二个坑：新的数据为什么查不出来？"><a href="#第二个坑：新的数据为什么查不出来？" class="headerlink" title="第二个坑：新的数据为什么查不出来？"></a>第二个坑：新的数据为什么查不出来？</h3><p>好了，每天定时任务都能成功把数据从数据库转移到 Bucket 中，但是为什么只能查到老的数据？</p><p>想象一下数据库新增数据的时候，索引是不是也会发生变化，原来这个 Athena 也是如此，不过，这个重建索引的过程需要人为介入</p><p>考虑到我们的数据是每天零点同步过去的，而要重建索引后，新的数据才能被查到，所以给这个 Lambda 在同步完数据后再跑个 repair 语句，解决问题</p><p>项目开始上线并稳定运行了一段时间</p><hr><p>上半部分结束，下半部分开始</p><p>新的需求过来了，和上面差不多，不过不是查数据显示，而是将查到的数据导出 CSV 然后下载下来</p><p>在这里需要先说明一下网络结构</p><p>有两个 AWS 账号，API 在账号 A，这个账号只有 EKS 服务，那些什么数据库、Lambda、Bucket、API Gateway 等等乱七八糟的全在另一个账号 B，API 通过 assume 账号 B 的 role 的方式来用账号 B 的服务</p><p>麻烦的方式不但在这里，还在明明在账号 B 创建好 role，赋予 S3 的增删改查和 Lambda 的执行权限，API 能够直接通过 assume role 来执行 Lambda 的情况下，API 还要通过私有 VPCE 来访问账号 B 的 API Gateway，API Gateway 再绑定 Lambda，这样蛋疼的方式来访问</p><p>问就是安全</p><p>人在江湖身不由己，也只好遵守他的游戏规则</p><p>在这个前提下，数据库那一部分很好处理，在 Athena 这里又出了幺蛾子</p><h3 id="第三个坑：数据太大-Lambda-超时"><a href="#第三个坑：数据太大-Lambda-超时" class="headerlink" title="第三个坑：数据太大 Lambda 超时"></a>第三个坑：数据太大 Lambda 超时</h3><p>用户点击下载 CSV，请求会这样走：API -&gt; AWS API Gateway -&gt; AWS Lambda -&gt; AWS Athena &#x2F; AWS RDS -&gt; AWS S3</p><p>而 Lambda 默认是同步执行的，如果数据量太大，那么如果用户点击下载后一直在转，显然不现实，于是我们将 Lambda 改成异步执行</p><p>Lambda 在 General 那里最大限额可以配置 15 分钟超时，10G 内存，10G 硬盘，而在 Async 相关的设置里，则可以设置为最长跑 6 个小时并且最多 2 次失败重试（自动）</p><p>既然写得这么明白，那么我们的数据也没这么大，不用跑几个小时，配置肯定是够用的，但是保险起见，先 sleep 个 16 分钟验证下？</p><p>不出意外的话，意外发生了</p><p>经过测试，虽然这个异步设置最长可以设置 6 小时，但是其实无论同步还是异步，Lambda 最长还是只能执行 15 分钟，这个 6 小时只是 Lambda 执行失败后会放在队列里的最长等待时间</p><p>就是说，就算用异步的方式执行耗时任务，在 15 分钟内没跑完，没关系，重试，还没跑完，也没关系，再重试，但在我们这个需求就不适用，因为是从头开始重试的，该拿不回来数据还是拿不回来</p><p>文档写得又乱，版本 V1、V2 又混着来，反正我是很蛋疼</p><p>15 分钟也行吧，Athena 查询东西本来就比较快，查询数据库都能 2-3 分钟跑完，Athena 不见得要超过这个时间吧？</p><p>现实又啪啪打脸</p><p>由于有之前上线生产环境的经验，那么我们从 Athena 里导出数据生成 CSV 下载，肯定还是沿用之前的老路：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">athena.start_query_execution()</span><br><span class="line">athena.get_query_execution()</span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    query_execution_status == <span class="string">&#x27;SUCCEED&#x27;</span>:</span><br><span class="line">        <span class="keyword">break</span></span><br><span class="line">athena.get_query_results()</span><br></pre></td></tr></table></figure><p>问题来了，Athena 查询快是快，但是每次只能从中最多拿 1000 条数据回来，同时会返回一个叫 <code>NextToken</code> 这样的东西，后续请求需要带上它，才能获取后面的数据</p><p>那这就有问题了</p><p>经过测试，每次拿回来 1000 条数据大概花费 2-3 秒左右，那么 15 分钟极限最多拿不到 30W 条数据，一天的数据量远远超过这个</p><p>正当一筹莫展准备限定页面搜索条件，缩小总数据集，或者分拆成多个子任务再合并 CSV 时，猛然想到，其实 Athena 查询的时候往往需要指定一个结果输出路径，无论在 AWS Console 还是 boto3，并且是必填的，这个路径其实就是保存了本次查询的数据集和元数据</p><p>艹，怎么之前看漏了眼</p><p>结果就很美丽了，100W 数据查询才 10 秒，并且 CSV 都生成好了，只需移动下位置即可</p><h3 id="第四个坑：API-通过-API-Gateway-调用-Lambda-不是异步的"><a href="#第四个坑：API-通过-API-Gateway-调用-Lambda-不是异步的" class="headerlink" title="第四个坑：API 通过 API Gateway 调用 Lambda 不是异步的"></a>第四个坑：API 通过 API Gateway 调用 Lambda 不是异步的</h3><p>前面说过，不能让用户点击下载后在干等，所以需要异步执行这个 Lambda</p><p>好了，参考文档 <a href="https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-integration-async.html">Set up asynchronous invocation of the backend Lambda function</a> 进行设置，在 Lambda 里简单 <code>time.sleep(33)</code> 看看，因为 API 调用 API Gateway 超过 10 秒就要报错了，而 API Gateway 调用 Lambda 超过 30 秒也会报错，所以这样能试到两种情况</p><p>在没设置 <code>X-Amz-Invocation-Type</code> 请求头前，在 AWS Console 上面测试 API Gateway 调用 Lambda 是超时的，而设置了这个请求头后，正常了，但是 API 通过 API Gateway 来调用 Lambda，还是超时</p><p>这又是什么破玩意？</p><p>百思不得其解</p><p>Header 传得不对吗？</p><p>Lambda 没有设置好吗？</p><p>链接用错了吗？</p><p>有鬼</p><p>最后发现其实是忘记了重新部署 API Gateway</p><p>虽然是我们自己的锅，但是没有重新部署却在 AWS Console 上面测试也能通过，就很误导人</p><h3 id="第五个坑：无法利用自定义域名来生成-presignedUrl"><a href="#第五个坑：无法利用自定义域名来生成-presignedUrl" class="headerlink" title="第五个坑：无法利用自定义域名来生成 presignedUrl"></a>第五个坑：无法利用自定义域名来生成 presignedUrl</h3><p>下载 CSV 这个动作，考虑到 API 性能问题，没有将数据再经过 API 一遍流式返回前端徒增功耗，而是直接生成 presignedUrl，前端直接调用这个链接下载文件就完事了</p><p>这个链接，包含了 AWS 账号信息和 Bucket 信息，想将其隐藏掉，于是考虑到了利用自定义域名的方式来完成</p><p>最后配置好了路由，生成 presignedUrl，替换自定义域名，等等都完成后，通过新链接来访问文件，却说签名不匹配</p><p>也尝试过在代码里重写 endpointUrl 或者修改参与计算签名的 Host 字段，让它和我们的自定义域名一样，结果还是不行</p><p>查阅了相关文章，似乎也说，这其实就是 S3 的规范</p><p>感觉是没直接方法实现的，有的话，麻烦告知一下我</p><p>或者我们可以通过在 API 里映射的方式来实现？新增接口来专门处理这个，暴露 API 信息，但是可以有效隐藏掉 AWS 相关信息，这就是后话了</p><hr><h3 id="TBC"><a href="#TBC" class="headerlink" title="TBC"></a>TBC</h3>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/05/02/%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8-AWS-%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%BF%83%E8%B7%AF%E5%8E%86%E7%A8%8B.html</id>
    <link href="https://linweiyuan.github.io/2024/05/02/%E4%B8%80%E6%AC%A1%E4%BD%BF%E7%94%A8-AWS-%E6%9C%8D%E5%8A%A1%E7%9A%84%E5%BF%83%E8%B7%AF%E5%8E%86%E7%A8%8B.html"/>
    <published>2024-05-02T14:49:35.000Z</published>
    <summary>
      <![CDATA[<p>事情是这样的，几个月前有一个需求：用户在前端页面上输入查询条件调用 API 返回数据</p>
<p>很经典的简单 CRUD 对不对？我告诉你， 其实有点不同</p>
<p>因为这个查询除了其他可空条件外，有个必填的两个参数是开始时间和结束时间，而这个时间段，如果是当月（30]]>
    </summary>
    <title>一次使用 AWS 服务的心路历程</title>
    <updated>2026-05-09T01:45:34.370Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="AI" scheme="https://linweiyuan.github.io/categories/AI/"/>
    <category term="LLM" scheme="https://linweiyuan.github.io/tags/LLM/"/>
    <category term="Stability AI" scheme="https://linweiyuan.github.io/tags/Stability-AI/"/>
    <content>
      <![CDATA[<p>官方简介：<a href="https://stability.ai/news/introducing-stable-code-instruct-3b">https://stability.ai/news/introducing-stable-code-instruct-3b</a></p><p>总的来说，和 <a href="https://linweiyuan.github.io/2023/12/07/ChatGLM2-6B-INT4%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2.html">ChatGLM2-6B-INT4 本地部署</a> 差不多，需要安装 <code>transformers</code> 和 <code>torch</code></p><p>流式输出例子：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> torch</span><br><span class="line"><span class="keyword">from</span> transformers <span class="keyword">import</span> AutoModelForCausalLM, AutoTokenizer, TextStreamer</span><br><span class="line">tokenizer = AutoTokenizer.from_pretrained(<span class="string">&quot;stabilityai/stable-code-instruct-3b&quot;</span>, trust_remote_code=<span class="literal">True</span>)</span><br><span class="line">model = AutoModelForCausalLM.from_pretrained(<span class="string">&quot;stabilityai/stable-code-instruct-3b&quot;</span>, torch_dtype=torch.bfloat16, trust_remote_code=<span class="literal">True</span>)</span><br><span class="line">model.<span class="built_in">eval</span>()</span><br><span class="line">model = model.cuda()</span><br><span class="line"></span><br><span class="line">messages = [</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">&quot;role&quot;</span>: <span class="string">&quot;system&quot;</span>,</span><br><span class="line">        <span class="string">&quot;content&quot;</span>: <span class="string">&quot;You are a helpful and polite assistant&quot;</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="string">&quot;role&quot;</span>: <span class="string">&quot;user&quot;</span>,</span><br><span class="line">        <span class="string">&quot;content&quot;</span>: <span class="string">&quot;show me a demo code to connect to aws lambda using golang&quot;</span></span><br><span class="line">    &#125;,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=<span class="literal">True</span>, tokenize=<span class="literal">False</span>)</span><br><span class="line"></span><br><span class="line">inputs = tokenizer([prompt], return_tensors=<span class="string">&quot;pt&quot;</span>).to(model.device)</span><br><span class="line"></span><br><span class="line">tokens = model.generate(</span><br><span class="line">    **inputs,</span><br><span class="line">    max_new_tokens=<span class="number">1024</span>,</span><br><span class="line">    temperature=<span class="number">0.5</span>,</span><br><span class="line">    top_p=<span class="number">0.95</span>,</span><br><span class="line">    top_k=<span class="number">100</span>,</span><br><span class="line">    do_sample=<span class="literal">True</span>,</span><br><span class="line">    use_cache=<span class="literal">True</span>,</span><br><span class="line">    pad_token_id=tokenizer.eos_token_id,</span><br><span class="line">    streamer=TextStreamer(tokenizer=tokenizer, skip_prompt=<span class="literal">True</span>)</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">output = tokenizer.batch_decode(tokens[:, inputs.input_ids.shape[-<span class="number">1</span>]:], skip_special_tokens=<span class="literal">False</span>)[<span class="number">0</span>]</span><br><span class="line"><span class="built_in">print</span>(output)</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="/2024/03/31/Stable-Code-Instruct-3B-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2/test.jpg"></p>]]>
    </content>
    <id>https://linweiyuan.github.io/2024/03/31/Stable-Code-Instruct-3B-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2.html</id>
    <link href="https://linweiyuan.github.io/2024/03/31/Stable-Code-Instruct-3B-%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2.html"/>
    <published>2024-03-31T12:56:36.000Z</published>
    <summary>
      <![CDATA[<p>官方简介：<a href="https://stability.ai/news/introducing-stable-code-instruct-3b">https://stability.ai/news/introducing-stable-code-instruct-3]]>
    </summary>
    <title>Stable Code Instruct 3B 本地部署</title>
    <updated>2026-05-09T01:45:34.365Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="浏览器" scheme="https://linweiyuan.github.io/categories/%E6%B5%8F%E8%A7%88%E5%99%A8/"/>
    <category term="Chrome" scheme="https://linweiyuan.github.io/tags/Chrome/"/>
    <content>
      <![CDATA[<p>新版界面是真的用不上，<code>i3wm</code> 鼠标移到最上面经常获取不到标签页的焦点，字体和书签间隔还莫名其妙的大</p><p>如何回滚？</p><p>打开<code>chrome://flags</code>，将 <code>Chrome WebUI Refresh 2023</code> 设为 <code>Disabled</code></p><p>世界又美好了</p><p>有感觉这个特性一定会在不久的将来被删掉</p><h1 id="2024-03-20"><a href="#2024-03-20" class="headerlink" title="2024-03-20"></a>2024-03-20</h1><p>日常 <code>yay</code> 更新了下，参数还失效了，不过多了新参数</p><p><code>Customize Chrome Side Panel</code> 继续改为 <code>Disabled</code></p><p>当前版本：<code>Version 123.0.6312.58 (Official Build) (64-bit)</code></p><p>还这样乱搞，我要转 <code>Firefox</code> 了</p><h1 id="2024-05-17"><a href="#2024-05-17" class="headerlink" title="2024-05-17"></a>2024-05-17</h1><p>今天日常滚下系统，发现有更新，于是升到 125，然后不出所料，打开浏览器发现这个脑残的设计又回来了，上面的 <code>flags</code> 已经不见<br>无奈只能从源头入手</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo nano /usr/share/applications/google-chrome.desktop</span><br></pre></td></tr></table></figure><p>改成 <code>Exec=/usr/bin/google-chrome-stable %U --disable-features=CustomizeChromeSidePanel</code></p><p>今天下了个火狐，再容忍它一下</p><h1 id="2024-08-21"><a href="#2024-08-21" class="headerlink" title="2024-08-21"></a>2024-08-21</h1><p>用了火狐一段时间，不太习惯。。。用回 Chrome</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/15/Chrome%E6%96%B0%E7%89%88UI%E5%9B%9E%E6%BB%9A.html</id>
    <link href="https://linweiyuan.github.io/2023/12/15/Chrome%E6%96%B0%E7%89%88UI%E5%9B%9E%E6%BB%9A.html"/>
    <published>2023-12-15T14:02:40.000Z</published>
    <summary>
      <![CDATA[<p>新版界面是真的用不上，<code>i3wm</code> 鼠标移到最上面经常获取不到标签页的焦点，字体和书签间隔还莫名其妙的大</p>
<p>如何回滚？</p>
<p>打开<code>chrome://flags</code>，将 <code>Chrome WebUI Re]]>
    </summary>
    <title>Chrome 新版 UI 回滚</title>
    <updated>2026-05-09T01:45:34.345Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Caddy" scheme="https://linweiyuan.github.io/tags/Caddy/"/>
    <category term="WebSocket" scheme="https://linweiyuan.github.io/tags/WebSocket/"/>
    <category term="V2Ray" scheme="https://linweiyuan.github.io/tags/V2Ray/"/>
    <content>
      <![CDATA[<p>基于 Arch Linux</p><p>可选：<a href="https://linweiyuan.github.io/2017/08/22/Arch-Linux%E5%BC%80%E5%90%AFBBR-%E9%87%8D%E5%90%AF%E4%B8%8D%E5%A4%B1%E6%95%88.html">BBR</a></p><hr><ol><li>安装软件</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S v2ray caddy</span><br></pre></td></tr></table></figure><ol start="2"><li>配置 V2Ray</li></ol><p>编辑配置文件 <code>/etc/v2ray/vpoint_vmess_freedom.json</code>，在 <code>inbounds</code> 里面加一段配置，<code>path</code> 对应的值自定义，供后续使用，这里用 <code>/ws</code>，<code>id</code> 可随便生成一个 <code>UUID</code>，比如通过 <code>cat /proc/sys/kernel/random/uuid</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&quot;streamSettings&quot;: &#123;</span><br><span class="line">    &quot;network&quot;: &quot;ws&quot;,</span><br><span class="line">    &quot;wsSettings&quot;: &#123;</span><br><span class="line">        &quot;path&quot;: &quot;/ws&quot;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>另外重要的一点，<code>alterId</code> 改成 <code>0</code>，原因自己查</p><p>开启服务：<code>sudo systemctl enable --now v2ray@vpoint_vmess_freedom</code></p><ol start="3"><li>配置 Caddy</li></ol><p>新增配置文件 <code>/etc/caddy/conf.d/xxx</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[域名] &#123;</span><br><span class="line">    reverse_proxy [比如上面的 /ws] :[上面配置的端口] &#123;</span><br><span class="line">        header_up -Origin</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>开启服务：<code>sudo systemctl enable --now caddy</code></p><ol start="4"><li><p>（可选）启动 CDN，隐藏源站 IP（试过 Cloudflare，速度惨不忍睹）</p></li><li><p><code>v2rayA</code> 客户端配置</p></li></ol><table><thead><tr><th align="center">Key</th><th align="center">Value</th></tr></thead><tbody><tr><td align="center">Host</td><td align="center">域名</td></tr><tr><td align="center">Port</td><td align="center">443</td></tr><tr><td align="center">ID</td><td align="center">UUID（上面的）</td></tr><tr><td align="center">AlterID</td><td align="center">0</td></tr><tr><td align="center">Security</td><td align="center">Auto</td></tr><tr><td align="center">TLS</td><td align="center">tls</td></tr><tr><td align="center">SNI</td><td align="center">空</td></tr><tr><td align="center">uTLS fingerprint</td><td align="center">空</td></tr><tr><td align="center">AllowInsecure</td><td align="center">否</td></tr><tr><td align="center">Network</td><td align="center">WebSocket</td></tr><tr><td align="center">Host</td><td align="center">域名</td></tr><tr><td align="center">Alpn</td><td align="center">空</td></tr><tr><td align="center">Path</td><td align="center">上面的 WebSocket 路径</td></tr></tbody></table>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/09/Caddy-WebSocket-V2Ray.html</id>
    <link href="https://linweiyuan.github.io/2023/12/09/Caddy-WebSocket-V2Ray.html"/>
    <published>2023-12-09T06:59:43.000Z</published>
    <summary>
      <![CDATA[<p>基于 Arch Linux</p>
<p>可选：<a href="https://linweiyuan.github.io/2017/08/22/Arch-Linux%E5%BC%80%E5%90%AFBBR-%E9%87%8D%E5%90%AF%E4%B8%8D%E5%A]]>
    </summary>
    <title>Caddy + WebSocket + V2Ray</title>
    <updated>2026-05-09T01:45:34.343Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="AI" scheme="https://linweiyuan.github.io/categories/AI/"/>
    <category term="LLM" scheme="https://linweiyuan.github.io/tags/LLM/"/>
    <category term="ChatGLM" scheme="https://linweiyuan.github.io/tags/ChatGLM/"/>
    <content>
      <![CDATA[<p>记录一下供下次玩耍参考，当前环境：</p><p>Arch Linux：6.6.4-arch1-1<br>Python：3.11.6<br>Nvidia：545.29.06<br>CUDA：12.3<br>GPU：NVIDIA GeForce RTX 3060 Ti<br>ChatGLM: chatglm2-6b-int4</p><hr><ol><li>Arch Linux 安装 NVIDIA 系包</li></ol><p><a href="https://wiki.archlinux.org/title/NVIDIA">Wiki</a> 说现在有个新包 <code>nvidia-open</code>，我试过直接用原来的 <code>nvidia</code> 系统会莫名其妙卡，换成新包一切正常</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S nvidia-open</span><br></pre></td></tr></table></figure><p>如果源码方式运行，上面的就够了，容器运行需要安装多一个，<code>AUR</code> 或者直接 <code>archlinuxcn</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S nvidia-container-toolkit</span><br></pre></td></tr></table></figure><p>由于显卡满足不了 <code>chatglm2-6b</code>，会爆显存 <code>orch.cuda.OutOfMemoryError: CUDA out of memory.</code>，因此只能用 <code>chatglm2-6b-int4</code> 的版本，这里用源码的方式，方便改动后直接运行</p><p>如果是首次安装 <code>nvidia-open</code> 包，需重启系统生效</p><ol start="2"><li><p>克隆官方仓库：<code>gh repo clone THUDM/ChatGLM2-6B</code>，这个 <code>gh</code> 需要额外安装 <code>github-cli</code>，用 <code>git clone</code> 也可以</p></li><li><p>进去 <code>ChatGLM2-6B</code> 文件夹，创建一个虚拟环境 <code>python -m venv .venv</code>，执行 <code>source .venv/bin/activate</code> 激活（取消激活 <code>deactivate</code>），又或者利用 <code>oh-my-zsh</code> 的插件功能 <code>virtualenvwrapper</code>，进入项目目录后自动激活（需要安装 <code>python-virtualenvwrapper</code> 包）</p></li><li><p>下载依赖 <code>pip install -r requirements.txt</code></p></li><li><p>修改代码 <code>web_demo.py</code>、<code>web_demo2.py</code>、或 <code>cli_demo.py</code>，将 <code>THUDM/chatglm2-6b</code> 改为 <code>THUDM/chatglm2-6b-int4</code>，接着执行即可</p></li></ol><ul><li><code>python web_demo.py</code></li><li><code>streamlit run web_demo2.py</code></li><li><code>python cli_demo.py</code></li></ul><p>模型会自动下载模型到 <code>~/.cache/huggingface/hub</code> （或者改为本地已经下载好的路径，可以到 <a href="https://cloud.tsinghua.edu.cn/d/674208019e314311ab5c/?p=/&mode=list">清华大学云盘</a> 下载，这个我没试过，<code>web_demo.py</code> 我自己测试网页会报错，其他两个正常）</p><p>如果遇到报错 <code>RuntimeError: Library cudart is not initialized</code>，则需要安装 <code>cuda</code> 包</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S cuda</span><br></pre></td></tr></table></figure><p>相同环境用起来，速度 <code>chatglm2-6b-int4</code> 比 <code>chatglm-6b-int4</code> 快一点，其他的没仔细测试</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/07/ChatGLM2-6B-INT4%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2.html</id>
    <link href="https://linweiyuan.github.io/2023/12/07/ChatGLM2-6B-INT4%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2.html"/>
    <published>2023-12-07T17:33:24.000Z</published>
    <summary>
      <![CDATA[<p>记录一下供下次玩耍参考，当前环境：</p>
<p>Arch Linux：6.6.4-arch1-1<br>Python：3.11.6<br>Nvidia：545.29.06<br>CUDA：12.3<br>GPU：NVIDIA GeForce RTX 3060 Ti<br>]]>
    </summary>
    <title>ChatGLM2-6B-INT4 本地部署</title>
    <updated>2026-05-09T01:45:34.344Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="虚拟机" scheme="https://linweiyuan.github.io/categories/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    <category term="Windows" scheme="https://linweiyuan.github.io/tags/Windows/"/>
    <category term="KVM" scheme="https://linweiyuan.github.io/tags/KVM/"/>
    <category term="QEMU" scheme="https://linweiyuan.github.io/tags/QEMU/"/>
    <content>
      <![CDATA[<p>在 KVM + QEMU 的场景下，可以进去 <code>/var/lib/libvirt/images</code> 目录，然后通过通过 <code>sudo qemu-img resize win10.qcow2 +10G</code> 去修改硬盘大小</p><p>因为我们一开始并不知道硬盘需要多大空间，并且如果要配合 <code>sdelete</code> 这种来使用的话，太大的硬盘耗时相对更多</p><p>但是，默认情况下，通过 <code>resize</code> 命令去扩容后，在 Windows 系统 <code>磁盘管理</code> 那里的空间是不能直接合并到 C 盘的，要新建一个 D 盘，空间不连续导致不方便的同时，还对强迫症患者不友好</p><p>这个时候只需要把恢复分区删掉就可以合并过去 C 盘了，一般来说用处不大，况且我们可以直接备份 <code>win10.qcow2</code></p><hr><ol><li>管理员打开 CMD，执行 <code>diskpart</code></li><li><code>list disk</code> 列出所有硬盘</li><li><code>select disk 0</code> 通常 C 盘是第 0 个</li><li><code>list partition</code> 列出所有分区</li><li><code>select partition 4</code> 通常恢复分区是第 4 个</li><li><code>delete partition override</code> 提示 <code>DiskPart 成功地删除了所选分区。</code> 则大功告成</li><li>打开硬盘管理直接右键合并新扩容的空间即可</li></ol><hr><p>一个例子</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">Microsoft DiskPart 版本 10.0.19041.3636</span><br><span class="line"></span><br><span class="line">Copyright (C) Microsoft Corporation.</span><br><span class="line">在计算机上: KVM</span><br><span class="line"></span><br><span class="line">DISKPART&gt; list disk</span><br><span class="line"></span><br><span class="line">  磁盘 ###  状态           大小     可用     Dyn  Gpt</span><br><span class="line">  --------  -------------  -------  -------  ---  ---</span><br><span class="line">  磁盘 0    联机              350 GB   300 GB        *</span><br><span class="line">  磁盘 1    联机              465 GB  1024 KB</span><br><span class="line"></span><br><span class="line">DISKPART&gt; select disk 0</span><br><span class="line"></span><br><span class="line">磁盘 0 现在是所选磁盘。</span><br><span class="line"></span><br><span class="line">DISKPART&gt; list partition</span><br><span class="line"></span><br><span class="line">  分区 ###       类型              大小     偏移量</span><br><span class="line">  -------------  ----------------  -------  -------</span><br><span class="line">  分区      1    系统                 100 MB  1024 KB</span><br><span class="line">  分区      2    保留                  16 MB   101 MB</span><br><span class="line">  分区      3    主要                  49 GB   117 MB</span><br><span class="line">  分区      4    恢复                 583 MB    49 GB</span><br><span class="line"></span><br><span class="line">DISKPART&gt; select partition 4</span><br><span class="line"></span><br><span class="line">分区 4 现在是所选分区。</span><br><span class="line"></span><br><span class="line">DISKPART&gt; delete partition override</span><br><span class="line"></span><br><span class="line">DiskPart 成功地删除了所选分区。</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/07/QEMU%E4%B8%8BWin10%E7%A1%AC%E7%9B%98%E5%8A%A8%E6%80%81%E6%89%A9%E5%AE%B9.html</id>
    <link href="https://linweiyuan.github.io/2023/12/07/QEMU%E4%B8%8BWin10%E7%A1%AC%E7%9B%98%E5%8A%A8%E6%80%81%E6%89%A9%E5%AE%B9.html"/>
    <published>2023-12-07T12:01:42.000Z</published>
    <summary>
      <![CDATA[<p>在 KVM + QEMU 的场景下，可以进去 <code>/var/lib/libvirt/images</code> 目录，然后通过通过 <code>sudo qemu-img resize win10.qcow2 +10G</code> 去修改硬盘大小</p>
<p>因]]>
    </summary>
    <title>QEMU下 Win10 硬盘动态扩容</title>
    <updated>2026-05-09T01:45:34.365Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Windows" scheme="https://linweiyuan.github.io/tags/Windows/"/>
    <content>
      <![CDATA[<p>在前面显卡直通文章介绍过通过 KVM + QEMU 直通显卡使用 Windows 系统的场景，当一个系统安装好后，其实可以将原始硬盘 <code>win10.qcow2</code> 备份下来（类似 Ghost），这样当重装 Arch Linux 的时候，不用重新配置 Windows 系统，直接修改 virt-manager 里面 Windows 10 系统的 xml 文件即可（只需替换成新 UUID）</p><p>但是，每次使用这块硬盘后，在系统启动进去的时候，会提示新的“网络2”、“网络3”连接，虽然不影响使用，但是强迫症忍不了</p><p>如何解决？</p><p>注册表大法</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles</span><br><span class="line">HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged</span><br></pre></td></tr></table></figure><p>将上面两个项下面的子项全部删除后重启系统，即可重新提示一个新的“网络”</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/06/%E5%88%A0%E9%99%A4Win10%E7%9A%84%E7%BD%91%E7%BB%9Cx.html</id>
    <link href="https://linweiyuan.github.io/2023/12/06/%E5%88%A0%E9%99%A4Win10%E7%9A%84%E7%BD%91%E7%BB%9Cx.html"/>
    <published>2023-12-06T08:38:54.000Z</published>
    <summary>
      <![CDATA[<p>在前面显卡直通文章介绍过通过 KVM + QEMU 直通显卡使用 Windows 系统的场景，当一个系统安装好后，其实可以将原始硬盘 <code>win10.qcow2</code> 备份下来（类似 Ghost），这样当重装 Arch Linux 的时候，不用重新配置 Wi]]>
    </summary>
    <title>删除 Win10 的网络x</title>
    <updated>2026-05-09T01:45:34.371Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="虚拟机" scheme="https://linweiyuan.github.io/categories/%E8%99%9A%E6%8B%9F%E6%9C%BA/"/>
    <category term="KVM" scheme="https://linweiyuan.github.io/tags/KVM/"/>
    <category term="QEMU" scheme="https://linweiyuan.github.io/tags/QEMU/"/>
    <content>
      <![CDATA[<p>比如我有两个相同的 U 盘要直通过去，如果通过 virt-manager 直接操作，会提示这个错误 <code>Unable to add device: XML error: Hostdev already exists in the domain configuration</code></p><p>经过排查，发现默认情况下，两个 <code>vendor</code> 和 <code>product</code> 相同的配置不能同时出现</p><hr><p>解决办法如下（Arch Linux）：<br>首先需要确保系统安装有 <code>usbutils</code> 这个包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S usbutils</span><br></pre></td></tr></table></figure><p>接着通过命令 <code>lsusb</code> 查询到 <code>Bus</code> 和 <code>Device</code></p><p>比如原来的配置如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">&quot;subsystem&quot;</span> <span class="attr">type</span>=<span class="string">&quot;usb&quot;</span> <span class="attr">managed</span>=<span class="string">&quot;yes&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">source</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">vendor</span> <span class="attr">id</span>=<span class="string">&quot;0x1234&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">product</span> <span class="attr">id</span>=<span class="string">&quot;0xabcd&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">&quot;usb&quot;</span> <span class="attr">bus</span>=<span class="string">&quot;0&quot;</span> <span class="attr">port</span>=<span class="string">&quot;1&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">hostdev</span>&gt;</span></span><br></pre></td></tr></table></figure><p>修改后的配置如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">&quot;subsystem&quot;</span> <span class="attr">type</span>=<span class="string">&quot;usb&quot;</span> <span class="attr">managed</span>=<span class="string">&quot;yes&quot;</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">source</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">vendor</span> <span class="attr">id</span>=<span class="string">&quot;0x1234&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">product</span> <span class="attr">id</span>=<span class="string">&quot;0xabcd&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">address</span> <span class="attr">bus</span>=<span class="string">&#x27;1&#x27;</span> <span class="attr">device</span>=<span class="string">&#x27;1&#x27;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line">  <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">&quot;usb&quot;</span> <span class="attr">bus</span>=<span class="string">&quot;0&quot;</span> <span class="attr">port</span>=<span class="string">&quot;1&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">hostdev</span>&gt;</span></span><br></pre></td></tr></table></figure><p>这样就可以正常添加</p><hr><p>当然还有曲线救国的方案：直通一个 USB HUB</p>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/12/03/QEMU%E5%A4%9AUSB%E8%AE%BE%E5%A4%87%E7%9B%B4%E9%80%9A.html</id>
    <link href="https://linweiyuan.github.io/2023/12/03/QEMU%E5%A4%9AUSB%E8%AE%BE%E5%A4%87%E7%9B%B4%E9%80%9A.html"/>
    <published>2023-12-03T05:19:47.000Z</published>
    <summary>
      <![CDATA[<p>比如我有两个相同的 U 盘要直通过去，如果通过 virt-manager 直接操作，会提示这个错误 <code>Unable to add device: XML error: Hostdev already exists in the domain configurati]]>
    </summary>
    <title>QEMU 多 USB 设备直通</title>
    <updated>2026-05-09T01:45:34.365Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="操作系统" scheme="https://linweiyuan.github.io/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    <category term="Arch Linux" scheme="https://linweiyuan.github.io/tags/Arch-Linux/"/>
    <category term="Nvidia" scheme="https://linweiyuan.github.io/tags/Nvidia/"/>
    <content>
      <![CDATA[<p>书接上回 <a href="https://linweiyuan.github.io/2022/11/25/%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A-PCI-passthrough-via-OVMF.html">虚拟机显卡直通 (PCI passthrough via OVMF)</a></p><hr><h1 id="系统准备"><a href="#系统准备" class="headerlink" title="系统准备"></a>系统准备</h1><p>现在的台式机 CPU，动不动就不带核显，但那个是插着电源线的，不用考虑如何省电</p><p>而现在的笔记本，动不动就是核显加独显，并且 BIOS 里不一定带独显开关。这就造成了一种困扰：我现在没有玩游戏或其他用显卡的需求，只是写写代码，然而刚好在外面没插电，这样独显就还一直是通着电的状态，电池本来能用 5 小时，现在 3 小时就没电了。所以，有没有一种方法，可以在 BIOS 不支持独显开关的情况下，按需关掉或者开启独显？</p><p>答案是有，并且有很多种方案。但是这里按照我的个人喜好，只介绍 <a href="https://github.com/bayasdev/envycontrol">EnvyControl</a> 这一种（其他的我试过，水土不服）</p><hr><p>Arch Linux 安装完成后，默认是用的开源驱动 <code>nouveau</code>，网上说官方的闭源驱动性能更好，那么首先就给系统装上闭源驱动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S nvidia</span><br></pre></td></tr></table></figure><p>然后你可以配置一些钩子，让系统自动重新生成初始化内存镜像，或者简单粗暴地手动生成</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo mkinitcpio -p linux</span><br></pre></td></tr></table></figure><p>上面的命令是基于当前最新 Linux 内核的，如果你用的是其他内核或者自定义内核，那么则自己按需修改</p><p>然后重启系统，显卡驱动就算安装完成了</p><p>接着就是重头戏，安装 <code>envycontrol</code>，但是这个包只在 <code>AUR</code> 里，所以需要通过 <code>yay</code> 或者其他工具进行安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yay -S envycontrol</span><br></pre></td></tr></table></figure><hr><h1 id="核显-独显"><a href="#核显-独显" class="headerlink" title="核显 + 独显"></a>核显 + 独显</h1><p>默认情况下，当前模式是核显 + 独显（至少我自己的笔记本是这样），或者可以通过下面命令切换（每次切换都要重启系统，这个很好理解，因为有时要拉黑一些驱动和修改 <code>udev</code> 规则）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo envycontrol -s hybrid</span><br></pre></td></tr></table></figure><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/envycontrol_hybrid.png"></p><p>如何测试当前显卡使用情况？可以查看 <code>glxinfo</code> 的输出信息</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">glxinfo | grep <span class="string">&quot;OpenGL renderer&quot;</span></span><br></pre></td></tr></table></figure><p>比如我的笔记本输出如下内容</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/glxinfo_intel.png"></p><hr><p>既然说核显 + 独显都是通电的，怎么确认呢？</p><p>多种方法，比如 <code>lspci</code>，不过这个输出多少会让人眼花缭乱，所以这里用人看的一目了然的方法 <code>neofetch</code></p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/neofetch_intel_nvidia.png"></p><p>这里很明显看到核显和独显都是在线的</p><p>但是用 <code>nvidia-smi</code> 会发现，是没有任何进程在用独显的</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/nvidia_smi_no_processes.png"></p><p>但是也可以看到功耗是有的，虽然不多，但是细水长流</p><hr><p>那么既然独显在线，又没人用，还用着电，浪费就浪费在这里了</p><p>所以在核显 + 独显（也叫 <code>hybrid</code>）模式，默认是使用核显的，但是独显也通电，当你想用的时候就可以通过一些另外的方式用，比如 <code>prime-run</code>，安装也很简单</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo pacman -S nvidia-prime</span><br></pre></td></tr></table></figure><p>这个时候在需要使用独显的程序或者命令前加 <code>prime-run</code>，就可以用到独显，比如上面的改成这样</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">prime-run glxinfo | grep <span class="string">&quot;OpenGL renderer string&quot;</span></span><br></pre></td></tr></table></figure><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/prime_run_glxinfo.png"></p><p>这样就能按需使用独显</p><h1 id="独显"><a href="#独显" class="headerlink" title="独显"></a>独显</h1><p>比如当前插着电，或者就是想要更高性能的表现，则可以切换为独显模式</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo envycontrol -s nvidia</span><br></pre></td></tr></table></figure><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/envycontrol_nvidia.png"></p><p>这个时候直接执行 <code>glxinfo</code> （带 <code>prime-run</code> 或者不带都一样），则会提示目前正在使用的是独显</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/glxinfo_nvidia.png"></p><p>并且会看到也有进程使用独显了（如果这个时候使用 <code>neofetch</code>，核显也是会有的，因为它有其他工作要做，比如设置屏幕亮度之类的）</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/nvidia_smi_processes.png"></p><p>没意外的话，所有新进程都用独显</p><h1 id="核显"><a href="#核显" class="headerlink" title="核显"></a>核显</h1><p>这个就是文章一开头的场景，切换命令如下</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo envycontrol -s integrated</span><br></pre></td></tr></table></figure><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/envycontrol_integrated.png"></p><p>这个时候执行 <code>neofetch</code> 则看不到独显了，也就是不通电了</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/neofetch_nvidia.png"></p><p>那么执行 <code>glxinfo</code> 当然显示核显了</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/glxinfo_integrated.png"></p><p>如果执行独显相关的 <code>prime-run</code> 或者 <code>nvidia-smi</code> 则肯定报错了</p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/prime_run_error.png"></p><p><img src="/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE/nvidia_smi_error.png"></p>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE.html</id>
    <link href="https://linweiyuan.github.io/2023/09/23/Arch-Linux-%E5%A4%9A%E6%98%BE%E5%8D%A1%E5%88%87%E6%8D%A2%E9%85%8D%E7%BD%AE.html"/>
    <published>2023-09-23T12:05:10.000Z</published>
    <summary>
      <![CDATA[<p>书接上回 <a href="https://linweiyuan.github.io/2022/11/25/%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%98%BE%E5%8D%A1%E7%9B%B4%E9%80%9A-PCI-passthrough-via]]>
    </summary>
    <title>Arch Linux 多显卡切换配置</title>
    <updated>2026-05-09T01:45:34.341Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="AI" scheme="https://linweiyuan.github.io/categories/AI/"/>
    <category term="ChatGPT" scheme="https://linweiyuan.github.io/categories/AI/ChatGPT/"/>
    <category term="ChatGPT" scheme="https://linweiyuan.github.io/tags/ChatGPT/"/>
    <category term="GPT-4" scheme="https://linweiyuan.github.io/tags/GPT-4/"/>
    <content>
      <![CDATA[<h1 id="本篇文章已过期，仅供思路参考"><a href="#本篇文章已过期，仅供思路参考" class="headerlink" title="本篇文章已过期，仅供思路参考"></a>本篇文章已过期，仅供思路参考</h1><h1 id="20230626-早上"><a href="#20230626-早上" class="headerlink" title="20230626 早上"></a>20230626 早上</h1><p>以下逆向 JS 内容已过期，参考：<a href="https://github.com/acheong08/ChatGPT/issues/1431#issuecomment-1606145567">https://github.com/acheong08/ChatGPT/issues/1431#issuecomment-1606145567</a></p><p>有另一种简单的方法生成 <code>arkose_token</code>：<a href="https://github.com/linweiyuan/chatgpt-arkose-token-api">chatgpt-arkose-token-api</a></p><h1 id="20230626-下午"><a href="#20230626-下午" class="headerlink" title="20230626 下午"></a>20230626 下午</h1><p>当天，似乎上面的方法又失效了，所以还是先用回下面的方法</p><h1 id="20230626-夜里-20230627"><a href="#20230626-夜里-20230627" class="headerlink" title="20230626 夜里 - 20230627"></a>20230626 夜里 - 20230627</h1><p><code>arkose_token</code> 突然不检测了，但是还是先传着，保持和官网一样</p><h1 id="2023-06-28"><a href="#2023-06-28" class="headerlink" title="2023-06-28"></a>2023-06-28</h1><p>又开始检测了</p><h1 id="2023-07-08"><a href="#2023-07-08" class="headerlink" title="2023-07-08"></a>2023-07-08</h1><p><a href="https://github.com/linweiyuan/chatgpt-arkose-token-api">chatgpt-arkose-token-api</a> 复活，主要是借鉴了 <a href="https://github.com/xyhelper/xyhelper-arkose">xyhelper&#x2F;xyhelper-arkose</a></p><p>把 <code>html</code> 页面放在服务器上运行，不行，会弹验证码</p><p>但是单独起个服务跑 <code>html</code> 页面，又可以，莫名其妙</p><p>（我自己测试，如果服务器上开启了 <code>IPv6</code>，会拿不到 <code>token</code>，原因未知）</p><p>服务健康程度监控页面：<a href="https://stats.churchless.tech/">Health Status</a></p><h1 id="2023-07-27"><a href="#2023-07-27" class="headerlink" title="2023-07-27"></a>2023-07-27</h1><p>方法已失效，不折腾了</p><h1 id="2023-09-24"><a href="#2023-09-24" class="headerlink" title="2023-09-24"></a>2023-09-24</h1><p>更新视频，通过抓 har 包获取合法 token（这个方法已经存在很久了，但是最近比较忙，也基本弃坑了没用 GPT，所以鸽到现在更新）</p><h1 id="2023-10-02"><a href="#2023-10-02" class="headerlink" title="2023-10-02"></a>2023-10-02</h1><p>原来本来就有更加方便的方法，之前没有注意，现在更新，无需额外再跑一个 token 服务</p><hr><h1 id="GPT-4-403"><a href="#GPT-4-403" class="headerlink" title="GPT-4 403"></a>GPT-4 403</h1><p>GPT-4 对 <code>arkose_token</code> 的校验在最近几天里每天都改变很多次，有时早上提交代码，下午就失效，或者晚上提交，第二天失效</p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/403.png"></p><p>通过不断的试错，把所有缺失的参数全部补上，但是最后还是 403 了</p><p>于是，打算从源头出发，学习一下 JS 的逆向（本人 JS 相对新手，但是曾经也写过）</p><h1 id="arkose-token-从何来"><a href="#arkose-token-从何来" class="headerlink" title="arkose_token 从何来"></a>arkose_token 从何来</h1><p>接口：<code>https://tcr9i.chat.openai.com/fc/gt2/public_key/35536E1E-65B4-4D96-9D97-6ADB7EFF8147</code></p><p>FormData:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">bda: ct + iv + s 的 base64 编码</span><br><span class="line">public_key: 35536E1E-65B4-4D96-9D97-6ADB7EFF8147</span><br><span class="line">site: https://chat.openai.com</span><br><span class="line">userbrowser: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36</span><br><span class="line">capi_version: 1.5.2</span><br><span class="line">capi_mode: lightbox</span><br><span class="line">style_theme: default</span><br><span class="line">rnd: 随机数，小数点后有时 16 位，有时 17 位</span><br></pre></td></tr></table></figure><p>其他参数都是写死，并且之前不传也可以，最近必须要传，并且还要传对，不然 403</p><p>重点就是在 bda 参数里，里面的内容是加密的</p><h1 id="bda"><a href="#bda" class="headerlink" title="bda"></a>bda</h1><p>通过 F12，一步一步跟，发现了一些蛛丝马迹，最后调用的是这个方法来生成 bda 参数：<code>ALFCCJS.encrypt(bx, bv + bw)</code></p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/encrypt.png"></p><p>于是反推，如何生成 <code>bx</code>、<code>bv</code> 和 <code>bw</code></p><h1 id="bx"><a href="#bx" class="headerlink" title="bx"></a>bx</h1><p><code>bx</code> 依赖 <code>b5</code> 和 <code>bg</code></p><p><code>b5</code> 是一个数组，里面的东西大部分都是写死的，除了一个时间戳</p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/b5.png"></p><p><code>bg</code> 写死的，本次测试不传也正常（未来可能有校验）</p><p>将 <code>b5</code> 数组转成字符串，就得到了 <code>bx</code></p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/bx.png"></p><h1 id="bv"><a href="#bv" class="headerlink" title="bv"></a>bv</h1><p><code>bv</code> 没什么好说的，就是当前浏览器 <code>UA</code> 写死</p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/bv.png"></p><h1 id="bw"><a href="#bw" class="headerlink" title="bw"></a>bw</h1><p><code>bw</code> 不复杂，当前时间戳然后计算一下</p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/bw.png"></p><h1 id="200"><a href="#200" class="headerlink" title="200"></a>200</h1><p>最后执行加密方法，就能生成加密 <code>bda</code></p><p>如果提示 <code>ALFCCJS is not defined</code>，执行下面 JS 将其初始化 </p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> script = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&quot;script&quot;</span>);</span><br><span class="line">script.<span class="property">type</span> = <span class="string">&quot;text/javascript&quot;</span>;</span><br><span class="line">script.<span class="property">src</span> = <span class="string">&quot;https://tcr9i.chat.openai.com/cdn/fc/js/6af2c0d87b9879cbf3365be1a208293f84d37b1e/standard/funcaptcha_api.js&quot;</span>;</span><br><span class="line"><span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(script);</span><br></pre></td></tr></table></figure><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/bda.png"></p><p>再设置到参数里调用接口就能拿到 <code>arkose_token</code></p><p>GPT-4 就 200 了</p><p><img src="/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token/200.png"></p><h1 id="视频（共三个）"><a href="#视频（共三个）" class="headerlink" title="视频（共三个）"></a>视频（共三个）</h1><p>一开始看错了 <code>bv</code> 成 <code>by</code>，但是字幕烧录进去了，懒得改了，其实是 <code>bx</code>, <code>bv</code>, <code>bw</code></p><div>  <video-js id="videojs-id-4df98f54-9940-4477-9869-e3abe80ee5d5"     class="vjs-default-skin vjs-16-9"     controls     preload="auto"     width="100%"     height="350px">    <source src="/video/how-to-generate-gpt-4-arkose-token/index.m3u8" type="application&#x2F;x-mpegURL">  </video-js>      <script>    const videojsid4df98f54994044779869e3abe80ee5d5 = videojs('videojs-id-4df98f54-9940-4477-9869-e3abe80ee5d5', {      html5: {        hls: {          overrideNative: true        }      }    });  </script>  </div> <hr><div>  <video-js id="videojs-id-9ec3becc-7c43-4b31-ae54-5a81df3cf0d0"     class="vjs-default-skin vjs-16-9"     controls     preload="auto"     width="100%"     height="350px">    <source src="/video/how-to-generate-gpt-4-arkose-token-new/index.m3u8" type="application&#x2F;x-mpegURL">  </video-js>      <script>    const videojsid9ec3becc7c434b31ae545a81df3cf0d0 = videojs('videojs-id-9ec3becc-7c43-4b31-ae54-5a81df3cf0d0', {      html5: {        hls: {          overrideNative: true        }      }    });  </script>  </div> <hr><div>  <video-js id="videojs-id-1106236b-91e5-425f-b6b0-a2fe9729f0c1"     class="vjs-default-skin vjs-16-9"     controls     preload="auto"     width="100%"     height="350px">    <source src="/video/how-to-generate-gpt-4-arkose-token-latest/index.m3u8" type="application&#x2F;x-mpegURL">  </video-js>      <script>    const videojsid1106236b91e5425fb6b0a2fe9729f0c1 = videojs('videojs-id-1106236b-91e5-425f-b6b0-a2fe9729f0c1', {      html5: {        hls: {          overrideNative: true        }      }    });  </script>  </div>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token.html</id>
    <link href="https://linweiyuan.github.io/2023/06/24/%E5%A6%82%E4%BD%95%E7%94%9F%E6%88%90-GPT-4-arkose-token.html"/>
    <published>2023-06-24T15:10:24.000Z</published>
    <summary>
      <![CDATA[<h1 id="本篇文章已过期，仅供思路参考"><a href="#本篇文章已过期，仅供思路参考" class="headerlink" title="本篇文章已过期，仅供思路参考"></a>本篇文章已过期，仅供思路参考</h1><h1 id="20230626-早上"><a h]]>
    </summary>
    <title>如何生成 GPT-4 arkose_token</title>
    <updated>2026-05-09T01:45:34.381Z</updated>
  </entry>
  <entry>
    <author>
      <name>林伟源</name>
    </author>
    <category term="AI" scheme="https://linweiyuan.github.io/categories/AI/"/>
    <category term="ChatGPT" scheme="https://linweiyuan.github.io/categories/AI/ChatGPT/"/>
    <category term="ChatGPT" scheme="https://linweiyuan.github.io/tags/ChatGPT/"/>
    <category term="HTTP Client" scheme="https://linweiyuan.github.io/tags/HTTP-Client/"/>
    <content>
      <![CDATA[<p>接口调试</p><div>  <video-js id="videojs-id-d3a040f7-e983-451d-b80c-025d1cc4809d"     class="vjs-default-skin vjs-16-9"     controls     preload="auto"     width="100%"     height="350px">    <source src="/video/http-client-debug-go-chatgpt-api/index.m3u8" type="application&#x2F;x-mpegURL">  </video-js>      <script>    const videojsidd3a040f7e983451db80c025d1cc4809d = videojs('videojs-id-d3a040f7-e983-451d-b80c-025d1cc4809d', {      html5: {        hls: {          overrideNative: true        }      }    });  </script>  </div>]]>
    </content>
    <id>https://linweiyuan.github.io/2023/06/18/%E5%88%A9%E7%94%A8-HTTP-Client-%E6%9D%A5%E8%B0%83%E8%AF%95-go-chatgpt-api.html</id>
    <link href="https://linweiyuan.github.io/2023/06/18/%E5%88%A9%E7%94%A8-HTTP-Client-%E6%9D%A5%E8%B0%83%E8%AF%95-go-chatgpt-api.html"/>
    <published>2023-06-18T12:31:41.000Z</published>
    <summary>
      <![CDATA[<p>接口调试</p>
<div>
  <video-js id="videojs-id-d3a040f7-e983-451d-b80c-025d1cc4809d" 
    class="vjs-default-skin vjs-16-9" 
    controls]]>
    </summary>
    <title>利用 HTTP Client 来调试 go-chatgpt-api</title>
    <updated>2026-05-09T01:45:34.371Z</updated>
  </entry>
</feed>
