<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<atom:link href="https://blog.inmoe.org/feed" rel="self" type="application/rss+xml"/>
<title>Incohua's Blog</title>
<link>https://blog.inmoe.org</link>
<description>incohua的博客</description>
<language>zh-CN</language>
<copyright>© incohua </copyright>
<pubDate>Mon, 27 Apr 2026 22:03:33 GMT</pubDate>
<generator>Mix Space CMS (https://github.com/mx-space)</generator>
<docs>https://mx-space.js.org</docs>
<image>
    <url>https://image.inmoe.org/images/2025/02/20250203-141832-125281374-dfe64a5bc7f170a4.webp</url>
    <title>Incohua's Blog</title>
    <link>https://blog.inmoe.org</link>
</image>
<item>
    <title>关于我通过代理优化 Tailscale 连接速度的小妙招😋</title>
    <link>https://blog.inmoe.org/posts/record/optimize-tailscale-speed-with-proxy</link>
    <pubDate>Tue, 06 Jan 2026 12:04:40 GMT</pubDate>
    <description>前言

作者为了保证服务器的安全，贯彻落实&quot;Zero-Trust&quot;原则，长期使用 Tailscale</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/record/optimize-tailscale-speed-with-proxy'>https://blog.inmoe.org/posts/record/optimize-tailscale-speed-with-proxy</a></blockquote>
      <h1>前言</h1>
<p>作者为了保证服务器的安全，贯彻落实&quot;Zero-Trust&quot;原则，长期使用 <a href="https://tailscale.com/">Tailscale</a> 来连接自己服务器。</p>
<p>但是呢，Tailscale 存在一点小小的问题。Tailscale 的官方&quot;Derp&quot;看着很多很棒对不对。打洞成功走直连听起来很棒对不对？</p>
<p><strong>⚠️ BUT：</strong></p>
<p>当你的服务器在国外，并且没有优化线路的时候，你就会察觉到一丝不对劲——<strong>布什戈门，你这连接速度也太慢了吧</strong>。</p>
<p>直连后反而不如中继（虽然中继也挺垃圾的，官方的 Derp 也普遍绕路）。</p>
<p>这个时候，有的观众朋友就会说了：那你可以自建&quot;Derp&quot;来优化连接速度呀。</p>
<p>那还是避不开那个问题——如果他打洞成功了，不走中继怎么办，还不是一样绕路吗？</p>
<p>直连后 300ms 的延迟和中继 150ms 的延迟，你选谁？</p>
<blockquote>
<p>「回答我！」「你回答我！」「Look in my eyes!」「Tell me, why? Why? Baby why?」「说话！」</p>
</blockquote>
<p>并且自建&quot;Derp&quot;需要一台额外的服务器，最好还得是中国优化线路，不然效果依旧是一言难尽。</p>
<p>作者的三网优化机刚好在写文的这一晚到期，所以迫切地需要找其他方案来优化 SSH 的连接速度，不然那输一个命令卡几秒，谁受得了。</p>
<blockquote>
<p>另外，请壁垒&quot;破碎工坊云&quot;，毫无契约精神</p>
</blockquote>
<p>作为作者玩服务器 Baby 阶段用过的商家，这一家搞过的骚操作在我印象中，包括但不限于：</p>
<ul>
<li>无公告临时换 IP 导致机器失联</li>
<li>称机柜供电不足，降配机器（EPYC→E5）</li>
<li>使用期间数据不保</li>
<li>降配限速，美名&quot;智能带宽策略调整&quot;</li>
<li>大事故后，补偿使用时间，再找借口通知业务变更，机器全部清退😋</li>
</ul>
<p>所以意外折腾下，想到之前写过一篇<a href="https://blog.inmoe.org/posts/record/tailscale-proxy-configuration-guide#15__xray-%E5%88%86%E6%B5%81%E9%85%8D%E7%BD%AE">文章</a>，可以在服务器上部署 Tailscale 后，当做代理节点访问。</p>
<p>俺寻思之力发动🌟——既然能直接访问服务器上的 Tailscale，那岂不是也能用来当跳板机？</p>
<hr>
<h1>正文</h1>
<h2>效果展示</h2>
<p>为了吸引读者兴趣，对比一手前后速度。</p>
<blockquote>
<p>连接的服务器是一台三网绕的香港服务器</p>
</blockquote>
<p><strong>优化前：</strong></p>
<pre><code class="language-bash">❯ time ssh -o BatchMode=yes hk-ser exit

ssh -o BatchMode=yes hk-ser exit  0.03s user 0.01s system 0% cpu 7.553 total</code></pre><p><strong>优化后：</strong></p>
<pre><code class="language-bash">❯ time ssh -o BatchMode=yes hk-ser exit

ssh -o BatchMode=yes hk-ser exit  0.02s user 0.01s system 5% cpu 0.630 total</code></pre><p><strong>速度对比：</strong></p>
<table>
<thead>
<tr>
<th>项目</th>
<th>连接速度</th>
</tr>
</thead>
<tbody><tr>
<td>优化前</td>
<td>7.553s</td>
</tr>
<tr>
<td>优化后</td>
<td>0.630s</td>
</tr>
</tbody></table>
<hr>
<h2>前置要求</h2>
<ul>
<li>一个机场订阅（优化线路）
<del>不对，你都有优化线路的服务器了，为什么不直接当跳板机呢</del></li>
<li>一台落地服务器（也就是出口）</li>
<li>了解什么是链式代理</li>
<li>一个爱折腾的心</li>
</ul>
<hr>
<h2>思路</h2>
<h3>Before</h3>
<p></p>
<blockquote>
<p>当你的服务器在国外，并且没有优化线路的时候，你就会察觉到一丝不对劲。<strong>布什戈门，你这连接速度也太慢了吧</strong>。</p>
<p>直连后反而不如中继（虽然直连也挺垃圾的）</p>
</blockquote>
<h3>Now</h3>
<p></p>
<p>既然机场一般有优化线路，那咱就可以利用下，用来加速😋</p>
<hr>
<h2>Xray 配置</h2>
<p>这一部分请参考作者的<a href="https://blog.inmoe.org/posts/record/tailscale-proxy-configuration-guide#15__xray-%E5%88%86%E6%B5%81%E9%85%8D%E7%BD%AE">另外一篇文章</a></p>
<hr>
<h2>代理软件配置</h2>
<p>这里作者仅以自己目前使用的代理软件为例，进行测试举例。</p>
<blockquote>
<p>此处默认读者已经了解如何自行添加代理节点，并创建对应的规则和分组</p>
</blockquote>
<h3>Surge</h3>
<p>Surge 默认开放的 Socks5 端口为 <code>6153</code></p>
<pre><code class="language-conf"># &gt; Tailscale
; PROCESS-NAME,tailscale,DIRECT
; PROCESS-NAME,tailscaled,DIRECT
AND,((DEST-PORT,22), (IP-CIDR,100.64.0.0/10,no-resolve)),Tailscale
; DOMAIN-SUFFIX,ts.net,Tailscale
; IP-CIDR,100.64.0.0/10,Tailscale
; IP-CIDR6,fd7a:115c:a1e0:ab12::/64,Tailscale</code></pre><h3>Mihomo</h3>
<h4>规则</h4>
<p>Mihomo 默认开放的 Socks5 端口为 <code>7890</code></p>
<pre><code class="language-yaml"># - PROCESS-NAME,tailscaled,DIRECT
- AND,((IP-CIDR,100.64.0.0/10,no-resolve), (DST-PORT, 22)), Tailscale
# - DOMAIN-SUFFIX,ts.net,Tailscale
# - IP-CIDR,100.64.0.0/10,Tailscale,no-resolve
# - IP-CIDR,fd7a:115c:a1e0::/48,Tailscale,no-resolve</code></pre><h4>链式代理</h4>
<ol>
<li><p>阅读 <a href="https://wiki.metacubex.one/config/proxies/dialer-proxy/">Mihomo Wiki</a>关于<code>dialer-proxy</code>的部分</p>
</li>
<li><p>为自己手动配置的节点或组添加 <code>dialer-proxy</code></p>
</li>
<li><p>以 <code>ss2022</code> 协议的配置示例：</p>
</li>
</ol>
<blockquote>
<p>这里就是通过[香港节点]链式代理到[test-node]的意思</p>
</blockquote>
<pre><code class="language-yaml">- name: "test-node"
  type: ss
  server: blog.inmoe.org
  port: 11451
  cipher: 2022-blake3-aes-128-gcm
  password: "16位passwd"
  udp: true
  udp-over-tcp: false
  udp-over-tcp-version: 2
  ## 关键部分
  dialer-proxy: 香港节点</code></pre><hr>
<h2>终端配置</h2>
<p>此处以默认自带的终端和 SSH 软件 Termius 举例。</p>
<h3>SSH-Config</h3>
<ol>
<li><p>安装组件（二选一）：</p>
<ul>
<li><code>nmap</code>（推荐）</li>
<li><code>netcat-openbsd</code></li>
</ul>
</li>
<li><p>调整 <code>ssh-config</code>，添加：</p>
<pre><code class="language-">ProxyCommand ncat --proxy 127.0.0.1:6153 --proxy-type socks5 %h %p</code></pre></li>
<li><p>参考示例：</p>
<pre><code class="language-bash">Host hk-ser
HostName 100.117.105.24
User root
Port 22
IdentityFile ~/.ssh/id_ed25519
AddKeysToAgent yes
ProxyCommand ncat --proxy 127.0.0.1:6153 --proxy-type socks5 %h %p</code></pre></li>
</ol>
<h3>Termius</h3>
<p>两图流启动：</p>
<p></p>
<p></p>
<hr>
<h2>小小问题</h2>
<ol>
<li><p><del>这样的规则可能误伤本地的 SSH 连接。其实可以分开配置 <code>SOCKS5</code>，只有需要的服务器才配置代理</del></p>
<blockquote>
<p>此处有乌龙：最开始测试 <code>AND</code> 规则的时候，发现总是匹配不到。写完一版后，测试的时候发现——诶，我 <code>CIDR</code> 怎么写错了，<code>100.64</code> → <code>10.64</code>，me → 🤡</p>
</blockquote>
</li>
<li><p>代理软件和 Tailscale 没配置好会打架</p>
<p>加油孩子，问问 ChatGPT、Gemini、Claude 老师，或者看我 Xray 那篇文章。</p>
</li>
<li><p>这安全吗？</p>
<p>我也不确定这样到底是不是安全的，落地机得保护好。或者说 Tailscale 的 ACL 规则要配置好。<strong>但是实打实快了对吧</strong> 😋</p>
</li>
</ol>
<h2>结语</h2>
<p>以上操作纯属作者瞎折腾呀，如果读者宝贝们有更好的方案，
或者相关的疑问，欢迎指出💗！！</p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/record/optimize-tailscale-speed-with-proxy#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">695cfa58458de18cb786c876</guid>
  <category>posts</category>
<category>记录</category>
 </item>
  <item>
    <title>《颠倒的日记》</title>
    <link>https://blog.inmoe.org/notes/1</link>
    <pubDate>Sun, 07 Dec 2025 04:44:53 GMT</pubDate>
    <description> 观前提示：文章没有逻辑，图片请先自行想象，配图描述并不到位
本文是作者睡醒后突发奇想，记录了下自己</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/notes/1'>https://blog.inmoe.org/notes/1</a></blockquote>
      <blockquote>
<p> 观前提示：文章没有逻辑，图片请先自行想象，配图描述并不到位
本文是作者睡醒后突发奇想，记录了下自己的梦。作者给出大纲和部分细致内容，AI填充和生图。</p>
</blockquote>
<h2>序章：蝉鸣与既视感</h2>
<p>记忆的底色是曝光过度的惨白。</p>
<p>那是高三最后那个暑假前的返校日。蝉鸣声大得像是在耳膜上锯木头，空气里弥漫着粉笔灰和燥热汗水的味道。班主任站在讲台上，嘴巴一张一合，声音却像是隔着水面传来的：</p>
<p>“……每人写一份《未来规划日记》，写下你们十年后想成为什么样的人，想做什么事……”
</p>
<p>我的心脏猛地收缩了一下。不是因为害怕，而是因为——我写过这个。</p>
<p>这种强烈的既视感（Déjà vu）让我脊背发凉。在某个模糊的梦境回路里，我甚至记得那本日记的触感。我记得我写下了什么，那不仅仅是“规划”，更像是一份把自己出卖给某种不可名状之物的契约。</p>
<p>但我还是拿起了笔，怀揣着那种混合了“没写作业的恐惧”与“面对宿命的战栗”，在纸上划下了第一笔。</p>
<p>——随后，世界在瞬间崩塌。</p>
<p></p>
<h2>第一章：猎场与霰弹枪</h2>
<p>醒来时，那种燥热瞬间被刺骨的阴冷取代。</p>
<p>没有过渡，没有缓冲。我从课桌上抬起头，看到的却不是黑板，而是一面爬满霉菌的混凝土墙壁。</p>
<p>空间的逻辑在这里彻底失效了。卧室的床头柜连接着一条断裂的过山车轨道，左手边是学校的走廊，右手边却是一截还在滴着污水的地下排污管道。这些场景像被顽童暴力撕扯下来的杂志内页，生硬地拼贴在一起。</p>
<blockquote>
<p> 这一张生成的不好</p>
</blockquote>
<p></p>
<p></p>
<p>我下意识地往身旁一摸，手指触碰到了一根冰冷的金属管。</p>
<p>是一把泵动式霰弹枪。</p>
<p>但我竟然没有感到丝毫惊讶，仿佛它本就是我肢体的一部分，就像起床要穿拖鞋一样自然。</p>
<p>“砰——！”</p>
<p>极近的地方传来一声枪响，紧接着是重物倒地的闷哼。</p>
<p>我屏住呼吸，肾上腺素飙升。我趴在地板上，透过木板的裂缝向下窥视。楼下的空间是一个错乱的大厅，几个模糊的人影正在快速穿梭，那是捕猎者与猎物的追逐。</p>
<p>这里不是学校，这里是屠宰场。</p>
<p></p>
<h2>第二章：时间的废墟</h2>
<p>我端着枪，贴着墙根慢慢向走廊尽头挪动。每一步都必须小心，因为脚下可能就是一个通往无底深渊的缺口。</p>
<p>尽头是一扇半掩的铁门，上面挂着模糊不清的牌子，依稀能辨认出“Sheriff”（警长）的字样。</p>
<p>我推门而入，枪口抬起。</p>
<p>“别动。”</p>
<p>“……别开枪。”</p>
<p>对面的人举起双手。我愣住了，那张脸轮廓依稀熟悉，那是我的高中同学，B。</p>
<p>但不对劲。他的头发花白，眼角垂着深深的皱纹，眼神浑浊得像是一潭死水。明明我们才刚刚“放学”，但他似乎在这个鬼地方已经独自度过了四十年。</p>
<p>这里的时间，是错位的。</p>
<p>“你也来了。”B 的声音沙哑，像是含着一口沙砾。</p>
<p>就在这时，楼道拐角处的阴影里闪出一个人影。我和 B 同时调转枪口。</p>
<p>“是我！别开枪！”</p>
<p>是 C。他还保持着年轻的模样，满脸惊恐。看来，并非所有人都被时间侵蚀了。</p>
<p>我们看向窗外。暴雨如注，黑色的雨水像幕布一样遮蔽了视野。窗户并没有玻璃，但我不敢探头，因为只要稍微靠近，就能感受到那股足以把灵魂吸出去的吸力。</p>
<p>房间里四处散落着档案袋。我随手抓起一份，试图寻找线索。纸上的字迹在蠕动，像是得了某种眼疾，越想看清，字体就越模糊，最终变成一团团不可名状的墨迹。
</p>
<h2>第三章：狼人杀</h2>
<p>一阵毫无预兆的天旋地转。重力方向改变了，我从天花板“掉”到了地板上。</p>
<p>再次睁眼时，我们已经在一个看起来像避难所的封闭大厅里。幸存的同学们似乎都被这股怪力驱赶到了这里。
</p>
<p>压抑的气氛在沉默中发酵，直到被一声尖叫引爆。</p>
<p>“是你！肯定是你！”</p>
<p>同学“牛子哥”突然发难。他双眼布满红血丝，整个人处于一种濒临崩溃的亢奋状态。他手里的枪在那哆嗦，枪口在众人之间乱晃。</p>
<p>“你们看这窗户！”牛子哥指着那扇满是灰尘的窗框，上面有一个极淡的手印，“有人动过！有人给外面那些东西留了信号！是有内鬼把我们弄到这儿来的！”</p>
<p>他猛地冲到我面前，枪管几乎戳到我的鼻尖：“是不是你？你刚才一直不 JB说话，你他妈在盘算什么？”</p>
<p>“你疯了吗！把枪放下！”我想推开他，但他力气大得惊人。</p>
<p>“别他妈过来！谁过来我杀谁！”牛子哥歇斯底里地吼叫，唾沫星子乱飞，“我不信你们……在这个鬼地方，死人比活人更干净！”</p>
<p>眼看他就要扣动扳机，几个男生从侧面扑上去，死死按住了他的胳膊。牛子哥在地上疯狂挣扎，发出野兽般的嚎叫，直到精疲力竭才被拖到角落。</p>
<p>虽然争端平息了，但那个手印像一根刺，扎进了每个人心里。</p>
<p>猜疑的种子，发芽了。</p>
<h2>第四章：橱窗里的暖光</h2>
<p>不知道过了多久，也许是几天，也许是几年。</p>
<p>窗外的暴雨终于停了。浓重的雾气散开了一角，我们趴在护栏边向下俯瞰，所有人都在那一瞬间屏住了呼吸。</p>
<p>在脚下深不见底的黑暗中，竟然悬浮着一条街道。</p>
<p>那是一家暖色调的商超，透过明亮的落地窗，可以看到货架上摆满了整齐的零食和饮料。温暖的橘黄色灯光洒在街道上，与我们身处的这个阴冷、灰暗的混凝土世界形成了撕裂般的对比。</p>
<p>“那是……小雅她们？”有人颤抖着指着下面。</p>
<p>是的，那是班里的几个女同学。她们穿着干净整洁的校服，甚至没有带武器。她们在商超门口嬉戏打闹，手里提着购物袋，脸上洋溢着我们在梦里都不敢奢望的笑容。
</p>
<p>那是属于“正常世界”的景象。</p>
<p>“喂——！我们在这儿！”</p>
<p>“救命啊！看上面！”</p>
<p>我们疯了一样地大喊，挥舞着手臂，甚至有人朝天鸣枪示警。</p>
<p>然而，声音仿佛被一层看不见的屏障切断了。楼下的女孩们依然在欢笑，完全听不到头顶这群绝望之人的嘶吼。</p>
<p>那不是现实，那是地狱给我们的展示柜。</p>
<p>我就这样看着，看着那唯一的暖光，感觉比死还要冷。</p>
<h2>第五章：白色的葬礼</h2>
<p>转折发生在一封信函的出现。</p>
<p>它凭空出现在满是灰尘的桌子上，信封烫金，散发着好闻的香水味。</p>
<p>是一封婚礼邀请函。
</p>
<p>没有落款，只有时间和地点。地点就在那扇一直无法打开的大门之后。</p>
<p>“这是出口。”大家达成了某种默契。必须有人去探路，或者说……去献祭。</p>
<p>经过几轮令人窒息的商议，D 站了出来。</p>
<p>“我去吧。”D 的脸上带着一种殉道者的平静。</p>
<p>在这个废墟里，我们竟然找出了一套白色的西装。D 穿上它，剃掉了胡须，整理了头发。在这一群衣衫褴褛、满身血污的幸存者中间，一身纯白的 D 看起来神圣得像个天使，又或是新郎。
</p>
<p>“祝你好运，兄弟。”我拍了拍他的肩膀，感觉自己在送别一位英雄。</p>
<p>D 笑了笑，推开了那扇沉重的大门。</p>
<h2>终章：颠倒的世界</h2>
<p>大门缓缓合上，透过尚未闭合的缝隙，我贪婪地向内窥视，希望能看到逃生的希望。</p>
<p>门后的世界金碧辉煌，音乐庄严肃穆。</p>
<p>但我浑身的血液在瞬间凝固了。</p>
<p>大厅里坐满了宾客。成百上千人，但他/她们每一个人，都穿着黑色的礼服。</p>
<p>黑色的长裙，黑色的西装，黑色的面纱。</p>
<p>他们面无表情，眼神空洞地注视着前方。整个大厅是一片死寂的黑色海洋。</p>
<p>在那片黑色的死海中，D 那一身刺眼的纯白，显得如此突兀，如此格格不入。
</p>
<p>在现实世界里，白色象征纯洁的婚礼，黑色象征肃穆的葬礼。</p>
<p>而在梦境的深处，在这个颠倒的世界里，规则是反转的。</p>
<p>黑色才是喜庆，白色……是<strong>丧服</strong>。</p>
<p>D 似乎也意识到了什么，他站在红毯尽头，僵硬地回过头，透过门缝看向我。他的笑容凝固在脸上，变成了一个扭曲的哭相。</p>
<p>他不是去参加婚礼的新郎。</p>
<p>他是这场“婚礼”唯一的祭品。</p>
<p>大门轰然关闭。</p>
<p>而在那一瞬间，我终于想起了在那本《未来规划日记》里，我写下的最后一句话：</p>
<p>“我希望在未来，能盛装出席一场属于我的典礼。”</p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/notes/1#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">69350645685d961d498f8539</guid>
  <category>notes</category>
false
 </item>
  <item>
    <title>CachyOS与ManjaroOS在Grub引导形式上的踩坑</title>
    <link>https://blog.inmoe.org/posts/tossabout/cachyos-manjaroos-grub</link>
    <pubDate>Sat, 01 Nov 2025 09:32:35 GMT</pubDate>
    <description>前言  

作者的朋友最近一直使用 Manjaro，自己也跟着试用 CachyOS / Manjar</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/tossabout/cachyos-manjaroos-grub'>https://blog.inmoe.org/posts/tossabout/cachyos-manjaroos-grub</a></blockquote>
      <h1>前言</h1>
<p>作者的朋友最近一直使用 Manjaro，自己也跟着试用 CachyOS / Manjaro 系统，过程中碰到了不少坑，于是把遇到的问题和解决流程记录下来，方便以后回顾或给遇到同样问题的朋友参考。</p>
<h1>正文</h1>
<blockquote>
<p>本文假设你已经完成系统安装，只是无法从 EFI 启动 GRUB（常见于某些笔记本 NVMe + NVRAM 写入受限的情况）。</p>
</blockquote>
<p>作者遇到的情况如下：</p>
<p>Grub 空间满了无法写入 EFI 分区引导
但是实际查看并没有这个问题</p>
<pre><code class="language-bash">grub-install: error: efibootmgr failed to register the boot entry: Input/output error</code></pre><h2>环境与磁盘信息</h2>
<ul>
<li>机型：ROG M16 2022</li>
<li>分区信息：</li>
</ul>
<pre><code class="language-shell">NAME        FSTYPE   FSVER            LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
loop0       squashfs 4.0                                                                    0   100% /run/archiso/airootfs
sda
├─sda1      exfat    1.0              Ventoy     4E21-0000
│ └─ventoy  iso9660  Joliet Extension COS_202508 2025-08-28-13-38-09-00
└─sda2
zram0       swap     1                zram0      209e31fb-fcc9-4171-94ee-4f1281e3e3cf                [SWAP]
nvme0n1
├─nvme0n1p1 vfat     FAT32                       AF8B-F7AC
├─nvme0n1p2
└─nvme0n1p3 ntfs                      系统       A6E83F17E83EE4E9
nvme1n1
├─nvme1n1p1 ntfs                      软件       CC8A3E9A8A3E814E
├─nvme1n1p2 btrfs                                9d7c31b4-70cf-4e6a-beca-184cf980f389
└─nvme1n1p3 btrfs                                ec2d3428-fc8e-4563-9d18-2333e467fc66</code></pre><p>启动安装时实际挂载分区：</p>
<table>
<thead>
<tr>
<th>分区</th>
<th>容量</th>
<th>已用</th>
<th>可用</th>
<th>使用率</th>
<th>挂载点</th>
<th>类型</th>
</tr>
</thead>
<tbody><tr>
<td>nvme0n1p1</td>
<td>599M</td>
<td>252M</td>
<td>348M</td>
<td>42%</td>
<td>/mnt/boot/efi</td>
<td>vfat (EFI)</td>
</tr>
<tr>
<td>nvme1n1p2</td>
<td>51G</td>
<td>12G</td>
<td>38G</td>
<td>23%</td>
<td>/mnt</td>
<td>btrfs (@ 子卷)</td>
</tr>
<tr>
<td>nvme1n1p3</td>
<td>207G</td>
<td>6.3M</td>
<td>204G</td>
<td>1%</td>
<td>/mnt/home</td>
<td>btrfs</td>
</tr>
</tbody></table>
<h2>步骤概览</h2>
<ol>
<li>进入 LiveCD 环境</li>
<li>挂载 EFI 分区、根目录、和 home 分区。</li>
<li>进入 chroot</li>
<li>安装 / 修复 GRUB：<ul>
<li>尝试正常安装（如果 NVRAM 可写）。</li>
<li>如果 NVRAM 不可写，使用 --no-nvram 或 --removable  复制到 EFI fallback 路径。</li>
</ul>
</li>
<li>生成 grub. cfg，检查，退出并重启。</li>
<li>如仍无法启动，查看 BIOS 启动顺序或使用 efibootmgr 检查。</li>
</ol>
<h2>详细步骤</h2>
<ol>
<li>挂载（示例，非使用 cachy-chroot）
如果你的根文件系统是 btrfs 并使用子卷（比如 @），可以这样挂载：</li>
</ol>
<pre><code class="language-bash"># 挂载根子卷
mount -o subvol=@ /dev/nvme1n1p2 /mnt

# 创建并挂载 EFI 与 home
mkdir -p /mnt/boot/efi /mnt/home
mount /dev/nvme0n1p1 /mnt/boot/efi
mount /dev/nvme1n1p3 /mnt/home</code></pre><p>检查挂载是否正确：</p>
<pre><code class="language-bash">df -h | grep -E '(nvme0n1p1|nvme1n1p2|nvme1n1p3)'
# 预期输出类似：
# /dev/nvme1n1p2   51G   12G   38G  23% /mnt
# /dev/nvme0n1p1  599M  252M  348M  42% /mnt/boot/efi
# /dev/nvme1n1p3  207G  6.3M  204G   1% /mnt/home</code></pre><ol start="2">
<li>使用 cachy-chroot（推荐 CachyOS 用户）
CachyOS 提供了方便的 <code>cachy-chroot</code>，会自动处理 btrfs 子卷挂载与必要的 bind mount。</li>
</ol>
<p><a href="https://wiki.cachyos.org/features/cachy_chroot/">Cachy-Chroot文档</a></p>
<p>若使用 <code>cachy-chroot</code>，只需：</p>
<pre><code class="language-bash">cachy-chroot
# 完成后直接 exit 即可退出 chroot，cachy-chroot 会清理 mount</code></pre><ol start="3">
<li><p>如果使用 arch-chroot（手动绑定）</p>
</li>
<li><p>在没有 cachy-chroot 的情况下，需要手动 bind /dev /proc /sys /run：</p>
</li>
<li><p>安装 / 修复 GRUB
常规（NVRAM 可写）用法：</p>
</li>
</ol>
<pre><code class="language-bash">grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=cachyos
grub-mkconfig -o /boot/grub/grub.cfg</code></pre><p>如果 NVRAM 无法写入，可以采用以下替代方案：</p>
<p>方案 ：使用 --no-nvram 并复制到 EFI removable/fallback</p>
<pre><code class="language-bash"># 仅安装文件，但不写入 NVRAM
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=cachyos --no-nvram --recheck

# 把 grub 的 EFI 可执行文件复制到 fallback（确保能在 BIOS/UEFI 下通过 fallback 路径启动）
mkdir -p /boot/efi/EFI/BOOT
cp /boot/efi/EFI/cachyos/grubx64.efi /boot/efi/EFI/BOOT/BOOTX64.EFI

# 生成配置
grub-mkconfig -o /boot/grub/grub.cfg</code></pre><p>说明与注意事项</p>
<ul>
<li>--no-nvram：只安装 EFI 文件，不尝试写入 NVRAM。</li>
<li>在某些笔记本上（尤其厂商对 NVRAM 有限制或 bug）无法写入 EFI 变量，这时使用 --no-nvram  复制到 EFI fallback</li>
</ul>
<ol start="6">
<li>退出 chroot、卸载并重启
若使用 cachy-chroot，直接 exit 即可，cachy-chroot 会自动清理挂载。若手动 chroot，则：</li>
</ol>
<pre><code class="language-bash"># 退出 chroot
exit

# 卸载已挂载的分区（递归卸载）
umount -R /mnt

# 重启
reboot</code></pre><ol start="7">
<li>BIOS 设置</li>
</ol>
<p>如果使用了 --no-nvram，只把文件放在 EFI/BOOT/BOOTX64. EFI，进入 BIOS/UEFI 设置并确保使用 “Removable media” 或将该 EFI 文件路径设为首选启动项；有些主板会自动识别。</p>
<h2>结语</h2>
<p>虽然 Linux 发行版的桌面系统感觉上手不是很 Easy，但是用起来是真爽呀。
又省资源性能又好，就是要踩的坑太多了。</p>
<p>我的踩坑历程</p>
<ul>
<li>配置好了 Niri，怎么这么卡？</li>
<li>显卡驱动怎么掉了</li>
<li>字体怎么这么丑</li>
<li>我的屏幕亮度怎么寄了</li>
<li>Xxx 组件怎么坏了</li>
<li>我输入法怎么打不了字</li>
</ul>
<p>然后，AI 真好用（</p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/tossabout/cachyos-manjaroos-grub#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">6905d3b3685d961d498f2ac1</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>Systemd学习记录</title>
    <link>https://blog.inmoe.org/posts/study/systemd-learning-record</link>
    <pubDate>Wed, 15 Oct 2025 05:51:00 GMT</pubDate>
    <description>前言

🙇观前提示：作者在撰写过程中，调整了结构数次，如有跳跃逻辑不清之处，还请谅解

作者一直在</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/study/systemd-learning-record'>https://blog.inmoe.org/posts/study/systemd-learning-record</a></blockquote>
      <h1>前言</h1>
<blockquote>
<p>🙇观前提示：作者在撰写过程中，调整了结构数次，如有跳跃逻辑不清之处，还请谅解</p>
</blockquote>
<p>作者一直在使用 <code>systemd</code> 进行管理 Linux 的进程，但是却没有去细致了解过运行原理和架构。</p>
<p>所以决定搜一搜，学一学，看一看。</p>
<blockquote>
<p>有很多前辈们讲的非常好，所以这篇文章呢，很多地方都是 <strong>CV</strong>的。</p>
</blockquote>
<h1>正文</h1>
<h2>1. 介绍</h2>
<blockquote>
<p>这里引用自<a href="https://systemd.io/">官方原话</a></p>
</blockquote>
<p>systemd 是一套 Linux 系统的基本构件。它提供了一个系统和服务管理器，作为 PID 1 运行，并启动系统的其他部分。<br>systemd 支持 SysV 和 LSB 启动脚本，并可替代 sysvinit。<br>其他部分包括日志守护进程，用于控制主机名、日期、地域等基本系统配置的实用程序，维护登录用户、运行容器和虚拟机、系统账户、运行时目录和设置的列表，以及管理简单网络配置、网络时间同步、日志转发和名称解析的守护进程。</p>
<blockquote>
<p>偷了一个图</p>
</blockquote>
<p></p>
<h2>2. 系统管理</h2>
<p><code>systemd</code> 是一组命令，设计到系统管理的方方面面</p>
<h3>2.1 systemctl</h3>
<p><code>systemctl</code> 是 Systemd 的主命令，用于管理系统。</p>
<pre><code class="language-bash"># 重启系统
$ sudo systemctl reboot

# 关闭系统，切断电源
$ sudo systemctl poweroff

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

# 启动进入救援状态（单用户状态）
$ sudo systemctl rescue</code></pre><h3>2.2 systemd-analyze</h3>
<blockquote>
<p>这个命令我还真非常少用</p>
</blockquote>
<p><code>systemd-analyze</code>命令用于查看启动耗时。</p>
<pre><code class="language-bash"># 查看启动耗时
$ systemd-analyze

# 查看每个服务的启动耗时
$ systemd-analyze blame

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service</code></pre><p>这里测试一手</p>
<p></p>
<h3>2.3 hostnamectl</h3>
<p><code>hostnamectl</code>命令用于查看当前主机的信息。</p>
<pre><code class="language-bash"># 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl hostname &lt;new-hostname&gt;</code></pre><p></p>
<h3>2.4 localectl</h3>
<p><code>localectl</code>命令用于查看本地化设置。</p>
<pre><code class="language-bash"># 查看本地化设置
$ localectl

# 设置本地化参数。
$ sudo localectl set-locale LANG=en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
$ sudo localectl set-keymap en_US</code></pre><p>说个题外话，如果把参数调整成中文的话，使用 <code>man</code> 可以很方便的查阅命令要如何使用<br>项目地址： <a href="https://github.com/man-pages-zh/manpages-zh">manpages-zh</a></p>
<pre><code class="language-bash">## 安装中文手册页包
sudo apt update
sudo apt install manpages-zh
echo -e "export LANG=zh_CN.UTF-8\nexport LC_ALL=zh_CN.UTF-8" &gt;&gt; ~/.bashrc ##写入的位置取决于你使用什么终端
source ~/.bashrc</code></pre><p>如果你只想让 man 命令显示中文，而不改变整个系统的语言设置，可以创建一个别名</p>
<blockquote>
<p>学好英语不是更好吗 (作者是语言苦手😭</p>
</blockquote>
<pre><code class="language-bash">alias cman='LANG=zh_CN.UTF-8 man'</code></pre><p>这样输入 <code>cman &lt;option&gt;</code> 就能查看对应命令的中文手册</p>
<p></p>
<h3>2.5 timedatectl</h3>
<pre><code class="language-bash"># 查看当前时区设置
$ timedatectl

# 显示所有可用的时区
$ timedatectl list-timezones
# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS</code></pre><p></p>
<blockquote>
<p>💡：其实作者的文章很多都是翘课的时候写的</p>
</blockquote>
<h3>2.6 loginctl</h3>
<p><code>loginctl</code>命令用于查看当前登录的用户。</p>
<pre><code class="language-bash"># 列出当前session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user root</code></pre><h2>3. Unit（单元）</h2>
<h3>3.1 Unit 介绍</h3>
<p>Systemd 可以管理所有系统资源。不同的资源统称为 <code>Unit（单元）</code>。</p>
<h3>3.2 Unit 的类型</h3>
<p>Unit 共分为 12 种。</p>
<table>
<thead>
<tr>
<th>单元类型</th>
<th>文件后缀</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>Service</td>
<td>.service</td>
<td>定义了系统服务，包括启动，重启，关闭服务的相关指令</td>
</tr>
<tr>
<td>Target</td>
<td>.target</td>
<td>定义了一组单元的集合，通常作为单元启动的同步点，某个target启动成功就意味着一组相关的service启动成功</td>
</tr>
<tr>
<td>Automount</td>
<td>.automount</td>
<td>定义了系统引导时会进行自动挂载的挂载点</td>
</tr>
<tr>
<td>Device</td>
<td>.device</td>
<td>定义了由systemd管理的硬件设备</td>
</tr>
<tr>
<td>Mount</td>
<td>.mount</td>
<td>定义了由systemd管理的文件系统挂载点</td>
</tr>
<tr>
<td>Path</td>
<td>.path</td>
<td>定义了一条用于基于路径激活服务的文件路径。例如，可以基于某一条文件路径的状态（是否存在等）来启动某个服务。</td>
</tr>
<tr>
<td>Scope</td>
<td>.scope</td>
<td>定义了来自systemd总线接口的信息，通常用来管理额外的系统进程</td>
</tr>
<tr>
<td>Slice</td>
<td>.slice</td>
<td>定义了资源限额，基于Linux cgroup nodes实现。</td>
</tr>
<tr>
<td>Snapshot</td>
<td>.snapshot</td>
<td>定义了一次当前的systemd状态，通常在对systemd做修改后回滚使用</td>
</tr>
<tr>
<td>Socket</td>
<td>.socket</td>
<td>定义了进程间通信使用的socket，往往socket会与service相关联</td>
</tr>
<tr>
<td>Swap</td>
<td>.swap</td>
<td>定义了系统中的交换空间</td>
</tr>
<tr>
<td>Timer</td>
<td>.timer</td>
<td>定义了一个定时激活另一个单元的定时器</td>
</tr>
</tbody></table>
<h3>3.3 Unit 之间的依赖关系</h3>
<p>Unit 之间并非孤立，它们通过依赖关系组织在一起。</p>
<p><strong>依赖关系</strong>：<code>systemd</code> 通过 <code>Wants</code> 和 <code>Requires</code> 等指令定义依赖。例如，A <code>Wants</code> B，意味着启动 A 的时候，<code>systemd</code> 也会尝试启动 B。<code>Requires</code> 则是更强的“必须”依赖。</p>
<p><strong>Target</strong>：Target 是一种特殊的 Unit，它本身不执行任何操作，而是作为一个“<strong>单元组</strong>”的引用点。例如，<code>multi-user.target</code> 包含了所有在多用户命令行模式下需要运行的服务和单元。当系统进入 <code>multi-user.target</code> 状态时，<code>systemd</code> 会确保该 Target 依赖的所有 Unit 都已启动。</p>
<h3>3.4 Target</h3>
<blockquote>
<p>查资料的时候，看到有篇文讲的很好, 这里给原话搬过来<br><a href="https://zhuanlan.zhihu.com/p/643259265">《一篇搞懂》系列之三——systemd</a><br><code>Target Unit</code> 理解起来并不难，它就是一组 <code>Units</code> 的集合。这就跟学生时代升旗仪式一样，每个班（Target）有很多学生（Units），只有当每位学生（Units）都到齐之后，这个班（Target）才允许进入操场。当所有的班（Target）都进入操场后，升旗仪式（default. Target）才会进行。<br>所以，在 systemd 架构下，<a href="https://www.freedesktop.org/software/systemd/man/bootup.html">系统的启动方式</a>可以这样理解：<strong>systemd 通过 default. Target 来启动系统，什么时候 default. Target 准备就绪，系统就认为启动成功</strong>。</p>
</blockquote>
<p>启动计算机的时候，需要启动大量的 Unit。如果每一次启动，都要一一写明本次启动需要哪些 Unit，显然非常不方便。Systemd 的解决方案就是 Target。</p>
<p>简单说，Target 就是一个 Unit 组，包含许多相关的 Unit 。启动某个 Target 的时候，Systemd 就会启动里面所有的 Unit。从这个意义上说，Target 这个概念类似于&quot;状态点&quot;，启动某个 Target 就好比启动到某种状态。</p>
<pre><code class="language-bash"># 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target

# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target

# 查看启动时的默认 Target
$ systemctl get-default

# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target

# 切换 Target 时，默认不关闭前一个 Target 启动的进程，
# systemctl isolate 命令改变这种行为，
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target</code></pre><p></p>
<h3>3.5 Unit 配置文件</h3>
<h4>3.5.1 概述</h4>
<p>在 Systemd 中，每一个 <strong>Unit</strong>（单元）都有一个配置文件，用来告诉 Systemd 该如何启动和管理这个 Unit。</p>
<blockquote>
<p>单元文件是 ini 风格的纯文本文件。封装了有关下列对象的信息： 服务 (service)、套接字 (socket)、设备 (device)、挂载点 (mount)、自动挂载点 (automount)、启动目标 (target)、交换分区或交换文件 (swap)、被监视的路径 (path)、任务计划 (timer)、资源控制组 (slice)、一组外部创建的进程 (scope)。</p>
</blockquote>
<p>我们来看看系统有哪些 <code>Unit</code>：</p>
<p><code>systemctl list-units</code> 命令可以查看当前系统的所有 Unit 。</p>
<pre><code class="language-bash"># 列出正在运行的 Unit
$ systemctl list-units

# 列出所有Unit，包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive

# 列出所有加载失败的 Unit
$ systemctl list-units --failed

# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service</code></pre><p></p>
<p>接下来，我们以 <code>nginx</code> 为例，查看其 <code>Unit</code> 的配置文件</p>
<p><code>systemctl cat &lt;unit.service&gt;</code> 可以查看配置文件：</p>
<pre><code class="language-ini"># ==============================
# Unit 部分：定义服务的基本信息和依赖关系
# ==============================
[Unit]
Description=A high performance web server and a reverse proxy server
# Description：服务的描述信息，会在 systemctl status 等命令中显示

Documentation=man:nginx(8)
# Documentation：指向帮助文档的位置，这里是 nginx 的 man 手册页

After=network-online.target remote-fs.target nss-lookup.target
# After：表示这个服务要在这些目标（其他服务）启动之后再启动
# network-online.target → 网络连接准备就绪
# remote-fs.target → 远程文件系统挂载完成
# nss-lookup.target → 主机名解析服务就绪

Wants=network-online.target
# Wants：表示这个服务希望 network-online.target 同时启动
# "Wants" 是一种弱依赖，如果目标服务失败，本服务仍会启动

# ==============================
# Service 部分：定义服务具体如何运行和管理
# ==============================
[Service]
Type=forking
# Type：服务启动类型
# forking → 父进程启动后会派生（fork）一个子进程，父进程退出，子进程继续运行

PIDFile=/run/nginx.pid
# PIDFile：记录 nginx 主进程 PID 的文件路径
# 用于 systemd 检查并控制服务状态

ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
# ExecStartPre：启动主命令前执行的命令
# 此处执行 nginx 语法检查 -t （加 -q 表示安静模式，只显示错误）

ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
# ExecStart：实际启动 nginx 的命令
# -g 参数用于临时设置运行配置（这里让 nginx 在后台运行并启用主进程管理）

ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
# ExecReload：重新加载配置时执行的命令
# -s reload 使 nginx 平滑重启，重新应用配置文件而不中断服务

ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
# ExecStop：停止服务的命令
# -（开头的减号）表示忽略命令的执行错误
# start-stop-daemon 用来发送 QUIT 信号给 nginx 主进程，最多等待 5 秒进行优雅停止

TimeoutStopSec=5
# TimeoutStopSec：等待服务结束的时间（秒），超过时间会强制杀死进程

KillMode=mixed
# KillMode：杀死进程的策略
# mixed → 同时向主进程和所有子进程发信号

# ==============================
# Install 部分：定义如何启用服务
# ==============================
[Install]
WantedBy=multi-user.target
# WantedBy：指定启用服务时创建符号链接的目标
# multi-user.target → 表示在多用户命令行（非图形模式）环境下启动
# 这也是常见的默认运行级别</code></pre><p>从上文可以看出，配置文件主要分为三个区块，内容以键值对呈现。</p>
<p>以下为 <code>Unit</code> 配置文件的详细介绍文章：</p>
<ul>
<li><a href="https://www.jinbuguo.com/systemd/systemd.unit.html#id-1.10">Unit</a></li>
<li><a href="https://www.jinbuguo.com/systemd/systemd.service.html#">Service</a></li>
<li><a href="https://www.jinbuguo.com/systemd/systemd.unit.html#id-1.12">Install</a></li>
</ul>
<h4>3.2.2 Unit 配置文件存储的位置</h4>
<p>Systemd 默认会从目录 <code>/etc/systemd/system/</code> 读取配置文件。不过，这个目录中的很多文件并不是实际的配置内容，而是 <strong>符号链接</strong>（快捷方式），它们指向 <code>/usr/lib/systemd/system/</code> 目录中的真正配置文件。</p>
<ul>
<li><code>/usr/lib/systemd/system/</code> → 存放系统提供的、真实的服务配置文件  </li>
<li><code>/etc/systemd/system/</code> → 存放用户或系统在运行时创建的符号链接（以及可能的自定义文件）、  <ul>
<li><code>./system/</code> 启动系统服务（数据库、Web、网络服务）如: <code>nginx</code>  </li>
<li><code>./user/</code> 运行用户脚本、桌面程序自动启动、会话守护进程如: <code>my-script.sh</code></li>
</ul>
</li>
</ul>
<h4>3.2.3 Unit 的格式</h4>
<p>单元配置文件这里只做部分的简述，这里可以去到详细介绍的<a href="https://www.jinbuguo.com/systemd/systemd.unit.html#id-1.10">文章</a></p>
<p><code>systemctl cat</code> 命令可以查看配置文件的内容。</p>
<pre><code class="language-bash">root@test-orb-debian:~ # systemctl cat ssh
# /lib/systemd/system/ssh.service
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service</code></pre><p><code>systenctl edit</code> 可以覆盖更改</p>
<h3>3.4 Unit 配置文件的状态</h3>
<p>我们可以使用 <code>systemctl list-unit-files</code> 命令用于列出所有配置文件。<br>列表会显示出各种配置文件及状态。</p>
<p>但是具体状态需要使用 <code>systemctl status</code> 进行查看。</p>
<p></p>
<hr>
<pre><code class="language-bash"># 列出所有配置文件
$ systemctl list-unit-files

# 列出serivce类型的配置文件
$ systemctl list-unit-files --type=service</code></pre><p>配置文件的各种状态：</p>
<table>
<thead>
<tr>
<th>状态</th>
<th>含义</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td><strong>enabled</strong></td>
<td>启用</td>
<td>在对应 target 下有符号链接，开机自动启动</td>
</tr>
<tr>
<td><strong>enabled-runtime</strong></td>
<td>临时启用</td>
<td>链接在 <code>/run/systemd/system</code> 下，重启后消失</td>
</tr>
<tr>
<td><strong>linked</strong></td>
<td>链接启用</td>
<td>unit 不在标准路径下，而是被符号链接到 systemd 搜索路径中（持久）</td>
</tr>
<tr>
<td><strong>linked-runtime</strong></td>
<td>临时链接启用</td>
<td>同上，但临时（位于 <code>/run/systemd/system</code>）</td>
</tr>
<tr>
<td><strong>disabled</strong></td>
<td>禁用</td>
<td>没有符号链接到任何 target，需要手动启动</td>
</tr>
<tr>
<td><strong>static</strong></td>
<td>静态</td>
<td>无 <code>[Install]</code> 段，无法直接 enable/disable，仅作为依赖启动</td>
</tr>
<tr>
<td><strong>masked</strong></td>
<td>屏蔽</td>
<td>unit 文件被符号链接到 <code>/dev/null</code> 永久禁止启动</td>
</tr>
<tr>
<td><strong>masked-runtime</strong></td>
<td>临时屏蔽</td>
<td>屏蔽符号链接在 <code>/run/systemd/system</code>，重启后恢复</td>
</tr>
<tr>
<td><strong>alias</strong></td>
<td>别名</td>
<td>该 unit 是另一个 unit 的别名（常见于服务提供者）</td>
</tr>
<tr>
<td><strong>generated</strong></td>
<td>生成的</td>
<td>由 systemd 动态从其它配置生成的 unit，通常存放在 <code>/run/systemd/generator.*</code></td>
</tr>
<tr>
<td><strong>transient</strong></td>
<td>临时单元</td>
<td>运行时通过 D-Bus/systemd-run 创建，存活到运行结束</td>
</tr>
<tr>
<td><strong>bad</strong></td>
<td>无效</td>
<td>单元文件无效或损坏（配置格式错误、文件不存在等）</td>
</tr>
</tbody></table>
<h2>4. Unit 的管理</h2>
<h3>4.1 实践：创建并管理一个自己的服务</h3>
<p><del>多说无益</del>，让我们动手实操，写一个试试</p>
<h4>4.1.1 创建 Unit 配置文件</h4>
<p>路径： <code>/etc/systemd/system/simplehttp.service</code></p>
<pre><code class="language-ini">[Unit]
Description=My Simple HTTP Service

[Service]
ExecStart=/usr/bin/python3 -m http.server 8888
Restart=on-failure

[Install]
WantedBy=multi-user.target</code></pre><p>这是一个使用 <code>python3</code> 在 8888 端口启动 http 服务的配置文件。</p>
<h4>4.1.2 管理服务生命周期</h4>
<p>刚刚我们写了一个用于测试的 <code>Unit</code> 配置，但是还没有启动</p>
<p>现在我们要先手动使用 <code>systemctl daemon-reload</code> 加载配置<br>然后查看一下 systemd 是否已经读取到</p>
<pre><code class="language-bash">root@test-orb-debian:~ # sudo systemctl list-units -all -t service | grep simple
  simplehttp.service                   loaded    inactive dead    My Simple HTTP Service</code></pre><p>可以看到，服务已经加载进来了 <code>(loaded)</code>，且并没有启动 <code>(inactive dead)</code>，此外，我们还可以看到我们给服务写的描述 <code>(My Simple HTTP Service)</code>。</p>
<ul>
<li>想要服务立即启动<ul>
<li><code>systemctl start &lt;servicename&gt;</code></li>
</ul>
</li>
<li>设置开机自启并立即启动<ul>
<li><code>systemctl enable --now &lt;servicename&gt;</code></li>
</ul>
</li>
<li>查看服务状态<ul>
<li><code>systemctl status &lt;servicename&gt;</code></li>
</ul>
</li>
</ul>
<p>我们测试一下，可以清晰看到各种状态：</p>
<pre><code class="language-bash">root@test-orb-debian:~ # systemctl disable simplehttp.service
Removed "/etc/systemd/system/multi-user.target.wants/simplehttp.service".
root@test-orb-debian:~ # systemctl enable simplehttp.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/simplehttp.service → /etc/systemd/system/simplehttp.service.
root@test-orb-debian:~ # systemctl status simplehttp.service
● simplehttp.service - My Simple HTTP Service
     Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Tue 2025-10-14 21:16:45 CST; 9min ago
   Main PID: 8430 (python3)
      Tasks: 1 (limit: 9593)
     Memory: 13.2M
        CPU: 227ms
     CGroup: /system.slice/simplehttp.service
             └─8430 /usr/bin/python3 -m http.server 8888

10月 14 21:16:45 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.</code></pre><h4>4.1.3 测试服务</h4>
<p>服务启动了就测试一手</p>
<pre><code class="language-bash">root@test-orb-debian:~ # systemctl start simplehttp
root@test-orb-debian:~ # systemctl status simplehttp
● simplehttp.service - My Simple HTTP Service
     Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Tue 2025-10-14 21:49:41 CST; 7s ago
   Main PID: 10090 (python3)
      Tasks: 1 (limit: 9593)
     Memory: 21.9M
        CPU: 56ms
     CGroup: /system.slice/simplehttp.service
             └─10090 /usr/bin/python3 -m http.server 8888

10月 14 21:49:41 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
root@test-orb-debian:~ # netstat -ltpn | grep 8888
tcp        0      0 0.0.0.0:8888            0.0.0.0:*               LISTEN      10090/python3
root@test-orb-debian:~ # curl localhost:8888
&lt;!DOCTYPE HTML&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;title&gt;Directory listing for /&lt;/title&gt;
...</code></pre><p>接着我们使用 <code>systemctl status</code>, 可以发现一条日志, 到此我们已经完成了一个 <code>Unit</code> 的配置。</p>
<pre><code class="language-bash">10月 14 21:49:41 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.
10月 14 21:50:14 test-orb-debian python3[10090]: 127.0.0.1 - - [14/Oct/2025 21:50:14] "GET / HTTP/1.1" 200 -</code></pre><h4>4.1.4 修改服务</h4>
<p><strong>📌 属性写入后，如果想持久保存，建议通过 <code>systemctl edit</code> 写入 override. Conf；否则可能在重启 systemd 后丢失。</strong></p>
<p>以 <code>simplehttp</code> 为例：<br><code>systemctl edit simplehttp</code> 会创建一个覆盖文件 <code>/etc/systemd/system/simplehttp.service.d/override.conf</code> 并在文本编辑器中打开它。你添加到该文件中的任何内容都将<strong>添加到</strong>现有的服务文件中。</p>
<p>添加自定义配置，例如</p>
<pre><code class="language-ini">[Service]
ExecStartPost=/bin/echo "HTTP 服务已经启动在 8888 端口"</code></pre><p></p>
<p>检查一下：</p>
<pre><code class="language-bash">root@test-orb-debian:~ # systemctl cat simplehttp
# /etc/systemd/system/simplehttp.service
[Unit]
Description=My Simple HTTP Service

[Service]
ExecStart=/usr/bin/python3 -m http.server 8888
Restart=on-failure

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/simplehttp.service.d/override.conf
[Service]
ExecStartPost=/bin/echo "HTTP 服务已经启动在 8888 端口"</code></pre><p>要替换可多次设置的选项，必须先清除该选项，否则覆盖文件将第二次添加该选项。</p>
<pre><code class="language-ini">[Service]
ExecStart=
ExecStart=&lt;new command&gt;</code></pre><p>保存文件。<code>systemd</code> 会自动加载新的服务配置。</p>
<p>之后使用 <code>systemd restart</code> 重启服务即可</p>
<p></p>
<blockquote>
<p>⚠️：如果要完全替换服务<br>使用 <code>systemctl edit --full</code> ，例如 <code>systemctl edit --full simplehttp.service</code> 。这样会创建 <code>/etc/systemctl/system/simplehttp.service</code> ，取代现有的服务文件。</p>
</blockquote>
<h3>4.2 Unit 的部分常用命令</h3>
<table>
<thead>
<tr>
<th><code>systemd</code>命令</th>
<th>作用</th>
</tr>
</thead>
<tbody><tr>
<td><code>enable</code></td>
<td>设置开机自动启动</td>
</tr>
<tr>
<td><code>disable</code></td>
<td>取消开机自动启动</td>
</tr>
<tr>
<td><code>start</code></td>
<td>立即启动</td>
</tr>
<tr>
<td><code>stop</code></td>
<td>立即停止</td>
</tr>
<tr>
<td><code>restart</code></td>
<td>停止并重启</td>
</tr>
<tr>
<td><code>kill</code></td>
<td>杀死服务及子进程</td>
</tr>
<tr>
<td><code>reload</code></td>
<td>不停止服务，重新加载配置（服务需支持）</td>
</tr>
<tr>
<td><code>daemon-reload</code></td>
<td>systemd 重新读取修改过的 Unit 文件</td>
</tr>
<tr>
<td><code>status</code></td>
<td>查看运行状态和日志</td>
</tr>
<tr>
<td><code>show</code></td>
<td>查看所有底层属性</td>
</tr>
<tr>
<td><code>set-property</code></td>
<td>动态设置属性</td>
</tr>
<tr>
<td><code>journalctl -u</code></td>
<td>查看服务日志</td>
</tr>
</tbody></table>
<h4>1. 管理服务开机启动</h4>
<pre><code class="language-bash"># 设置开机启动该服务（Enable 会创建符号链接到对应 target 的 wants 目录）
sudo systemctl enable simplehttp.service

# 取消开机启动（Disable 会删除符号链接）
sudo systemctl disable simplehttp.service

# 设置开机启动该服务并立即启动
sudo systemctl enable simplehttp.service --now</code></pre><p>示例：</p>
<pre><code class="language-bash">root@test-orb-debian:~ # systemctl disable simplehttp.service
Removed "/etc/systemd/system/multi-user.target.wants/simplehttp.service".
root@test-orb-debian:~ # systemctl enable simplehttp.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/simplehttp.service → /etc/systemd/system/simplehttp.service.
root@test-orb-debian:~ # systemctl status simplehttp.service
● simplehttp.service - My Simple HTTP Service
     Loaded: loaded (/etc/systemd/system/simplehttp.service; enabled; preset: enabled)
    Drop-In: /run/systemd/system/service.d
             └─zzz-lxc-service.conf
     Active: active (running) since Tue 2025-10-14 21:16:45 CST; 9min ago
   Main PID: 8430 (python3)
      Tasks: 1 (limit: 9593)
     Memory: 13.2M
        CPU: 227ms
     CGroup: /system.slice/simplehttp.service
             └─8430 /usr/bin/python3 -m http.server 8888

10月 14 21:16:45 test-orb-debian systemd[1]: Started simplehttp.service - My Simple HTTP Service.</code></pre><p>📌 <strong>注意</strong>：<code>enable</code> / <code>disable</code> 改的是<strong>开机时自动启动与否</strong>，不影响当前是否正在运行。<br>要立即启动，需要用 <code>start</code>。</p>
<h4>2. 启动 / 停止 / 重启 / 杀死</h4>
<pre><code class="language-bash"># 立即启动服务
sudo systemctl start simplehttp.service

# 立即停止服务
sudo systemctl stop simplehttp.service

# 重启服务
sudo systemctl restart simplehttp.service

# 杀死该服务的所有子进程（类似于强制终止）
sudo systemctl kill simplehttp.service</code></pre><p>📌 <code>kill</code> 会根据 Unit 配置里的 <code>KillMode</code> 决定是杀掉主进程还是全部子进程（默认是全部）。</p>
<h4>3. 重新加载配置</h4>
<pre><code class="language-bash"># 让服务重新加载自己的配置文件，不停止进程（需要服务支持 reload）
sudo systemctl reload simplehttp.service

# 当 Unit 文件或 override.conf 修改过时，重载 systemd 自己的配置数据库
sudo systemctl daemon-reload</code></pre><p>📌 <strong>注意</strong>：<code>reload</code> 是让服务自己重新读配置，<code>daemon-reload</code> 是让 <strong>systemd</strong> 本身重新读 Unit 文件。如果你改了 Unit 文件，一定要 <code>daemon-reload</code>。</p>
<h4>4. 查看服务信息</h4>
<pre><code class="language-bash"># 显示该服务 Unit 的完整运行时属性（所有字段）
systemctl show simplehttp.service

# 只查看某个指定属性的值（例如 CPU 共享权重）
systemctl show -p CPUShares simplehttp.service

# 人类可读的状态摘要（最常用）
systemctl status simplehttp.service</code></pre><p>📌 <code>status</code> 会给你当前运行状态、进程 ID、日志信息；<code>show</code> 适合脚本解析。</p>
<p>除了 <code>status</code> 命令，<code>systemctl</code> 还提供了三个查询状态的简单方法，主要供脚本内部的判断语句使用。</p>
<pre><code class="language-bash"># 显示某个 Unit 是否正在运行
$ systemctl is-active application.service
# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service
# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service</code></pre><h4>5. 修改运行时属性</h4>
<pre><code class="language-bash"># 设置某个 Unit 的指定属性（立即生效，可选持久化）
sudo systemctl set-property simplehttp.service CPUShares=500</code></pre><p><strong>📌 属性写入后，如果想持久保存，建议通过 <code>systemctl edit</code> 写入 override. Conf；否则可能在重启 systemd 后丢失。</strong></p>
<h4>6. 其他常用补充命令</h4>
<pre><code class="language-bash"># 查看该服务的最近日志（由 journald 保存）
journalctl -u simplehttp.service

# 持续跟踪日志输出（类似 tail -f）
journalctl -u simplehttp.service -f

# 检查当前服务是否已启用开机启动
systemctl is-enabled simplehttp.service

# 检查服务是否正在运行
systemctl is-active simplehttp.service

# 列出当前所有已启动的服务
systemctl list-units --type=service --state=running

# 查找一个服务的文件路径（在哪个目录）
systemctl cat simplehttp.service</code></pre><h4>7. 总结</h4>
<p><code>enable</code> / <code>disable</code> 管开机启动，<code>start</code> / <code>stop</code> / <code>restart</code> 管当前状态，<code>reload</code> / <code>daemon-reload</code> 管配置刷新，<code>show</code> / <code>set-property</code> 管属性配置。日志用 <code>journalctl -u</code> 查。</p>
<p><code>systemctl status</code> 命令用于查看系统状态和单个 Unit 的状态。</p>
<pre><code class="language-bash"># 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ sysystemctl status sshd.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H test@blog.inmoe.org status httpd.service</code></pre><p></p>
<h2>5. Journalctl日志服务</h2>
<blockquote>
<p> 一个合格的程序员要学会看日志</p>
</blockquote>
<p>Systemd 统一管理所有 Unit 的启动日志。带来的好处就是，可以只用 <code>journalctl</code> 一个命令，查看所有日志（内核日志和应用日志）。</p>
<p><strong>日志的配置文件是</strong><code>/etc/systemd/journald.conf</code>。</p>
<pre><code class="language-bash"># 查看所有日志（默认情况下 ，只保存本次启动的日志）
$ sudo journalctl

# 查看内核日志（不显示应用日志）
$ sudo journalctl -k

# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

# 查看上一次启动的日志（需更改设置）
$ sudo journalctl -b -1

# 查看指定时间的日志
$ sudo journalctl --since="2025-10-1 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2025-10-1" --until "2025-10-5 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
$ sudo journalctl -n

# 显示尾部指定行数的日志
$ sudo journalctl -n 20

# 实时滚动显示最新日志
$ sudo journalctl -f

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

# 查看指定进程的日志
$ sudo journalctl _PID=1

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级（及其以上级别）的日志，共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b

# 日志默认分页输出，--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

# 以 JSON 格式（单行）输出
$ sudo journalctl -b -u nginx.service -o json

# 以 JSON 格式（多行）输出，可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years</code></pre><h1>思考</h1>
<p>回顾过去，我写文章更多是为了<strong>记录</strong>——记录当时的思路，或者简单记下自己学到的知识。很多时候，并不是我已经真正理解透了，而只是先把东西写下来。</p>
<p>这次写文的过程让我有坡有些“便秘”。一边查资料，一边码字，写着写着就发现：前辈的文章写得真好，不知不觉就开始“这里搬一点，那里抄一点”。结果，文章缺少了属于我自己的主线和思考。</p>
<p>写到一半时，感觉越来越不对劲。于是我决定停下手来，把相关的内容全部重新梳理一遍——从头阅读、理解，再结合自己的思路和记忆，把文章重写。</p>
<p>当我最终用自己的话写出来时，过程虽然慢，但收获很大。不仅对内容理解得更深，也更清楚地意识到：写作不仅是记录，更是一次<strong>重新思考与内化</strong>的过程。</p>
<blockquote>
<p>真得多写字，多社交，多说话。作者已经到了表达不出来自己的话，有时候需要 ai 润色表达出来了😭
明明我是 <code>ENFP</code> 啊，怎么变成小阿宅了</p>
</blockquote>
<p>码字学东西的时候还有个很重要的点，一定要多查资料翻资料，官方 Wiki 的东西很多时都写的非常棒！参考别人的文章，终究是吸取别人的理解，而不是自己的理解。</p>
<p><del>希望我也能做到写文引人入胜，一层套一层。</del></p>
<p>写草稿，写大纲是对的）</p>
<h1>参考致谢</h1>
<ul>
<li><a href="https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html">Systemd 入门教程：命令篇 #阮一峰</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/643259265">《一篇搞懂》系列之三——systemd#祁祁不正经</a></li>
<li><a href="https://www.jinbuguo.com/systemd/systemd.service.html#">systemd.service 中文手册</a></li>
<li><a href="https://www.freedesktop.org/software/systemd/man/latest/bootup.html">freedesktop.org</a></li>
<li><a href="https://docs.fedoraproject.org/en-US/quick-docs/systemd-understanding-and-administering/">Understanding and administering systemd</a></li>
</ul>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/study/systemd-learning-record#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68ef3644685d961d498efd3a</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>VMware下ArchLinux的安装与配置</title>
    <link>https://blog.inmoe.org/posts/study/a-record-of-archlinux-installation-and-configuration</link>
    <pubDate>Sun, 12 Oct 2025 06:34:44 GMT</pubDate>
    <description>本文仅为作者记录备忘使用，还原作者安装时思路环境，实际配置请结合自身环境修正

前言

作者在使用了</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/study/a-record-of-archlinux-installation-and-configuration'>https://blog.inmoe.org/posts/study/a-record-of-archlinux-installation-and-configuration</a></blockquote>
      <blockquote>
<p>本文仅为作者记录备忘使用，还原作者安装时思路环境，实际配置请结合自身环境修正</p>
</blockquote>
<h1>前言</h1>
<p>作者在使用了 macOS 后，深感类 unix 系统的 gooood 之处，决定加入 Arch-Linux 神教，所以开始了这个折腾之旅。</p>
<p>由于早有 ArchLinux &quot;难入门的耳闻&quot;，所以准备先在虚拟机上试一下，避免火葬场。</p>
<h1>正文</h1>
<h2>1. VMware 虚拟机安装</h2>
<p>真的以为我会写 VMware 怎么安装吗？</p>
<p>哈哈</p>
<blockquote>
<p>补充一下：VMware 记得调整一下网络设置<br>编辑 -&gt; 🛜虚拟网络编辑器</p>
</blockquote>
<blockquote>
<p>新建的虚拟机中，网络如果有问题的话，也要自己手动调整一下。
虚拟机 -&gt; 设置 -&gt; 网络适配器
<a href="https://zhuanlan.zhihu.com/p/372409764">参考教程</a></p>
</blockquote>
<p>还有个槽点：</p>
<p>VMware 安装后，默认的启动方式应该是 <strong>BIOS</strong> 启动。
现在的挺多教程应该都是 UEFI 启动，所以要注意下（因为没注意看跟着教程翻车了）。</p>
<blockquote>
<p>虚拟机 -&gt; 设置 -&gt; 选项 -&gt; 高级 -&gt; 固件类型 -&gt; UEFI</p>
</blockquote>
<h2>2. ArchLinux 安装</h2>
<ul>
<li>官方 Wiki：<a href="https://wiki.archlinux.org">https://wiki.archlinux.org</a></li>
<li>官方 Wiki (CN)：<a href="https://www.archlinuxcn.org">https://www.archlinuxcn.org</a></li>
<li>作者跟着的教程：<a href="https://arch.icekylin.online/guide/rookie/basic-install">https://arch.icekylin.online/guide/rookie/basic-install</a></li>
</ul>
<h3>1. 进入安装环境</h3>
<p>如果是 <strong>UEFI</strong> 启动的话，正常的启动是这样的：</p>
<p></p>
<h3>2. 确定是否为 UEFI 模式</h3>
<p>作者这一步没有确认好，所以上一次的安装翻车了。</p>
<pre><code class="language-bash">ls /sys/firmware/efi/efivars</code></pre><p></p>
<h3>3. 禁用 reflector 服务</h3>
<p>这里按照教程的原话：</p>
<blockquote>
<p>2020 年，archlinux 安装镜像中加入了 <code>reflector</code> 服务，它会自己更新 <code>mirrorlist</code>（软件包管理器 <code>pacman</code> 的软件源）。在特定情况下，它会误删某些有用的源信息。
这里进入安装环境后的第一件事就是将其禁用。也许它是一个好用的工具，但是很明显，因为地理上造成的特殊网络环境，这项服务并不适合启用。</p>
</blockquote>
<pre><code class="language-bash">systemctl stop reflector.service
systemctl status reflector.service</code></pre><p>当然，有条件的宝宝可以配置一下代理。</p>
<blockquote>
<p>什么？ 你问我哪里来的代理？
没准翻翻我前面的文章能看出来点什么端倪。</p>
</blockquote>
<pre><code class="language-bash">export https_proxy=http://127.0.0.1:6152
export http_proxy=http://127.0.0.1:6152
export all_proxy=socks5://127.0.0.1:6153</code></pre><h3>4. 测试网络联通性</h3>
<p>这还用说吗哈哈（</p>
<pre><code class="language-bash">ping www.baidu.com</code></pre><h3>5. 更新系统时钟</h3>
<pre><code class="language-bash">timedatectl set-ntp true  # 将系统时间与网络时间进行同步
timedatectl status        # 检查服务状态</code></pre><p></p>
<h3>6. 更换国内软件源</h3>
<p>输入以下命令进行编辑：</p>
<blockquote>
<p>由于是虚拟机环境，所以这里图方便就直接编辑了。
生产环境建议先备份后操作！</p>
</blockquote>
<pre><code class="language-bash">vim /etc/pacman.d/mirrorlist</code></pre><p>部分常用的国内源：</p>
<pre><code class="language-text">Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch # 中国科学技术大学开源镜像站
Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch # 清华大学开源软件镜像站
Server = https://repo.huaweicloud.com/archlinux/$repo/os/$arch # 华为开源镜像站
Server = http://mirror.lzu.edu.cn/archlinux/$repo/os/$arch # 兰州大学开源镜像站</code></pre><h3>7. 硬盘分区</h3>
<h4>7.1 分区</h4>
<p>这里按照教程使用 <code>Btrfs</code> 文件系统。</p>
<p>我们按照 ArchWiki 上的教程，一般来说需要三个分区（根目录和用户主目录视作一个就好了）：</p>
<ul>
<li><code>/</code> 根目录</li>
<li><code>/home</code> 用户主目录</li>
<li><code>/boot</code> EFI 分区</li>
<li><code>[SWAP]</code> 分区</li>
</ul>
<p>我们首先使用 <code>lsblk</code> 进行查看下硬盘：
</p>
<p>我们需要使用 <code>nvme0n1</code> 这一硬盘安装。</p>
<pre><code class="language-bash">cfdisk /dev/nvme0n1</code></pre><p>创建三个分区如下：</p>
<p></p>
<p>之后使用 <code>fdisk -l</code> / <code>lsblk</code> 进行查看分区的情况：</p>
<p></p>
<h4>7.2 格式化并创建 Btrfs 子卷</h4>
<p>首先格式化 EFI 分区：</p>
<pre><code class="language-bash">mkfs.fat -F32 /dev/nvmexn1p1</code></pre><blockquote>
<p>虚拟机才可以这么干，双系统一般 EFI 分区已经有系统的文件了。</p>
</blockquote>
<p>格式化 Swap 分区：</p>
<pre><code class="language-bash">mkswap /dev/nvmexn1p1</code></pre><p></p>
<p>格式化 Btrfs 分区：</p>
<pre><code class="language-bash">mkfs.btrfs -L arch /dev/nvme0n1p3</code></pre><p></p>
<p>创建子卷，把 <code>Btrfs</code> 分区挂载到 <code>/mnt</code> 下, 再使用 <code>df -h</code> 查看下挂载情况：</p>
<pre><code class="language-bash">mount -t btrfs -o compress=zstd /dev/nvme0n1p3 /mnt</code></pre><p></p>
<p>通过以下命令创建两个 <code>Btrfs</code> 子卷，之后将分别挂载到 <code>/</code> 根目录和 <code>/home</code> 用户主目录：</p>
<pre><code class="language-bash">btrfs subvolume create /mnt/@      # 创建 / 目录子卷
btrfs subvolume create /mnt/@home  # 创建 /home 目录子卷
btrfs subvolume list -p /mnt     # 查看子卷情况</code></pre><p></p>
<p>子卷创建好后，将 <code>/mnt</code> 卸载掉，以挂载子卷：</p>
<pre><code class="language-bash">umount /mnt</code></pre><h3>8. 挂载</h3>
<p>挂载有顺序，需要从根目录开始挂载。</p>
<pre><code class="language-bash">mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p3 /mnt          # 挂载 / 目录
mkdir /mnt/home                                                       # 创建 /home 目录
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p3 /mnt/home # 挂载 /home 目录
mkdir -p /mnt/boot                                                    # 创建 /boot 目录
mount /dev/nvmexn1pn /mnt/boot                                        # 挂载 /boot 目录
swapon /dev/nvmexn1pn                                                 # 挂载交换分区</code></pre><p>然后使用 <code>df -h</code> 查看挂载情况：</p>
<p></p>
<p>再使用 <code>free -h</code> 查看下 Swap 的情况：</p>
<p></p>
<h3>9. 安装系统</h3>
<p>安装系统：</p>
<pre><code class="language-bash"># 如果使用 btrfs 文件系统，额外安装一个 btrfs-progs 包
pacstrap /mnt base base-devel linux linux-firmware btrfs-progs</code></pre><p>安装基础组件：</p>
<pre><code class="language-bash">pacstrap /mnt networkmanager vim sudo zsh zsh-completions</code></pre><h3>10. 生成 fstab 文件</h3>
<p><code>fstab</code> 用来定义磁盘分区。它是 Linux 系统中重要的文件之一。使用 <code>genfstab</code> 自动根据当前挂载情况生成并写入 <code>fstab</code> 文件：</p>
<pre><code class="language-bash">genfstab -U /mnt &gt; /mnt/etc/fstab</code></pre><p>检查一下：</p>
<pre><code class="language-bash">cat /mnt/etc/fstab</code></pre><p></p>
<h3>11. 切换到新系统</h3>
<pre><code class="language-bash">arch-chroot /mnt</code></pre><h2>3. 新系统的设置</h2>
<h3>1. 设置主机名与时区</h3>
<pre><code class="language-bash">vim /etc/hostname
vim /etc/hosts</code></pre><p>设置时区：</p>
<pre><code class="language-bash">ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</code></pre><p>硬件时间设置：</p>
<pre><code class="language-bash">hwclock --systohc</code></pre><h3>2. 设置 Locale (语言)</h3>
<p>编辑 <code>/etc/locale.gen</code> 文件：</p>
<pre><code class="language-bash">vim /etc/locale.gen</code></pre><p>取消以下行的注释：</p>
<pre><code class="language-text">en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8</code></pre><p>然后生成 locale：</p>
<pre><code class="language-bash">locale-gen</code></pre><p>向 <code>/etc/locale.conf</code> 输入内容：</p>
<pre><code class="language-bash">echo 'LANG=en_US.UTF-8' &gt; /etc/locale.conf</code></pre><h3>3. 为 root 用户设置密码</h3>
<pre><code class="language-bash">passwd root</code></pre><h3>4. 安装引导程序</h3>
<p>安装引导程序对应的包：</p>
<pre><code class="language-bash">pacman -S grub efibootmgr os-prober</code></pre><p>安装 <code>GRUB</code> 到 <code>EFI</code> 分区：</p>
<pre><code class="language-bash">grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH</code></pre><p>编辑 <code>grub</code>：</p>
<pre><code class="language-bash">vim /etc/default/grub</code></pre><p>进行如下修改：</p>
<ul>
<li>去掉 <code>GRUB_CMDLINE_LINUX_DEFAULT</code> 一行中最后的 <code>quiet</code> 参数</li>
<li>把 <code>loglevel</code> 的数值从 <code>3</code> 改成 <code>5</code>。这样是为了后续如果出现系统错误，方便排错</li>
<li>加入 <code>nowatchdog</code> 参数，这可以显著提高开关机速度</li>
</ul>
<p>生成 <code>GRUB</code> 所需的配置文件：</p>
<pre><code class="language-bash">grub-mkconfig -o /boot/grub/grub.cfg</code></pre><p></p>
<h3>5. 完成安装</h3>
<pre><code class="language-bash">exit
umount -R /mnt
reboot</code></pre><h3>6. 进入系统后的设置</h3>
<p>密码账号就是刚刚设置的。</p>
<p>当然，更推荐再创建一个非 root 用户进行操作。</p>
<pre><code class="language-bash">systemctl enable --now NetworkManager # 启用网络
ping www.baidu.com</code></pre><p></p>
<p>我们也可以安装一个&quot;必玩&quot;项目：</p>
<pre><code class="language-bash">pacman -S fastfetch</code></pre><p></p>
<p>恭喜你，已经安装好 ArchLinux 啦～</p>
<h1>结语</h1>
<p><del>其实没什么想说的</del>，只是在折腾的路上，记录一下自己的学习过程。<br>学习永无止境。</p>
<h1>参考致谢</h1>
<ul>
<li><a href="https://wiki.archlinux.org">Arch Linux 官方 Wiki</a></li>
<li><a href="https://www.archlinuxcn.org">Arch Linux 中文社区 Wiki</a></li>
<li><a href="https://arch.icekylin.online/guide">Arch Linux 安装指南</a></li>
</ul>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/study/a-record-of-archlinux-installation-and-configuration#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68eb4c04685d961d498ef0ea</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  <item>
    <title>领口微湿的博客迁移翻车记录：Mix-Space博客认证</title>
    <link>https://blog.inmoe.org/posts/record/fix-login-issue-after-server-migration-by-editing-database</link>
    <pubDate>Sat, 20 Sep 2025 14:55:13 GMT</pubDate>
    <description>😫 背景：一次“轻车熟路”的服务器迁移事故
最近，我在 Netcup 购买的服务器快到期了，于是我</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/record/fix-login-issue-after-server-migration-by-editing-database'>https://blog.inmoe.org/posts/record/fix-login-issue-after-server-migration-by-editing-database</a></blockquote>
      <h2>😫 背景：一次“轻车熟路”的服务器迁移事故</h2>
<p>最近，我在 Netcup 购买的服务器快到期了，于是我决定把我的博客迁移一下，顺便换个新域名。  </p>
<p>之前已经折腾过一两次了，本以为这次会是轻车熟路，结果... (￣▽￣)&quot;. </p>
<p>在迁移域名的时候，我犯了个致命的错误：<strong>忘记修改 <code>.env</code> 文件里的域名了，同时也忘了更新认证服务里的域名</strong>。  </p>
<p>这就很严重了！😱 在我一顿“骚操作”之后，我发现自己彻底登录不了博客后台了。  </p>
<p>无奈之下，我决定“曲线救国”，回到旧服务器上看看能不能修复。结果你猜怎么着？ </p>
<p>居然还是认证失败！Σ(っ °Д °;)っ 我在 GitHub OAuth 应用里把域名改了也无济于事。</p>
<p>x=x有点慌。。。</p>
<p>冷静下来想了想，认证相关的信息应该都存储在数据库里。那么，直接“动刀”数据库或许是唯一的办法了。  </p>
<h2>🚀 流程：手把手教你“修正”数据库</h2>
<h3>📦 第一步：备份！备份！备份！</h3>
<p>重要的事情说三遍！在进行任何危险操作之前，一定要先备份。</p>
<p>备份主要有两种方式：</p>
<ol>
<li><p><strong>“通通打包带走”</strong>：将整个项目目录打包。简单粗暴，我喜欢！</p>
</li>
<li><p><strong>Mix-Space 自带备份</strong>：备份 <code>~/data/mx-space/backup</code> 目录。</p>
<blockquote>
<p><del>理论上只备份这个目录就足够了。</del></p>
</blockquote>
</li>
</ol>
<p>备份完成后，就可以开始我们的“手术”了。</p>
<h3>🔧 第二步：深入数据库容器</h3>
<p>我的博客是使用 <code>docker-compose</code> 部署的，所以接下来的操作都将基于 <code>docker-compose</code>。</p>
<p>这是我的 <code>docker-compose.yml</code> 中 <code>mongo</code> 服务的部分配置：</p>
<pre><code class="language-yaml">mongo:
  container_name: mongo
  image: mongo
  volumes:
    - ./data/db:/data/db
  networks:
    - mx-space
  restart: unless-stopped</code></pre><p>通过 <code>docker ps</code> 可以看到正在运行的容器：</p>
<pre><code class="language-bash">Shiroi      ghcr.io/incohua/shiroi:latest   "docker-entrypoint.s…"   shiro     16 minutes ago   Up 15 minutes             127.0.0.1:2323-&gt;2323/tcp, [::]:2323-&gt;2323/tcp
mongo       mongo                           "docker-entrypoint.s…"   mongo     16 minutes ago   Up 15 minutes             27017/tcp
mx-server   innei/mx-server:latest          "./docker-entrypoint…"   app       16 minutes ago   Up 15 minutes (healthy)   127.0.0.1:2333-&gt;2333/tcp, [::]:2333-&gt;2333/tcp
redis       redis:alpine                    "docker-entrypoint.s…"   redis     16 minutes ago   Up 15 minutes (healthy)   6379/tcp</code></pre><p>接下来，我们进入 <code>mongo</code> 容器的 <code>bash</code> 环境：</p>
<pre><code class="language-bash">docker compose exec mongo bash</code></pre><h3>🔍 第三步：定位并修改认证设置</h3>
<p>成功进入容器后，我们使用 <code>mongosh</code> 连接到数据库：</p>
<pre><code class="language-bash">root@592e3cc53c54:/# mongosh
Current Mongosh Log ID: 68cebxxxxxf87fd
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.8
Using MongoDB:          8.0.13
Using Mongosh:          2.5.8

For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/</code></pre><p>输入 <code>show dbs</code> 查看所有的数据库：</p>
<pre><code class="language-bash">test&gt; show dbs
admin      40.00 KiB
config    108.00 KiB
local      72.00 KiB
mx-space    2.39 MiB
test&gt;```

`mx-space` 显然就是我们的目标数据库啦！( •̀ ω •́ )✧

切换到 `mx-space` 数据库，并使用 `show collections` 查看所有的集合（类似于传统数据库里的“表”）：

```bash
test&gt; use mx-space
switched to db mx-space
mx-space&gt; show collections
accounts
activities
# ... (此处省略一堆集合名)
options
# ...
users</code></pre><p>经过一番探索，我发现认证相关的配置应该在 <code>options</code> 这个集合里。</p>
<p>我们用 <code>db.options.find().pretty()</code> 来看看里面的内容。</p>
<blockquote>
<p>顺便吐槽一下，MongoDB 里的好多数据都是明文存储的，没有经过加密或混淆，感觉不太安全呀... 😅</p>
</blockquote>
<p>这里我截取了关键部分，也就是我们需要修改的地方：</p>
<pre><code class="language-json">{
  "_id": ObjectId("679fxxxxxxxxxxxx93"),
  "name": "oauth",
  "__v": 0,
  "value": {
    "providers": [ { "type": "github", "enabled": true } ],
    "secrets": {
      "github": { "clientSecret": "fab4xxxxxxxxxx7be6b" }
    },
    "public": { "github": { "clientId": "Ov23lxxxxxxBcr36" } }
  }
},
{
  "_id": ObjectId("679fxxxxxxxxxxx4"),
  "name": "authSecurity",
  "__v": 0,
  "value": { "disablePasswordLogin": true } // &lt;-- 就是你！
},</code></pre><p>我们的目标是先把密码登录功能打开，这样就能进入后台去修改其他设置了。</p>
<p>执行下面的命令，将 <code>disablePasswordLogin</code> 的值改为 <code>false</code>：</p>
<pre><code class="language-javascript">db.options.updateOne(
  {name: 'authSecurity'},
  {$set: {'value.disablePasswordLogin': false}}
)</code></pre><p>最后，我们来验证一下是否修改成功：</p>
<pre><code class="language-javascript">mx-space&gt; db.options.findOne({name: 'authSecurity'})
{
  "_id": ObjectId("6xxxxxxxxxxxxxx94"),
  "name": "authSecurity",
  "__v": 0,
  "value": { "disablePasswordLogin": false } // &lt;-- 搞定！
}</code></pre><p>可以看到，<code>disablePasswordLogin</code> 已经成功变为 <code>false</code>。</p>
<p>现在，理论上刷新一下博客的登录页面，就应该可以看到久违的密码登录框啦！🎉 Mission Complete</p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/record/fix-login-issue-after-server-migration-by-editing-database#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">68cec051685d961d498d3c01</guid>
  <category>posts</category>
<category>记录</category>
 </item>
  <item>
    <title>从零开始的代理生活—Proxychains4与Xray的奇妙冒险之旅🏠🛡️</title>
    <link>https://blog.inmoe.org/posts/tossabout/xray-proxychains-china-proxy-setup-guide</link>
    <pubDate>Tue, 22 Jul 2025 10:51:59 GMT</pubDate>
    <description>前言

由于众所周知的问题，在中国访问 Docker 仓库、Github 等服务是十分甚至有九分的困</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/tossabout/xray-proxychains-china-proxy-setup-guide'>https://blog.inmoe.org/posts/tossabout/xray-proxychains-china-proxy-setup-guide</a></blockquote>
      <h2>前言</h2>
<p>由于众所周知的问题，在中国访问 Docker 仓库、Github 等服务是十分甚至有九分的困难。</p>
<p>而使用 🐱 这类软件接管，不是很有必要，毕竟不是全天需要代理</p>
<blockquote>
<p>代理容易导致环境出现一些问题（</p>
</blockquote>
<p>只有部分命令需要用到代理，所以这里请出今天的喵喵工具：</p>
<ul>
<li><strong>Proxychains4</strong></li>
<li><strong>Xray</strong></li>
</ul>
<h2>配置</h2>
<h3>Xray</h3>
<h4>资料</h4>
<ul>
<li>WIKI: <a href="https://xtls.github.io/document/">https://xtls.github.io/document/</a></li>
<li>项目: <a href="https://github.com/XTLS/Xray-core">https://github.com/XTLS/Xray-core</a></li>
</ul>
<p>无需多盐，感谢所有前辈做出的努力 🙏</p>
<h4>安装</h4>
<pre><code class="language-bash">wget "https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip"
unzip Xray-linux-64.zip
sudo mv xray geoip.dat geosite.dat /usr/local/bin/
sudo chmod +x /usr/local/bin/xray</code></pre><blockquote>
<p>官方的一键安装教程: <a href="https://github.com/XTLS/Xray-install/blob/main/README_zh-Hans.md">Xray-install/README_zh-Hans.md</a></p>
</blockquote>
<h4>代理配置</h4>
<p>以下为笔者个人示例的一个 <code>config.json</code>。</p>
<p>作用：将本地的 10800 端口作为 Socks5 代理入站端口，将流量路由到设定的 SS2022 代理协议出站，访问目标网站。</p>
<p></p>
<pre><code class="language-json">{
  "log": {
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "port": 10800,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "settings": {
        "auth": "noauth",
        "udp": true
      },
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "tag": "socks_inbound"
    }
  ],
  "outbounds": [
    {
      "protocol": "shadowsocks",
      "settings": {
        "servers": [
          {
            "address": "your_domain",
            "port": 11451,
            "method": "2022-blake3-aes-128-gcm",
            "password": "your_passwd",
            "level": 0
          }
        ]
      },
      "tag": "ss2022_outbound"
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "inboundTag": ["socks_inbound"],
        "outboundTag": "ss2022_outbound"
      },
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "direct"
      }
    ]
  }
}</code></pre><h4>Systemd 配置</h4>
<p>创建 <code>/etc/systemd/system/xray.service</code> 文件：</p>
<blockquote>
<p>⚠️ 根据个人配置修改 <code>ExecStart=/usr/local/bin/xray run -c /opt/xray/config.json</code></p>
</blockquote>
<pre><code class="language-ini">[Unit]
Description=Xray Service
After=network.target

