<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Goslion的Blog</title>
    <link>https://goslion.com/</link>
    <description>一个专注技术与写作的个人博客，记录日常与技术沉淀，马上十年了</description>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 09 Oct 2026 14:22:26 +0000</lastBuildDate>
    <atom:link href="https://goslion.com/index.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>萨宁</title>
      <link>https://goslion.com/diary/2026/20261009/</link>
      <pubDate>Fri, 09 Oct 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20261009/</guid>
      <description>今天早上在地铁里，我非常的无聊，就是没什么东西能够吸引到我的注意力，那种状态，已经持续很久了，我也不想学习，也不关心娱乐，没什么让我有欲望点击。 然后我看到了一个标题，堕落什么什么真的很爽，这个倒是挺新奇的，于是我就点进行看了，其实挺无聊的，就是一个单一的场景，一个讲读书的博主讲萨宁这本书，这是本外国书，讲一个极端个人主义的人，以及他周围的人，我想怎么会有这样的人，什么都不在乎呢? </description><content:encoded><![CDATA[<p>今天早上在地铁里，我非常的无聊，就是没什么东西能够吸引到我的注意力，那种状态，已经持续很久了，我也不想学习，也不关心娱乐，没什么让我有欲望点击。</p>
<p>然后我看到了一个标题，堕落什么什么真的很爽，这个倒是挺新奇的，于是我就点进行看了，其实挺无聊的，就是一个单一的场景，一个讲读书的博主讲萨宁这本书，这是本外国书，讲一个极端个人主义的人，以及他周围的人，我想怎么会有这样的人，什么都不在乎呢?</p>
<p>那又怎么和堕落扯上关系，又看了一些评论，说的挺有道理，堕落本来就是人定义的，其实堕落并不存在，只是看待事情的态度不同而已，不好好学习并不算堕落，不好好工作也不算，不听父母的话也不算，因为这些事情的起点和终点都是满足自己的需求，如果自己需求就不是学习，也不算工作，或者顺应父母的心意，那怎么算得上堕落。</p>
<p>现在想想，自我为中心是没错的，越是自我为中心，越是自由，因为不用考虑那么多别人的事情，多好，更上一层，就是规则，道德法律之类。</p>
<p>我也想做到这种境界，可是我做不到，一直以来都是如此，改变是不大可能，不过可以提醒自己，别那么在乎别人，多关心自己，这点是可以做到的，让自己感到开心和愉悦，不要那么压抑和痛苦，才是活着的意义，我目前为止，是只能做到这个地步。</p>
<p>当然我的孩子，我希望她自私，个人主义，不要管别人，我也不会怎么管她，约束她，更没有多少期望，想干啥就干啥，能干啥就干啥，穷则穷耍，富则富耍，先耍够了，再想其他的。</p>
<p>其实吧，是因为我达不到这个状态，所以更希望我的孩子达到，孩子是父母生命，我肯定不希望她把我走的路再走一遍，首先是这条路很苦，而且没什么意思，可以说又臭又长，又无聊，我经常觉得生命太长，也是因为这个，没什么新东西，就会陷入一种虚无主义，我很早就知道，一直在警惕，我换过很多工作，去过很多地方，认识了非常多的人，游戏也玩过不少，最后都抛弃了，我把他们放弃了，因为那很无聊，没意思。</p>
<p>一眼可以望到头的路，没什么意思。</p>
<p>还是结尾，我觉得有意思，作者写了萨宁，走向一片广阔的平原，迎着晨光，看似是一段毫无意义的描写。我领悟到了，实际上是无数的可能，境界上的升华，路怎么可能越走越窄呢，怎么可能越走越累呢？应该是越走越宽，越走越觉得轻松愉悦，充满生机和希望的。因为很多的规矩，目标之类的东西压着，不让这么做，不能那么做，所以才会如此，那就直接无视这些规则就好了。</p>
<p>如果自己过不好，能救更不要谈什么身边的人过的好了。让自己过的好，就是尽可能满足自己，取悦自己，这才是活着的意义，其他的都扯淡。</p>
<hr>
<p>我只是偶然听了十多分的读书分享，谈不上多深刻的理解，但是这确实会对我以后的行为逻辑产生影响，因此做个记录。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux 磁盘满了怎么排查</title>
      <link>https://goslion.com/tech/linux/linux-disk-full/</link>
      <pubDate>Fri, 09 Oct 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/tech/linux/linux-disk-full/</guid>
      <description>从 df 到 du，再到已删除却被进程占用的文件和 inode 耗尽，一套按顺序执行的排查流程，附安全清理清单、在线扩容与预防配置。</description><content:encoded><![CDATA[<h3 id="磁盘满了先别急着删">磁盘满了，先别急着删</h3>
<p>磁盘告警时最容易犯的错，是直接 <code>rm -rf /var/log/*</code>，结果空间一点没释放，日志还丢了。</p>
<p>原因下面会说，先按这个顺序走一遍，通常几分钟就能定位到是谁在吃空间。</p>
<h3 id="第一步分清是空间满了还是-inode-满了">第一步：分清是空间满了还是 inode 满了</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">df -h                 <span class="c1"># 各挂载点的空间使用率</span>
</span></span><span class="line"><span class="cl">df -i                 <span class="c1"># 各挂载点的 inode 使用率</span></span></span></code></pre></div>
</div>
<p>输出示意：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Filesystem      Size  Used Avail Use% Mounted on
</span></span><span class="line"><span class="cl">/dev/vda1        99G   94G     0 100% /
</span></span><span class="line"><span class="cl">/dev/vdb1       500G  120G  355G  26% /data</span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Filesystem      Inodes  IUsed   IFree IUse% Mounted on
</span></span><span class="line"><span class="cl">/dev/vda1      6553600 6553600      0  100% /
</span></span><span class="line"><span class="cl">/dev/vdb1     32768000 1200000 31568000   4% /data</span></span></code></pre></div>
</div>
<p>这两种&quot;满&quot;报错信息一样（都是 No space left on device），但排查方向完全不同：</p>
<ul>
<li><code>df -h</code> 的 <code>Use%</code> 到 100% —— 空间真的被数据占满了；</li>
<li><code>df -i</code> 的 <code>IUse%</code> 到 100% —— 空间还有富余，但<strong>文件数量</strong>到顶了，同样写不进新文件。</li>
</ul>
<p>小文件特别多的机器（session、缓存碎片、邮件队列）经常是后一种。</p>
<h3 id="第二步用-du-逐层下钻">第二步：用 du 逐层下钻</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">du -xh --max-depth<span class="o">=</span><span class="m">1</span> / <span class="p">|</span> sort -rh <span class="p">|</span> head -20</span></span></code></pre></div>
</div>
<p>输出示意：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">45G     /var
</span></span><span class="line"><span class="cl">12G     /home
</span></span><span class="line"><span class="cl">3.1G    /usr</span></span></code></pre></div>
</div>
<p><code>-x</code> 很关键 —— 不加它会跨到其它挂载点，看到的数字是虚的。</p>
<p>定位到大目录后逐层往下：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">du -xh --max-depth<span class="o">=</span><span class="m">1</span> /var <span class="p">|</span> sort -rh <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">du -sh /var/* <span class="p">|</span> sort -rh <span class="p">|</span> head</span></span></code></pre></div>
</div>
<p><code>du</code> 在大目录上会跑很久，赶时间可以直接看已知的几个大户：<code>/var/log</code>、<code>/var/lib/docker</code>、<code>/var/cache</code>、<code>/home</code>、<code>/tmp</code>。</p>
<p>用 <code>du</code> 时有三个地方容易看错：</p>
<ol>
<li><strong><code>-x</code> 别省</strong>，否则会把挂载在下层的盘也算进来；</li>
<li><strong>硬链接默认只算一次</strong>，要按&quot;每个链接都占一份&quot;来统计得加 <code>-l</code>；</li>
<li><strong>稀疏文件按实际占用算</strong>，所以 <code>du</code> 常常远小于 <code>ls -l</code> 显示的大小 —— 这是正常的，不是漏算。</li>
</ol>
<h3 id="第三步df-和-du-对不上--已删除但没释放的文件">第三步：df 和 du 对不上 —— 已删除但没释放的文件</h3>
<p>这是最经典也最容易被忽略的情况：<code>df</code> 说占用 90%，<code>du</code> 加起来只有 30%。</p>
<p>原因是<strong>有进程还持有已被 <code>rm</code> 掉的文件句柄</strong>，空间自然不释放；<code>du</code> 遍历目录树看不到它，<code>df</code> 统计块设备能看到它。</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lsof +L1                        <span class="c1"># link count 为 0 的文件，也就是&#34;已删除但被打开&#34;</span>
</span></span><span class="line"><span class="cl">lsof <span class="p">|</span> grep deleted <span class="p">|</span> head</span></span></code></pre></div>
</div>
<p>输出示意：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">COMMAND  PID   USER   FD   TYPE DEVICE  SIZE/OFF NLINK   NODE NAME
</span></span><span class="line"><span class="cl">nginx   1183   root    2w   REG  253,1 20.4G     0  131091 /var/log/nginx/access.log (deleted)</span></span></code></pre></div>
</div>
<p>输出里有 PID 和 FD，处理方式二选一：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 方式一：重启对应服务（日志类最常见，重启后自动释放）</span>
</span></span><span class="line"><span class="cl">systemctl restart nginx
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 方式二：不重启，把该句柄截断为 0（对日志文件有效）</span>
</span></span><span class="line"><span class="cl">: &gt; /proc/1183/fd/2</span></span></code></pre></div>
</div>
<p>注意必须是 <code>: &gt;</code>（截断），而不是 <code>rm</code> —— 删掉 <code>/proc</code> 下的路径不解决任何问题，空间依旧不释放。</p>
<p>这也是为什么开头那个 <code>rm -rf /var/log/*</code> 没用：文件被删了，但写日志的进程还开着句柄。</p>
<h3 id="第四步inode-耗尽的排查">第四步：inode 耗尽的排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">df -i                                            <span class="c1"># 先确认是不是 inode 满了</span>
</span></span><span class="line"><span class="cl">find / -xdev -type f 2&gt;/dev/null <span class="p">|</span> wc -l         <span class="c1"># 全盘文件总数</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 找出哪个目录下文件最多</span>
</span></span><span class="line"><span class="cl">find / -xdev -type f 2&gt;/dev/null <span class="p">|</span> sed <span class="s1">&#39;s|/[^/]*$||&#39;</span> <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn <span class="p">|</span> head</span></span></code></pre></div>
</div>
<p>输出示意：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl"> 812340 /var/lib/php/sessions
</span></span><span class="line"><span class="cl">  42117 /var/spool/postfix/deferred
</span></span><span class="line"><span class="cl">   3106 /var/log</span></span></code></pre></div>
</div>
<p>常见元凶是大量小文件：session 文件、缓存碎片、<code>/var/spool</code> 下的邮件队列、被按秒切割的日志。</p>
<p>确认后<strong>整目录删除比逐个删快得多</strong>，<code>rm -rf /path/to/dir</code> 之后重建空目录即可。</p>
<h3 id="第五步几个稳定的空间大户">第五步：几个稳定的空间大户</h3>
<p><strong>1. systemd 日志</strong></p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">journalctl --disk-usage            <span class="c1"># 当前占用多少</span>
</span></span><span class="line"><span class="cl">journalctl --vacuum-size<span class="o">=</span>200M      <span class="c1"># 收缩到 200M</span>
</span></span><span class="line"><span class="cl">journalctl --vacuum-time<span class="o">=</span>7d        <span class="c1"># 只保留最近 7 天</span></span></span></code></pre></div>
</div>
<p>想永久限制，改 <code>/etc/systemd/journald.conf</code>，然后 <code>systemctl restart systemd-journald</code>：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">ini</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">SystemMaxUse</span><span class="o">=</span><span class="s">500M</span>
</span></span><span class="line"><span class="cl"><span class="na">SystemMaxFileSize</span><span class="o">=</span><span class="s">50M</span></span></span></code></pre></div>
</div>
<p><strong>2. 包管理器缓存与旧内核</strong></p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt-get clean <span class="o">&amp;&amp;</span> apt-get autoremove --purge     <span class="c1"># Debian / Ubuntu</span>
</span></span><span class="line"><span class="cl">yum clean all                                   <span class="c1"># CentOS / RHEL</span>
</span></span><span class="line"><span class="cl">package-cleanup --oldkernels --count<span class="o">=</span><span class="m">2</span>          <span class="c1"># CentOS 保留最近 2 个内核</span></span></span></code></pre></div>
</div>
<p><strong>3. Docker</strong></p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker system df              <span class="c1"># 分开看：镜像 / 容器 / 数据卷 / 构建缓存</span>
</span></span><span class="line"><span class="cl">docker system prune -a        <span class="c1"># 清掉未使用的镜像与构建缓存（会删东西，看清提示再确认）</span></span></span></code></pre></div>
</div>
<h3 id="第六步按时间清理历史文件">第六步：按时间清理历史文件</h3>
<p>只删够老的文件，别碰正在写的。<strong>养成先干跑再真删的习惯</strong>：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 先干跑：只打印清单，确认没有误伤</span>
</span></span><span class="line"><span class="cl">find /var/log -type f -name <span class="s2">&#34;*.log&#34;</span> -mtime +30 -print
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 确认后再真删</span>
</span></span><span class="line"><span class="cl">find /var/log -type f -name <span class="s2">&#34;*.log&#34;</span> -mtime +30 -delete</span></span></code></pre></div>
</div>
<p><code>-mtime +30</code> 表示修改时间在 30 天以前。目录里文件极多时，<code>find -delete</code> 比 <code>rm -rf</code> 稳，不会因为参数过长而失败。</p>
<h3 id="第七步确实不够用了--在线扩容">第七步：确实不够用了 —— 在线扩容</h3>
<p>排查完发现没有可清理的，那就扩。LVM 下三步，<strong>第 3 步不能省</strong>，否则卷大了文件系统还是不认识新空间：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">vgs                                    <span class="c1"># 先看卷组里还有多少 VFree 可分配</span>
</span></span><span class="line"><span class="cl">lvs                                    <span class="c1"># 看现有逻辑卷与大小</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">lvextend -L +10G /dev/mapper/vg0-root  <span class="c1"># 给逻辑卷加 10G</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 让文件系统认识新空间，命令按文件系统类型区分</span>
</span></span><span class="line"><span class="cl">resize2fs /dev/mapper/vg0-root         <span class="c1"># ext4：参数是设备</span>
</span></span><span class="line"><span class="cl">xfs_growfs /                           <span class="c1"># XFS：参数是挂载点，不是设备</span></span></span></code></pre></div>
</div>
<p>两个容易踩的点：</p>
<ol>
<li>ext4 支持在线扩容，也支持缩容（但要先卸载）；</li>
<li><strong>XFS 只能扩、不能缩</strong>，选文件系统时就要想清楚。</li>
</ol>
<h3 id="清理时的几个坑">清理时的几个坑</h3>
<ul>
<li><strong>别删正在写的日志文件</strong>。<code>rm</code> 之后进程仍持有句柄，空间不释放、内容也没了。要么 <code>truncate -s 0 file</code>，要么先停服务。</li>
<li><strong><code>rm</code> 大文件不等于立刻释放空间</strong>。删除只是解除链接，真正回收取决于还有没有进程打开着它。</li>
<li><strong><code>du</code> 小于 <code>df</code> 是正常的</strong>。文件系统元数据、被删句柄、稀疏文件都会造成差异；只有差得离谱时才需要按第三步查。</li>
<li><strong>别在业务高峰做全盘 <code>du</code> 或 <code>find</code></strong>，这两条命令都会把磁盘 IO 打满，反而拖垮服务。</li>
</ul>
<h3 id="预防">预防</h3>
<p>日志轮转配好，比事后救火省事得多。<code>/etc/logrotate.d/myapp</code>：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">ini</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="na">/var/log/myapp/*.log {</span>
</span></span><span class="line"><span class="cl">    <span class="na">daily</span>
</span></span><span class="line"><span class="cl">    <span class="na">rotate 7</span>
</span></span><span class="line"><span class="cl">    <span class="na">compress</span>
</span></span><span class="line"><span class="cl">    <span class="na">missingok</span>
</span></span><span class="line"><span class="cl">    <span class="na">notifempty</span>
</span></span><span class="line"><span class="cl">    <span class="na">copytruncate     # 复制后截断原文件，进程不用重启（正好绕开句柄占用问题）</span>
</span></span><span class="line"><span class="cl"><span class="na">}</span></span></span></code></pre></div>
</div>
<p>另外三条：</p>
<ol>
<li>journald 上限按上面的配置写死；</li>
<li>监控不能只看空间，<code>df -i</code> 一起报；</li>
<li>容器日志单独限大小：<code>--log-opt max-size=50m --log-opt max-file=3</code>。</li>
</ol>
<p><strong>总结</strong></p>
<ol>
<li>先分清是空间满还是 inode 满：<code>df -h</code> 和 <code>df -i</code> 都要看；</li>
<li><code>du -xh</code> 逐层下钻，<code>-x</code> 别跨挂载点，注意硬链接与稀疏文件的影响；</li>
<li><code>df</code> 与 <code>du</code> 差得多 → <code>lsof +L1</code> 找已删除但被占用的文件，用 <code>: &gt; /proc/PID/fd/N</code> 截断；</li>
<li>稳定大户按顺序清：journald、包管理器缓存、旧内核、Docker、应用日志；</li>
<li>清理历史文件先 <code>-print</code> 干跑，确认后再 <code>-delete</code>；</li>
<li>真的不够用就扩容，LVM 三步走完记得 <code>resize2fs</code> 或 <code>xfs_growfs</code>；</li>
<li>长期靠 logrotate 与各项上限配置，别等告警了才动手。</li>
</ol>
]]></content:encoded>
    </item>
    <item>
      <title>国庆节</title>
      <link>https://goslion.com/diary/2026/20261006/</link>
      <pubDate>Tue, 06 Oct 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20261006/</guid>
      <description>这么快就结束了，真有点没反应过来，反正我的印象里，好像上了几天班，并没有得到很好的休息，今天唯一算是个比较不错的天气，但是，就在我们收拾好东西，准备出门的时候，领导打电话来了，问我怎么没来上班，我都懵了，不是放七天吗？ 最后还是确定了，是5天，那是九月中旬发的通知，而我差不多都忘了，只知道放假的前几分钟，不知道谁说了一句很贴切的话，感觉像是要过年了一样，虽然大家都还在敲着键盘，但是内心的激动早就掩 …</description><content:encoded><![CDATA[<p>国庆节这么快就结束了，真有点没反应过来，反正我的印象里，好像上了几天班，并没有得到很好的休息，今天唯一算是个比较不错的天气，但是，就在我们收拾好东西，准备出门的时候，领导打电话来了，问我怎么没来上班，我都懵了，不是放七天吗？</p>
<p>最后还是确定了，是5天，那是九月中旬发的通知，而我差不多都忘了，只知道放假的前几分钟，不知道谁说了一句很贴切的话，感觉像是要过年了一样，虽然大家都还在敲着键盘，但是内心的激动早就掩饰不住了，空气中都弥漫这欢悦的气息。</p>
<p>是啊，久违的长假，终于可以好好睡个懒觉，终于可以出去玩了，不用担心第二天要早起，也不用担心工作。</p>
<p>这假期太短了，我还没过够。</p>
<p>注意我说的不是玩够，因为我压根就没怎么玩，没什么玩的心情，也没什么契机，因为放假的这几天天气都不好，就是有一个下午，去附近的公园了，
天气不算好，也回来的比较早，公园里有很多人，也有很多小孩，打闹奔跑，也就是这些，没啥意思。</p>
<p>到9月下旬的时候，已经开始转凉了，在地铁上，我甚至看见了穿棉服的人，就是那种领子是毛茸茸的那种衣服，一看就是很保暖的那种，果然是2、8月天乱穿衣，而我还是穿的短袖，也不奇怪，只要自己不觉得怪，怪的就是别人。</p>
<p>今天加了一个友链，管他呢，有人申请就加，我这个博客，就是一年也没几个人加，差点都忘了怎么加了，看看别人的博客，那才是精华了，又有思考，又有深度，还有技术，有的很有趣，有的很真实，我自己的，我就不评价了，我不忍心说自己写的垃圾，怕打击自己。</p>
<p>其实我有时候，是有很好的想法的，只是转瞬即逝，没能记住下来，所以我写，就是保留能够记录下来的可能性。</p>
<p>现在我用ai用的非常频繁，基本上是很少自己写，或者自己去思考、搜索、整理，都是让ai来，然后稍微考虑一下，就作为自己的东西，这已经是一种依赖症状了，我知道，但是效率面前，其他的都要让道，毕竟时间是宝贵的，单位时间内，可以做更多的事情，不是更好吗？</p>
<p>前段时间，本想买车的，国庆节前，说去看车，真到了国庆节，发现钱不够，还是不去了，让人笑话划不来，还是再等等，但是我已经等不起了，我得整点能挣钱的，几千块钱一个月，不够，远远不够。</p>
<p>我以前有个本行，挺挣钱，但是违法，后来我就放下了，现在我又想捡起来了，以前那可是手搓的，花了两三天，现在有ai加持，可能半个小时，一个小时就整出来了，就是不知道还行不行，还能不能挣到钱。</p>
<p>最近总能看的什么缅北的新闻，受害者很惨，作恶的人也很可恶，我很气愤，因为我当时差点去了越南，那时候我才毕业不久，也是在成都找工作，去面试了一个岗位，说是要去外国办公，人家明说了是做菠菜网站的，国内不安全，工资非常高，那时候我刚毕业，也就准备找个几千块的工作，哪见过天花乱坠的场景，差点就去了，而且那时候，还没有什么电炸的概念，觉得去国外挺风格，挣到钱了还可以把父母接过去，心里激动又惊喜，这么好的机会让我抓到了。最终还是因为没钱没去，因为又要办护照，又要买着买那的，觉得麻烦，就没有去。</p>
<p>我要是去了的话，十有八九得埋在那。人民真如草芥虫豸，甚至不如，太低廉卑微了，我们在文明社会活久了，以为世上没有恶魔，只是因为看不清，看不见而已。</p>
<p>所以说，知人知面不知心，坏人太多了，保护好自己，隐藏好自己真的很重要。</p>
]]></content:encoded>
    </item>
    <item>
      <title>桂花开了</title>
      <link>https://goslion.com/diary/2026/20260901/</link>
      <pubDate>Tue, 01 Sep 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260901/</guid>
      <description>大约有两个月没有写了，想来也没什么好写的，我的人生太普通，没什么波澜，更不需要什么观众。之前的工作，可能还能写一些 见闻，去了哪些地方，见了什么，吃了什么之类的，现在则是完全的两点一线，上班下班。 对的，我已经换了工作了，从哈密回来，我又去了昆明，有去了肃宁，我隐约感觉我应该是最后一次去这两个地方了，果然回来， 我就面试了几家，然后两家都面上了，一家小公司，工资高一些，11k，我没有去，我怕领不了 …</description><content:encoded><![CDATA[<p>大约有两个月没有写了，想来也没什么好写的，我的人生太普通，没什么波澜，更不需要什么观众。之前的工作，可能还能写一些
见闻，去了哪些地方，见了什么，吃了什么之类的，现在则是完全的两点一线，上班下班。</p>
<p>对的，我已经换了工作了，从哈密回来，我又去了昆明，有去了肃宁，我隐约感觉我应该是最后一次去这两个地方了，果然回来，
我就面试了几家，然后两家都面上了，一家小公司，工资高一些，11k，我没有去，我怕领不了几个月工资，又要找工作，另一家，
也就是现在的公司，稍微大一点，有些年头，工资低一些，做的东西也不难，正好迎合了我想退一步的想法，我不想再解决复杂的问题了，
也不想再给别人擦屁股了，所以我就入职了。</p>
<p>我七月中旬去的现在的公司，现在已经一个半月了，感觉还行，距离和以前差不多，但是上班更早，8点30，每天都有早会，
所以不能迟到，必须早到，中午休息一个小时，相当于没有休息，吃完饭都12点30多了，下午18点下班，基本不会加班，没做完的事情，
第二天接着做。</p>
<p>如此过了这么久，也没什么波动，我觉得是时候写一写了，以后很长一段时间，我应该都是这个状态了，做点不是很重要的工作，
拿一点死工资，也存不下什么钱，也饿不死。</p>
<p>我好像达到目的了，但是又没达到，我还是很早起，很晚归，还是很累啊，尤其前几天，我感觉脖子老师不舒服，像小针扎，不疼，
但是不能忽视，晚上回来用按摩仪器按摩一会，第二天又会好一些。</p>
<p>最近ai太火了，我也经常用，代码都不想写了，反正纠正过几次，总会写对的，甚至有意外收获，我一度想用ai来创作点什么增加收入，
可是没有找到好的方向，小时，短剧，儿童漫画等等，都没有做到，作为一个计算机行业的人，我觉得有点失败，没能抓住风口，
可是我每天回来都很累，吃完饭，收拾一下啊，就不想动了，躺着很快就能睡着，再睁眼，已经是六点过，又该起床去上班了，如此往复，
我觉得我的脑子已经凝固了，动不起来了。</p>
<p>以前我打算日更，后来觉得麻烦，周更，再后来，就是月更，现在月更也达不到了，渐渐的就消失吧，这何尝不是一种告别呢，我从17年写，
快到27年了，虽然写的烂，但还是有坚持的原则在，所以就一直写，写到现在，马上快10个年头了。</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>我想在就是，上班，下班，吃饭，睡觉。</p>
]]></content:encoded>
    </item>
    <item>
      <title>在哈密</title>
      <link>https://goslion.com/diary/2026/20260627/</link>
      <pubDate>Sat, 27 Jun 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260627/</guid>
      <description>现在是十点，我大概是八点半醒的，醒的时候全身没那么酸了，脑子还是有点昏沉，昨晚三点过睡得， 我在哈密。 周四，我坐了一整天火车，到了哈密，周五上午去客户方现场，周五下午回来，晚上确认收集到的资料，确认没什么问题， 我才敢订回去的票。 累的慌，兜里只有一百多块钱了，三百多的车票买不起，也没买到卧铺，接下来我要坐21个小时的硬座，从哈密到成都，没有什么比这更令人难受了，如果有，那就是昨天，我得知了面试 …</description><content:encoded><![CDATA[<p>现在是十点，我大概是八点半醒的，醒的时候全身没那么酸了，脑子还是有点昏沉，昨晚三点过睡得，
我在哈密。</p>
<p>周四，我坐了一整天火车，到了哈密，周五上午去客户方现场，周五下午回来，晚上确认收集到的资料，确认没什么问题，
我才敢订回去的票。</p>
<p>累的慌，兜里只有一百多块钱了，三百多的车票买不起，也没买到卧铺，接下来我要坐21个小时的硬座，从哈密到成都，没有什么比这更令人难受了，如果有，那就是昨天，我得知了面试没过的消息，那份工作离家比较近，工资也不低，也是我能做的，擅长做的，面试的时候也谈的很好，说很看好我，我一直也在等好消息，最终是没有等到，哎，看来我还得在这个岗位上耗着。</p>
<p>我是从兰州到的哈密，之前去了一趟兰州，也不是什么难事，就是麻烦事而已，我以为可以从兰州回成都，然而不能，然后就转到了哈密，又多呆了两天，就是这样。</p>
<p>舟车劳顿，真的劳累，而且没什么收获，我想想，还是自己不够努力吧，公众号有几天没有更新了，没有坚持下去，休息的时间，就是用来休息了。</p>
<p>我现在想起一个道理了，坑你的人，从来都知道他在坑你，只是装作无辜的样子而已。伪装是人类天生的本事，被看穿的人，都很低级。我感觉我被坑了，每个月到底都剩不了什么钱，也没什么技术含量，也没什么职业提升，就是耗着，浪费生命而已，所以我觉得我被坑了。</p>
<p>坑人的事情太多了，而且往往是熟识的人会坑自己人，外人没那么好坑，因为有防备，反而是认识的人，因为莫名其妙的信任感，而被坑。我早就提了借款流程，可是就是因为漫长的流程批不下来，现在我没钱，我就服了，多大的公司，要走那么长的流程，效率低的要死，那么简单的事情，非要这里那里的扯，而且推脱责任很有本事的，我怀疑他们所有的心思都花在了算计别人身上。你别说，很真有奇效，让人难受这件事情上，他们是如此的擅长，其他的，都很扯淡，把简单的事情复杂化，是如此擅长，我真麻了，我运气不好，我真怪我运气不好。</p>
<p>我得知我没有被选上的时候很平静，因为我早就有了心理预期，可是还是在走出大门，顶着哈密灼灼烈日无处可逃，路面烟尘滚滚的时候，我走在路边，我希望顶替我的那个人出现意外，去不了，然后公司又联系我，让我去，让我逃离这里。</p>
<p>可惜这一切是真的，我没有被选上，接下来我有什么打算，我没有打算了，各方面都突破不了，我难受，我说实话，我感觉我比很多人厉害，比他们聪明，可我为什么没有得到比他们好的待遇，这是不公平的，社会不该是这样。我没见得他们有多厉害，可他们就是比我待遇好，处境好，为什么？</p>
<p>我自己是有原因的，我选错了好多机会，所以造就了今天的结果，越来越偏离我原先的目标，每次以为更近一步，其实是更远一步，就是这么难，选择大于努力，真是真理，要选对，才是最重要的。</p>
<p>我真不知道怎么突破了，怎么才能增加收入，怎么才能保持健康，我早就知道，要有规则的作息，按时吃饭，按时休息，认真工作，可是真的能做到吗？做不到，我出差的时候，经常两三点睡，因为根本睡不着，我早就把助眠的视频听腻了，各地的吃的，我也觉得不好吃，外卖更是难吃，唯一过得去的，就是泡面，然后多喝水，就是这样，我说句实话，拿命换钱，不为过吧？</p>
<p>可这钱，还少的可怜，每月支出完，就剩个几百块，要是有什么额外的开销，我咋整，我没招了，真是的，我经常上完厕所一起身，整个马桶都红了，全是我流的血，我倒是想去医院看看，可我哪有时间，哪有钱，我还不能说没钱的话，没钱这种事情只有我自己能知道，别人不能知道，这就是现实。</p>
<p>我这是混的不好的人，因为我不够卑鄙，我发现了，越是上层的人，越是能压榨人，越是会算计人，他们吃的大腹便便，然后剔着牙，想着怎么才能榨出更多的利润，我听到一个项目的成本压缩到五千的时候，整个人都惊呆了，这种项目还能好吗？所以我太羡慕他们这种能力了，如何做到的，能这么想并且这么做的。</p>
<p>还得靠自己，我不能再浪费休息的时间了，必须想办法离开这里，或者增加收入，因为我不知道哪天就会倒下了，房贷还有十几年，女儿还没长大，我还能活到房贷还完的那一年吗？真是把人笑死了，我自己想想都想笑，这是个什么社会，温水煮青蛙是吧，一点一点把人折磨死，拉磨的牛要在磨盘旁倒下，肚子里是空的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>六月第一周</title>
      <link>https://goslion.com/diary/2026/20260606/</link>
      <pubDate>Sat, 06 Jun 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260606/</guid>
      <description>挺平淡的，最近天气很热，一下子就到了盛夏的境况。 我以为这周会发工资，但是这周到周五都没有发，应该是下周了，绩效已经填了，公司这块又调整了，每天还要写周报，哎，不想写，寄人篱下的感觉。 这周我差点被骗了，就是有个邮件，给我发了面试邀请，听起来是好事，看上去也是，离家很近，工资还高，我一开始真差点信了，还好我后面，我看到QQ邮箱给我发了防诈骗的邮件，套路有点像，也是让我扫码，下载APP，注册账号，说 …</description><content:encoded><![CDATA[<p>六月第一周，挺平淡的，最近天气很热，一下子就到了盛夏的境况。</p>
<p>我以为这周会发工资，但是这周到周五都没有发，应该是下周了，绩效已经填了，公司这块又调整了，每天还要写周报，哎，不想写，寄人篱下的感觉。</p>
<p>这周我差点被骗了，就是有个邮件，给我发了面试邀请，听起来是好事，看上去也是，离家很近，工资还高，我一开始真差点信了，还好我后面，我看到QQ邮箱给我发了防诈骗的邮件，套路有点像，也是让我扫码，下载APP，注册账号，说是企业内部使用的APP，我一开始差点信了，直到我扫完码，然后微信也提示这个链接不安全，一看域名，是一堆乱七八糟的字母和数字，这种就是纯诈骗了，大公司不可能连域名都买不起，所以绝对是假的。</p>
<p>南充的房子，应该要租出去了，很大概率。</p>
<p>我感觉公司应该要算项目奖金了，那天我还做梦了，梦见给好多同事都算了奖金，直接给他们现金，但是唯独没有给我，还好是梦，不然真给我整不会了，我参与的项目那么多，肯定还是有一点的，一点没有，我是不信的。</p>
<p>缺钱啊，这周给老婆整了个笔记本，花了一千多吧，电脑750，检测和邮费几十块钱，然后又买了一根内存条，现在可以使用了，甚至还有显卡，我感觉比我现在使用的这个都好。</p>
<p>想换一下，但是不想拷资料和折腾了，所以放弃，我这个现在已经很顺手和好用了。</p>
<p>今天出去买了一张彩票，我希望能中，甚至已经幻想过中了巨款之后如何调整现有的计划，只是幻想而已，你我都知道这概率有多低。</p>
<p>最近在公司也不是很忙，算是比较平淡的一周，上班下班，吃饭睡觉，就是这样，没什么新鲜的东西。</p>
<p>哦对，忘了吐槽黑袍最终季了，真是一坨屎，虽然越往后看，越预感它要拉了，没想到它拉了这么大一坨。</p>
<p>我做了个公众号，讲Linux的，不瘟不火，我早也知道了，不过我决定再坚持一段时间，然后再看看数据，没必要这么早做决定。</p>
<p>本周就是这样，平淡，没发生什么坏事，其实就挺好的了。</p>
]]></content:encoded>
    </item>
    <item>
      <title>六一儿童节</title>
      <link>https://goslion.com/diary/2026/20260601/</link>
      <pubDate>Mon, 01 Jun 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260601/</guid>
      <description>今天是六一儿童节，当然和我关系不大，该上班还是上班，早上骑车去地铁的时候，由于地面太滑了，还摔了一跤，问题不大，脚趾上磨破了皮，膝盖也是破了一块，不是很疼，只是伤口看起来红了一大片， 有点吓人而已。 上周去了一次昆明，周四去的，周六回来的，周五晚上在昆明南站附近的网吧呆了一晚上，本来住酒店也不踏实，睡不好，而且火车站附近的酒店，环境一般都很差，还不如网吧，可以玩玩游戏，还便宜。 </description><content:encoded><![CDATA[<p>今天是六一儿童节，当然和我关系不大，该上班还是上班，早上骑车去地铁的时候，由于地面太滑了，还摔了一跤，问题不大，脚趾上磨破了皮，膝盖也是破了一块，不是很疼，只是伤口看起来红了一大片，
有点吓人而已。</p>
<p>上周去了一次昆明，周四去的，周六回来的，周五晚上在昆明南站附近的网吧呆了一晚上，本来住酒店也不踏实，睡不好，而且火车站附近的酒店，环境一般都很差，还不如网吧，可以玩玩游戏，还便宜。</p>
<p>这几天过的还可以，不是很忙，总能按时下班，到家也就是七点半的样子，如此过了这个五月。</p>
<p>最近看了WE的比赛，确实让我觉得挺有意思，垫底的队伍把头部队伍打败，确实很有话题，我也是WE的粉丝，只是最近这些年，成绩一直不是很好，所以渐渐的淡漠了。可是，总归还是有点
念想的，现在已经幻想WE的世界赛了，希望别被我给奶没了，保持住势头。</p>
<p>成功是一种感觉，失败也是一种感觉，态度很重要，世事总是如此，会有一直失败的时候，但是要知道为什么失败，不要放弃，总会成功的，成功过后，其实没什么不一样，和失败差不多，
要保持成功的感觉，就要知道为什么成功，才能一直成功。</p>
<p>还有什么呢？不要被短暂的低谷所摧毁，人不可能一直低谷的，低谷很可怕，心理身体都是折磨，但是还是要坚持住，抗争、尝试，直到走出去。</p>
<p>我其实很想休息，每天早上都不想起来，我的瞌睡总是睡不完，可是我不能，晚几分钟起床，我就会迟到，回来的时候，我忽然想到，从地铁口到小区门口，这段路，不知不觉我已经走了一年多了，
虽然每次都觉得好远，为什么车不能早一点出现，可每次都坚持下来了。</p>
<p>其实没啥，坚持而已，没那么难。</p>
<p>我记得我初中还过儿童节呢，那时候是新来的语文老师，大学毕业，年轻又有活力，有想法，尊重学生们的想法，所以才会让我们参加六一儿童节，我们的节目是大合唱，可是我家里穷，买不起
统一的白鞋子，还是穿的女同学的鞋子，我当时在台上很紧张，想挤进人群里，脸估计红的不行，但终究是唱完了，随着指挥挥手，周围的声音把我淹没，一切都恢复正常了，我融入了集体，就像一滴水
滴进了湖泊海洋，台下的观众找不见我，我也找不见我。</p>
<p>关于那个老师的记忆，我太深刻了，因为当时和同学讨论过，如果世界末日，只能救两个人，我肯定会救老师的，至于为何，又花了好多时间，来辩论，反正是我赢了，前后左右的同学都被我
说服了，我那时候觉得，我肯定是个辩论的天才，直到后来，我见过了真正辩论厉害的人，原来我的辩论不过如此，强词夺理，同学不想搭理罢了。</p>
<p>可是后来，我也没有机会救我的语文老师，见都没见过，真是可惜，现在我这个年纪，见了她估计都认不出来了。</p>
<p>儿童节不该讨论这么沉重的话题，但是我的童年并不快乐，所以我无法讨论快乐的话题，因为儿童节放假，我就要回家做农活，我不想做农活，所以我不想放假，不想过儿童节。</p>
<p>还有什么呢？我们的征途是星辰大海，不要为一城一池的得失而悲伤，鼓起勇气，那么再难，也要前进。</p>
]]></content:encoded>
    </item>
    <item>
      <title>瞎折腾</title>
      <link>https://goslion.com/diary/2026/20260523/</link>
      <pubDate>Sat, 23 May 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260523/</guid>
      <description>我不想瞎折腾了，累的很，之前一直寻思换个配置好点的电脑，闲暇之余可以玩几把游戏，最终也没能如愿，换了个坏电脑， 而且很重，而且显卡是坏的，比我之前的唯一有点是存储大了一倍，仅此而已。 今天想想，还是轻薄商务本更适合我，于是花了一下午的时间拷贝资料，临到了晚上，资料都拷贝的差不多了，我想起来，换硬盘也是一种方案， 于是又折腾了一段时间，几个小时，总算是把硬盘换了，两个电脑都开机了，现在又把资料往回 …</description><content:encoded><![CDATA[<p>我不想瞎折腾了，累的很，之前一直寻思换个配置好点的电脑，闲暇之余可以玩几把游戏，最终也没能如愿，换了个坏电脑，
而且很重，而且显卡是坏的，比我之前的唯一有点是存储大了一倍，仅此而已。</p>
<p>今天想想，还是轻薄商务本更适合我，于是花了一下午的时间拷贝资料，临到了晚上，资料都拷贝的差不多了，我想起来，换硬盘也是一种方案，
于是又折腾了一段时间，几个小时，总算是把硬盘换了，两个电脑都开机了，现在又把资料往回拷，我真是被自己蠢得，尽做些不理智的决定。</p>
<p>转眼就五月底了，这个月没怎么出差，除了月初去了一次张家界，第二天就回来了，就没再出去过，听说公司最近钱有点紧张不知是不是真的，
不过应该是。</p>
<p>我在公司，其实事情不多，我的价值主要体现在出差上，如果不出差，那么任何人都可以代替我，所以我还挺有危机感，找了一些事情做，
不然月底不知道怎么写总结了。</p>
<p>其次就是，我回了一趟南充，拿了烤箱过来，卖了那边的电脑，又拿了限制很久的iPhone SE过来，卖了240元钱，台式电脑卖了500多，围栏卖了91，
算下来，有接近1000块钱了，算是找了点回血的路子。</p>
<p>钱依旧是不够的，总是要算着点，我刚刚看了个视频，是个钓鱼的，说他的心态就是小鱼不想钓，大鱼钓不到，转而引申到现实里，
小钱看不上，大钱赚不到。要转变态度，变成小鱼也要钓，大鱼也要准备机会，所以小钱也要赚，大钱要准备着，看准时机下手。</p>
<p>我小孩挺可爱的，就是不爱吃饭，可能天气热了，胃口不好，吃了包在口里不咽，然后过一会吐出来，弄得衣服，地上到处都是，骂也不是打也不是，
总之就是没有任何办法，而且很犟，东西一定要争到手，到手了就不会轻易给别人，除非有新的感兴趣的东西。</p>
<p>所以我现在，少瞎折腾，把现状维持走，再看更好的机会，才是正解，减少支出，增加收入，但是也要注意身体，我最近就是很容易忘事，那天还是好久，
高压锅里热的菜，忘了关火，导致后面，锅底都烧黑了，肉都碳化，巴锅了，楼上物管都给我打电话呢，我才猛然想起来，哎，还好没有引发严重的后果。</p>
<p>我以后会不会得老年痴呆噢，我估计是分心太多了，考虑事情多了，大脑容易疲劳就产生懈怠了，忽略了重要的信息，那天就是，我倒到床上，听着7ero的视频，十多分钟应该
就睡着了，发现的时候，也就是20多分钟，我是被惊醒的，后来很晚才睡。</p>
<p>所以，劳逸结合很重要，休息好，才能做好，不能一直休息，也不能一直劳动。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Office 2016 使用手册</title>
      <link>https://goslion.com/tech/etc/office-2016-manual/</link>
      <pubDate>Fri, 15 May 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/tech/etc/office-2016-manual/</guid>
      <description>目录 第一部分：通用基础 第二部分：Word 2016 第三部分：Excel 2016 第四部分：PowerPoint 2016 第五部分：Outlook 2016 第六部分：常用快捷键汇总 第一部分：通用基础 1.1 安装与激活 支持系统：Windows 7 SP1 及以上 / macOS 10.10 及以上 激活方式：密钥激活 / Microsoft 账户绑定 / KMS 批量激活 1.2 通 …</description><content:encoded><![CDATA[<h1 id="office-2016-使用手册">Office 2016 使用手册</h1>
<h2 id="目录">目录</h2>
<ul>
<li><a href="#%E7%AC%AC%E4%B8%80%E9%83%A8%E5%88%86%E9%80%9A%E7%94%A8%E5%9F%BA%E7%A1%80">第一部分：通用基础</a></li>
<li><a href="#%E7%AC%AC%E4%BA%8C%E9%83%A8%E5%88%86word-2016">第二部分：Word 2016</a></li>
<li><a href="#%E7%AC%AC%E4%B8%89%E9%83%A8%E5%88%86excel-2016">第三部分：Excel 2016</a></li>
<li><a href="#%E7%AC%AC%E5%9B%9B%E9%83%A8%E5%88%86powerpoint-2016">第四部分：PowerPoint 2016</a></li>
<li><a href="#%E7%AC%AC%E4%BA%94%E9%83%A8%E5%88%86outlook-2016">第五部分：Outlook 2016</a></li>
<li><a href="#%E7%AC%AC%E5%85%AD%E9%83%A8%E5%88%86%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E6%B1%87%E6%80%BB">第六部分：常用快捷键汇总</a></li>
</ul>
<hr>
<h2 id="第一部分通用基础">第一部分：通用基础</h2>
<h3 id="11-安装与激活">1.1 安装与激活</h3>
<ul>
<li>支持系统：Windows 7 SP1 及以上 / macOS 10.10 及以上</li>
<li>激活方式：密钥激活 / Microsoft 账户绑定 / KMS 批量激活</li>
</ul>
<h3 id="12-通用界面布局">1.2 通用界面布局</h3>
<p>Office 2016 采用 <strong>Ribbon（功能区）</strong> 界面，由以下部分组成：</p>
<table>
  <thead>
      <tr>
          <th>区域</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>快速访问工具栏</td>
          <td>左上角，可自定义常用命令（保存、撤销、恢复）</td>
      </tr>
      <tr>
          <td>选项卡（标签页）</td>
          <td>如&quot;开始&quot;&ldquo;插入&quot;&ldquo;设计&quot;&ldquo;布局&quot;等，按功能分类</td>
      </tr>
      <tr>
          <td>功能区</td>
          <td>每个选项卡下的具体命令按钮区域</td>
      </tr>
      <tr>
          <td>状态栏</td>
          <td>窗口底部，显示页数、字数、视图切换等信息</td>
      </tr>
  </tbody>
</table>
<h3 id="13-通用操作">1.3 通用操作</h3>
<p><strong>文件操作</strong></p>
<ul>
<li><code>Ctrl + N</code> 新建文档</li>
<li><code>Ctrl + O</code> 打开文档</li>
<li><code>Ctrl + S</code> 保存文档</li>
<li><code>F12</code> 另存为</li>
<li><code>Ctrl + P</code> 打印</li>
</ul>
<p><strong>编辑操作</strong></p>
<ul>
<li><code>Ctrl + Z</code> 撤销</li>
<li><code>Ctrl + Y</code> 恢复（重做）</li>
<li><code>Ctrl + X</code> 剪切</li>
<li><code>Ctrl + C</code> 复制</li>
<li><code>Ctrl + V</code> 粘贴</li>
<li><code>Ctrl + A</code> 全选</li>
<li><code>Ctrl + F</code> 查找</li>
<li><code>Ctrl + H</code> 替换</li>
</ul>
<p><strong>视图操作</strong></p>
<ul>
<li><code>Ctrl + 鼠标滚轮</code> 缩放页面</li>
<li><code>Alt</code> 键 显示/隐藏功能区快捷键提示</li>
</ul>
<h3 id="14-账户与云端">1.4 账户与云端</h3>
<ul>
<li>右上角登录 Microsoft 账户后可同步设置</li>
<li>OneDrive 集成：可直接保存/打开云端文件</li>
<li>最近使用的文档：<code>文件 → 打开 → 最近</code></li>
</ul>
<hr>
<h2 id="第二部分word-2016">第二部分：Word 2016</h2>
<h3 id="21-基础排版">2.1 基础排版</h3>
<h4 id="文字格式">文字格式</h4>
<ul>
<li><strong>字体设置</strong>：<code>开始 → 字体</code> 组，可选择字体、字号、加粗(<code>Ctrl+B</code>)、斜体(<code>Ctrl+I</code>)、下划线(<code>Ctrl+U</code>)</li>
<li><strong>颜色与突出显示</strong>：字体颜色按钮 和 文本突出显示颜色（荧光笔）</li>
<li><strong>清除格式</strong>：<code>开始 → 字体 → 清除所有格式</code> 按钮</li>
</ul>
<h4 id="段落格式">段落格式</h4>
<ul>
<li><strong>对齐方式</strong>：左对齐(<code>Ctrl+L</code>)、居中(<code>Ctrl+E</code>)、右对齐(<code>Ctrl+R</code>)、两端对齐(<code>Ctrl+J</code>)</li>
<li><strong>行距</strong>：<code>开始 → 段落 → 行和段落间距</code></li>
<li><strong>缩进</strong>：<code>开始 → 段落 → 增加/减少缩进</code>，或使用标尺拖动</li>
<li><strong>项目符号和编号</strong>：<code>开始 → 段落</code> 组中的按钮</li>
</ul>
<h4 id="样式">样式</h4>
<ul>
<li><strong>使用样式</strong>：<code>开始 → 样式</code> 库，快速应用标题、正文等预设格式</li>
<li><strong>修改样式</strong>：右键样式 → 修改</li>
<li><strong>创建目录</strong>：应用标题样式后，<code>引用 → 目录 → 自动目录</code></li>
</ul>
<h3 id="22-页面布局">2.2 页面布局</h3>
<ul>
<li><strong>纸张大小</strong>：<code>布局 → 页面设置 → 纸张大小</code>（A4 为默认）</li>
<li><strong>页边距</strong>：<code>布局 → 页面设置 → 页边距</code></li>
<li><strong>分栏</strong>：<code>布局 → 页面设置 → 分栏</code></li>
<li><strong>分页符/分节符</strong>：<code>布局 → 页面设置 → 分隔符</code>
<ul>
<li>分页符(<code>Ctrl+Enter</code>)：强制换页</li>
<li>分节符：用于不同页面设置（如纵向/横向混排）</li>
</ul>
</li>
</ul>
<h3 id="23-插入对象">2.3 插入对象</h3>
<table>
  <thead>
      <tr>
          <th>对象</th>
          <th>路径</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>图片</td>
          <td><code>插入 → 插图 → 图片</code></td>
          <td>支持 JPG/PNG 等格式</td>
      </tr>
      <tr>
          <td>表格</td>
          <td><code>插入 → 表格</code></td>
          <td>快速制表或插入 Excel 工作表</td>
      </tr>
      <tr>
          <td>形状</td>
          <td><code>插入 → 插图 → 形状</code></td>
          <td>矩形、箭头、流程图等</td>
      </tr>
      <tr>
          <td>SmartArt</td>
          <td><code>插入 → 插图 → SmartArt</code></td>
          <td>组织结构图、流程图等</td>
      </tr>
      <tr>
          <td>图表</td>
          <td><code>插入 → 插图 → 图表</code></td>
          <td>柱状图、折线图、饼图等</td>
      </tr>
      <tr>
          <td>文本框</td>
          <td><code>插入 → 文本 → 文本框</code></td>
          <td>灵活排版文字</td>
      </tr>
      <tr>
          <td>页眉页脚</td>
          <td><code>插入 → 页眉和页脚</code></td>
          <td>双击页面顶端/底端也可进入</td>
      </tr>
      <tr>
          <td>页码</td>
          <td><code>插入 → 页眉和页脚 → 页码</code></td>
          <td>支持多种位置和格式</td>
      </tr>
      <tr>
          <td>公式</td>
          <td><code>插入 → 符号 → 公式</code></td>
          <td>内置公式或手写输入</td>
      </tr>
  </tbody>
</table>
<h3 id="24-表格操作">2.4 表格操作</h3>
<ul>
<li><strong>快速选择</strong>：鼠标悬停在表格左上角点击全选图标</li>
<li><strong>增删行列</strong>：右键 → 插入/删除</li>
<li><strong>合并/拆分单元格</strong>：选中单元格 → <code>表格工具 → 布局</code></li>
<li><strong>表格样式</strong>：<code>表格工具 → 设计</code> 选择预设样式</li>
<li><strong>重复标题行</strong>：选中标题行 → <code>表格工具 → 布局 → 重复标题行</code>（跨页表格必备）</li>
</ul>
<h3 id="25-引用与审阅">2.5 引用与审阅</h3>
<ul>
<li><strong>脚注/尾注</strong>：<code>引用 → 脚注 → 插入脚注</code></li>
<li><strong>题注</strong>：<code>引用 → 题注 → 插入题注</code>（图表编号）</li>
<li><strong>交叉引用</strong>：<code>引用 → 题注 → 交叉引用</code></li>
<li><strong>批注</strong>：<code>审阅 → 批注 → 新建批注</code></li>
<li><strong>修订模式</strong>：<code>审阅 → 修订 → 修订</code>（修改记录可见）</li>
<li><strong>比较文档</strong>：<code>审阅 → 比较 → 比较</code></li>
</ul>
<h3 id="26-邮件合并批量制作信函标签">2.6 邮件合并（批量制作信函/标签）</h3>
<ol>
<li><code>邮件 → 开始邮件合并 → 选择文档类型</code></li>
<li><code>选择收件人 → 使用现有列表</code>（导入 Excel 数据源）</li>
<li>插入合并域（如&quot;姓名&quot;&ldquo;地址&rdquo;）</li>
<li><code>完成并合并 → 编辑单个文档</code> 或 直接打印</li>
</ol>
<h3 id="27-常用技巧">2.7 常用技巧</h3>
<ul>
<li><strong>格式刷</strong>：<code>Ctrl+Shift+C</code> 复制格式，<code>Ctrl+Shift+V</code> 粘贴格式；双击格式刷可反复使用</li>
<li><strong>导航窗格</strong>：<code>Ctrl+F</code> 打开，可快速跳转标题、页面</li>
<li><strong>即点即输</strong>：在空白处双击可直接输入文字</li>
<li><strong>选择性粘贴</strong>：<code>Ctrl+Alt+V</code>，可选择只粘贴文本（去除格式）</li>
<li><strong>生成 PDF</strong>：<code>文件 → 导出 → 创建 PDF/XPS</code></li>
</ul>
<hr>
<h2 id="第三部分excel-2016">第三部分：Excel 2016</h2>
<h3 id="31-工作簿与工作表基础">3.1 工作簿与工作表基础</h3>
<ul>
<li><strong>工作簿</strong> = 一个 Excel 文件（<code>.xlsx</code>）</li>
<li><strong>工作表</strong> = 工作簿中的单张表（底部 Sheet 标签）</li>
<li><strong>单元格地址</strong>：列字母 + 行号，如 A1、C5</li>
<li><strong>区域表示</strong>：<code>A1:B10</code>（左上到右下）</li>
</ul>
<p><strong>工作表操作</strong></p>
<ul>
<li>新建工作表：点击底部 <code>+</code> 号，或 <code>Shift+F11</code></li>
<li>重命名：双击 Sheet 标签</li>
<li>移动/复制：右键 Sheet 标签 → 移动或复制</li>
<li>标签颜色：右键 Sheet 标签 → 工作表标签颜色</li>
</ul>
<h3 id="32-数据输入与填充">3.2 数据输入与填充</h3>
<h4 id="快速填充">快速填充</h4>
<ul>
<li><strong>填充柄</strong>：拖动单元格右下角小黑方块</li>
<li><strong>序列填充</strong>：<code>开始 → 编辑 → 填充 → 序列</code></li>
<li><strong>快速填充（Flash Fill）</strong>：<code>Ctrl+E</code>，自动识别模式提取/合并数据（2013 新增，2016 增强）</li>
</ul>
<h4 id="数据验证下拉列表输入限制">数据验证（下拉列表/输入限制）</h4>
<ol>
<li>选中单元格区域</li>
<li><code>数据 → 数据工具 → 数据验证</code></li>
<li>设置允许条件（如：序列 → 输入&quot;选项1,选项2,选项3&rdquo;）</li>
</ol>
<h3 id="33-公式与函数">3.3 公式与函数</h3>
<h4 id="公式基础">公式基础</h4>
<ul>
<li>所有公式以 <code>=</code> 开头</li>
<li>单元格引用三种模式（按 <code>F4</code> 切换）：
<ul>
<li><code>A1</code> 相对引用（复制公式时会变化）</li>
<li><code>$A$1</code> 绝对引用（复制公式时固定不变）</li>
<li><code>$A1</code> 或 <code>A$1</code> 混合引用</li>
</ul>
</li>
</ul>
<h4 id="常用函数分类">常用函数分类</h4>
<p><strong>数学与统计</strong></p>
<table>
  <thead>
      <tr>
          <th>函数</th>
          <th>语法</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>SUM</td>
          <td><code>=SUM(范围)</code></td>
          <td>求和</td>
      </tr>
      <tr>
          <td>AVERAGE</td>
          <td><code>=AVERAGE(范围)</code></td>
          <td>求平均值</td>
      </tr>
      <tr>
          <td>MAX / MIN</td>
          <td><code>=MAX(范围)</code> / <code>=MIN(范围)</code></td>
          <td>最大值/最小值</td>
      </tr>
      <tr>
          <td>COUNT</td>
          <td><code>=COUNT(范围)</code></td>
          <td>统计数字个数</td>
      </tr>
      <tr>
          <td>COUNTA</td>
          <td><code>=COUNTA(范围)</code></td>
          <td>统计非空单元格</td>
      </tr>
      <tr>
          <td>COUNTIF</td>
          <td><code>=COUNTIF(范围, 条件)</code></td>
          <td>按条件计数</td>
      </tr>
      <tr>
          <td>SUMIF</td>
          <td><code>=SUMIF(条件范围, 条件, 求和范围)</code></td>
          <td>按条件求和</td>
      </tr>
      <tr>
          <td>SUMIFS</td>
          <td><code>=SUMIFS(求和范围, 条件范围1, 条件1, 条件范围2, 条件2,...)</code></td>
          <td>多条件求和</td>
      </tr>
      <tr>
          <td>ROUND</td>
          <td><code>=ROUND(数值, 小数位数)</code></td>
          <td>四舍五入</td>
      </tr>
  </tbody>
</table>
<p><strong>逻辑函数</strong></p>
<table>
  <thead>
      <tr>
          <th>函数</th>
          <th>语法</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>IF</td>
          <td><code>=IF(条件, 真值, 假值)</code></td>
          <td>条件判断</td>
      </tr>
      <tr>
          <td>AND</td>
          <td><code>=AND(条件1, 条件2,...)</code></td>
          <td>全部为真则返回 TRUE</td>
      </tr>
      <tr>
          <td>OR</td>
          <td><code>=OR(条件1, 条件2,...)</code></td>
          <td>任一为真则返回 TRUE</td>
      </tr>
      <tr>
          <td>IFERROR</td>
          <td><code>=IFERROR(公式, 出错时的值)</code></td>
          <td>错误处理</td>
      </tr>
  </tbody>
</table>
<p><strong>查找与引用</strong></p>
<table>
  <thead>
      <tr>
          <th>函数</th>
          <th>语法</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>VLOOKUP</td>
          <td><code>=VLOOKUP(查找值, 表格范围, 列序号, 0)</code></td>
          <td>垂直查找（0=精确匹配）</td>
      </tr>
      <tr>
          <td>HLOOKUP</td>
          <td><code>=HLOOKUP(查找值, 表格范围, 行序号, 0)</code></td>
          <td>水平查找</td>
      </tr>
      <tr>
          <td>INDEX</td>
          <td><code>=INDEX(范围, 行号, 列号)</code></td>
          <td>返回指定位置的值</td>
      </tr>
      <tr>
          <td>MATCH</td>
          <td><code>=MATCH(查找值, 范围, 0)</code></td>
          <td>返回匹配项的位置</td>
      </tr>
  </tbody>
</table>
<p><strong>文本函数</strong></p>
<table>
  <thead>
      <tr>
          <th>函数</th>
          <th>语法</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>LEFT / RIGHT</td>
          <td><code>=LEFT(文本, 字符数)</code></td>
          <td>从左/右截取</td>
      </tr>
      <tr>
          <td>MID</td>
          <td><code>=MID(文本, 起始位置, 字符数)</code></td>
          <td>从中间截取</td>
      </tr>
      <tr>
          <td>LEN</td>
          <td><code>=LEN(文本)</code></td>
          <td>文本长度</td>
      </tr>
      <tr>
          <td>CONCATENATE</td>
          <td><code>=CONCATENATE(文本1, 文本2,...)</code></td>
          <td>文本合并（也可用 <code>&amp;</code>）</td>
      </tr>
      <tr>
          <td>TRIM</td>
          <td><code>=TRIM(文本)</code></td>
          <td>去除多余空格</td>
      </tr>
      <tr>
          <td>TEXT</td>
          <td><code>=TEXT(数值, &quot;格式代码&quot;)</code></td>
          <td>数字转文本并格式化</td>
      </tr>
  </tbody>
</table>
<p><strong>日期与时间</strong></p>
<table>
  <thead>
      <tr>
          <th>函数</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>TODAY()</td>
          <td>当前日期</td>
      </tr>
      <tr>
          <td>NOW()</td>
          <td>当前日期和时间</td>
      </tr>
      <tr>
          <td>YEAR / MONTH / DAY</td>
          <td>提取年/月/日</td>
      </tr>
      <tr>
          <td>DATEDIF</td>
          <td><code>=DATEDIF(开始日期, 结束日期, &quot;Y&quot;/&quot;M&quot;/&quot;D&quot;)</code> 计算间隔</td>
      </tr>
      <tr>
          <td>WEEKDAY</td>
          <td>返回星期几（1-7）</td>
      </tr>
  </tbody>
</table>
<h3 id="34-数据管理">3.4 数据管理</h3>
<h4 id="排序">排序</h4>
<ol>
<li>选中数据区域任一单元格</li>
<li><code>数据 → 排序和筛选 → 排序</code></li>
<li>添加多个排序条件（主要关键字 → 次要关键字）</li>
</ol>
<h4 id="筛选">筛选</h4>
<ul>
<li><strong>自动筛选</strong>：<code>数据 → 排序和筛选 → 筛选</code>，或 <code>Ctrl+Shift+L</code></li>
<li><strong>高级筛选</strong>：<code>数据 → 排序和筛选 → 高级</code>，支持复杂条件和提取到新位置</li>
</ul>
<h4 id="删除重复值">删除重复值</h4>
<ul>
<li><code>数据 → 数据工具 → 删除重复值</code></li>
</ul>
<h4 id="分列">分列</h4>
<ul>
<li><code>数据 → 数据工具 → 分列</code>，按分隔符或固定宽度拆分一列为多列</li>
</ul>
<h3 id="35-数据透视表">3.5 数据透视表</h3>
<p><strong>创建步骤</strong></p>
<ol>
<li>选中数据源区域</li>
<li><code>插入 → 表格 → 数据透视表</code></li>
<li>选择放置位置（新工作表/现有工作表）</li>
<li>在右侧字段列表中拖拽字段到&quot;行&quot;&ldquo;列&quot;&ldquo;值&quot;&ldquo;筛选&quot;区域</li>
</ol>
<p><strong>常用操作</strong></p>
<ul>
<li>值字段设置：点击值区域字段 → 值字段设置 → 选择汇总方式（求和/计数/平均值）</li>
<li>刷新：右键数据透视表 → 刷新</li>
<li>切片器：<code>数据透视表工具 → 分析 → 筛选 → 插入切片器</code>（直观的筛选控件）</li>
<li>时间线：<code>数据透视表工具 → 分析 → 筛选 → 插入时间线</code>（日期筛选）</li>
</ul>
<h3 id="36-图表">3.6 图表</h3>
<p><strong>创建图表</strong></p>
<ol>
<li>选中数据区域</li>
<li><code>插入 → 图表</code> 组，选择图表类型</li>
<li>使用 <code>图表工具 → 设计/格式</code> 进行美化</li>
</ol>
<p><strong>图表类型选择</strong></p>
<table>
  <thead>
      <tr>
          <th>场景</th>
          <th>推荐图表</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>数据对比</td>
          <td>柱状图/条形图</td>
      </tr>
      <tr>
          <td>趋势变化</td>
          <td>折线图</td>
      </tr>
      <tr>
          <td>占比分布</td>
          <td>饼图/圆环图</td>
      </tr>
      <tr>
          <td>两个变量关系</td>
          <td>散点图</td>
      </tr>
      <tr>
          <td>多维度比较</td>
          <td>雷达图</td>
      </tr>
  </tbody>
</table>
<p><strong>组合图表</strong>：<code>图表工具 → 设计 → 更改图表类型 → 组合</code></p>
<h3 id="37-条件格式">3.7 条件格式</h3>
<ul>
<li><code>开始 → 样式 → 条件格式</code></li>
<li><strong>数据条</strong>：单元格内显示进度条</li>
<li><strong>色阶</strong>：按数值大小着色</li>
<li><strong>图标集</strong>：添加方向箭头、星级等图标</li>
<li><strong>自定义规则</strong>：<code>新建规则 → 使用公式确定要设置格式的单元格</code></li>
</ul>
<h3 id="38-保护与打印">3.8 保护与打印</h3>
<ul>
<li><strong>保护工作表</strong>：<code>审阅 → 保护 → 保护工作表</code>（可设密码，限制编辑）</li>
<li><strong>锁定单元格</strong>：先设置单元格格式 → 保护 → 锁定，再保护工作表才生效</li>
<li><strong>打印标题</strong>：<code>页面布局 → 页面设置 → 打印标题</code>（每页重复打印表头）</li>
<li><strong>打印区域</strong>：<code>页面布局 → 页面设置 → 打印区域 → 设置打印区域</code></li>
<li><strong>调整为一页</strong>：<code>文件 → 打印 → 设置 → 将工作表调整为一页</code></li>
</ul>
<hr>
<h2 id="第四部分powerpoint-2016">第四部分：PowerPoint 2016</h2>
<h3 id="41-基础操作">4.1 基础操作</h3>
<ul>
<li><strong>新建幻灯片</strong>：<code>开始 → 幻灯片 → 新建幻灯片</code>，或 <code>Ctrl+M</code></li>
<li><strong>幻灯片版式</strong>：<code>开始 → 幻灯片 → 版式</code></li>
<li><strong>分节管理</strong>：右键幻灯片缩略图之间 → 新增节（适合大型演示文稿）</li>
<li><strong>重用幻灯片</strong>：<code>开始 → 幻灯片 → 新建幻灯片 → 重用幻灯片</code></li>
</ul>
<h3 id="42-设计主题">4.2 设计主题</h3>
<ul>
<li><strong>应用主题</strong>：<code>设计 → 主题</code> 库</li>
<li><strong>变体</strong>：<code>设计 → 变体</code>（配色方案和字体组合）</li>
<li><strong>自定义母版</strong>：<code>视图 → 母版视图 → 幻灯片母版</code>
<ul>
<li>母版修改会应用到所有使用该版式的幻灯片</li>
<li>适合统一添加公司 Logo、统一的页脚等</li>
</ul>
</li>
</ul>
<h3 id="43-插入多媒体">4.3 插入多媒体</h3>
<ul>
<li><strong>图片</strong>：<code>插入 → 图像 → 图片</code></li>
<li><strong>视频</strong>：<code>插入 → 媒体 → 视频</code>（支持在线视频/本地文件）</li>
<li><strong>音频</strong>：<code>插入 → 媒体 → 音频</code></li>
<li><strong>屏幕录制</strong>：<code>插入 → 媒体 → 屏幕录制</code></li>
</ul>
<h3 id="44-动画">4.4 动画</h3>
<h4 id="切换效果幻灯片之间">切换效果（幻灯片之间）</h4>
<ul>
<li><code>切换</code> 选项卡，选择过渡动画</li>
<li>可设置持续时间、自动换片时间</li>
</ul>
<h4 id="自定义动画元素动画">自定义动画（元素动画）</h4>
<ol>
<li>选中对象 → <code>动画</code> 选项卡 → 选择动画效果</li>
<li><strong>进入动画</strong>（绿色）：物体出现</li>
<li><strong>强调动画</strong>（黄色）：物体变化</li>
<li><strong>退出动画</strong>（红色）：物体消失</li>
<li><strong>动作路径</strong>：物体按路径移动</li>
</ol>
<p><strong>动画窗格</strong>：<code>动画 → 高级动画 → 动画窗格</code>，管理所有动画的顺序和时间</p>
<p><strong>触发条件</strong></p>
<ul>
<li>单击时</li>
<li>与上一动画同时（<code>与上一动画同时</code>）</li>
<li>上一动画之后（<code>上一动画之后</code>）</li>
</ul>
<h3 id="45-幻灯片放映">4.5 幻灯片放映</h3>
<ul>
<li><strong>从头开始</strong>：<code>F5</code></li>
<li><strong>从当前幻灯片开始</strong>：<code>Shift+F5</code></li>
<li><strong>演示者视图</strong>：<code>幻灯片放映 → 监视器 → 使用演示者视图</code>（需双屏）
<ul>
<li>可看到备注、下一张预览、计时器</li>
</ul>
</li>
<li><strong>自定义放映</strong>：<code>幻灯片放映 → 开始放映幻灯片 → 自定义幻灯片放映</code></li>
<li><strong>排练计时</strong>：<code>幻灯片放映 → 设置 → 排练计时</code>（记录每页停留时间）</li>
</ul>
<h3 id="46-常用技巧">4.6 常用技巧</h3>
<ul>
<li><strong>快速对齐</strong>：选中多个对象 → <code>格式 → 排列 → 对齐</code></li>
<li><strong>图层管理</strong>：<code>格式 → 排列 → 选择窗格</code>（管理对象层级和可见性）</li>
<li><strong>SmartArt 转换</strong>：选中文字占位符 → <code>开始 → 段落 → 转换为 SmartArt</code></li>
<li><strong>取色器</strong>：<code>格式 → 形状填充/轮廓 → 取色器</code>（吸取页面任意颜色）</li>
<li><strong>导出视频</strong>：<code>文件 → 导出 → 创建视频</code></li>
<li><strong>演示者备注</strong>：每张幻灯片下方的备注区（仅演示者可见）</li>
</ul>
<hr>
<h2 id="第五部分outlook-2016">第五部分：Outlook 2016</h2>
<h3 id="51-邮件基础">5.1 邮件基础</h3>
<ul>
<li><strong>新建邮件</strong>：<code>Ctrl+N</code>（在收件箱中）或 <code>Ctrl+Shift+M</code></li>
<li><strong>发送/接收</strong>：<code>F9</code></li>
<li><strong>回复</strong>：<code>Ctrl+R</code></li>
<li><strong>全部回复</strong>：<code>Ctrl+Shift+R</code></li>
<li><strong>转发</strong>：<code>Ctrl+F</code></li>
<li><strong>添加附件</strong>：<code>插入 → 附件</code> 或直接拖拽到邮件</li>
</ul>
<h3 id="52-邮件管理">5.2 邮件管理</h3>
<ul>
<li><strong>分类</strong>：右键邮件 → 分类 → 选择颜色标签</li>
<li><strong>标记</strong>：右键邮件 → 后续标志 → 设置提醒日期</li>
<li><strong>规则</strong>：<code>开始 → 移动 → 规则 → 管理规则和通知</code>
<ul>
<li>自动将特定发件人的邮件移到指定文件夹</li>
</ul>
</li>
<li><strong>搜索文件夹</strong>：<code>文件夹 → 新建 → 新建搜索文件夹</code>（如&quot;未读邮件&quot;汇总视图）</li>
</ul>
<h3 id="53-日历">5.3 日历</h3>
<ul>
<li><strong>新建约会</strong>：<code>Ctrl+Shift+A</code></li>
<li><strong>创建会议</strong>：<code>Ctrl+Shift+Q</code>（可添加与会者，查看忙闲状态）</li>
<li><strong>视图切换</strong>：日/工作周/周/月/日程</li>
<li><strong>共享日历</strong>：<code>开始 → 共享 → 共享日历</code></li>
</ul>
<h3 id="54-联系人人员">5.4 联系人（人员）</h3>
<ul>
<li><strong>新建联系人</strong>：<code>Ctrl+Shift+C</code></li>
<li><strong>联系人组</strong>：<code>Ctrl+Shift+L</code>（群发邮件）</li>
</ul>
<h3 id="55-常用设置">5.5 常用设置</h3>
<ul>
<li><strong>签名</strong>：<code>文件 → 选项 → 邮件 → 签名</code></li>
<li><strong>自动回复</strong>：<code>文件 → 信息 → 自动答复</code>（外出时使用）</li>
<li><strong>邮件归档</strong>：<code>文件 → 工具 → 清理邮箱</code> / 手动拖拽到存档文件夹</li>
</ul>
<hr>
<h2 id="第六部分常用快捷键汇总">第六部分：常用快捷键汇总</h2>
<h3 id="通用快捷键">通用快捷键</h3>
<table>
  <thead>
      <tr>
          <th>快捷键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Ctrl + N</code></td>
          <td>新建</td>
      </tr>
      <tr>
          <td><code>Ctrl + O</code></td>
          <td>打开</td>
      </tr>
      <tr>
          <td><code>Ctrl + S</code></td>
          <td>保存</td>
      </tr>
      <tr>
          <td><code>F12</code></td>
          <td>另存为</td>
      </tr>
      <tr>
          <td><code>Ctrl + W</code></td>
          <td>关闭文档</td>
      </tr>
      <tr>
          <td><code>Ctrl + P</code></td>
          <td>打印</td>
      </tr>
      <tr>
          <td><code>Ctrl + Z</code></td>
          <td>撤销</td>
      </tr>
      <tr>
          <td><code>Ctrl + Y</code></td>
          <td>恢复</td>
      </tr>
      <tr>
          <td><code>Ctrl + X</code></td>
          <td>剪切</td>
      </tr>
      <tr>
          <td><code>Ctrl + C</code></td>
          <td>复制</td>
      </tr>
      <tr>
          <td><code>Ctrl + V</code></td>
          <td>粘贴</td>
      </tr>
      <tr>
          <td><code>Ctrl + A</code></td>
          <td>全选</td>
      </tr>
      <tr>
          <td><code>Ctrl + F</code></td>
          <td>查找</td>
      </tr>
      <tr>
          <td><code>Ctrl + H</code></td>
          <td>替换</td>
      </tr>
      <tr>
          <td><code>F1</code></td>
          <td>帮助</td>
      </tr>
  </tbody>
</table>
<h3 id="word-常用">Word 常用</h3>
<table>
  <thead>
      <tr>
          <th>快捷键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Ctrl + B</code></td>
          <td>加粗</td>
      </tr>
      <tr>
          <td><code>Ctrl + I</code></td>
          <td>斜体</td>
      </tr>
      <tr>
          <td><code>Ctrl + U</code></td>
          <td>下划线</td>
      </tr>
      <tr>
          <td><code>Ctrl + L/E/R/J</code></td>
          <td>左/居中/右/两端对齐</td>
      </tr>
      <tr>
          <td><code>Ctrl + Enter</code></td>
          <td>分页符</td>
      </tr>
      <tr>
          <td><code>Ctrl + Shift + C</code></td>
          <td>复制格式</td>
      </tr>
      <tr>
          <td><code>Ctrl + Shift + V</code></td>
          <td>粘贴格式</td>
      </tr>
      <tr>
          <td><code>Ctrl + Alt + V</code></td>
          <td>选择性粘贴</td>
      </tr>
      <tr>
          <td><code>F4</code></td>
          <td>重复上一步操作</td>
      </tr>
  </tbody>
</table>
<h3 id="excel-常用">Excel 常用</h3>
<table>
  <thead>
      <tr>
          <th>快捷键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>F2</code></td>
          <td>编辑单元格</td>
      </tr>
      <tr>
          <td><code>F4</code></td>
          <td>切换引用模式（相对/绝对）</td>
      </tr>
      <tr>
          <td><code>Ctrl + D</code></td>
          <td>向下填充</td>
      </tr>
      <tr>
          <td><code>Ctrl + R</code></td>
          <td>向右填充</td>
      </tr>
      <tr>
          <td><code>Ctrl + ;</code></td>
          <td>输入当前日期</td>
      </tr>
      <tr>
          <td><code>Ctrl + Shift + :</code></td>
          <td>输入当前时间</td>
      </tr>
      <tr>
          <td><code>Ctrl + Space</code></td>
          <td>选中整列</td>
      </tr>
      <tr>
          <td><code>Shift + Space</code></td>
          <td>选中整行</td>
      </tr>
      <tr>
          <td><code>Ctrl + -</code></td>
          <td>删除单元格</td>
      </tr>
      <tr>
          <td><code>Ctrl + Shift + +</code></td>
          <td>插入单元格</td>
      </tr>
      <tr>
          <td><code>Ctrl + T</code></td>
          <td>创建表格</td>
      </tr>
      <tr>
          <td><code>Ctrl + Shift + L</code></td>
          <td>筛选</td>
      </tr>
      <tr>
          <td><code>Alt + =</code></td>
          <td>自动求和</td>
      </tr>
      <tr>
          <td><code>Ctrl + E</code></td>
          <td>快速填充</td>
      </tr>
      <tr>
          <td><code>Ctrl + 1</code></td>
          <td>设置单元格格式</td>
      </tr>
      <tr>
          <td><code>Alt + Enter</code></td>
          <td>单元格内换行</td>
      </tr>
      <tr>
          <td><code>F11</code></td>
          <td>创建图表（新工作表）</td>
      </tr>
      <tr>
          <td><code>Alt + F1</code></td>
          <td>创建图表（当前工作表）</td>
      </tr>
  </tbody>
</table>
<h3 id="powerpoint-常用">PowerPoint 常用</h3>
<table>
  <thead>
      <tr>
          <th>快捷键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>F5</code></td>
          <td>从头开始放映</td>
      </tr>
      <tr>
          <td><code>Shift + F5</code></td>
          <td>从当前幻灯片放映</td>
      </tr>
      <tr>
          <td><code>Ctrl + M</code></td>
          <td>新建幻灯片</td>
      </tr>
      <tr>
          <td><code>Ctrl + D</code></td>
          <td>复制幻灯片/对象</td>
      </tr>
      <tr>
          <td><code>B</code></td>
          <td>放映时黑屏</td>
      </tr>
      <tr>
          <td><code>W</code></td>
          <td>放映时白屏</td>
      </tr>
      <tr>
          <td><code>数字 + Enter</code></td>
          <td>放映时跳转到指定编号</td>
      </tr>
  </tbody>
</table>
<hr>
<p><em>文档版本：v1.0 | 适用 Office 2016 全系列</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>linux手册（持续更新...）</title>
      <link>https://goslion.com/tech/linux/linux-manual/</link>
      <pubDate>Fri, 15 May 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/tech/linux/linux-manual/</guid>
      <description>Linux 使用手册 目录 第一章：Linux 基础概念 第二章：常用命令 第三章：文本处理 第四章：用户与权限管理 第五章：进程管理 第六章：磁盘与存储管理 第七章：网络管理 第八章：Shell 脚本编程 第九章：高级命令与技巧 第十章：软件包管理 第十一章：系统性能与排错 第十二章：发行版对比 第十三章：常用快捷键与技巧汇总 第一章：Linux 基础概念 1.1 文件系统层次结构（FHS） …</description><content:encoded><![CDATA[<h1 id="linux-使用手册">Linux 使用手册</h1>
<h2 id="目录">目录</h2>
<ul>
<li><a href="#%E7%AC%AC%E4%B8%80%E7%AB%A0linux-%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5">第一章：Linux 基础概念</a></li>
<li><a href="#%E7%AC%AC%E4%BA%8C%E7%AB%A0%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4">第二章：常用命令</a></li>
<li><a href="#%E7%AC%AC%E4%B8%89%E7%AB%A0%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86">第三章：文本处理</a></li>
<li><a href="#%E7%AC%AC%E5%9B%9B%E7%AB%A0%E7%94%A8%E6%88%B7%E4%B8%8E%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86">第四章：用户与权限管理</a></li>
<li><a href="#%E7%AC%AC%E4%BA%94%E7%AB%A0%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86">第五章：进程管理</a></li>
<li><a href="#%E7%AC%AC%E5%85%AD%E7%AB%A0%E7%A3%81%E7%9B%98%E4%B8%8E%E5%AD%98%E5%82%A8%E7%AE%A1%E7%90%86">第六章：磁盘与存储管理</a></li>
<li><a href="#%E7%AC%AC%E4%B8%83%E7%AB%A0%E7%BD%91%E7%BB%9C%E7%AE%A1%E7%90%86">第七章：网络管理</a></li>
<li><a href="#%E7%AC%AC%E5%85%AB%E7%AB%A0shell-%E8%84%9A%E6%9C%AC%E7%BC%96%E7%A8%8B">第八章：Shell 脚本编程</a></li>
<li><a href="#%E7%AC%AC%E4%B9%9D%E7%AB%A0%E9%AB%98%E7%BA%A7%E5%91%BD%E4%BB%A4%E4%B8%8E%E6%8A%80%E5%B7%A7">第九章：高级命令与技巧</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E7%AB%A0%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%AE%A1%E7%90%86">第十章：软件包管理</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0%E7%B3%BB%E7%BB%9F%E6%80%A7%E8%83%BD%E4%B8%8E%E6%8E%92%E9%94%99">第十一章：系统性能与排错</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0%E5%8F%91%E8%A1%8C%E7%89%88%E5%AF%B9%E6%AF%94">第十二章：发行版对比</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E9%94%AE%E4%B8%8E%E6%8A%80%E5%B7%A7%E6%B1%87%E6%80%BB">第十三章：常用快捷键与技巧汇总</a></li>
</ul>
<hr>
<h2 id="第一章linux-基础概念">第一章：Linux 基础概念</h2>
<h3 id="11-文件系统层次结构fhs">1.1 文件系统层次结构（FHS）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>/           # 根目录
├── /bin    # 基本命令二进制文件（已链接到 /usr/bin）
├── /boot   # 内核和启动文件
├── /dev    # 设备文件
├── /etc    # 系统配置文件
├── /home   # 用户主目录
├── /lib    # 库文件（已链接到 /usr/lib）
├── /media  # 可移动设备挂载点
├── /mnt    # 临时挂载点
├── /opt    # 第三方应用软件
├── /proc   # 进程和内核信息（虚拟文件系统）
├── /root   # root 用户家目录
├── /run    # 运行时临时文件（tmpfs）
├── /sbin   # 系统管理命令（已链接到 /usr/sbin）
├── /srv    # 服务数据
├── /sys    # 内核和硬件信息（虚拟文件系统）
├── /tmp    # 临时文件（重启后可能清除）
├── /usr    # 用户程序和数据
│   ├── /usr/bin
│   ├── /usr/lib
│   ├── /usr/local  # 本地编译安装的软件
│   └── /usr/share  # 架构无关的共享数据
└── /var    # 可变数据（日志、缓存、数据库等）
    ├── /var/log    # 日志文件
    └── /var/tmp    # 重启后保留的临时文件</code></pre>
</div>
<h3 id="12-文件类型">1.2 文件类型</h3>
<table>
  <thead>
      <tr>
          <th>标识</th>
          <th>类型</th>
          <th>示例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>-</code></td>
          <td>普通文件</td>
          <td><code>-rw-r--r--</code></td>
      </tr>
      <tr>
          <td><code>d</code></td>
          <td>目录</td>
          <td><code>drwxr-xr-x</code></td>
      </tr>
      <tr>
          <td><code>l</code></td>
          <td>符号链接</td>
          <td><code>lrwxrwxrwx</code></td>
      </tr>
      <tr>
          <td><code>b</code></td>
          <td>块设备</td>
          <td><code>brw-rw----</code></td>
      </tr>
      <tr>
          <td><code>c</code></td>
          <td>字符设备</td>
          <td><code>crw-rw----</code></td>
      </tr>
      <tr>
          <td><code>p</code></td>
          <td>命名管道</td>
          <td><code>prw-r--r--</code></td>
      </tr>
      <tr>
          <td><code>s</code></td>
          <td>套接字</td>
          <td><code>srw-rw-rw-</code></td>
      </tr>
  </tbody>
</table>
<h3 id="13-shell-类型">1.3 Shell 类型</h3>
<p>常见的 Shell 及其配置文件：</p>
<table>
  <thead>
      <tr>
          <th>Shell</th>
          <th>配置文件（交互式登录）</th>
          <th>配置文件（交互式非登录）</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>bash</td>
          <td><code>~/.bash_profile</code>, <code>~/.bash_login</code>, <code>~/.profile</code></td>
          <td><code>~/.bashrc</code></td>
      </tr>
      <tr>
          <td>zsh</td>
          <td><code>~/.zprofile</code>, <code>~/.zlogin</code></td>
          <td><code>~/.zshrc</code></td>
      </tr>
      <tr>
          <td>fish</td>
          <td><code>~/.config/fish/config.fish</code></td>
          <td>同左</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="第二章常用命令">第二章：常用命令</h2>
<h3 id="21-文件与目录操作">2.1 文件与目录操作</h3>
<h4 id="ls--列出目录内容">ls — 列出目录内容</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ls -l        <span class="c1"># 详细列表</span>
</span></span><span class="line"><span class="cl">ls -a        <span class="c1"># 显示所有文件（含隐藏文件）</span>
</span></span><span class="line"><span class="cl">ls -lh       <span class="c1"># 人类可读的文件大小</span>
</span></span><span class="line"><span class="cl">ls -lt       <span class="c1"># 按修改时间排序</span>
</span></span><span class="line"><span class="cl">ls -lrt      <span class="c1"># 按时间倒序，最新在最后</span>
</span></span><span class="line"><span class="cl">ls -R        <span class="c1"># 递归列出子目录</span>
</span></span><span class="line"><span class="cl">ls -i        <span class="c1"># 显示 inode 号</span></span></span></code></pre></div>
</div>
<h4 id="cd--切换目录">cd — 切换目录</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /path/to/dir    <span class="c1"># 切换到指定目录</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ~               <span class="c1"># 回到 home 目录</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> -               <span class="c1"># 回到上次所在目录</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> ..              <span class="c1"># 上级目录</span></span></span></code></pre></div>
</div>
<h4 id="文件创建与删除">文件创建与删除</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">touch file.txt           <span class="c1"># 创建空文件（或更新文件时间戳）</span>
</span></span><span class="line"><span class="cl">mkdir dir1 dir2          <span class="c1"># 创建目录</span>
</span></span><span class="line"><span class="cl">mkdir -p a/b/c           <span class="c1"># 递归创建多级目录</span>
</span></span><span class="line"><span class="cl">rm file.txt              <span class="c1"># 删除文件</span>
</span></span><span class="line"><span class="cl">rm -r dir/               <span class="c1"># 递归删除目录</span>
</span></span><span class="line"><span class="cl">rm -rf dir/              <span class="c1"># 强制递归删除（危险，不提示确认）</span>
</span></span><span class="line"><span class="cl">rmdir dir/               <span class="c1"># 删除空目录</span></span></span></code></pre></div>
</div>
<h4 id="文件复制与移动">文件复制与移动</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cp source.txt dest.txt           <span class="c1"># 复制文件</span>
</span></span><span class="line"><span class="cl">cp -r source_dir/ dest_dir/      <span class="c1"># 递归复制目录</span>
</span></span><span class="line"><span class="cl">cp -p source.txt dest.txt        <span class="c1"># 保留权限和时间戳</span>
</span></span><span class="line"><span class="cl">cp -a source_dir/ dest_dir/      <span class="c1"># 归档模式（等同于 -dpR）</span>
</span></span><span class="line"><span class="cl">mv old_name.txt new_name.txt     <span class="c1"># 移动/重命名</span>
</span></span><span class="line"><span class="cl">mv -i source.txt dest/           <span class="c1"># 覆盖前提示</span></span></span></code></pre></div>
</div>
<h4 id="文件查看">文件查看</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat file.txt              <span class="c1"># 显示全部内容</span>
</span></span><span class="line"><span class="cl">cat -n file.txt           <span class="c1"># 显示行号</span>
</span></span><span class="line"><span class="cl">less file.txt             <span class="c1"># 分页查看（支持上下翻页、搜索）</span>
</span></span><span class="line"><span class="cl">more file.txt             <span class="c1"># 分页查看（仅向下翻页）</span>
</span></span><span class="line"><span class="cl">head -n <span class="m">20</span> file.txt       <span class="c1"># 显示前 20 行（默认 10 行）</span>
</span></span><span class="line"><span class="cl">tail -n <span class="m">20</span> file.txt       <span class="c1"># 显示后 20 行</span>
</span></span><span class="line"><span class="cl">tail -f log.txt           <span class="c1"># 持续追踪文件末尾（查看日志必备）</span>
</span></span><span class="line"><span class="cl">nl file.txt               <span class="c1"># 带行号显示</span></span></span></code></pre></div>
</div>
<h4 id="链接">链接</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ln -s /path/to/target link_name      <span class="c1"># 创建软链接（符号链接）</span>
</span></span><span class="line"><span class="cl">ln /path/to/target hard_link_name    <span class="c1"># 创建硬链接（不能跨文件系统，不能链接目录）</span></span></span></code></pre></div>
</div>
<h4 id="查找文件">查找文件</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">find /path -name <span class="s2">&#34;*.log&#34;</span>                    <span class="c1"># 按名称查找</span>
</span></span><span class="line"><span class="cl">find /path -type f -size +100M              <span class="c1"># 查找大于 100M 的文件</span>
</span></span><span class="line"><span class="cl">find /path -type f -mtime -7                <span class="c1"># 最近 7 天修改的文件</span>
</span></span><span class="line"><span class="cl">find /path -type f -mmin -60                <span class="c1"># 最近 60 分钟修改的文件</span>
</span></span><span class="line"><span class="cl">find /path -type d -empty                   <span class="c1"># 查找空目录</span>
</span></span><span class="line"><span class="cl">find /path -name <span class="s2">&#34;*.tmp&#34;</span> -delete            <span class="c1"># 查找并删除</span>
</span></span><span class="line"><span class="cl">find /path -name <span class="s2">&#34;*.sh&#34;</span> -exec chmod +x <span class="o">{}</span> <span class="se">\;</span> <span class="c1"># 对找到的文件执行命令</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">locate filename                   <span class="c1"># 从数据库中快速查找（需 updatedb 更新数据库）</span>
</span></span><span class="line"><span class="cl">which <span class="nb">command</span>                     <span class="c1"># 显示命令的完整路径</span>
</span></span><span class="line"><span class="cl">whereis <span class="nb">command</span>                   <span class="c1"># 显示命令的二进制、源码、手册位置</span></span></span></code></pre></div>
</div>
<h3 id="22-文件权限">2.2 文件权限</h3>
<h4 id="权限表示">权限表示</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code> -  rw-  r--  r--
 |   |    |    |
 |   |    |    └── 其他用户权限 (other)
 |   |    └─────── 用户组权限 (group)
 |   └──────────── 所有者权限 (owner)
 └──────────────── 文件类型 (-/d/l/b/c/p/s)

权限数字：
r (read)    = 4  读取
w (write)   = 2  写入
x (execute) = 1  执行

例如：755 = rwxr-xr-x（所有者全权限，组和其他人只读执行）
     644 = rw-r--r--（所有者读写，组和其他人只读）</code></pre>
</div>
<h4 id="chmod--修改权限">chmod — 修改权限</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chmod <span class="m">755</span> script.sh            <span class="c1"># 数字方式</span>
</span></span><span class="line"><span class="cl">chmod u+x script.sh            <span class="c1"># 符号方式（所有者加执行权限）</span>
</span></span><span class="line"><span class="cl">chmod g-w file.txt             <span class="c1"># 移除组写权限</span>
</span></span><span class="line"><span class="cl">chmod <span class="nv">o</span><span class="o">=</span> file.txt              <span class="c1"># 清除其他用户所有权限</span>
</span></span><span class="line"><span class="cl">chmod -R <span class="m">755</span> dir/              <span class="c1"># 递归修改目录</span>
</span></span><span class="line"><span class="cl">chmod <span class="nv">u</span><span class="o">=</span>rwx,g<span class="o">=</span>rx,o<span class="o">=</span> script.sh  <span class="c1"># 同时设置多组权限</span></span></span></code></pre></div>
</div>
<h4 id="chown--chgrp--修改所有者组">chown / chgrp — 修改所有者/组</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chown user:group file.txt      <span class="c1"># 同时修改所有者和组</span>
</span></span><span class="line"><span class="cl">chown -R user:group dir/       <span class="c1"># 递归修改</span>
</span></span><span class="line"><span class="cl">chgrp group file.txt           <span class="c1"># 只修改组</span></span></span></code></pre></div>
</div>
<h4 id="特殊权限">特殊权限</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">chmod u+s /path/to/executable     <span class="c1"># SUID：以文件所有者的身份执行</span>
</span></span><span class="line"><span class="cl">chmod g+s /path/to/dir            <span class="c1"># SGID：目录内新建文件继承目录组</span>
</span></span><span class="line"><span class="cl">chmod +t /path/to/dir             <span class="c1"># Sticky Bit：只有文件所有者能删除（如 /tmp 目录）</span></span></span></code></pre></div>
</div>
<h3 id="23-文件压缩与归档">2.3 文件压缩与归档</h3>
<h4 id="tar--归档">tar — 归档</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tar -cvf archive.tar dir/             <span class="c1"># 创建归档（不压缩）</span>
</span></span><span class="line"><span class="cl">tar -xvf archive.tar                  <span class="c1"># 解压归档</span>
</span></span><span class="line"><span class="cl">tar -czvf archive.tar.gz dir/         <span class="c1"># 创建 gzip 压缩归档</span>
</span></span><span class="line"><span class="cl">tar -xzvf archive.tar.gz              <span class="c1"># 解压 gzip 归档</span>
</span></span><span class="line"><span class="cl">tar -cjvf archive.tar.bz2 dir/        <span class="c1"># 创建 bzip2 压缩归档（更高压缩率）</span>
</span></span><span class="line"><span class="cl">tar -xjvf archive.tar.bz2             <span class="c1"># 解压 bzip2 归档</span>
</span></span><span class="line"><span class="cl">tar -cJvf archive.tar.xz dir/         <span class="c1"># 创建 xz 压缩归档（最高压缩率）</span>
</span></span><span class="line"><span class="cl">tar -xJvf archive.tar.xz              <span class="c1"># 解压 xz 归档</span>
</span></span><span class="line"><span class="cl">tar -czvf archive.tar.gz --exclude<span class="o">=</span><span class="s2">&#34;*.log&#34;</span> dir/  <span class="c1"># 排除特定文件</span>
</span></span><span class="line"><span class="cl">tar -tzvf archive.tar.gz              <span class="c1"># 列出归档内容（不解压）</span></span></span></code></pre></div>
</div>
<h4 id="其他压缩工具">其他压缩工具</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gzip file.txt                         <span class="c1"># 压缩为 .gz</span>
</span></span><span class="line"><span class="cl">gunzip file.txt.gz                    <span class="c1"># 解压 .gz</span>
</span></span><span class="line"><span class="cl">bzip2 file.txt                        <span class="c1"># 压缩为 .bz2</span>
</span></span><span class="line"><span class="cl">bunzip2 file.txt.bz2                  <span class="c1"># 解压 .bz2</span>
</span></span><span class="line"><span class="cl">xz file.txt                           <span class="c1"># 压缩为 .xz</span>
</span></span><span class="line"><span class="cl">unxz file.txt.xz                      <span class="c1"># 解压 .xz</span>
</span></span><span class="line"><span class="cl">zip -r archive.zip dir/               <span class="c1"># 创建 zip 压缩</span>
</span></span><span class="line"><span class="cl">unzip archive.zip                     <span class="c1"># 解压 zip</span>
</span></span><span class="line"><span class="cl">7z a archive.7z dir/                  <span class="c1"># 创建 7z 压缩（需安装 p7zip）</span>
</span></span><span class="line"><span class="cl">7z x archive.7z                       <span class="c1"># 解压 7z</span></span></span></code></pre></div>
</div>
<h3 id="24-系统信息">2.4 系统信息</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">uname -a                       <span class="c1"># 内核版本及系统架构</span>
</span></span><span class="line"><span class="cl">uname -r                       <span class="c1"># 仅内核版本</span>
</span></span><span class="line"><span class="cl">hostnamectl                    <span class="c1"># 主机名详细信息</span>
</span></span><span class="line"><span class="cl">lsb_release -a                 <span class="c1"># 发行版信息</span>
</span></span><span class="line"><span class="cl">cat /etc/os-release            <span class="c1"># 发行版信息（通用方式）</span>
</span></span><span class="line"><span class="cl">cat /proc/cpuinfo              <span class="c1"># CPU 信息</span>
</span></span><span class="line"><span class="cl">cat /proc/meminfo              <span class="c1"># 内存信息</span>
</span></span><span class="line"><span class="cl">free -h                        <span class="c1"># 内存使用情况（人类可读）</span>
</span></span><span class="line"><span class="cl">df -h                          <span class="c1"># 磁盘分区使用情况</span>
</span></span><span class="line"><span class="cl">df -i                          <span class="c1"># inode 使用情况</span>
</span></span><span class="line"><span class="cl">du -sh dir/                    <span class="c1"># 目录总大小</span>
</span></span><span class="line"><span class="cl">du -sh * <span class="p">|</span> sort -hr <span class="p">|</span> head -10 <span class="c1"># 当前目录下最大的 10 个文件/目录</span>
</span></span><span class="line"><span class="cl">uptime                         <span class="c1"># 系统运行时间、负载</span>
</span></span><span class="line"><span class="cl">cat /proc/loadavg              <span class="c1"># 负载平均值</span>
</span></span><span class="line"><span class="cl">lscpu                          <span class="c1"># CPU 详细信息</span>
</span></span><span class="line"><span class="cl">lsblk                          <span class="c1"># 列出块设备</span>
</span></span><span class="line"><span class="cl">lsblk -f                       <span class="c1"># 列出块设备及文件系统类型</span>
</span></span><span class="line"><span class="cl">lspci                          <span class="c1"># PCI 设备列表</span>
</span></span><span class="line"><span class="cl">lsusb                          <span class="c1"># USB 设备列表</span>
</span></span><span class="line"><span class="cl">dmidecode -t memory            <span class="c1"># 物理内存信息（需 root）</span>
</span></span><span class="line"><span class="cl">dmidecode -t system            <span class="c1"># 系统制造商和型号</span></span></span></code></pre></div>
</div>
<h3 id="25-日期和时间">2.5 日期和时间</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">date                                    <span class="c1"># 当前日期和时间</span>
</span></span><span class="line"><span class="cl">date +<span class="s2">&#34;%Y-%m-%d %H:%M:%S&#34;</span>               <span class="c1"># 自定义格式</span>
</span></span><span class="line"><span class="cl">date -d <span class="s2">&#34;@1700000000&#34;</span>                   <span class="c1"># 将时间戳转为日期</span>
</span></span><span class="line"><span class="cl">date +%s                                <span class="c1"># 当前时间戳（秒）</span>
</span></span><span class="line"><span class="cl">cal                                     <span class="c1"># 当前月份日历</span>
</span></span><span class="line"><span class="cl">cal <span class="m">2026</span>                                <span class="c1"># 全年日历</span>
</span></span><span class="line"><span class="cl">timedatectl                             <span class="c1"># 时区和时间同步状态</span>
</span></span><span class="line"><span class="cl">timedatectl list-timezones              <span class="c1"># 列出所有时区</span>
</span></span><span class="line"><span class="cl">sudo timedatectl set-timezone Asia/Shanghai  <span class="c1"># 设置时区</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第三章文本处理">第三章：文本处理</h2>
<h3 id="31-grep--文本搜索">3.1 grep — 文本搜索</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">grep <span class="s2">&#34;pattern&#34;</span> file.txt                     <span class="c1"># 搜索匹配行</span>
</span></span><span class="line"><span class="cl">grep -i <span class="s2">&#34;pattern&#34;</span> file.txt                  <span class="c1"># 忽略大小写</span>
</span></span><span class="line"><span class="cl">grep -v <span class="s2">&#34;pattern&#34;</span> file.txt                  <span class="c1"># 反向匹配（排除）</span>
</span></span><span class="line"><span class="cl">grep -r <span class="s2">&#34;pattern&#34;</span> dir/                      <span class="c1"># 递归搜索目录</span>
</span></span><span class="line"><span class="cl">grep -n <span class="s2">&#34;pattern&#34;</span> file.txt                  <span class="c1"># 显示行号</span>
</span></span><span class="line"><span class="cl">grep -c <span class="s2">&#34;pattern&#34;</span> file.txt                  <span class="c1"># 统计匹配行数</span>
</span></span><span class="line"><span class="cl">grep -A <span class="m">3</span> <span class="s2">&#34;pattern&#34;</span> file.txt                <span class="c1"># 显示匹配行及之后 3 行</span>
</span></span><span class="line"><span class="cl">grep -B <span class="m">3</span> <span class="s2">&#34;pattern&#34;</span> file.txt                <span class="c1"># 显示匹配行及之前 3 行</span>
</span></span><span class="line"><span class="cl">grep -C <span class="m">3</span> <span class="s2">&#34;pattern&#34;</span> file.txt                <span class="c1"># 显示匹配行及前后各 3 行</span>
</span></span><span class="line"><span class="cl">grep -E <span class="s2">&#34;pattern1|pattern2&#34;</span> file.txt        <span class="c1"># 扩展正则（等同于 egrep）</span>
</span></span><span class="line"><span class="cl">grep -P <span class="s2">&#34;\d{3}-\d{4}&#34;</span> file.txt              <span class="c1"># Perl 正则（PCRE）</span>
</span></span><span class="line"><span class="cl">grep -o <span class="s2">&#34;pattern&#34;</span> file.txt                  <span class="c1"># 只输出匹配的部分</span>
</span></span><span class="line"><span class="cl">grep -l <span class="s2">&#34;pattern&#34;</span> *.txt                     <span class="c1"># 只显示包含匹配的文件名</span>
</span></span><span class="line"><span class="cl">grep -w <span class="s2">&#34;word&#34;</span> file.txt                     <span class="c1"># 匹配整个单词</span></span></span></code></pre></div>
</div>
<h3 id="32-sed--流编辑器">3.2 sed — 流编辑器</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 替换</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s/old/new/&#39;</span> file.txt                   <span class="c1"># 每行替换第一个匹配</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s/old/new/g&#39;</span> file.txt                  <span class="c1"># 全局替换</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s/old/new/gi&#39;</span> file.txt                 <span class="c1"># 忽略大小写全局替换</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s/^/PREFIX: /&#39;</span> file.txt                <span class="c1"># 每行开头添加</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;s/$/ :SUFFIX/&#39;</span> file.txt                <span class="c1"># 每行末尾添加</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;3s/old/new/&#39;</span> file.txt                  <span class="c1"># 只替换第 3 行</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 删除</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;3d&#39;</span> file.txt                           <span class="c1"># 删除第 3 行</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;3,5d&#39;</span> file.txt                         <span class="c1"># 删除第 3-5 行</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;/pattern/d&#39;</span> file.txt                   <span class="c1"># 删除匹配行</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;/^$/d&#39;</span> file.txt                        <span class="c1"># 删除空行</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 打印</span>
</span></span><span class="line"><span class="cl">sed -n <span class="s1">&#39;5,10p&#39;</span> file.txt                     <span class="c1"># 打印第 5-10 行</span>
</span></span><span class="line"><span class="cl">sed -n <span class="s1">&#39;/pattern/p&#39;</span> file.txt                <span class="c1"># 打印匹配行</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 插入/追加</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;3i\New line before line 3&#39;</span> file.txt    <span class="c1"># 在第 3 行前插入</span>
</span></span><span class="line"><span class="cl">sed <span class="s1">&#39;3a\New line after line 3&#39;</span> file.txt     <span class="c1"># 在第 3 行后追加</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 原地修改</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/old/new/g&#39;</span> file.txt               <span class="c1"># 直接修改文件</span>
</span></span><span class="line"><span class="cl">sed -i.bak <span class="s1">&#39;s/old/new/g&#39;</span> file.txt           <span class="c1"># 修改前备份为 .bak</span></span></span></code></pre></div>
</div>
<h3 id="33-awk--文本处理语言">3.3 awk — 文本处理语言</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 基本语法</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{print $1}&#39;</span> file.txt                           <span class="c1"># 打印第 1 列</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{print $1, $3}&#39;</span> file.txt                       <span class="c1"># 打印第 1, 3 列</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{print $NF}&#39;</span> file.txt                          <span class="c1"># 打印最后一列</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{print $(NF-1)}&#39;</span> file.txt                      <span class="c1"># 打印倒数第 2 列</span>
</span></span><span class="line"><span class="cl">awk -F<span class="s1">&#39;:&#39;</span> <span class="s1">&#39;{print $1}&#39;</span> /etc/passwd                  <span class="c1"># 指定冒号为分隔符</span>
</span></span><span class="line"><span class="cl">awk -F<span class="s1">&#39;,&#39;</span> <span class="s1">&#39;{print NF}&#39;</span> file.csv                     <span class="c1"># 打印列数</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 条件过滤</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;$3 &gt; 100&#39;</span> file.txt                             <span class="c1"># 第 3 列大于 100 的行</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;$1 == &#34;error&#34;&#39;</span> file.txt                        <span class="c1"># 第 1 列等于 error</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;$1 ~ /pattern/&#39;</span> file.txt                       <span class="c1"># 第 1 列匹配正则</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;$1 !~ /pattern/&#39;</span> file.txt                      <span class="c1"># 第 1 列不匹配</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;NR&gt;=5 &amp;&amp; NR&lt;=10&#39;</span> file.txt                      <span class="c1"># 第 5-10 行</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;NF &gt; 0&#39;</span> file.txt                               <span class="c1"># 跳过空行</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 计算</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{sum += $3} END {print sum}&#39;</span> file.txt          <span class="c1"># 第 3 列求和</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{sum += $3} END {print sum/NR}&#39;</span> file.txt       <span class="c1"># 第 3 列平均值</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{total+=$3; count++} END {print total/count}&#39;</span>  <span class="c1"># 同上，更精确</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 格式化输出</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{printf &#34;%-20s %10d\n&#34;, $1, $2}&#39;</span> file.txt      <span class="c1"># 左对齐字符串 + 右对齐数字</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 关联数组</span>
</span></span><span class="line"><span class="cl">awk <span class="s1">&#39;{count[$1]++} END {for (k in count) print k, count[k]}&#39;</span> file.txt  <span class="c1"># 分组计数</span></span></span></code></pre></div>
</div>
<h3 id="34-排序去重与统计">3.4 排序、去重与统计</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sort file.txt                             <span class="c1"># 升序排列</span>
</span></span><span class="line"><span class="cl">sort -r file.txt                          <span class="c1"># 降序排列</span>
</span></span><span class="line"><span class="cl">sort -n file.txt                          <span class="c1"># 按数值排序（而非字典序）</span>
</span></span><span class="line"><span class="cl">sort -k2 file.txt                         <span class="c1"># 按第 2 列排序</span>
</span></span><span class="line"><span class="cl">sort -k2,2 -k3,3n file.txt                <span class="c1"># 先按第 2 列字典序，再按第 3 列数值</span>
</span></span><span class="line"><span class="cl">sort -t<span class="s1">&#39;,&#39;</span> -k2 file.csv                   <span class="c1"># 逗号分隔，按第 2 列排序</span>
</span></span><span class="line"><span class="cl">sort -u file.txt                          <span class="c1"># 排序并去重</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">uniq file.txt                             <span class="c1"># 去重（仅相邻重复行）</span>
</span></span><span class="line"><span class="cl">sort file.txt <span class="p">|</span> uniq                      <span class="c1"># 全局去重（先排序）</span>
</span></span><span class="line"><span class="cl">sort file.txt <span class="p">|</span> uniq -c                   <span class="c1"># 去重并统计出现次数</span>
</span></span><span class="line"><span class="cl">sort file.txt <span class="p">|</span> uniq -d                   <span class="c1"># 只显示重复行</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">wc file.txt                               <span class="c1"># 行数、单词数、字节数</span>
</span></span><span class="line"><span class="cl">wc -l file.txt                            <span class="c1"># 仅行数</span>
</span></span><span class="line"><span class="cl">wc -w file.txt                            <span class="c1"># 仅单词数</span>
</span></span><span class="line"><span class="cl">wc -c file.txt                            <span class="c1"># 仅字节数</span></span></span></code></pre></div>
</div>
<h3 id="35-cut--paste--tr">3.5 cut / paste / tr</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cut -d<span class="s1">&#39;:&#39;</span> -f1 /etc/passwd                 <span class="c1"># 指定分隔符，取第 1 列</span>
</span></span><span class="line"><span class="cl">cut -d<span class="s1">&#39;,&#39;</span> -f1,3 file.csv                  <span class="c1"># 取第 1 和第 3 列</span>
</span></span><span class="line"><span class="cl">cut -c1-10 file.txt                       <span class="c1"># 取每行前 10 个字符</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">paste file1.txt file2.txt                 <span class="c1"># 横向合并文件</span>
</span></span><span class="line"><span class="cl">paste -d<span class="s1">&#39;,&#39;</span> file1.txt file2.txt           <span class="c1"># 指定分隔符合并</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">tr <span class="s1">&#39;a-z&#39;</span> <span class="s1">&#39;A-Z&#39;</span> &lt; file.txt                 <span class="c1"># 小写转大写</span>
</span></span><span class="line"><span class="cl">tr -d <span class="s1">&#39;\r&#39;</span> &lt; dosfile.txt &gt; unixfile.txt   <span class="c1"># 删除回车符</span>
</span></span><span class="line"><span class="cl">tr -s <span class="s1">&#39; &#39;</span> &lt; file.txt                      <span class="c1"># 压缩连续空格为单个空格</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;a,b,c&#34;</span> <span class="p">|</span> tr <span class="s1">&#39;,&#39;</span> <span class="s1">&#39;\n&#39;</span>                <span class="c1"># 逗号替换为换行</span></span></span></code></pre></div>
</div>
<h3 id="36-diff--comm--文件比较">3.6 diff / comm — 文件比较</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">diff file1.txt file2.txt                  <span class="c1"># 差异比较</span>
</span></span><span class="line"><span class="cl">diff -u file1.txt file2.txt               <span class="c1"># 统一格式（git diff 风格）</span>
</span></span><span class="line"><span class="cl">diff -r dir1/ dir2/                       <span class="c1"># 递归比较目录</span>
</span></span><span class="line"><span class="cl">diff &lt;<span class="o">(</span>ls dir1<span class="o">)</span> &lt;<span class="o">(</span>ls dir2<span class="o">)</span>                <span class="c1"># 比较两个命令的输出</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">comm file1.txt file2.txt                  <span class="c1"># 逐行比较（需先排序）</span>
</span></span><span class="line"><span class="cl">comm -12 file1.txt file2.txt              <span class="c1"># 显示两文件共有行</span>
</span></span><span class="line"><span class="cl">comm -23 file1.txt file2.txt              <span class="c1"># 显示仅在 file1 中的行</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第四章用户与权限管理">第四章：用户与权限管理</h2>
<h3 id="41-用户管理">4.1 用户管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看用户信息</span>
</span></span><span class="line"><span class="cl">whoami                                     <span class="c1"># 当前用户名</span>
</span></span><span class="line"><span class="cl">id                                         <span class="c1"># 当前用户 UID、GID、组</span>
</span></span><span class="line"><span class="cl">id username                                <span class="c1"># 查看指定用户信息</span>
</span></span><span class="line"><span class="cl">who                                        <span class="c1"># 当前登录用户</span>
</span></span><span class="line"><span class="cl">w                                          <span class="c1"># 当前登录用户及其在做什么</span>
</span></span><span class="line"><span class="cl">last                                       <span class="c1"># 最近登录记录</span>
</span></span><span class="line"><span class="cl">lastb                                      <span class="c1"># 最近登录失败记录</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 用户管理（需 root）</span>
</span></span><span class="line"><span class="cl">useradd username                           <span class="c1"># 添加用户</span>
</span></span><span class="line"><span class="cl">useradd -m -s /bin/bash username           <span class="c1"># 添加用户并创建家目录、指定 shell</span>
</span></span><span class="line"><span class="cl">useradd -u <span class="m">1500</span> -g groupname username      <span class="c1"># 指定 UID 和主组</span>
</span></span><span class="line"><span class="cl">usermod -aG sudo username                  <span class="c1"># 将用户加入 sudo 组</span>
</span></span><span class="line"><span class="cl">usermod -s /bin/zsh username               <span class="c1"># 修改用户默认 shell</span>
</span></span><span class="line"><span class="cl">usermod -L username                        <span class="c1"># 锁定用户</span>
</span></span><span class="line"><span class="cl">usermod -U username                        <span class="c1"># 解锁用户</span>
</span></span><span class="line"><span class="cl">userdel username                           <span class="c1"># 删除用户</span>
</span></span><span class="line"><span class="cl">userdel -r username                        <span class="c1"># 删除用户及家目录和邮件</span>
</span></span><span class="line"><span class="cl">passwd username                            <span class="c1"># 设置/修改用户密码</span>
</span></span><span class="line"><span class="cl">passwd -l username                         <span class="c1"># 锁定用户密码</span>
</span></span><span class="line"><span class="cl">chage -l username                          <span class="c1"># 查看密码过期信息</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 批量创建用户</span>
</span></span><span class="line"><span class="cl">newusers users.txt                         <span class="c1"># users.txt 格式同 /etc/passwd</span></span></span></code></pre></div>
</div>
<h3 id="42-组管理">4.2 组管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">groupadd groupname                         <span class="c1"># 创建组</span>
</span></span><span class="line"><span class="cl">groupadd -g <span class="m">2000</span> groupname                 <span class="c1"># 指定 GID</span>
</span></span><span class="line"><span class="cl">groupmod -n newname oldname                <span class="c1"># 重命名组</span>
</span></span><span class="line"><span class="cl">groupdel groupname                         <span class="c1"># 删除组</span>
</span></span><span class="line"><span class="cl">gpasswd -d username groupname              <span class="c1"># 从组中移除用户</span>
</span></span><span class="line"><span class="cl">groups username                            <span class="c1"># 查看用户所属的所有组</span></span></span></code></pre></div>
</div>
<h3 id="43-sudo-配置">4.3 sudo 配置</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">visudo                                     <span class="c1"># 安全编辑 /etc/sudoers（语法校验）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 常用配置示例：</span>
</span></span><span class="line"><span class="cl"><span class="c1"># username ALL=(ALL:ALL) ALL               # 用户拥有完全 sudo 权限</span>
</span></span><span class="line"><span class="cl"><span class="c1"># %group ALL=(ALL) NOPASSWD: ALL           # 组成员免密码 sudo</span>
</span></span><span class="line"><span class="cl"><span class="c1"># username ALL=(ALL) /usr/bin/systemctl     # 限制只能执行特定命令</span></span></span></code></pre></div>
</div>
<h3 id="44-acl访问控制列表">4.4 ACL（访问控制列表）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看 ACL</span>
</span></span><span class="line"><span class="cl">getfacl file.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设置 ACL</span>
</span></span><span class="line"><span class="cl">setfacl -m u:username:rwx file.txt         <span class="c1"># 给特定用户添加权限</span>
</span></span><span class="line"><span class="cl">setfacl -m g:groupname:rx file.txt         <span class="c1"># 给特定组添加权限</span>
</span></span><span class="line"><span class="cl">setfacl -x u:username file.txt             <span class="c1"># 移除用户的 ACL</span>
</span></span><span class="line"><span class="cl">setfacl -b file.txt                        <span class="c1"># 清除所有 ACL</span>
</span></span><span class="line"><span class="cl">setfacl -R -m u:username:rwx dir/          <span class="c1"># 递归设置</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第五章进程管理">第五章：进程管理</h2>
<h3 id="51-进程查看">5.1 进程查看</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ps aux                                      <span class="c1"># 显示所有进程（BSD 风格）</span>
</span></span><span class="line"><span class="cl">ps -ef                                      <span class="c1"># 显示所有进程（Unix 风格）</span>
</span></span><span class="line"><span class="cl">ps -ef --forest                             <span class="c1"># 树形显示进程关系</span>
</span></span><span class="line"><span class="cl">ps -eo pid,ppid,cmd,%mem,%cpu --sort<span class="o">=</span>-%mem  <span class="c1"># 自定义输出格式，按内存排序</span>
</span></span><span class="line"><span class="cl">ps -p <span class="m">1234</span> -o pid,ppid,cmd                  <span class="c1"># 查看指定 PID 的进程</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 进程树</span>
</span></span><span class="line"><span class="cl">pstree -p                                   <span class="c1"># 带 PID 的进程树</span>
</span></span><span class="line"><span class="cl">pstree -u username                          <span class="c1"># 某用户的进程树</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 实时监控</span>
</span></span><span class="line"><span class="cl">top                                         <span class="c1"># 交互式进程监控</span>
</span></span><span class="line"><span class="cl">htop                                        <span class="c1"># top 增强版（更友好的界面，需安装）</span>
</span></span><span class="line"><span class="cl">atop                                        <span class="c1"># 高级系统和进程监控（需安装）</span></span></span></code></pre></div>
</div>
<h3 id="52-top-交互命令">5.2 top 交互命令</h3>
<table>
  <thead>
      <tr>
          <th>按键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>1</code></td>
          <td>显示每个 CPU 核心</td>
      </tr>
      <tr>
          <td><code>P</code></td>
          <td>按 CPU 使用率排序</td>
      </tr>
      <tr>
          <td><code>M</code></td>
          <td>按内存使用率排序</td>
      </tr>
      <tr>
          <td><code>T</code></td>
          <td>按运行时间排序</td>
      </tr>
      <tr>
          <td><code>k</code></td>
          <td>结束进程（输入 PID）</td>
      </tr>
      <tr>
          <td><code>r</code></td>
          <td>renice 进程</td>
      </tr>
      <tr>
          <td><code>c</code></td>
          <td>切换显示完整命令</td>
      </tr>
      <tr>
          <td><code>V</code></td>
          <td>森林视图</td>
      </tr>
      <tr>
          <td><code>f</code></td>
          <td>管理显示的列</td>
      </tr>
      <tr>
          <td><code>o</code></td>
          <td>添加过滤器</td>
      </tr>
      <tr>
          <td><code>q</code></td>
          <td>退出</td>
      </tr>
  </tbody>
</table>
<h3 id="53-进程控制">5.3 进程控制</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 前台/后台</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> <span class="p">&amp;</span>                                   <span class="c1"># 在后台运行</span>
</span></span><span class="line"><span class="cl">Ctrl + Z                                    <span class="c1"># 暂停当前前台进程</span>
</span></span><span class="line"><span class="cl"><span class="nb">jobs</span>                                        <span class="c1"># 查看后台任务</span>
</span></span><span class="line"><span class="cl"><span class="nb">fg</span> %1                                       <span class="c1"># 将任务 1 调回前台</span>
</span></span><span class="line"><span class="cl"><span class="nb">bg</span> %1                                       <span class="c1"># 在后台继续运行任务 1</span>
</span></span><span class="line"><span class="cl"><span class="nb">disown</span> -h %1                                <span class="c1"># 使任务不受 shell 退出影响</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># nohup — 后台运行且不挂断</span>
</span></span><span class="line"><span class="cl">nohup long_running_command <span class="p">&amp;</span>                <span class="c1"># 输出默认写入 nohup.out</span>
</span></span><span class="line"><span class="cl">nohup <span class="nb">command</span> &gt; /dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">&amp;</span>            <span class="c1"># 丢弃所有输出</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 信号</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> PID                                    <span class="c1"># 发送 TERM 信号（优雅终止）</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> -9 PID                                 <span class="c1"># 发送 KILL 信号（强制终止）</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> -HUP PID                               <span class="c1"># 发送 HUP 信号（重新加载配置）</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> -STOP PID                              <span class="c1"># 暂停进程</span>
</span></span><span class="line"><span class="cl"><span class="nb">kill</span> -CONT PID                              <span class="c1"># 恢复进程</span>
</span></span><span class="line"><span class="cl">killall process_name                        <span class="c1"># 按名称终止进程</span>
</span></span><span class="line"><span class="cl">pkill -f <span class="s2">&#34;pattern&#34;</span>                          <span class="c1"># 按命令行模式匹配终止</span>
</span></span><span class="line"><span class="cl">pkill -u username                           <span class="c1"># 终止某用户的所有进程</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 优先级</span>
</span></span><span class="line"><span class="cl">nice -n <span class="m">10</span> <span class="nb">command</span>                          <span class="c1"># 以较低优先级启动（-20 最高，19 最低）</span>
</span></span><span class="line"><span class="cl">renice -n <span class="m">5</span> -p PID                          <span class="c1"># 修改运行中进程的优先级</span></span></span></code></pre></div>
</div>
<h3 id="54-lsof--列出打开的文件">5.4 lsof — 列出打开的文件</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">lsof -p PID                                 <span class="c1"># 进程打开的文件</span>
</span></span><span class="line"><span class="cl">lsof -i :80                                 <span class="c1"># 使用 80 端口的进程</span>
</span></span><span class="line"><span class="cl">lsof -i tcp                                 <span class="c1"># 所有 TCP 连接</span>
</span></span><span class="line"><span class="cl">lsof -u username                            <span class="c1"># 某用户打开的文件</span>
</span></span><span class="line"><span class="cl">lsof /path/to/file                          <span class="c1"># 哪些进程在使用此文件</span>
</span></span><span class="line"><span class="cl">lsof +D /path/to/dir                        <span class="c1"># 目录下被打开的文件</span></span></span></code></pre></div>
</div>
<h3 id="55-proc-文件系统">5.5 /proc 文件系统</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">cat /proc/cpuinfo                           <span class="c1"># CPU 详细信息</span>
</span></span><span class="line"><span class="cl">cat /proc/meminfo                           <span class="c1"># 内存详细信息</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/cmdline                       <span class="c1"># 进程的完整命令行</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/environ                       <span class="c1"># 进程的环境变量</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/status                        <span class="c1"># 进程状态</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/limits                        <span class="c1"># 进程资源限制</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/fd/                           <span class="c1"># 进程打开的文件描述符</span>
</span></span><span class="line"><span class="cl">cat /proc/sys/                              <span class="c1"># 内核运行时参数</span>
</span></span><span class="line"><span class="cl">cat /proc/version                           <span class="c1"># 内核版本</span>
</span></span><span class="line"><span class="cl">cat /proc/uptime                            <span class="c1"># 系统运行时间</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第六章磁盘与存储管理">第六章：磁盘与存储管理</h2>
<h3 id="61-分区管理">6.1 分区管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 查看磁盘和分区</span>
</span></span><span class="line"><span class="cl">lsblk                                       <span class="c1"># 树形查看块设备</span>
</span></span><span class="line"><span class="cl">lsblk -f                                    <span class="c1"># 包含文件系统信息</span>
</span></span><span class="line"><span class="cl">fdisk -l                                    <span class="c1"># 列出所有磁盘分区</span>
</span></span><span class="line"><span class="cl">parted -l                                   <span class="c1"># 另一种分区查看</span>
</span></span><span class="line"><span class="cl">blkid                                       <span class="c1"># 查看 UUID 和文件系统类型</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 分区工具</span>
</span></span><span class="line"><span class="cl">fdisk /dev/sdb                              <span class="c1"># MBR 分区工具</span>
</span></span><span class="line"><span class="cl">gdisk /dev/sdb                              <span class="c1"># GPT 分区工具</span>
</span></span><span class="line"><span class="cl">parted /dev/sdb                             <span class="c1"># 通用分区工具</span></span></span></code></pre></div>
</div>
<h3 id="62-文件系统">6.2 文件系统</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建文件系统</span>
</span></span><span class="line"><span class="cl">mkfs.ext4 /dev/sdb1                         <span class="c1"># 格式化为 ext4</span>
</span></span><span class="line"><span class="cl">mkfs.xfs /dev/sdb1                          <span class="c1"># 格式化为 xfs</span>
</span></span><span class="line"><span class="cl">mkfs.btrfs /dev/sdb1                        <span class="c1"># 格式化为 btrfs</span>
</span></span><span class="line"><span class="cl">mkfs.vfat -F32 /dev/sdb1                    <span class="c1"># 格式化为 FAT32</span>
</span></span><span class="line"><span class="cl">mkswap /dev/sdb2                            <span class="c1"># 创建 swap</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 挂载</span>
</span></span><span class="line"><span class="cl">mount /dev/sdb1 /mnt/data                   <span class="c1"># 挂载</span>
</span></span><span class="line"><span class="cl">mount -t ext4 /dev/sdb1 /mnt/data           <span class="c1"># 指定文件系统类型</span>
</span></span><span class="line"><span class="cl">mount -o remount,rw /mnt/data               <span class="c1"># 重新挂载（如只读变读写）</span>
</span></span><span class="line"><span class="cl">umount /mnt/data                            <span class="c1"># 卸载</span>
</span></span><span class="line"><span class="cl">umount -l /mnt/data                         <span class="c1"># 懒卸载（忙时延迟卸载）</span>
</span></span><span class="line"><span class="cl">fuser -km /mnt/data                         <span class="c1"># 强制结束使用挂载点的进程</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 自动挂载 — 编辑 /etc/fstab</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 格式：设备   挂载点   文件系统   选项   dump  pass</span>
</span></span><span class="line"><span class="cl"><span class="c1"># UUID=xxx-xxx /data ext4 defaults,noatime 0 2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证 fstab</span>
</span></span><span class="line"><span class="cl">mount -a                                    <span class="c1"># 挂载 fstab 中所有条目</span>
</span></span><span class="line"><span class="cl">findmnt --verify                            <span class="c1"># 验证 fstab 语法</span></span></span></code></pre></div>
</div>
<h3 id="63-磁盘空间管理">6.3 磁盘空间管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">df -h                                       <span class="c1"># 磁盘使用概览</span>
</span></span><span class="line"><span class="cl">df -i                                       <span class="c1"># inode 使用情况</span>
</span></span><span class="line"><span class="cl">du -sh directory/                           <span class="c1"># 目录总大小</span>
</span></span><span class="line"><span class="cl">du -h --max-depth<span class="o">=</span><span class="m">1</span> /                       <span class="c1"># 根目录一级子目录大小</span>
</span></span><span class="line"><span class="cl">du -sh * <span class="p">|</span> sort -hr                         <span class="c1"># 按大小排序</span>
</span></span><span class="line"><span class="cl">ncdu                                        <span class="c1"># 交互式磁盘使用分析器（需安装）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查找大文件</span>
</span></span><span class="line"><span class="cl">find / -type f -size +1G 2&gt;/dev/null        <span class="c1"># 查找 &gt;1GB 的文件</span>
</span></span><span class="line"><span class="cl">find / -type f -size +100M -mtime +30       <span class="c1"># &gt;100MB 且超过 30 天未修改</span></span></span></code></pre></div>
</div>
<h3 id="64-lvm逻辑卷管理">6.4 LVM（逻辑卷管理）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 物理卷</span>
</span></span><span class="line"><span class="cl">pvcreate /dev/sdb1                          <span class="c1"># 创建物理卷</span>
</span></span><span class="line"><span class="cl">pvdisplay                                   <span class="c1"># 查看物理卷</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 卷组</span>
</span></span><span class="line"><span class="cl">vgcreate vg_data /dev/sdb1                  <span class="c1"># 创建卷组</span>
</span></span><span class="line"><span class="cl">vgextend vg_data /dev/sdc1                  <span class="c1"># 扩展卷组</span>
</span></span><span class="line"><span class="cl">vgdisplay                                   <span class="c1"># 查看卷组</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 逻辑卷</span>
</span></span><span class="line"><span class="cl">lvcreate -L 10G -n lv_app vg_data           <span class="c1"># 创建逻辑卷（指定大小）</span>
</span></span><span class="line"><span class="cl">lvcreate -l 100%FREE -n lv_app vg_data      <span class="c1"># 使用全部剩余空间</span>
</span></span><span class="line"><span class="cl">lvextend -L +5G /dev/vg_data/lv_app         <span class="c1"># 扩展逻辑卷</span>
</span></span><span class="line"><span class="cl">resize2fs /dev/vg_data/lv_app               <span class="c1"># 调整文件系统大小（ext4）</span>
</span></span><span class="line"><span class="cl">xfs_growfs /mnt/app                         <span class="c1"># 调整文件系统大小（xfs）</span>
</span></span><span class="line"><span class="cl">lvs                                          <span class="c1"># 查看逻辑卷</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 快照</span>
</span></span><span class="line"><span class="cl">lvcreate -L 1G -s -n snap_app /dev/vg_data/lv_app  <span class="c1"># 创建快照</span>
</span></span><span class="line"><span class="cl">lvconvert --merge /dev/vg_data/snap_app              <span class="c1"># 恢复快照</span></span></span></code></pre></div>
</div>
<h3 id="65-raid">6.5 RAID</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 软件 RAID（mdadm）</span>
</span></span><span class="line"><span class="cl">mdadm --create /dev/md0 --level<span class="o">=</span><span class="m">1</span> --raid-devices<span class="o">=</span><span class="m">2</span> /dev/sdb1 /dev/sdc1
</span></span><span class="line"><span class="cl">mdadm --detail /dev/md0                     <span class="c1"># 查看 RAID 详情</span>
</span></span><span class="line"><span class="cl">cat /proc/mdstat                            <span class="c1"># RAID 状态</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 级别</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 0 — 条带化（性能高，无冗余）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 1 — 镜像（冗余，容量减半）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 5 — 分布式奇偶校验（至少 3 盘，允许坏 1 块）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 6 — 双奇偶校验（至少 4 盘，允许坏 2 块）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RAID 10 — RAID 1 + RAID 0（先镜像再条带，至少 4 盘）</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第七章网络管理">第七章：网络管理</h2>
<h3 id="71-网络信息查看">7.1 网络信息查看</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ip addr                                     <span class="c1"># 查看 IP 地址（现代命令，替代 ifconfig）</span>
</span></span><span class="line"><span class="cl">ip link show                                <span class="c1"># 查看网络接口状态</span>
</span></span><span class="line"><span class="cl">ip route                                    <span class="c1"># 查看路由表</span>
</span></span><span class="line"><span class="cl">ip neigh                                    <span class="c1"># 查看 ARP 表</span>
</span></span><span class="line"><span class="cl">ss -tlnp                                    <span class="c1"># 查看 TCP 监听端口</span>
</span></span><span class="line"><span class="cl">ss -tulnp                                   <span class="c1"># 查看所有监听端口（TCP + UDP）</span>
</span></span><span class="line"><span class="cl">ss -s                                       <span class="c1"># 统计摘要</span>
</span></span><span class="line"><span class="cl">netstat -tlnp                               <span class="c1"># 传统命令（部分发行版需安装 net-tools）</span>
</span></span><span class="line"><span class="cl">route -n                                    <span class="c1"># 查看路由表</span>
</span></span><span class="line"><span class="cl">arp -n                                      <span class="c1"># 查看 ARP 缓存</span>
</span></span><span class="line"><span class="cl">hostname -I                                 <span class="c1"># 显示本机所有 IP</span></span></span></code></pre></div>
</div>
<h3 id="72-网络配置">7.2 网络配置</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># NetworkManager（桌面发行版常用）</span>
</span></span><span class="line"><span class="cl">nmcli device status                         <span class="c1"># 设备状态</span>
</span></span><span class="line"><span class="cl">nmcli connection show                       <span class="c1"># 连接列表</span>
</span></span><span class="line"><span class="cl">nmcli device wifi list                      <span class="c1"># WiFi 列表</span>
</span></span><span class="line"><span class="cl">nmcli device wifi connect <span class="s2">&#34;SSID&#34;</span> password <span class="s2">&#34;密码&#34;</span>  <span class="c1"># 连接 WiFi</span>
</span></span><span class="line"><span class="cl">nmtui                                       <span class="c1"># 终端图形界面</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># systemd-networkd（服务器发行版常用）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 配置文件：/etc/systemd/network/</span>
</span></span><span class="line"><span class="cl">systemctl restart systemd-networkd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 手动配置（临时生效）</span>
</span></span><span class="line"><span class="cl">ip addr add 192.168.1.100/24 dev eth0       <span class="c1"># 添加 IP</span>
</span></span><span class="line"><span class="cl">ip link <span class="nb">set</span> eth0 up                         <span class="c1"># 启用接口</span>
</span></span><span class="line"><span class="cl">ip link <span class="nb">set</span> eth0 down                       <span class="c1"># 禁用接口</span>
</span></span><span class="line"><span class="cl">ip route add default via 192.168.1.1        <span class="c1"># 添加默认网关</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># DNS</span>
</span></span><span class="line"><span class="cl">cat /etc/resolv.conf                        <span class="c1"># 查看 DNS 配置</span>
</span></span><span class="line"><span class="cl">systemd-resolve --status                    <span class="c1"># systemd-resolved 状态</span></span></span></code></pre></div>
</div>
<h3 id="73-网络诊断">7.3 网络诊断</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">ping -c <span class="m">4</span> google.com                        <span class="c1"># 发送 4 个 ICMP 包</span>
</span></span><span class="line"><span class="cl">ping -i 0.5 google.com                      <span class="c1"># 间隔 0.5 秒发送</span>
</span></span><span class="line"><span class="cl">traceroute google.com                       <span class="c1"># 路由追踪（需安装）</span>
</span></span><span class="line"><span class="cl">tracepath google.com                        <span class="c1"># 路由追踪（无需安装，使用 UDP）</span>
</span></span><span class="line"><span class="cl">mtr google.com                              <span class="c1"># 动态路由追踪（需安装，my traceroute）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># DNS 诊断</span>
</span></span><span class="line"><span class="cl">nslookup domain.com                         <span class="c1"># DNS 查询</span>
</span></span><span class="line"><span class="cl">dig domain.com                              <span class="c1"># 详细 DNS 查询</span>
</span></span><span class="line"><span class="cl">dig +short domain.com                       <span class="c1"># 简洁输出</span>
</span></span><span class="line"><span class="cl">dig -x 8.8.8.8                             <span class="c1"># 反向查询</span>
</span></span><span class="line"><span class="cl">dig domain.com MX                           <span class="c1"># 查询邮件记录</span>
</span></span><span class="line"><span class="cl">host domain.com                             <span class="c1"># 简单 DNS 查询</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 连接测试</span>
</span></span><span class="line"><span class="cl">curl -I https://example.com                 <span class="c1"># 获取 HTTP 头</span>
</span></span><span class="line"><span class="cl">curl -X POST -d <span class="s2">&#34;key=value&#34;</span> https://api.example.com  <span class="c1"># POST 请求</span>
</span></span><span class="line"><span class="cl">curl -o file.zip https://example.com/file.zip        <span class="c1"># 下载文件</span>
</span></span><span class="line"><span class="cl">curl -L https://example.com                 <span class="c1"># 跟随重定向</span>
</span></span><span class="line"><span class="cl">curl -k https://self-signed.example.com     <span class="c1"># 忽略证书验证</span>
</span></span><span class="line"><span class="cl">wget https://example.com/file.zip           <span class="c1"># 下载文件</span>
</span></span><span class="line"><span class="cl">wget -r -l <span class="m">2</span> https://example.com            <span class="c1"># 递归下载（深度 2 层）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 端口与连接</span>
</span></span><span class="line"><span class="cl">nc -zv 192.168.1.100 <span class="m">22</span>                     <span class="c1"># 测试端口是否开放（netcat/ncat）</span>
</span></span><span class="line"><span class="cl">nc -l -p <span class="m">8080</span>                               <span class="c1"># 监听端口</span>
</span></span><span class="line"><span class="cl">telnet 192.168.1.100 <span class="m">80</span>                     <span class="c1"># 测试 TCP 连接</span></span></span></code></pre></div>
</div>
<h3 id="74-防火墙">7.4 防火墙</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># iptables（传统）</span>
</span></span><span class="line"><span class="cl">iptables -L -n -v                           <span class="c1"># 查看规则</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">22</span> -j ACCEPT   <span class="c1"># 允许 SSH</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -j DROP                   <span class="c1"># 默认丢弃入站</span>
</span></span><span class="line"><span class="cl">iptables-save &gt; /etc/iptables/rules.v4      <span class="c1"># 保存规则</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ufw（Ubuntu/Debian 上的 iptables 前端，更友好）</span>
</span></span><span class="line"><span class="cl">ufw status                                  <span class="c1"># 查看状态</span>
</span></span><span class="line"><span class="cl">ufw <span class="nb">enable</span>                                  <span class="c1"># 启用防火墙</span>
</span></span><span class="line"><span class="cl">ufw allow 22/tcp                            <span class="c1"># 允许 SSH</span>
</span></span><span class="line"><span class="cl">ufw allow from 192.168.1.0/24 to any port <span class="m">3306</span>  <span class="c1"># 允许网段访问 MySQL</span>
</span></span><span class="line"><span class="cl">ufw delete <span class="m">3</span>                                <span class="c1"># 删除第 3 条规则</span>
</span></span><span class="line"><span class="cl">ufw logging on                              <span class="c1"># 启用日志</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># firewalld（RHEL/CentOS/Fedora 默认）</span>
</span></span><span class="line"><span class="cl">firewall-cmd --state                        <span class="c1"># 查看状态</span>
</span></span><span class="line"><span class="cl">firewall-cmd --list-all                     <span class="c1"># 列出所有规则</span>
</span></span><span class="line"><span class="cl">firewall-cmd --add-service<span class="o">=</span>http --permanent <span class="c1"># 永久添加 HTTP 服务</span>
</span></span><span class="line"><span class="cl">firewall-cmd --add-port<span class="o">=</span>8080/tcp --permanent# 永久添加端口
</span></span><span class="line"><span class="cl">firewall-cmd --reload                       <span class="c1"># 重新加载规则</span>
</span></span><span class="line"><span class="cl">firewall-cmd --get-default-zone             <span class="c1"># 查看默认区域</span></span></span></code></pre></div>
</div>
<h3 id="75-ssh">7.5 SSH</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 基本用法</span>
</span></span><span class="line"><span class="cl">ssh user@host                               <span class="c1"># 连接到远程主机</span>
</span></span><span class="line"><span class="cl">ssh -p <span class="m">2222</span> user@host                       <span class="c1"># 指定端口</span>
</span></span><span class="line"><span class="cl">ssh -i ~/.ssh/id_rsa user@host              <span class="c1"># 使用密钥文件</span>
</span></span><span class="line"><span class="cl">ssh -L 8080:localhost:80 user@host          <span class="c1"># 本地端口转发</span>
</span></span><span class="line"><span class="cl">ssh -R 8080:localhost:80 user@host          <span class="c1"># 远程端口转发</span>
</span></span><span class="line"><span class="cl">ssh -D <span class="m">1080</span> user@host                       <span class="c1"># SOCKS 代理</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 密钥管理</span>
</span></span><span class="line"><span class="cl">ssh-keygen -t ed25519 -C <span class="s2">&#34;comment&#34;</span>          <span class="c1"># 生成 ED25519 密钥（推荐）</span>
</span></span><span class="line"><span class="cl">ssh-keygen -t rsa -b <span class="m">4096</span> -C <span class="s2">&#34;comment&#34;</span>      <span class="c1"># 生成 RSA 4096 密钥</span>
</span></span><span class="line"><span class="cl">ssh-copy-id user@host                       <span class="c1"># 复制公钥到远程主机</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># SCP / SFTP</span>
</span></span><span class="line"><span class="cl">scp file.txt user@host:/path/               <span class="c1"># 复制文件到远程</span>
</span></span><span class="line"><span class="cl">scp -r dir/ user@host:/path/                <span class="c1"># 递归复制目录</span>
</span></span><span class="line"><span class="cl">scp user@host:/path/file.txt ./             <span class="c1"># 从远程下载</span>
</span></span><span class="line"><span class="cl">sftp user@host                              <span class="c1"># 交互式文件传输</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># rsync — 增量同步</span>
</span></span><span class="line"><span class="cl">rsync -avz source/ user@host:/dest/         <span class="c1"># 归档模式同步（保留属性）</span>
</span></span><span class="line"><span class="cl">rsync -avz --delete source/ dest/           <span class="c1"># 镜像同步（删除目标多余文件）</span>
</span></span><span class="line"><span class="cl">rsync -avz --exclude<span class="o">=</span><span class="s2">&#34;*.log&#34;</span> source/ dest/  <span class="c1"># 排除特定文件</span>
</span></span><span class="line"><span class="cl">rsync -avz -e <span class="s2">&#34;ssh -p 2222&#34;</span> source/ dest/   <span class="c1"># 指定 SSH 端口</span></span></span></code></pre></div>
</div>
<h3 id="76-数据下载与传输">7.6 数据下载与传输</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># wget — 下载工具</span>
</span></span><span class="line"><span class="cl">wget https://example.com/file.iso           <span class="c1"># 下载文件</span>
</span></span><span class="line"><span class="cl">wget -c https://example.com/file.iso        <span class="c1"># 断点续传</span>
</span></span><span class="line"><span class="cl">wget -b https://example.com/file.iso        <span class="c1"># 后台下载</span>
</span></span><span class="line"><span class="cl">wget -i urls.txt                            <span class="c1"># 批量下载（从文件读取 URL）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># aria2 — 多线程下载</span>
</span></span><span class="line"><span class="cl">aria2c -x <span class="m">16</span> https://example.com/file.iso   <span class="c1"># 16 线程下载</span>
</span></span><span class="line"><span class="cl">aria2c -c https://example.com/file.iso      <span class="c1"># 断点续传</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第八章shell-脚本编程">第八章：Shell 脚本编程</h2>
<h3 id="81-脚本基础">8.1 脚本基础</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nb">set</span> -euo pipefail                           <span class="c1"># 严格模式：遇错退出、未定义变量报错、管道错误</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 变量</span>
</span></span><span class="line"><span class="cl"><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;world&#34;</span>                                <span class="c1"># 赋值（等号两边不能有空格）</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Hello, </span><span class="nv">$name</span><span class="s2">&#34;</span>                         <span class="c1"># 双引号内可展开变量</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;Hello, $name&#39;</span>                         <span class="c1"># 单引号原样输出</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Hello, </span><span class="si">${</span><span class="nv">name</span><span class="si">}</span><span class="s2">&#34;</span>                       <span class="c1"># 花括号明确变量边界</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 特殊变量</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;脚本名: </span><span class="nv">$0</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;参数个数: </span><span class="nv">$#</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;所有参数: </span><span class="nv">$@</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;所有参数(单字符串): </span><span class="nv">$*</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;退出码: </span><span class="nv">$?</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;当前 PID: </span><span class="nv">$$</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;上一个后台 PID: </span><span class="nv">$!</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 数组</span>
</span></span><span class="line"><span class="cl"><span class="nv">arr</span><span class="o">=(</span><span class="s2">&#34;a&#34;</span> <span class="s2">&#34;b&#34;</span> <span class="s2">&#34;c&#34;</span><span class="o">)</span>                           <span class="c1"># 定义数组</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">arr</span><span class="p">[0]</span><span class="si">}</span><span class="s2">&#34;</span>                            <span class="c1"># 第一个元素</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${</span><span class="nv">arr</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span>                            <span class="c1"># 所有元素</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;</span><span class="si">${#</span><span class="nv">arr</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span>                           <span class="c1"># 数组长度</span>
</span></span><span class="line"><span class="cl"><span class="nv">arr</span><span class="o">+=(</span><span class="s2">&#34;d&#34;</span><span class="o">)</span>                                  <span class="c1"># 追加元素</span></span></span></code></pre></div>
</div>
<h3 id="82-条件判断">8.2 条件判断</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># if 语句</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$a</span><span class="s2">&#34;</span> -eq <span class="s2">&#34;</span><span class="nv">$b</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;相等&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">elif</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$a</span><span class="s2">&#34;</span> -gt <span class="s2">&#34;</span><span class="nv">$b</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;a 大于 b&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;a 小于 b&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 数值比较：[ -eq / -ne / -gt / -lt / -ge / -le ]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 字符串比较：[ = / != / -z(为空) / -n(不为空) ]</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 文件测试：[ -f(是文件) / -d(是目录) / -x(可执行) / -r(可读) / -w(可写) / -e(存在) ]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># [[ ]] 增强版（支持正则和逻辑运算符）</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> <span class="s2">&#34;</span><span class="nv">$str</span><span class="s2">&#34;</span> <span class="o">=</span>~ ^<span class="o">[</span>0-9<span class="o">]</span>+$ <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>           <span class="c1"># 正则匹配</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;是数字&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[[</span> -f config.yml <span class="o">&amp;&amp;</span> -r config.yml <span class="o">]]</span><span class="p">;</span> <span class="k">then</span>  <span class="c1"># 逻辑与</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;配置文件可读&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># case 语句</span>
</span></span><span class="line"><span class="cl"><span class="k">case</span> <span class="s2">&#34;</span><span class="nv">$OS</span><span class="s2">&#34;</span> in
</span></span><span class="line"><span class="cl">    Linux<span class="o">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;Linux&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">    Darwin<span class="o">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;macOS&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">    *<span class="o">)</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;Unknown&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl"><span class="k">esac</span></span></span></code></pre></div>
</div>
<h3 id="83-循环">8.3 循环</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># for 循环</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> i in <span class="o">{</span>1..10<span class="o">}</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;Number: </span><span class="nv">$i</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> file in *.txt<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;Processing: </span><span class="nv">$file</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># while 循环</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nb">read</span> -r line<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$line</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; file.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">count</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="o">[</span> <span class="nv">$count</span> -lt <span class="m">10</span> <span class="o">]</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$count</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="o">((</span>count++<span class="o">))</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># until 循环（条件为假时执行）</span>
</span></span><span class="line"><span class="cl"><span class="k">until</span> ping -c1 google.com &gt; /dev/null 2&gt;<span class="p">&amp;</span>1<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;等待网络...&#34;</span>
</span></span><span class="line"><span class="cl">    sleep <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<h3 id="84-函数">8.4 函数</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 定义函数</span>
</span></span><span class="line"><span class="cl">log<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">level</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>                         <span class="c1"># local 限定作用域</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">message</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$2</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date <span class="s1">&#39;+%Y-%m-%d %H:%M:%S&#39;</span><span class="k">)</span><span class="s2">] [</span><span class="nv">$level</span><span class="s2">] </span><span class="nv">$message</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;INFO&#34;</span> <span class="s2">&#34;脚本开始执行&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 返回值（return 只能返回 0-255 的整数）</span>
</span></span><span class="line"><span class="cl">is_root<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="o">[</span> <span class="s2">&#34;</span><span class="k">$(</span>id -u<span class="k">)</span><span class="s2">&#34;</span> -eq <span class="m">0</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="k">return</span> <span class="m">0</span> <span class="o">||</span> <span class="k">return</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 函数输出作为返回值</span>
</span></span><span class="line"><span class="cl">get_config<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">local</span> <span class="nv">key</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    grep <span class="s2">&#34;^</span><span class="si">${</span><span class="nv">key</span><span class="si">}</span><span class="s2">=&#34;</span> /etc/myapp.conf <span class="p">|</span> cut -d<span class="s1">&#39;=&#39;</span> -f2
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="nv">value</span><span class="o">=</span><span class="k">$(</span>get_config <span class="s2">&#34;database_host&#34;</span><span class="k">)</span></span></span></code></pre></div>
</div>
<h3 id="85-常用模式">8.5 常用模式</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 遍历文件逐行处理</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nv">IFS</span><span class="o">=</span> <span class="nb">read</span> -r line <span class="o">||</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$line</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$line</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; file.txt
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 处理命令输出</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nv">IFS</span><span class="o">=</span> <span class="nb">read</span> -r file<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;-&gt; </span><span class="nv">$file</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; &lt;<span class="o">(</span>find . -name <span class="s2">&#34;*.log&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 临时文件安全创建</span>
</span></span><span class="line"><span class="cl"><span class="nv">tmpfile</span><span class="o">=</span><span class="k">$(</span>mktemp /tmp/myscript.XXXXXX<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nb">trap</span> <span class="s2">&#34;rm -f </span><span class="nv">$tmpfile</span><span class="s2">&#34;</span> EXIT                 <span class="c1"># 脚本退出时自动清理</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 彩色输出</span>
</span></span><span class="line"><span class="cl"><span class="nv">RED</span><span class="o">=</span><span class="s1">&#39;\033[0;31m&#39;</span><span class="p">;</span> <span class="nv">GREEN</span><span class="o">=</span><span class="s1">&#39;\033[0;32m&#39;</span><span class="p">;</span> <span class="nv">NC</span><span class="o">=</span><span class="s1">&#39;\033[0m&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;</span><span class="si">${</span><span class="nv">GREEN</span><span class="si">}</span><span class="s2">[OK]</span><span class="si">${</span><span class="nv">NC</span><span class="si">}</span><span class="s2"> 操作成功&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;</span><span class="si">${</span><span class="nv">RED</span><span class="si">}</span><span class="s2">[FAIL]</span><span class="si">${</span><span class="nv">NC</span><span class="si">}</span><span class="s2"> 操作失败&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 参数解析</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nb">getopts</span> <span class="s2">&#34;h:u:p:&#34;</span> opt<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="nv">$opt</span> in
</span></span><span class="line"><span class="cl">        h<span class="o">)</span> <span class="nv">host</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$OPTARG</span><span class="s2">&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">        u<span class="o">)</span> <span class="nv">user</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$OPTARG</span><span class="s2">&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">        p<span class="o">)</span> <span class="nv">pass</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$OPTARG</span><span class="s2">&#34;</span><span class="p">;;</span>
</span></span><span class="line"><span class="cl">        *<span class="o">)</span> <span class="nb">echo</span> <span class="s2">&#34;用法: </span><span class="nv">$0</span><span class="s2"> -h host -u user -p pass&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;;</span>
</span></span><span class="line"><span class="cl">    <span class="k">esac</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第九章高级命令与技巧">第九章：高级命令与技巧</h2>
<h3 id="91-xargs--参数构建">9.1 xargs — 参数构建</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">find . -name <span class="s2">&#34;*.tmp&#34;</span> <span class="p">|</span> xargs rm             <span class="c1"># 删除找到的文件</span>
</span></span><span class="line"><span class="cl">find . -name <span class="s2">&#34;*.log&#34;</span> -print0 <span class="p">|</span> xargs -0 rm  <span class="c1"># 处理包含空格的文件名（安全方式）</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;file1 file2 file3&#34;</span> <span class="p">|</span> xargs -n <span class="m">1</span>       <span class="c1"># 每次传递 1 个参数</span>
</span></span><span class="line"><span class="cl">seq <span class="m">1</span> <span class="m">10</span> <span class="p">|</span> xargs -P <span class="m">4</span> -I <span class="o">{}</span> <span class="nb">echo</span> <span class="s2">&#34;Processing {}&#34;</span>  <span class="c1"># 4 进程并行处理</span>
</span></span><span class="line"><span class="cl">find . -name <span class="s2">&#34;*.txt&#34;</span> <span class="p">|</span> xargs grep <span class="s2">&#34;pattern&#34;</span> <span class="c1"># 在找到的文件中搜索</span></span></span></code></pre></div>
</div>
<h3 id="92-重定向与管道进阶">9.2 重定向与管道进阶</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 标准流</span>
</span></span><span class="line"><span class="cl"><span class="c1"># stdin = 0, stdout = 1, stderr = 2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">command</span> &gt; file.txt                          <span class="c1"># 覆盖写入 stdout</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> &gt;&gt; file.txt                         <span class="c1"># 追加写入 stdout</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> 2&gt; error.txt                        <span class="c1"># 重定向 stderr</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> 2&gt;<span class="p">&amp;</span><span class="m">1</span>                                <span class="c1"># stderr 合并到 stdout</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> &gt; /dev/null 2&gt;<span class="p">&amp;</span><span class="m">1</span>                    <span class="c1"># 静默所有输出</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> &gt; file.txt 2&gt;<span class="p">&amp;</span><span class="m">1</span>                     <span class="c1"># stdout 和 stderr 写入同一文件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 管道</span>
</span></span><span class="line"><span class="cl">command1 <span class="p">|</span> command2                         <span class="c1"># 将 stdout 传给下一个命令</span>
</span></span><span class="line"><span class="cl">command1 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> command2                    <span class="c1"># 将 stdout 和 stderr 都传给下一个</span>
</span></span><span class="line"><span class="cl">command1 <span class="p">|</span> tee output.txt                   <span class="c1"># 同时输出到文件和 stdout</span>
</span></span><span class="line"><span class="cl">command1 <span class="p">|</span> tee -a output.txt                <span class="c1"># 追加模式</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 进程替换</span>
</span></span><span class="line"><span class="cl">diff &lt;<span class="o">(</span>ls dir1<span class="o">)</span> &lt;<span class="o">(</span>ls dir2<span class="o">)</span>                  <span class="c1"># 比较两个命令的输出</span>
</span></span><span class="line"><span class="cl">command1 &gt; &gt;<span class="o">(</span>gzip &gt; file.gz<span class="o">)</span>                <span class="c1"># 输出到压缩文件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Here Document</span>
</span></span><span class="line"><span class="cl">cat <span class="s">&lt;&lt;EOF &gt; config.txt
</span></span></span><span class="line"><span class="cl"><span class="s">line1
</span></span></span><span class="line"><span class="cl"><span class="s">line2
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Here String</span>
</span></span><span class="line"><span class="cl">grep <span class="s2">&#34;pattern&#34;</span> <span class="o">&lt;&lt;&lt;</span> <span class="s2">&#34;some string to search&#34;</span></span></span></code></pre></div>
</div>
<h3 id="93-计划任务">9.3 计划任务</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># cron 格式：分 时 日 月 周</span>
</span></span><span class="line"><span class="cl">crontab -e                                  <span class="c1"># 编辑当前用户 cron</span>
</span></span><span class="line"><span class="cl">crontab -l                                  <span class="c1"># 列出当前用户 cron</span>
</span></span><span class="line"><span class="cl">crontab -u username -e                      <span class="c1"># 编辑指定用户 cron（需 root）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 示例（在 /var/spool/cron/ 或 /etc/crontab）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># */5 * * * * /path/to/script.sh            # 每 5 分钟执行</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0 2 * * * /path/to/backup.sh              # 每天凌晨 2 点</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0 9 * * 1-5 /path/to/script.sh            # 工作日早 9 点</span>
</span></span><span class="line"><span class="cl"><span class="c1"># @daily /path/to/script.sh                 # 每天一次</span>
</span></span><span class="line"><span class="cl"><span class="c1"># @reboot /path/to/script.sh                # 开机启动</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/cron.d/       — 系统级 cron 任务</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/cron.daily/   — 每天执行的脚本</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/cron.hourly/  — 每小时执行的脚本</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/cron.weekly/  — 每周执行的脚本</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/cron.monthly/ — 每月执行的脚本</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># systemd timer（systemd 发行版推荐替代 cron）</span>
</span></span><span class="line"><span class="cl">systemctl list-timers                       <span class="c1"># 查看所有定时器</span></span></span></code></pre></div>
</div>
<h3 id="94-systemd-服务管理">9.4 systemd 服务管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 服务状态</span>
</span></span><span class="line"><span class="cl">systemctl status nginx                      <span class="c1"># 查看服务状态</span>
</span></span><span class="line"><span class="cl">systemctl is-active nginx                   <span class="c1"># 是否运行中</span>
</span></span><span class="line"><span class="cl">systemctl is-enabled nginx                  <span class="c1"># 是否开机自启</span>
</span></span><span class="line"><span class="cl">systemctl list-units --type<span class="o">=</span>service         <span class="c1"># 所有服务单元</span>
</span></span><span class="line"><span class="cl">systemctl list-units --type<span class="o">=</span>service --state<span class="o">=</span>failed  <span class="c1"># 失败的服务</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 服务控制</span>
</span></span><span class="line"><span class="cl">systemctl start<span class="p">|</span>stop<span class="p">|</span>restart nginx           <span class="c1"># 启动/停止/重启</span>
</span></span><span class="line"><span class="cl">systemctl reload nginx                       <span class="c1"># 重新加载配置（无需重启）</span>
</span></span><span class="line"><span class="cl">systemctl enable<span class="p">|</span>disable nginx               <span class="c1"># 设置/取消开机自启</span>
</span></span><span class="line"><span class="cl">systemctl mask<span class="p">|</span>unmask nginx                  <span class="c1"># 屏蔽/取消屏蔽（禁止手动启动）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看日志</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx                          <span class="c1"># 某服务的日志</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx -f                       <span class="c1"># 持续追踪</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx --since <span class="s2">&#34;2026-05-15&#34;</span>     <span class="c1"># 从指定日期</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx --since <span class="s2">&#34;1 hour ago&#34;</span>     <span class="c1"># 最近 1 小时</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx -p err                   <span class="c1"># 只看错误级别</span>
</span></span><span class="line"><span class="cl">journalctl --disk-usage                      <span class="c1"># 日志占用空间</span>
</span></span><span class="line"><span class="cl">journalctl --vacuum-size<span class="o">=</span>500M                <span class="c1"># 清理日志至 500M 以下</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 分析启动时间</span>
</span></span><span class="line"><span class="cl">systemd-analyze                              <span class="c1"># 总启动时间</span>
</span></span><span class="line"><span class="cl">systemd-analyze blame                        <span class="c1"># 各服务启动时间排序</span>
</span></span><span class="line"><span class="cl">systemd-analyze critical-chain               <span class="c1"># 关键启动链</span></span></span></code></pre></div>
</div>
<h3 id="95-journald-持久化配置">9.5 journald 持久化配置</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/systemd/journald.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Storage=persistent    # 持久化到磁盘（默认 /var/log/journal/）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SystemMaxUse=1G       # 最大占用空间</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十章软件包管理">第十章：软件包管理</h2>
<h3 id="101-包管理器对比">10.1 包管理器对比</h3>
<table>
  <thead>
      <tr>
          <th>功能</th>
          <th>Debian/Ubuntu (apt/dpkg)</th>
          <th>RHEL/CentOS/Fedora (dnf/yum/rpm)</th>
          <th>Arch (pacman)</th>
          <th>Alpine (apk)</th>
          <th>openSUSE (zypper)</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>搜索软件</td>
          <td><code>apt search pkg</code></td>
          <td><code>dnf search pkg</code></td>
          <td><code>pacman -Ss pkg</code></td>
          <td><code>apk search pkg</code></td>
          <td><code>zypper search pkg</code></td>
      </tr>
      <tr>
          <td>安装</td>
          <td><code>apt install pkg</code></td>
          <td><code>dnf install pkg</code></td>
          <td><code>pacman -S pkg</code></td>
          <td><code>apk add pkg</code></td>
          <td><code>zypper install pkg</code></td>
      </tr>
      <tr>
          <td>卸载</td>
          <td><code>apt remove pkg</code></td>
          <td><code>dnf remove pkg</code></td>
          <td><code>pacman -R pkg</code></td>
          <td><code>apk del pkg</code></td>
          <td><code>zypper remove pkg</code></td>
      </tr>
      <tr>
          <td>更新列表</td>
          <td><code>apt update</code></td>
          <td><code>dnf check-update</code></td>
          <td><code>pacman -Sy</code></td>
          <td><code>apk update</code></td>
          <td><code>zypper refresh</code></td>
      </tr>
      <tr>
          <td>升级所有</td>
          <td><code>apt upgrade</code></td>
          <td><code>dnf upgrade</code></td>
          <td><code>pacman -Su</code></td>
          <td><code>apk upgrade</code></td>
          <td><code>zypper update</code></td>
      </tr>
      <tr>
          <td>本地安装</td>
          <td><code>dpkg -i file.deb</code></td>
          <td><code>rpm -ivh file.rpm</code></td>
          <td><code>pacman -U file.pkg.tar.zst</code></td>
          <td><code>apk add --allow-untrusted file.apk</code></td>
          <td><code>zypper install file.rpm</code></td>
      </tr>
      <tr>
          <td>列出已安装</td>
          <td><code>dpkg -l</code></td>
          <td><code>rpm -qa</code></td>
          <td><code>pacman -Q</code></td>
          <td><code>apk info</code></td>
          <td><code>zypper packages --installed-only</code></td>
      </tr>
      <tr>
          <td>文件属于哪个包</td>
          <td><code>dpkg -S /path/file</code></td>
          <td><code>rpm -qf /path/file</code></td>
          <td><code>pacman -Qo /path/file</code></td>
          <td><code>apk info --who-owns /path/file</code></td>
          <td><code>zypper search --provides /path/file</code></td>
      </tr>
      <tr>
          <td>包包含哪些文件</td>
          <td><code>dpkg -L pkg</code></td>
          <td><code>rpm -ql pkg</code></td>
          <td><code>pacman -Ql pkg</code></td>
          <td><code>apk info -L pkg</code></td>
          <td><code>rpm -ql pkg</code></td>
      </tr>
      <tr>
          <td>清理缓存</td>
          <td><code>apt clean</code></td>
          <td><code>dnf clean all</code></td>
          <td><code>pacman -Sc</code></td>
          <td><code>apk cache clean</code></td>
          <td><code>zypper clean</code></td>
      </tr>
  </tbody>
</table>
<h3 id="102-apt-详细操作debianubuntu">10.2 APT 详细操作（Debian/Ubuntu）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 源配置</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 主源文件：/etc/apt/sources.list</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 附加源：/etc/apt/sources.list.d/*.list</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 常用命令</span>
</span></span><span class="line"><span class="cl">apt update                                  <span class="c1"># 更新包索引</span>
</span></span><span class="line"><span class="cl">apt list --upgradable                       <span class="c1"># 查看可升级的包</span>
</span></span><span class="line"><span class="cl">apt upgrade                                 <span class="c1"># 升级所有包（不删除旧包）</span>
</span></span><span class="line"><span class="cl">apt full-upgrade                            <span class="c1"># 完整升级（可能删除冲突包）</span>
</span></span><span class="line"><span class="cl">apt autoremove                              <span class="c1"># 删除不再需要的依赖</span>
</span></span><span class="line"><span class="cl">apt purge pkg                               <span class="c1"># 彻底删除（含配置文件）</span>
</span></span><span class="line"><span class="cl">apt show pkg                                <span class="c1"># 查看包详细信息</span>
</span></span><span class="line"><span class="cl">apt edit-sources                            <span class="c1"># 编辑源列表</span>
</span></span><span class="line"><span class="cl">apt-mark hold pkg                           <span class="c1"># 锁定包版本（禁止升级）</span>
</span></span><span class="line"><span class="cl">apt-mark unhold pkg                         <span class="c1"># 解锁</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># PPA（Ubuntu 特性）</span>
</span></span><span class="line"><span class="cl">add-apt-repository ppa:user/name            <span class="c1"># 添加 PPA 源</span>
</span></span><span class="line"><span class="cl">add-apt-repository -r ppa:user/name         <span class="c1"># 移除 PPA 源</span></span></span></code></pre></div>
</div>
<h3 id="103-dnfyum-详细操作rhelcentosfedora">10.3 DNF/YUM 详细操作（RHEL/CentOS/Fedora）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># RHEL 8+ / CentOS 8+ / Fedora 使用 DNF（YUM 的下一代）</span>
</span></span><span class="line"><span class="cl"><span class="c1"># RHEL 7 / CentOS 7 使用 YUM</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 仓库管理</span>
</span></span><span class="line"><span class="cl">dnf repolist                                <span class="c1"># 列出已启用的仓库</span>
</span></span><span class="line"><span class="cl">dnf repolist all                            <span class="c1"># 列出所有仓库</span>
</span></span><span class="line"><span class="cl">dnf config-manager --add-repo url           <span class="c1"># 添加仓库</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 包管理</span>
</span></span><span class="line"><span class="cl">dnf search pkg                              <span class="c1"># 搜索</span>
</span></span><span class="line"><span class="cl">dnf info pkg                                <span class="c1"># 查看信息</span>
</span></span><span class="line"><span class="cl">dnf install pkg                             <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">dnf remove pkg                              <span class="c1"># 卸载</span>
</span></span><span class="line"><span class="cl">dnf upgrade                                 <span class="c1"># 升级</span>
</span></span><span class="line"><span class="cl">dnf autoremove                              <span class="c1"># 删除孤立依赖</span>
</span></span><span class="line"><span class="cl">dnf <span class="nb">history</span>                                 <span class="c1"># DNF 操作历史</span>
</span></span><span class="line"><span class="cl">dnf <span class="nb">history</span> undo <span class="m">5</span>                          <span class="c1"># 回滚第 5 次操作</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 包组</span>
</span></span><span class="line"><span class="cl">dnf group list                              <span class="c1"># 列出包组</span>
</span></span><span class="line"><span class="cl">dnf group install <span class="s2">&#34;Development Tools&#34;</span>       <span class="c1"># 安装包组</span></span></span></code></pre></div>
</div>
<h3 id="104-pacman-详细操作arch">10.4 Pacman 详细操作（Arch）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 配置：/etc/pacman.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 镜像：/etc/pacman.d/mirrorlist</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">pacman -Syu                                 <span class="c1"># 更新并升级（日常推荐）</span>
</span></span><span class="line"><span class="cl">pacman -S pkg                               <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">pacman -R pkg                               <span class="c1"># 删除（保留依赖）</span>
</span></span><span class="line"><span class="cl">pacman -Rs pkg                              <span class="c1"># 删除（含不再需要的依赖）</span>
</span></span><span class="line"><span class="cl">pacman -Rns pkg                             <span class="c1"># 删除（含依赖和配置文件）</span>
</span></span><span class="line"><span class="cl">pacman -Qdt                                 <span class="c1"># 列出孤立包</span>
</span></span><span class="line"><span class="cl">pacman -Qe                                  <span class="c1"># 列出显式安装的包</span>
</span></span><span class="line"><span class="cl">pacman -Qm                                  <span class="c1"># 列出外来包（非官方仓库）</span>
</span></span><span class="line"><span class="cl">paccache -r                                 <span class="c1"># 清理包缓存（保留最近 3 个版本）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AUR 助手（非官方，推荐 yay 或 paru）</span>
</span></span><span class="line"><span class="cl">yay -S pkg                                  <span class="c1"># 安装（含 AUR）</span>
</span></span><span class="line"><span class="cl">yay -Sua                                    <span class="c1"># 仅升级 AUR 包</span></span></span></code></pre></div>
</div>
<h3 id="105-通用二进制包管理">10.5 通用二进制包管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Flatpak（跨发行版桌面应用）</span>
</span></span><span class="line"><span class="cl">flatpak search appname                       <span class="c1"># 搜索</span>
</span></span><span class="line"><span class="cl">flatpak install flathub org.app.Name        <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">flatpak run org.app.Name                    <span class="c1"># 运行</span>
</span></span><span class="line"><span class="cl">flatpak list                                 <span class="c1"># 列出已安装</span>
</span></span><span class="line"><span class="cl">flatpak update                               <span class="c1"># 更新所有</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Snap（Ubuntu 推广的通用包格式）</span>
</span></span><span class="line"><span class="cl">snap find appname                           <span class="c1"># 搜索</span>
</span></span><span class="line"><span class="cl">snap install appname                        <span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">snap list                                   <span class="c1"># 列出已安装</span>
</span></span><span class="line"><span class="cl">snap refresh                                <span class="c1"># 更新所有</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># AppImage（免安装运行）</span>
</span></span><span class="line"><span class="cl">chmod +x app.AppImage                       <span class="c1"># 赋予执行权限</span>
</span></span><span class="line"><span class="cl">./app.AppImage                              <span class="c1"># 直接运行</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十一章系统性能与排错">第十一章：系统性能与排错</h2>
<h3 id="111-性能监控">11.1 性能监控</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># CPU</span>
</span></span><span class="line"><span class="cl">top / htop
</span></span><span class="line"><span class="cl">mpstat <span class="m">1</span>                                    <span class="c1"># 每个 CPU 使用率（sysstat 包）</span>
</span></span><span class="line"><span class="cl">sar -u <span class="m">1</span> <span class="m">10</span>                                 <span class="c1"># CPU 历史统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 内存</span>
</span></span><span class="line"><span class="cl">free -h
</span></span><span class="line"><span class="cl">vmstat <span class="m">1</span>                                    <span class="c1"># 虚拟内存统计</span>
</span></span><span class="line"><span class="cl">sar -r <span class="m">1</span> <span class="m">10</span>                                 <span class="c1"># 内存历史统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># IO</span>
</span></span><span class="line"><span class="cl">iostat -x <span class="m">1</span>                                 <span class="c1"># 磁盘 IO 统计（sysstat 包）</span>
</span></span><span class="line"><span class="cl">iotop                                       <span class="c1"># IO 进程排行（需安装）</span>
</span></span><span class="line"><span class="cl">sar -b <span class="m">1</span> <span class="m">10</span>                                 <span class="c1"># IO 历史统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 网络</span>
</span></span><span class="line"><span class="cl">iftop                                       <span class="c1"># 网络流量监控（需安装）</span>
</span></span><span class="line"><span class="cl">nethogs                                     <span class="c1"># 按进程查看网络流量（需安装）</span>
</span></span><span class="line"><span class="cl">sar -n DEV <span class="m">1</span> <span class="m">10</span>                             <span class="c1"># 网络历史统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 综合</span>
</span></span><span class="line"><span class="cl">dstat                                       <span class="c1"># 替代 vmstat、iostat、netstat（需安装）</span>
</span></span><span class="line"><span class="cl">glances                                     <span class="c1"># Web/终端综合监控（需安装）</span></span></span></code></pre></div>
</div>
<h3 id="112-内存与-oom-排错">11.2 内存与 OOM 排错</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dmesg <span class="p">|</span> grep -i oom                         <span class="c1"># 查看 OOM Killer 日志</span>
</span></span><span class="line"><span class="cl">dmesg <span class="p">|</span> grep -i <span class="s2">&#34;killed process&#34;</span>            <span class="c1"># 被杀的进程</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/oom_score                     <span class="c1"># OOM 分数（越高越可能被杀）</span>
</span></span><span class="line"><span class="cl">cat /proc/PID/oom_score_adj                 <span class="c1"># OOM 调整值（-1000 排除）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 限制应用内存</span>
</span></span><span class="line"><span class="cl">systemd-run --scope -p <span class="nv">MemoryMax</span><span class="o">=</span>500M ./myapp
</span></span><span class="line"><span class="cl">cgexec -g memory:limit_group ./myapp</span></span></code></pre></div>
</div>
<h3 id="113-日志管理">11.3 日志管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 传统 syslog</span>
</span></span><span class="line"><span class="cl">cat /var/log/syslog                          <span class="c1"># Debian/Ubuntu 系统日志</span>
</span></span><span class="line"><span class="cl">cat /var/log/messages                        <span class="c1"># RHEL/CentOS 系统日志</span>
</span></span><span class="line"><span class="cl">cat /var/log/auth.log                        <span class="c1"># 认证日志（Debian/Ubuntu）</span>
</span></span><span class="line"><span class="cl">cat /var/log/secure                          <span class="c1"># 认证日志（RHEL/CentOS）</span>
</span></span><span class="line"><span class="cl">cat /var/log/kern.log                        <span class="c1"># 内核日志</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># journald（systemd 系统）</span>
</span></span><span class="line"><span class="cl">journalctl -b                                <span class="c1"># 本次启动以来的日志</span>
</span></span><span class="line"><span class="cl">journalctl -b -1                             <span class="c1"># 上次启动的日志</span>
</span></span><span class="line"><span class="cl">journalctl -k                                <span class="c1"># 内核日志</span>
</span></span><span class="line"><span class="cl">journalctl -p err                            <span class="c1"># 只看错误及以上级别</span>
</span></span><span class="line"><span class="cl">journalctl <span class="nv">_PID</span><span class="o">=</span><span class="m">1234</span>                         <span class="c1"># 特定 PID 的日志</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 日志轮转</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 配置：/etc/logrotate.conf 和 /etc/logrotate.d/</span>
</span></span><span class="line"><span class="cl">logrotate -f /etc/logrotate.conf             <span class="c1"># 强制执行轮转</span></span></span></code></pre></div>
</div>
<h3 id="114-启动与恢复">11.4 启动与恢复</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># GRUB 恢复模式</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 开机时在 GRUB 菜单按 &#39;e&#39; 编辑启动参数</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 在 linux 行末尾添加：single 或 init=/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 或添加 systemd.unit=rescue.target</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 单用户模式</span>
</span></span><span class="line"><span class="cl">systemctl rescue                             <span class="c1"># 救援模式（需 root 密码）</span>
</span></span><span class="line"><span class="cl">systemctl emergency                          <span class="c1"># 紧急模式（最小环境）</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 修复文件系统</span>
</span></span><span class="line"><span class="cl">fsck /dev/sdb1                               <span class="c1"># 检查文件系统（需卸载）</span>
</span></span><span class="line"><span class="cl">fsck -y /dev/sdb1                            <span class="c1"># 自动修复</span>
</span></span><span class="line"><span class="cl">tune2fs -l /dev/sdb1                         <span class="c1"># 查看 ext 文件系统信息</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重置 root 密码</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. GRUB 编辑启动项，添加 init=/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2. mount -o remount,rw /</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3. passwd root</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4. reboot -f</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十二章发行版对比">第十二章：发行版对比</h2>
<h3 id="121-主流发行版家族总览">12.1 主流发行版家族总览</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>Linux 发行版家族树（简化版）：

Debian ──┬── Debian Stable/Testing/Unstable
         ├── Ubuntu ──┬── Ubuntu Desktop/Server
         │            ├── Linux Mint
         │            ├── Pop!_OS
         │            └── Elementary OS
         └── Kali Linux（安全审计）

RHEL ────┬── Red Hat Enterprise Linux
         ├── CentOS / CentOS Stream
         ├── Fedora
         ├── AlmaLinux
         └── Rocky Linux

Arch ────┬── Arch Linux
         ├── Manjaro
         └── EndeavourOS

SUSE ────┬── openSUSE Leap
         └── openSUSE Tumbleweed

独立系 ──┬── Gentoo Linux（源码编译）
         ├── Alpine Linux（轻量，基于 musl/BusyBox）
         ├── NixOS（声明式配置）
         ├── Void Linux（独立开发）
         └── Solus（独立开发）</code></pre>
</div>
<h3 id="122-核心差异对照表">12.2 核心差异对照表</h3>
<table>
  <thead>
      <tr>
          <th>特性</th>
          <th>Debian/Ubuntu</th>
          <th>RHEL/CentOS/Fedora</th>
          <th>Arch Linux</th>
          <th>Alpine</th>
          <th>openSUSE</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>包格式</strong></td>
          <td>.deb</td>
          <td>.rpm</td>
          <td>.pkg.tar.zst</td>
          <td>.apk</td>
          <td>.rpm</td>
      </tr>
      <tr>
          <td><strong>包管理器</strong></td>
          <td>apt/dpkg</td>
          <td>dnf/rpm/yum</td>
          <td>pacman</td>
          <td>apk</td>
          <td>zypper</td>
      </tr>
      <tr>
          <td><strong>默认防火墙</strong></td>
          <td>ufw</td>
          <td>firewalld</td>
          <td>iptables/nftables</td>
          <td>iptables</td>
          <td>firewalld</td>
      </tr>
      <tr>
          <td><strong>C 库</strong></td>
          <td>glibc</td>
          <td>glibc</td>
          <td>glibc</td>
          <td>musl</td>
          <td>glibc</td>
      </tr>
      <tr>
          <td><strong>核心工具</strong></td>
          <td>GNU coreutils</td>
          <td>GNU coreutils</td>
          <td>GNU coreutils</td>
          <td>BusyBox</td>
          <td>GNU coreutils</td>
      </tr>
      <tr>
          <td><strong>init 系统</strong></td>
          <td>systemd</td>
          <td>systemd</td>
          <td>systemd</td>
          <td>OpenRC</td>
          <td>systemd</td>
      </tr>
      <tr>
          <td><strong>默认文件系统</strong></td>
          <td>ext4</td>
          <td>xfs (RHEL8+)</td>
          <td>ext4</td>
          <td>ext4</td>
          <td>btrfs</td>
      </tr>
      <tr>
          <td><strong>SELinux/AppArmor</strong></td>
          <td>AppArmor</td>
          <td>SELinux</td>
          <td>无（可选）</td>
          <td>无</td>
          <td>AppArmor</td>
      </tr>
      <tr>
          <td><strong>Python 默认</strong></td>
          <td>python3</td>
          <td>python3 (RHEL8+)</td>
          <td>python3</td>
          <td>默认不安装</td>
          <td>python3</td>
      </tr>
      <tr>
          <td><strong>默认 Shell</strong></td>
          <td>bash</td>
          <td>bash</td>
          <td>bash</td>
          <td>ash (BusyBox)</td>
          <td>bash</td>
      </tr>
      <tr>
          <td><strong>软件源规模</strong></td>
          <td>极大（Ubuntu PPA）</td>
          <td>小（EPEL 扩展）</td>
          <td>极大（AUR）</td>
          <td>极小</td>
          <td>中等</td>
      </tr>
      <tr>
          <td><strong>更新策略</strong></td>
          <td>稳定版/保守</td>
          <td>稳定版/保守</td>
          <td>滚动更新</td>
          <td>稳定版/保守</td>
          <td>Leap(稳定) / Tumbleweed(滚动)</td>
      </tr>
  </tbody>
</table>
<h3 id="123-包管理器命令对照详细版">12.3 包管理器命令对照（详细版）</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>操作              Debian/Ubuntu          RHEL/CentOS 7          RHEL 8+/Fedora          Arch                    Alpine                 openSUSE
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
更新索引          apt update             yum makecache          dnf makecache           pacman -Sy              apk update             zypper refresh
升级所有包        apt upgrade            yum update             dnf upgrade             pacman -Su              apk upgrade            zypper update
安装包            apt install pkg        yum install pkg        dnf install pkg         pacman -S pkg           apk add pkg            zypper install pkg
卸载包            apt remove pkg         yum remove pkg         dnf remove pkg          pacman -R pkg           apk del pkg            zypper remove pkg
清除配置卸载      apt purge pkg          yum erase pkg          dnf remove --purge pkg  pacman -Rn pkg          apk del --purge pkg    zypper remove --clean-deps pkg
搜索包            apt search keyword     yum search keyword     dnf search keyword      pacman -Ss keyword      apk search keyword     zypper search keyword
包详情            apt show pkg           yum info pkg           dnf info pkg            pacman -Si pkg          apk info pkg           zypper info pkg
列出已安装        dpkg -l / apt list --installed  rpm -qa      rpm -qa / dnf list --installed  pacman -Q       apk info               zypper packages --installed-only
文件属于哪个包    dpkg -S /path/file     rpm -qf /path/file     rpm -qf /path/file      pacman -Qo /path/file   apk info --who-owns    rpm -qf /path/file
包包含哪些文件    dpkg -L pkg            rpm -ql pkg            rpm -ql pkg             pacman -Ql pkg          apk info -L pkg        rpm -ql pkg
清理缓存          apt clean / apt autoclean  yum clean all     dnf clean all           pacman -Sc / paccache -r  apk cache clean    zypper clean
锁定版本          apt-mark hold pkg      yum versionlock pkg    dnf versionlock pkg     (编辑 pacman.conf)      apk add pkg=version    zypper addlock pkg</code></pre>
</div>
<h3 id="124-服务管理对比">12.4 服务管理对比</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>操作              SysV Init              systemd (当前主流)      OpenRC (Alpine/Gentoo)
─────────────────────────────────────────────────────────────────────────────────
启动服务          service nginx start    systemctl start nginx   rc-service nginx start
停止服务          service nginx stop     systemctl stop nginx    rc-service nginx stop
重启服务          service nginx restart  systemctl restart nginx rc-service nginx restart
状态              service nginx status   systemctl status nginx  rc-service nginx status
开机自启          chkconfig nginx on     systemctl enable nginx  rc-update add nginx
禁用自启          chkconfig nginx off    systemctl disable nginx rc-update del nginx
列出所有服务      chkconfig --list       systemctl list-units    rc-status</code></pre>
</div>
<h3 id="125-配置文件位置差异">12.5 配置文件位置差异</h3>
<table>
  <thead>
      <tr>
          <th>配置项</th>
          <th>Debian/Ubuntu</th>
          <th>RHEL/CentOS/Fedora</th>
          <th>Arch</th>
          <th>Alpine</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>网络接口</td>
          <td><code>/etc/network/interfaces</code></td>
          <td><code>/etc/sysconfig/network-scripts/ifcfg-*</code></td>
          <td><code>/etc/systemd/network/</code></td>
          <td><code>/etc/network/interfaces</code></td>
      </tr>
      <tr>
          <td>DNS</td>
          <td><code>/etc/resolv.conf</code> (或 resolvconf)</td>
          <td><code>/etc/resolv.conf</code> (NetworkManager 管理)</td>
          <td><code>/etc/resolv.conf</code> (systemd-resolved)</td>
          <td><code>/etc/resolv.conf</code></td>
      </tr>
      <tr>
          <td>软件源</td>
          <td><code>/etc/apt/sources.list</code></td>
          <td><code>/etc/yum.repos.d/*.repo</code></td>
          <td><code>/etc/pacman.d/mirrorlist</code></td>
          <td><code>/etc/apk/repositories</code></td>
      </tr>
      <tr>
          <td>时区</td>
          <td><code>/etc/timezone</code> + <code>/etc/localtime</code></td>
          <td><code>/etc/localtime</code> (systemd: <code>timedatectl</code>)</td>
          <td><code>/etc/localtime</code></td>
          <td><code>/etc/timezone</code> + <code>/etc/localtime</code></td>
      </tr>
      <tr>
          <td>主机名</td>
          <td><code>/etc/hostname</code></td>
          <td><code>/etc/hostname</code></td>
          <td><code>/etc/hostname</code></td>
          <td><code>/etc/hostname</code></td>
      </tr>
      <tr>
          <td>locale</td>
          <td><code>/etc/default/locale</code></td>
          <td><code>/etc/locale.conf</code></td>
          <td><code>/etc/locale.conf</code></td>
          <td><code>/etc/locale</code></td>
      </tr>
      <tr>
          <td>SSH 配置</td>
          <td><code>/etc/ssh/sshd_config</code></td>
          <td><code>/etc/ssh/sshd_config</code></td>
          <td><code>/etc/ssh/sshd_config</code></td>
          <td><code>/etc/ssh/sshd_config</code></td>
      </tr>
  </tbody>
</table>
<h3 id="126-各发行版特点与适用场景">12.6 各发行版特点与适用场景</h3>
<h4 id="debian-系">Debian 系</h4>
<ul>
<li><strong>Debian Stable</strong>：极致稳定，适合服务器；软件版本偏旧</li>
<li><strong>Ubuntu LTS</strong>：平衡稳定和新特性，最广泛的社区支持，适合学习和生产</li>
<li><strong>Ubuntu 非 LTS</strong>：较新特性，适合桌面用户</li>
<li><strong>Linux Mint</strong>：开箱即用的桌面体验，对新手友好</li>
<li><strong>Kali Linux</strong>：预装大量安全工具，仅适合安全测试</li>
</ul>
<h4 id="rhel-系">RHEL 系</h4>
<ul>
<li><strong>RHEL</strong>：企业级商业支持，适合大型企业生产环境</li>
<li><strong>CentOS Stream</strong>：RHEL 的上游滚动版，预览下一版 RHEL</li>
<li><strong>AlmaLinux / Rocky Linux</strong>：RHEL 的免费兼容克隆（CentOS 替代）</li>
<li><strong>Fedora</strong>：前沿技术，适合开发者和爱好者，每 6 个月发布新版</li>
</ul>
<h4 id="arch-系">Arch 系</h4>
<ul>
<li><strong>Arch Linux</strong>：滚动更新，DIY 精神，适合有经验的用户（需从命令行手动安装）</li>
<li><strong>Manjaro</strong>：开箱即用的 Arch，适合想用 AUR 但不想折腾的用户</li>
<li><strong>AUR（Arch User Repository）</strong>：用户维护的庞大软件库，几乎所有 Linux 软件都能找到</li>
</ul>
<h4 id="其他">其他</h4>
<ul>
<li><strong>Alpine Linux</strong>：超轻量（约 5MB），基于 musl libc 和 BusyBox，Docker 容器首选基础镜像</li>
<li><strong>openSUSE</strong>：YaST 配置工具体验独特，Leap（稳定版）和 Tumbleweed（滚动版）双轨</li>
<li><strong>NixOS</strong>：声明式系统配置，可复现构建，适合 DevOps 和开发环境管理</li>
<li><strong>Gentoo</strong>：源码编译发行版，极致可定制，适合学习和追求极致性能的用户</li>
</ul>
<h3 id="127-相同点汇总">12.7 相同点汇总</h3>
<p>无论使用哪个发行版，以下内容保持一致或高度通用：</p>
<ol>
<li><strong>Linux 内核</strong>：核心相同，只是版本新旧有别</li>
<li><strong>FHS 文件系统结构</strong>：所有发行版遵循同一标准</li>
<li><strong>GNU 工具链</strong>：coreutils、grep、sed、awk、find 等用法完全一致（Alpine 使用 BusyBox，参数略有精简）</li>
<li><strong>POSIX 兼容</strong>：基础 Shell 语法和系统调用接口一致</li>
<li><strong>编程语言</strong>：Python、Perl、Ruby、Node.js 等运行时行为一致</li>
<li><strong>X11/Wayland</strong>：图形协议栈相同</li>
<li><strong>systemd</strong>：除少数发行版（Alpine、Gentoo、Void）外，init 系统统一</li>
<li><strong>SSH 配置</strong>：<code>/etc/ssh/sshd_config</code> 格式和选项完全一致</li>
<li><strong>内核参数</strong>：<code>/proc/sys/</code> 和 <code>/etc/sysctl.conf</code> 相同</li>
<li><strong>日志位置（传统syslog）</strong>：<code>/var/log/</code> 结构基本一致</li>
<li><strong>cron 语法</strong>：所有发行版 crontab 格式相同</li>
<li><strong>LVM/mdadm/文件系统工具</strong>：底层磁盘管理命令完全一致</li>
</ol>
<hr>
<h2 id="第十三章常用快捷键与技巧汇总">第十三章：常用快捷键与技巧汇总</h2>
<h3 id="131-bash-快捷键">13.1 Bash 快捷键</h3>
<table>
  <thead>
      <tr>
          <th>快捷键</th>
          <th>功能</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>Ctrl + A</code></td>
          <td>光标移到行首</td>
      </tr>
      <tr>
          <td><code>Ctrl + E</code></td>
          <td>光标移到行尾</td>
      </tr>
      <tr>
          <td><code>Ctrl + U</code></td>
          <td>删除光标前所有内容</td>
      </tr>
      <tr>
          <td><code>Ctrl + K</code></td>
          <td>删除光标后所有内容</td>
      </tr>
      <tr>
          <td><code>Ctrl + W</code></td>
          <td>删除前一个单词</td>
      </tr>
      <tr>
          <td><code>Ctrl + L</code></td>
          <td>清屏（等同于 clear）</td>
      </tr>
      <tr>
          <td><code>Ctrl + R</code></td>
          <td>搜索命令历史</td>
      </tr>
      <tr>
          <td><code>Ctrl + D</code></td>
          <td>退出 shell / 发送 EOF</td>
      </tr>
      <tr>
          <td><code>Ctrl + C</code></td>
          <td>终止当前命令</td>
      </tr>
      <tr>
          <td><code>Ctrl + Z</code></td>
          <td>暂停当前命令</td>
      </tr>
  </tbody>
</table>
<h3 id="132-vim-基础救急备忘">13.2 Vim 基础（救急备忘）</h3>
<table>
  <thead>
      <tr>
          <th>操作</th>
          <th>命令</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>进入编辑模式</td>
          <td><code>i</code> (光标前) / <code>a</code> (光标后) / <code>o</code> (下一行)</td>
      </tr>
      <tr>
          <td>退出编辑模式</td>
          <td><code>Esc</code></td>
      </tr>
      <tr>
          <td>保存并退出</td>
          <td><code>:wq</code> 或 <code>ZZ</code></td>
      </tr>
      <tr>
          <td>不保存退出</td>
          <td><code>:q!</code></td>
      </tr>
      <tr>
          <td>仅保存</td>
          <td><code>:w</code></td>
      </tr>
      <tr>
          <td>撤销</td>
          <td><code>u</code></td>
      </tr>
      <tr>
          <td>搜索</td>
          <td><code>/keyword</code> → <code>n</code> 下一个</td>
      </tr>
      <tr>
          <td>查找替换</td>
          <td><code>:%s/old/new/g</code></td>
      </tr>
      <tr>
          <td>跳转到行</td>
          <td><code>:行号</code> 如 <code>:50</code></td>
      </tr>
      <tr>
          <td>跳转到末尾</td>
          <td><code>G</code></td>
      </tr>
      <tr>
          <td>跳转到开头</td>
          <td><code>gg</code></td>
      </tr>
      <tr>
          <td>复制一行</td>
          <td><code>yy</code></td>
      </tr>
      <tr>
          <td>粘贴</td>
          <td><code>p</code></td>
      </tr>
      <tr>
          <td>删除一行</td>
          <td><code>dd</code></td>
      </tr>
      <tr>
          <td>删除 10 行</td>
          <td><code>d10d</code></td>
      </tr>
  </tbody>
</table>
<h3 id="133-tmux-基础">13.3 tmux 基础</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">tmux new -s session_name          <span class="c1"># 创建新会话</span>
</span></span><span class="line"><span class="cl">tmux attach -t session_name       <span class="c1"># 重新连接会话</span>
</span></span><span class="line"><span class="cl">tmux ls                           <span class="c1"># 列出所有会话</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 默认前缀键：Ctrl + b</span>
</span></span><span class="line"><span class="cl">Ctrl+b %                          <span class="c1"># 垂直分割窗格</span>
</span></span><span class="line"><span class="cl">Ctrl+b <span class="s2">&#34;                          # 水平分割窗格
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b 方向键                     # 切换窗格
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b x                          # 关闭窗格
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b d                          # 脱离会话（后台运行）
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b c                          # 新建窗口
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b n / p                      # 下一个/上一个窗口
</span></span></span><span class="line"><span class="cl"><span class="s2">Ctrl+b [                          # 进入滚动模式（PgUp/Down 翻页）</span></span></span></code></pre></div>
</div>
<h3 id="134-最佳实践速查">13.4 最佳实践速查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安全习惯</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">rm</span><span class="o">=</span><span class="s1">&#39;rm -i&#39;</span>                           <span class="c1"># 删除前确认</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">cp</span><span class="o">=</span><span class="s1">&#39;cp -i&#39;</span>                           <span class="c1"># 覆盖前确认</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">mv</span><span class="o">=</span><span class="s1">&#39;mv -i&#39;</span>                           <span class="c1"># 覆盖前确认</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 历史记录增强</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">HISTSIZE</span><span class="o">=</span><span class="m">10000</span>                      <span class="c1"># 增加历史条数</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">HISTFILESIZE</span><span class="o">=</span><span class="m">20000</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">HISTTIMEFORMAT</span><span class="o">=</span><span class="s2">&#34;%F %T &#34;</span>            <span class="c1"># 显示时间戳</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">HISTCONTROL</span><span class="o">=</span>ignoredups:erasedups   <span class="c1"># 去重</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 有用的别名</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">ll</span><span class="o">=</span><span class="s1">&#39;ls -alF&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">la</span><span class="o">=</span><span class="s1">&#39;ls -A&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">l</span><span class="o">=</span><span class="s1">&#39;ls -CF&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">grep</span><span class="o">=</span><span class="s1">&#39;grep --color=auto&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">df</span><span class="o">=</span><span class="s1">&#39;df -h&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">du</span><span class="o">=</span><span class="s1">&#39;du -h&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">free</span><span class="o">=</span><span class="s1">&#39;free -h&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> ..<span class="o">=</span><span class="s1">&#39;cd ..&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> ...<span class="o">=</span><span class="s1">&#39;cd ../..&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 偶尔使用的长时间命令备忘</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">untar</span><span class="o">=</span><span class="s1">&#39;tar -xzvf&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">ports</span><span class="o">=</span><span class="s1">&#39;ss -tlnp&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">alias</span> <span class="nv">myip</span><span class="o">=</span><span class="s1">&#39;curl -s ifconfig.me&#39;</span></span></span></code></pre></div>
</div>
<hr>
<p><em>手册版本：v1.0 | 持续更新</em></p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux 运维实战手册</title>
      <link>https://goslion.com/tech/linux/linux-practical-manual/</link>
      <pubDate>Fri, 15 May 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/tech/linux/linux-practical-manual/</guid>
      <description>面向运维工程师的实战参考手册，涵盖监控、日志、备份、自动化、安全加固、高可用、性能调优、故障排查、信创系统等核心运维领域。与 Linux-使用手册.md 互补，侧重运维场景与操作实践。 目录 第一章：运维体系概述 第二章：监控体系建设 第三章：日志管理 第四章：备份与灾难恢复 第五章：自动化运维 第六章：安全加固 第七章：性能调优 第八章：高可用与负载均衡 第九章：网络诊断与排错 第十章：故障排查 …</description><content:encoded><![CDATA[<h1 id="linux-运维实战手册">Linux 运维实战手册</h1>
<blockquote>
<p>面向运维工程师的实战参考手册，涵盖监控、日志、备份、自动化、安全加固、高可用、性能调优、故障排查、信创系统等核心运维领域。与 <code>Linux-使用手册.md</code> 互补，侧重运维场景与操作实践。</p></blockquote>
<hr>
<h2 id="目录">目录</h2>
<ul>
<li><a href="#%E7%AC%AC%E4%B8%80%E7%AB%A0%E8%BF%90%E7%BB%B4%E4%BD%93%E7%B3%BB%E6%A6%82%E8%BF%B0">第一章：运维体系概述</a></li>
<li><a href="#%E7%AC%AC%E4%BA%8C%E7%AB%A0%E7%9B%91%E6%8E%A7%E4%BD%93%E7%B3%BB%E5%BB%BA%E8%AE%BE">第二章：监控体系建设</a></li>
<li><a href="#%E7%AC%AC%E4%B8%89%E7%AB%A0%E6%97%A5%E5%BF%97%E7%AE%A1%E7%90%86">第三章：日志管理</a></li>
<li><a href="#%E7%AC%AC%E5%9B%9B%E7%AB%A0%E5%A4%87%E4%BB%BD%E4%B8%8E%E7%81%BE%E9%9A%BE%E6%81%A2%E5%A4%8D">第四章：备份与灾难恢复</a></li>
<li><a href="#%E7%AC%AC%E4%BA%94%E7%AB%A0%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4">第五章：自动化运维</a></li>
<li><a href="#%E7%AC%AC%E5%85%AD%E7%AB%A0%E5%AE%89%E5%85%A8%E5%8A%A0%E5%9B%BA">第六章：安全加固</a></li>
<li><a href="#%E7%AC%AC%E4%B8%83%E7%AB%A0%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98">第七章：性能调优</a></li>
<li><a href="#%E7%AC%AC%E5%85%AB%E7%AB%A0%E9%AB%98%E5%8F%AF%E7%94%A8%E4%B8%8E%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1">第八章：高可用与负载均衡</a></li>
<li><a href="#%E7%AC%AC%E4%B9%9D%E7%AB%A0%E7%BD%91%E7%BB%9C%E8%AF%8A%E6%96%AD%E4%B8%8E%E6%8E%92%E9%94%99">第九章：网络诊断与排错</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E7%AB%A0%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5%E5%AE%9E%E6%88%98">第十章：故障排查实战</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0%E5%AE%B9%E5%99%A8%E5%8C%96%E8%BF%90%E7%BB%B4">第十一章：容器化运维</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0%E4%BF%A1%E5%88%9B%E7%B3%BB%E7%BB%9F%E8%BF%90%E7%BB%B4">第十二章：信创系统运维</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0%E5%BA%94%E6%80%A5%E5%93%8D%E5%BA%94">第十三章：应急响应</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E5%9B%9B%E7%AB%A0%E8%BF%90%E7%BB%B4%E8%84%9A%E6%9C%AC%E5%B7%A5%E5%85%B7%E9%9B%86">第十四章：运维脚本工具集</a></li>
<li><a href="#%E7%AC%AC%E5%8D%81%E4%BA%94%E7%AB%A0%E8%BF%90%E7%BB%B4%E6%9C%80%E4%BD%B3%E5%AE%9E%E8%B7%B5">第十五章：运维最佳实践</a></li>
</ul>
<hr>
<h2 id="第一章运维体系概述">第一章：运维体系概述</h2>
<h3 id="11-运维核心职责">1.1 运维核心职责</h3>
<table>
  <thead>
      <tr>
          <th>领域</th>
          <th>职责</th>
          <th>关键指标</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>监控</strong></td>
          <td>7×24 系统状态感知</td>
          <td>MTTR, MTTD</td>
      </tr>
      <tr>
          <td><strong>变更管理</strong></td>
          <td>可控的系统变更流程</td>
          <td>变更成功率</td>
      </tr>
      <tr>
          <td><strong>容量规划</strong></td>
          <td>资源趋势分析与扩容</td>
          <td>资源利用率</td>
      </tr>
      <tr>
          <td><strong>故障处理</strong></td>
          <td>快速定位与恢复</td>
          <td>SLA, RTO, RPO</td>
      </tr>
      <tr>
          <td><strong>安全合规</strong></td>
          <td>系统加固与审计</td>
          <td>漏洞修复时效</td>
      </tr>
      <tr>
          <td><strong>自动化</strong></td>
          <td>减少人工操作</td>
          <td>自动化覆盖率</td>
      </tr>
  </tbody>
</table>
<h3 id="12-运维-sla-指标">1.2 运维 SLA 指标</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>可用性 = (总时间 - 故障时间) / 总时间 × 100%

99%     = 87.6 小时/年   (两个9)
99.9%   = 8.76 小时/年   (三个9)
99.99%  = 52.56 分钟/年  (四个9)
99.999% = 5.26 分钟/年   (五个9)</code></pre>
</div>
<p><strong>RTO (Recovery Time Objective)</strong>: 业务恢复时间目标
<strong>RPO (Recovery Point Objective)</strong>: 数据丢失时间目标</p>
<h3 id="13-运维工具链全景">1.3 运维工具链全景</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>┌─────────────────────────────────────────────────────────────────┐
│                        运维工具矩阵                              │
├──────────────┬──────────────────┬───────────────────────────────┤
│ 监控告警     │ Prometheus       │ Grafana, Zabbix, Nagios       │
│ 日志管理     │ ELK, Loki        │ Splunk, Graylog               │
│ 自动化       │ Ansible          │ SaltStack, Puppet, Chef       │
│ CI/CD        │ Jenkins, GitLab  │ ArgoCD, Tekton                │
│ 配置管理     │ Ansible, Terraform│ Pulumi                       │
│ 容器编排     │ K8s, K3s         │ Nomad, Docker Swarm           │
│ 备份恢复     │ restic, Borg     │ Bacula, Veeam                 │
│ 安全扫描     │ Trivy, ClamAV    │ OpenSCAP, Lynis               │
│ 网络诊断     │ tcpdump, nmap    │ Wireshark, mtr                │
│ 压力测试     │ wrk, ab, sysbench│ JMeter, Locust                │
│ 信创/国产    │ 麒麟, 统信UOS    │ 欧拉, Anolis OS               │
└──────────────┴──────────────────┴───────────────────────────────┘</code></pre>
</div>
<hr>
<h2 id="第二章监控体系建设">第二章：监控体系建设</h2>
<h3 id="21-prometheus-监控栈">2.1 Prometheus 监控栈</h3>
<h4 id="211-架构概览">2.1.1 架构概览</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>┌──────────┐   ┌──────────┐   ┌──────────┐
│ node_ex  │   │ mysql_ex │   │ nginx_ex │  ← Exporters
│ porter   │   │ porter   │   │ porter   │
└────┬─────┘   └────┬─────┘   └────┬─────┘
     │              │              │
     ▼              ▼              ▼
┌─────────────────────────────────────────┐
│          Prometheus Server              │
│  (Pull metrics / 存储时序数据 / 告警判定) │
└──────────┬────────────────────┬─────────┘
           │                    │
           ▼                    ▼
   ┌──────────────┐    ┌──────────────┐
   │  Grafana     │    │ AlertManager │
   │  (可视化)    │    │  (告警管理)   │
   └──────────────┘    └──────┬───────┘
                              │
                              ▼
                      ┌──────────────┐
                      │ Webhook/邮件  │
                      │ 微信/钉钉/飞书│
                      └──────────────┘</code></pre>
</div>
<h4 id="212-prometheus-安装配置">2.1.2 Prometheus 安装配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 下载安装 ===</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt
</span></span><span class="line"><span class="cl">wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz
</span></span><span class="line"><span class="cl">tar xzf prometheus-2.52.0.linux-amd64.tar.gz
</span></span><span class="line"><span class="cl">ln -s prometheus-2.52.0.linux-amd64 prometheus
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 创建 systemd 服务 ===</span>
</span></span><span class="line"><span class="cl">cat &gt; /etc/systemd/system/prometheus.service <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">[Unit]
</span></span></span><span class="line"><span class="cl"><span class="s">Description=Prometheus
</span></span></span><span class="line"><span class="cl"><span class="s">After=network.target
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">[Service]
</span></span></span><span class="line"><span class="cl"><span class="s">User=prometheus
</span></span></span><span class="line"><span class="cl"><span class="s">Group=prometheus
</span></span></span><span class="line"><span class="cl"><span class="s">Type=simple
</span></span></span><span class="line"><span class="cl"><span class="s">ExecStart=/opt/prometheus/prometheus \
</span></span></span><span class="line"><span class="cl"><span class="s">  --config.file=/opt/prometheus/prometheus.yml \
</span></span></span><span class="line"><span class="cl"><span class="s">  --storage.tsdb.path=/data/prometheus \
</span></span></span><span class="line"><span class="cl"><span class="s">  --storage.tsdb.retention.time=30d \
</span></span></span><span class="line"><span class="cl"><span class="s">  --web.enable-lifecycle \
</span></span></span><span class="line"><span class="cl"><span class="s">  --web.external-url=http://prometheus.example.com
</span></span></span><span class="line"><span class="cl"><span class="s">ExecReload=/bin/kill -HUP $MAINPID
</span></span></span><span class="line"><span class="cl"><span class="s">Restart=on-failure
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">[Install]
</span></span></span><span class="line"><span class="cl"><span class="s">WantedBy=multi-user.target
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">useradd -r -s /sbin/nologin prometheus
</span></span><span class="line"><span class="cl">mkdir -p /data/prometheus
</span></span><span class="line"><span class="cl">chown -R prometheus:prometheus /opt/prometheus /data/prometheus
</span></span><span class="line"><span class="cl">systemctl daemon-reload <span class="o">&amp;&amp;</span> systemctl <span class="nb">enable</span> --now prometheus</span></span></code></pre></div>
</div>
<h4 id="213-prometheusyml-核心配置">2.1.3 prometheus.yml 核心配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">global</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">evaluation_interval</span><span class="p">:</span><span class="w"> </span><span class="l">15s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">external_labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">datacenter</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;bj-idc-01&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;production&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 告警规则文件</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">rule_files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="s1">&#39;rules/*.yml&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 告警管理器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">alerting</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">alertmanagers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;localhost:9093&#39;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 采集目标</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">scrape_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Prometheus 自身</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;prometheus&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;localhost:9090&#39;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Node Exporter (系统指标)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;node&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">scrape_interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;192.168.1.11:9100&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;192.168.1.12:9100&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;192.168.1.13:9100&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;production&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># 基于文件的动态发现</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">file_sd_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span>- <span class="s1">&#39;/opt/prometheus/targets/node/*.json&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">refresh_interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># MySQL Exporter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;mysql&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;192.168.1.21:9104&#39;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">instance</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;mysql-master&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Redis Exporter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;redis&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;192.168.1.31:9121&#39;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># Nginx Exporter (需 nginx-module-vts)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;nginx&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;192.168.1.41:9113&#39;</span><span class="p">]</span></span></span></code></pre></div>
</div>
<h4 id="214-node_exporter-部署">2.1.4 node_exporter 部署</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装 node_exporter</span>
</span></span><span class="line"><span class="cl">wget https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz
</span></span><span class="line"><span class="cl">tar xzf node_exporter-1.8.0.linux-amd64.tar.gz
</span></span><span class="line"><span class="cl">mv node_exporter-1.8.0.linux-amd64/node_exporter /usr/local/bin/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">cat &gt; /etc/systemd/system/node_exporter.service <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">[Unit]
</span></span></span><span class="line"><span class="cl"><span class="s">Description=Node Exporter
</span></span></span><span class="line"><span class="cl"><span class="s">After=network.target
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">[Service]
</span></span></span><span class="line"><span class="cl"><span class="s">User=prometheus
</span></span></span><span class="line"><span class="cl"><span class="s">ExecStart=/usr/local/bin/node_exporter \
</span></span></span><span class="line"><span class="cl"><span class="s">  --collector.systemd \
</span></span></span><span class="line"><span class="cl"><span class="s">  --collector.processes \
</span></span></span><span class="line"><span class="cl"><span class="s">  --collector.tcpstat \
</span></span></span><span class="line"><span class="cl"><span class="s">  --collector.filesystem.mount-points-exclude=&#39;^/(dev|proc|sys|run|var/lib/docker/.+|var/lib/kubelet/.+)&#39; \
</span></span></span><span class="line"><span class="cl"><span class="s">  --web.listen-address=:9100
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">[Install]
</span></span></span><span class="line"><span class="cl"><span class="s">WantedBy=multi-user.target
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl daemon-reload <span class="o">&amp;&amp;</span> systemctl <span class="nb">enable</span> --now node_exporter</span></span></code></pre></div>
</div>
<h4 id="215-常用-exporters-速查">2.1.5 常用 Exporters 速查</h4>
<table>
  <thead>
      <tr>
          <th>Exporter</th>
          <th>端口</th>
          <th>用途</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>node_exporter</td>
          <td>9100</td>
          <td>系统 CPU/内存/磁盘/网络</td>
      </tr>
      <tr>
          <td>mysqld_exporter</td>
          <td>9104</td>
          <td>MySQL/MariaDB</td>
      </tr>
      <tr>
          <td>redis_exporter</td>
          <td>9121</td>
          <td>Redis</td>
      </tr>
      <tr>
          <td>postgres_exporter</td>
          <td>9187</td>
          <td>PostgreSQL</td>
      </tr>
      <tr>
          <td>nginx-prometheus-exporter</td>
          <td>9113</td>
          <td>Nginx</td>
      </tr>
      <tr>
          <td>blackbox_exporter</td>
          <td>9115</td>
          <td>HTTP/TCP/ICMP 探测</td>
      </tr>
      <tr>
          <td>process-exporter</td>
          <td>9256</td>
          <td>进程监控</td>
      </tr>
      <tr>
          <td>kafka_exporter</td>
          <td>9308</td>
          <td>Kafka</td>
      </tr>
      <tr>
          <td>elasticsearch_exporter</td>
          <td>9114</td>
          <td>Elasticsearch</td>
      </tr>
  </tbody>
</table>
<h4 id="216-grafana-部署与配置">2.1.6 Grafana 部署与配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Ubuntu/Debian</span>
</span></span><span class="line"><span class="cl">apt-get install -y software-properties-common
</span></span><span class="line"><span class="cl">add-apt-repository <span class="s2">&#34;deb https://packages.grafana.com/oss/deb stable main&#34;</span>
</span></span><span class="line"><span class="cl">wget -q -O - https://packages.grafana.com/gpg.key <span class="p">|</span> apt-key add -
</span></span><span class="line"><span class="cl">apt-get update <span class="o">&amp;&amp;</span> apt-get install -y grafana
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CentOS/RHEL 7/8</span>
</span></span><span class="line"><span class="cl">cat &gt; /etc/yum.repos.d/grafana.repo <span class="s">&lt;&lt; &#39;EOF&#39;
</span></span></span><span class="line"><span class="cl"><span class="s">[grafana]
</span></span></span><span class="line"><span class="cl"><span class="s">name=grafana
</span></span></span><span class="line"><span class="cl"><span class="s">baseurl=https://packages.grafana.com/oss/rpm
</span></span></span><span class="line"><span class="cl"><span class="s">repo_gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">enabled=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgcheck=1
</span></span></span><span class="line"><span class="cl"><span class="s">gpgkey=https://packages.grafana.com/gpg.key
</span></span></span><span class="line"><span class="cl"><span class="s">sslverify=1
</span></span></span><span class="line"><span class="cl"><span class="s">sslcacert=/etc/pki/tls/certs/ca-bundle.crt
</span></span></span><span class="line"><span class="cl"><span class="s">EOF</span>
</span></span><span class="line"><span class="cl">yum install -y grafana
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now grafana-server
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重置管理员密码</span>
</span></span><span class="line"><span class="cl">grafana-cli admin reset-admin-password newpassword
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安装常用插件</span>
</span></span><span class="line"><span class="cl">grafana-cli plugins install grafana-piechart-panel
</span></span><span class="line"><span class="cl">grafana-cli plugins install grafana-clock-panel
</span></span><span class="line"><span class="cl">grafana-cli plugins install vonage-status-panel
</span></span><span class="line"><span class="cl">systemctl restart grafana-server</span></span></code></pre></div>
</div>
<h4 id="217-重要-grafana-dashboard-id">2.1.7 重要 Grafana Dashboard ID</h4>
<table>
  <thead>
      <tr>
          <th>Dashboard ID</th>
          <th>名称</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>1860</td>
          <td>Node Exporter Full</td>
          <td>服务器全量指标</td>
      </tr>
      <tr>
          <td>16098</td>
          <td>Node Exporter / nodes</td>
          <td>新版服务器监控</td>
      </tr>
      <tr>
          <td>7362</td>
          <td>MySQL Overview</td>
          <td>MySQL 监控</td>
      </tr>
      <tr>
          <td>763</td>
          <td>Redis Dashboard</td>
          <td>Redis 监控</td>
      </tr>
      <tr>
          <td>9628</td>
          <td>PostgreSQL Database</td>
          <td>PostgreSQL</td>
      </tr>
      <tr>
          <td>12708</td>
          <td>Nginx Overview</td>
          <td>Nginx 监控</td>
      </tr>
      <tr>
          <td>11159</td>
          <td>Docker Host &amp; Container</td>
          <td>Docker 监控</td>
      </tr>
  </tbody>
</table>
<h4 id="218-告警规则示例">2.1.8 告警规则示例</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># /opt/prometheus/rules/node_alerts.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">groups</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">node_alerts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">interval</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 主机宕机</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">NodeDown</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">up == 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">2m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;主机 {{ $labels.instance }} 宕机&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;主机 {{ $labels.instance }} 已超过 2 分钟不可达&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># CPU 使用率过高</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighCPUUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> </span>- <span class="l">(avg by(instance)(rate(node_cpu_seconds_total{mode=&#34;idle&#34;}[5m])) * 100) &gt; 90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">10m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;CPU 使用率 &gt; 90%: {{ $labels.instance }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;当前值: {{ $value | humanize }}%&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 内存使用率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighMemoryUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 &gt; 90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;内存使用率 &gt; 90%: {{ $labels.instance }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 磁盘使用率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighDiskUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">(1 - node_filesystem_avail_bytes{mountpoint=&#34;/&#34;} / node_filesystem_size_bytes{mountpoint=&#34;/&#34;}) * 100 &gt; 85</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;磁盘使用率 &gt; 85%: {{ $labels.instance }} /&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 磁盘预计填满</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">DiskWillFillIn4Hours</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">predict_linear(node_filesystem_avail_bytes{mountpoint=&#34;/&#34;}[1h], 4*3600) &lt; 0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">10m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;磁盘预计 4 小时内填满: {{ $labels.instance }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 系统负载过高</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighSystemLoad</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">node_load15 / count without(cpu, mode)(node_cpu_seconds_total{mode=&#34;idle&#34;}) &gt; 1.5</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">10m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;负载过高 load15/cores &gt; 1.5: {{ $labels.instance }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 磁盘 IO 饱和</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">DiskIOSaturation</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">rate(node_disk_io_time_seconds_total{device=~&#34;sd[a-z]+&#34;}[5m]) &gt; 0.9</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">10m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;磁盘 IO 饱和: {{ $labels.instance }} {{ $labels.device }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 网络错误</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">NetworkErrors</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">rate(node_network_receive_errors_total[5m]) &gt; 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;网络接口错误: {{ $labels.instance }} {{ $labels.device }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 内存即将耗尽</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">OutOfMemorySoon</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes &lt; 0.05</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">2m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;内存即将耗尽 (&lt; 5%): {{ $labels.instance }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># inode 使用率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">alert</span><span class="p">:</span><span class="w"> </span><span class="l">HighInodeUsage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">expr</span><span class="p">:</span><span class="w"> </span><span class="l">(1 - node_filesystem_files_free{mountpoint=&#34;/&#34;} / node_filesystem_files{mountpoint=&#34;/&#34;}) * 100 &gt; 85</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">for</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;inode 使用率 &gt; 85%: {{ $labels.instance }}&#34;</span></span></span></code></pre></div>
</div>
<h4 id="219-alertmanager-配置">2.1.9 AlertManager 配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># /opt/alertmanager/alertmanager.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">global</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resolve_timeout</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="c"># 邮件配置</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">smtp_smarthost</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;smtp.example.com:587&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">smtp_from</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;alert@example.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">smtp_auth_username</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;alert@example.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">smtp_auth_password</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;password&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">smtp_require_tls</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 告警路由</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">route</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group_by</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;alertname&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;severity&#39;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group_wait</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">group_interval</span><span class="p">:</span><span class="w"> </span><span class="l">5m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">repeat_interval</span><span class="p">:</span><span class="w"> </span><span class="l">4h</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;default&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">routes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">critical</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;critical&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">continue</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="l">warning</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">receiver</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;warning&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 接收器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">receivers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;default&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">email_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;ops@example.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;critical&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">email_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;oncall@example.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">webhook_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="c"># 钉钉</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;https://oapi.dingtalk.com/robot/send?access_token=xxx&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">send_resolved</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c"># 企业微信</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">wechat_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">corp_id</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;wwxxx&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">to_party</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">agent_id</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1000001&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">api_secret</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;xxx&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">send_resolved</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;warning&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">email_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">to</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;ops@example.com&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 抑制规则 (避免告警风暴)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">inhibit_rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">source_match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;critical&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">target_match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">severity</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;warning&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">equal</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s1">&#39;instance&#39;</span><span class="p">]</span></span></span></code></pre></div>
</div>
<h3 id="22-promql-常用查询">2.2 PromQL 常用查询</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">promql</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># === CPU ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># CPU 使用率 (%)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="mi">100</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="o">(</span><span class="k">avg</span><span class="w"> </span><span class="k">by</span><span class="o">(</span><span class="nv">instance</span><span class="o">)(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_cpu_seconds_total</span><span class="p">{</span><span class="nl">mode</span><span class="o">=</span><span class="p">&#34;</span><span class="s">idle</span><span class="p">&#34;}[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 各 CPU 模式占比</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">avg</span><span class="w"> </span><span class="k">by</span><span class="o">(</span><span class="nv">cpu</span><span class="p">,</span><span class="nv">mode</span><span class="o">)(</span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_cpu_seconds_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">))</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># === 内存 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 可用内存百分比</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">(</span><span class="nv">node_memory_MemAvailable_bytes</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">node_memory_MemTotal_bytes</span><span class="o">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 内存使用率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">node_memory_MemAvailable_bytes</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">node_memory_MemTotal_bytes</span><span class="o">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># === 磁盘 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 磁盘使用率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="o">(</span><span class="mi">1</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">node_filesystem_avail_bytes</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nv">node_filesystem_size_bytes</span><span class="o">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 磁盘读写速率 MB/s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_disk_read_bytes_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1024</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1024</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_disk_written_bytes_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1024</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="mi">1024</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 磁盘 IOPS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_disk_reads_completed_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_disk_writes_completed_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># disk_io_time (IO 繁忙度)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_disk_io_time_seconds_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># === 网络 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 网络流量 bytes/sec</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_network_receive_bytes_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_network_transmit_bytes_total</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 网络连接状态</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">node_netstat_Tcp_CurrEstab</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># TCP 重传率</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_netstat_Tcp_RetransSegs</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="kr">rate</span><span class="o">(</span><span class="nv">node_netstat_Tcp_OutSegs</span><span class="p">[</span><span class="s">5m</span><span class="p">]</span><span class="o">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># === 进程 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 打开文件描述符数量</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">process_open_fds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># === 系统 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 运行时间 (秒)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nv">node_boot_time_seconds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1"># 预测磁盘空间</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">predict_linear</span><span class="o">(</span><span class="nv">node_filesystem_avail_bytes</span><span class="p">[</span><span class="s">1h</span><span class="p">],</span><span class="w"> </span><span class="mi">24</span><span class="o">*</span><span class="mi">3600</span><span class="o">)</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="mi">0</span></span></span></code></pre></div>
</div>
<h3 id="23-grafana-告警-内置">2.3 Grafana 告警 (内置)</h3>
<p>当不需要 AlertManager 时，Grafana 内置告警可直接使用：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># grafana.ini 配置</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">[</span><span class="l">smtp]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">enabled = true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">host = smtp.example.com:587</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">user = alert@example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">password = password</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">from_address = alert@example.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">[</span><span class="l">alerting]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">enabled = true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="l">execute_alerts = true</span></span></span></code></pre></div>
</div>
<p>告警通知渠道支持：Email, Slack, PagerDuty, Webhook, 钉钉(通过插件), 企业微信(通过插件)。</p>
<h3 id="24-轻量监控方案">2.4 轻量监控方案</h3>
<h4 id="241-netdata-单机实时监控">2.4.1 Netdata (单机实时监控)</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 一键安装</span>
</span></span><span class="line"><span class="cl">bash &lt;<span class="o">(</span>curl -Ss https://my-netdata.io/kickstart.sh<span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 仅本机访问</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/bind to = \*/bind to = 127.0.0.1/g&#39;</span> /etc/netdata/netdata.conf
</span></span><span class="line"><span class="cl">systemctl restart netdata
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 访问 http://localhost:19999</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 特点: 零配置、极低资源占用、1秒粒度、数千指标自动采集</span></span></span></code></pre></div>
</div>
<h4 id="242-自定义脚本监控-最简方案">2.4.2 自定义脚本监控 (最简方案)</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># /opt/scripts/monitor.sh</span>
</span></span><span class="line"><span class="cl"><span class="c1"># crontab: */5 * * * * /opt/scripts/monitor.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">HOSTNAME</span><span class="o">=</span><span class="k">$(</span>hostname<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">ALERT_WEBHOOK</span><span class="o">=</span><span class="s2">&#34;https://hooks.slack.com/services/xxx&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># CPU</span>
</span></span><span class="line"><span class="cl"><span class="nv">CPU_USAGE</span><span class="o">=</span><span class="k">$(</span>top -bn1 <span class="p">|</span> grep <span class="s2">&#34;Cpu(s)&#34;</span> <span class="p">|</span> awk <span class="s1">&#39;{print $2}&#39;</span> <span class="p">|</span> cut -d<span class="s1">&#39;%&#39;</span> -f1<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">((</span> <span class="k">$(</span><span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$CPU_USAGE</span><span class="s2"> &gt; 90&#34;</span> <span class="p">|</span> bc -l<span class="k">)</span> <span class="o">))</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;[</span><span class="si">${</span><span class="nv">HOSTNAME</span><span class="si">}</span><span class="s2">] CPU 使用率: </span><span class="si">${</span><span class="nv">CPU_USAGE</span><span class="si">}</span><span class="s2">%\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="nv">$ALERT_WEBHOOK</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 内存</span>
</span></span><span class="line"><span class="cl"><span class="nv">MEM_AVAIL</span><span class="o">=</span><span class="k">$(</span>free -m <span class="p">|</span> awk <span class="s1">&#39;NR==2{print $7}&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$MEM_AVAIL</span><span class="s2">&#34;</span> -lt <span class="m">512</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;[</span><span class="si">${</span><span class="nv">HOSTNAME</span><span class="si">}</span><span class="s2">] 可用内存不足: </span><span class="si">${</span><span class="nv">MEM_AVAIL</span><span class="si">}</span><span class="s2">MB\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="nv">$ALERT_WEBHOOK</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 磁盘</span>
</span></span><span class="line"><span class="cl"><span class="nv">DISK_USAGE</span><span class="o">=</span><span class="k">$(</span>df / <span class="p">|</span> awk <span class="s1">&#39;NR==2{print $5}&#39;</span> <span class="p">|</span> sed <span class="s1">&#39;s/%//&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$DISK_USAGE</span><span class="s2">&#34;</span> -gt <span class="m">85</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;[</span><span class="si">${</span><span class="nv">HOSTNAME</span><span class="si">}</span><span class="s2">] 磁盘使用率: </span><span class="si">${</span><span class="nv">DISK_USAGE</span><span class="si">}</span><span class="s2">%\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="nv">$ALERT_WEBHOOK</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 关键进程检查</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> proc in nginx mysqld sshd<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> ! pgrep -x <span class="s2">&#34;</span><span class="nv">$proc</span><span class="s2">&#34;</span> &gt; /dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>            --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;[</span><span class="si">${</span><span class="nv">HOSTNAME</span><span class="si">}</span><span class="s2">] 进程 </span><span class="nv">$proc</span><span class="s2"> 未运行!\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>            <span class="nv">$ALERT_WEBHOOK</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第三章日志管理">第三章：日志管理</h2>
<h3 id="31-rsyslog-配置">3.1 rsyslog 配置</h3>
<h4 id="311-基础架构">3.1.1 基础架构</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>应用程序 → syslog() → rsyslog → /var/log/messages
                              → /var/log/secure
                              → 远程 syslog 服务器
                              → 管道/程序</code></pre>
</div>
<h4 id="312-rsyslogconf-配置">3.1.2 rsyslog.conf 配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/rsyslog.conf</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 模块加载 ===</span>
</span></span><span class="line"><span class="cl">module<span class="o">(</span><span class="nv">load</span><span class="o">=</span><span class="s2">&#34;imuxsock&#34;</span><span class="o">)</span>     <span class="c1"># 本地 socket</span>
</span></span><span class="line"><span class="cl">module<span class="o">(</span><span class="nv">load</span><span class="o">=</span><span class="s2">&#34;imklog&#34;</span><span class="o">)</span>       <span class="c1"># 内核日志</span>
</span></span><span class="line"><span class="cl">module<span class="o">(</span><span class="nv">load</span><span class="o">=</span><span class="s2">&#34;imtcp&#34;</span><span class="o">)</span>        <span class="c1"># TCP 接收</span>
</span></span><span class="line"><span class="cl">module<span class="o">(</span><span class="nv">load</span><span class="o">=</span><span class="s2">&#34;imudp&#34;</span><span class="o">)</span>        <span class="c1"># UDP 接收</span>
</span></span><span class="line"><span class="cl">module<span class="o">(</span><span class="nv">load</span><span class="o">=</span><span class="s2">&#34;impstats&#34;</span>
</span></span><span class="line"><span class="cl">       <span class="nv">interval</span><span class="o">=</span><span class="s2">&#34;300&#34;</span>
</span></span><span class="line"><span class="cl">       <span class="nv">severity</span><span class="o">=</span><span class="s2">&#34;7&#34;</span>
</span></span><span class="line"><span class="cl">       log.file<span class="o">=</span><span class="s2">&#34;/var/log/rsyslog-stats.log&#34;</span>
</span></span><span class="line"><span class="cl">       <span class="nv">Ruleset</span><span class="o">=</span><span class="s2">&#34;stats&#34;</span><span class="o">)</span>      <span class="c1"># 性能统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 全局配置 ===</span>
</span></span><span class="line"><span class="cl">global<span class="o">(</span>
</span></span><span class="line"><span class="cl">    <span class="nv">workDirectory</span><span class="o">=</span><span class="s2">&#34;/var/lib/rsyslog&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">maxMessageSize</span><span class="o">=</span><span class="s2">&#34;64k&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">defaultTemplate</span><span class="o">=</span><span class="s2">&#34;RSYSLOG_TraditionalFileFormat&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">privDropToUser</span><span class="o">=</span><span class="s2">&#34;syslog&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">privDropToGroup</span><span class="o">=</span><span class="s2">&#34;syslog&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 日志格式模板 ===</span>
</span></span><span class="line"><span class="cl">template<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;RemoteLogs&#34;</span> <span class="nv">type</span><span class="o">=</span><span class="s2">&#34;string&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">string</span><span class="o">=</span><span class="s2">&#34;%TIMESTAMP% %HOSTNAME% %syslogtag% %msg%\n&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">template<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;JsonFormat&#34;</span> <span class="nv">type</span><span class="o">=</span><span class="s2">&#34;list&#34;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;{&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;timestamp\&#34;:\&#34;&#34;</span><span class="o">)</span>      property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;timereported&#34;</span> <span class="nv">dateFormat</span><span class="o">=</span><span class="s2">&#34;rfc3339&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;,\&#34;host\&#34;:\&#34;&#34;</span><span class="o">)</span>        property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;hostname&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;,\&#34;severity\&#34;:\&#34;&#34;</span><span class="o">)</span>    property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;syslogseverity&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;,\&#34;facility\&#34;:\&#34;&#34;</span><span class="o">)</span>    property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;syslogfacility&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;,\&#34;tag\&#34;:\&#34;&#34;</span><span class="o">)</span>         property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;syslogtag&#34;</span> <span class="nv">format</span><span class="o">=</span><span class="s2">&#34;json&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;,\&#34;message\&#34;:\&#34;&#34;</span><span class="o">)</span>     property<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;msg&#34;</span> <span class="nv">format</span><span class="o">=</span><span class="s2">&#34;json&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    constant<span class="o">(</span><span class="nv">value</span><span class="o">=</span><span class="s2">&#34;\&#34;}\n&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 日志规则 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 认证日志</span>
</span></span><span class="line"><span class="cl">auth,authpriv.*                     /var/log/secure
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 系统日志</span>
</span></span><span class="line"><span class="cl">*.info<span class="p">;</span>mail.none<span class="p">;</span>authpriv.none     /var/log/messages
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Cron 日志</span>
</span></span><span class="line"><span class="cl">cron.*                             /var/log/cron
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 内核日志</span>
</span></span><span class="line"><span class="cl">kern.*                             /var/log/kern.log
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 邮件日志</span>
</span></span><span class="line"><span class="cl">mail.*                             /var/log/maillog
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Debug 日志 (丢弃)</span>
</span></span><span class="line"><span class="cl">*.debug                            stop
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 紧急日志发送给所有登录用户</span>
</span></span><span class="line"><span class="cl">*.emerg                            :omusrmsg:*
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 转发到远程 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># TCP 转发</span>
</span></span><span class="line"><span class="cl">*.* @@192.168.1.100:514
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># UDP 转发</span>
</span></span><span class="line"><span class="cl"><span class="c1"># *.* @192.168.1.100:514</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 条件转发 (仅错误级别以上)</span>
</span></span><span class="line"><span class="cl">*.err @@192.168.1.100:514
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 作为日志服务器接收 ===</span>
</span></span><span class="line"><span class="cl">input<span class="o">(</span><span class="nv">type</span><span class="o">=</span><span class="s2">&#34;imtcp&#34;</span> <span class="nv">port</span><span class="o">=</span><span class="s2">&#34;514&#34;</span> <span class="nv">Ruleset</span><span class="o">=</span><span class="s2">&#34;remote&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">input<span class="o">(</span><span class="nv">type</span><span class="o">=</span><span class="s2">&#34;imudp&#34;</span> <span class="nv">port</span><span class="o">=</span><span class="s2">&#34;514&#34;</span> <span class="nv">Ruleset</span><span class="o">=</span><span class="s2">&#34;remote&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ruleset<span class="o">(</span><span class="nv">name</span><span class="o">=</span><span class="s2">&#34;remote&#34;</span><span class="o">)</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 按主机名分文件</span>
</span></span><span class="line"><span class="cl">    <span class="nv">$template</span> RemotePath,<span class="s2">&#34;/data/logs/%HOSTNAME%/%</span><span class="nv">$YEAR</span><span class="s2">%-%</span><span class="nv">$MONTH</span><span class="s2">%-%</span><span class="nv">$DAY</span><span class="s2">%.log&#34;</span>
</span></span><span class="line"><span class="cl">    action<span class="o">(</span><span class="nv">type</span><span class="o">=</span><span class="s2">&#34;omfile&#34;</span> <span class="nv">dynaFile</span><span class="o">=</span><span class="s2">&#34;RemotePath&#34;</span><span class="o">)</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># 也可输出为 JSON</span>
</span></span><span class="line"><span class="cl">    <span class="c1"># action(type=&#34;omfile&#34; dynaFile=&#34;RemotePath&#34; template=&#34;JsonFormat&#34;)</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span></span></span></code></pre></div>
</div>
<h4 id="313-应用日志配置示例">3.1.3 应用日志配置示例</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Nginx rsyslog 配置</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/rsyslog.d/nginx.conf</span>
</span></span><span class="line"><span class="cl"><span class="nv">$ModLoad</span> imfile
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileName</span> /var/log/nginx/access.log
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileTag</span> nginx-access:
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileStateFile</span> stat-nginx-access
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileSeverity</span> info
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileFacility</span> local7
</span></span><span class="line"><span class="cl"><span class="nv">$InputRunFileMonitor</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileName</span> /var/log/nginx/error.log
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileTag</span> nginx-error:
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileStateFile</span> stat-nginx-error
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileSeverity</span> error
</span></span><span class="line"><span class="cl"><span class="nv">$InputFileFacility</span> local7
</span></span><span class="line"><span class="cl"><span class="nv">$InputRunFileMonitor</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">local7.* @@192.168.1.100:514</span></span></code></pre></div>
</div>
<h3 id="32-journald-systemd-日志">3.2 journald (systemd 日志)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 查看日志 ===</span>
</span></span><span class="line"><span class="cl">journalctl                           <span class="c1"># 所有日志</span>
</span></span><span class="line"><span class="cl">journalctl -n <span class="m">100</span>                    <span class="c1"># 最近 100 行</span>
</span></span><span class="line"><span class="cl">journalctl -f                        <span class="c1"># tail -f 模式</span>
</span></span><span class="line"><span class="cl">journalctl -k                        <span class="c1"># 内核日志</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx                  <span class="c1"># 指定服务</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx --since today    <span class="c1"># 今天的日志</span>
</span></span><span class="line"><span class="cl">journalctl -u nginx --since <span class="s2">&#34;2024-01-01&#34;</span> --until <span class="s2">&#34;2024-01-02&#34;</span>
</span></span><span class="line"><span class="cl">journalctl -p err                     <span class="c1"># 仅错误级别以上</span>
</span></span><span class="line"><span class="cl">journalctl -p emerg..err              <span class="c1"># emerg 到 err</span>
</span></span><span class="line"><span class="cl">journalctl <span class="nv">_PID</span><span class="o">=</span><span class="m">1234</span>                  <span class="c1"># 按 PID</span>
</span></span><span class="line"><span class="cl">journalctl <span class="nv">_UID</span><span class="o">=</span><span class="m">0</span>                     <span class="c1"># 按 UID (root)</span>
</span></span><span class="line"><span class="cl">journalctl -o json-pretty             <span class="c1"># JSON 输出</span>
</span></span><span class="line"><span class="cl">journalctl --disk-usage               <span class="c1"># 日志占用空间</span>
</span></span><span class="line"><span class="cl">journalctl -u sshd <span class="p">|</span> grep <span class="s2">&#34;Failed&#34;</span>   <span class="c1"># 配合 grep</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === journald 配置 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/systemd/journald.conf</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>Journal<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">Storage</span><span class="o">=</span>persistent        <span class="c1"># 持久化到磁盘</span>
</span></span><span class="line"><span class="cl"><span class="nv">Compress</span><span class="o">=</span>yes             <span class="c1"># 压缩</span>
</span></span><span class="line"><span class="cl"><span class="nv">Seal</span><span class="o">=</span>yes                 <span class="c1"># 防篡改密封</span>
</span></span><span class="line"><span class="cl"><span class="nv">SystemMaxUse</span><span class="o">=</span>4G          <span class="c1"># 最多使用 4G</span>
</span></span><span class="line"><span class="cl"><span class="nv">SystemMaxFileSize</span><span class="o">=</span>100M   <span class="c1"># 单文件最大</span>
</span></span><span class="line"><span class="cl"><span class="nv">MaxRetentionSec</span><span class="o">=</span>2week    <span class="c1"># 最多保留 2 周</span>
</span></span><span class="line"><span class="cl"><span class="nv">RuntimeMaxUse</span><span class="o">=</span>1G         <span class="c1"># /run 下最大使用</span>
</span></span><span class="line"><span class="cl"><span class="nv">ForwardToSyslog</span><span class="o">=</span>no       <span class="c1"># 是否转发到 syslog</span>
</span></span><span class="line"><span class="cl"><span class="nv">ForwardToConsole</span><span class="o">=</span>no
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl restart systemd-journald</span></span></code></pre></div>
</div>
<h3 id="33-logrotate-日志轮转">3.3 logrotate 日志轮转</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/logrotate.conf (全局)</span>
</span></span><span class="line"><span class="cl">weekly
</span></span><span class="line"><span class="cl">rotate <span class="m">12</span>
</span></span><span class="line"><span class="cl">create
</span></span><span class="line"><span class="cl">dateext
</span></span><span class="line"><span class="cl">compress
</span></span><span class="line"><span class="cl">include /etc/logrotate.d
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/logrotate.d/nginx (应用级)</span>
</span></span><span class="line"><span class="cl">/var/log/nginx/*.log <span class="o">{</span>
</span></span><span class="line"><span class="cl">    daily                       <span class="c1"># 每天轮转</span>
</span></span><span class="line"><span class="cl">    missingok                   <span class="c1"># 日志不存在不报错</span>
</span></span><span class="line"><span class="cl">    rotate <span class="m">30</span>                   <span class="c1"># 保留 30 天</span>
</span></span><span class="line"><span class="cl">    compress                    <span class="c1"># 压缩旧日志</span>
</span></span><span class="line"><span class="cl">    delaycompress               <span class="c1"># 延迟一个周期压缩</span>
</span></span><span class="line"><span class="cl">    notifempty                  <span class="c1"># 空文件不轮转</span>
</span></span><span class="line"><span class="cl">    create <span class="m">640</span> nginx adm        <span class="c1"># 创建新文件权限</span>
</span></span><span class="line"><span class="cl">    sharedscripts               <span class="c1"># 轮转完后执行一次脚本</span>
</span></span><span class="line"><span class="cl">    postrotate
</span></span><span class="line"><span class="cl">        <span class="o">[</span> -f /var/run/nginx.pid <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">kill</span> -USR1 <span class="k">$(</span>cat /var/run/nginx.pid<span class="k">)</span>
</span></span><span class="line"><span class="cl">    endscript
</span></span><span class="line"><span class="cl">    dateext                     <span class="c1"># 日期后缀</span>
</span></span><span class="line"><span class="cl">    dateformat -%Y%m%d
</span></span><span class="line"><span class="cl">    maxsize 500M                <span class="c1"># 超过 500M 强制轮转</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/logrotate.d/syslog</span>
</span></span><span class="line"><span class="cl">/var/log/cron
</span></span><span class="line"><span class="cl">/var/log/maillog
</span></span><span class="line"><span class="cl">/var/log/messages
</span></span><span class="line"><span class="cl">/var/log/secure
</span></span><span class="line"><span class="cl">/var/log/spooler
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">    weekly
</span></span><span class="line"><span class="cl">    rotate <span class="m">12</span>
</span></span><span class="line"><span class="cl">    compress
</span></span><span class="line"><span class="cl">    dateext
</span></span><span class="line"><span class="cl">    missingok
</span></span><span class="line"><span class="cl">    sharedscripts
</span></span><span class="line"><span class="cl">    postrotate
</span></span><span class="line"><span class="cl">        /bin/kill -HUP <span class="k">$(</span>cat /var/run/syslogd.pid 2&gt;/dev/null<span class="k">)</span> 2&gt;/dev/null <span class="o">||</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl">    endscript
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 手动执行轮转</span>
</span></span><span class="line"><span class="cl">logrotate -f /etc/logrotate.conf
</span></span><span class="line"><span class="cl">logrotate -d /etc/logrotate.d/nginx   <span class="c1"># 调试模式 (不实际轮转)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Crontab 中每日执行</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf</span></span></span></code></pre></div>
</div>
<h3 id="34-elk-stack-elasticsearch--logstash--kibana">3.4 ELK Stack (Elasticsearch + Logstash + Kibana)</h3>
<h4 id="341-架构">3.4.1 架构</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>应用日志 → Filebeat → Logstash → Elasticsearch → Kibana
                                           ↕
                                    数据节点集群 (3+)</code></pre>
</div>
<h4 id="342-filebeat-配置">3.4.2 Filebeat 配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># /etc/filebeat/filebeat.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">filebeat.inputs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/log/nginx/access.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">access</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fields_under_root</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">json.keys_under_root</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">json.add_error_key</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/log/nginx/error.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">error</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fields_under_root</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">multiline.pattern</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^\d{4}/\d{2}/\d{2}&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">multiline.negate</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">multiline.match</span><span class="p">:</span><span class="w"> </span><span class="l">after</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">paths</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">/var/log/messages</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">fields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">system</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">syslog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># === 输出到 Logstash ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">output.logstash</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;192.168.1.101:5044&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">loadbalance</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">compression_level</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># === 或直接输出到 Elasticsearch ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># output.elasticsearch:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">#   hosts: [&#34;192.168.1.101:9200&#34;, &#34;192.168.1.102:9200&#34;]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c">#   index: &#34;filebeat-%{[agent.version]}-%{+yyyy.MM.dd}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># === 处理器 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">processors</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">add_host_metadata</span><span class="p">:</span><span class="w"> </span><span class="l">~</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">add_cloud_metadata</span><span class="p">:</span><span class="w"> </span><span class="l">~</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">drop_fields</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">fields</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;agent.ephemeral_id&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;agent.id&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># === 日志本身 ===</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">logging.level</span><span class="p">:</span><span class="w"> </span><span class="l">info</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">logging.to_files</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">logging.files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/filebeat</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">filebeat.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">keepfiles</span><span class="p">:</span><span class="w"> </span><span class="m">7</span></span></span></code></pre></div>
</div>
<h4 id="343-logstash-配置">3.4.3 Logstash 配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">ruby</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ruby" data-lang="ruby"><span class="line"><span class="cl"><span class="c1"># /etc/logstash/conf.d/pipeline.conf</span>
</span></span><span class="line"><span class="cl"><span class="n">input</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">beats</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">port</span> <span class="o">=&gt;</span> <span class="mi">5044</span>
</span></span><span class="line"><span class="cl">    <span class="n">client_inactivity_timeout</span> <span class="o">=&gt;</span> <span class="mi">3600</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">filter</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[</span><span class="n">type</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&#34;access&#34;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">grok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">match</span> <span class="o">=&gt;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;message&#34;</span> <span class="o">=&gt;</span> <span class="s1">&#39;%{IPORHOST:client_ip} - %{DATA:remote_user} \[%{HTTPDATE:timestamp}\] &#34;%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}&#34; %{NUMBER:status} %{NUMBER:body_bytes_sent} &#34;%{DATA:http_referer}&#34; &#34;%{DATA:http_user_agent}&#34;&#39;</span>
</span></span><span class="line"><span class="cl">      <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">date</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">match</span> <span class="o">=&gt;</span> <span class="o">[</span> <span class="s2">&#34;timestamp&#34;</span><span class="p">,</span> <span class="s2">&#34;dd/MMM/yyyy:HH:mm:ss Z&#34;</span> <span class="o">]</span>
</span></span><span class="line"><span class="cl">      <span class="n">target</span> <span class="o">=&gt;</span> <span class="s2">&#34;@timestamp&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">geoip</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">source</span> <span class="o">=&gt;</span> <span class="s2">&#34;client_ip&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="n">useragent</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">source</span> <span class="o">=&gt;</span> <span class="s2">&#34;http_user_agent&#34;</span>
</span></span><span class="line"><span class="cl">      <span class="n">target</span> <span class="o">=&gt;</span> <span class="s2">&#34;user_agent&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">  <span class="k">if</span> <span class="o">[</span><span class="n">type</span><span class="o">]</span> <span class="o">==</span> <span class="s2">&#34;syslog&#34;</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">grok</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">match</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="s2">&#34;message&#34;</span> <span class="o">=&gt;</span> <span class="s2">&#34;%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}&#34;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">output</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">elasticsearch</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">hosts</span> <span class="o">=&gt;</span> <span class="o">[</span><span class="s2">&#34;http://192.168.1.101:9200&#34;</span><span class="p">,</span> <span class="s2">&#34;http://192.168.1.102:9200&#34;</span><span class="o">]</span>
</span></span><span class="line"><span class="cl">    <span class="n">index</span> <span class="o">=&gt;</span> <span class="s2">&#34;logstash-%{[app]}-%{+YYYY.MM.dd}&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="n">manage_template</span> <span class="o">=&gt;</span> <span class="kp">false</span>
</span></span><span class="line"><span class="cl">  <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># 如果 ES 不可用，存磁盘队列</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># dead_letter_queue {</span>
</span></span><span class="line"><span class="cl">  <span class="c1">#   path =&gt; &#34;/data/logstash/dead_letter_queue&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="c1">#   max_bytes =&gt; &#34;1gb&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="c1"># }</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
</div>
<h3 id="35-grafana-loki-轻量日志方案">3.5 Grafana Loki (轻量日志方案)</h3>
<p>Loki 是 Grafana 生态的日志方案，类似 Prometheus 但用于日志：</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># promtail (日志采集器) 配置</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># /etc/promtail/config.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">http_listen_port</span><span class="p">:</span><span class="w"> </span><span class="m">9080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">clients</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="l">http://loki:3100/loki/api/v1/push</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">scrape_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="l">system</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">localhost]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">job</span><span class="p">:</span><span class="w"> </span><span class="l">varlogs</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">${HOSTNAME}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">__path__</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/*.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">job_name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">static_configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">targets</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">localhost]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">job</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">host</span><span class="p">:</span><span class="w"> </span><span class="l">${HOSTNAME}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">__path__</span><span class="p">:</span><span class="w"> </span><span class="l">/var/log/nginx/*.log</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">pipeline_stages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="nt">match</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">selector</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;{job=&#34;nginx&#34;} |= &#34;/var/log/nginx/error.log&#34;&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">stages</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">regex</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="nt">expression</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;^(?P&lt;time&gt;\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?P&lt;level&gt;\w+)\]&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span>- <span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="l">level:</span></span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># loki 配置 (单机)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># /etc/loki/loki-config.yaml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">auth_enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">server</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">http_listen_port</span><span class="p">:</span><span class="w"> </span><span class="m">3100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">ingester</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">lifecycler</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ring</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">kvstore</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">store</span><span class="p">:</span><span class="w"> </span><span class="l">inmemory</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">replication_factor</span><span class="p">:</span><span class="w"> </span><span class="m">1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">chunk_idle_period</span><span class="p">:</span><span class="w"> </span><span class="l">30m</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">max_chunk_age</span><span class="p">:</span><span class="w"> </span><span class="l">1h</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">chunk_target_size</span><span class="p">:</span><span class="w"> </span><span class="m">1536000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">chunk_retain_period</span><span class="p">:</span><span class="w"> </span><span class="l">30s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">schema_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">configs</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">from</span><span class="p">:</span><span class="w"> </span><span class="ld">2024-01-01</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">store</span><span class="p">:</span><span class="w"> </span><span class="l">boltdb-shipper</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">object_store</span><span class="p">:</span><span class="w"> </span><span class="l">filesystem</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">schema</span><span class="p">:</span><span class="w"> </span><span class="l">v11</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">index</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">prefix</span><span class="p">:</span><span class="w"> </span><span class="l">index_</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">period</span><span class="p">:</span><span class="w"> </span><span class="l">24h</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">storage_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">boltdb_shipper</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">active_index_directory</span><span class="p">:</span><span class="w"> </span><span class="l">/data/loki/index</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">cache_location</span><span class="p">:</span><span class="w"> </span><span class="l">/data/loki/cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">filesystem</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">directory</span><span class="p">:</span><span class="w"> </span><span class="l">/data/loki/chunks</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">limits_config</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">enforce_metric_name</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">max_entries_limit_per_query</span><span class="p">:</span><span class="w"> </span><span class="m">5000</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">retention_period</span><span class="p">:</span><span class="w"> </span><span class="l">30d</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">compactor</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">working_directory</span><span class="p">:</span><span class="w"> </span><span class="l">/data/loki/compactor</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">shared_store</span><span class="p">:</span><span class="w"> </span><span class="l">filesystem</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第四章备份与灾难恢复">第四章：备份与灾难恢复</h2>
<h3 id="41-备份策略-3-2-1-原则">4.1 备份策略 3-2-1 原则</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>3 份数据副本 (生产 + 2 备份)
2 种不同存储介质 (本地磁盘 + 磁带/云存储)
1 份异地备份 (不同数据中心/区域)</code></pre>
</div>
<h3 id="42-rsync-备份方案">4.2 rsync 备份方案</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 基础用法 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 本地同步</span>
</span></span><span class="line"><span class="cl">rsync -avz --delete /data/ /backup/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 远程同步 (SSH)</span>
</span></span><span class="line"><span class="cl">rsync -avz -e <span class="s2">&#34;ssh -p 22&#34;</span> /data/ root@192.168.1.200:/backup/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 远程拉取</span>
</span></span><span class="line"><span class="cl">rsync -avz root@192.168.1.100:/data/ /backup/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 生产级备份脚本 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1">#!/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /opt/scripts/backup.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_SRC</span><span class="o">=</span><span class="s2">&#34;/data/app&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DST</span><span class="o">=</span><span class="s2">&#34;/backup&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">REMOTE_HOST</span><span class="o">=</span><span class="s2">&#34;backup@192.168.1.200&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">REMOTE_PATH</span><span class="o">=</span><span class="s2">&#34;/backup/</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LOG_FILE</span><span class="o">=</span><span class="s2">&#34;/var/log/backup.log&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">EXCLUDE_FILE</span><span class="o">=</span><span class="s2">&#34;/opt/scripts/backup_exclude.txt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LOCK_FILE</span><span class="o">=</span><span class="s2">&#34;/var/run/backup.lock&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log<span class="o">()</span> <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date <span class="s1">&#39;+%F %T&#39;</span><span class="k">)</span><span class="s2">] </span><span class="nv">$*</span><span class="s2">&#34;</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 防止并发执行</span>
</span></span><span class="line"><span class="cl"><span class="nb">exec</span> 200&gt;<span class="s2">&#34;</span><span class="nv">$LOCK_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">flock -n <span class="m">200</span> <span class="o">||</span> <span class="o">{</span> log <span class="s2">&#34;备份已在运行，退出&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 开始备份 ===&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 本地每日快照 (保留 7 天)</span>
</span></span><span class="line"><span class="cl">rsync -avz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --delete <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude-from<span class="o">=</span><span class="s2">&#34;</span><span class="nv">$EXCLUDE_FILE</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --link-dest<span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/latest&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;</span><span class="nv">$BACKUP_SRC</span><span class="s2">/&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">/&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 更新 latest 符号链接</span>
</span></span><span class="line"><span class="cl">rm -f <span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/latest&#34;</span>
</span></span><span class="line"><span class="cl">ln -s <span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/latest&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 远程同步</span>
</span></span><span class="line"><span class="cl">rsync -avz --delete <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    -e <span class="s2">&#34;ssh -p 22 -i /root/.ssh/backup_key&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;</span><span class="nv">$BACKUP_DST</span><span class="s2">/&#34;</span> <span class="s2">&#34;</span><span class="nv">$REMOTE_HOST</span><span class="s2">:</span><span class="nv">$REMOTE_PATH</span><span class="s2">/&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 清理旧备份 (超过 30 天的远程备份)</span>
</span></span><span class="line"><span class="cl">ssh -i /root/.ssh/backup_key <span class="s2">&#34;</span><span class="nv">$REMOTE_HOST</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="s2">&#34;find </span><span class="nv">$REMOTE_PATH</span><span class="s2"> -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 备份完成 ===&#34;</span></span></span></code></pre></div>
</div>
<h3 id="43-restic-现代-go-备份工具">4.3 restic (现代 Go 备份工具)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 安装 ===</span>
</span></span><span class="line"><span class="cl">wget https://github.com/restic/restic/releases/download/v0.16.4/restic_0.16.4_linux_amd64.bz2
</span></span><span class="line"><span class="cl">bunzip2 restic_0.16.4_linux_amd64.bz2
</span></span><span class="line"><span class="cl">mv restic_0.16.4_linux_amd64 /usr/local/bin/restic
</span></span><span class="line"><span class="cl">chmod +x /usr/local/bin/restic
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 初始化仓库 ===</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span>/backup/restic
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_PASSWORD</span><span class="o">=</span>your_strong_password
</span></span><span class="line"><span class="cl">restic init
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 远程仓库 ===</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span>sftp:backup@storage:/backup/restic
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_PASSWORD</span><span class="o">=</span>your_strong_password
</span></span><span class="line"><span class="cl">restic init
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># S3 兼容 (MinIO / AWS S3)</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">AWS_ACCESS_KEY_ID</span><span class="o">=</span>xxx
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">AWS_SECRET_ACCESS_KEY</span><span class="o">=</span>yyy
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span>s3:s3.amazonaws.com/bucket-name/restic
</span></span><span class="line"><span class="cl">restic init
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 备份 ===</span>
</span></span><span class="line"><span class="cl">restic backup /data /etc /var/log --exclude <span class="s2">&#34;*.tmp&#34;</span> --exclude <span class="s2">&#34;*.log&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 快照管理 ===</span>
</span></span><span class="line"><span class="cl">restic snapshots                          <span class="c1"># 列出快照</span>
</span></span><span class="line"><span class="cl">restic diff &lt;snapshot1&gt; &lt;snapshot2&gt;       <span class="c1"># 比较快照差异</span>
</span></span><span class="line"><span class="cl">restic stats                              <span class="c1"># 仓库统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 恢复 ===</span>
</span></span><span class="line"><span class="cl">restic restore latest --target /restore/path/    <span class="c1"># 恢复最新</span>
</span></span><span class="line"><span class="cl">restic restore &lt;snapshot_id&gt; --target /restore/  <span class="c1"># 恢复指定快照</span>
</span></span><span class="line"><span class="cl">restic restore latest --target /restore/ --include <span class="s2">&#34;/data/app/*&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 清理 ===</span>
</span></span><span class="line"><span class="cl">restic forget --keep-daily <span class="m">7</span> --keep-weekly <span class="m">4</span> --keep-monthly <span class="m">12</span> --keep-yearly <span class="m">2</span>
</span></span><span class="line"><span class="cl">restic prune     <span class="c1"># 删除未引用的数据块</span>
</span></span><span class="line"><span class="cl">restic check     <span class="c1"># 验证仓库完整性</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 自动备份脚本 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1">#!/bin/bash</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span>/backup/restic
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_PASSWORD_FILE</span><span class="o">=</span>/root/.restic-password
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_SRC</span><span class="o">=</span><span class="s2">&#34;/data /etc /var/log&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">restic backup <span class="nv">$BACKUP_SRC</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude <span class="s2">&#34;*.tmp&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude <span class="s2">&#34;*.bak&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --tag <span class="s2">&#34;</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --host <span class="s2">&#34;</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">restic forget <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --keep-daily <span class="m">7</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --keep-weekly <span class="m">4</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --keep-monthly <span class="m">12</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --keep-yearly <span class="m">2</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --prune
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">restic check --read-data-subset<span class="o">=</span>2%</span></span></code></pre></div>
</div>
<h3 id="44-数据库备份">4.4 数据库备份</h3>
<h4 id="mysql">MySQL</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># MySQL 全量 + binlog 备份</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">DB_USER</span><span class="o">=</span><span class="s2">&#34;backup&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DB_PASS</span><span class="o">=</span><span class="s2">&#34;password&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">&#34;/backup/mysql&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">RETENTION_DAYS</span><span class="o">=</span><span class="m">7</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 全量备份 (mysqldump)</span>
</span></span><span class="line"><span class="cl">mysqldump -u<span class="nv">$DB_USER</span> -p<span class="nv">$DB_PASS</span> --all-databases <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --single-transaction <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --routines --triggers --events <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --master-data<span class="o">=</span><span class="m">2</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --set-gtid-purged<span class="o">=</span>OFF <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    <span class="p">|</span> gzip &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/full_</span><span class="k">$(</span>date +%Y%m%d_%H%M<span class="k">)</span><span class="s2">.sql.gz&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或使用 xtrabackup (物理备份，大库推荐)</span>
</span></span><span class="line"><span class="cl">xtrabackup --backup <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --user<span class="o">=</span><span class="nv">$DB_USER</span> --password<span class="o">=</span><span class="nv">$DB_PASS</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --target-dir<span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/xtra_</span><span class="k">$(</span>date +%Y%m%d_%H%M<span class="k">)</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --compress --compress-threads<span class="o">=</span><span class="m">4</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理旧备份</span>
</span></span><span class="line"><span class="cl">find <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">&#34;</span> -mtime +<span class="nv">$RETENTION_DAYS</span> -delete</span></span></code></pre></div>
</div>
<h4 id="postgresql">PostgreSQL</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># PostgreSQL 备份</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">&#34;/backup/postgres&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">PGPASSWORD</span><span class="o">=</span><span class="s2">&#34;password&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 逻辑备份</span>
</span></span><span class="line"><span class="cl">pg_dumpall -U postgres -h localhost <span class="p">|</span> gzip &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/pg_all_</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">.sql.gz&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 单库自定义格式 (支持并行恢复)</span>
</span></span><span class="line"><span class="cl">pg_dump -U postgres -h localhost -Fc -j <span class="m">4</span> mydb &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">/mydb_</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">.dump&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># WAL 归档配置 (postgresql.conf)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wal_level = replica</span>
</span></span><span class="line"><span class="cl"><span class="c1"># archive_mode = on</span>
</span></span><span class="line"><span class="cl"><span class="c1"># archive_command = &#39;test ! -f /backup/pg_wal/%f &amp;&amp; cp %p /backup/pg_wal/%f&#39;</span></span></span></code></pre></div>
</div>
<h3 id="45-系统级备份">4.5 系统级备份</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 分区镜像备份 (dd) ===</span>
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/sda1 <span class="nv">of</span><span class="o">=</span>/backup/sda1_<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.img <span class="nv">bs</span><span class="o">=</span>4M <span class="nv">status</span><span class="o">=</span>progress
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 压缩</span>
</span></span><span class="line"><span class="cl">dd <span class="k">if</span><span class="o">=</span>/dev/sda1 <span class="nv">bs</span><span class="o">=</span>4M <span class="p">|</span> gzip &gt; /backup/sda1.img.gz
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 恢复</span>
</span></span><span class="line"><span class="cl">gunzip -c /backup/sda1.img.gz <span class="p">|</span> dd <span class="nv">of</span><span class="o">=</span>/dev/sda1 <span class="nv">bs</span><span class="o">=</span>4M <span class="nv">status</span><span class="o">=</span>progress
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === tar 系统备份 ===</span>
</span></span><span class="line"><span class="cl">tar -cvpzf /backup/system_<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.tar.gz <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/proc <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/tmp <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/sys <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/dev <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/run <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/mnt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/media <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/backup <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --exclude<span class="o">=</span>/lost+found <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    /
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 恢复</span>
</span></span><span class="line"><span class="cl">tar -xvpzf /backup/system_20240101.tar.gz -C /</span></span></code></pre></div>
</div>
<h3 id="46-灾难恢复演练">4.6 灾难恢复演练</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># DR 演练检查清单脚本</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 灾难恢复检查清单 ===&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;日期: </span><span class="k">$(</span>date<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 验证备份完整性</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[1/6] 验证备份完整性...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_DIR</span><span class="o">=</span><span class="s2">&#34;/backup&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LATEST</span><span class="o">=</span><span class="k">$(</span>ls -t <span class="s2">&#34;</span><span class="nv">$BACKUP_DIR</span><span class="s2">&#34;</span> <span class="p">|</span> head -1<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$LATEST</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✓ 最新备份: </span><span class="nv">$LATEST</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✗ 未找到备份!&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 验证备份可恢复性 (抽检)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[2/6] 验证备份可恢复性...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> restic check --read-data-subset<span class="o">=</span>1%<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✓ restic 仓库完整性验证通过&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 验证数据库备份</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[3/6] 验证数据库备份...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">LATEST_SQL</span><span class="o">=</span><span class="k">$(</span>ls -t /backup/mysql/*.sql.gz 2&gt;/dev/null <span class="p">|</span> head -1<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> gzip -t <span class="s2">&#34;</span><span class="nv">$LATEST_SQL</span><span class="s2">&#34;</span> 2&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✓ MySQL 备份文件完整性验证通过&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 验证远程同步</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[4/6] 验证远程备份...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> rsync -azn --delete /backup/ backup@192.168.1.200:/backup/<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✓ 远程连接正常&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 验证恢复文档</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[5/6] 验证恢复文档...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -f /opt/docs/recovery_procedure.md <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✓ 恢复文档存在&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">else</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;  ✗ 缺少恢复文档!&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 验证恢复时间</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n[6/6] 恢复时间估算...&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;  上次全量恢复耗时: ~30分钟 (记录于 2024-01-01)&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;  RTO 目标: 2小时&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;  RPO 目标: &lt; 1小时 (binlog 实时同步)&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n=== 检查完成 ===&#34;</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第五章自动化运维">第五章：自动化运维</h2>
<h3 id="51-ansible-基础">5.1 Ansible 基础</h3>
<h4 id="511-核心概念">5.1.1 核心概念</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>┌─────────────┐
│  控制节点    │  (Ansible 安装在此)
│  playbook   │  无需 agent，通过 SSH 管理
└──────┬──────┘
       │ SSH
  ┌────┼────┐
  ▼    ▼    ▼
┌───┐┌───┐┌───┐
│ N1││ N2││ N3│  被管理节点 (只需 Python)
└───┘└───┘└───┘</code></pre>
</div>
<h4 id="512-安装与配置">5.1.2 安装与配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">yum install -y ansible        <span class="c1"># CentOS/RHEL</span>
</span></span><span class="line"><span class="cl">apt-get install -y ansible    <span class="c1"># Ubuntu/Debian</span>
</span></span><span class="line"><span class="cl">pip install ansible            <span class="c1"># pip (最新版)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 验证</span>
</span></span><span class="line"><span class="cl">ansible --version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === ansible.cfg 配置 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/ansible/ansible.cfg 或 ./ansible.cfg</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>defaults<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">inventory</span>      <span class="o">=</span> ./hosts
</span></span><span class="line"><span class="cl"><span class="nv">host_key_checking</span> <span class="o">=</span> False
</span></span><span class="line"><span class="cl"><span class="nv">remote_user</span>    <span class="o">=</span> root
</span></span><span class="line"><span class="cl"><span class="nv">private_key_file</span> <span class="o">=</span> /root/.ssh/id_rsa
</span></span><span class="line"><span class="cl"><span class="nv">forks</span>          <span class="o">=</span> <span class="m">20</span>
</span></span><span class="line"><span class="cl"><span class="nv">timeout</span>        <span class="o">=</span> <span class="m">30</span>
</span></span><span class="line"><span class="cl"><span class="nv">log_path</span>       <span class="o">=</span> /var/log/ansible.log
</span></span><span class="line"><span class="cl"><span class="nv">gathering</span>      <span class="o">=</span> smart
</span></span><span class="line"><span class="cl"><span class="nv">fact_caching</span>   <span class="o">=</span> jsonfile
</span></span><span class="line"><span class="cl"><span class="nv">fact_caching_connection</span> <span class="o">=</span> /tmp/ansible_cache
</span></span><span class="line"><span class="cl"><span class="nv">fact_caching_timeout</span> <span class="o">=</span> <span class="m">3600</span>
</span></span><span class="line"><span class="cl"><span class="nv">retry_files_enabled</span> <span class="o">=</span> False
</span></span><span class="line"><span class="cl"><span class="nv">callback_whitelist</span> <span class="o">=</span> timer, profile_tasks
</span></span><span class="line"><span class="cl"><span class="nv">stdout_callback</span> <span class="o">=</span> yaml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>privilege_escalation<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">become</span>         <span class="o">=</span> True
</span></span><span class="line"><span class="cl"><span class="nv">become_method</span>  <span class="o">=</span> sudo
</span></span><span class="line"><span class="cl"><span class="nv">become_user</span>    <span class="o">=</span> root
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>ssh_connection<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">pipelining</span>     <span class="o">=</span> True
</span></span><span class="line"><span class="cl"><span class="nv">control_path</span>   <span class="o">=</span> /tmp/ansible-%%h-%%p-%%r</span></span></code></pre></div>
</div>
<h4 id="513-inventory-主机清单">5.1.3 Inventory 主机清单</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">ini</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-ini" data-lang="ini"><span class="line"><span class="cl"><span class="c1"># hosts (静态清单)</span>
</span></span><span class="line"><span class="cl"><span class="k">[webservers]</span>
</span></span><span class="line"><span class="cl"><span class="na">web01 ansible_host</span><span class="o">=</span><span class="s">192.168.1.11</span>
</span></span><span class="line"><span class="cl"><span class="na">web02 ansible_host</span><span class="o">=</span><span class="s">192.168.1.12</span>
</span></span><span class="line"><span class="cl"><span class="na">web03 ansible_host</span><span class="o">=</span><span class="s">192.168.1.13</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[dbservers]</span>
</span></span><span class="line"><span class="cl"><span class="na">db01 ansible_host</span><span class="o">=</span><span class="s">192.168.1.21 ansible_user=dbadmin</span>
</span></span><span class="line"><span class="cl"><span class="na">db02 ansible_host</span><span class="o">=</span><span class="s">192.168.1.22</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">[appservers]</span>
</span></span><span class="line"><span class="cl"><span class="na">app[01:05].example.com             # 范围: app01 ~ app05</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">[production:children]              # 分组嵌套</span>
</span></span><span class="line"><span class="cl"><span class="na">webservers</span>
</span></span><span class="line"><span class="cl"><span class="na">dbservers</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">[production:vars]                  # 组变量</span>
</span></span><span class="line"><span class="cl"><span class="na">ansible_user</span><span class="o">=</span><span class="s">root</span>
</span></span><span class="line"><span class="cl"><span class="na">ntp_server</span><span class="o">=</span><span class="s">ntp.prod.example.com</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="na">[all:vars]                         # 全局变量</span>
</span></span><span class="line"><span class="cl"><span class="na">ansible_port</span><span class="o">=</span><span class="s">22</span></span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># hosts.yml (YAML 清单)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">all</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">bastion</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">ansible_host</span><span class="p">:</span><span class="w"> </span><span class="m">1.2.3.4</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">children</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">production</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">web[01:03].example.com</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="l">production</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">staging</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">hosts</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">web-stg.example.com</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">env</span><span class="p">:</span><span class="w"> </span><span class="l">staging</span></span></span></code></pre></div>
</div>
<h4 id="514-常用-ad-hoc-命令">5.1.4 常用 Ad-Hoc 命令</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 基本语法: ansible &lt;pattern&gt; -m &lt;module&gt; -a &#34;&lt;arguments&gt;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 信息收集 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m ping                                       <span class="c1"># 存活检测</span>
</span></span><span class="line"><span class="cl">ansible all -m setup                                      <span class="c1"># 收集 facts</span>
</span></span><span class="line"><span class="cl">ansible all -m setup -a <span class="s2">&#34;filter=ansible_memory_mb&#34;</span>        <span class="c1"># 过滤 facts</span>
</span></span><span class="line"><span class="cl">ansible all -m shell -a <span class="s2">&#34;hostname; uptime&#34;</span>                <span class="c1"># 执行 shell</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 文件操作 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m copy -a <span class="s2">&#34;src=https://goslion.com/tmp/file dest=/tmp/file&#34;</span>     <span class="c1"># 拷贝文件</span>
</span></span><span class="line"><span class="cl">ansible all -m fetch -a <span class="s2">&#34;src=https://goslion.com/etc/hosts dest=/tmp/&#34;</span>       <span class="c1"># 拉取文件</span>
</span></span><span class="line"><span class="cl">ansible all -m file -a <span class="s2">&#34;path=/data state=directory mode=0755&#34;</span>  <span class="c1"># 创建目录</span>
</span></span><span class="line"><span class="cl">ansible all -m replace -a <span class="s2">&#34;path=/etc/nginx/nginx.conf regexp=&#39;worker_processes.*&#39; replace=&#39;worker_processes 8;&#39;&#34;</span>  <span class="c1"># 文件内容替换</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 包管理 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m yum -a <span class="s2">&#34;name=nginx state=latest&#34;</span>           <span class="c1"># 安装 (RHEL)</span>
</span></span><span class="line"><span class="cl">ansible all -m apt -a <span class="s2">&#34;name=nginx state=latest update_cache=yes&#34;</span>  <span class="c1"># 安装 (Debian)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 服务管理 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m systemd -a <span class="s2">&#34;name=nginx state=restarted&#34;</span>    <span class="c1"># 重启服务</span>
</span></span><span class="line"><span class="cl">ansible all -m systemd -a <span class="s2">&#34;name=nginx enabled=yes&#34;</span>        <span class="c1"># 开机启动</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 用户管理 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m user -a <span class="s2">&#34;name=app password={{ &#39;mypass&#39; | password_hash(&#39;sha512&#39;) }} groups=wheel state=present&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 内核参数 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m sysctl -a <span class="s2">&#34;name=net.ipv4.tcp_tw_reuse value=1 sysctl_set=yes reload=yes&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 计划任务 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m cron -a <span class="s2">&#34;name=&#39;log cleanup&#39; hour=2 job=&#39;/opt/scripts/cleanup.sh&#39;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 防火墙 ===</span>
</span></span><span class="line"><span class="cl">ansible all -m firewalld -a <span class="s2">&#34;port=80/tcp permanent=yes state=enabled immediate=yes&#34;</span></span></span></code></pre></div>
</div>
<h4 id="515-playbook-编写">5.1.5 Playbook 编写</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># deploy_webapp.yml</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">部署 Web 应用</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">webservers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">become</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vars</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app_name</span><span class="p">:</span><span class="w"> </span><span class="l">myapp</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app_port</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app_version</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;1.2.3&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">nginx_worker_processes</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ ansible_processor_vcpus }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">vars_files</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="l">vars/secrets.yml  </span><span class="w"> </span><span class="c"># 加密的敏感变量</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">pre_tasks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">更新 yum 缓存</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">yum</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">update_cache</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;*&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">when</span><span class="p">:</span><span class="w"> </span><span class="l">ansible_os_family == &#34;RedHat&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">update]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">检查磁盘空间</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">shell</span><span class="p">:</span><span class="w"> </span><span class="l">df -h /data | awk &#39;NR==2{print $5}&#39; | sed &#39;s/%//&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">disk_usage</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">failed_when</span><span class="p">:</span><span class="w"> </span><span class="l">disk_usage.stdout|int &gt; 90</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">tasks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">安装基础包</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">package</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ item }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">present</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">loop</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">supervisor</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">python3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">packages]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">创建应用用户</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">user</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">system</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">shell</span><span class="p">:</span><span class="w"> </span><span class="l">/sbin/nologin</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">create_home</span><span class="p">:</span><span class="w"> </span><span class="kc">no</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">user]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">创建目录结构</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">file</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">path</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ item }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">directory</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;0755&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">loop</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">/opt/{{ app_name }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">/opt/{{ app_name }}/config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">/data/{{ app_name }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span>- <span class="l">/var/log/{{ app_name }}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">dirs]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">部署应用文件</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">copy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">src</span><span class="p">:</span><span class="w"> </span><span class="l">files/{{ app_name }}-{{ app_version }}.jar</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">dest</span><span class="p">:</span><span class="w"> </span><span class="l">/opt/{{ app_name }}/{{ app_name }}.jar</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">owner</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">mode</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;0644&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l">restart app         </span><span class="w"> </span><span class="c"># 触发 handler</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">deploy]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">配置 Nginx 反向代理</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">src</span><span class="p">:</span><span class="w"> </span><span class="l">templates/nginx.conf.j2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">dest</span><span class="p">:</span><span class="w"> </span><span class="l">/etc/nginx/conf.d/{{ app_name }}.conf</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">validate</span><span class="p">:</span><span class="w"> </span><span class="l">nginx -t -c %s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l">reload nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">nginx]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">配置 systemd 服务</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">template</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">src</span><span class="p">:</span><span class="w"> </span><span class="l">templates/app.service.j2</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">dest</span><span class="p">:</span><span class="w"> </span><span class="l">/etc/systemd/system/{{ app_name }}.service</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">notify</span><span class="p">:</span><span class="w"> </span><span class="l">restart app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">service]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">启动服务</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">systemd</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">started</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">enabled</span><span class="p">:</span><span class="w"> </span><span class="kc">yes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">service]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">handlers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">reload nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">systemd</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">reloaded</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">restart app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">systemd</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">state</span><span class="p">:</span><span class="w"> </span><span class="l">restarted</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">post_tasks</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">健康检查</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">uri</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">url</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;http://localhost:{{ app_port }}/health&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">status_code</span><span class="p">:</span><span class="w"> </span><span class="m">200</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">retries</span><span class="p">:</span><span class="w"> </span><span class="m">10</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">delay</span><span class="p">:</span><span class="w"> </span><span class="m">3</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">until</span><span class="p">:</span><span class="w"> </span><span class="l">result.status == 200</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">register</span><span class="p">:</span><span class="w"> </span><span class="l">result</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">verify]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">发送部署通知</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">slack</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">token</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ slack_token }}&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">msg</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;{{ app_name }} v{{ app_version }} 部署完成 [{{ ansible_hostname }}]&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">notify]</span></span></span></code></pre></div>
</div>
<h4 id="516-jinja2-模板示例">5.1.6 Jinja2 模板示例</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">nginx</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nginx" data-lang="nginx"><span class="line"><span class="cl"><span class="k">{</span><span class="c1"># templates/nginx.conf.j2 #}
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="s">upstream</span> <span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">_backend</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="kn">{%</span> <span class="s">for</span> <span class="s">host</span> <span class="s">in</span> <span class="s">groups[&#39;appservers&#39;]</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">    <span class="s">server</span> <span class="p">{</span><span class="kn">{</span> <span class="s">hostvars[host][&#39;ansible_host&#39;]</span> <span class="err">}}</span><span class="p">:{</span><span class="kn">{</span> <span class="s">app_port</span> <span class="err">}}</span> <span class="s">weight=1</span> <span class="s">max_fails=3</span> <span class="s">fail_timeout=30s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kn">{%</span> <span class="s">endfor</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">    <span class="s">keepalive</span> <span class="mi">32</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">server</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kn">listen</span> <span class="mi">80</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">server_name</span> <span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">.example.com</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kn">access_log</span> <span class="s">/var/log/nginx/</span><span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">_access.log</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">error_log</span>  <span class="s">/var/log/nginx/</span><span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">_error.log</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="kn">location</span> <span class="s">/</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_pass</span> <span class="s">http://</span><span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">_backend</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_http_version</span> <span class="mi">1</span><span class="s">.1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_set_header</span> <span class="s">Connection</span> <span class="s">&#34;&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_set_header</span> <span class="s">Host</span> <span class="nv">$host</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_set_header</span> <span class="s">X-Real-IP</span> <span class="nv">$remote_addr</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">proxy_set_header</span> <span class="s">X-Forwarded-For</span> <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        <span class="c1"># 基于环境控制超时
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kn">{%</span> <span class="s">if</span> <span class="s">env</span> <span class="p">==</span> <span class="s">&#39;production&#39;</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">        <span class="s">proxy_read_timeout</span> <span class="s">60s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">{%</span> <span class="s">else</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">        <span class="s">proxy_read_timeout</span> <span class="s">300s</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="kn">{%</span> <span class="s">endif</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">    <span class="err">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 仅生产环境启用 SSL
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">{</span><span class="kn">%</span> <span class="s">if</span> <span class="s">env</span> <span class="p">==</span> <span class="s">&#39;production&#39;</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl">    <span class="s">listen</span> <span class="mi">443</span> <span class="s">ssl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">ssl_certificate</span>     <span class="s">/etc/ssl/certs/</span><span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">.crt</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">ssl_certificate_key</span> <span class="s">/etc/ssl/private/</span><span class="p">{</span><span class="kn">{</span> <span class="s">app_name</span> <span class="err">}}</span><span class="s">.key</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kn">if</span> <span class="s">(</span><span class="nv">$scheme</span> <span class="s">!=</span> <span class="s">&#34;https&#34;)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="kn">return</span> <span class="mi">301</span> <span class="s">https://</span><span class="nv">$host$request_uri</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kn">{%</span> <span class="s">endif</span> <span class="s">%</span><span class="err">}</span>
</span></span><span class="line"><span class="cl"><span class="err">}</span></span></span></code></pre></div>
</div>
<h4 id="517-ansible-vault-加密敏感数据">5.1.7 Ansible Vault (加密敏感数据)</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 创建加密文件</span>
</span></span><span class="line"><span class="cl">ansible-vault create vars/secrets.yml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 编辑加密文件</span>
</span></span><span class="line"><span class="cl">ansible-vault edit vars/secrets.yml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 加密已有文件</span>
</span></span><span class="line"><span class="cl">ansible-vault encrypt vars/secrets.yml
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 使用密码文件 (生产环境)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;my_vault_password&#34;</span> &gt; ~/.vault_pass
</span></span><span class="line"><span class="cl">ansible-vault encrypt vars/secrets.yml --vault-password-file ~/.vault_pass
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 运行 playbook 时解密</span>
</span></span><span class="line"><span class="cl">ansible-playbook deploy.yml --vault-password-file ~/.vault_pass
</span></span><span class="line"><span class="cl">ansible-playbook deploy.yml --ask-vault-pass   <span class="c1"># 交互输入</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 多环境密码 (vault-id)</span>
</span></span><span class="line"><span class="cl">ansible-vault encrypt --vault-id prod@prompt vars/prod/secrets.yml
</span></span><span class="line"><span class="cl">ansible-playbook deploy.yml --vault-id prod@prompt</span></span></code></pre></div>
</div>
<h4 id="518-ansible-roles">5.1.8 Ansible Roles</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>roles/
├── nginx/
│   ├── tasks/
│   │   ├── main.yml       # 主任务入口
│   │   ├── install.yml    # 安装
│   │   └── configure.yml  # 配置
│   ├── handlers/
│   │   └── main.yml       # Handler
│   ├── templates/
│   │   └── nginx.conf.j2
│   ├── files/
│   │   └── index.html
│   ├── vars/
│   │   └── main.yml       # 默认变量
│   ├── defaults/
│   │   └── main.yml       # 低优先级变量 (可覆盖)
│   ├── meta/
│   │   └── main.yml       # 依赖声明
│   └── tests/
│       └── test.yml</code></pre>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># playbook 中使用 roles</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nn">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span>- <span class="nt">hosts</span><span class="p">:</span><span class="w"> </span><span class="l">webservers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">roles</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">role</span><span class="p">:</span><span class="w"> </span><span class="l">nginx</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">nginx_port</span><span class="p">:</span><span class="w"> </span><span class="m">8080</span><span class="w">          </span><span class="c"># 覆盖默认变量</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">nginx]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span>- <span class="nt">role</span><span class="p">:</span><span class="w"> </span><span class="l">app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="l">app]</span></span></span></code></pre></div>
</div>
<h3 id="52-其他自动化工具对比">5.2 其他自动化工具对比</h3>
<table>
  <thead>
      <tr>
          <th>特性</th>
          <th>Ansible</th>
          <th>SaltStack</th>
          <th>Puppet</th>
          <th>Chef</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>架构</td>
          <td>无 agent (SSH)</td>
          <td>Agent + Master</td>
          <td>Agent + Master</td>
          <td>Agent + Master</td>
      </tr>
      <tr>
          <td>配置语言</td>
          <td>YAML</td>
          <td>YAML + Python</td>
          <td>自定义 DSL</td>
          <td>Ruby DSL</td>
      </tr>
      <tr>
          <td>学习曲线</td>
          <td>低</td>
          <td>中</td>
          <td>高</td>
          <td>高</td>
      </tr>
      <tr>
          <td>实时性</td>
          <td>推送模型</td>
          <td>事件驱动(快)</td>
          <td>拉取(30min)</td>
          <td>拉取(30min)</td>
      </tr>
      <tr>
          <td>社区</td>
          <td>最大</td>
          <td>中型</td>
          <td>大型</td>
          <td>中型</td>
      </tr>
      <tr>
          <td>适用场景</td>
          <td>通用/中小规模</td>
          <td>大规模/实时</td>
          <td>大规模合规</td>
          <td>大规模/复杂</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="第六章安全加固">第六章：安全加固</h2>
<h3 id="61-系统基础安全">6.1 系统基础安全</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 1. SSH 加固 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/ssh/sshd_config</span>
</span></span><span class="line"><span class="cl">Port <span class="m">2222</span>                              <span class="c1"># 修改默认端口</span>
</span></span><span class="line"><span class="cl">Protocol <span class="m">2</span>                             <span class="c1"># 仅 SSHv2</span>
</span></span><span class="line"><span class="cl">PermitRootLogin no                     <span class="c1"># 禁止 root 登录</span>
</span></span><span class="line"><span class="cl">PasswordAuthentication no              <span class="c1"># 禁用密码认证</span>
</span></span><span class="line"><span class="cl">PubkeyAuthentication yes               <span class="c1"># 仅密钥认证</span>
</span></span><span class="line"><span class="cl">MaxAuthTries <span class="m">3</span>                         <span class="c1"># 最大尝试次数</span>
</span></span><span class="line"><span class="cl">ClientAliveInterval <span class="m">300</span>                <span class="c1"># 客户端心跳</span>
</span></span><span class="line"><span class="cl">ClientAliveCountMax <span class="m">2</span>                  <span class="c1"># 推送周期</span>
</span></span><span class="line"><span class="cl">AllowUsers ops@192.168.1.*            <span class="c1"># 限制用户和来源 IP</span>
</span></span><span class="line"><span class="cl">X11Forwarding no                       <span class="c1"># 禁止 X11 转发</span>
</span></span><span class="line"><span class="cl">MaxSessions <span class="m">5</span>                          <span class="c1"># 单连接最大会话数</span>
</span></span><span class="line"><span class="cl">LoginGraceTime <span class="m">30</span>                      <span class="c1"># 认证超时</span>
</span></span><span class="line"><span class="cl">MaxStartups 10:30:60                   <span class="c1"># 未认证连接限制</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl restart sshd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 2. 密码策略 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/login.defs</span>
</span></span><span class="line"><span class="cl">PASS_MAX_DAYS   <span class="m">90</span>     <span class="c1"># 密码 90 天过期</span>
</span></span><span class="line"><span class="cl">PASS_MIN_DAYS   <span class="m">7</span>      <span class="c1"># 修改后 7 天内不可再改</span>
</span></span><span class="line"><span class="cl">PASS_MIN_LEN    <span class="m">12</span>     <span class="c1"># 最小 12 位</span>
</span></span><span class="line"><span class="cl">PASS_WARN_AGE   <span class="m">14</span>     <span class="c1"># 过期前 14 天警告</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/security/pwquality.conf</span>
</span></span><span class="line"><span class="cl"><span class="nv">minlen</span> <span class="o">=</span> <span class="m">12</span>
</span></span><span class="line"><span class="cl"><span class="nv">dcredit</span> <span class="o">=</span> -1            <span class="c1"># 至少 1 个数字</span>
</span></span><span class="line"><span class="cl"><span class="nv">ucredit</span> <span class="o">=</span> -1            <span class="c1"># 至少 1 个大写</span>
</span></span><span class="line"><span class="cl"><span class="nv">lcredit</span> <span class="o">=</span> -1            <span class="c1"># 至少 1 个小写</span>
</span></span><span class="line"><span class="cl"><span class="nv">ocredit</span> <span class="o">=</span> -1            <span class="c1"># 至少 1 个特殊字符</span>
</span></span><span class="line"><span class="cl"><span class="nv">minclass</span> <span class="o">=</span> <span class="m">4</span>            <span class="c1"># 至少 4 种字符类别</span>
</span></span><span class="line"><span class="cl"><span class="nv">maxrepeat</span> <span class="o">=</span> <span class="m">3</span>           <span class="c1"># 最多连续重复 3 次</span>
</span></span><span class="line"><span class="cl"><span class="nv">maxclassrepeat</span> <span class="o">=</span> <span class="m">3</span>      <span class="c1"># 同类字符最多连续 3 个</span>
</span></span><span class="line"><span class="cl"><span class="nv">difok</span> <span class="o">=</span> <span class="m">5</span>               <span class="c1"># 新密码与旧密码至少不同 5 个字符</span>
</span></span><span class="line"><span class="cl">enforce_for_root        <span class="c1"># root 也适用</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 3. 账户锁定 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/pam.d/sshd</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 连续 5 次失败后锁定 600 秒</span>
</span></span><span class="line"><span class="cl">auth required pam_tally2.so <span class="nv">deny</span><span class="o">=</span><span class="m">5</span> <span class="nv">unlock_time</span><span class="o">=</span><span class="m">600</span> <span class="nv">onerr</span><span class="o">=</span>fail audit
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 4. 会话超时 ===</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;TMOUT=600&#34;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;readonly TMOUT&#34;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;export TMOUT&#34;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 5. 历史命令限制 ===</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;HISTSIZE=500&#39;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;HISTFILESIZE=500&#39;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;readonly HISTSIZE HISTFILESIZE&#34;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s1">&#39;export HISTTIMEFORMAT=&#34;%F %T &#34;&#39;</span> &gt;&gt; /etc/profile
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 6. 限制 su/sudo ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 仅 wheel 组可 su</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/pam.d/su</span>
</span></span><span class="line"><span class="cl">auth required pam_wheel.so use_uid
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># sudo 日志审计</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/sudoers</span>
</span></span><span class="line"><span class="cl">Defaults <span class="nv">logfile</span><span class="o">=</span>/var/log/sudo.log
</span></span><span class="line"><span class="cl">Defaults log_input,log_output     <span class="c1"># 记录输入输出 (需 sudo 1.9+)</span>
</span></span><span class="line"><span class="cl">Defaults requiretty               <span class="c1"># 必须有 tty</span></span></span></code></pre></div>
</div>
<h3 id="62-防火墙管理">6.2 防火墙管理</h3>
<h4 id="firewalld-rhelcentos-7">firewalld (RHEL/CentOS 7+)</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 基础操作 ===</span>
</span></span><span class="line"><span class="cl">systemctl start firewalld
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> firewalld
</span></span><span class="line"><span class="cl">firewall-cmd --state
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看</span>
</span></span><span class="line"><span class="cl">firewall-cmd --list-all                    <span class="c1"># 当前区域详情</span>
</span></span><span class="line"><span class="cl">firewall-cmd --get-default-zone            <span class="c1"># 默认区域</span>
</span></span><span class="line"><span class="cl">firewall-cmd --get-active-zones            <span class="c1"># 活动区域</span>
</span></span><span class="line"><span class="cl">firewall-cmd --list-services              <span class="c1"># 已允许服务</span>
</span></span><span class="line"><span class="cl">firewall-cmd --list-ports                 <span class="c1"># 已允许端口</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 规则管理</span>
</span></span><span class="line"><span class="cl">firewall-cmd --add-port<span class="o">=</span>8080/tcp --permanent    <span class="c1"># 永久开放端口</span>
</span></span><span class="line"><span class="cl">firewall-cmd --add-service<span class="o">=</span>http --permanent      <span class="c1"># 开放服务</span>
</span></span><span class="line"><span class="cl">firewall-cmd --add-rich-rule<span class="o">=</span><span class="s1">&#39;rule family=&#34;ipv4&#34; source address=&#34;192.168.1.0/24&#34; port port=&#34;22&#34; protocol=&#34;tcp&#34; accept&#39;</span> --permanent  <span class="c1"># 仅允许特定 IP 段访问 SSH</span>
</span></span><span class="line"><span class="cl">firewall-cmd --remove-port<span class="o">=</span>8080/tcp --permanent  <span class="c1"># 删除</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重载</span>
</span></span><span class="line"><span class="cl">firewall-cmd --reload
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 区域切换</span>
</span></span><span class="line"><span class="cl">firewall-cmd --set-default-zone<span class="o">=</span>dmz
</span></span><span class="line"><span class="cl">firewall-cmd --change-interface<span class="o">=</span>ens33 --zone<span class="o">=</span>trusted --permanent
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 生产级规则示例 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 默认拒绝并只开放必要端口</span>
</span></span><span class="line"><span class="cl">firewall-cmd --set-default-zone<span class="o">=</span>drop
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-rich-rule<span class="o">=</span><span class="s1">&#39;rule family=&#34;ipv4&#34; source address=&#34;10.0.0.0/8&#34; port port=&#34;22&#34; protocol=&#34;tcp&#34; accept&#39;</span>
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-service<span class="o">=</span>http
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-service<span class="o">=</span>https
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-port<span class="o">=</span>9100/tcp    <span class="c1"># node_exporter</span>
</span></span><span class="line"><span class="cl">firewall-cmd --reload
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 端口转发 (NAT) ===</span>
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-masquerade
</span></span><span class="line"><span class="cl">firewall-cmd --permanent --add-forward-port<span class="o">=</span><span class="nv">port</span><span class="o">=</span>80:proto<span class="o">=</span>tcp:toport<span class="o">=</span>8080:toaddr<span class="o">=</span>192.168.1.100
</span></span><span class="line"><span class="cl">firewall-cmd --reload</span></span></code></pre></div>
</div>
<h4 id="iptables-传统通用">iptables (传统/通用)</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 默认策略 ===</span>
</span></span><span class="line"><span class="cl">iptables -P INPUT DROP
</span></span><span class="line"><span class="cl">iptables -P FORWARD DROP
</span></span><span class="line"><span class="cl">iptables -P OUTPUT ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 允许回环 ===</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -i lo -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 允许已建立连接 ===</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 允许 SSH ===</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">22</span> -s 10.0.0.0/8 -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 允许 Web ===</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">80</span> -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">443</span> -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 允许 ICMP (ping) ===</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 防 DDoS ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 限制 SYN 包速率</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst <span class="m">20</span> -j ACCEPT
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --syn -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 限制单个 IP 并发连接</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">80</span> -m connlimit --connlimit-above <span class="m">50</span> -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 端口转发 ===</span>
</span></span><span class="line"><span class="cl">iptables -t nat -A PREROUTING -p tcp --dport <span class="m">80</span> -j DNAT --to-destination 192.168.1.100:8080
</span></span><span class="line"><span class="cl">iptables -t nat -A POSTROUTING -j MASQUERADE
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 保存规则 ===</span>
</span></span><span class="line"><span class="cl">iptables-save &gt; /etc/sysconfig/iptables       <span class="c1"># CentOS 6</span>
</span></span><span class="line"><span class="cl">iptables-save &gt; /etc/iptables/rules.v4        <span class="c1"># Debian/Ubuntu</span>
</span></span><span class="line"><span class="cl">netfilter-persistent save                      <span class="c1"># iptables-persistent</span></span></span></code></pre></div>
</div>
<h3 id="63-selinux-管理">6.3 SELinux 管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 状态查看 ===</span>
</span></span><span class="line"><span class="cl">getenforce                          <span class="c1"># 查看模式</span>
</span></span><span class="line"><span class="cl">sestatus -v                         <span class="c1"># 详细状态</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 模式切换 ===</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">0</span>                        <span class="c1"># 临时切换为 Permissive</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">1</span>                        <span class="c1"># 启用 Enforcing</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 永久配置</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/selinux/config</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SELINUX=enforcing|permissive|disabled</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 上下文管理 ===</span>
</span></span><span class="line"><span class="cl">ls -Z /var/www/html/                <span class="c1"># 查看文件上下文</span>
</span></span><span class="line"><span class="cl">ps -Z                               <span class="c1"># 查看进程上下文</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">chcon -R -t httpd_sys_content_t /var/www/html/    <span class="c1"># 修改上下文</span>
</span></span><span class="line"><span class="cl">restorecon -Rv /var/www/html/                      <span class="c1"># 恢复默认上下文</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">semanage fcontext -a -t httpd_sys_content_t <span class="s2">&#34;/web(/.*)?&#34;</span>
</span></span><span class="line"><span class="cl">restorecon -Rv /web
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 布尔值管理 ===</span>
</span></span><span class="line"><span class="cl">getsebool -a                        <span class="c1"># 列出所有布尔值</span>
</span></span><span class="line"><span class="cl">setsebool -P httpd_can_network_connect on   <span class="c1"># 允许 Apache 网络连接</span>
</span></span><span class="line"><span class="cl">setsebool -P httpd_enable_homedirs on       <span class="c1"># 允许用户目录</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 端口管理 ===</span>
</span></span><span class="line"><span class="cl">semanage port -l                          <span class="c1"># 列出所有端口</span>
</span></span><span class="line"><span class="cl">semanage port -a -t http_port_t -p tcp <span class="m">8080</span>  <span class="c1"># 添加端口到类型</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 审计日志排错 ===</span>
</span></span><span class="line"><span class="cl">ausearch -m avc -ts recent           <span class="c1"># 查看最近的 AVC 拒绝</span>
</span></span><span class="line"><span class="cl">sealert -a /var/log/audit/audit.log  <span class="c1"># 分析审计日志</span>
</span></span><span class="line"><span class="cl">audit2allow -a -M mypol              <span class="c1"># 从审计日志生成策略模块</span>
</span></span><span class="line"><span class="cl">semodule -i mypol.pp                 <span class="c1"># 安装自定义模块</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === SELinux 排错流程 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 查看审计日志</span>
</span></span><span class="line"><span class="cl">ausearch -m avc -ts today <span class="p">|</span> grep denied
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 分析并提供建议</span>
</span></span><span class="line"><span class="cl">audit2why &lt; /var/log/audit/audit.log
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 临时切换 permissive 排查</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 测试应用</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 查看生成的 AVC</span>
</span></span><span class="line"><span class="cl">ausearch -m avc -ts recent
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 创建自定义策略</span>
</span></span><span class="line"><span class="cl">grep denied /var/log/audit/audit.log <span class="p">|</span> audit2allow -M custom_policy
</span></span><span class="line"><span class="cl">semodule -i custom_policy.pp
</span></span><span class="line"><span class="cl"><span class="c1"># 7. 恢复 enforcing</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">1</span></span></span></code></pre></div>
</div>
<h3 id="64-fail2ban-防暴力破解">6.4 fail2ban (防暴力破解)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">yum install -y fail2ban      <span class="c1"># CentOS</span>
</span></span><span class="line"><span class="cl">apt-get install -y fail2ban  <span class="c1"># Ubuntu</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/fail2ban/jail.local</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>DEFAULT<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">ignoreip</span> <span class="o">=</span> 127.0.0.1/8 10.0.0.0/8 192.168.0.0/16
</span></span><span class="line"><span class="cl"><span class="nv">bantime</span>  <span class="o">=</span> <span class="m">3600</span>                    <span class="c1"># 封禁时间 (秒)</span>
</span></span><span class="line"><span class="cl"><span class="nv">findtime</span> <span class="o">=</span> <span class="m">600</span>                     <span class="c1"># 统计窗口 (秒)</span>
</span></span><span class="line"><span class="cl"><span class="nv">maxretry</span> <span class="o">=</span> <span class="m">5</span>                       <span class="c1"># 最大失败次数</span>
</span></span><span class="line"><span class="cl"><span class="nv">destemail</span> <span class="o">=</span> ops@example.com
</span></span><span class="line"><span class="cl"><span class="nv">action</span> <span class="o">=</span> %<span class="o">(</span>action_mw<span class="o">)</span>s             <span class="c1"># 封禁 + whois + 邮件</span>
</span></span><span class="line"><span class="cl"><span class="nv">banaction</span> <span class="o">=</span> iptables-multiport
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>sshd<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">enabled</span>  <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">port</span>     <span class="o">=</span> ssh,2222
</span></span><span class="line"><span class="cl"><span class="nv">logpath</span>  <span class="o">=</span> %<span class="o">(</span>sshd_log<span class="o">)</span>s
</span></span><span class="line"><span class="cl"><span class="nv">maxretry</span> <span class="o">=</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>nginx-http-auth<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">enabled</span>  <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">port</span>     <span class="o">=</span> http,https
</span></span><span class="line"><span class="cl"><span class="nv">logpath</span>  <span class="o">=</span> /var/log/nginx/error.log
</span></span><span class="line"><span class="cl"><span class="nv">maxretry</span> <span class="o">=</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>nginx-botsearch<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">enabled</span>  <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">port</span>     <span class="o">=</span> http,https
</span></span><span class="line"><span class="cl"><span class="nv">logpath</span>  <span class="o">=</span> /var/log/nginx/access.log
</span></span><span class="line"><span class="cl"><span class="nv">maxretry</span> <span class="o">=</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="nv">findtime</span> <span class="o">=</span> <span class="m">300</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span>mysqld-auth<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">enabled</span>  <span class="o">=</span> <span class="nb">true</span>
</span></span><span class="line"><span class="cl"><span class="nv">port</span>     <span class="o">=</span> <span class="m">3306</span>
</span></span><span class="line"><span class="cl"><span class="nv">logpath</span>  <span class="o">=</span> /var/log/mysql/error.log
</span></span><span class="line"><span class="cl"><span class="nv">maxretry</span> <span class="o">=</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 管理命令</span>
</span></span><span class="line"><span class="cl">fail2ban-client status                       <span class="c1"># 查看状态</span>
</span></span><span class="line"><span class="cl">fail2ban-client status sshd                  <span class="c1"># 查看 sshd jail</span>
</span></span><span class="line"><span class="cl">fail2ban-client <span class="nb">set</span> sshd unbanip 1.2.3.4     <span class="c1"># 手动解封</span>
</span></span><span class="line"><span class="cl">fail2ban-client <span class="nb">set</span> sshd banip 1.2.3.4       <span class="c1"># 手动封禁</span>
</span></span><span class="line"><span class="cl">fail2ban-client reload                       <span class="c1"># 重载配置</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看封禁日志</span>
</span></span><span class="line"><span class="cl">grep <span class="s2">&#34;Ban&#34;</span> /var/log/fail2ban.log</span></span></code></pre></div>
</div>
<h3 id="65-系统审计-auditd">6.5 系统审计 (auditd)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">yum install -y audit             <span class="c1"># CentOS</span>
</span></span><span class="line"><span class="cl">apt-get install -y auditd        <span class="c1"># Ubuntu</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now auditd
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 审计规则 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/audit/rules.d/audit.rules</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 监控关键文件</span>
</span></span><span class="line"><span class="cl">-w /etc/passwd -p wa -k identity_changes
</span></span><span class="line"><span class="cl">-w /etc/shadow -p wa -k identity_changes
</span></span><span class="line"><span class="cl">-w /etc/group -p wa -k identity_changes
</span></span><span class="line"><span class="cl">-w /etc/sudoers -p wa -k sudo_changes
</span></span><span class="line"><span class="cl">-w /etc/ssh/sshd_config -p wa -k sshd_config
</span></span><span class="line"><span class="cl">-w /etc/crontab -p wa -k cron_changes
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 监控关键命令执行</span>
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">path</span><span class="o">=</span>/usr/bin/su -F <span class="nv">perm</span><span class="o">=</span>x -k su_exec
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">path</span><span class="o">=</span>/usr/bin/sudo -F <span class="nv">perm</span><span class="o">=</span>x -k sudo_exec
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 监控系统调用</span>
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">arch</span><span class="o">=</span>b64 -S execve -k command_exec
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 监控网络配置修改</span>
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">path</span><span class="o">=</span>/sbin/ifconfig -F <span class="nv">perm</span><span class="o">=</span>x -k net_config
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 监控时间修改</span>
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">arch</span><span class="o">=</span>b64 -S adjtimex -S settimeofday -k time_change
</span></span><span class="line"><span class="cl">-a always,exit -F <span class="nv">arch</span><span class="o">=</span>b64 -S clock_settime -k time_change
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 审计查询 ===</span>
</span></span><span class="line"><span class="cl">ausearch -k identity_changes            <span class="c1"># 按 key 查询</span>
</span></span><span class="line"><span class="cl">ausearch -f /etc/passwd                 <span class="c1"># 按文件查询</span>
</span></span><span class="line"><span class="cl">ausearch -p <span class="m">1234</span>                        <span class="c1"># 按 PID 查询</span>
</span></span><span class="line"><span class="cl">ausearch -ua root                       <span class="c1"># 按用户查询</span>
</span></span><span class="line"><span class="cl">ausearch -ts today                      <span class="c1"># 今天的审计记录</span>
</span></span><span class="line"><span class="cl">ausearch -m USER_LOGIN                  <span class="c1"># 登录事件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 生成报告</span>
</span></span><span class="line"><span class="cl">aureport -l                             <span class="c1"># 登录报告</span>
</span></span><span class="line"><span class="cl">aureport -k                             <span class="c1"># key 汇总</span>
</span></span><span class="line"><span class="cl">aureport -f                             <span class="c1"># 文件审计报告</span>
</span></span><span class="line"><span class="cl">aureport --summary                      <span class="c1"># 摘要</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 搜索失败事件</span>
</span></span><span class="line"><span class="cl">ausearch -m USER_LOGIN --success no</span></span></code></pre></div>
</div>
<h3 id="66-安全扫描">6.6 安全扫描</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === Lynis (系统安全审计) ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">git clone https://github.com/CISOfy/lynis
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> lynis <span class="o">&amp;&amp;</span> ./lynis audit system
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 快速审计</span>
</span></span><span class="line"><span class="cl">lynis audit system --quick
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === ClamAV (病毒扫描) ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">yum install -y clamav clamav-update    <span class="c1"># CentOS</span>
</span></span><span class="line"><span class="cl">apt-get install -y clamav              <span class="c1"># Ubuntu</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">freshclam                     <span class="c1"># 更新病毒库</span>
</span></span><span class="line"><span class="cl">clamscan -r /data             <span class="c1"># 递归扫描</span>
</span></span><span class="line"><span class="cl">clamscan -r --remove /tmp     <span class="c1"># 扫描并删除</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 定期扫描 crontab</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0 2 * * 0 clamscan -r /data --log=/var/log/clamav/scan.log</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === AIDE (文件完整性检查) ===</span>
</span></span><span class="line"><span class="cl">yum install -y aide
</span></span><span class="line"><span class="cl">aide --init                   <span class="c1"># 初始化数据库</span>
</span></span><span class="line"><span class="cl">cp /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
</span></span><span class="line"><span class="cl">aide --check                  <span class="c1"># 检查变更</span>
</span></span><span class="line"><span class="cl">aide --update                 <span class="c1"># 更新基线数据库</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === OpenSCAP (合规检查) ===</span>
</span></span><span class="line"><span class="cl">yum install -y openscap-scanner scap-security-guide
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 检查系统合规性 (CIS 基线)</span>
</span></span><span class="line"><span class="cl">oscap xccdf <span class="nb">eval</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --profile xccdf_org.ssgproject.content_profile_cis <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --results scan-results.xml <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --report scan-report.html <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml</span></span></code></pre></div>
</div>
<hr>
<h2 id="第七章性能调优">第七章：性能调优</h2>
<h3 id="71-内核参数调优">7.1 内核参数调优</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 核心内核参数 (/etc/sysctl.d/99-tuning.conf) ===</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ===== 网络调优 =====</span>
</span></span><span class="line"><span class="cl"><span class="c1"># TCP 连接复用 (快速回收 TIME_WAIT)</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_tw_reuse <span class="o">=</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_tw_recycle <span class="o">=</span> <span class="m">0</span>          <span class="c1"># 4.12+ 已移除，设为 0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># TIME_WAIT 与端口范围</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_fin_timeout <span class="o">=</span> <span class="m">30</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_max_tw_buckets <span class="o">=</span> <span class="m">10000</span>
</span></span><span class="line"><span class="cl">net.ipv4.ip_local_port_range <span class="o">=</span> <span class="m">1024</span> <span class="m">65000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># TCP 缓冲区 (高吞吐场景)</span>
</span></span><span class="line"><span class="cl">net.core.rmem_max <span class="o">=</span> <span class="m">134217728</span>        <span class="c1"># 128MB</span>
</span></span><span class="line"><span class="cl">net.core.wmem_max <span class="o">=</span> <span class="m">134217728</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_rmem <span class="o">=</span> <span class="m">4096</span> <span class="m">87380</span> <span class="m">134217728</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_wmem <span class="o">=</span> <span class="m">4096</span> <span class="m">65536</span> <span class="m">134217728</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_mem <span class="o">=</span> <span class="m">50576</span> <span class="m">64768</span> <span class="m">98152</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># TCP Fast Open</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_fastopen <span class="o">=</span> <span class="m">3</span>            <span class="c1"># 客户端 + 服务端</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># BBR 拥塞控制 (4.9+)</span>
</span></span><span class="line"><span class="cl">net.core.default_qdisc <span class="o">=</span> fq
</span></span><span class="line"><span class="cl">net.ipv4.tcp_congestion_control <span class="o">=</span> bbr
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 连接队列</span>
</span></span><span class="line"><span class="cl">net.core.somaxconn <span class="o">=</span> <span class="m">65535</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_max_syn_backlog <span class="o">=</span> <span class="m">8192</span>
</span></span><span class="line"><span class="cl">net.core.netdev_max_backlog <span class="o">=</span> <span class="m">10000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Keepalive</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_keepalive_time <span class="o">=</span> <span class="m">600</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_keepalive_intvl <span class="o">=</span> <span class="m">60</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_keepalive_probes <span class="o">=</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># SYN Flood 防护</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_syncookies <span class="o">=</span> <span class="m">1</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_synack_retries <span class="o">=</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl">net.ipv4.tcp_syn_retries <span class="o">=</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ===== 文件系统与 IO =====</span>
</span></span><span class="line"><span class="cl"><span class="c1"># VM 参数</span>
</span></span><span class="line"><span class="cl">vm.swappiness <span class="o">=</span> <span class="m">1</span>                    <span class="c1"># 尽量不用 swap (SSD 推荐 1)</span>
</span></span><span class="line"><span class="cl">vm.dirty_ratio <span class="o">=</span> <span class="m">30</span>
</span></span><span class="line"><span class="cl">vm.dirty_background_ratio <span class="o">=</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl">vm.dirty_expire_centisecs <span class="o">=</span> <span class="m">3000</span>
</span></span><span class="line"><span class="cl">vm.dirty_writeback_centisecs <span class="o">=</span> <span class="m">500</span>
</span></span><span class="line"><span class="cl">vm.vfs_cache_pressure <span class="o">=</span> <span class="m">50</span>          <span class="c1"># 保留更多 inode/dentry 缓存</span>
</span></span><span class="line"><span class="cl">vm.min_free_kbytes <span class="o">=</span> <span class="m">131072</span>          <span class="c1"># 128MB 最小空闲内存</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 文件描述符</span>
</span></span><span class="line"><span class="cl">fs.file-max <span class="o">=</span> <span class="m">655350</span>
</span></span><span class="line"><span class="cl">fs.nr_open <span class="o">=</span> <span class="m">1048576</span>
</span></span><span class="line"><span class="cl">fs.inotify.max_user_watches <span class="o">=</span> <span class="m">524288</span>
</span></span><span class="line"><span class="cl">fs.inotify.max_user_instances <span class="o">=</span> <span class="m">1024</span>
</span></span><span class="line"><span class="cl">fs.aio-max-nr <span class="o">=</span> <span class="m">1048576</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># ===== 内核调度 =====</span>
</span></span><span class="line"><span class="cl">kernel.pid_max <span class="o">=</span> <span class="m">4194303</span>
</span></span><span class="line"><span class="cl">kernel.threads-max <span class="o">=</span> <span class="m">256000</span>
</span></span><span class="line"><span class="cl">kernel.msgmax <span class="o">=</span> <span class="m">65536</span>
</span></span><span class="line"><span class="cl">kernel.msgmnb <span class="o">=</span> <span class="m">65536</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 应用配置</span>
</span></span><span class="line"><span class="cl">sysctl -p /etc/sysctl.d/99-tuning.conf</span></span></code></pre></div>
</div>
<h3 id="72-资源限制">7.2 资源限制</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/security/limits.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># &lt;domain&gt; &lt;type&gt; &lt;item&gt; &lt;value&gt;</span>
</span></span><span class="line"><span class="cl">*       soft    nofile          <span class="m">65535</span>
</span></span><span class="line"><span class="cl">*       hard    nofile          <span class="m">65535</span>
</span></span><span class="line"><span class="cl">*       soft    nproc           <span class="m">65535</span>
</span></span><span class="line"><span class="cl">*       hard    nproc           <span class="m">65535</span>
</span></span><span class="line"><span class="cl">root    soft    nofile          <span class="m">65535</span>
</span></span><span class="line"><span class="cl">root    hard    nofile          <span class="m">65535</span>
</span></span><span class="line"><span class="cl">nginx   soft    nofile          <span class="m">100000</span>
</span></span><span class="line"><span class="cl">nginx   hard    nofile          <span class="m">100000</span>
</span></span><span class="line"><span class="cl">mysql   soft    nofile          <span class="m">100000</span>
</span></span><span class="line"><span class="cl">mysql   hard    nofile          <span class="m">100000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># systemd 服务资源限制</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/systemd/system/myservice.service.d/limits.conf</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">LimitNOFILE</span><span class="o">=</span><span class="m">65535</span>
</span></span><span class="line"><span class="cl"><span class="nv">LimitNPROC</span><span class="o">=</span><span class="m">65535</span>
</span></span><span class="line"><span class="cl"><span class="nv">LimitCORE</span><span class="o">=</span>infinity
</span></span><span class="line"><span class="cl"><span class="nv">MemoryLimit</span><span class="o">=</span>2G
</span></span><span class="line"><span class="cl"><span class="nv">CPUQuota</span><span class="o">=</span>200%
</span></span><span class="line"><span class="cl"><span class="nv">TasksMax</span><span class="o">=</span><span class="m">2048</span></span></span></code></pre></div>
</div>
<h3 id="73-cpu-性能优化">7.3 CPU 性能优化</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === CPU 调度策略 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 查看当前策略</span>
</span></span><span class="line"><span class="cl">cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设为 performance (服务器推荐)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># CentOS/RHEL</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;GOVERNOR=performance&#34;</span> &gt;&gt; /etc/sysconfig/cpufreq
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 或直接</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> CPU in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> performance &gt; <span class="nv">$CPU</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === CPU 亲和性 (IRQ 绑定) ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 查看中断</span>
</span></span><span class="line"><span class="cl">cat /proc/interrupts
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 将网卡中断绑定到特定 CPU</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">2</span> &gt; /proc/irq/89/smp_affinity    <span class="c1"># 绑定到 CPU1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 使用 irqbalance (自动平衡，一般开启即可)</span>
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now irqbalance
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># NUMA 感知</span>
</span></span><span class="line"><span class="cl">numactl --hardware                            <span class="c1"># 查看 NUMA 拓扑</span>
</span></span><span class="line"><span class="cl">numactl --cpunodebind<span class="o">=</span><span class="m">0</span> --membind<span class="o">=</span><span class="m">0</span> nginx     <span class="c1"># 绑定到 NUMA node 0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === CPU 隔离 (实时/低延迟场景) ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/default/grub</span>
</span></span><span class="line"><span class="cl"><span class="c1"># GRUB_CMDLINE_LINUX=&#34;isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 然后: grub2-mkconfig -o /boot/grub2/grub.cfg</span></span></span></code></pre></div>
</div>
<h3 id="74-内存调优">7.4 内存调优</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 查看内存状况 ===</span>
</span></span><span class="line"><span class="cl">free -h
</span></span><span class="line"><span class="cl">cat /proc/meminfo
</span></span><span class="line"><span class="cl">vmstat <span class="m">1</span> <span class="m">10</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 查看进程内存详情 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># PSS (比例分摊共享内存)</span>
</span></span><span class="line"><span class="cl">smem -r -s pss
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 大页内存 (HugePages)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 适合大内存数据库</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;vm.nr_hugepages = 1024&#34;</span> &gt;&gt; /etc/sysctl.d/99-hugepages.conf
</span></span><span class="line"><span class="cl">sysctl -p /etc/sysctl.d/99-hugepages.conf
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 查看大页使用</span>
</span></span><span class="line"><span class="cl">cat /proc/meminfo <span class="p">|</span> grep Huge
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># transparent hugepage (数据库通常建议关闭)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/enabled
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> never &gt; /sys/kernel/mm/transparent_hugepage/defrag
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === OOM Killer 控制 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 保护关键进程</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -1000 &gt; /proc/<span class="k">$(</span>pgrep sshd<span class="k">)</span>/oom_score_adj   <span class="c1"># 永不 kill (范围 -1000 ~ 1000)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/systemd/system/mysqld.service.d/oom.conf</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span>Service<span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="nv">OOMScoreAdjust</span><span class="o">=</span>-800
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 内存泄漏排查 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 监控进程内存增长</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> true<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    ps -eo pid,ppid,cmd,%mem,%cpu,rss --sort<span class="o">=</span>-rss <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">    sleep <span class="m">10</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<h3 id="75-磁盘-io-调优">7.5 磁盘 IO 调优</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === IO 调度器 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 查看当前调度器</span>
</span></span><span class="line"><span class="cl">cat /sys/block/sda/queue/scheduler
</span></span><span class="line"><span class="cl"><span class="c1"># [mq-deadline] kyber bfq none</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 设置 (SSD 推荐 none / mq-deadline)</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> none &gt; /sys/block/sda/queue/scheduler
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> mq-deadline &gt; /sys/block/sda/queue/scheduler
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 永久设置 (grub)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># GRUB_CMDLINE_LINUX=&#34;elevator=noop&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 磁盘队列深度 ===</span>
</span></span><span class="line"><span class="cl">cat /sys/block/sda/queue/nr_requests
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1024</span> &gt; /sys/block/sda/queue/nr_requests
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 预读大小 ===</span>
</span></span><span class="line"><span class="cl">blockdev --getra /dev/sda
</span></span><span class="line"><span class="cl">blockdev --setra <span class="m">8192</span> /dev/sda   <span class="c1"># 设为 4MB (8192 个扇区)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 文件系统挂载选项 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># SSD 优化</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/fstab</span>
</span></span><span class="line"><span class="cl"><span class="nv">UUID</span><span class="o">=</span>xxx  /data  ext4  defaults,noatime,nodiratime,discard  <span class="m">0</span>  <span class="m">0</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># noatime     : 不记录访问时间</span>
</span></span><span class="line"><span class="cl"><span class="c1"># nodiratime  : 不记录目录访问时间</span>
</span></span><span class="line"><span class="cl"><span class="c1"># discard     : 启用 TRIM (或使用 fstrim)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># nobarrier   : 关闭写屏障 (有电池的 RAID 卡)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === fstrim (SSD TRIM) ===</span>
</span></span><span class="line"><span class="cl">fstrim -v /data               <span class="c1"># 手动 TRIM</span>
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> fstrim.timer <span class="c1"># 启动定时 TRIM</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === IO 性能测试 ===</span>
</span></span><span class="line"><span class="cl">fio --name<span class="o">=</span>randwrite --ioengine<span class="o">=</span>libaio --iodepth<span class="o">=</span><span class="m">32</span> --rw<span class="o">=</span>randwrite <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --bs<span class="o">=</span>4k --size<span class="o">=</span>2G --numjobs<span class="o">=</span><span class="m">4</span> --runtime<span class="o">=</span><span class="m">60</span> --group_reporting <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --filename<span class="o">=</span>/data/test --direct<span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">fio --name<span class="o">=</span>randread --ioengine<span class="o">=</span>libaio --iodepth<span class="o">=</span><span class="m">32</span> --rw<span class="o">=</span>randread <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --bs<span class="o">=</span>4k --size<span class="o">=</span>2G --numjobs<span class="o">=</span><span class="m">4</span> --runtime<span class="o">=</span><span class="m">60</span> --group_reporting <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --filename<span class="o">=</span>/data/test --direct<span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === iotop (实时 IO 监控) ===</span>
</span></span><span class="line"><span class="cl">iotop -o           <span class="c1"># 仅显示有 IO 的进程</span>
</span></span><span class="line"><span class="cl">iotop -oP          <span class="c1"># 进程级别</span>
</span></span><span class="line"><span class="cl">iotop -b -n <span class="m">3</span>      <span class="c1"># 批处理模式，3 次</span></span></span></code></pre></div>
</div>
<h3 id="76-性能分析工具速查">7.6 性能分析工具速查</h3>
<table>
  <thead>
      <tr>
          <th>工具</th>
          <th>用途</th>
          <th>典型命令</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>top/htop</code></td>
          <td>进程监控</td>
          <td><code>htop -u mysql</code></td>
      </tr>
      <tr>
          <td><code>vmstat</code></td>
          <td>内存/IO/CPU</td>
          <td><code>vmstat 1 10</code></td>
      </tr>
      <tr>
          <td><code>iostat</code></td>
          <td>磁盘 IO</td>
          <td><code>iostat -xz 1</code></td>
      </tr>
      <tr>
          <td><code>sar</code></td>
          <td>系统活动报告</td>
          <td><code>sar -n DEV 1</code></td>
      </tr>
      <tr>
          <td><code>mpstat</code></td>
          <td>CPU 统计</td>
          <td><code>mpstat -P ALL 1</code></td>
      </tr>
      <tr>
          <td><code>pidstat</code></td>
          <td>进程性能</td>
          <td><code>pidstat -d 1</code></td>
      </tr>
      <tr>
          <td><code>perf</code></td>
          <td>性能采样</td>
          <td><code>perf top -g</code></td>
      </tr>
      <tr>
          <td><code>strace</code></td>
          <td>系统调用追踪</td>
          <td><code>strace -c -p PID</code></td>
      </tr>
      <tr>
          <td><code>ltrace</code></td>
          <td>库调用追踪</td>
          <td><code>ltrace -p PID</code></td>
      </tr>
      <tr>
          <td><code>bpftrace</code></td>
          <td>动态追踪</td>
          <td><code>bpftrace -e 'kprobe:vfs_read { @[comm]=count(); }'</code></td>
      </tr>
      <tr>
          <td><code>dstat</code></td>
          <td>综合系统资源</td>
          <td><code>dstat -tcmdns</code></td>
      </tr>
      <tr>
          <td><code>nethogs</code></td>
          <td>进程网络流量</td>
          <td><code>nethogs ens33</code></td>
      </tr>
      <tr>
          <td><code>iperf3</code></td>
          <td>网络带宽测试</td>
          <td><code>iperf3 -s / iperf3 -c host</code></td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="第八章高可用与负载均衡">第八章：高可用与负载均衡</h2>
<h3 id="81-keepalived-vrrp-高可用">8.1 Keepalived (VRRP 高可用)</h3>
<h4 id="811-原理">8.1.1 原理</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>VIP: 192.168.1.100 (虚拟 IP)

┌─────────────────┐     ┌─────────────────┐
│    Master        │     │    Backup       │
│  192.168.1.11    │────▶│  192.168.1.12   │
│  priority=100    │ VRRP│  priority=90    │
└─────────────────┘     └─────────────────┘
        │                       │
        └───────────┬───────────┘
                    │
              ┌─────┴─────┐
              │ 后端服务    │
              │ 192.168.1.20│
              └───────────┘</code></pre>
</div>
<h4 id="812-keepalived-配置">8.1.2 Keepalived 配置</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">yum install -y keepalived    <span class="c1"># CentOS</span>
</span></span><span class="line"><span class="cl">apt-get install -y keepalived  <span class="c1"># Ubuntu</span></span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/keepalived/keepalived.conf (Master)</span>
</span></span><span class="line"><span class="cl">global_defs <span class="o">{</span>
</span></span><span class="line"><span class="cl">    router_id web_lb_01
</span></span><span class="line"><span class="cl">    <span class="c1"># 通知脚本</span>
</span></span><span class="line"><span class="cl">    notification_email <span class="o">{</span>
</span></span><span class="line"><span class="cl">        ops@example.com
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">    notification_email_from keepalived@example.com
</span></span><span class="line"><span class="cl">    smtp_server smtp.example.com
</span></span><span class="line"><span class="cl">    smtp_connect_timeout <span class="m">30</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 健康检查脚本</span>
</span></span><span class="line"><span class="cl">vrrp_script chk_nginx <span class="o">{</span>
</span></span><span class="line"><span class="cl">    script <span class="s2">&#34;/usr/bin/killall -0 nginx&#34;</span>    <span class="c1"># 检查 nginx 进程</span>
</span></span><span class="line"><span class="cl">    interval <span class="m">2</span>
</span></span><span class="line"><span class="cl">    weight -20
</span></span><span class="line"><span class="cl">    fall <span class="m">3</span>          <span class="c1"># 连续 3 次失败触发切换</span>
</span></span><span class="line"><span class="cl">    rise <span class="m">2</span>          <span class="c1"># 连续 2 次成功恢复</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">vrrp_instance VI_1 <span class="o">{</span>
</span></span><span class="line"><span class="cl">    state MASTER
</span></span><span class="line"><span class="cl">    interface ens33
</span></span><span class="line"><span class="cl">    virtual_router_id <span class="m">51</span>
</span></span><span class="line"><span class="cl">    priority <span class="m">100</span>
</span></span><span class="line"><span class="cl">    advert_int <span class="m">1</span>
</span></span><span class="line"><span class="cl">    nopreempt          <span class="c1"># 不抢占 (故障恢复后不自动切回)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    authentication <span class="o">{</span>
</span></span><span class="line"><span class="cl">        auth_type PASS
</span></span><span class="line"><span class="cl">        auth_pass your_password
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    virtual_ipaddress <span class="o">{</span>
</span></span><span class="line"><span class="cl">        192.168.1.100/24 dev ens33
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    track_script <span class="o">{</span>
</span></span><span class="line"><span class="cl">        chk_nginx        <span class="c1"># 关联健康检查</span>
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 状态切换通知</span>
</span></span><span class="line"><span class="cl">    notify_master <span class="s2">&#34;/opt/scripts/notify.sh master&#34;</span>
</span></span><span class="line"><span class="cl">    notify_backup <span class="s2">&#34;/opt/scripts/notify.sh backup&#34;</span>
</span></span><span class="line"><span class="cl">    notify_fault  <span class="s2">&#34;/opt/scripts/notify.sh fault&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span></span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># /etc/keepalived/keepalived.conf (Backup)</span>
</span></span><span class="line"><span class="cl">global_defs <span class="o">{</span>
</span></span><span class="line"><span class="cl">    router_id web_lb_02
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">vrrp_script chk_nginx <span class="o">{</span>
</span></span><span class="line"><span class="cl">    script <span class="s2">&#34;/usr/bin/killall -0 nginx&#34;</span>
</span></span><span class="line"><span class="cl">    interval <span class="m">2</span>
</span></span><span class="line"><span class="cl">    weight -20
</span></span><span class="line"><span class="cl">    fall <span class="m">3</span>
</span></span><span class="line"><span class="cl">    rise <span class="m">2</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">vrrp_instance VI_1 <span class="o">{</span>
</span></span><span class="line"><span class="cl">    state BACKUP
</span></span><span class="line"><span class="cl">    interface ens33
</span></span><span class="line"><span class="cl">    virtual_router_id <span class="m">51</span>
</span></span><span class="line"><span class="cl">    priority <span class="m">90</span>
</span></span><span class="line"><span class="cl">    advert_int <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    authentication <span class="o">{</span>
</span></span><span class="line"><span class="cl">        auth_type PASS
</span></span><span class="line"><span class="cl">        auth_pass your_password
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    virtual_ipaddress <span class="o">{</span>
</span></span><span class="line"><span class="cl">        192.168.1.100/24 dev ens33
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    track_script <span class="o">{</span>
</span></span><span class="line"><span class="cl">        chk_nginx
</span></span><span class="line"><span class="cl">    <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 允许非本地 IP 绑定 (使得 Backup 也能绑定 VIP)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># echo &#34;net.ipv4.ip_nonlocal_bind = 1&#34; &gt;&gt; /etc/sysctl.d/99-keepalived.conf</span>
</span></span><span class="line"><span class="cl"><span class="c1"># sysctl -p /etc/sysctl.d/99-keepalived.conf</span></span></span></code></pre></div>
</div>
<h3 id="82-haproxy-负载均衡">8.2 HAProxy 负载均衡</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 安装</span>
</span></span><span class="line"><span class="cl">yum install -y haproxy    <span class="c1"># CentOS</span>
</span></span><span class="line"><span class="cl">apt-get install -y haproxy  <span class="c1"># Ubuntu</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 完整配置 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/haproxy/haproxy.cfg</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">global
</span></span><span class="line"><span class="cl">    log /dev/log local0
</span></span><span class="line"><span class="cl">    log /dev/log local1 notice
</span></span><span class="line"><span class="cl">    chroot /var/lib/haproxy
</span></span><span class="line"><span class="cl">    user haproxy
</span></span><span class="line"><span class="cl">    group haproxy
</span></span><span class="line"><span class="cl">    daemon
</span></span><span class="line"><span class="cl">    maxconn <span class="m">50000</span>
</span></span><span class="line"><span class="cl">    spread-checks <span class="m">5</span>
</span></span><span class="line"><span class="cl">    stats socket /var/run/haproxy.sock mode <span class="m">600</span> level admin
</span></span><span class="line"><span class="cl">    stats timeout 2m
</span></span><span class="line"><span class="cl">    tune.ssl.default-dh-param <span class="m">2048</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">defaults
</span></span><span class="line"><span class="cl">    log     global
</span></span><span class="line"><span class="cl">    mode    http
</span></span><span class="line"><span class="cl">    option  httplog
</span></span><span class="line"><span class="cl">    option  dontlognull
</span></span><span class="line"><span class="cl">    option  redispatch
</span></span><span class="line"><span class="cl">    retries <span class="m">3</span>
</span></span><span class="line"><span class="cl">    timeout connect 5s
</span></span><span class="line"><span class="cl">    timeout client  50s
</span></span><span class="line"><span class="cl">    timeout server  50s
</span></span><span class="line"><span class="cl">    timeout http-request 10s
</span></span><span class="line"><span class="cl">    timeout http-keep-alive 10s
</span></span><span class="line"><span class="cl">    timeout check 5s
</span></span><span class="line"><span class="cl">    maxconn <span class="m">5000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 前端 ===</span>
</span></span><span class="line"><span class="cl">frontend web_frontend
</span></span><span class="line"><span class="cl">    <span class="nb">bind</span> *:80
</span></span><span class="line"><span class="cl">    <span class="nb">bind</span> *:443 ssl crt /etc/haproxy/certs/combined.pem alpn h2,http/1.1
</span></span><span class="line"><span class="cl">    <span class="c1"># HTTP 重定向到 HTTPS</span>
</span></span><span class="line"><span class="cl">    redirect scheme https <span class="k">if</span> !<span class="o">{</span> ssl_fc <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># ACL</span>
</span></span><span class="line"><span class="cl">    acl is_api path_beg /api
</span></span><span class="line"><span class="cl">    acl is_admin path_beg /admin
</span></span><span class="line"><span class="cl">    acl is_static path_end .jpg .png .css .js .woff2
</span></span><span class="line"><span class="cl">    acl blocked_ua hdr_sub<span class="o">(</span>User-Agent<span class="o">)</span> -i curl wget
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 按路径路由</span>
</span></span><span class="line"><span class="cl">    use_backend api_backend <span class="k">if</span> is_api
</span></span><span class="line"><span class="cl">    use_backend admin_backend <span class="k">if</span> is_admin
</span></span><span class="line"><span class="cl">    use_backend static_backend <span class="k">if</span> is_static
</span></span><span class="line"><span class="cl">    default_backend web_backend
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 拒绝特定 User-Agent</span>
</span></span><span class="line"><span class="cl">    http-request deny <span class="k">if</span> blocked_ua
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 限速 (每 IP 每秒 100 请求)</span>
</span></span><span class="line"><span class="cl">    stick-table <span class="nb">type</span> ip size 1m expire 10s store http_req_rate<span class="o">(</span>10s<span class="o">)</span>
</span></span><span class="line"><span class="cl">    http-request track-sc0 src
</span></span><span class="line"><span class="cl">    http-request deny <span class="k">if</span> <span class="o">{</span> sc_http_req_rate<span class="o">(</span>0<span class="o">)</span> gt <span class="m">100</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 后端 ===</span>
</span></span><span class="line"><span class="cl">backend web_backend
</span></span><span class="line"><span class="cl">    balance roundrobin
</span></span><span class="line"><span class="cl">    option httpchk GET /health
</span></span><span class="line"><span class="cl">    http-check expect status <span class="m">200</span>
</span></span><span class="line"><span class="cl">    default-server inter 3s rise <span class="m">2</span> fall <span class="m">3</span> maxconn <span class="m">1000</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    server web01 192.168.1.11:8080 check weight <span class="m">100</span>
</span></span><span class="line"><span class="cl">    server web02 192.168.1.12:8080 check weight <span class="m">100</span>
</span></span><span class="line"><span class="cl">    server web03 192.168.1.13:8080 check weight <span class="m">100</span> backup  <span class="c1"># 备用节点</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># Cookie 会话保持</span>
</span></span><span class="line"><span class="cl">    cookie SERVERID insert indirect nocache
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="c1"># 长连接</span>
</span></span><span class="line"><span class="cl">    option http-keep-alive
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">api_backend
</span></span><span class="line"><span class="cl">    balance leastconn
</span></span><span class="line"><span class="cl">    option httpchk GET /api/health
</span></span><span class="line"><span class="cl">    http-check expect status <span class="m">200</span>
</span></span><span class="line"><span class="cl">    default-server inter 2s rise <span class="m">2</span> fall <span class="m">2</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    server api01 192.168.1.11:8081 check
</span></span><span class="line"><span class="cl">    server api02 192.168.1.12:8081 check
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">static_backend
</span></span><span class="line"><span class="cl">    balance uri
</span></span><span class="line"><span class="cl">    option httpchk HEAD /health
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    server static01 192.168.1.11:8082 check
</span></span><span class="line"><span class="cl">    server static02 192.168.1.12:8082 check
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === TCP 模式 (MySQL 代理) ===</span>
</span></span><span class="line"><span class="cl">listen mysql_proxy
</span></span><span class="line"><span class="cl">    <span class="nb">bind</span> *:3307
</span></span><span class="line"><span class="cl">    mode tcp
</span></span><span class="line"><span class="cl">    balance leastconn
</span></span><span class="line"><span class="cl">    option mysql-check user haproxy_check
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    server db01 192.168.1.21:3306 check inter 3s
</span></span><span class="line"><span class="cl">    server db02 192.168.1.22:3306 check inter 3s backup
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 统计页面 ===</span>
</span></span><span class="line"><span class="cl">listen stats
</span></span><span class="line"><span class="cl">    <span class="nb">bind</span> *:9000
</span></span><span class="line"><span class="cl">    mode http
</span></span><span class="line"><span class="cl">    stats <span class="nb">enable</span>
</span></span><span class="line"><span class="cl">    stats uri /stats
</span></span><span class="line"><span class="cl">    stats realm HAProxy<span class="se">\ </span>Statistics
</span></span><span class="line"><span class="cl">    stats auth admin:your_password
</span></span><span class="line"><span class="cl">    stats refresh 10s
</span></span><span class="line"><span class="cl">    stats admin <span class="k">if</span> TRUE</span></span></code></pre></div>
</div>
<h4 id="负载均衡算法对比">负载均衡算法对比</h4>
<table>
  <thead>
      <tr>
          <th>算法</th>
          <th>适用场景</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>roundrobin</code></td>
          <td>通用 Web</td>
          <td>轮询，权重越大分配越多</td>
      </tr>
      <tr>
          <td><code>leastconn</code></td>
          <td>长连接 (DB/WebSocket)</td>
          <td>最少连接优先</td>
      </tr>
      <tr>
          <td><code>source</code></td>
          <td>需要会话保持</td>
          <td>源 IP 哈希</td>
      </tr>
      <tr>
          <td><code>uri</code></td>
          <td>静态文件/Cache</td>
          <td>URI 哈希 (配合缓存)</td>
      </tr>
      <tr>
          <td><code>url_param</code></td>
          <td>带参数路由</td>
          <td>URL 参数哈希</td>
      </tr>
      <tr>
          <td><code>hdr</code></td>
          <td>HTTP 头路由</td>
          <td>基于 HTTP Header</td>
      </tr>
      <tr>
          <td><code>first</code></td>
          <td>最小连接组</td>
          <td>第一台可用</td>
      </tr>
  </tbody>
</table>
<h3 id="83-lvs-linux-virtual-server">8.3 LVS (Linux Virtual Server)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === DR 模式 (Direct Routing, 性能最高) ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Director 配置 (192.168.1.10)</span>
</span></span><span class="line"><span class="cl">ipvsadm -A -t 192.168.1.100:80 -s wrr
</span></span><span class="line"><span class="cl">ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.11 -g -w <span class="m">100</span>
</span></span><span class="line"><span class="cl">ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.12 -g -w <span class="m">100</span>
</span></span><span class="line"><span class="cl">ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.13 -g -w <span class="m">80</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">ipvsadm -Ln    <span class="c1"># 查看规则</span>
</span></span><span class="line"><span class="cl">ipvsadm -Sn    <span class="c1"># 保存规则</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Real Server 配置 (每台)</span>
</span></span><span class="line"><span class="cl">ifconfig lo:0 192.168.1.100 netmask 255.255.255.255 up
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv4/conf/all/arp_ignore
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">2</span> &gt; /proc/sys/net/ipv4/conf/all/arp_announce
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">1</span> &gt; /proc/sys/net/ipv4/conf/lo/arp_ignore
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="m">2</span> &gt; /proc/sys/net/ipv4/conf/lo/arp_announce
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 调度算法 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># rr     : 轮询</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wrr    : 加权轮询</span>
</span></span><span class="line"><span class="cl"><span class="c1"># lc     : 最少连接</span>
</span></span><span class="line"><span class="cl"><span class="c1"># wlc    : 加权最少连接 (默认)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># lblc   : 基于局部性最少连接</span>
</span></span><span class="line"><span class="cl"><span class="c1"># dh     : 目标哈希</span>
</span></span><span class="line"><span class="cl"><span class="c1"># sh     : 源地址哈希</span></span></span></code></pre></div>
</div>
<h3 id="84-高可用方案对比">8.4 高可用方案对比</h3>
<table>
  <thead>
      <tr>
          <th>方案</th>
          <th>层次</th>
          <th>性能</th>
          <th>复杂度</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Keepalived + Nginx</td>
          <td>L3/L7</td>
          <td>高</td>
          <td>中</td>
          <td>Web 服务</td>
      </tr>
      <tr>
          <td>Keepalived + HAProxy</td>
          <td>L3/L7</td>
          <td>高</td>
          <td>中</td>
          <td>通用 4/7 层</td>
      </tr>
      <tr>
          <td>LVS + Keepalived</td>
          <td>L4</td>
          <td>极高</td>
          <td>高</td>
          <td>大规模流量入口</td>
      </tr>
      <tr>
          <td>Nginx + Nginx</td>
          <td>L7</td>
          <td>中</td>
          <td>低</td>
          <td>中小 Web</td>
      </tr>
      <tr>
          <td>云 LB (SLB/ELB)</td>
          <td>L4/L7</td>
          <td>极高</td>
          <td>低</td>
          <td>云环境</td>
      </tr>
      <tr>
          <td>DNS 轮询</td>
          <td>DNS</td>
          <td>低</td>
          <td>极低</td>
          <td>简单分发</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="第九章网络诊断与排错">第九章：网络诊断与排错</h2>
<h3 id="91-网络诊断方法论">9.1 网络诊断方法论</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>应用层 → 检查服务状态、端口监听、应用日志
传输层 → 检查端口连通性、防火墙规则、连接状态
网络层 → 检查路由、IP 配置、ICMP 可达性
链路层 → 检查 ARP、网卡状态、交换机端口
物理层 → 检查网线、光模块、网卡灯</code></pre>
</div>
<h4 id="排错顺序-自底向上">排错顺序 (自底向上)</h4>
<ol>
<li>物理链路 (<code>ethtool</code>, <code>ip link</code>)</li>
<li>IP 配置 (<code>ip addr</code>, <code>ip route</code>)</li>
<li>网关可达性 (<code>ping 网关</code>, <code>traceroute</code>)</li>
<li>DNS 解析 (<code>dig</code>, <code>nslookup</code>)</li>
<li>端口连通性 (<code>telnet</code>, <code>nc</code>, <code>nmap</code>)</li>
<li>服务状态 (<code>ss</code>, <code>netstat</code>, 应用日志)</li>
</ol>
<h3 id="92-tcpdump-抓包分析">9.2 tcpdump 抓包分析</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 基础抓包 ===</span>
</span></span><span class="line"><span class="cl">tcpdump -i any -nn                           <span class="c1"># 所有接口，不解析主机名和端口</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn host 192.168.1.100      <span class="c1"># 过滤主机</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn port <span class="m">80</span>                 <span class="c1"># 过滤端口</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn src 192.168.1.100       <span class="c1"># 源地址</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn dst port <span class="m">443</span>            <span class="c1"># 目标端口</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn tcp                     <span class="c1"># 仅 TCP</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 组合过滤 ===</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="s1">&#39;(host 192.168.1.100 and port 80) or (host 192.168.1.200 and port 443)&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 实战场景 ===</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 抓取 HTTP 请求</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -A -s <span class="m">0</span> <span class="s1">&#39;tcp port 80 and (((ip[2:2] - ((ip[0]&amp;0xf)&lt;&lt;2)) - ((tcp[12]&amp;0xf0)&gt;&gt;2)) != 0)&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 抓取特定 HTTP 方法</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -s <span class="m">0</span> -A <span class="s1">&#39;tcp[((tcp[12:1] &amp; 0xf0) &gt;&gt; 2):4] = 0x47455420&#39;</span>   <span class="c1"># GET</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -s <span class="m">0</span> -A <span class="s1">&#39;tcp[((tcp[12:1] &amp; 0xf0) &gt;&gt; 2):4] = 0x504f5354&#39;</span>   <span class="c1"># POST</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 抓取 DNS 查询</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn port <span class="m">53</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 抓取特定标志位</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="s1">&#39;tcp[tcpflags] &amp; (tcp-syn|tcp-fin) != 0&#39;</span>  <span class="c1"># SYN 或 FIN</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="s1">&#39;tcp[tcpflags] &amp; tcp-rst != 0&#39;</span>             <span class="c1"># RST 包</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 保存到文件</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -w /tmp/capture.pcap -s <span class="m">0</span> host 192.168.1.100
</span></span><span class="line"><span class="cl">tcpdump -r /tmp/capture.pcap -nn          <span class="c1"># 读取 pcap 文件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 限制抓包数量</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn -c <span class="m">100</span>               <span class="c1"># 抓 100 个包后停止</span></span></span></code></pre></div>
</div>
<h4 id="tcp-状态分析">TCP 状态分析</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 三次握手问题分析</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="s1">&#39;tcp[tcpflags] &amp; tcp-syn != 0 and tcp[tcpflags] &amp; tcp-ack == 0&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 大量 RST → 端口未监听 / 防火墙 REJECT</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="s1">&#39;tcp[tcpflags] &amp; tcp-rst != 0&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 重传统计</span>
</span></span><span class="line"><span class="cl">tcpdump -i ens33 -nn <span class="s1">&#39;tcp[tcpflags] &amp; tcp-syn != 0 or tcp[tcpflags] &amp; tcp-rst != 0&#39;</span></span></span></code></pre></div>
</div>
<h3 id="93-网络故障排查工具">9.3 网络故障排查工具</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 连通性测试 ===</span>
</span></span><span class="line"><span class="cl">ping -c <span class="m">4</span> -i 0.2 192.168.1.1              <span class="c1"># 快速 ping</span>
</span></span><span class="line"><span class="cl">ping -M <span class="k">do</span> -s <span class="m">1472</span> 192.168.1.1             <span class="c1"># 测试 MTU (禁止分片)</span>
</span></span><span class="line"><span class="cl">mtr -r -c <span class="m">10</span> 192.168.1.1                   <span class="c1"># 路由追踪 + 统计</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 路由诊断 ===</span>
</span></span><span class="line"><span class="cl">ip route get 8.8.8.8                       <span class="c1"># 查看到目标的实际路由</span>
</span></span><span class="line"><span class="cl">traceroute -n 8.8.8.8                      <span class="c1"># 路由追踪</span>
</span></span><span class="line"><span class="cl">tracepath 8.8.8.8                          <span class="c1"># MTU 发现 + 路由追踪</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === DNS 诊断 ===</span>
</span></span><span class="line"><span class="cl">dig +short example.com                     <span class="c1"># 简洁输出</span>
</span></span><span class="line"><span class="cl">dig example.com ANY                        <span class="c1"># 所有记录</span>
</span></span><span class="line"><span class="cl">dig @8.8.8.8 example.com                  <span class="c1"># 指定 DNS 服务器</span>
</span></span><span class="line"><span class="cl">dig -x 8.8.8.8                             <span class="c1"># 反向解析</span>
</span></span><span class="line"><span class="cl">nslookup example.com                       <span class="c1"># 交互式查询</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 端口检测 ===</span>
</span></span><span class="line"><span class="cl">nc -zv 192.168.1.100 <span class="m">80</span>                   <span class="c1"># TCP 端口扫描</span>
</span></span><span class="line"><span class="cl">nc -zuv 192.168.1.100 <span class="m">53</span>                  <span class="c1"># UDP 端口扫描</span>
</span></span><span class="line"><span class="cl">timeout <span class="m">3</span> bash -c <span class="s1">&#39;&lt;/dev/tcp/192.168.1.100/80 &amp;&amp; echo OPEN || echo CLOSED&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 扫描工具 ===</span>
</span></span><span class="line"><span class="cl">nmap -sS 192.168.1.0/24                   <span class="c1"># SYN 半连接扫描</span>
</span></span><span class="line"><span class="cl">nmap -sT -p 1-65535 192.168.1.100         <span class="c1"># 全端口扫描</span>
</span></span><span class="line"><span class="cl">nmap -sV -p 80,443 192.168.1.100          <span class="c1"># 服务版本探测</span>
</span></span><span class="line"><span class="cl">nmap -A 192.168.1.100                      <span class="c1"># 综合扫描 (OS + 服务 + 脚本)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 连接状态分析 ===</span>
</span></span><span class="line"><span class="cl">ss -s                                       <span class="c1"># 连接统计摘要</span>
</span></span><span class="line"><span class="cl">ss -tapn                                    <span class="c1"># 所有 TCP 连接</span>
</span></span><span class="line"><span class="cl">ss -tlnp                                    <span class="c1"># 监听端口</span>
</span></span><span class="line"><span class="cl">ss -tan state time-wait                     <span class="c1"># TIME_WAIT 状态</span>
</span></span><span class="line"><span class="cl">ss -tan state established                    <span class="c1"># 已建立连接</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 统计各状态连接数</span>
</span></span><span class="line"><span class="cl">ss -tan <span class="p">|</span> awk <span class="s1">&#39;NR&gt;1{print $1}&#39;</span> <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 统计每个 IP 的连接数</span>
</span></span><span class="line"><span class="cl">ss -tan <span class="p">|</span> awk <span class="s1">&#39;NR&gt;1{print $5}&#39;</span> <span class="p">|</span> cut -d: -f1 <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn <span class="p">|</span> head -20</span></span></code></pre></div>
</div>
<h3 id="94-带宽与延迟分析">9.4 带宽与延迟分析</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === iperf3 带宽测试 ===</span>
</span></span><span class="line"><span class="cl">ipserf3 -s                                   <span class="c1"># 服务端</span>
</span></span><span class="line"><span class="cl">iperf3 -c server_ip -t <span class="m">30</span> -P <span class="m">4</span>              <span class="c1"># 4 并发, 30 秒</span>
</span></span><span class="line"><span class="cl">iperf3 -c server_ip -R                        <span class="c1"># 反向 (下载)</span>
</span></span><span class="line"><span class="cl">iperf3 -c server_ip -u -b 100M               <span class="c1"># UDP 100Mbps</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 网卡统计 ===</span>
</span></span><span class="line"><span class="cl">ethtool -S ens33                              <span class="c1"># 网卡详细统计</span>
</span></span><span class="line"><span class="cl">ethtool ens33                                 <span class="c1"># 网卡设置</span>
</span></span><span class="line"><span class="cl">ethtool -g ens33                              <span class="c1"># Ring buffer 大小</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 实时流量 ===</span>
</span></span><span class="line"><span class="cl">iftop -i ens33                                <span class="c1"># 实时带宽</span>
</span></span><span class="line"><span class="cl">nload ens33                                   <span class="c1"># 实时流量图</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === HTTP 延迟分析 ===</span>
</span></span><span class="line"><span class="cl">curl -w <span class="s2">&#34;time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n&#34;</span> -o /dev/null -s https://example.com</span></span></code></pre></div>
</div>
<h3 id="95-常见网络问题速查">9.5 常见网络问题速查</h3>
<table>
  <thead>
      <tr>
          <th>现象</th>
          <th>可能原因</th>
          <th>检查命令</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>ping 通但端口不通</td>
          <td>防火墙/服务未启动</td>
          <td><code>ss -tlnp</code>, <code>firewall-cmd --list-ports</code></td>
      </tr>
      <tr>
          <td>间歇性丢包</td>
          <td>网卡/交换机/带宽饱和</td>
          <td><code>ethtool -S | grep drop</code>, <code>netstat -s</code></td>
      </tr>
      <tr>
          <td>TCP 连接大量 TIME_WAIT</td>
          <td>短连接过多</td>
          <td><code>ss -tan state time-wait | wc -l</code></td>
      </tr>
      <tr>
          <td>DNS 解析慢</td>
          <td>DNS 服务器问题</td>
          <td><code>dig +stats</code></td>
      </tr>
      <tr>
          <td>SSH 连接慢</td>
          <td>DNS 反向解析</td>
          <td><code>/etc/ssh/sshd_config: UseDNS no</code></td>
      </tr>
      <tr>
          <td>大文件传输慢</td>
          <td>MTU/TCP 窗口</td>
          <td><code>tracepath</code>, 调整 <code>tcp_rmem/wmem</code></td>
      </tr>
      <tr>
          <td>大量 SYN_RECV</td>
          <td>SYN Flood / backlog 不够</td>
          <td><code>ss -tan state syn-recv</code>, <code>tcp_max_syn_backlog</code></td>
      </tr>
      <tr>
          <td>curl 卡住不动</td>
          <td>防火墙 DROP (无 RST)</td>
          <td><code>tcpdump</code> 确认是否收到 SYN-ACK</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="第十章故障排查实战">第十章：故障排查实战</h2>
<h3 id="101-cpu-飙升排查">10.1 CPU 飙升排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 确认高 CPU 进程</span>
</span></span><span class="line"><span class="cl">top -bn1 -o %CPU <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 查看进程中的高 CPU 线程</span>
</span></span><span class="line"><span class="cl">top -H -p &lt;PID&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 线程 ID 转十六进制 (用于 Java 线程 dump)</span>
</span></span><span class="line"><span class="cl"><span class="nb">printf</span> <span class="s2">&#34;%x\n&#34;</span> &lt;TID&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 查看系统调用</span>
</span></span><span class="line"><span class="cl">strace -c -p &lt;PID&gt;                  <span class="c1"># 统计系统调用耗时</span>
</span></span><span class="line"><span class="cl">strace -p &lt;PID&gt; -T                  <span class="c1"># 显示每个调用耗时</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. perf 分析</span>
</span></span><span class="line"><span class="cl">perf top -g -p &lt;PID&gt;                <span class="c1"># 实时采样</span>
</span></span><span class="line"><span class="cl">perf record -g -p &lt;PID&gt; -- sleep <span class="m">30</span> <span class="c1"># 记录 30 秒</span>
</span></span><span class="line"><span class="cl">perf report                          <span class="c1"># 查看报告</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. Java 应用</span>
</span></span><span class="line"><span class="cl">jstack &lt;PID&gt;                        <span class="c1"># 线程 dump</span>
</span></span><span class="line"><span class="cl">jstack &lt;PID&gt; <span class="p">|</span> grep -A <span class="m">20</span> <span class="s2">&#34;0x</span><span class="k">$(</span><span class="nb">printf</span> <span class="s2">&#34;%x&#34;</span> &lt;TID&gt;<span class="k">)</span><span class="s2">&#34;</span></span></span></code></pre></div>
</div>
<h3 id="102-内存问题排查">10.2 内存问题排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 概览</span>
</span></span><span class="line"><span class="cl">free -h
</span></span><span class="line"><span class="cl">cat /proc/meminfo
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 进程内存排序</span>
</span></span><span class="line"><span class="cl">ps aux --sort<span class="o">=</span>-%mem <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">ps -eo pid,ppid,cmd,%mem,%cpu,rss --sort<span class="o">=</span>-rss <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 进程内存详情</span>
</span></span><span class="line"><span class="cl">cat /proc/&lt;PID&gt;/smaps <span class="p">|</span> grep -E <span class="s2">&#34;^(Rss|Pss|Swap):&#34;</span> <span class="p">|</span> awk <span class="s1">&#39;{sum+=$2} END {print sum/1024&#34; MB&#34;}&#39;</span>
</span></span><span class="line"><span class="cl">cat /proc/&lt;PID&gt;/status <span class="p">|</span> grep -E <span class="s2">&#34;Vm|Threads&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 检查是否有内存泄漏</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> i in <span class="o">{</span>1..10<span class="o">}</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    cat /proc/&lt;PID&gt;/status <span class="p">|</span> grep VmRSS
</span></span><span class="line"><span class="cl">    sleep <span class="m">5</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. slab 内存 (内核)</span>
</span></span><span class="line"><span class="cl">slabtop -s c
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 查看 OOM 历史</span>
</span></span><span class="line"><span class="cl">dmesg <span class="p">|</span> grep -i <span class="s2">&#34;out of memory&#34;</span>
</span></span><span class="line"><span class="cl">grep -i <span class="s2">&#34;killed process&#34;</span> /var/log/messages
</span></span><span class="line"><span class="cl">journalctl -k <span class="p">|</span> grep -i oom
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. OOM Killer 保护关键进程</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -1000 &gt; /proc/<span class="k">$(</span>pgrep sshd<span class="k">)</span>/oom_score_adj</span></span></code></pre></div>
</div>
<h3 id="103-磁盘空间问题">10.3 磁盘空间问题</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 磁盘满排查流程 ===</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 确认磁盘使用</span>
</span></span><span class="line"><span class="cl">df -h
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 哪个目录占用大</span>
</span></span><span class="line"><span class="cl">du -sh /* 2&gt;/dev/null <span class="p">|</span> sort -rh <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">du -sh /var/* 2&gt;/dev/null <span class="p">|</span> sort -rh <span class="p">|</span> head -10
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 大文件查找</span>
</span></span><span class="line"><span class="cl">find / -type f -size +500M -exec ls -lh <span class="o">{}</span> <span class="se">\;</span> 2&gt;/dev/null
</span></span><span class="line"><span class="cl">find / -type f -size +1G 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 已删除但未释放的文件 (进程仍持有)</span>
</span></span><span class="line"><span class="cl">lsof <span class="p">|</span> grep deleted <span class="p">|</span> awk <span class="s1">&#39;{print $1,$2,$7}&#39;</span> <span class="p">|</span> sort -u
</span></span><span class="line"><span class="cl">lsof +L1 <span class="p">|</span> grep deleted
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. inode 耗尽检查</span>
</span></span><span class="line"><span class="cl">df -i
</span></span><span class="line"><span class="cl">find / -xdev -type f <span class="p">|</span> cut -d/ -f2 <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 快速清理</span>
</span></span><span class="line"><span class="cl">journalctl --vacuum-size<span class="o">=</span>500M
</span></span><span class="line"><span class="cl">find /var/log -type f -name <span class="s2">&#34;*.log&#34;</span> -mtime +30 -delete
</span></span><span class="line"><span class="cl">yum clean all <span class="o">||</span> apt-get clean
</span></span><span class="line"><span class="cl">find /tmp -type f -mtime +7 -delete
</span></span><span class="line"><span class="cl">docker system prune -af 2&gt;/dev/null</span></span></code></pre></div>
</div>
<h3 id="104-服务无法启动排查">10.4 服务无法启动排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 排查流程 ===</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 查看服务日志</span>
</span></span><span class="line"><span class="cl">journalctl -u &lt;service&gt; -n <span class="m">100</span> --no-pager
</span></span><span class="line"><span class="cl">systemctl status &lt;service&gt; -l
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 查看系统日志</span>
</span></span><span class="line"><span class="cl">tail -n <span class="m">200</span> /var/log/messages
</span></span><span class="line"><span class="cl">dmesg <span class="p">|</span> tail -50
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 检查端口冲突</span>
</span></span><span class="line"><span class="cl">ss -tlnp <span class="p">|</span> grep &lt;PORT&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 检查文件权限</span>
</span></span><span class="line"><span class="cl">ls -la /path/to/app/
</span></span><span class="line"><span class="cl">ls -laZ /path/to/app/            <span class="c1"># SELinux 上下文</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 检查依赖</span>
</span></span><span class="line"><span class="cl">ldd /path/to/binary              <span class="c1"># 库依赖</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 手动启动排查</span>
</span></span><span class="line"><span class="cl">sudo -u &lt;user&gt; /path/to/binary   <span class="c1"># 看报错信息</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. SELinux 排查</span>
</span></span><span class="line"><span class="cl">ausearch -m avc -ts recent
</span></span><span class="line"><span class="cl">grep denied /var/log/audit/audit.log <span class="p">|</span> tail -20
</span></span><span class="line"><span class="cl">setenforce <span class="m">0</span>            <span class="c1"># 临时禁用测试</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 测试后恢复</span>
</span></span><span class="line"><span class="cl">setenforce <span class="m">1</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 8. 资源限制检查</span>
</span></span><span class="line"><span class="cl">cat /proc/&lt;PID&gt;/limits
</span></span><span class="line"><span class="cl"><span class="nb">ulimit</span> -a</span></span></code></pre></div>
</div>
<h3 id="105-网站访问慢排查">10.5 网站访问慢排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. DNS 解析</span>
</span></span><span class="line"><span class="cl">dig +stats example.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. TCP 连接</span>
</span></span><span class="line"><span class="cl"><span class="nb">time</span> nc -zv example.com <span class="m">443</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. HTTP 全链路耗时</span>
</span></span><span class="line"><span class="cl">curl -w <span class="s2">&#34;time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_appconnect: %{time_appconnect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n&#34;</span> -o /dev/null -s https://example.com
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. SSL 握手</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="p">|</span> openssl s_client -connect example.com:443 -servername example.com 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> grep -E <span class="s2">&#34;Verify|time|session&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 后端耗时分析</span>
</span></span><span class="line"><span class="cl">tail -1000 /var/log/nginx/access.log <span class="p">|</span> awk <span class="s1">&#39;{print $NF}&#39;</span> <span class="p">|</span> sort -rn <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 数据库慢查询</span>
</span></span><span class="line"><span class="cl">mysql -e <span class="s2">&#34;SHOW FULL PROCESSLIST;&#34;</span>
</span></span><span class="line"><span class="cl">psql -c <span class="s2">&#34;SELECT pid, now() - query_start AS duration, query, state FROM pg_stat_activity WHERE state != &#39;idle&#39; ORDER BY duration DESC;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. 系统资源瓶颈</span>
</span></span><span class="line"><span class="cl">top -bn1 <span class="p">|</span> head -5
</span></span><span class="line"><span class="cl">iostat -xz <span class="m">1</span> <span class="m">5</span>
</span></span><span class="line"><span class="cl">sar -n DEV <span class="m">1</span> <span class="m">5</span></span></span></code></pre></div>
</div>
<h3 id="106-应急诊断脚本">10.6 应急诊断脚本</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># emergency_diag.sh - 应急诊断，收集关键信息</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 用法: bash emergency_diag.sh &gt; diag_$(date +%Y%m%d_%H%M).txt</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;========== 诊断开始: </span><span class="k">$(</span>date<span class="k">)</span><span class="s2"> ==========&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;主机: </span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 系统负载 ===&#34;</span>
</span></span><span class="line"><span class="cl">uptime
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== CPU TOP 10 ===&#34;</span>
</span></span><span class="line"><span class="cl">ps aux --sort<span class="o">=</span>-%cpu <span class="p">|</span> head -11
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 内存 TOP 10 ===&#34;</span>
</span></span><span class="line"><span class="cl">ps aux --sort<span class="o">=</span>-%mem <span class="p">|</span> head -11
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 内存概览 ===&#34;</span>
</span></span><span class="line"><span class="cl">free -h
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 磁盘使用 ===&#34;</span>
</span></span><span class="line"><span class="cl">df -h
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== inode 使用 ===&#34;</span>
</span></span><span class="line"><span class="cl">df -i
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== IO 统计 ===&#34;</span>
</span></span><span class="line"><span class="cl">iostat -xz <span class="m">1</span> <span class="m">3</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 网络监听 ===&#34;</span>
</span></span><span class="line"><span class="cl">ss -tlnp
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 连接统计 ===&#34;</span>
</span></span><span class="line"><span class="cl">ss -s
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== TIME_WAIT 数量 ===&#34;</span>
</span></span><span class="line"><span class="cl">ss -tan state time-wait <span class="p">|</span> wc -l
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 各状态连接数 ===&#34;</span>
</span></span><span class="line"><span class="cl">ss -tan <span class="p">|</span> awk <span class="s1">&#39;NR&gt;1{print $1}&#39;</span> <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 最近系统日志 (error) ===&#34;</span>
</span></span><span class="line"><span class="cl">journalctl -p err -n <span class="m">50</span> --no-pager
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== 内核日志 (最近) ===&#34;</span>
</span></span><span class="line"><span class="cl">dmesg <span class="p">|</span> tail -30
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== OOM 记录 ===&#34;</span>
</span></span><span class="line"><span class="cl">dmesg <span class="p">|</span> grep -i <span class="s2">&#34;out of memory&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;===== 诊断结束: </span><span class="k">$(</span>date<span class="k">)</span><span class="s2"> =====&#34;</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十一章容器化运维">第十一章：容器化运维</h2>
<h3 id="111-docker-运维要点">11.1 Docker 运维要点</h3>
<h4 id="1111-docker-资源限制">11.1.1 Docker 资源限制</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 内存限制 ===</span>
</span></span><span class="line"><span class="cl">docker run -d --memory<span class="o">=</span><span class="s2">&#34;512m&#34;</span> --memory-swap<span class="o">=</span><span class="s2">&#34;1g&#34;</span> nginx
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === CPU 限制 ===</span>
</span></span><span class="line"><span class="cl">docker run -d --cpus<span class="o">=</span><span class="s2">&#34;1.5&#34;</span> --cpu-shares<span class="o">=</span><span class="m">512</span> nginx
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 限制验证 ===</span>
</span></span><span class="line"><span class="cl">docker stats &lt;container&gt;
</span></span><span class="line"><span class="cl">docker inspect &lt;container&gt; <span class="p">|</span> jq <span class="s1">&#39;.[0].HostConfig.Memory&#39;</span></span></span></code></pre></div>
</div>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">yaml</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Docker Compose 资源限制</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">app</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">myapp:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">deploy</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;2&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">2G</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">reservations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">cpus</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;0.5&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="l">512M</span></span></span></code></pre></div>
</div>
<h4 id="1112-docker-运维命令速查">11.1.2 Docker 运维命令速查</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 清理 ===</span>
</span></span><span class="line"><span class="cl">docker system df                              <span class="c1"># 磁盘使用</span>
</span></span><span class="line"><span class="cl">docker system prune -af --volumes             <span class="c1"># 清理所有未使用资源</span>
</span></span><span class="line"><span class="cl">docker builder prune -a -f                    <span class="c1"># 清理构建缓存</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 日志 ===</span>
</span></span><span class="line"><span class="cl">docker logs --tail <span class="m">100</span> -f &lt;container&gt;
</span></span><span class="line"><span class="cl">docker logs --since 10m -f &lt;container&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 限制日志大小 (/etc/docker/daemon.json)</span>
</span></span><span class="line"><span class="cl"><span class="o">{</span>
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;log-driver&#34;</span>: <span class="s2">&#34;json-file&#34;</span>,
</span></span><span class="line"><span class="cl">  <span class="s2">&#34;log-opts&#34;</span>: <span class="o">{</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;max-size&#34;</span>: <span class="s2">&#34;10m&#34;</span>,
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;max-file&#34;</span>: <span class="s2">&#34;3&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="o">}</span>
</span></span><span class="line"><span class="cl"><span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 调试 ===</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">exec</span> -it &lt;container&gt; sh
</span></span><span class="line"><span class="cl">docker inspect &lt;container&gt; <span class="p">|</span> jq .
</span></span><span class="line"><span class="cl">docker stats --no-stream
</span></span><span class="line"><span class="cl">docker cp &lt;container&gt;:/path/file ./local/path
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 导出/导入 ===</span>
</span></span><span class="line"><span class="cl">docker <span class="nb">export</span> &lt;container&gt; -o container.tar
</span></span><span class="line"><span class="cl">docker save &lt;image&gt; -o image.tar
</span></span><span class="line"><span class="cl">docker load -i image.tar</span></span></code></pre></div>
</div>
<h4 id="1113-docker-生产环境-daemonjson">11.1.3 Docker 生产环境 daemon.json</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">json</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;exec-opts&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;native.cgroupdriver=systemd&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;log-driver&#34;</span><span class="p">:</span> <span class="s2">&#34;json-file&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;log-opts&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;max-size&#34;</span><span class="p">:</span> <span class="s2">&#34;10m&#34;</span><span class="p">,</span> <span class="nt">&#34;max-file&#34;</span><span class="p">:</span> <span class="s2">&#34;3&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;storage-driver&#34;</span><span class="p">:</span> <span class="s2">&#34;overlay2&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;registry-mirrors&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;https://mirror.ccs.tencentyun.com&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;max-concurrent-downloads&#34;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;max-concurrent-uploads&#34;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;live-restore&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;userland-proxy&#34;</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;default-ulimits&#34;</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="nt">&#34;nofile&#34;</span><span class="p">:</span> <span class="p">{</span> <span class="nt">&#34;Name&#34;</span><span class="p">:</span> <span class="s2">&#34;nofile&#34;</span><span class="p">,</span> <span class="nt">&#34;Hard&#34;</span><span class="p">:</span> <span class="mi">65535</span><span class="p">,</span> <span class="nt">&#34;Soft&#34;</span><span class="p">:</span> <span class="mi">65535</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">},</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;oom-score-adjust&#34;</span><span class="p">:</span> <span class="mi">-500</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div>
</div>
<h3 id="112-docker-故障排查">11.2 Docker 故障排查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 容器反复重启</span>
</span></span><span class="line"><span class="cl">docker logs --tail <span class="m">50</span> &lt;container&gt;
</span></span><span class="line"><span class="cl">docker inspect &lt;container&gt; --format <span class="s1">&#39;{{.State.OOMKilled}}&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 检查退出码</span>
</span></span><span class="line"><span class="cl">docker inspect &lt;container&gt; --format <span class="s1">&#39;{{.State.ExitCode}}&#39;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 0: 正常退出, 137: SIGKILL(OOM/手动), 143: SIGTERM</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Docker 服务问题</span>
</span></span><span class="line"><span class="cl">journalctl -u docker -n <span class="m">100</span>
</span></span><span class="line"><span class="cl">docker system df -v
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理构建缓存</span>
</span></span><span class="line"><span class="cl">docker builder prune --all --force --keep-storage 10GB</span></span></code></pre></div>
</div>
<h3 id="113-k8s-运维速查">11.3 K8s 运维速查</h3>
<p>(详细内容参见 <code>Kubernetes-使用手册.md</code>)</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 节点管理 ===</span>
</span></span><span class="line"><span class="cl">kubectl get nodes -o wide
</span></span><span class="line"><span class="cl">kubectl describe node &lt;node&gt;
</span></span><span class="line"><span class="cl">kubectl drain &lt;node&gt; --ignore-daemonsets --delete-emptydir-data
</span></span><span class="line"><span class="cl">kubectl cordon &lt;node&gt;
</span></span><span class="line"><span class="cl">kubectl uncordon &lt;node&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === Pod 调试 ===</span>
</span></span><span class="line"><span class="cl">kubectl describe pod &lt;pod&gt;
</span></span><span class="line"><span class="cl">kubectl logs -f &lt;pod&gt; --tail<span class="o">=</span><span class="m">100</span>
</span></span><span class="line"><span class="cl">kubectl logs -f &lt;pod&gt; --previous
</span></span><span class="line"><span class="cl">kubectl <span class="nb">exec</span> -it &lt;pod&gt; -- sh
</span></span><span class="line"><span class="cl">kubectl debug -it &lt;pod&gt; --image<span class="o">=</span>busybox --target<span class="o">=</span>&lt;container&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 资源使用 ===</span>
</span></span><span class="line"><span class="cl">kubectl top nodes
</span></span><span class="line"><span class="cl">kubectl top pods -A --sort-by<span class="o">=</span>cpu
</span></span><span class="line"><span class="cl">kubectl top pods -A --sort-by<span class="o">=</span>memory
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === 事件 ===</span>
</span></span><span class="line"><span class="cl">kubectl get events -A --sort-by<span class="o">=</span><span class="s1">&#39;.lastTimestamp&#39;</span>
</span></span><span class="line"><span class="cl">kubectl get events -A --field-selector <span class="nv">type</span><span class="o">=</span>Warning
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># === etcd 备份 ===</span>
</span></span><span class="line"><span class="cl"><span class="nv">ETCDCTL_API</span><span class="o">=</span><span class="m">3</span> etcdctl snapshot save /backup/etcd-<span class="k">$(</span>date +%Y%m%d<span class="k">)</span>.db <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --endpoints<span class="o">=</span>https://127.0.0.1:2379 <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --cacert<span class="o">=</span>/etc/kubernetes/pki/etcd/ca.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --cert<span class="o">=</span>/etc/kubernetes/pki/etcd/server.crt <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  --key<span class="o">=</span>/etc/kubernetes/pki/etcd/server.key</span></span></code></pre></div>
</div>
<hr>
<h2 id="第十二章信创系统运维">第十二章：信创系统运维</h2>
<h3 id="121-信创操作系统概览">12.1 信创操作系统概览</h3>
<table>
  <thead>
      <tr>
          <th>系统</th>
          <th>基础</th>
          <th>包管理</th>
          <th>内核版本</th>
          <th>适用场景</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>麒麟 V10</strong></td>
          <td>openEuler/Debian</td>
          <td>dpkg/rpm</td>
          <td>4.19/5.10</td>
          <td>党政/国防</td>
      </tr>
      <tr>
          <td><strong>统信 UOS</strong></td>
          <td>Deepin/Debian</td>
          <td>dpkg</td>
          <td>5.10</td>
          <td>党政/企业桌面</td>
      </tr>
      <tr>
          <td><strong>openEuler</strong></td>
          <td>独立(华为)</td>
          <td>rpm(dnf)</td>
          <td>5.10/6.6</td>
          <td>服务器/云计算</td>
      </tr>
      <tr>
          <td><strong>Anolis OS</strong></td>
          <td>CentOS 兼容</td>
          <td>rpm(dnf)</td>
          <td>5.10</td>
          <td>服务器替代 CentOS</td>
      </tr>
      <tr>
          <td><strong>TencentOS</strong></td>
          <td>CentOS 兼容</td>
          <td>rpm(yum)</td>
          <td>5.4</td>
          <td>腾讯云</td>
      </tr>
      <tr>
          <td><strong>openSUSE 龙架构</strong></td>
          <td>openSUSE</td>
          <td>rpm(zypper)</td>
          <td>6.x</td>
          <td>龙芯平台</td>
      </tr>
  </tbody>
</table>
<h3 id="122-麒麟-v10-运维">12.2 麒麟 V10 运维</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 版本查看</span>
</span></span><span class="line"><span class="cl">cat /etc/kylin-release
</span></span><span class="line"><span class="cl">cat /proc/version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 包管理 (SP1 基于 Debian, SP2/SP3 基于 openEuler)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># Debian 系列</span>
</span></span><span class="line"><span class="cl">apt-get update <span class="o">&amp;&amp;</span> apt-get install -y &lt;package&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># openEuler 系列</span>
</span></span><span class="line"><span class="cl">dnf install -y &lt;package&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 安全策略 (默认启用安全加固)</span>
</span></span><span class="line"><span class="cl">getenforce           <span class="c1"># SELinux 状态</span>
</span></span><span class="line"><span class="cl">aa-status            <span class="c1"># AppArmor (Debian 系列)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 国内源配置</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /etc/apt/sources.list (Debian 系列)</span>
</span></span><span class="line"><span class="cl">deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main restricted universe multiverse</span></span></code></pre></div>
</div>
<h3 id="123-统信-uos-运维">12.3 统信 UOS 运维</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 版本信息</span>
</span></span><span class="line"><span class="cl">cat /etc/os-version
</span></span><span class="line"><span class="cl">cat /etc/deepin-version
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 包管理 (基于 Debian)</span>
</span></span><span class="line"><span class="cl">apt-get update <span class="o">&amp;&amp;</span> apt-get install -y &lt;package&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 开发者模式 (安装未经签名的包)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 设置 → 通用 → 开发者模式</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 与标准 Debian 的主要区别</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 内置安全加固 (安全中心)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 默认使用 Deepin 桌面</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 部分包名不同 (deepin-terminal 替代 gnome-terminal)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 应用商店仅包含适配的国产软件</span></span></span></code></pre></div>
</div>
<h3 id="124-openeuler-运维">12.4 openEuler 运维</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 版本信息</span>
</span></span><span class="line"><span class="cl">cat /etc/openEuler-release
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 包管理 (dnf)</span>
</span></span><span class="line"><span class="cl">dnf makecache
</span></span><span class="line"><span class="cl">dnf install -y &lt;package&gt;
</span></span><span class="line"><span class="cl">dnf groupinstall -y <span class="s2">&#34;Development Tools&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># A-Tune (智能性能调优)</span>
</span></span><span class="line"><span class="cl">dnf install -y atune atune-engine
</span></span><span class="line"><span class="cl">atune-adm list       <span class="c1"># 查看优化模板</span>
</span></span><span class="line"><span class="cl">atune-adm analyze    <span class="c1"># 系统分析</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># iSulad (轻量容器引擎, Docker 替代)</span>
</span></span><span class="line"><span class="cl">dnf install -y iSulad
</span></span><span class="line"><span class="cl">systemctl <span class="nb">enable</span> --now isulad
</span></span><span class="line"><span class="cl">isula run -d nginx
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 内核特性 (默认启用 BBR)</span>
</span></span><span class="line"><span class="cl">sysctl net.ipv4.tcp_congestion_control</span></span></code></pre></div>
</div>
<h3 id="125-anolis-os-运维-centos-迁移">12.5 Anolis OS 运维 (CentOS 迁移)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># === 从 CentOS 8 迁移到 Anolis OS ===</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 备份</span>
</span></span><span class="line"><span class="cl">cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 安装迁移工具</span>
</span></span><span class="line"><span class="cl">wget https://mirrors.openanolis.cn/anolis/migration/anolis-migration.repo -O /etc/yum.repos.d/anolis-migration.repo
</span></span><span class="line"><span class="cl">yum install -y anolis-migration
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 执行迁移</span>
</span></span><span class="line"><span class="cl">anolis-migration --os-release <span class="m">8</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 重启并验证</span>
</span></span><span class="line"><span class="cl">reboot
</span></span><span class="line"><span class="cl">cat /etc/anolis-release
</span></span><span class="line"><span class="cl">uname -r
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Anolis OS 8.x 保持与 CentOS 8 完全兼容</span>
</span></span><span class="line"><span class="cl"><span class="c1"># yum/dnf 源已替换为 openanolis 源，业务无需修改即可运行</span></span></span></code></pre></div>
</div>
<h3 id="126-信创系统通用运维注意事项">12.6 信创系统通用运维注意事项</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 架构差异 (ARM64/LoongArch)</span>
</span></span><span class="line"><span class="cl">uname -m
</span></span><span class="line"><span class="cl"><span class="c1"># x86_64 / aarch64 / loongarch64</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 编译软件时指定架构</span>
</span></span><span class="line"><span class="cl">./configure --build<span class="o">=</span>aarch64-linux-gnu
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 包名差异</span>
</span></span><span class="line"><span class="cl">dnf search &lt;keyword&gt; <span class="o">||</span> apt-cache search &lt;keyword&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 安全加固 (默认更严格)</span>
</span></span><span class="line"><span class="cl">lsmod <span class="p">|</span> grep -E <span class="s2">&#34;selinux|apparmor&#34;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 可能需要放宽的应用场景</span>
</span></span><span class="line"><span class="cl">semanage fcontext -a -t httpd_sys_rw_content_t <span class="s2">&#34;/data/app(/.*)?&#34;</span>
</span></span><span class="line"><span class="cl">restorecon -Rv /data/app
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 内核参数 (定制差异)</span>
</span></span><span class="line"><span class="cl">sysctl -a <span class="p">|</span> grep -E <span class="s2">&#34;tcp|netfilter&#34;</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十三章应急响应">第十三章：应急响应</h2>
<h3 id="131-应急响应流程">13.1 应急响应流程</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>发现 → 判断 → 止损 → 排查 → 恢复 → 复盘
(1min)(5min)  (立即)  (1h)   (2h)   (24h)</code></pre>
</div>
<h3 id="132-主机被入侵应急">13.2 主机被入侵应急</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 立即隔离 (断网)</span>
</span></span><span class="line"><span class="cl">ifdown ens33  <span class="c1"># 或 iptables -P INPUT DROP</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 保留现场关键信息</span>
</span></span><span class="line"><span class="cl">w                   <span class="c1"># 当前登录用户</span>
</span></span><span class="line"><span class="cl">last -20            <span class="c1"># 登录历史</span>
</span></span><span class="line"><span class="cl">lastb -20            <span class="c1"># 失败登录</span>
</span></span><span class="line"><span class="cl"><span class="nb">history</span>             <span class="c1"># 当前 shell 历史</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 检查异常进程</span>
</span></span><span class="line"><span class="cl">ps auxf
</span></span><span class="line"><span class="cl">ps -eo pid,ppid,user,cmd --sort<span class="o">=</span>-%cpu <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">ls -la /proc/*/exe 2&gt;/dev/null <span class="p">|</span> grep deleted   <span class="c1"># 已删除的可执行文件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 检查异常网络连接</span>
</span></span><span class="line"><span class="cl">ss -tanp
</span></span><span class="line"><span class="cl">ss -tanp <span class="p">|</span> grep ESTAB <span class="p">|</span> awk <span class="s1">&#39;{print $5}&#39;</span> <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 检查异常文件</span>
</span></span><span class="line"><span class="cl">find / -type f -mtime -1 -ls 2&gt;/dev/null          <span class="c1"># 近 24h 修改</span>
</span></span><span class="line"><span class="cl">find / -type f -perm -4000 -o -perm -2000 2&gt;/dev/null  <span class="c1"># suid/sgid</span>
</span></span><span class="line"><span class="cl">find / -name <span class="s2">&#34;.*&#34;</span> -type f -size +1M 2&gt;/dev/null    <span class="c1"># 大隐藏文件</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 检查定时任务</span>
</span></span><span class="line"><span class="cl">crontab -l
</span></span><span class="line"><span class="cl">ls -la /var/spool/cron/
</span></span><span class="line"><span class="cl">cat /etc/crontab
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 7. 检查 SSH</span>
</span></span><span class="line"><span class="cl">cat /etc/ssh/sshd_config <span class="p">|</span> grep -v <span class="s2">&#34;^#&#34;</span> <span class="p">|</span> grep -v <span class="s2">&#34;^</span>$<span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">cat /root/.ssh/authorized_keys
</span></span><span class="line"><span class="cl">find / -name <span class="s2">&#34;authorized_keys&#34;</span> 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 8. 检查用户变化</span>
</span></span><span class="line"><span class="cl">grep -E <span class="s2">&#34;:0:&#34;</span> /etc/passwd   <span class="c1"># UID 0 的用户</span>
</span></span><span class="line"><span class="cl">lastlog</span></span></code></pre></div>
</div>
<h3 id="133-ddos-攻击应急">13.3 DDoS 攻击应急</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 确认攻击特征</span>
</span></span><span class="line"><span class="cl">ss -tan <span class="p">|</span> awk <span class="s1">&#39;{print $5}&#39;</span> <span class="p">|</span> cut -d: -f1 <span class="p">|</span> sort <span class="p">|</span> uniq -c <span class="p">|</span> sort -rn <span class="p">|</span> head -20
</span></span><span class="line"><span class="cl">ss -tan state syn-recv <span class="p">|</span> wc -l
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 源 IP 封禁</span>
</span></span><span class="line"><span class="cl">iptables -I INPUT -s &lt;IP&gt; -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 限制单 IP 并发</span>
</span></span><span class="line"><span class="cl">iptables -A INPUT -p tcp --dport <span class="m">80</span> -m connlimit <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>    --connlimit-above <span class="m">50</span> --connlimit-mask <span class="m">32</span> -j DROP
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. SYN Cookie 加固</span>
</span></span><span class="line"><span class="cl">sysctl -w net.ipv4.tcp_syncookies<span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">sysctl -w net.ipv4.tcp_max_syn_backlog<span class="o">=</span><span class="m">8192</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. Nginx 限速</span>
</span></span><span class="line"><span class="cl"><span class="c1"># limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;</span>
</span></span><span class="line"><span class="cl"><span class="c1"># limit_conn_zone $binary_remote_addr zone=addr:10m;</span></span></span></code></pre></div>
</div>
<h3 id="134-数据库被删库应急">13.4 数据库被删库应急</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 立即停止数据库 (不要 kill -9)</span>
</span></span><span class="line"><span class="cl">systemctl stop mysqld
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 备份当前所有文件</span>
</span></span><span class="line"><span class="cl">tar -czf /backup/mysql_data_<span class="k">$(</span>date +%Y%m%d_%H%M<span class="k">)</span>.tar.gz /var/lib/mysql/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 停止应用</span>
</span></span><span class="line"><span class="cl">systemctl stop app_service
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 检查备份可用性</span>
</span></span><span class="line"><span class="cl">ls -lh /backup/mysql/
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 恢复最近备份 + binlog (MySQL)</span>
</span></span><span class="line"><span class="cl">mysqlbinlog --start-datetime<span class="o">=</span><span class="s2">&#34;2024-01-01 00:00:00&#34;</span> binlog.000010 &gt; recover.sql</span></span></code></pre></div>
</div>
<h3 id="135-全站-502503-应急">13.5 全站 502/503 应急</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 1. 检查后端服务</span>
</span></span><span class="line"><span class="cl">systemctl status &lt;service&gt;
</span></span><span class="line"><span class="cl">netstat -tlnp <span class="p">|</span> grep &lt;port&gt;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 检查资源</span>
</span></span><span class="line"><span class="cl">free -h
</span></span><span class="line"><span class="cl">df -h
</span></span><span class="line"><span class="cl">top -bn1 <span class="p">|</span> head -5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 查看错误日志</span>
</span></span><span class="line"><span class="cl">tail -100 /var/log/nginx/error.log
</span></span><span class="line"><span class="cl">tail -100 /var/log/php-fpm/error.log 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 数据库连接</span>
</span></span><span class="line"><span class="cl">mysql -e <span class="s2">&#34;SHOW PROCESSLIST;&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 快速恢复</span>
</span></span><span class="line"><span class="cl">systemctl restart &lt;service&gt;
</span></span><span class="line"><span class="cl">systemctl reload nginx
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 6. 临时扩容</span>
</span></span><span class="line"><span class="cl">sed -i <span class="s1">&#39;s/worker_connections .*/worker_connections 10240;/&#39;</span> /etc/nginx/nginx.conf
</span></span><span class="line"><span class="cl">nginx -s reload</span></span></code></pre></div>
</div>
<h3 id="136-事件复盘模板">13.6 事件复盘模板</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">markdown</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-markdown" data-lang="markdown"><span class="line"><span class="cl"><span class="gu">## 故障复盘报告
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>
</span></span><span class="line"><span class="cl"><span class="gu">### 基本信息
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">-</span> 故障时间: 2024-XX-XX XX:XX ~ XX:XX (持续 XX 分钟)
</span></span><span class="line"><span class="cl"><span class="k">-</span> 影响范围: XX 服务不可用 / XX 功能异常
</span></span><span class="line"><span class="cl"><span class="k">-</span> 影响用户: 约 XX 用户
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 故障时间线
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>| 时间 | 事件 |
</span></span><span class="line"><span class="cl">|------|------|
</span></span><span class="line"><span class="cl">| 14:30 | 监控告警触发 |
</span></span><span class="line"><span class="cl">| 14:32 | 运维确认故障 |
</span></span><span class="line"><span class="cl">| 14:35 | 定位原因 |
</span></span><span class="line"><span class="cl">| 14:45 | 修复方案确认 |
</span></span><span class="line"><span class="cl">| 14:50 | 修复完成，服务恢复 |
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 根因分析
</span></span></span><span class="line"><span class="cl"><span class="gu"></span><span class="k">-</span> 直接原因: 
</span></span><span class="line"><span class="cl"><span class="k">-</span> 根本原因: 
</span></span><span class="line"><span class="cl"><span class="k">-</span> 5 Whys: ...
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="gu">### 改进措施
</span></span></span><span class="line"><span class="cl"><span class="gu"></span>| 序号 | 措施 | 责任人 | 截止日期 |
</span></span><span class="line"><span class="cl">|------|------|--------|----------|
</span></span><span class="line"><span class="cl">| 1 | | | |</span></span></code></pre></div>
</div>
<hr>
<h2 id="第十四章运维脚本工具集">第十四章：运维脚本工具集</h2>
<h3 id="141-ssh-批量管理">14.1 SSH 批量管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># ssh_batch.sh - 批量 SSH 执行命令</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 用法: ssh_batch.sh &#34;uptime&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">HOSTS_FILE</span><span class="o">=</span><span class="s2">&#34;/opt/scripts/hosts.txt&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SSH_USER</span><span class="o">=</span><span class="s2">&#34;ops&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SSH_PORT</span><span class="o">=</span><span class="s2">&#34;2222&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">SSH_KEY</span><span class="o">=</span><span class="s2">&#34;/home/ops/.ssh/id_rsa&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="o">[</span> -z <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;用法: </span><span class="nv">$0</span><span class="s2"> &lt;command&gt;&#34;</span><span class="p">;</span> <span class="nb">exit</span> 1<span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="nb">read</span> -r host<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="o">[[</span> -z <span class="s2">&#34;</span><span class="nv">$host</span><span class="s2">&#34;</span> <span class="o">||</span> <span class="s2">&#34;</span><span class="nv">$host</span><span class="s2">&#34;</span> <span class="o">=</span>~ ^# <span class="o">]]</span> <span class="o">&amp;&amp;</span> <span class="k">continue</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;===== </span><span class="nv">$host</span><span class="s2"> =====&#34;</span>
</span></span><span class="line"><span class="cl">    ssh -p <span class="s2">&#34;</span><span class="nv">$SSH_PORT</span><span class="s2">&#34;</span> -i <span class="s2">&#34;</span><span class="nv">$SSH_KEY</span><span class="s2">&#34;</span> -o <span class="nv">StrictHostKeyChecking</span><span class="o">=</span>no <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        -o <span class="nv">ConnectTimeout</span><span class="o">=</span><span class="m">5</span> <span class="s2">&#34;</span><span class="nv">$SSH_USER</span><span class="s2">@</span><span class="nv">$host</span><span class="s2">&#34;</span> <span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> 2&gt;<span class="p">&amp;</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span> &lt; <span class="s2">&#34;</span><span class="nv">$HOSTS_FILE</span><span class="s2">&#34;</span></span></span></code></pre></div>
</div>
<h3 id="142-ssl-证书自动检查">14.2 SSL 证书自动检查</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># check_certs.sh - SSL 证书到期检查</span>
</span></span><span class="line"><span class="cl"><span class="c1"># crontab: 0 8 * * * /opt/scripts/check_certs.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">DOMAINS</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;example.com:443&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;api.example.com:443&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">ALERT_DAYS</span><span class="o">=</span><span class="m">30</span>
</span></span><span class="line"><span class="cl"><span class="nv">WEBHOOK</span><span class="o">=</span><span class="s2">&#34;https://hooks.slack.com/services/xxx&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> entry in <span class="s2">&#34;</span><span class="si">${</span><span class="nv">DOMAINS</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nv">domain</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">entry</span><span class="p">%:*</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nv">port</span><span class="o">=</span><span class="s2">&#34;</span><span class="si">${</span><span class="nv">entry</span><span class="p">#*:</span><span class="si">}</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nv">expiry</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="p">|</span> openssl s_client -servername <span class="s2">&#34;</span><span class="nv">$domain</span><span class="s2">&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        -connect <span class="s2">&#34;</span><span class="nv">$domain</span><span class="s2">:</span><span class="nv">$port</span><span class="s2">&#34;</span> 2&gt;/dev/null <span class="p">|</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        openssl x509 -noout -enddate 2&gt;/dev/null <span class="p">|</span> cut -d<span class="o">=</span> -f2<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="o">[</span> -z <span class="s2">&#34;</span><span class="nv">$expiry</span><span class="s2">&#34;</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;ERROR: </span><span class="nv">$domain</span><span class="s2"> 无法获取&#34;</span><span class="p">;</span> <span class="k">continue</span><span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nv">expiry_ts</span><span class="o">=</span><span class="k">$(</span>date -d <span class="s2">&#34;</span><span class="nv">$expiry</span><span class="s2">&#34;</span> +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="nv">now_ts</span><span class="o">=</span><span class="k">$(</span>date +%s<span class="k">)</span>
</span></span><span class="line"><span class="cl">    <span class="nv">remain_days</span><span class="o">=</span><span class="k">$((</span> <span class="o">(</span><span class="nv">$expiry_ts</span> <span class="o">-</span> <span class="nv">$now_ts</span><span class="o">)</span> <span class="o">/</span> <span class="m">86400</span> <span class="k">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="nb">echo</span> <span class="s2">&#34;</span><span class="nv">$domain</span><span class="s2">: 剩余 </span><span class="nv">$remain_days</span><span class="s2"> 天&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$remain_days</span><span class="s2">&#34;</span> -lt <span class="s2">&#34;</span><span class="nv">$ALERT_DAYS</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">message</span><span class="o">=</span><span class="s2">&#34;[紧急] </span><span class="nv">$domain</span><span class="s2"> 证书将在 </span><span class="nv">$remain_days</span><span class="s2"> 天后过期!&#34;</span>
</span></span><span class="line"><span class="cl">        curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>            --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;</span><span class="nv">$message</span><span class="s2">\&#34;}&#34;</span> <span class="s2">&#34;</span><span class="nv">$WEBHOOK</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<h3 id="143-自动清理脚本">14.3 自动清理脚本</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># cleanup.sh - 系统自动清理</span>
</span></span><span class="line"><span class="cl"><span class="c1"># crontab: 0 3 * * * /opt/scripts/cleanup.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">LOG_FILE</span><span class="o">=</span><span class="s2">&#34;/var/log/cleanup.log&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">RETENTION_DAYS</span><span class="o">=</span><span class="m">30</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log<span class="o">()</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date <span class="s1">&#39;+%F %T&#39;</span><span class="k">)</span><span class="s2">] </span><span class="nv">$*</span><span class="s2">&#34;</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span><span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 开始清理 ===&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理旧日志</span>
</span></span><span class="line"><span class="cl">find /var/log -type f <span class="se">\(</span> -name <span class="s2">&#34;*.log.*&#34;</span> -o -name <span class="s2">&#34;*.gz&#34;</span> <span class="se">\)</span> -mtime +<span class="nv">$RETENTION_DAYS</span> -delete 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># journald 清理</span>
</span></span><span class="line"><span class="cl">journalctl --vacuum-size<span class="o">=</span>1G --vacuum-time<span class="o">=</span><span class="si">${</span><span class="nv">RETENTION_DAYS</span><span class="si">}</span>d 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理 /tmp</span>
</span></span><span class="line"><span class="cl">find /tmp -type f -mtime +7 -delete 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理包管理缓存</span>
</span></span><span class="line"><span class="cl">yum clean all 2&gt;/dev/null<span class="p">;</span> apt-get clean 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理旧内核 (CentOS)</span>
</span></span><span class="line"><span class="cl"><span class="nb">command</span> -v package-cleanup <span class="p">&amp;</span>&gt;/dev/null <span class="o">&amp;&amp;</span> package-cleanup --oldkernels --count<span class="o">=</span><span class="m">2</span> -y 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 清理 core dump</span>
</span></span><span class="line"><span class="cl">find /var/lib/systemd/coredump -type f -mtime +7 -delete 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 磁盘空间警告</span>
</span></span><span class="line"><span class="cl"><span class="nv">DISK_USAGE</span><span class="o">=</span><span class="k">$(</span>df / <span class="p">|</span> awk <span class="s1">&#39;NR==2{print $5}&#39;</span> <span class="p">|</span> sed <span class="s1">&#39;s/%//&#39;</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$DISK_USAGE</span><span class="s2">&#34;</span> -gt <span class="m">85</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> log <span class="s2">&#34;警告: 根分区使用率 </span><span class="nv">$DISK_USAGE</span><span class="s2">%&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 清理完成 ===&#34;</span></span></span></code></pre></div>
</div>
<h3 id="144-进程守护脚本">14.4 进程守护脚本</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># process_guard.sh - 进程守护</span>
</span></span><span class="line"><span class="cl"><span class="c1"># crontab: */1 * * * * /opt/scripts/process_guard.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">PROCESSES</span><span class="o">=(</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;nginx&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;mysqld&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="s2">&#34;sshd&#34;</span>
</span></span><span class="line"><span class="cl"><span class="o">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> proc in <span class="s2">&#34;</span><span class="si">${</span><span class="nv">PROCESSES</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> ! pgrep -x <span class="s2">&#34;</span><span class="nv">$proc</span><span class="s2">&#34;</span> &gt; /dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date<span class="k">)</span><span class="s2">] </span><span class="nv">$proc</span><span class="s2"> 未运行, 尝试启动...&#34;</span>
</span></span><span class="line"><span class="cl">        systemctl restart <span class="s2">&#34;</span><span class="nv">$proc</span><span class="s2">&#34;</span> 2&gt;/dev/null <span class="o">||</span> systemctl start <span class="s2">&#34;</span><span class="nv">$proc</span><span class="s2">&#34;</span> 2&gt;/dev/null
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">        sleep <span class="m">3</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> pgrep -x <span class="s2">&#34;</span><span class="nv">$proc</span><span class="s2">&#34;</span> &gt; /dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">            <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date<span class="k">)</span><span class="s2">] </span><span class="nv">$proc</span><span class="s2"> 启动成功&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">else</span>
</span></span><span class="line"><span class="cl">            <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date<span class="k">)</span><span class="s2">] </span><span class="nv">$proc</span><span class="s2"> 启动失败!!&#34;</span>
</span></span><span class="line"><span class="cl">            curl -X POST -H <span class="s1">&#39;Content-type: application/json&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>                --data <span class="s2">&#34;{\&#34;text\&#34;:\&#34;[</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">] 进程 </span><span class="nv">$proc</span><span class="s2"> 启动失败!\&#34;}&#34;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>                <span class="s2">&#34;https://hooks.slack.com/services/xxx&#34;</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span></span></span></code></pre></div>
</div>
<h3 id="145-全量备份脚本-整合版">14.5 全量备份脚本 (整合版)</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># full_backup.sh - 全量备份 (文件 + 数据库)</span>
</span></span><span class="line"><span class="cl"><span class="c1"># crontab: 0 1 * * * /opt/scripts/full_backup.sh</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_BASE</span><span class="o">=</span><span class="s2">&#34;/backup&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">DATE</span><span class="o">=</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span>
</span></span><span class="line"><span class="cl"><span class="nv">LOG_FILE</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/backup_</span><span class="nv">$DATE</span><span class="s2">.log&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">RETENTION</span><span class="o">=</span><span class="m">7</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_PASS</span><span class="o">=</span><span class="s2">&#34;your_backup_password&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log<span class="o">()</span> <span class="o">{</span> <span class="nb">echo</span> <span class="s2">&#34;[</span><span class="k">$(</span>date <span class="s1">&#39;+%F %T&#39;</span><span class="k">)</span><span class="s2">] </span><span class="nv">$*</span><span class="s2">&#34;</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span><span class="p">;</span> <span class="o">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 全量备份开始 ===&#34;</span>
</span></span><span class="line"><span class="cl">mkdir -p <span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/</span><span class="nv">$DATE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 文件备份 (restic)</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_REPOSITORY</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/restic&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">RESTIC_PASSWORD</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$BACKUP_PASS</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;执行 restic 备份...&#34;</span>
</span></span><span class="line"><span class="cl">restic backup /data /etc /opt/scripts 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">restic forget --keep-daily <span class="m">7</span> --keep-weekly <span class="m">4</span> --prune 2&gt;<span class="p">&amp;</span><span class="m">1</span> <span class="p">|</span> tee -a <span class="s2">&#34;</span><span class="nv">$LOG_FILE</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. MySQL 备份</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nb">command</span> -v mysqldump <span class="p">&amp;</span>&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;执行 MySQL 备份...&#34;</span>
</span></span><span class="line"><span class="cl">    mysqldump --all-databases --single-transaction <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        --routines --triggers --events <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        --set-gtid-purged<span class="o">=</span>OFF <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>        <span class="p">|</span> gzip &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/</span><span class="nv">$DATE</span><span class="s2">/mysql_all.sql.gz&#34;</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;MySQL 备份完成: </span><span class="k">$(</span>ls -lh <span class="nv">$BACKUP_BASE</span>/<span class="nv">$DATE</span>/mysql_all.sql.gz <span class="p">|</span> awk <span class="s1">&#39;{print $5}&#39;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. PostgreSQL 备份</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="nb">command</span> -v pg_dumpall <span class="p">&amp;</span>&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;执行 PostgreSQL 备份...&#34;</span>
</span></span><span class="line"><span class="cl">    sudo -u postgres pg_dumpall <span class="p">|</span> gzip &gt; <span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/</span><span class="nv">$DATE</span><span class="s2">/postgres_all.sql.gz&#34;</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;PG 备份完成: </span><span class="k">$(</span>ls -lh <span class="nv">$BACKUP_BASE</span>/<span class="nv">$DATE</span>/postgres_all.sql.gz <span class="p">|</span> awk <span class="s1">&#39;{print $5}&#39;</span><span class="k">)</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 清理旧备份</span>
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;清理 </span><span class="si">${</span><span class="nv">RETENTION</span><span class="si">}</span><span class="s2"> 天前的备份...&#34;</span>
</span></span><span class="line"><span class="cl">find <span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">&#34;</span> -maxdepth <span class="m">1</span> -type d -mtime +<span class="nv">$RETENTION</span> -exec rm -rf <span class="o">{}</span> +
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 远程同步</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> -n <span class="s2">&#34;</span><span class="nv">$REMOTE_BACKUP_HOST</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">    log <span class="s2">&#34;同步到远程...&#34;</span>
</span></span><span class="line"><span class="cl">    rsync -avz --delete <span class="s2">&#34;</span><span class="nv">$BACKUP_BASE</span><span class="s2">/&#34;</span> <span class="s2">&#34;backup@</span><span class="nv">$REMOTE_BACKUP_HOST</span><span class="s2">:/backup/</span><span class="k">$(</span>hostname<span class="k">)</span><span class="s2">/&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">fi</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log <span class="s2">&#34;=== 全量备份完成 ===&#34;</span></span></span></code></pre></div>
</div>
<hr>
<h2 id="第十五章运维最佳实践">第十五章：运维最佳实践</h2>
<h3 id="151-目录与命名规范">15.1 目录与命名规范</h3>
<h4 id="目录规范">目录规范</h4>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>/
├── opt/
│   ├── app/                 # 应用目录
│   │   ├── bin/             # 可执行文件
│   │   ├── conf/            # 配置文件
│   │   └── lib/             # 库文件
│   └── scripts/             # 运维脚本
├── data/                    # 应用数据 (独立分区)
│   ├── app/                 # 应用数据
│   └── backup/              # 备份
├── var/log/
│   └── app/                 # 应用日志
└── etc/
    └── app/                 # 应用配置</code></pre>
</div>
<h4 id="命名规范">命名规范</h4>
<table>
  <thead>
      <tr>
          <th>类型</th>
          <th>规范</th>
          <th>示例</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>主机名</td>
          <td><code>环境-业务-序号</code></td>
          <td><code>prod-web-01</code>, <code>stg-db-02</code></td>
      </tr>
      <tr>
          <td>DNS</td>
          <td><code>服务.环境.域名</code></td>
          <td><code>api.prod.example.com</code></td>
      </tr>
      <tr>
          <td>端口</td>
          <td>统一规划</td>
          <td>Web: 80xx, API: 81xx, DB: 3306/5432</td>
      </tr>
      <tr>
          <td>用户</td>
          <td><code>app_&lt;name&gt;</code></td>
          <td><code>app_web</code>, <code>app_worker</code></td>
      </tr>
      <tr>
          <td>备份文件</td>
          <td><code>type_YYYYMMDD</code></td>
          <td><code>mysql_all_20240101.sql.gz</code></td>
      </tr>
      <tr>
          <td>脚本命名</td>
          <td>动词_对象</td>
          <td><code>start_app.sh</code>, <code>backup_db.sh</code></td>
      </tr>
  </tbody>
</table>
<h3 id="152-变更管理">15.2 变更管理</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 变更前</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 1. 备份当前配置</span>
</span></span><span class="line"><span class="cl">cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.<span class="k">$(</span>date +%Y%m%d_%H%M<span class="k">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 2. 灰度验证路径</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 测试环境 → 预发布 → 生产一台 → 全量</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 3. 变更记录日志</span>
</span></span><span class="line"><span class="cl"><span class="c1"># /opt/docs/changelog.md</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 变更后</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 4. 保留回滚方案</span>
</span></span><span class="line"><span class="cl"><span class="c1"># 一键回滚: cp /etc/nginx/nginx.conf.OLD /etc/nginx/nginx.conf &amp;&amp; nginx -s reload</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># 5. 验证</span>
</span></span><span class="line"><span class="cl">curl -I https://example.com
</span></span><span class="line"><span class="cl">ansible all -m shell -a <span class="s2">&#34;systemctl is-active nginx&#34;</span></span></span></code></pre></div>
</div>
<h3 id="153-监控告警最佳实践">15.3 监控告警最佳实践</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>1. 告警分级
   P0 (紧急): 核心服务不可用 → 电话 + 即时消息
   P1 (严重): 核心功能降级 → 即时消息
   P2 (警告): 预警指标 → 邮件 / 群消息
   P3 (通知): 信息性 → 群消息 (静默)

2. 告警设计原则
   - 每条告警必须可操作 (不能是&#34;指标高了&#34;)
   - 告警必须有 runbook (怎么处理)
   - 避免告警疲劳 (同一问题聚合)
   - 静默期 (维护窗口)

3. 值班制度
   - 主值 + 备值
   - 明确升级路径
   - 记录每次告警的处理情况</code></pre>
</div>
<h3 id="154-日常巡检清单">15.4 日常巡检清单</h3>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">bash</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># daily_check.sh - 每日巡检</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;===== 每日巡检: </span><span class="k">$(</span>date<span class="k">)</span><span class="s2"> =====&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 系统状态 ---&#34;</span>
</span></span><span class="line"><span class="cl">uptime
</span></span><span class="line"><span class="cl">free -h <span class="p">|</span> grep -E <span class="s2">&#34;^Mem|^Swap&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 磁盘 ---&#34;</span>
</span></span><span class="line"><span class="cl">df -h <span class="p">|</span> grep -vE <span class="s2">&#34;^tmpfs|^devtmpfs|^overlay&#34;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 最近错误日志 ---&#34;</span>
</span></span><span class="line"><span class="cl">journalctl -p err --since <span class="s2">&#34;24 hours ago&#34;</span> --no-pager <span class="p">|</span> tail -20
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 关键服务 ---&#34;</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> svc in nginx mysqld sshd postgresql docker<span class="p">;</span> <span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> systemctl is-active --quiet <span class="nv">$svc</span> 2&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;  ✓ </span><span class="nv">$svc</span><span class="s2"> active&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">elif</span> systemctl is-enabled --quiet <span class="nv">$svc</span> 2&gt;/dev/null<span class="p">;</span> <span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">echo</span> <span class="s2">&#34;  ✗ </span><span class="nv">$svc</span><span class="s2"> INACTIVE!&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 备份检查 ---&#34;</span>
</span></span><span class="line"><span class="cl">ls -lh /backup/ <span class="p">|</span> tail -5
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 连接状态 ---&#34;</span>
</span></span><span class="line"><span class="cl">ss -s
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> -e <span class="s2">&#34;\n--- 最近登录 ---&#34;</span>
</span></span><span class="line"><span class="cl">last -5</span></span></code></pre></div>
</div>
<h3 id="155-运维能力矩阵">15.5 运维能力矩阵</h3>
<table>
  <thead>
      <tr>
          <th>能力等级</th>
          <th>技能要求</th>
          <th>典型工具</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>初级</strong></td>
          <td>Linux 基础命令、服务启停、简单排错</td>
          <td>top, journalctl, systemctl</td>
      </tr>
      <tr>
          <td><strong>中级</strong></td>
          <td>监控搭建、自动化部署、性能调优、安全加固</td>
          <td>Prometheus, Ansible, Nginx HA</td>
      </tr>
      <tr>
          <td><strong>高级</strong></td>
          <td>架构设计、灾难恢复、全链路压测、信创适配</td>
          <td>K8s, Terraform, MySQL HA</td>
      </tr>
      <tr>
          <td><strong>专家</strong></td>
          <td>多活架构、运维平台开发、SRE 体系、成本优化</td>
          <td>自研运维平台, eBPF, 混沌工程</td>
      </tr>
  </tbody>
</table>
<hr>
<blockquote>
<p><strong>参考资源</strong>: 本手册与仓库中的以下手册配合使用效果更佳:</p>
<ul>
<li><code>Linux-使用手册.md</code> — Linux 基础命令与发行版对比</li>
<li><code>Docker-使用手册.md</code> — Docker 容器化</li>
<li><code>Kubernetes-使用手册.md</code> — K8s 编排</li>
<li><code>Nginx-使用手册.md</code> — Nginx 使用</li>
<li><code>MySQL-使用手册.md</code> — MySQL 数据库</li>
<li><code>PostgreSQL-使用手册.md</code> — PostgreSQL 数据库</li>
</ul></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>在Linux中运行虚拟机的方法</title>
      <link>https://goslion.com/tech/linux/linux-vm/</link>
      <pubDate>Thu, 07 May 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/tech/linux/linux-vm/</guid>
      <description>很久不写技术博客，大概都忘了，我一开始就是想写技术博客的，只是后来发现，没那么多需要写的，要不别人写过，要不太简单，要不太难。 这次试验使用的openeuler服务器，版本是22.03 LTS SP3，服务器版本。 我是在完全无网的情况下进行的，因此需要提前准备everything镜像，使用everything镜像做本地仓库。 1，做本地仓库 </description><content:encoded><![CDATA[<p>很久不写技术博客，大概都忘了，我一开始就是想写技术博客的，只是后来发现，没那么多需要写的，要不别人写过，要不太简单，要不太难。</p>
<p>这次试验使用的openeuler服务器，版本是22.03 LTS SP3，服务器版本。</p>
<p>我是在完全无网的情况下进行的，因此需要提前准备everything镜像，使用everything镜像做本地仓库。
1，做本地仓库</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code> mkdir -p /mnt/cdrom
 mkdir -m /data/vms
 # 我这里是把之前准备的镜像传到了/opt目录下
 mount -o loop /opt/openEuler-22.03-LTS-SP3-everything-x86_64-dvd.iso /mnt/cdrom/
 
 # 配置本地仓库
 cat &lt;&lt; EOF &gt; /etc/yum.repos.d/local-everything.repo
[local-everything]
name=openEuler 22.03 LTS SP3 Everything
baseurl=file:///mnt/cdrom
enabled=1
gpgcheck=0
EOF

# 构建缓存
dnf makecache
 </code></pre>
</div>
<p>2，安装所需的服务</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>dnf install -y cockpit cockpit-cockpit-machines 
dnf install -y qemu-kvm libvirt virt-install libvirt-client
systemctl enable --now cockpit.socket
systemctl enable --now libvirtd
firewall-cmd --add-service=cockpit --permanent 
firewall-cmd --reload</code></pre>
</div>
<p>3，添加虚拟机模板</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>LC_ALL=C virt-install \
  --name ${TEMPLATE_NAME} \
  --memory 4096 \
  --vcpus 2 \
  --disk path=${DISK_DIR}/${TEMPLATE_NAME}.qcow2,size=40,format=qcow2 \
  --cdrom ${ISO_PATH} \
  --network default \
  --video vga \
  --graphics vnc,listen=0.0.0.0 \
  --os-variant win10 \
  --noautoconsole
  
  firewall-cmd --add-port=5900/tcp --permanent
  firewall-cmd --reload</code></pre>
</div>
<p><strong>如果只需要一个虚拟机，到这一步就可以了，这个模板机就能正常运行</strong></p>
<p>4，克隆虚拟机</p>
<div class="bs-code">
  <div class="bs-code__bar">
    <span class="bs-code__lang">text</span>
    <button class="bs-code__copy" type="button" data-bs-copy data-label-done="已复制">复制</button>
  </div>
  <pre tabindex="0"><code>for i in $(seq 1 10); do
  NAME=Win10-$(printf &#34;%02d&#34;$i)
  PORT=$((5900 + i))

  qemu-img create -f qcow2 -b ${DISK_DIR}/${TEMPLATE_NAME}.qcow2 -F qcow2 ${DISK_DIR}/${NAME}.qcow2

  virt-install \
    --name ${NAME} --memory 4096 --vcpus 2 \
    --disk path=${DISK_DIR}/${NAME}.qcow2,format=qcow2 \
    --network default --video vga \
    --graphics vnc,listen=0.0.0.0,port=${PORT} \
    --os-variant win10 --import --noautoconsole

  echo &#34;✅ ${NAME} 创建完成 (VNC端口:${PORT})&#34;
done

## 以上命令执行完后，会以模板的配置，克隆10个相同的虚拟机，端口从5901-5910

firewall-cmd --add-port=5901-5910/tcp --permanent
firewall-cmd --reload</code></pre>
</div>
<p>5，管理和访问
浏览器输入主机的IP:9090端口，就能进入cockpit的管理面板，登录使用服务器的账号密码登录就可以。</p>
<p>进入过后，会看到虚拟机的选项，里面有创建好的虚拟机，可以进行管理。
可以在管理界面的consoles操作虚拟机，但是比较卡，也可以使用VNC进行连接，操作起来没有那么卡。</p>
<p>6，向虚拟机传输文件
可以使用在宿主机上开始web服务，然后虚拟机里访问宿主机来实现。</p>
<p>开启web服务，使用自带的python进行：python -m http.server 8888 。然后在虚拟机访问宿主机的IP和端口就可以，需要注意的是，防火墙要开对应的端口，不然访问不了。</p>
<hr>
<p>最后总结，其实很简单，就是装软件，开启服务，执行命令，然后配置，没那么复杂。</p>
]]></content:encoded>
    </item>
    <item>
      <title>马上放假</title>
      <link>https://goslion.com/diary/2026/20260430/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260430/</guid>
      <description>今天在兰州，我8.55的车，从兰州到西安，再从西安转到成都。 其实来之前，我是很疑惑的，为什么临近放假，还要安排出差的事情，毕竟节假日附近的机票都非常贵，我看了一眼，翻了一倍，甚至不止。 后来我想，可能是项目进度的原因，催的比较紧，所以不得不这么安排，这导致我好不容易报销下来的费用，又要支出去了。 </description><content:encoded><![CDATA[<p>今天在兰州，我8.55的车，从兰州到西安，再从西安转到成都。</p>
<p>其实来之前，我是很疑惑的，为什么临近放假，还要安排出差的事情，毕竟节假日附近的机票都非常贵，我看了一眼，翻了一倍，甚至不止。</p>
<p>后来我想，可能是项目进度的原因，催的比较紧，所以不得不这么安排，这导致我好不容易报销下来的费用，又要支出去了。</p>
<p>之前的几件事情没有做好，今天坐一天车，算是一种惩罚吧，大概如此，我这么想。</p>
<p>27号来的兰州，上次来兰州，我还穿着棉服，这边没那么冷，但是空气干燥，刮风不断，上次我记得，一觉醒来，鼻子里都有血痂，这次好点。这次没那么冷，我穿着短袖来的，但是还是有点冷，大概十多度，接近20度，穿短袖会起鸡皮疙瘩，而且穿短袖会起鸡皮疙瘩，还是穿了一件衬衣。</p>
<p>我的衬衣是去年我妈买的，那时候我才找到工作不久，根本买不起衣服，一个月花销不小，还得偶尔找她支持一下，衣服质感不错，我喜欢穿，但是有个问题，今年从衣柜里拿出来，袖口已经脱线了，而且很多，吊了很多须须，不过不耽误，我喜欢穿着的感觉，于是把袖子挽起两转，接着穿。</p>
<p>今年经济状况稍微好一点点，起码到目前为止，还没找她支援过，也算是一种进步了，只不过依旧是不够的。</p>
<p>我们计划买车，看了很多款，当然10万一下，能供我们选择的并不多，最后选了捷达，还没定，估计这个假期会定，其实我兜里没什么钱，对于买车，我是有点犹豫的，或许应该更晚一些。</p>
<p>前段时间，我沉迷于AI，想要用AI做点什么，增加收入，做了很多尝试，最后都没有转化为实际的金钱，那确实很肝，因为平时有工作，在公司又不可能做，起码不能太明目张胆，于是只有利用空闲时间，所以经常熬夜，有时候电脑面前一坐，就是几个小时，再躺到床上，已经是头眼昏花了。我后来想，这一切值得吗？不如休闲娱乐一下，多陪陪家人和小孩。</p>
<p>于是最近我的肝度降低了，也没有那么迫切的希望做点什么，把手头工作做好，我就觉得不错了。</p>
<p>这次的工作，有一些之前没有遇到的情况，就是需要给Linux装虚拟机，然后运行Windows，我开始以为不行，后来搜了一些方案，在AI的帮助下，顺利实现了，感觉还不错，又增加了一些经验。后来回想，AI确实让我少了很多试错的成本，如果没有AI，我可能要花很久的时间才能搞定。</p>
<p>我昨晚睡得很晚，大概是一点过睡得，看了几集邪恶力量的解说，不知不觉就到那个时间点了，游戏我也不想打了，觉得没意思，好不容易休息，想让大脑放松下来。</p>
<p>今早醒的很早，我定的7.30的闹钟，去赶8.55的火车，过去大概20多分钟，其实不用起那么早，但是我还是很早就醒了，浑身酸，脑袋也昏沉，但是我又怕再睡，会错过闹钟，从而错过回家的火车，那真是很可怕的事情，因为真的没有回去的车了，而飞机又太贵了。</p>
<p>于是起来洗了头，然后把工作的一些内容补充了，提交了报销，然后写下今天的日记。</p>
<p>其实在这之前，我是不确定要记录些什么，这一路上，好像没什么特别的，就是人和事，景色算不上，普普通通而已，没那么美，也没那么特殊。</p>
<p>其实最近几周，我觉得还不错，特别是周三，也就是昨天，因为周三会更新两个视频，一个是7ero的解说，一般是周二晚上稍微晚点的时间，那个时候，我正好会想要睡觉，然后又反复的睡不着，一刷手机，就会出现7ero的视频，然后就可以听着视频睡着，安睡到第二天，到了第二天，就会更新黑袍纠察队的第五季，最新的盗版资源，然后可以看，不过最近两集的剧情我感觉非常水，不知道为什么，反正每次期望很大，但是最后总会不得劲，觉得没有满足预期，不过还有几集，可以期待一下。</p>
<p>我最近一直在看西泽保彦的小说，特别是酩酊四人组系列的，我已经看的差不多了，感觉作者的风格读起来，没有什么压力，断断续续的，每次接着看，也能找回记忆，非常时候等车或者坐车的时候看。然后我又在想，我能写吗？</p>
<p>我总是会冒出这种想法，看到一个好的东西，就想自己能不能拥有，能不能做到，后来我意识到，这也是一种虚妄，追求高于自己本身的能力，会让人处于一种难受的状态，因为得不到，就会一直想要，那是吃饭睡觉都会想的事情，从而陷入一种深渊。</p>
<p>事实总是如此，再得到之前，疯狂的想要，脑子里有个魔鬼，怂恿你去做各种尝试，不断的尝试，最后失败，或者成功。其实成功得到，也没什么，得到之后，过了一个满足感时期，就会归于平淡，然后厌倦，总是如此。</p>
<p>我经历过太多这样的事情了，哪怕是我知道事情的起因经过结果，可是还是会去追逐，还是不满足，好像总是有追逐不完的东西，后来我想明白了，我迷恋的是那个追逐的过程，那种从未有过的体验，仅此而已。</p>
<p>而今，我是一个爸爸，我觉得我应该少去追逐这些东西，多做些能有稳定收益的事情，以前的生活，像是在高速上，或者在天上，我疯狂的加速，超越，现在我应该下高速了，去平稳的道路上行驶，哪怕慢一点，至少很稳。</p>
<p>一会我就收拾东西出门，回家去。</p>
]]></content:encoded>
    </item>
    <item>
      <title>迷途与虚妄</title>
      <link>https://goslion.com/diary/2026/20260420/</link>
      <pubDate>Mon, 20 Apr 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260420/</guid>
      <description>我们通常用碌碌无为来形容一个看起来很忙，实际上没做什么实际事情的人。很不幸，我被这样形容了， 这些形容的也是我自己，后来我想，与其忙碌，不如休息，起码有个好精神，时刻为将来的事情做准备。 这个主题我想了很久了，我确实陷入了一种迷茫，被AI冲击导致的，想着利用AI干点什么，一开始雄心勃勃， 看别人都开始利用AI挣钱了，心想我这么个业内人士，总算是能吃着点红利了，然而并非如此，我没有吃到， 起码我认为 …</description><content:encoded><![CDATA[<p>我们通常用碌碌无为来形容一个看起来很忙，实际上没做什么实际事情的人。很不幸，我被这样形容了，
这些形容的也是我自己，后来我想，与其忙碌，不如休息，起码有个好精神，时刻为将来的事情做准备。</p>
<p>这个主题我想了很久了，我确实陷入了一种迷茫，被AI冲击导致的，想着利用AI干点什么，一开始雄心勃勃，
看别人都开始利用AI挣钱了，心想我这么个业内人士，总算是能吃着点红利了，然而并非如此，我没有吃到，
起码我认为我没有吃到，我没有赚到我预期的钱，只是增加了一些我的工作效率，然后利用AI做了一些试错性质的事情
，比如开发软件，我尝试过开发聊天软件，工具软件，电脑软件，WEB系统，手机软件，然后无一例外，都没有上线成功，
也没有挣到钱，有时候我惊叹AI的聪明，可以用通人性来形象，有时候又骂他，感觉他不如三岁孩童，会犯很多低级的错误，
属于是算盘珠子，拔一下，转一下。但是自己选的，只能将就下去，因为没法把AI手里的活接过来，下不了手。</p>
<p>我这个月去了一次昆明，月初去的，月中回来的，中间过了一个周末，那个周末，我把自己关在酒店里面废寝忘食，想开发
一个游戏，最终是没能实现，我记得我基本上是凌晨快亮了才睡，然后中午醒过来，继续干，又到凌晨才睡，如此两天，
也不想吃饭，饿了就喝水，嗑瓜子，当我走出房间的时候，那是一个下午，天气不算热，到附近的公园走了走，发现很多打牌的人，他们好像没有那么着急，AI好像对他们没什么影响，还是一如既往的喝茶，打牌，好不自在。</p>
<p>于是回到酒店，我就删除了之前写的代码，原来我真的无法赚到我认知以外的钱，即使再绝妙的点子，少了认知的支撑，是不能够支撑实现的，总会遇到没有想到的坎，然后卡住，然后改，反复的改，浪费时间。</p>
<p>对，有时候就是太容易受环境影响了，所以陷入迷途，找不准自己的方向，然后又高估了结果，就会陷入虚妄，觉得自己啥都行，结果啥都不行。</p>
<p>面对现实，其实要好一些。</p>
<p>其实任何事情，都没有想象中那么简单，但是也没有想象中那么复杂，我们缺乏一个客观的准确的判断，才导致了很多弯路。</p>
<p>经历了这一遭，我也放得下了，辅助一下日常工作就行了，可以早点下班就挺好，其他的奢望不了。</p>
<p>转眼就是20号了，日子过的太快了，周末又去看了看车，中意了，但是没钱，可以按揭，但是没有必要，过些时间，
看看能不能吧，也不贵，几万块钱。</p>
<p>我在昆明的时候，还把电脑折腾了一下，修了一下键盘，然后换了系统，换了变相材料片，以为有多大的提升或者变化，其实一点都没有，还是那样，于是我又总结出一个道理，原来多一事不如少一事，是真的，有那时间不如休息，或者干点能产生实际收益的事情。</p>
<p>其实键盘，我算是修好了，因为之前洒了饮料，回弹不灵，我去售后店了，人家让我换整个键盘，还说键盘都买不到，因为型号太老了，于是我在酒店里直接把键盘扣了，然后清理了一下，再装上，其实就可以了，也没那么费事，真正装上的那一刻，我还是对自己说，你挺厉害的。</p>
<p>希望这周和下周都不要出差了，然后报销的钱可以下来，这样五一就有钱了，不然我又是穷光蛋一个，不怪我抱怨，本来工资不多高，出差还要自己垫钱，开支也要自己垫付，差不多大半了，我随便一算，一个月到头，就两三百块钱还在兜里，不服不行。</p>
<p>另一方面，我把基金卖了，连连亏损，遭不住了，2000亏到一千几百多，亏了60多块钱，这个月就没见怎么挣钱的，一开始我还犹豫了一下，后来挣钱就是几块几块的挣，亏钱就是几十几十的亏，我认清了，我不是吃这个饭的料，也不是占这点小便宜的料，有钱就在自己兜里揣着就好了，千万不要投资，啥都不投，能随时掏出来现金，就是最好的，什么资产也不如现金流。还有500块钱的基金，根本就卖不掉，一直亏钱，真是操了这基金经理祖宗十八代了，亏钱还不能卖，狗鸡巴玩意，大街上遇到，上去就是一个滑铲，然他落到污泥汤里，再狠狠踹上几脚，再也不相信那些玩资本的，纯恶心人，纯靠骗。他们是没有实体资产的，所以就是骗，骗到一个是一个，当然我被骗到了。</p>
<p>今天喝了一点酒，还是我上次买的，还没喝完，本来不打算换的，但是岳父提醒了我一下，可能有个三两吧，喝完没啥感觉，不好喝，其实我不喜欢喝酒，白的啤的我都不喜欢，只是不喝的话，纯亏，我喝完了，就不打酒了，没啥意思。</p>
<p>其实经历这么多，我也算是明白了，我就是个普通人，没那命，也没那运，能健康点就不错了，多大富贵才算富贵呀？自我实现也算不上，我的自我实现，不给别人添麻烦就行了，等别人评价我的时候，不用指指点点就行了。</p>
<p>其实我还挺悲伤的，因为前几天看到一个视频，张雪峰说他北京的房子30年房贷，40平米，他说他能不能活30年都难说。结果果然，没活到30年，转念一想，我的房贷还有十几年，我还能活十几年吗，按照目前的情况，我感觉难说，因为有几天，我确实是感觉脑仁疼，然后反应迟钝，浑身不自在，没劲，好像突然老了，周末好好的睡了一下，又恢复了一些。</p>
<p>在外面出差，我就不爱吃东西，很难有称得上是好吃的，能顿顿吃的，也就是实在饿得不行了，才吃，睡觉也是，很难睡得着，翻来复去的，大脑就像放电影一样，好不容易要睡着了，天都快亮了，哎。</p>
<p>出差算是轻旅游吗？我一点也不觉得，我现在就想停下来，歇着。</p>
]]></content:encoded>
    </item>
    <item>
      <title>3月29日</title>
      <link>https://goslion.com/diary/2026/20260329/</link>
      <pubDate>Sun, 29 Mar 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260329/</guid>
      <description>今天周日，天气不是很好，上午小雨，下午有点阳光，到了傍晚又是阴沉沉的。 我最近去了西安，渭南，兰州，重庆这几个地方，当然都是出差去的，舟车劳顿，确实很累。 本来我姐还约我们周末聚一下，但是因为临时安排的事情，要去重庆，就没聚成，还是有点遗憾。 </description><content:encoded><![CDATA[<p>3月29日，今天周日，天气不是很好，上午小雨，下午有点阳光，到了傍晚又是阴沉沉的。</p>
<p>我最近去了西安，渭南，兰州，重庆这几个地方，当然都是出差去的，舟车劳顿，确实很累。</p>
<p>本来我姐还约我们周末聚一下，但是因为临时安排的事情，要去重庆，就没聚成，还是有点遗憾。</p>
<p>这一趟出去，在西安呆了大半周，有一天晚上，和之前的同事，也是朋友，聊了聊天，现在都挺平淡的，没有多发达，只能说还过得去，
都是坚持，除了上班，没什么来钱的法子，没办法，都是普通人。</p>
<p>然后去了渭南，头一天晚上到的，第二天下午走的，去兰州，到了兰州，已经晚上十点了，车站没多少人，连拉客的出租司机都没有多少，
我看了一下，可以选择公共交通，但是到目的地需要一个多小时，于是选择了打车，吃了一桶泡面，然后躺到床上，已经十一点过了，
脑袋昏沉，睡得很快。</p>
<p>第二天起来，感觉嗓子眼都凝固了，鼻子里一扣，就是一团血痂，都堵住了，太干了这边。</p>
<p>其实事情不多，对我而言，主要是去凑个人数，当然也有一些自己的事情做，中午是在食堂吃的，还不错，但是我没有吃米饭，
几顿都是，馒头和菜，有时候下饭一点，有时候不那么下饭，兰州倒是不冷，就是风大，我们所在的位置，几乎在城市的边缘了，
可以看到裸露的山脊，一道一道的，轮廓锋利，表面是红褐色的，很少有植物，没多少其他的颜色，感觉这里不像是个省会城市，
我们住的商业街，但是人不算多，住了一周多，都没见多少人，店铺也没多少，生意不是很好，多数的时候，店员都是坐着玩手机。</p>
<p>从兰州回来，住了一晚上，又去重庆，也是小事，但是我不得不去，到重庆十一点，吃了碗粉，花了20几块，太夸张了，车站附近，而且不好吃，只能是因为我饿了，所以全部吃完了，没得选，重庆下着小雨，抬眼望去全是高楼，酒店，不像是有吃饭的地方，只能在火车站前面广场的摊上吃一顿，如果不吃的话，我去的地方，更是人烟稀少，别说吃的，打车都困难，所以必须吃点东西，还好事情进行的顺利，晚上七点半左右就回来了。</p>
<p>这些天真是太累了，倒在床上就不想动了，可我偏偏，有没有换到好工作，只能这么坚持着，想轻松，多困难。</p>
<p>成都开始没那么冷了，我回来的时候，地铁上很少有人穿棉服的，甚至都有穿短袖了，但是奇怪的是，一到周末，就变成阴雨天气，一到上班的时间，周一到周五，就是好天气，真是太奇怪了。</p>
<p>娃还好，现在走的挺稳，今天换了奶瓶，花了点钱，又商量是不是要换奶粉，还是等上一批喝完了再说，吃饭不老实，到处跑，
搞玩意，所以下午就耽搁了很多时间，只是吃了晚饭出去转了一圈，我理了个发，然后回来，我也想早点休息了，最近没什么想法，也没什么项目，再观望一下，我可能会重新剪视频，我觉得我以前的思路不错，只是没有坚持下去，仅此而已。</p>
]]></content:encoded>
    </item>
    <item>
      <title>3月份了</title>
      <link>https://goslion.com/diary/2026/20260315/</link>
      <pubDate>Sun, 15 Mar 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260315/</guid>
      <description>三月份了，时间过的太快了，最近天气也不那么冷了，前几天，我甚至脱掉了秋裤，只是早晚骑车，腿有点冷，其他的没有任何影响。 这几天天气很怪，周内的天气都很好，中午都是阳光明媚的，但是到了周某，就成了阴天，甚至是雨天。 绵密的小雨，打伞也不是，不打伞也不是。不过这对我造不成困扰，我一向是果断的人，帽子一戴，就出门了，管他多大雨。 </description><content:encoded><![CDATA[<p>三月份了，时间过的太快了，最近天气也不那么冷了，前几天，我甚至脱掉了秋裤，只是早晚骑车，腿有点冷，其他的没有任何影响。</p>
<p>这几天天气很怪，周内的天气都很好，中午都是阳光明媚的，但是到了周某，就成了阴天，甚至是雨天。</p>
<p>绵密的小雨，打伞也不是，不打伞也不是。不过这对我造不成困扰，我一向是果断的人，帽子一戴，就出门了，管他多大雨。</p>
<p>&hellip;</p>
<p>最近娃儿晓得走路了，也摔过几次，不过我看她挺勇敢的，摔倒了就挣扎起来爬，爬不起来就叫唤，总有人会帮忙的。总是想出去耍，我倒是带她出去了好几次，
她喜欢盯着电梯里的陌生人，看得人很不好意思，我都觉得不好意思，大多数人都会逗她，然后打招呼，问问年龄性别之类的，也有冷漠的，只是玩手机，或者脸歪到一边去。</p>
<p>从过年复工，到现在还没出过差，我掐着时间，差不多快到我了，果然上周就安排了，我要去西安，然后去兰州，听说那么挺冷的，不确定，姑且当真，去西安也许还能见见以前的朋友，没想到时间过的这么快，转眼的时候，就过了好几年，发生很多事情。</p>
<p>我也是，不知不觉就在公司上了一年多班了，其实我感觉自己没什么提升，只是皮毛而已，技术不精进，业务也不精通，危机感自然是有的，但是不那么明显，所以我也积极学习，也有些收获，但是要说十成把握，是没有的。</p>
<p>我们换了新房子，当然还是租的，就在一条马路相隔的小区，这个房子更大，房租更便宜，唯一的缺点就是楼层很高，下去不方便，但是楼层高也是有好处的，就是晾衣服方便，被套那些，也很方便。总体来说，利大于弊，也利于小娃室内活动。</p>
<p>在这里，我要说一点宿命论的东西了，所谓科学的尽头是玄学，这里面是有些道理的。特别是那个薛定谔的猫，我反复的想，观测盒子里的猫，是不是和我们算命是一个意思，提前知道事情的结果，然后事情必然就会发生，一种是心理暗示，一种则是观测者观测到的一定发生这样的事实。</p>
<p>所以我现在不太愿意相信算命那些玄学的东西，因为我发现，他可能是真的，但是我知道了真相或者结果过后，反而不能自在面对了，所以不知道，是一件好事。</p>
<p>&hellip;</p>
<p>另一个，我最近要促进一下家庭关系的建立，首要的就是要让老婆有当家作主的意识，不要再像以前了，听安排，然后执行。这样永远当不了家，做不了主。最近发生一件事情，尤其令我觉得，这事必须成，不成也得成。我妹妹来我家借宿了，他们来成都找工作，晚上是住在我们家的，我们三室，自然是住的下的，她和我老婆住，但是住了几天，她睡眠习惯不好，老是打扰到我老婆睡觉，然后我是万万没想到，我老婆居然搬到另一个屋子睡去了。不管是出于姐姐的照顾还是仁慈宽容，我都觉得不妥，因为这没有解决问题，而是逃避问题，从底层逻辑上讲，我老婆是一个倾向于逃避问题的人，这样的习惯已经形成了依赖。很多日常小事可以佐证，比如蒸饭要加多少米，煮面要下多少面条，炒菜要倒多少油，甚至于衣服放到哪里，这些零碎的问题，都要问爸爸妈妈。这是不妥的，但是我没有直说，直说的话，会有不好的影响，因此我只能旁敲侧击，暗示，观察一段时间，看看有没有变化。</p>
<p>其实我看的出来，岳父岳母是想退的，不想管事，但是退不下来，没办法，他们不管，我老婆又没有管的意识，她还是倾向于被管理，被安排，希望借助外力来作为自己行动理由，这就是错误的，但是这不是一点时间能够改变的，需要时间，更需要实践。</p>
<p>我觉得经营家庭和治理国家差不多，里子面子都要有，外交，经济，军事都要抓，不过这是比喻，要形成对照，一把手要考虑所有的事情，安排所有的事情，像国家政策一样，做事情。对人对事分开处理，把事情做对，让其在正常的道路上行驶，比什么都重要。因此，此人必须残忍，必须仁慈，这并不矛盾，人和事情都是复杂的，所以需要有一种孤独的心态，一种不被理解的通透，不用被理解，迟早会被理解。</p>
<p>到后来，我想，可能我需要扮演红脸的角色，坏人嘛，给一些锻炼的机会，和一些危机，甚至以战代练，没有办法，要想走的够远，爬的够高，必须要一些东西，越早越好。</p>
<p>我估计，这次应该是两周吧，回来大概就是4月份了，小区里的花，应该也谢了，春天来的快也去的快，因为马上就夏天了。我之前面试了一家公司，感觉聊的还可以，可能是我的自我感觉，不过他们也是看过我的履历的，我是符合他们的要求的，起码从招聘条件上看，是符合的，如果成功的话，我应该会换到这家公司，然后呢，离家近一点，工资高一点，应该不用出差，但是只有五险，没有一金，包吃包住，是个实体企业，应该不会那么容易资金紧张。</p>
<p>以上便是近况，我争取多更新，至少一个月做一次记录，其实主要是给我自己看的，以后的自己，我到时候会出书的，所以要把一些事情和想法记下来，同时也会记录我知道的一些人和事，我觉得，任何普通人的一生，都是一本历史著作，对别人平平无奇，但是对于亲身经历者，事处其中者，那将是不同的感觉。那比什么电视剧电影好看多了，我到时候就把这些打印下来，然后一点点的补齐，最后就是我的一生。</p>
]]></content:encoded>
    </item>
    <item>
      <title>过年及其他</title>
      <link>https://goslion.com/diary/2026/20260223/</link>
      <pubDate>Mon, 23 Feb 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260223/</guid>
      <description>转眼就过完年了，时间过得太快，来不及反应，太忙了，太累了。 我还提前请假回来了，为的是参加我妹妹的婚礼，当天很热闹，人很多， 好些人感动的哭了。 吃了好几处酒席，大部分时间都是去别处吃饭，我应该是胖了一些，我有感觉，不过无所谓。 今天初七了，马上就是初八，初八就上班了，而现在是凌晨两点，我没有睡觉，因为三点要走，我们已经把东西收拾差不多了，没有床上那些，自然不能睡好，我也就不睡觉了，一直等到现在。 …</description><content:encoded><![CDATA[<p>转眼就过完年了，时间过得太快，来不及反应，太忙了，太累了。
我还提前请假回来了，为的是参加我妹妹的婚礼，当天很热闹，人很多，
好些人感动的哭了。</p>
<p>吃了好几处酒席，大部分时间都是去别处吃饭，我应该是胖了一些，我有感觉，不过无所谓。</p>
<p>今天初七了，马上就是初八，初八就上班了，而现在是凌晨两点，我没有睡觉，因为三点要走，我们已经把东西收拾差不多了，没有床上那些，自然不能睡好，我也就不睡觉了，一直等到现在。</p>
<p>我并没有闲的无聊，而且把电脑换了一下，主要是拷贝资料，我之前拍了一个笔记本，游戏本，太重了，出差我体验了一下，简直折磨，于是换回来了。其实换了游戏本，我也没有玩几把游戏，有些东西就是这样，得到了过后，就会厌恶，无论之前多么想，欲望都会烟消云散，然后觉得无聊，不过就是这样，我还有更重要的事情，诸如此类的想法。</p>
<p>过年我又总结了一点心得，就是越是混的好的人越卑鄙，我发现了，就是那些浑水摸鱼的人，反而混的比较好，而老实干活的，反而比不过。再想想，我遇到过那么多，形形色色的人，几乎都满足这个条件，我不禁想起，卑鄙是卑鄙者的通行证这句话，真是太有道理了。</p>
<p>过年还办了个周岁宴，花了几千块钱，我心里没啥，就是记一下。</p>
<p>然后我爸今年拿了很多肉，他说今年不得出去打工了，幺幺不包活路，钱没有收回来。后面可能回去成都，年初还是要把房子整一下，不然没法主人了。</p>
<p>我这个工作，出差太多了，累的一批，特别是赶时间的活，有时候饿的我感觉酸水都出来了，胸腔里酸苦酸苦的，真是遭不住。</p>
<p>我们家是有关系的，我想换个轻松点的工作了，遭不住了，2025年没挣到什么钱，基本上是挣多少花多少，一年到头，穷光蛋一个。
真的很愁，不知道关系能不能有效。</p>
<p>时间过得太快了，这一个月一晃就没了，我好多东西都记不起了，我记得最后一次出差，去了肃宁，然后内蒙古的几个城市，北方真的冷，吃的东西也不多，我基本上点外卖，或者不吃，喝点水之类的，没胃口，不想吃。
大抵是如此，今年还没想好，但是我想变一下，看看能不能行。</p>
]]></content:encoded>
    </item>
    <item>
      <title>2026第一章</title>
      <link>https://goslion.com/diary/2026/20260124/</link>
      <pubDate>Sat, 24 Jan 2026 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2026/20260124/</guid>
      <description>上次写日记还是上次，2025年，本来12月底的时候，我是想做个总结的，但是太忙了，闲下来的时候，又想休息，反复几次，也就错过了。 然后就到了1月，又快到月底了，时间过得太快了，来不及感受。 我现在还在肃宁出差，明天是周六，不用上班，我也不用出去，所以可以熬夜，可以多睡一会。 </description><content:encoded><![CDATA[<p>上次写日记还是上次，2025年，本来12月底的时候，我是想做个总结的，但是太忙了，闲下来的时候，又想休息，反复几次，也就错过了。</p>
<p>然后就到了1月，又快到月底了，时间过得太快了，来不及感受。</p>
<p>我现在还在肃宁出差，明天是周六，不用上班，我也不用出去，所以可以熬夜，可以多睡一会。</p>
<p>这段时间，去了很多地方，重庆，北京，湖南，山东，河北，云南，奔波的很累。</p>
<p>那天在酒店拿外卖，机器人送到门口的，我拿完，关门的时候，隐约听到机器人在嘀咕：妈妈说在外打拼不容易，一定要好好照顾自己。</p>
<p>打拼两个字确实很触动我，那一刻我觉得疲惫、寒冷、饥饿被具象化了，而不是干燥的词汇。</p>
<p>然后，下周的话，我会回去，据说安排要去包头，回来估计就会过年了。</p>
<p>有啥办法，就是这么个岗位，就是干这个的，不难，但是需要到处奔波，其实我早就厌倦了，我就是不乐意出门的人，有电脑，有网络，我能坐一天。</p>
<p>电脑对我就有这么大的吸引力，说到电脑，我前几天，在淘宝拍卖拍下了一个，有游戏本，本来想在业余时间玩玩游戏，但是总是差点意味，不能够快乐了。</p>
<p>最近ai比较火，我也用ai写程序，目前写了一个聊天程序，加密聊天的，使用的是flutter，写的差不多了，功能差不多都有了，但是体验不好，所以我还在优化体验，基本上不是工作的时间，我都是在做这个app</p>
<p>这个app也不会上应用市场，只是为了研究技术，我想到达一种设想的结果，之前一直构想过，现在终于可以借助ai的能力来实践，所以多少还是有点兴奋的。</p>
<p>不得不说，北方的天气是真的冷，我来的第一二天，就买了一个魔术头巾，不然真不行了，耳朵冻，手也冻，简直受不了，但是屋里暖和是一个优点，所以我呆在屋里，窗帘一拉，就是一天，也是有原因的，
屋里之后灯光，外面的斗转星移，四季变化都与我无关了。</p>
<p>我妹妹快要结婚了，从包头出差回来，我就回去参加她的婚礼，时间过得真快，再过两天，娃儿都一岁了。现在扶着床边，墙边能走了，更是不消停，好动的很，可爱的很。</p>
<p>我知道，她未来的路还很长，很多不确定性，我希望最重要的就是要坚强，无论遇到什么问题，都不要被打倒，坚持，抗争。其实顺其自然，或者放弃真的很容易，但是那不是活着的意义。</p>
<p>新的一年里，我也没什么好多说的，就是多挣钱，多回家看看，然后，如果有可能，我想换个不那么累，不那么奔波的工作。</p>
<p>年纪大了一点，确实感觉身体机能下降了，熬夜不如以往厉害，各项兴趣也在减弱，而且容易忘事，我以后不会得老年痴呆症吧，那太恐怖了。</p>
<p>想到我要是老了，我肯定是不想在病房里受折磨的，如果我以后得了绝症，我肯定不要做手术，如果要成植物人，那更是我最怕的事情，所以我把话说在前头，这些事情，可以不经过我的同意做了，
因为我提前同意了，我把以后我不想经历的事情避开，让我安心一些。</p>
<p>我算算，大概十几年吧，我肯定就消沉了，心气消失了，好奇心也没有，上进心也没有，就开始混日子了，因为一切都注定了，没什么可以改变的了。大致就是这样，我是很悲观的，他们有些人说我聪明，
还不在少数，有一段时间，我只觉得是一种抬举，就像小时候，我确实不算聪明，但是被人说聪明，就像是嘲讽一般，那么给我说这话的人，我是不喜欢的，因为他说谎，目的不明确；后来，我确实找到些聪明的证据，
那时候，我还是觉得说我聪明的人，他们不好，怎么都看都觉得，这是一种捧杀，就是把你捧得很高，然后看你摔下来，闹你的笑话，戒备之心，不得不防；现在，我也淡然了，我可能聪明，也可能不聪明，其实没那么重要。</p>
<p>今天最后这些话，算是一些遗言，会一直有效，我之前脑海里一直在想，我临终前会想说什么？确实，太多了，我陆续的补充，提前走马灯，岂不是更好，万一到时候没来得及，就太麻烦了。</p>
<p>我不希望有人在我的葬礼上流眼泪哦，我不喜欢流泪的人，因为流泪是一种脆弱的表现，心痛的外化表现，心可以痛，但是不准哭，坚强的把悲伤延长下去，而不是痛快哭一场，哭没什么意义，记得更重要。做人要有正气，但不是正直，这两者没有直接关联，反而的不要那么正直，过直易折损，这不值得，要有心机，从不同角度考虑问题，不要过于急躁，稳得住，才能成，但是不能成，也不用自责，凡是不是靠人就能成全的，还有一些天意和运气成分在里面，做到自己能做到的就行了。</p>
<p>哪里需要那么多愧疚，只要自己不愧疚，就可以了，愧疚没有用，实际行动才有用。</p>
<p>不要什么都怕，什么都不怕，而是基于掌握的信息，做判断，盲目是可怕的，信息掌握的越充分，越容易成功。</p>
]]></content:encoded>
    </item>
    <item>
      <title>警惕虚无主义陷阱</title>
      <link>https://goslion.com/diary/2025/20251203/</link>
      <pubDate>Wed, 03 Dec 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251203/</guid>
      <description>什么时候容易陷入虚无主义的状态？成功之后，失败之后，事情开始前，事情开始后，总结起来，就是处于闲的状态或阶段。 比如我刚做完一件事情，目的达到了，然后接下来，要干什么？不知道了，没有规划和安排，就会无所事事，从忙碌的状态闲下来，就变得无趣了，不能再接受事物的刺激了，就会陷入虚无。 </description><content:encoded><![CDATA[<p>什么时候容易陷入虚无主义的状态？成功之后，失败之后，事情开始前，事情开始后，总结起来，就是处于闲的状态或阶段。
比如我刚做完一件事情，目的达到了，然后接下来，要干什么？不知道了，没有规划和安排，就会无所事事，从忙碌的状态闲下来，就变得无趣了，不能再接受事物的刺激了，就会陷入虚无。</p>
<p>这是我之前想到的，然后在手机上记了一下，即使后面看来，依然是值得警惕的。</p>
<p>不能失去目标，不能失去方向，哪怕像虫子一样爬行，也不能盲目，要有方向，有目标。</p>
]]></content:encoded>
    </item>
    <item>
      <title>11月30日</title>
      <link>https://goslion.com/diary/2025/20251130/</link>
      <pubDate>Sun, 30 Nov 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251130/</guid>
      <description>一晃就月底了，这半个月确定忙，马上又要去昆明，虽然我才回来，而且我卡里只有几十块钱了，明天上午要是不给我发工资，我机场都出不去，对，就是这么窘迫。 最近对日记感到厌倦了，感觉没什么好写的，我也不是探险家，没那么多有趣的事情记录，生活也不精彩，所以记得内啥意思。 </description><content:encoded><![CDATA[<p>一晃就月底了，这半个月确定忙，马上又要去昆明，虽然我才回来，而且我卡里只有几十块钱了，明天上午要是不给我发工资，我机场都出不去，对，就是这么窘迫。</p>
<p>最近对日记感到厌倦了，感觉没什么好写的，我也不是探险家，没那么多有趣的事情记录，生活也不精彩，所以记得内啥意思。</p>
<p>但是有些事还是要记一下，今天又去亲戚家拿了很多小孩的衣服，大多数是冬天的，还有一个推车，一个益智玩具，玩具很精巧，引得很多人侧目。</p>
<p>看到新闻，说是要封存犯罪记录，我可能最近推理小说看多了，总觉得闻到了阴谋诡计的味道，好像有人为了一碟醋包了一顿饺子，全国人民成饺子馅了。</p>
<p>我最近坐飞机或者地铁已经不听视频了，而是看小说，我接连看了几部白井智之的小说，猎奇，变态，挺有意思，设定很有意思，推理也挺有趣的，象首我没觉得有多惊艳，因为在看之前，我看了评价，然后心理预期被拉高了，实际没那么高，所以有点失落。那个女孩被人煮死在二楼，有点恶心了，应该是我觉得最变态的，比饮啜尸汁，我是怪异，你是怪物还要变态，语言直白生硬，一点也不委婉，直述那些恶心暴力场面，血腥且变态，还有推理，我今天刚看完，感觉里面的人都有点神经病，不是正常人。确实，哪有什么正常人，正常人值得被写下来吗，值得花笔墨吗，挺变态的。我开始以为蚯蚓人是隐喻，后来发现还有什么蛤蟆人，蜥蜴人，浮肿猿人，根本不是隐喻，而是为剧情服务的工具，存在只是因为需要而已，是我想太多了。</p>
<p>而且我发现，任何一个角色都是可以推理的，甚至于任何事情，只要基于收集到的信息进行分析，其实就是推理，不一定是侦探或者警察，也不一定是案件，最重要的是分析，找出关键点，就像做题一样，破题点，然后解题。</p>
<p>确实应该如此，是个不错的思路，我以前打算把推理和玄幻结合起来，写个小说，但是写了几章就没了，诡计不够用，而且又不会铺设伏笔，最终是放弃了，还不是时候。</p>
<p>今天就是这些，明天还要赶飞机，早起。</p>
]]></content:encoded>
    </item>
    <item>
      <title>累的</title>
      <link>https://goslion.com/diary/2025/20251114/</link>
      <pubDate>Fri, 14 Nov 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251114/</guid>
      <description>今天下午才从西昌回来，赶紧把报销提了，不然钱跟不上用，房贷我还没还，每天都能听到银行的电话，我每次都直接挂，他们的目的我太清楚了，没钱也懒得和他们说。 上周去的肃宁，这周去的西昌，下周还要去肃宁，做了好多车 人麻了，肚子感觉不到饿，脑子像被冻住了，思考问题很费劲，好久没有好好休息了，酒店里很难睡得踏实，总是醒，也不知道吃啥。 </description><content:encoded><![CDATA[<p>今天下午才从西昌回来，赶紧把报销提了，不然钱跟不上用，房贷我还没还，每天都能听到银行的电话，我每次都直接挂，他们的目的我太清楚了，没钱也懒得和他们说。</p>
<p>上周去的肃宁，这周去的西昌，下周还要去肃宁，做了好多车 人麻了，肚子感觉不到饿，脑子像被冻住了，思考问题很费劲，好久没有好好休息了，酒店里很难睡得踏实，总是醒，也不知道吃啥。</p>
<p>我的手机也开始出问题了，首先是掉电很快，其次是音量键不能用了，没法调声音大小，只能手指滑动，今天在西昌火车站外面还掉到地上了，左上角摔碎了一点，
想换，没钱。</p>
<p>出行路上，我要么看书，要么看视频，要么睡觉，视频没什么意思，有意思的更新太慢了，我取关了好多博主，无所谓，算是清理垃圾了。</p>
<p>上周还有一个事，Faker又得冠军了，我对这游戏也是越来越失望了，特别是比赛内容，我以后只看国际赛，只看有精彩的比赛，国内赛区赶紧解散吧，养一群巨婴一般的玩意，总是给人喂shit，浪费人时间，算不算一种谋杀？</p>
<p>我看了好几本书了，白井智之的《饮啜尸汁》《我是怪异，你的怪物》早坂吝的《彩虹牙刷》还有近幾地区那些事，我都看来，还有绝叫，感觉挺平淡的，白井和早坂的还好些，有点意思，绝叫有点像流水账，需要人拼凑各种画面，最后形成故事，我其实很快就看完了，因为没什么烧脑的，都是直观的。一个人的一生就是那个时代的缩影，什么也改变不了，只能发出绝望的嘶吼。</p>
<p>我应该不会再想看这种包着悬疑外衣的剧情小说了，因为一点也不悬疑，解忧杂货店也是，令我大失所望，我坚持看到最后一页，也没看到期待的反转，就小说这个层面来讲，拉起了读者的预期阈值，却没有满足，我觉得是对不起读者的。</p>
<p>后续看书，我还是要慎重选择，不能再看网上那些评价了，只要是不符合阅读习惯的，哪怕再好，我也不看了，时间很重要，人最重要的就是拥有的时间，所以我不想被人骗走时间了。</p>
<p>最近又把坚持的道理又总结了一下，反向不要那么容易放弃吧，Faker都拿六个冠军了，这也正好说明了坚持的意义，其次还说明一个道理，那就是成功才是成功之母，鼓励失败那人，纯属没安好心，愚弄人呢，说这话就藏着让人多经历失败，从而失掉信心陷入迷茫的陷阱，不是所有人都是圣人，圣人能坚持那么久的失败，普通人能行吗？</p>
<p>不说别的，我奉行一种实用主义，必须及时的体现出价值或者结果，不然都是不值得，没有意义的，原因有两点，一是现实世界太多不能掌控的地方，意外永远比计划更早，第二是生命是有限的时间，不能把时间花在等待一个不确定的结果上。</p>
<p>状态不好，我前几天忽然想起的主题，现在一点印象都没有，还是先睡觉吧。</p>
]]></content:encoded>
    </item>
    <item>
      <title>10月28日</title>
      <link>https://goslion.com/diary/2025/20251028/</link>
      <pubDate>Tue, 28 Oct 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251028/</guid>
      <description>今天挺无聊的，算是普通的一天，公司没有多少事，不忙但是也不能看起来闲着。 中午去学校吃的饭，打完饭菜我就后悔了，初衷是奔着学校的素菜去的，不仅便宜还是清淡，可是跟着同事去了另一个餐厅，没有多少可选，我能选的已经是最好的了。没吃饱，而且及其油腻。 下午回来的时候下雨了，出地铁没有找到共享单车，公交也还远，于是边走边等公交，直到走到最后一个我可以乘坐的站，公交也没来。 </description><content:encoded><![CDATA[<p>今天挺无聊的，算是普通的一天，公司没有多少事，不忙但是也不能看起来闲着。</p>
<p>中午去学校吃的饭，打完饭菜我就后悔了，初衷是奔着学校的素菜去的，不仅便宜还是清淡，可是跟着同事去了另一个餐厅，没有多少可选，我能选的已经是最好的了。没吃饱，而且及其油腻。</p>
<p>下午回来的时候下雨了，出地铁没有找到共享单车，公交也还远，于是边走边等公交，直到走到最后一个我可以乘坐的站，公交也没来。</p>
<p>走了回去，大概半个小时，八点刚好出电梯，到家门，雨不大，其实我还挺乐意走路的，特别是这种毛毛小雨，很有氛围感，而且又不能玩手机，有种游离世界之外的感觉。</p>
<p>很少有走路的人，大多骑车或者坐车，一开始有几个，后来就只有我一个了，看来我的目的地是最远的。</p>
<p>刚出电梯，岳父就开门了，他也刚好想出去看看我啥时候回来，刚好接上。</p>
<p>留的饭菜尚温，又喝了一点酒。吃完快九点了，抱着孩子兜了几圈，又逗了一会，感觉眼睛越来越圆了，还是啥都喜欢往口里塞，这可不是什么好习惯，不知道什么时候能改掉。</p>
<p>睡前我想找点节目，翻了好久，终是没有找到。没什么有意思的事情，那些电影或电视剧解说更新太慢了，根本不够看，而且他们的催眠功效也正在减弱，所以我陷入了失眠的忧虑中。</p>
<p>有点困，但不想睡。</p>
<p>今天在地铁上断断续续看来Gen和Hle的比赛，挺寡淡，除了最后小花生离场有点伤感，其他的还好，因为两队有实力差距，不能出奇招致胜，那肯定就是输了。</p>
<p>说到比赛，那不得不记一下BLG的失利了，已经16强滚蛋了，一直不喜欢这个战队，除了一段时间喜欢过bin和knight，后来也转路人了，一开始以为这两是新生代上中的希望和未来，后来发现，泯然众人矣，不过如此。而且我怀疑这队是买了菠菜的，然后发现居然比赛事奖金还高，于是开始演起来了，赛后可能有点后悔，但是那只是暂时的，毕竟赚到钱了，打游戏不就是为了赚钱嘛？</p>
<p>另一个事，雷军的信用正在直线下降，包括什么小字营销，雷式营销，看的人很烦。怎么现在才爆？我以前只是觉得这个人很做做虚伪，很擅长讲故事，很擅长推销。我就是很烦推销的人，非得用各种话术，把你的欲望勾起了，想尽办法让你消费，有毛病，人家需要就会买，不需要就不买，就这么简单的逻辑。</p>
<p>不过雷军还是有值得我们学习的，一就是要学会讲故事，二就是要学会拉大旗。他太精明了，张口就能来，可能这么多年下来，他都把那些当成真的了，不管别人信不信，首先要让自己信。三一个，也是我觉得我最容易做到的，先模仿再超越，大抵都是如此，可以骗过狂热的信徒，可以骗过普通人，但是懂得都懂，没那么难，也没那么简单。</p>
<p>最近我真累了，写了个项目练手，一边使用ai，一边自己写，初具效果 但还不完善，周天写到了两点半，昨天写到了十二点半，今天没写，想找点催眠节目，又没找到，真是麻烦啊。</p>
]]></content:encoded>
    </item>
    <item>
      <title>记个流水账</title>
      <link>https://goslion.com/diary/2025/20251021/</link>
      <pubDate>Tue, 21 Oct 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251021/</guid>
      <description>前几天偶然搜了一下这个博客的关键字，意外的发现排名挺高的，基本都在第一页，甚至第一条，看来网络爬虫发挥作业了。 然而接下来就有问题了，要是我之前的不当言论被认识我的人看到了，并且通过蛛丝马迹把我给认出来，就麻烦了，羞耻或者尴尬，都不是我想要的。 不过还好的是，我写的不全是真的，有假的，只要不是很了解我行程的人，一般是不会认出来的。 </description><content:encoded><![CDATA[<p>前几天偶然搜了一下这个博客的关键字，意外的发现排名挺高的，基本都在第一页，甚至第一条，看来网络爬虫发挥作业了。</p>
<p>然而接下来就有问题了，要是我之前的不当言论被认识我的人看到了，并且通过蛛丝马迹把我给认出来，就麻烦了，羞耻或者尴尬，都不是我想要的。</p>
<p>不过还好的是，我写的不全是真的，有假的，只要不是很了解我行程的人，一般是不会认出来的。</p>
<p>其实我的目的就是吐槽，抱怨之类的，肯定有很多负面情绪，记录真实生活的不多，因为我觉得挺无聊的，没什么奇妙的冒险故事，但是遇到印象深刻的，我也会记下来，以后老了，回忆从前，也能找到一个开始的记忆点。</p>
<p>之前尝试用Ai写小说，失败了，因为超出对话长度了，这是我没想到的，本来开头和布局都设计的很好，也写了几万字了，但是对话超出长度后，就没法继续写了，我又自认很难达到Ai的文笔，所以就太监了。</p>
<p>这只是一次尝试，主要是掌握节奏，和一种写字的感觉，就是对于画面感和氛围感的掌握，我总得觉得不够，要么平淡，要么直白，反正我自己读是看不下去的，更何况别人。</p>
<p>短视频我也不爱看，觉得无趣，游戏也是，年年都有冲击波，习惯了，不太care，回到文字上，要写写的出，就得读的多，于是在网盘上收集了很多侦探小说，尤以白井智之、早坂吝、青岐有吾、西泽保彦居多，描述的案件多少有些变态了，我也是好奇心作祟，一般的案件我觉得无聊，没啥意思，想找点挑战想象力的。</p>
<p>目前有三本在读，都没有读完。其实阅读是一种节奏，只要中途被打断了，就很难再续上。对我而言是这样，所以我会同时看对本书，但是没本都没看完。</p>
<p>成都最近开始变冷了，中午吃饭的时候，同事们也说起这件事——成都现在只有夏天跟冬天，根本没有秋夏。我也赞同，厚衣服可以找出了。</p>
<p>我以后会很少记录生活上的事情了，我怕我暴露了，毕竟这是一个长期计划，需要坚持的。</p>
<p>可能我会写点短篇或许技术性的文章，说不定哟。</p>
<p>如果你正在看，尽量不要到处跟人说，就没事偷偷瞄一眼就行了，反正我写的也不好，只是为了以后回忆有个锚点而已。</p>
]]></content:encoded>
    </item>
    <item>
      <title>一周近况</title>
      <link>https://goslion.com/diary/2025/20251015/</link>
      <pubDate>Wed, 15 Oct 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251015/</guid>
      <description>上次我抱怨了国庆节，然后总算上班了，第二天就出差去了，原定一周回来，但是由于一些其他原因，提前回来了。 昨晚回来的，九点半到的机场，然后坐地铁，坐到了望丛祠，地铁上只有我和另一个大叔，他扶在一旁睡觉，我也不想玩手机了，疲倦的很，整个人反应很慢。 不过好消息就是出地铁就找到了共享单车，只是有点下雨，有点冷。 </description><content:encoded><![CDATA[<p>上次我抱怨了国庆节，然后总算上班了，第二天就出差去了，原定一周回来，但是由于一些其他原因，提前回来了。</p>
<p>昨晚回来的，九点半到的机场，然后坐地铁，坐到了望丛祠，地铁上只有我和另一个大叔，他扶在一旁睡觉，我也不想玩手机了，疲倦的很，整个人反应很慢。</p>
<p>不过好消息就是出地铁就找到了共享单车，只是有点下雨，有点冷。</p>
<p>回去已经零点过半了，换衣服就睡了。</p>
<p>今天去公司报销了，然后就是整理收集到的问题。</p>
<p>另外，我和老婆已经和解了。时间是在国庆后第一天上班，她要奶粉钱，我没有，确实没有，因为九月份花了近两万，我放假结束，兜里只有一百多块钱了。</p>
<p>我们交流了一些，然后理解了一些，以后把日子过好就行了。</p>
<p>回来啊时候，本来想给娃儿买个小玩具的，但是都是一些手工制品，泥塑，香包，折纸台灯，觉得还不是时候，于是放弃了。转而在另一个架子上看到了一副手串，价格一百多，我觉得还行，崖柏做的，有木质香味。
以后不抽烟了，可以盘点串，我这么想的，然后也准备这么做。
昨天IG输了，虽然早有心理预期，但是还是觉得可惜，还是做不到吗？还要等一年吗？还有接下来的故事吗？</p>
<p>可惜，我不想等了，没啥意思，我在这游戏上花费那么多时间，也没得到什么回报，现在自己喜欢的队伍和选手也被淘汰了，他们年纪，我的年纪，越来越大，真的还有下一次机会吗？</p>
<p>我想，意外永远比明天先来，机会错过了，就不会再回来了。</p>
<p>我觉得惋惜而沉重，就像告别一样，再也不想看到，听到这游戏的消息了，累了。</p>
<p>下个月会好一点，少还一点信用卡，这个月可能还是不够用，我之前的奶粉钱还是找我爸爸要的。</p>
]]></content:encoded>
    </item>
    <item>
      <title>过个鸡毛国庆啊</title>
      <link>https://goslion.com/diary/2025/20251004/</link>
      <pubDate>Sat, 04 Oct 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20251004/</guid>
      <description>国庆节没过完，今天是第四天，我太想上班了，一天不想在家呆了，这里不能称之为家，压抑的很，难受的很，坐着难受，站着难受， 干啥都难受，放假真是折磨，长假是最折磨的。 我想请哪位把国庆中秋给取消了吧，还是上班，才有意义。 今天起来，就被骂了，搞笑吧？ 我才端起饭，就说我半夜没有起来兑奶粉，巴拉巴拉，我确实忘了。然后又给我妈打电话，说洗碗没洗干净，扫地没扫干净，兑奶粉也不听， 抽烟不洗澡，然后说，要给她 …</description><content:encoded><![CDATA[<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>
<p>活着的意义就是活着，其实没啥意义，只是比死了好。</p>
]]></content:encoded>
    </item>
    <item>
      <title>晚上去石家庄</title>
      <link>https://goslion.com/diary/2025/20250923/</link>
      <pubDate>Tue, 23 Sep 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20250923/</guid>
      <description>本来预计是周一去肃宁的，但是耽搁了，有我的问题，也有客户这边的问题，不过还好，目前问题都解决。 我定的晚上的车，明天中午十一点到石家庄，然后打车去肃宁。 从神木这边出发，十几分钟，应该就能到神木站，然后睡一觉，到西安，转车到西安北，然后到石家庄。 下午我就没有跟他们出去了，因为确实没我什么事情了。这几天不太舒服，好像自从二郎山回来就不太舒服， 周六我们去了二郎山，离我们住的地方20公里，打车去的， …</description><content:encoded><![CDATA[<p>本来预计是周一去肃宁的，但是耽搁了，有我的问题，也有客户这边的问题，不过还好，目前问题都解决。</p>
<p>我定的晚上的车，明天中午十一点到石家庄，然后打车去肃宁。</p>
<p>从神木这边出发，十几分钟，应该就能到神木站，然后睡一觉，到西安，转车到西安北，然后到石家庄。</p>
<p>下午我就没有跟他们出去了，因为确实没我什么事情了。这几天不太舒服，好像自从二郎山回来就不太舒服，
周六我们去了二郎山，离我们住的地方20公里，打车去的，十点过上的山，快到十二点下山，山不大，确实很险，
我爬的很累，因为早上没吃什么饭，每次爬到一个高出，都要喘气，心跳的厉害，还有点头晕，最后还是坚持下来了。</p>
<p>上山的人不对，风景还可以，上面有各种庙，各种神仙和菩萨，我是不信这些的，也拍了些照片。下山过后，还是处于疲劳的状态，
头晕，虚弱，又坐了2个小时的公交车，然后到了住的地方，睡了一下午，晚上没怎么吃东西。</p>
<p>周天下雨了，下午的时候很大，晚上也不小，还好周一晴起来了。这边早晚有点冷，中午到下午，
还是比较暖和，因为有太阳，又没有多少云层，所以中午是有点热的，不过对于我这个有点病怏怏的身体，恰好，可以晒晒太阳。</p>
<p>晚上去了石家庄，凌晨五点到的西安，然后转车到西安北站，到了北站，天已经有点亮了。</p>
<p>西安北站我可太熟了，因为我在这车站，经历了太多的离别的了，总是伤感的，然后默默咽下，一开始，我觉得轻松而自在，后来发现控制住
眼神，不让它变得柔软是一件困难的事情，我不想暴露内心的悲伤，所以离别最好越快越好，越漫长越折磨。</p>
<p>书接上文，我是27号回来的，坐的早上8点的飞机，26晚上就在机场附件的网吧蹲了一晚上，这让我回忆起有些年轻的时光，那时候周围
朋友还很多，也很无忧，现在我常常一个人，总是一个人。</p>
<p>28，29，30，上了三天班，然后放假！</p>
]]></content:encoded>
    </item>
    <item>
      <title>出差神木</title>
      <link>https://goslion.com/diary/2025/20250918/</link>
      <pubDate>Thu, 18 Sep 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20250918/</guid>
      <description>这是第二次来神木了，上次来这边，没做到什么事情，被说教了一顿，然后组织了一个会议，就回去了，在我的角度看，是没做成什么事情的。 这次不一样，我们来了四个人，从人数上，已经形成了一种气势，只是到目前为止，还没有见到上次那个气势凌人的女领导，明天应该会见到，如果不出意外的话。 </description><content:encoded><![CDATA[<p>这是第二次来神木了，上次来这边，没做到什么事情，被说教了一顿，然后组织了一个会议，就回去了，在我的角度看，是没做成什么事情的。</p>
<p>这次不一样，我们来了四个人，从人数上，已经形成了一种气势，只是到目前为止，还没有见到上次那个气势凌人的女领导，明天应该会见到，如果不出意外的话。</p>
<p>昨天我们四个人就来了，订的下午五点的飞机，先到榆阳，再打车到神木这边，到这边已经九点过了，还比较冷，十几度，我本来不想穿外套的，但是同事们都穿了，
我也就不再碍于面子上的事儿了。</p>
<p>到了过后，现在酒店放了东西，然后到酒店隔壁吃了一份牛肉馅饺子，味道不错15块钱，有点小贵。然后才发现，这次住的就是我上次住的酒店隔壁，是同一个楼，只是环境和隔壁好不少，
看来我上次只是赶时间，忘了筛选了，只不过也算不上多好，还是有一股霉味，被子床单有点发黄，没有配水。</p>
<p>今天事情很顺利，早上去取了服务器，然后搬到机房，当道机柜里面，发现又缺一些线，和零件，附件的五金店没有，于是打车去市里买，来回花了近100块，去了市里的电脑城，
问了三家，终于是买齐了，顺便市里吃了个饭，杂碎面和肉夹馍，面我没吃，因为渴得很，只想喝汤。</p>
<p>回来的时候，是一个女司机，开车技术很好，我看他普通的道路都是80，很少60，如果是车少的地方，直接就是100的速度，实在令人羡慕，而且车距把握的很好，可以以60
的速度从马路中间穿过，而且两边都在行车的情况下，而且她还一边开车，一边发语言，接语言，根本不耽误，也不慌张，应该是早就习惯了。</p>
<p>下午把安上，线接上，然后把软件，环境装好，都启动了一下，没什么问题，快5点的时候回来了，就差配IP地址了，这个估计还有个流程。</p>
<p>我把关键信息做了个记录，然后一起出去吃饭，天黑的比较早，也没啥好逛的，没走多远，有个东北烧烤，于是就在这吃了一顿烧烤，4个人，吃了190块钱，两瓶郎酒，半瓶二锅头，
还剩半瓶，带回来了。其实我一点醉的意思都没有，确实感觉酒比较淡，就是现在感觉比较口渴，也是就是十点过左右，我们七点过快八点回来的，再床上玩了一会手机，想眯一会，
终究是没有得逞，现在清醒的很。</p>
<p>于是做个记录。</p>
<p>明天过后，我应该就在这边没什么事情了，要去其他的项目现场，可能是肃宁，出发前告诉我的，但也可能有变，但是都差不多，不会那么容易结束。这次出来，没有那么孤单了
不是一种掣肘的感觉，有人帮忙，有人出主意，所以做事很顺，所以这次体验还是不错，效率也高。但是，不是所有时候都是这样，大多数，都是一个人面对问题，然后想办法，
解决办法。</p>
<p>神木这边，其实没什么风景，都是山，不是光秃秃的，但是差不多，低矮的杂草，低矮的树，胡乱的排列着，露出底下的岩石和土层，山不高，而且路上经常过大车，时常是轰鸣的声音
呼啸而过。吃的就是面食，陕西的面，山西的面，甘肃的面，安徽的面，很少有米饭，反正我没吃过这边的米饭，味道一般，不出彩，也不难吃。</p>
<p>市里会好一些，有些繁华景象，和普通的县城差不多。</p>
]]></content:encoded>
    </item>
    <item>
      <title>出差定西</title>
      <link>https://goslion.com/diary/2025/20250904/</link>
      <pubDate>Thu, 04 Sep 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20250904/</guid>
      <description>为的是一点小事，其实不难，也不麻烦，就是装个电脑，和摄像头，然后把软件设置好，就差不多了。 我昨天下午出发的，然后晚上十点过到的定西这边，出站以后，外面有点黑，灯不多，也没有人，在外面路口遇见了一个出租车司机，我也乏的很，带了两个电脑，一个自拍杆，还有很多设备，也懒得在手机上打车和搜酒店了，就让司机给我推荐一个，拉到地方就行了。 </description><content:encoded><![CDATA[<p>出差定西，为的是一点小事，其实不难，也不麻烦，就是装个电脑，和摄像头，然后把软件设置好，就差不多了。</p>
<p>我昨天下午出发的，然后晚上十点过到的定西这边，出站以后，外面有点黑，灯不多，也没有人，在外面路口遇见了一个出租车司机，我也乏的很，带了两个电脑，一个自拍杆，还有很多设备，也懒得在手机上打车和搜酒店了，就让司机给我推荐一个，拉到地方就行了。</p>
<p>大约十一点十几分到的地方，陇欣宾馆，地方还行，前台已经睡觉了，只有一位大爷在大厅坐着，我说要开个房间，大爷才把前台叫起来，给我开了房间，108标准大床房，一开始是给我开标间的，标间就是两个床，我觉得没有必要，大床房就比标间多10块钱，于是就开的大床房。</p>
<p>到房间把东西放了，很累了，而且很饿，有点反酸水了，必须要吃点东西，于是去了最近的一个夜市，我提前问过前台了，最近的吃饭地方在哪，也不远，就走了10分钟左右，然后到了一个小夜市，可能有十个摊位，面积不大，人也不多，我找了一个摊位，叫冯小哥的，点了一份酸辣粉，8块钱，微辣，很快就好了。</p>
<p>我本来就又渴又饿，所以想吃点带汤的，最好味道再好一点。味道确实不错，酸辣，而且就算是微辣，也是有一点辣度的，这边的粉很有韧劲，和在重庆到的不太一样，汤的话，更像是面汤，佐料很足，折耳根，香菜，花生碎，我还喝了两口汤，很快就吃完了。也没觉得那么冷了，半夜的温度，大概有个15度，我特意看了一下手机，我穿的短袖，只是起了一点鸡皮疙瘩，喝了几口热汤，身子暖和了很多，临走的时候，我看到有人又点了关东煮，我也没怎么吃饱，又点了一些关东煮，带回宾馆吃，和酸辣粉一起，一共话费20元。</p>
<p>回宾馆已经快十二点了，吃了关东煮，听着视频就睡着了。</p>
<p>今天九点半起来的，收拾了一下，就出来，然后打车去目的地，比较遗憾的事情是我的耳机落在了酒店，以后上下班都不能听视频了。</p>
<p>目的地是这边的一个家属院，叔叔是人民法院的法官，我到了楼下，打了电话，然后乘电梯上楼，进了屋。
就是很普通的房屋，设备的安装和软件的设置，以及最后的测试都很顺利。本来以为会遇到一些困难，没想到这么顺利，叔叔和阿姨都很平易近人，也很亲切。</p>
<p>中午就是在叔叔家里吃的，羊肉泡馍，叔叔说陕西的羊肉泡馍没有甘肃的正宗，那个馍不好，又干又硬，羊肉汤也不正宗，还有那勾兑造假的，总之不好吃。</p>
<p>阿姨做了四个菜，叔叔开了一瓶酒，金徽酒18，我后来在网上搜了一下，400多一瓶，我们边吃边喝边聊，谈了不少。</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>现在差不多，我也把想写的写完了，就休息一会，等到站。</p>
]]></content:encoded>
    </item>
    <item>
      <title>20250822</title>
      <link>https://goslion.com/diary/2025/20250822/</link>
      <pubDate>Fri, 22 Aug 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20250822/</guid>
      <description>历经16个小时，终于回到了成都，我刚吃完饭，躺在床上， 老婆他们也关了门，但是灯还亮着。 从神木到西安，再从西安到成都，然后做地铁，最后骑共享单车，总算是到了。 累的不行，只是昨晚吃了一份过桥米线，在车站买了一瓶水，车上还买了一袋豆腐干，一袋猪皮，花了18块钱，口里是酸的，不饿，想吃点有味道的东西，本来有一包辣条，我没有买，在我坐在一边吃东西的时候，两个小孩过来买走了。 </description><content:encoded><![CDATA[<p>历经16个小时，终于回到了成都，我刚吃完饭，躺在床上，
老婆他们也关了门，但是灯还亮着。</p>
<p>从神木到西安，再从西安到成都，然后做地铁，最后骑共享单车，总算是到了。</p>
<p>累的不行，只是昨晚吃了一份过桥米线，在车站买了一瓶水，车上还买了一袋豆腐干，一袋猪皮，花了18块钱，口里是酸的，不饿，想吃点有味道的东西，本来有一包辣条，我没有买，在我坐在一边吃东西的时候，两个小孩过来买走了。</p>
<p>前半段是卧铺，我在最上层，朦胧中醒了好几次，车厢里还有点冷，感觉像是躺在棺材里一样，只能翻个身，坐起来就会碰到头。</p>
<p>我想要真是在棺材里就好了，不用起来了，太累了，不想折腾了。</p>
<p>在西安换乘的时候，还看到了一对夫妻吵架，他们拎着箱子背着包，有一大一小两个孩子，忽然那丈夫大吼一声，你岂不是有病！又补了一句，什么叫偷偷花钱？
妻子的声音小一些，说你要是说一声，我会同意的。丈夫又重复了几句，你是不是有病？什么叫偷偷花钱？场面看起来要大吵一架了，大一点的儿子连忙哄妈妈，还叫爸爸别说了，少说几句。</p>
<p>围观的人比较多，妻子挺住脚步，儿子在一边安慰，而丈夫责拉着小女儿上了车。</p>
<p>我想，不会如此巧合吧，因为我在不久之前，也因为钱和老婆吵架过，虽然不是激烈的争吵，但分歧是确实存在的。看他们这样，我仿佛看到了日后某一天的我们，也许会在一个时刻上演重复的剧情。</p>
<p>最后妈妈还是在儿子的撮合下上了车。</p>
<p>这一路其实没什么风景，之前很平常的，庄稼，树木，山川，车辆，夕阳，没有电影里那么美，也没有文字里那么细腻，可能我没有心情去欣赏风景吧。</p>
<p>成都还是那么拥挤，哪怕是晚上八点的地铁，依旧没有抢到位置，于是只有站着。我前面有一男一女，他们关系应该挺亲密，我扶着扶手，刚好可以看到那个男的的手时不时就摸到女的屁股前面去了，而且那个男的像一条蛇一样，在扶手上扭动，就算是压到我的手也浑然不知，我感觉他确实想跳一场钢管舞，只是地铁上人比较多，他不好发挥，只能想野猪一样在钢管上面蹭。而且我注意到，他的小拇指留着很长的指甲，近乎一厘米那么长，看起来像是女人的手指，但是他本人的体型又是那种微胖的体型，像一个塑料桶一样，耳根下面脖子上还有一个巨大的痣，痣上面有一根弯曲的毛发，像私处的毛。</p>
<p>大约有五六个站，他们在春熙路后两个站就下了，出门前还是手牵着手，好像年轻情侣一样，我估计他们今晚会大干一场，因为他们在公共场合看彼此的眼神都像是拉丝一样，还有那水桶一般的腰所演绎的地铁版钢管舞，简直是令人印象深刻。</p>
<p>其实成都没有我走的时候那么热了，甚至风吹的时候，是有些凉意的，路过以前生意很火的烧烤摊，一个食客都没有，以前我路过的时候，那些光着膀子撸串的人，一个都看不到了，路口卖西瓜的小贩也不在了，车没有停在之前的路口。</p>
]]></content:encoded>
    </item>
    <item>
      <title>8月还是很热</title>
      <link>https://goslion.com/diary/2025/20250810/</link>
      <pubDate>Sun, 10 Aug 2025 00:00:00 +0800</pubDate>
      <guid isPermaLink="true">https://goslion.com/diary/2025/20250810/</guid>
      <description>这周来了肃宁这边，这里也很热。出差来的路上，我和司机聊天，司机问我，说四川是不是没有那么热， 我说哪里都一样，夏天无处可避。 确实是这也，下车就感觉到一股热浪，感觉整个街道都在一个巨大的蒸笼里面，蝉叫的刺耳，路上也没几辆车。 上周差点离婚了，我也很难理解，只是觉得难受的很，吵了一架，后来又淡了。我确实有很多委屈无处可说，也无可争辩， 觉得已经是死局了，走不动了。 </description><content:encoded><![CDATA[<p>8月还是很热，这周来了肃宁这边，这里也很热。出差来的路上，我和司机聊天，司机问我，说四川是不是没有那么热，
我说哪里都一样，夏天无处可避。</p>
<p>确实是这也，下车就感觉到一股热浪，感觉整个街道都在一个巨大的蒸笼里面，蝉叫的刺耳，路上也没几辆车。</p>
<p>上周差点离婚了，我也很难理解，只是觉得难受的很，吵了一架，后来又淡了。我确实有很多委屈无处可说，也无可争辩，
觉得已经是死局了，走不动了。</p>
<p>马上就转正了，很难想象，我竟然走到了这般天地，开局有多开心，现在就有多难受，心里堵得慌，很是不顺，我自己当然知道，
不只是外部原因，只是很难平衡，一种东西被打破了，很难去复原。</p>
<p>其实工作也不顺，我遇到了瓶颈，感觉靠我的能力是无法解决的，只有靠别人，要不就是逃避，可是我很清楚，最后总是无处可以逃避的，
就像是这夏天，哪里都热，都一样。所以我还是尽量把自己能做的事情做了。我现在回想起来，好像每一份工作，我做到一定的程度，就会
遇到瓶颈，遇到陌生的东西，和超出自己能力范围外的事情，这就是一个规律，可我还没想到解决办法。</p>
<p>怎么办？我对自己很失望了，总是做不好，又做不对。所以，动力缺失了，对什么都没有兴趣，完完全全的，垂头丧气。</p>
<p>又被打败了吗？</p>
<hr>
<p>我接着继续写，上次是8月10号，写到一半，我已经不知道自己写的什么了，写不下去。今天22号，再过两个多小时，我就会坐上回成都的
火车，然后回去。</p>
<p>这些天发生了很多事情，我一直在外面出差，岳父又生病了，太令人崩溃了，没钱，也没时间。
所以这些事情想不得，人得骗自己，状况很好，才能活得下去。
本来十九号能回去的，结果又安排来这边，这边来了，其实也没干什么事情，因为根本干不了，也就是参加一个会议，然后结果是换服务器，
世界果然是一个巨大的草台班子，什么事情都有可能发生，我什么都不了解的情况下，就把我叫过来了，然后就是拉了一个远程会议，
最后做个总结纪要，就算完了。</p>
<p>今天是一直没有睡好，一点醒，两点醒，三点醒，现在快六点了，我不想再提心吊胆的睡一会，还是一会去车上睡觉比较好，在外面睡不好，
睡不踏实，也没怎么吃东西，这边没什么吃的，就是面，倒也吃的惯，就是不想吃，处于一个饿极了才会去找东西吃的状态。</p>
<p>这次出差很不顺利，这倒也正常，我已经接受了凡事必有意外的设定了，只是看能意外到什么程度吧。而且，我发的工资，早就垫付完了，
预支了3500块，现在又只剩一千多了，简直夸张，花钱如流水，而这些钱花的，大多数都没啥意义。</p>
<p>我爸我妈也拿了很多钱，不然早就撑不下去了，都是几千几千的拿，可惜我，又被困住了，又挣不到钱，又忙。</p>
<p>离开了这么多天，我甚至有些不敢回去了，因为我想象不到回去会面对什么。</p>
<p>怎么弄，现在就像下棋一样，越走越没有路了，走不动。所以吵架那天，我真一瞬间感觉这一切是如此的不真实，我是不是处于一个巨大的实验室内，
都拿我做实验呢？可惜的心理防线比较高，没那么容易失去理智。</p>
<p>其实仔细想想，我的心理防线已经很高了，能破我防的人，只能是来自内部了，我有很强大战术，可以抵御来自外部的攻击，但是却但不挡不住
来自内部的瓦解。我是不会哭的，严格意义上的，就是挤，也很难挤出眼泪，更别说发出声音，那也是不可能的，所以，应该没有下次了
，就算再难，也要撑住。</p>
<hr>
<p>2025年8月22日早上，于神木。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