[Service]
ExecStart=/usr/local/bin/xray run -c /opt/xray/config.json
Restart=on-failure
User=nobody
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_NET_RAW
AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_NET_RAW
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target</code></pre><p>配置完成后，启用 Xray：</p>
<pre><code class="language-bash">sudo systemctl daemon-reload
sudo systemctl enable xray
sudo systemctl start xray
sudo systemctl status xray</code></pre><hr>
<h3>Proxychains</h3>
<h4>资料</h4>
<ul>
<li>项目: <a href="https://github.com/rofl0r/proxychains-ng">https://github.com/rofl0r/proxychains-ng</a></li>
<li>也许是: <a href="https://github.com/haad/proxychains">https://github.com/haad/proxychains</a></li>
</ul>
<h4>安装</h4>
<pre><code class="language-bash">apt update
apt install proxychains4</code></pre><p>编辑配置 <code>/etc/proxychains4.conf</code>。</p>
<p>我们刚在 Xray 中配置了一个 Socks5 代理在 10800 端口，所以此处可以这样配置，并取消注释 <code>dynamic_chain</code>：</p>
<p>示例：</p>
<pre><code class="language-conf">dynamic_chain
# ...省略...
[ProxyList]
socks5  127.0.0.1   10800</code></pre><h4>测试</h4>
<p>使用 <code>proxychains4</code> 命令。</p>
<p>未使用代理：</p>
<pre><code class="language-bash">root@cn-aliyun-sz:/opt# curl ipinfo.io
{
  "ip": "114.5.1.4",
  "city": "Shenzhen",
  "region": "Guangdong",
  "country": "CN",
  "loc": "22.5455,114.0683",
  "org": "AS37963 Hangzhou Alibaba Advertising Co.,Ltd.",
  "postal": "518000",
  "timezone": "Asia/Shanghai",
  "readme": "https://ipinfo.io/missingauth"
}</code></pre><p>使用代理：</p>
<pre><code class="language-bash">root@cn-aliyun-sz:/opt# proxychains4 curl ipinfo.io
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] Dynamic chain  ...  127.0.0.1:10800  ...  ipinfo.io:80  ...  OK
{
  "ip": "114.5.1.4",
  "city": "Hong Kong",
  "region": "Hong Kong",
  "country": "HK",
  "loc": "22.2783,114.1747",
  "org": "AS114514 HenhenAAAA CLOUD LLC",
  "postal": "114514",
  "timezone": "Asia/Hong_Kong",
  "readme": "https://ipinfo.io/missingauth"
}</code></pre><hr>
<p>这个时候，聪明的宝宝就要说了：</p>
<blockquote>
<p>主播～～，这个命令打起来好麻烦呀！</p>
</blockquote>
<p>那么就要请出我们的 <code>alias</code>。</p>
<p><strong>语法</strong>：<code>alias [别名]=[指令名称]</code><br>举例：<code>alias proxy=&#39;proxychains4&#39;</code></p>
<p>为了避免重启失效，我们可以编辑 <code>~/.bashrc</code> 将其写入：</p>
<pre><code class="language-bash">cat &gt;&gt; ~/.bashrc &lt;&lt; 'EOF'
alias proxy='proxychains4'
EOF</code></pre><p>然后执行 <code>source ~/.bashrc</code> 使其生效。</p>
<p>测试：</p>
<pre><code class="language-bash">root@cn-aliyun-sz:/opt# proxy curl ipinfo.io
[proxychains] config file found: /etc/proxychains4.conf
[proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4
[proxychains] DLL init: proxychains-ng 4.16
[proxychains] Dynamic chain  ...  127.0.0.1:10800  ...  ipinfo.io:80  ...  OK
{
  "ip": "114.5.1.4",
  "city": "Hong Kong",
  "region": "Hong Kong",
  "country": "HK",
  "loc": "22.2783,114.1747",
  "org": "AS114514 HenhenAAAA CLOUD LLC",
  "postal": "114514",
  "timezone": "Asia/Hong_Kong",
  "readme": "https://ipinfo.io/missingauth"
}</code></pre>
      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/tossabout/xray-proxychains-china-proxy-setup-guide#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">687f6d4ff0a4953113b15b5c</guid>
  <category>posts</category>
<category>折腾</category>
 </item>
  <item>
    <title>Obsidian 同步服务折腾记：Remotely-Save + Cloudflare R2</title>
    <link>https://blog.inmoe.org/posts/record/obsidian-sync-remotely-save-cloudflare-r2</link>
    <pubDate>Tue, 22 Jul 2025 09:04:02 GMT</pubDate>
    <description>前言

笔者在 Obsidian 上尝试了多种同步服务，如：

Obsidian Sync ✅
最好</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/record/obsidian-sync-remotely-save-cloudflare-r2'>https://blog.inmoe.org/posts/record/obsidian-sync-remotely-save-cloudflare-r2</a></blockquote>
      <h2>前言</h2>
<p>笔者在 Obsidian 上尝试了多种同步服务，如：</p>
<ul>
<li><p><strong>Obsidian Sync</strong> ✅</p>
<blockquote>
<p>最好用，但是每个月 5 刀（以及笔者经常忘续费），忘记续费又设置了密码，有时候想写东西打不开就很😫</p>
</blockquote>
</li>
<li><p><strong><a href="https://github.com/remotely-save/remotely-save">Remotely-Save</a></strong> ✅</p>
<blockquote>
<p>配置好了很好用，部分功能收费（我们暂时不需要），这个是今天配置的🐷角</p>
</blockquote>
</li>
<li><p><del><strong>Git</strong></del> ❌（还没配置）</p>
<blockquote>
<p>Maybe soon later～</p>
</blockquote>
</li>
</ul>
<h2>碎碎念</h2>
<p>Remotely-Save 支持以 WebDAV 的形式进行挂载，但是笔者想到的挂载方式如图所示，那为什么不直连 OneDrive 呢🤔</p>
<pre class="mermaid">graph LR
    Remotely-->|WebDAV|Alist-->OneDrive</pre><p>所以笔者选择了在 <code>WebDAV OR OneDrive</code> 中，选择了 <code>OR</code></p>
<pre class="mermaid">graph LR
    Remotely-->|S3|Cloudflare-R2</pre><p>接下来就要开始配置过程啦✅</p>
<h2>配置教程</h2>
<h3>Remotely-Save 插件安装</h3>
<p>首先呢，在 Obsidian 中安装插件 <a href="https://github.com/remotely-save/remotely-save">Remotely-Save</a> 并启用 </p>
<p></p>
<h3>Cloudflare R2 配置</h3>
<h4>创建存储桶</h4>
<p>创建一个存储桶并命名，由于这个存储桶我们并不公开，所以请<strong>不要</strong>配置自定义域或公共开放 URL。</p>
<p>这一部分的详细配置可以参考我的另一篇<a href="https://blog.inmoe.org/posts/record/Cloudflare_R2_Pic">文章</a></p>
<h4>API 令牌设置</h4>
<p>在 R2 控制台中：</p>
<ol>
<li>进入 <strong>管理 R2 API 令牌</strong></li>
<li>创建新的 API 令牌</li>
<li>配置适当的权限（读写权限）</li>
<li>记录 Access Key ID 和 Secret Access Key</li>
</ol>
<h3>Obsidian 配置</h3>
<h4>主要配置项</h4>
<table>
<thead>
<tr>
<th>配置项</th>
<th>设置值</th>
<th>备注</th>
</tr>
</thead>
<tbody><tr>
<td><strong>服务类型</strong></td>
<td>S3</td>
<td>选择 S3 兼容服务</td>
</tr>
<tr>
<td><strong>Endpoint</strong></td>
<td><code>https://&lt;ACCOUNT_ID&gt;.r2.cloudflarestorage.com</code></td>
<td><strong>注意：不要带存储桶的名字</strong></td>
</tr>
<tr>
<td><strong>区域</strong></td>
<td><code>auto</code></td>
<td>Auto 就可以</td>
</tr>
<tr>
<td><strong>存储桶名称</strong></td>
<td>你的存储桶名</td>
<td>例如 Obsidian</td>
</tr>
<tr>
<td><strong>Access Key ID</strong></td>
<td>你的访问密钥</td>
<td>R2 存储桶处新建一个 API</td>
</tr>
<tr>
<td><strong>Secret Access Key</strong></td>
<td>你的私有密钥</td>
<td>-</td>
</tr>
</tbody></table>
<h4>配置截图</h4>
<p></p>
<h2>使用体验</h2>
<h3>优点</h3>
<ul>
<li>✅ <strong>免费</strong>：Cloudflare R2 有充足的免费额度（还安全还快，5G 的免费空间够写好多篇啦😄）</li>
<li>✅ <strong>稳定</strong>：基于成熟的 S3 API</li>
<li>✅ <strong>快速</strong>：Cloudflare 的全球网络加速</li>
</ul>
<h3>注意事项</h3>
<ul>
<li>⚠️ 首次同步建议先备份</li>
<li>⚠️ <strong>请关闭其他同步插件</strong></li>
<li>⚠️ 多设备使用时注意同步顺序</li>
<li>⚠️ 网络不稳定时可能出现同步延迟</li>
</ul>
<h2>总结</h2>
<p>相比官方的 Obsidian Sync，这套方案虽然配置稍微复杂一点，但胜在免费且稳定。对于像笔者这样经常忘记续费的<del>天才</del>😂来说，简直是<del>救星</del>！🎉</p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/record/obsidian-sync-remotely-save-cloudflare-r2#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">687f5402f0a4953113b155cf</guid>
  <category>posts</category>
<category>记录</category>
 </item>
  <item>
    <title>SerVPS-HK-Zenlayer 测试留档</title>
    <link>https://blog.inmoe.org/posts/vps/hk-ser-zenlayer</link>
    <pubDate>Tue, 08 Jul 2025 01:30:17 GMT</pubDate>
    <description>简介

商家：SerVPS

类目: HongKong Special 8GB - Special
</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/vps/hk-ser-zenlayer'>https://blog.inmoe.org/posts/vps/hk-ser-zenlayer</a></blockquote>
      <h2>简介</h2>
<p><strong>商家</strong>：<a href="https://servps.com/">SerVPS</a></p>
<p><strong>类目</strong>: <code>HongKong Special 8GB - Special</code></p>
<p><strong>配置详情</strong>：</p>
<ul>
<li>4 vCPU</li>
<li>8192 MB RAM</li>
<li>60 GB Storage</li>
<li>3 TB Traffic</li>
<li>1 Gbps 端口速度</li>
<li>1 个 IPV4</li>
</ul>
<p><strong>价格</strong>：</p>
<ul>
<li>月付：$4.00 USD</li>
</ul>
<blockquote>
<p>3.9% + US$0.3 gateway fee. Stripe</p>
</blockquote>
<hr>
<h2>融合怪测试报告</h2>
<pre><code class="language-bash">--------------------- A Bench Script By spiritlhl ----------------------
                   测评频道: https://t.me/vps_reviews                    
VPS融合怪版本：2025.06.14
Shell项目地址：https://github.com/spiritLHLS/ecs
Go项目地址 [推荐]：https://github.com/oneclickvirt/ecs
---------------------基础信息查询--感谢所有开源项目---------------------
 CPU 型号          : AMD EPYC-Milan Processor
 CPU 核心数        : 4
 CPU 频率          : 2000.000 MHz
 CPU 缓存          : L1: 128.00 KB / L2: 2.00 MB / L3: 128.00 MB
 AES-NI指令集      : ✔ Enabled
 VM-x/AMD-V支持    : ❌ Disabled
 内存              : 248.08 MiB / 7.72 GiB
 Swap              : [ no swap partition or swap file detected ]
 硬盘空间          : 2.30 GiB / 59.82 GiB
 启动盘路径        : /dev/sda3
 系统在线时间      : 0 days, 0 hour 6 min
 负载              : 0.39, 0.35, 0.18
 系统              : Debian GNU/Linux 12 (bookworm) (x86_64)
 架构              : x86_64 (64 Bit)
 内核              : 6.1.0-9-amd64
 TCP加速方式       : bbr
 虚拟化架构        : KVM
 NAT类型           : Full Cone
 IPV4 ASN          : AS21859 Zenlayer Inc
 IPV4 位置         : Hong Kong / Hong Kong / HK
----------------------CPU测试--通过sysbench测试-------------------------
 -&gt; CPU 测试中 (Fast Mode, 1-Pass @ 5sec)
 1 线程测试(单核)得分:          3499 Scores
 4 线程测试(多核)得分:          13921 Scores
---------------------内存测试--感谢lemonbench开源-----------------------
 -&gt; 内存测试 Test (Fast Mode, 1-Pass @ 5sec)
 单线程读测试:          40954.37 MB/s
 单线程写测试:          24221.25 MB/s
------------------磁盘dd读写测试--感谢lemonbench开源--------------------
 -&gt; 磁盘IO测试中 (4K Block/1M Block, Direct Mode)
 测试操作               写速度                                  读速度
 100MB-4K Block         6.6 MB/s (1621 IOPS, 15.79s)            11.7 MB/s (2850 IOPS, 8.98s)
 1GB-1M Block           225 MB/s (215 IOPS, 4.66s)              415 MB/s (396 IOPS, 2.52s)
---------------------磁盘fio读写测试--感谢yabs开源----------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 40.02 MB/s   (10.0k) | 655.68 MB/s  (10.2k)
Write      | 40.12 MB/s   (10.0k) | 659.13 MB/s  (10.2k)
Total      | 80.14 MB/s   (20.0k) | 1.31 GB/s    (20.5k)
           |                      |                     
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ---- 
Read       | 970.02 MB/s   (1.8k) | 957.34 MB/s    (934)
Write      | 1.02 GB/s     (1.9k) | 1.02 GB/s      (997)
Total      | 1.99 GB/s     (3.8k) | 1.97 GB/s     (1.9k)
------------流媒体解锁--基于oneclickvirt/CommonMediaTests开源-----------
以下测试的解锁地区是准确的，但是不是完整解锁的判断可能有误，这方面仅作参考使用
----------------Netflix-----------------
[IPV4]
您的出口IP完整解锁Netflix，支持非自制剧的观看
NF所识别的IP地域信息：美国
[IPV6]
您的网络可能没有正常配置IPv6，或者没有IPv6网络接入
----------------Youtube-----------------
[IPV4]
连接方式: Youtube Video Server
视频缓存节点地域: 新加坡 新加坡/樟宜  (SIN11S18)
[IPV6]
Youtube在您的出口IP所在的国家不提供服务
---------------DisneyPlus---------------
[IPV4]
当前IPv4出口所在地区即将开通DisneyPlus
[IPV6]
DisneyPlus在您的出口IP所在的国家不提供服务
解锁Netflix，Youtube，DisneyPlus上面和下面进行比较，不同之处自行判断
----------------流媒体解锁--感谢RegionRestrictionCheck开源--------------
 以下为IPV4网络测试，若无IPV4网络则无输出
============[ Multination ]============
 Dazn:                                  Yes (Region: HK)
 Disney+:                               Yes (Region: US)
 Netflix:                               Yes (Region: US)
 YouTube Premium:                       Yes (Region: US)
 Amazon Prime Video:                    Yes (Region: US)
 TVBAnywhere+:                          No
 Spotify Registration:                  Yes (Region: HK)
 OneTrust Region:                       HK [Unknown]
 iQyi Oversea Region:                   US
 Bing Region:                           HK (Risky)
 Apple Region:                          US
 YouTube CDN:                           Singapore
 Netflix Preferred CDN:                 Hong Kong
 ChatGPT:                               No (Only Available with Mobile APP)
 Google Gemini:                         Yes (Region: USA)
 Claude:                                No
 Wikipedia Editability:                 Yes
 Google Play Store:                     United States 
 Google Search CAPTCHA Free:            Yes
 Steam Currency:                        HKD
 ---Forum---
 Reddit:                                Yes
 ---Game---
 SD Gundam G Generation Eternal:        Yes
=======================================
 以下为IPV6网络测试，若无IPV6网络则无输出
---------------TikTok解锁--感谢lmc999的源脚本及fscarmen PR--------------
 Tiktok Region:         Failed
-------------IP质量检测--基于oneclickvirt/securityCheck使用-------------
数据仅作参考，不代表100%准确，如果和实际情况不一致请手动查询多个数据库比对
以下为各数据库编号，输出结果后将自带数据库来源对应的编号
ipinfo数据库  [0] | scamalytics数据库 [1] | virustotal数据库   [2] | abuseipdb数据库   [3] | ip2location数据库    [4]
ip-api数据库  [5] | ipwhois数据库     [6] | ipregistry数据库   [7] | ipdata数据库      [8] | db-ip数据库          [9]
ipapiis数据库 [A] | ipapicom数据库    [B] | bigdatacloud数据库 [C] | cheervision数据库 [D] | ipqualityscore数据库 [E]
IPV4:
安全得分:
声誉(越高越好): 0 [2] 
信任得分(越高越好): 93 [8] 
VPN得分(越低越好): 3 [8] 
代理得分(越低越好): 16 [8] 
社区投票-无害: 0 [2] 
社区投票-恶意: 0 [2] 
威胁得分(越低越好): 3 [8] 
欺诈得分(越低越好): 0 [1] 65 [E]
滥用得分(越低越好): 0 [3] 
ASN滥用得分(越低越好): 0.001 (Low) [A] 
公司滥用得分(越低越好): 0 (Very Low) [A] 
威胁级别: low [9] 
黑名单记录统计:(有多少黑名单网站有记录):
无害记录数: 0 [2]  恶意记录数: 0 [2]  可疑记录数: 0 [2]  无记录数: 94 [2]  
安全信息:
使用类型: DataCenter/WebHosting/Transit [3] hosting - moderate probability [C] hosting [0 7 9 A]
公司类型: business [7 A] hosting [0]
是否云提供商: Yes [7 D] 
是否数据中心: No [8 C] Yes [0 1 5 6 A]
是否移动设备: No [5 A C] Yes [E]
是否代理: No [0 1 4 5 6 7 8 9 A C D] Yes [E]
是否VPN: Yes [E] No [0 1 6 7 A C D]
是否Tor: No [0 1 3 6 7 8 A C D E] 
是否Tor出口: No [1 7 D] 
是否网络爬虫: No [9 A E] 
是否匿名: No [1 6 7 8 D] 
是否攻击者: No [7 8 D] 
是否滥用者: No [7 8 A C D E] 
是否威胁: No [7 8 C D] 
是否中继: No [0 7 8 C D] 
是否Bogon: No [7 8 A C D]
是否机器人: No [E] 
DNS-黑名单: 314(Total_Check) 0(Clean) 4(Blacklisted) 24(Other) 
Google搜索可行性：NO
-------------邮件端口检测--基于oneclickvirt/portchecker开源-------------
Platform  SMTP  SMTPS POP3  POP3S IMAP  IMAPS
LocalPort ✔     ✔     ✔     ✔     ✔     ✔    
QQ        ✘     ✘     ✔     ✘     ✔     ✘    
163       ✘     ✘     ✔     ✘     ✔     ✘    
Sohu      ✘     ✘     ✘     ✘     ✔     ✘    
Yandex    ✘     ✘     ✔     ✘     ✔     ✘    
Gmail     ✘     ✘     ✘     ✘     ✘     ✘    
Outlook   ✘     ✘     ✔     ✘     ✔     ✘    
Office365 ✘     ✘     ✔     ✘     ✔     ✘    
Yahoo     ✘     ✘     ✘     ✘     ✘     ✘    
MailCOM   ✘     ✘     ✔     ✘     ✔     ✘    
MailRU    ✘     ✘     ✘     ✘     ✔     ✘    
AOL       ✘     ✘     ✘     ✘     ✘     ✘    
GMX       ✘     ✘     ✔     ✘     ✔     ✘    
Sina      ✘     ✘     ✔     ✘     ✔     ✘    
Apple     ✘     ✘     ✘     ✘     ✘     ✘    
FastMail  ✘     ✘     ✘     ✘     ✘     ✘    
ProtonMail✘     ✘     ✘     ✘     ✘     ✘    
MXRoute   ✘     ✘     ✔     ✘     ✔     ✘    
Namecrane ✘     ✘     ✔     ✘     ✔     ✘    
XYAMail   ✘     ✘     ✘     ✘     ✘     ✘    
ZohoMail  ✘     ✘     ✘     ✘     ✘     ✘    
Inbox_eu  ✘     ✘     ✔     ✘     ✘     ✘    
Free_fr   ✘     ✘     ✔     ✘     ✔     ✘    
----------------三网回程--基于oneclickvirt/backtrace开源----------------
北京电信v4 219.141.140.10  检测不到回程路由节点的IPV4地址
北京联通v4 202.106.195.68           联通4837   [普通线路] 
北京移动v4 221.179.155.161          移动CMI    [普通线路] 
上海电信v4 202.96.209.133           电信163    [普通线路] 
上海联通v4 210.22.97.1              联通4837   [普通线路] 
上海移动v4 211.136.112.200          移动CMI    [普通线路] 
广州电信v4 58.60.188.222            电信163    [普通线路] 
广州联通v4 210.21.196.6             联通4837   [普通线路] 
广州移动v4 120.196.165.24           移动CMI    [普通线路] 
成都电信v4 61.139.2.69              电信163    [普通线路] 
成都联通v4 119.6.6.6                联通4837   [普通线路] 
成都移动v4 211.137.96.205           移动CMI    [普通线路] 移动CMIN2  [精品线路] 
准确线路自行查看详细路由，本测试结果仅作参考
同一目标地址多个线路时，可能检测已越过汇聚层，除了第一个线路外，后续信息可能无效
---------------------回程路由--感谢fscarmen开源及PR---------------------
依次测试电信/联通/移动经过的地区及线路，核心程序来自nexttrace，请知悉!
广州电信 58.60.188.222
6.65 ms         AS213734 英国 英格兰 伦敦
5.06 ms         * RFC1918
1.10 ms         AS21859 [ZEN-SG] 中国 香港 zenlayer.com
1.32 ms         AS2914 [NTT-GLOBAL] 中国 香港 gin.ntt.net
34.95 ms        AS2914 [NTT-BACKBONE] 新加坡 gin.ntt.net
42.62 ms        AS2914 [NTT-BACKBONE] 新加坡 gin.ntt.net
* ms    AS4134 [APNIC-AP] 新加坡 www.chinatelecom.com.cn
253.23 ms       AS4134 中国 广东 深圳 福田区 www.chinatelecom.com.cn 电信
广州联通 210.21.196.6
3.98 ms         AS213734 英国 英格兰 伦敦
7.54 ms         * RFC1918
1.66 ms         AS21859 [ZL-LAX] 中国 香港 zenlayer.com
1.23 ms         AS3491 中国 香港 pccwglobal.com
170.25 ms       * [NSFNET-T3] 美国 加利福尼亚 洛杉矶
* ms    AS701 [UUNETCUSTB40] 美国 加利福尼亚 洛杉矶 verizon.com
374.31 ms       AS4837 [CU169-BACKBONE] 中国 广东 广州 chinaunicom.cn 联通
* ms    AS4837 [CU169-BACKBONE] 中国 广东 广州 X-I chinaunicom.cn 联通
355.02 ms       AS4837 [CU169-BACKBONE] 中国 广东 广州 chinaunicom.cn 联通
394.59 ms       AS17816 [APNIC-AP] 中国 广东 深圳 chinaunicom.cn 联通
408.14 ms       AS17623 [APNIC-AP] 中国 广东 深圳 chinaunicom.cn 联通
380.74 ms       AS17623 中国 广东 深圳 宝安区 chinaunicom.cn 联通
广州移动 120.196.165.24
4.21 ms         AS213734 英国 英格兰 伦敦
3.06 ms         * RFC1918
1.08 ms         AS21859 [ZEN-SG] 中国 香港 zenlayer.com
0.98 ms         AS21859 [ZL-LAX] 中国 香港 zenlayer.com
1.55 ms         AS3491 中国 香港 pccwglobal.com
140.43 ms       AS3491 [PCCW-BACKBONE] 中国 香港 pccwglobal.com
200.50 ms       AS58453 [CMI-INT] 新加坡 cmi.chinamobile.com 移动
292.78 ms       AS58453 [CMI-INT] 中国 香港 cmi.chinamobile.com 移动
203.13 ms       AS58453 [CMI-INT] 中国 广东 广州 cmi.chinamobile.com 移动
190.34 ms       AS9808 [CMNET] 中国 广东 广州 X-I chinamobileltd.com 移动
222.93 ms       AS9808 [CMNET] 中国 广东 广州 I-C chinamobileltd.com 移动
272.06 ms       AS9808 [CMNET] 中国 广东 广州 chinamobileltd.com 移动
198.21 ms       AS9808 [CMNET] 中国 广东 广州 chinamobileltd.com 移动
232.02 ms       AS9808 [CMNET] 中国 广东 广州 chinamobileltd.com 移动
224.53 ms       AS56040 [APNIC-AP] 中国 广东 深圳 gd.10086.cn 移动
--------------------自动更新测速节点列表--本脚本原创--------------------
位置             上传速度        下载速度        延迟
Speedtest.net    1005.56Mbps     948.21Mbps      1.18ms
新加坡           696.93Mbps      738.75Mbps      30.83ms
移动Chengdu      24.66Mbps       110.34Mbps      369.08ms
------------------------------------------------------------------------
 总共花费      : 6 分 7 秒
 时间          : Sun Jul  6 15:14:48 HKT 2025
------------------------------------------------------------------------</code></pre><hr>
<h2>IP 质量测试报告</h2>
<h3>IPV4</h3>
<p></p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/vps/hk-ser-zenlayer#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">686c74a90cf25752bb6a3400</guid>
  <category>posts</category>
<category>VPS</category>
 </item>
  <item>
    <title>K3S 的第一个测试Demo</title>
    <link>https://blog.inmoe.org/posts/study/k3s-first-test-demo</link>
    <pubDate>Wed, 21 May 2025 13:59:21 GMT</pubDate>
    <description>背景介绍

我们已经完成了一个单 Server 的 K3S 集群的搭建，现在开始部署第一个应用。

</description>
    <content:encoded><![CDATA[
      <blockquote>该渲染由 marked 生成，可能存在排版问题，最佳体验请前往：<a href='https://blog.inmoe.org/posts/study/k3s-first-test-demo'>https://blog.inmoe.org/posts/study/k3s-first-test-demo</a></blockquote>
      <h2>背景介绍</h2>
<p>我们已经完成了一个单 Server 的 K3S 集群的搭建，现在开始部署第一个应用。</p>
<h2>创建部署文件</h2>
<p>创建一个 <code>nginx-demo.yaml</code> 文件，包含以下资源配置：</p>
<pre><code class="language-yaml">apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
spec:
    replicas: 3  # 创建3个Pod副本
    selector:
        matchLabels:
            app: nginx
    template:
        metadata:
            labels:
                app: nginx
        spec:
            containers:
            - name: nginx
                image: nginxdemos/hello:latest  # 使用nginx演示镜像
                ports:
                - containerPort: 80  # 容器内暴露80端口
---
apiVersion: v1
kind: Service
metadata:
    name: nginx-service
spec:
    selector:
        app: nginx  # 选择所有带有app=nginx标签的Pod
    ports:
    - protocol: TCP
        port: 80  # 服务暴露的端口
        targetPort: 80  # 目标Pod的端口
    type: ClusterIP  # 创建集群内部IP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: nginx-ingress
    annotations:
        traefik.ingress.kubernetes.io/router.entrypoints: web
        traefik.ingress.kubernetes.io/service.loadbalancer.method: drr  # 使用轮询负载均衡
        traefik.ingress.kubernetes.io/service.sticky: "false"  # 禁用会话粘性
spec:
    rules:
    - host: example.com  # 设置访问域名
        http:
            paths:
            - path: /  # 根路径
                pathType: Prefix
                backend:
                    service:
                        name: nginx-service
                        port:
                            number: 80  </code></pre><h2>部署应用</h2>
<p>执行以下命令部署应用：</p>
<pre><code class="language-bash">kubectl apply -f nginx-demo.yaml</code></pre><p>成功部署后，将看到类似以下输出：</p>
<pre><code class="language-bash">deployment.apps/nginx-deployment created
service/nginx-service created
ingress.networking.k8s.io/nginx-ingress created</code></pre><h2>验证部署状态</h2>
<h3>检查 Pod 状态</h3>
<pre><code class="language-bash">kubectl get pods -o wide</code></pre><p>输出示例：</p>
<pre><code class="language-bash">NAME                                READY   STATUS    RESTARTS   AGE     IP           NODE            NOMINATED NODE   READINESS GATES
nginx-deployment-5ccd6fdc5b-dmwml   1/1     Running   0          2m51s   10.42.2.8    agent-jp-claw   &lt;none&gt;           &lt;none&gt;
nginx-deployment-5ccd6fdc5b-np6mj   1/1     Running   0          2m51s   10.42.1.8    agent-hk-claw   &lt;none&gt;           &lt;none&gt;
nginx-deployment-5ccd6fdc5b-nscrm   1/1     Running   0          2m51s   10.42.0.15   master-hk-fox   &lt;none&gt;           &lt;none&gt;</code></pre><p>可以看到已创建了三个容器实例，分布在三个节点上。</p>
<h3>检查 Service 状态</h3>
<pre><code class="language-bash">kubectl get svc</code></pre><p>输出示例：</p>
<pre><code class="language-bash">NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes      ClusterIP   10.43.0.1      &lt;none&gt;        443/TCP   12h
nginx-service   ClusterIP   10.43.225.46   &lt;none&gt;        80/TCP    4m29s</code></pre><h3>检查 Ingress 状态</h3>
<pre><code class="language-bash">kubectl get ingress</code></pre><p>输出示例：</p>
<pre><code class="language-bash">NAME            CLASS     HOSTS       ADDRESS                                  PORTS   AGE
nginx-ingress   traefik   example.com 100.113.225.35,100.120.219.98,100.68.209.88 80      4m35s</code></pre><h2>访问应用</h2>
<p>将域名解析到任一已部署 Pod 的节点 IP 上，即可访问应用。</p>
<p></p>

      <p style='text-align: right'>
      <a href='https://blog.inmoe.org/posts/study/k3s-first-test-demo#comments'>看完了？说点什么呢</a>
      </p>
    ]]>
    </content:encoded>
  <guid isPermaLink="false">682ddc392e0350fe798d64cb</guid>
  <category>posts</category>
<category>学习</category>
 </item>
  
</channel>
</rss>