<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>凌羽</title>
  
  <subtitle>个人博客</subtitle>
  <link href="http://www.uilucky.com/atom.xml" rel="self"/>
  
  <link href="http://www.uilucky.com/"/>
  <updated>2026-06-30T02:16:22.939Z</updated>
  <id>http://www.uilucky.com/</id>
  
  <author>
    <name>NUK</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>详解 Xcode 中的 User Script Sandboxing 配置</title>
    <link href="http://www.uilucky.com/post/e10efe1c.html"/>
    <id>http://www.uilucky.com/post/e10efe1c.html</id>
    <published>2026-01-08T06:07:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>Xcode 构建脚本的权限管理与沙盒机制配置详解。</p><span id="more"></span><h1 id="User-Script-Sandboxing-的作用"><a href="#User-Script-Sandboxing-的作用" class="headerlink" title="User Script Sandboxing 的作用"></a>User Script Sandboxing 的作用</h1><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><p>在 Xcode 的较新版本中，默认开启了 <code>User Script Sandboxing</code>（用户脚本沙盒化）。这一设置旨在提高安全性，控制 Xcode 构建过程中脚本（Run Script Phase）的权限。</p><p>默认情况下（设置为 <code>YES</code>），Xcode 会将脚本限制在一个沙盒环境中运行，严格限制其对文件系统的访问。这意味着，如果你的脚本尝试访问或修改未在 Build Phase 的 Input/Output Files 中声明的文件，或者尝试写入项目目录之外的区域，构建往往会失败并报出 <code>Operation not permitted</code> 错误。</p><p>为了解决这个问题，特别是对于一些需要广泛文件访问权限的遗留脚本或工具，你可以将 <code>User Script Sandboxing</code> 设置为 <code>NO</code>。这将禁用沙盒限制，允许脚本在构建过程中自由访问和修改文件系统。</p><h2 id="如何禁用-User-Script-Sandboxing"><a href="#如何禁用-User-Script-Sandboxing" class="headerlink" title="如何禁用 User Script Sandboxing"></a>如何禁用 User Script Sandboxing</h2><ol><li> 打开 Xcode 项目，在左侧导航栏点击项目根节点（<code>.xcodeproj</code>）。</li><li> 在右侧编辑区域，选中你需要配置的 <strong>Target</strong>。</li><li> 点击顶部的 <strong>Build Settings</strong> 选项卡。</li><li> 在搜索框中输入 <code>User Script Sandboxing</code>（或者在 <strong>Build Options</strong> 分组下寻找）。</li><li> 将该选项的值从 <code>Yes</code> 修改为 <strong>No</strong>。</li></ol><p>这样设置后，你的构建脚本将不再受沙盒机制的阻拦，可以正常读写文件。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Xcode 构建脚本的权限管理与沙盒机制配置详解。&lt;/p&gt;</summary>
    
    
    
    
    <category term="iOS" scheme="http://www.uilucky.com/tags/iOS/"/>
    
    <category term="Xcode" scheme="http://www.uilucky.com/tags/Xcode/"/>
    
  </entry>
  
  <entry>
    <title>Linux 配置 SSH 免密登录极速指南</title>
    <link href="http://www.uilucky.com/post/edc1c02c.html"/>
    <id>http://www.uilucky.com/post/edc1c02c.html</id>
    <published>2024-11-17T07:07:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 Linux 环境下快速配置 SSH 密钥登录，实现免密码远程连接。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-生成密钥对"><a href="#1-生成密钥对" class="headerlink" title="1. 生成密钥对"></a>1. 生成密钥对</h2><p>首先，在当前主机上生成 RSA 密钥对。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa</span><br></pre></td></tr></table></figure><p>执行上述命令后，连续按三次 <strong>回车</strong> 键（全部使用默认选项：默认路径、空密码）。</p><p>完成后，系统会在 <code>~/.ssh</code> 目录下生成两个文件：</p><ul><li>  <code>id_rsa</code>：私钥（请妥善保管，勿泄露）</li><li>  <code>id_rsa.pub</code>：公钥（用于部署到目标服务器）</li></ul><p>你可以通过以下命令查看确认：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -l ~/.ssh/id_rsa*</span><br></pre></td></tr></table></figure><h2 id="2-部署公钥到目标服务器"><a href="#2-部署公钥到目标服务器" class="headerlink" title="2. 部署公钥到目标服务器"></a>2. 部署公钥到目标服务器</h2><p>使用 <code>ssh-copy-id</code> 命令将公钥自动添加到目标服务器的信任列表中。请将 <code>root@10.0.0.1</code> 替换为实际的用户名和 IP 地址。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-copy-id root@10.0.0.1</span><br></pre></td></tr></table></figure><p><em>注意：首次连接时，系统会提示你输入目标服务器的登录密码。</em></p><h2 id="3-验证连接"><a href="#3-验证连接" class="headerlink" title="3. 验证连接"></a>3. 验证连接</h2><p>配置完成后，尝试登录目标服务器：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh root@10.0.0.1</span><br></pre></td></tr></table></figure><p>此时应无需输入密码，直接登录成功。</p><hr><blockquote><p>参考来源：<a href="https://blog.csdn.net/Mortal3306/article/details/137372446">CSDN - 配置远程免密登录的最快方法</a></p></blockquote>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 Linux 环境下快速配置 SSH 密钥登录，实现免密码远程连接。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 20.04 安装 MySQL 8.0 及数据迁移避坑指南</title>
    <link href="http://www.uilucky.com/post/991102e6.html"/>
    <id>http://www.uilucky.com/post/991102e6.html</id>
    <published>2024-11-04T08:26:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文记录了在 Ubuntu 20.04 系统下安装 MySQL 8.0、进行安全配置以及修改数据存储目录时遇到的权限问题与解决方案。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><blockquote><p>参考来源: <a href="https://blog.csdn.net/Mortal3306/article/details/137372446">CSDN</a></p></blockquote><h2 id="1-安装-MySQL-8-0"><a href="#1-安装-MySQL-8-0" class="headerlink" title="1. 安装 MySQL 8.0"></a>1. 安装 MySQL 8.0</h2><p>使用 <code>apt</code> 包管理器进行快速安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt upgrade -y</span><br><span class="line">sudo apt install mysql-server -y</span><br></pre></td></tr></table></figure><h2 id="2-安全初始化"><a href="#2-安全初始化" class="headerlink" title="2. 安全初始化"></a>2. 安全初始化</h2><p>安装完成后，执行安全脚本以移除默认的不安全设置（如匿名用户、远程 root 登录等）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo mysql_secure_installation</span><br></pre></td></tr></table></figure><p>按照提示操作，建议：</p><ul><li>  启用密码强度验证</li><li>  移除匿名用户</li><li>  禁止 root 远程登录</li><li>  移除测试数据库</li></ul><h2 id="3-修改数据存储目录（避坑重点）"><a href="#3-修改数据存储目录（避坑重点）" class="headerlink" title="3. 修改数据存储目录（避坑重点）"></a>3. 修改数据存储目录（避坑重点）</h2><p>默认情况下，MySQL 的数据存放在 <code>/var/lib/mysql</code>。如果需要迁移到独立的硬盘（例如 <code>/mysql/data</code>），需要修改配置文件。</p><h3 id="3-1-修改配置文件"><a href="#3-1-修改配置文件" class="headerlink" title="3.1 修改配置文件"></a>3.1 修改配置文件</h3><p>编辑 <code>/etc/mysql/mysql.conf.d/mysqld.cnf</code> (或 <code>/etc/my.cnf</code>)：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="comment"># 修改 datadir 为新路径</span></span><br><span class="line"><span class="attr">datadir</span>=/mysql/data</span><br></pre></td></tr></table></figure><h3 id="3-2-解决-AppArmor-权限报错"><a href="#3-2-解决-AppArmor-权限报错" class="headerlink" title="3.2 解决 AppArmor 权限报错"></a>3.2 解决 AppArmor 权限报错</h3><p>修改目录并重启 MySQL 后，可能会遇到启动失败，查看状态 (<code>systemctl status mysql</code>) 发现报错：<code>Error: 13 (Permission denied)</code>。</p><p>即使你已经将文件夹权限赋予了 <code>mysql:mysql</code>，依然无法启动。这是因为 Ubuntu 的 <strong>AppArmor</strong> 安全模块限制了 MySQL 进程对文件系统的访问。</p><p><strong>解决方法：</strong></p><p>编辑 AppArmor 的 MySQL 配置文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/apparmor.d/usr.sbin.mysqld</span><br></pre></td></tr></table></figure><p>找到关于 <code>/var/lib/mysql/</code> 的规则，将其修改为你的新目录，或者新增规则：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 允许访问新的数据目录</span></span><br><span class="line">/mysql/data/ r,</span><br><span class="line">/mysql/data/** rwk,</span><br></pre></td></tr></table></figure><p>重启 AppArmor 和 MySQL 服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo /etc/init.d/apparmor restart</span><br><span class="line">sudo systemctl restart mysql</span><br></pre></td></tr></table></figure><p><em>或者（不推荐）临时关闭 AppArmor：</em></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl stop apparmor</span><br></pre></td></tr></table></figure><h2 id="4-密码重置与初始化-troubleshooting"><a href="#4-密码重置与初始化-troubleshooting" class="headerlink" title="4. 密码重置与初始化 troubleshooting"></a>4. 密码重置与初始化 troubleshooting</h2><p>如果忘记 root 密码，可以通过跳过权限表方式重置。</p><ol><li>编辑配置文件，在 <code>[mysqld]</code> 下添加： <figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">skip-grant-tables</span><br></pre></td></tr></table></figure></li><li> 重启服务。</li><li>无密码登录 MySQL： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mysql -u root</span><br></pre></td></tr></table></figure></li><li>执行重置 SQL： <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">flush privileges;</span><br><span class="line">use mysql;</span><br><span class="line"><span class="comment">-- MySQL 8.0 修改密码语法</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">user</span> <span class="string">&#x27;root&#x27;</span>@<span class="string">&#x27;localhost&#x27;</span> identified <span class="keyword">by</span> <span class="string">&#x27;你的新密码&#x27;</span>;</span><br><span class="line">flush privileges;</span><br></pre></td></tr></table></figure></li><li> 移除 <code>skip-grant-tables</code> 并重启服务。</li></ol><p><strong>注意</strong>：如果是 Systemd 管理的服务，修改用户或目录后，需确保 <code>/lib/systemd/system/mysql.service</code> 中的 <code>User</code> 和 <code>Group</code> 设置正确。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文记录了在 Ubuntu 20.04 系统下安装 MySQL 8.0、进行安全配置以及修改数据存储目录时遇到的权限问题与解决方案。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="mysql" scheme="http://www.uilucky.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>MySQL 主从复制与双主双从架构部署指南</title>
    <link href="http://www.uilucky.com/post/cb94082.html"/>
    <id>http://www.uilucky.com/post/cb94082.html</id>
    <published>2024-10-31T06:26:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文详细介绍了 MySQL 主从复制（Master-Slave）及双主双从（Master-Master with Slaves）高可用架构的搭建与配置方法。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><blockquote><p>参考来源: <a href="https://www.cnblogs.com/cao-lei/p/13603043.html">CNBlogs</a></p></blockquote><h2 id="1-原理概述"><a href="#1-原理概述" class="headerlink" title="1. 原理概述"></a>1. 原理概述</h2><h3 id="1-1-主从复制机制"><a href="#1-1-主从复制机制" class="headerlink" title="1.1 主从复制机制"></a>1.1 主从复制机制</h3><p>将主数据库（Master）的 DDL 和 DML 操作日志记录到二进制日志文件（<strong>Binary Log</strong>）中。从库（Slave）通过 I/O 线程请求主库的 Binlog，并将其写入到本地的中继日志（<strong>Relay Log</strong>）中。SQL 线程随后读取 Relay Log 并重放这些操作，从而实现数据同步。</p><h3 id="1-2-架构作用"><a href="#1-2-架构作用" class="headerlink" title="1.2 架构作用"></a>1.2 架构作用</h3><ul><li>  <strong>高可用性</strong>：主库故障时，可快速切换至从库。</li><li>  <strong>负载均衡</strong>：实现读写分离，减轻主库压力。</li><li>  <strong>数据备份</strong>：作为实时备份，保障数据安全。</li></ul><hr><h2 id="2-一主一从配置-Master-Slave"><a href="#2-一主一从配置-Master-Slave" class="headerlink" title="2. 一主一从配置 (Master-Slave)"></a>2. 一主一从配置 (Master-Slave)</h2><p><strong>服务器规划</strong></p><table><thead><tr><th align="left">服务器IP</th><th align="left">角色</th></tr></thead><tbody><tr><td align="left">192.168.133.129</td><td align="left">Master (主)</td></tr><tr><td align="left">192.168.133.130</td><td align="left">Slave (从)</td></tr></tbody></table><h3 id="2-1-主数据库-Master-安装与配置"><a href="#2-1-主数据库-Master-安装与配置" class="headerlink" title="2.1 主数据库 (Master) 安装与配置"></a>2.1 主数据库 (Master) 安装与配置</h3><p>假设使用 MySQL 8.0.20，安装过程略（解压、授权、初始化）。重点在于 <code>my.cnf</code> 配置。</p><p><strong>修改 <code>/etc/my.cnf</code>：</strong></p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="attr">basedir</span>=/usr/local/mysql-<span class="number">8.0</span>.<span class="number">20</span></span><br><span class="line"><span class="attr">datadir</span>=/usr/local/mysql-<span class="number">8.0</span>.<span class="number">20</span>/data</span><br><span class="line"><span class="attr">character-set-server</span>=utf8</span><br><span class="line"><span class="comment"># 区分大小写设置</span></span><br><span class="line"><span class="attr">lower-case-table-names</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">default_authentication_plugin</span>=mysql_native_password</span><br><span class="line"></span><br><span class="line"><span class="comment"># === 主从复制 - Master 配置 ===</span></span><br><span class="line"><span class="comment"># 唯一ID，必须区分</span></span><br><span class="line"><span class="attr">server-id</span>=<span class="number">1</span></span><br><span class="line"><span class="comment"># 启用二进制日志</span></span><br><span class="line"><span class="attr">log-bin</span>=mysql-bin</span><br><span class="line"><span class="comment"># 格式</span></span><br><span class="line"><span class="attr">binlog_format</span>=STATEMENT</span><br><span class="line"><span class="comment"># 需要同步的库</span></span><br><span class="line"><span class="attr">binlog-do-db</span>=test</span><br><span class="line"><span class="comment"># 忽略的库</span></span><br><span class="line"><span class="attr">binlog-ignore-db</span>=sys</span><br><span class="line"><span class="attr">binlog-ignore-db</span>=mysql</span><br><span class="line"><span class="attr">binlog-ignore-db</span>=information_schema</span><br><span class="line"><span class="attr">binlog-ignore-db</span>=performance_schema</span><br></pre></td></tr></table></figure><p><strong>创建同步用户：</strong></p><p>登录 Master 数据库执行：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 创建用户</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">&#x27;slave&#x27;</span>@<span class="string">&#x27;%&#x27;</span> identified <span class="keyword">with</span> mysql_native_password <span class="keyword">by</span> <span class="string">&#x27;password&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授权复制权限</span></span><br><span class="line"><span class="keyword">grant</span> replication slave <span class="keyword">on</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">&#x27;slave&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 刷新权限</span></span><br><span class="line">flush privileges;</span><br></pre></td></tr></table></figure><p><strong>获取 Master 状态：</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> master status;</span><br></pre></td></tr></table></figure><p><em>记录下结果中的 <code>File</code> (文件名) 和 <code>Position</code> (位置)，例如 <code>mysql-bin.000001</code> 和 <code>156</code>。</em></p><h3 id="2-2-从数据库-Slave-安装与配置"><a href="#2-2-从数据库-Slave-安装与配置" class="headerlink" title="2.2 从数据库 (Slave) 安装与配置"></a>2.2 从数据库 (Slave) 安装与配置</h3><p><strong>修改 <code>/etc/my.cnf</code>：</strong></p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="attr">basedir</span>=/usr/local/mysql-<span class="number">8.0</span>.<span class="number">20</span></span><br><span class="line"><span class="attr">datadir</span>=/usr/local/mysql-<span class="number">8.0</span>.<span class="number">20</span>/data</span><br><span class="line"></span><br><span class="line"><span class="comment"># === 主从复制 - Slave 配置 ===</span></span><br><span class="line"><span class="comment"># 唯一ID，不能与Master相同</span></span><br><span class="line"><span class="attr">server-id</span>=<span class="number">2</span></span><br><span class="line"><span class="comment"># 启用中继日志</span></span><br><span class="line"><span class="attr">relay-log</span>=mysql-relay</span><br></pre></td></tr></table></figure><p><strong>配置同步参数：</strong></p><p>登录 Slave 数据库执行：</p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- 设置 Master 信息</span></span><br><span class="line">change master <span class="keyword">to</span> </span><br><span class="line">    master_host<span class="operator">=</span><span class="string">&#x27;192.168.133.129&#x27;</span>,</span><br><span class="line">    master_port<span class="operator">=</span><span class="number">3306</span>,</span><br><span class="line">    master_user<span class="operator">=</span><span class="string">&#x27;slave&#x27;</span>,</span><br><span class="line">    master_password<span class="operator">=</span><span class="string">&#x27;password&#x27;</span>,</span><br><span class="line">    master_log_file<span class="operator">=</span><span class="string">&#x27;mysql-bin.000001&#x27;</span>, <span class="comment">-- 刚才记录的文件名</span></span><br><span class="line">    master_log_pos<span class="operator">=</span><span class="number">156</span>;                 <span class="comment">-- 刚才记录的位置</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 启动同步</span></span><br><span class="line"><span class="keyword">start</span> slave;</span><br></pre></td></tr></table></figure><p><strong>验证状态：</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> slave status\G</span><br></pre></td></tr></table></figure><p><em>检查 <code>Slave_IO_Running</code> 和 <code>Slave_SQL_Running</code> 是否均为 <code>Yes</code>。</em></p><hr><h2 id="3-双主双从配置-Dual-Master"><a href="#3-双主双从配置-Dual-Master" class="headerlink" title="3. 双主双从配置 (Dual Master)"></a>3. 双主双从配置 (Dual Master)</h2><p>双主架构意味着两台服务器互为主从（Master1 是 Master2 的主，Master2 也是 Master1 的主），并且各自带一个从库。</p><p><strong>服务器规划</strong></p><table><thead><tr><th align="left">服务器IP</th><th align="left">角色</th><th align="left">说明</th></tr></thead><tbody><tr><td align="left">192.168.133.129</td><td align="left">Master1</td><td align="left">与 Master2 互为主备</td></tr><tr><td align="left">192.168.133.131</td><td align="left">Master2</td><td align="left">与 Master1 互为主备</td></tr><tr><td align="left">192.168.133.130</td><td align="left">Slave1</td><td align="left">Master1 的从库</td></tr><tr><td align="left">192.168.133.132</td><td align="left">Slave2</td><td align="left">Master2 的从库</td></tr></tbody></table><h3 id="3-1-配置文件差异"><a href="#3-1-配置文件差异" class="headerlink" title="3.1 配置文件差异"></a>3.1 配置文件差异</h3><p>关键在于<strong>自增 ID</strong>的配置，防止双主写入冲突。</p><p><strong>Master1 配置 (<code>my.cnf</code>)</strong></p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server-id</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">log-bin</span>=mysql-bin</span><br><span class="line">log-slave-updates   <span class="comment"># 允许将复制来的数据写入自己的 binlog (级联复制需要)</span></span><br><span class="line"><span class="attr">auto-increment-increment</span>=<span class="number">2</span>  <span class="comment"># 自增步长</span></span><br><span class="line"><span class="attr">auto-increment-offset</span>=<span class="number">1</span>     <span class="comment"># 起始值 (1, 3, 5...)</span></span><br></pre></td></tr></table></figure><p><strong>Master2 配置 (<code>my.cnf</code>)</strong></p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">server-id</span>=<span class="number">3</span></span><br><span class="line"><span class="attr">log-bin</span>=mysql-bin</span><br><span class="line">log-slave-updates</span><br><span class="line"><span class="attr">auto-increment-increment</span>=<span class="number">2</span></span><br><span class="line"><span class="attr">auto-increment-offset</span>=<span class="number">2</span>     <span class="comment"># 起始值 (2, 4, 6...)</span></span><br></pre></td></tr></table></figure><h3 id="3-2-互为主从设置"><a href="#3-2-互为主从设置" class="headerlink" title="3.2 互为主从设置"></a>3.2 互为主从设置</h3><ol><li> 在 <strong>Master1</strong> 上创建同步用户，并执行 <code>change master to ...</code> 指向 <strong>Master2</strong>。</li><li> 在 <strong>Master2</strong> 上创建同步用户，并执行 <code>change master to ...</code> 指向 <strong>Master1</strong>。</li><li> 两边都执行 <code>start slave</code>。</li></ol><h3 id="3-3-从库挂载"><a href="#3-3-从库挂载" class="headerlink" title="3.3 从库挂载"></a>3.3 从库挂载</h3><ul><li>  <strong>Slave1</strong> 配置 <code>change master to</code> 指向 <strong>Master1</strong>。</li><li>  <strong>Slave2</strong> 配置 <code>change master to</code> 指向 <strong>Master2</strong>。</li></ul><p>这样就构成了完整的双主双从高可用架构。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文详细介绍了 MySQL 主从复制（Master-Slave）及双主双从（Master-Master with Slaves）高可用架构的搭建与配置方法。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="mysql" scheme="http://www.uilucky.com/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>MongoDB 单机安装与副本集集群部署指南</title>
    <link href="http://www.uilucky.com/post/47e26df1.html"/>
    <id>http://www.uilucky.com/post/47e26df1.html</id>
    <published>2024-10-21T01:17:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文详细记录了 MongoDB 在 Linux 环境下的单机安装与副本集（Replica Set）集群部署全流程。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-下载与安装"><a href="#1-下载与安装" class="headerlink" title="1. 下载与安装"></a>1. 下载与安装</h2><p>请根据需求下载对应的 MongoDB 版本。</p><ul><li>  <strong>MongoDB 6.0</strong>: <a href="https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.12.tgz">下载链接</a></li><li>  <strong>MongoDB 5.0</strong>: <a href="https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.23.tgz">下载链接</a></li></ul><p>以下以 <strong>MongoDB 5.0</strong> 为例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /usr/local/</span><br><span class="line"><span class="comment"># 下载安装包</span></span><br><span class="line">wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-5.0.23.tgz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解压并重命名</span></span><br><span class="line">tar -zxvf mongodb-linux-x86_64-rhel70-5.0.23.tgz</span><br><span class="line"><span class="built_in">mv</span> mongodb-linux-x86_64-rhel70-5.0.23 mongodb</span><br><span class="line"><span class="built_in">rm</span> mongodb-linux-x86_64-rhel70-5.0.23.tgz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建数据和日志目录</span></span><br><span class="line"><span class="built_in">cd</span> /data/</span><br><span class="line"><span class="built_in">mkdir</span> mongodb</span><br><span class="line"><span class="built_in">cd</span> mongodb/</span><br><span class="line"><span class="built_in">mkdir</span> logs data conf</span><br></pre></td></tr></table></figure><h2 id="2-环境变量配置"><a href="#2-环境变量配置" class="headerlink" title="2. 环境变量配置"></a>2. 环境变量配置</h2><p>编辑 <code>/etc/profile</code> 文件，添加 MongoDB 路径到 PATH。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/profile</span><br></pre></td></tr></table></figure><p>添加如下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> MONGO_HOME=/usr/local/mongodb</span><br><span class="line"><span class="built_in">export</span> PATH=<span class="variable">$PATH</span>:<span class="variable">$MONGO_HOME</span>/bin;</span><br></pre></td></tr></table></figure><p>使配置生效：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure><h2 id="3-配置文件"><a href="#3-配置文件" class="headerlink" title="3. 配置文件"></a>3. 配置文件</h2><p>新建并编辑配置文件 <code>/data/mongodb/conf/mongodb.conf</code>：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">port</span>=<span class="number">27017</span> <span class="comment"># 端口</span></span><br><span class="line"><span class="attr">bind_ip</span>=<span class="number">0.0</span>.<span class="number">0.0</span> <span class="comment"># 允许任意IP连接</span></span><br><span class="line"><span class="attr">dbpath</span>=/data/mongodb/data <span class="comment"># 数据库存放路径</span></span><br><span class="line"><span class="attr">logpath</span>=/data/mongodb/logs/mongodb.log <span class="comment"># 日志文件路径</span></span><br><span class="line"><span class="attr">fork</span>=<span class="literal">true</span> <span class="comment"># 后台运行</span></span><br><span class="line"><span class="attr">auth</span>=<span class="literal">true</span> <span class="comment"># 开启认证</span></span><br></pre></td></tr></table></figure><h2 id="4-解决依赖问题-可选"><a href="#4-解决依赖问题-可选" class="headerlink" title="4. 解决依赖问题 (可选)"></a>4. 解决依赖问题 (可选)</h2><p>如果在启动时报错缺少 <code>ssl.so.10</code> 等文件，说明缺少 <code>compat-openssl10</code> 库。</p><p><a href="https://pkgs.sysadmins.ws/el8/extras/x86_64/compat-openssl10-1.0.2o-3.el8.x86_64.rpm">下载 compat-openssl10</a> 并安装：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rpm -ivh compat-openssl10-1.0.2o-3.el8.x86_64.rpm</span><br></pre></td></tr></table></figure><h2 id="5-服务管理"><a href="#5-服务管理" class="headerlink" title="5. 服务管理"></a>5. 服务管理</h2><h3 id="启动与停止"><a href="#启动与停止" class="headerlink" title="启动与停止"></a>启动与停止</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动</span></span><br><span class="line">mongod --config /data/mongodb/conf/mongodb.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># 停止</span></span><br><span class="line">killall mongod</span><br></pre></td></tr></table></figure><h3 id="配置开机自启-init-d-方式"><a href="#配置开机自启-init-d-方式" class="headerlink" title="配置开机自启 (init.d 方式)"></a>配置开机自启 (init.d 方式)</h3><p>创建启动脚本 <code>/etc/init.d/mongodb.sh</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/init.d/mongodb.sh</span><br></pre></td></tr></table></figure><p>写入以下内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="comment">#chkconfig: 2345 80 90</span></span><br><span class="line"><span class="comment">#description: mongodb</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">start</span></span>() &#123;</span><br><span class="line">    /usr/local/mongodb/bin/mongod --config /data/mongodb/conf/mongodb.conf</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">stop</span></span>() &#123;</span><br><span class="line">    /usr/local/mongodb/bin/mongod --config /data/mongodb/conf/mongodb.conf --shutdown</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="string">&quot;<span class="variable">$1</span>&quot;</span> <span class="keyword">in</span></span><br><span class="line">    start)</span><br><span class="line">        start</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;mongodb start&quot;</span></span><br><span class="line">        ;;</span><br><span class="line">    stop)</span><br><span class="line">        stop</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;mongodb stop&quot;</span></span><br><span class="line">        ;;</span><br><span class="line">    restart)</span><br><span class="line">        stop</span><br><span class="line">        start</span><br><span class="line">        <span class="built_in">echo</span> <span class="string">&quot;mongodb restart&quot;</span></span><br><span class="line">        ;;</span><br><span class="line"><span class="keyword">esac</span></span><br></pre></td></tr></table></figure><p>赋予权限并添加到服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x /etc/init.d/mongodb.sh</span><br><span class="line">chkconfig --add mongodb.sh</span><br><span class="line">chkconfig mongodb.sh on</span><br></pre></td></tr></table></figure><h2 id="6-创建管理员用户"><a href="#6-创建管理员用户" class="headerlink" title="6. 创建管理员用户"></a>6. 创建管理员用户</h2><p>启动 MongoDB 后，进入控制台创建管理员账号。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 进入 mongo shell</span><br><span class="line">mongo</span><br><span class="line"></span><br><span class="line">use admin</span><br><span class="line">db.<span class="title function_">createUser</span>(&#123;</span><br><span class="line">    <span class="attr">user</span>: <span class="string">&#x27;admin&#x27;</span>,</span><br><span class="line">    <span class="attr">pwd</span>: <span class="string">&#x27;123456&#x27;</span>,</span><br><span class="line">    <span class="attr">roles</span>: [&#123; <span class="attr">role</span>: <span class="string">&#x27;root&#x27;</span>, <span class="attr">db</span>: <span class="string">&#x27;admin&#x27;</span> &#125;]</span><br><span class="line">&#125;)</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><p>连接格式示例：<br><code>mongodb://root:****@xx.xx.xx.xx:27017</code></p><h2 id="7-备份与恢复"><a href="#7-备份与恢复" class="headerlink" title="7. 备份与恢复"></a>7. 备份与恢复</h2><p><strong>全库导出 (mongodump)</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mongodump -h localhost --port 27017 -u admin -p 123456 --out /data/mongo_backup/directory</span><br></pre></td></tr></table></figure><p><strong>全库导入 (mongorestore)</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mongorestore -h localhost --port 27017  -u admin -p 123456 --drop /data/mongo_backup/directory</span><br></pre></td></tr></table></figure><hr><h2 id="8-副本集（Cluster）搭建"><a href="#8-副本集（Cluster）搭建" class="headerlink" title="8. 副本集（Cluster）搭建"></a>8. 副本集（Cluster）搭建</h2><p>副本集（Replica Set）提供了更高的数据可用性。三台机器配置类似，区别在于配置文件及后续的初始化。</p><h3 id="8-1-修改配置文件"><a href="#8-1-修改配置文件" class="headerlink" title="8.1 修改配置文件"></a>8.1 修改配置文件</h3><p>在每台机器的 <code>mongodb.conf</code> 中添加 <code>replSet</code> 配置，并确保 <code>keyFile</code> 一致。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">port</span> = <span class="number">27017</span></span><br><span class="line"><span class="attr">bind_ip</span> = <span class="number">0.0</span>.<span class="number">0.0</span></span><br><span class="line"><span class="attr">replSet</span> = rs0  <span class="comment"># 集群名字</span></span><br><span class="line"><span class="attr">dbpath</span> = /usr/local/mongodb/data/db</span><br><span class="line"><span class="attr">logpath</span> = /usr/local/mongodb/data/logs/mongodb.log</span><br><span class="line"><span class="attr">fork</span> = <span class="literal">true</span></span><br><span class="line"><span class="attr">logappend</span> = <span class="literal">true</span></span><br><span class="line"><span class="attr">auth</span> = <span class="literal">true</span> <span class="comment"># 开启认证</span></span><br><span class="line"><span class="attr">keyFile</span> = /usr/local/mongodb/data/mongodb.key <span class="comment"># 安全认证文件</span></span><br></pre></td></tr></table></figure><h3 id="8-2-生成并分发-KeyFile"><a href="#8-2-生成并分发-KeyFile" class="headerlink" title="8.2 生成并分发 KeyFile"></a>8.2 生成并分发 KeyFile</h3><p>KeyFile 用于节点间的内部认证，必须一致且权限正确（600）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 生成密钥</span></span><br><span class="line">openssl rand -<span class="built_in">base64</span> 756 &gt; mongodb.key</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改权限 (必须是 600，否则启动会报错)</span></span><br><span class="line"><span class="built_in">chmod</span> 600 mongodb.key</span><br></pre></td></tr></table></figure><p>将生成的 <code>mongodb.key</code> 复制到所有节点的对应目录下。</p><h3 id="8-3-初始化副本集"><a href="#8-3-初始化副本集" class="headerlink" title="8.3 初始化副本集"></a>8.3 初始化副本集</h3><p>启动所有节点的 MongoDB 服务。登录任意一台（作为主节点），执行初始化：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">rs.<span class="title function_">initiate</span>(&#123;</span><br><span class="line">     <span class="attr">_id</span>: <span class="string">&quot;rs0&quot;</span>,</span><br><span class="line">     <span class="attr">members</span>: [</span><br><span class="line">        &#123; _id : <span class="number">0</span>, host : <span class="string">&quot;192.168.56.101:27018&quot;</span> &#125;,</span><br><span class="line">        &#123; _id : <span class="number">1</span>, host : <span class="string">&quot;192.168.56.102:27018&quot;</span> &#125;,</span><br><span class="line">        &#123; _id : <span class="number">2</span>, host : <span class="string">&quot;192.168.56.103:27018&quot;</span> &#125;</span><br><span class="line">      ]</span><br><span class="line"> &#125;);</span><br></pre></td></tr></table></figure><p>查看状态：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rs.<span class="title function_">status</span>()</span><br></pre></td></tr></table></figure><h3 id="8-4-创建集群用户"><a href="#8-4-创建集群用户" class="headerlink" title="8.4 创建集群用户"></a>8.4 创建集群用户</h3><p>在 <strong>PRIMARY</strong> 节点上创建用户：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">use admin</span><br><span class="line">db.<span class="title function_">createUser</span>(&#123;<span class="attr">user</span>: <span class="string">&#x27;handle&#x27;</span>, <span class="attr">pwd</span>: <span class="string">&#x27;123456&#x27;</span>, <span class="attr">roles</span>: [<span class="string">&#x27;root&#x27;</span>]&#125;)</span><br></pre></td></tr></table></figure><h3 id="8-5-修改集群-IP-Reconfig"><a href="#8-5-修改集群-IP-Reconfig" class="headerlink" title="8.5 修改集群 IP (Reconfig)"></a>8.5 修改集群 IP (Reconfig)</h3><p>如果服务器 IP 发生变更，需要重新配置集群。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">use admin;</span><br><span class="line">db.<span class="title function_">auth</span>(<span class="string">&quot;admin&quot;</span>, <span class="string">&quot;admin12#$&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取当前配置</span></span><br><span class="line">cfg = rs.<span class="title function_">conf</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 修改 Host</span></span><br><span class="line">cfg.<span class="property">members</span>[<span class="number">0</span>].<span class="property">host</span> = <span class="string">&quot;192.168.1.10:27017&quot;</span>;</span><br><span class="line">cfg.<span class="property">members</span>[<span class="number">1</span>].<span class="property">host</span> = <span class="string">&quot;192.168.1.110:27017&quot;</span>;</span><br><span class="line">cfg.<span class="property">members</span>[<span class="number">2</span>].<span class="property">host</span> = <span class="string">&quot;192.168.1.12:27017&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 应用新配置</span></span><br><span class="line"><span class="comment">// 注意：如果当前节点不是 Primary，可能需要强制执行</span></span><br><span class="line">rs.<span class="title function_">reconfig</span>(cfg, &#123;<span class="attr">force</span>: <span class="literal">true</span>&#125;);</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文详细记录了 MongoDB 在 Linux 环境下的单机安装与副本集（Replica Set）集群部署全流程。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Mongo" scheme="http://www.uilucky.com/tags/Mongo/"/>
    
  </entry>
  
  <entry>
    <title>Linux 环境下 Docker 及 Docker Compose 离线安装指南</title>
    <link href="http://www.uilucky.com/post/dfb69114.html"/>
    <id>http://www.uilucky.com/post/dfb69114.html</id>
    <published>2024-08-07T01:17:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文详细记录了在 Linux 服务器上离线安装 Docker 和 Docker Compose 的步骤。</p><span id="more"></span><p>关注公众号，回复“docker”获取下载地址</p><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-Docker-离线安装"><a href="#1-Docker-离线安装" class="headerlink" title="1. Docker 离线安装"></a>1. Docker 离线安装</h2><h3 id="1-1-安装二进制文件"><a href="#1-1-安装二进制文件" class="headerlink" title="1.1 安装二进制文件"></a>1.1 安装二进制文件</h3><p>首先获取离线安装包（例如 <code>docker-24.0.6.tgz</code>），然后解压并移动到系统路径中。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 解压缩</span></span><br><span class="line">tar -zxvf docker-24.0.6.tgz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将 Docker 二进制文件复制到 /usr/bin</span></span><br><span class="line">sudo <span class="built_in">cp</span> docker/* /usr/bin/</span><br></pre></td></tr></table></figure><h3 id="1-2-配置-Systemd-服务"><a href="#1-2-配置-Systemd-服务" class="headerlink" title="1.2 配置 Systemd 服务"></a>1.2 配置 Systemd 服务</h3><p>创建 Docker 的 Systemd 服务文件，以便通过 <code>systemctl</code> 管理。</p><p>创建文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/systemd/system/docker.service</span><br></pre></td></tr></table></figure><p>写入以下内容：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Docker Application Container Engine</span><br><span class="line"><span class="attr">Documentation</span>=https://docs.docker.com</span><br><span class="line"><span class="attr">After</span>=network-<span class="literal">on</span>line.target firewalld.service</span><br><span class="line"><span class="attr">Wants</span>=network-<span class="literal">on</span>line.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=notify</span><br><span class="line"><span class="comment"># 指向刚才复制二进制文件的位置</span></span><br><span class="line"><span class="attr">ExecStart</span>=/usr/bin/dockerd</span><br><span class="line"><span class="attr">ExecReload</span>=/bin/kill -s HUP <span class="variable">$MAINPID</span></span><br><span class="line"><span class="attr">LimitNOFILE</span>=infinity</span><br><span class="line"><span class="attr">LimitNPROC</span>=infinity</span><br><span class="line"><span class="attr">TimeoutStartSec</span>=<span class="number">0</span></span><br><span class="line"><span class="attr">Delegate</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">KillMode</span>=process</span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">on</span>-failure</span><br><span class="line"><span class="attr">StartLimitBurst</span>=<span class="number">3</span></span><br><span class="line"><span class="attr">StartLimitInterval</span>=<span class="number">60</span>s</span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><h3 id="1-3-启动-Docker-服务"><a href="#1-3-启动-Docker-服务" class="headerlink" title="1.3 启动 Docker 服务"></a>1.3 启动 Docker 服务</h3><p>赋权并启动服务，同时设置开机自启。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 赋予执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x /etc/systemd/system/docker.service</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重载 daemon 配置</span></span><br><span class="line">systemctl daemon-reload </span><br><span class="line"></span><br><span class="line"><span class="comment"># 开机自启</span></span><br><span class="line">systemctl <span class="built_in">enable</span> docker.service</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 Docker</span></span><br><span class="line">systemctl start docker</span><br></pre></td></tr></table></figure><hr><h2 id="2-Docker-Compose-离线安装"><a href="#2-Docker-Compose-离线安装" class="headerlink" title="2. Docker Compose 离线安装"></a>2. Docker Compose 离线安装</h2><p>Docker Compose 通常是一个独立的二进制文件，安装非常简单。</p><p>准备好 <code>docker-compose</code> 的 Linux 二进制文件（例如 <code>docker-compose-linux-x86_64</code>）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 移动到 bin 目录并重命名</span></span><br><span class="line"><span class="built_in">mv</span> docker-compose-linux-x86_64 /usr/local/bin/docker-compose</span><br><span class="line"></span><br><span class="line"><span class="comment"># 赋予执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x /usr/local/bin/docker-compose</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证安装</span></span><br><span class="line">docker-compose --version</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文详细记录了在 Linux 服务器上离线安装 Docker 和 Docker Compose 的步骤。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Docker" scheme="http://www.uilucky.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>MongoDB 常用管理命令速查</title>
    <link href="http://www.uilucky.com/post/51ab4f72.html"/>
    <id>http://www.uilucky.com/post/51ab4f72.html</id>
    <published>2024-08-02T09:26:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文总结了 MongoDB 日常运维中常用的管理命令，包括用户权限管理等操作。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-创建用户并分配权限"><a href="#1-创建用户并分配权限" class="headerlink" title="1. 创建用户并分配权限"></a>1. 创建用户并分配权限</h2><p>在 MongoDB 中创建用户通常需要切换到对应的数据库。</p><h3 id="管理员创建普通用户"><a href="#管理员创建普通用户" class="headerlink" title="管理员创建普通用户"></a>管理员创建普通用户</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 切换到 admin 数据库进行认证</span></span><br><span class="line">use admin</span><br><span class="line">db.<span class="title function_">auth</span>(<span class="string">&#x27;admin&#x27;</span>, <span class="string">&#x27;admin123!@#&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 切换到目标数据库，例如 prd-skyswan</span></span><br><span class="line">use prd-skyswan</span><br><span class="line"></span><br><span class="line"><span class="comment">// 创建用户并赋予读写权限</span></span><br><span class="line"><span class="comment">// user: 用户名</span></span><br><span class="line"><span class="comment">// pwd: 密码</span></span><br><span class="line"><span class="comment">// roles: 角色列表，readWrite 代表读写权限</span></span><br><span class="line">db.<span class="title function_">createUser</span>(&#123;</span><br><span class="line">    <span class="attr">user</span>: <span class="string">&quot;prd-skyswan&quot;</span>,</span><br><span class="line">    <span class="attr">pwd</span>: <span class="string">&quot;Abc123-=&quot;</span>,</span><br><span class="line">    <span class="attr">roles</span>: [&#123;</span><br><span class="line">        <span class="attr">role</span>: <span class="string">&quot;readWrite&quot;</span>,</span><br><span class="line">        <span class="attr">db</span>: <span class="string">&quot;prd-skyswan&quot;</span></span><br><span class="line">    &#125;]</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h2 id="2-查询用户"><a href="#2-查询用户" class="headerlink" title="2. 查询用户"></a>2. 查询用户</h2><p>查询系统中存在的所有用户信息，需要拥有足够权限（通常在 <code>admin</code> 库下查询）。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">use admin;</span><br><span class="line">db.<span class="property">system</span>.<span class="property">users</span>.<span class="title function_">find</span>();</span><br></pre></td></tr></table></figure><p>或者使用更标准的命令查看当前数据库用户：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">show users;</span><br></pre></td></tr></table></figure><h2 id="3-删除用户"><a href="#3-删除用户" class="headerlink" title="3. 删除用户"></a>3. 删除用户</h2><p>删除指定数据库中的用户。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 需先切换到用户所在的数据库</span></span><br><span class="line">use prd-skyswan;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 删除用户</span></span><br><span class="line">db.<span class="title function_">removeUser</span>(<span class="string">&#x27;prd-skyswan&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 或者使用新版命令</span></span><br><span class="line">db.<span class="title function_">dropUser</span>(<span class="string">&#x27;prd-skyswan&#x27;</span>);</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文总结了 MongoDB 日常运维中常用的管理命令，包括用户权限管理等操作。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Mac" scheme="http://www.uilucky.com/tags/Mac/"/>
    
  </entry>
  
  <entry>
    <title>Mac/Linux 常用 Zip 命令：分卷压缩与解压加密</title>
    <link href="http://www.uilucky.com/post/64b3b35e.html"/>
    <id>http://www.uilucky.com/post/64b3b35e.html</id>
    <published>2024-07-02T07:28:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>在传输大文件或备份数据时，我们经常需要用到分卷压缩（将大文件切分成多个小文件）以及加密压缩的功能。本文总结了 Mac 和 Linux 下 <code>zip</code> 命令的常用技巧。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-分卷压缩"><a href="#1-分卷压缩" class="headerlink" title="1. 分卷压缩"></a>1. 分卷压缩</h2><p>使用 <code>-s</code> 参数指定分卷大小。</p><h3 id="1-1-创建新的分卷压缩包"><a href="#1-1-创建新的分卷压缩包" class="headerlink" title="1.1 创建新的分卷压缩包"></a>1.1 创建新的分卷压缩包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 将 foo 文件夹压缩，每个分卷大小为 100MB</span></span><br><span class="line">zip -s 100m -r file.zip foo/</span><br></pre></td></tr></table></figure><ul><li>  <code>-s</code>: 指定每个分卷的大小 (可以使用 k, m, g, t)</li><li>  <code>-r</code>: 递归处理目录</li></ul><h3 id="1-2-切分已有的-Zip-文件"><a href="#1-2-切分已有的-Zip-文件" class="headerlink" title="1.2 切分已有的 Zip 文件"></a>1.2 切分已有的 Zip 文件</h3><p>如果已经有一个大的 zip 文件，想把它切分：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zip existing.zip --out new.zip -s 50m</span><br></pre></td></tr></table></figure><p>执行后会生成如下文件序列：</p><ul><li>  <code>new.zip</code></li><li>  <code>new.z01</code></li><li>  <code>new.z02</code></li><li>  …</li></ul><h2 id="2-解压分卷文件"><a href="#2-解压分卷文件" class="headerlink" title="2. 解压分卷文件"></a>2. 解压分卷文件</h2><p>解压分卷文件前，通常需要将其“合并”或让解压工具识别主文件。</p><h3 id="方式一：合并后解压（推荐）"><a href="#方式一：合并后解压（推荐）" class="headerlink" title="方式一：合并后解压（推荐）"></a>方式一：合并后解压（推荐）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 修复/合并分卷为一个单独的完整文件</span></span><br><span class="line">zip -s 0 new.zip --out single.zip</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 解压合并后的文件</span></span><br><span class="line">unzip single.zip</span><br></pre></td></tr></table></figure><h3 id="方式二：直接解压"><a href="#方式二：直接解压" class="headerlink" title="方式二：直接解压"></a>方式二：直接解压</h3><p>某些版本的 <code>unzip</code> 可能无法直接解压分卷，建议使用 <code>p7zip</code> 或上述合并方法。</p><h2 id="3-加密压缩"><a href="#3-加密压缩" class="headerlink" title="3. 加密压缩"></a>3. 加密压缩</h2><p>使用 <code>-e</code> 参数创建密码保护的 zip 包。</p><h3 id="3-1-创建加密包"><a href="#3-1-创建加密包" class="headerlink" title="3.1 创建加密包"></a>3.1 创建加密包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 压缩 file 目录并加密</span></span><br><span class="line">zip -e -r file.zip file/</span><br></pre></td></tr></table></figure><p>执行后系统会提示输入并确认密码。</p><h3 id="3-2-解压加密包"><a href="#3-2-解压加密包" class="headerlink" title="3.2 解压加密包"></a>3.2 解压加密包</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">unzip file.zip</span><br></pre></td></tr></table></figure><p>解压时会提示输入密码。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在传输大文件或备份数据时，我们经常需要用到分卷压缩（将大文件切分成多个小文件）以及加密压缩的功能。本文总结了 Mac 和 Linux 下 &lt;code&gt;zip&lt;/code&gt; 命令的常用技巧。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Mac" scheme="http://www.uilucky.com/tags/Mac/"/>
    
    <category term="Shell" scheme="http://www.uilucky.com/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>Mac 上使用 Ollama 本地运行 LLM 指南</title>
    <link href="http://www.uilucky.com/post/6399e4ff.html"/>
    <id>http://www.uilucky.com/post/6399e4ff.html</id>
    <published>2024-07-01T06:09:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 Mac（特别是 M 系列芯片）上安装和使用 Ollama，以便在本地流畅运行 Gemma、Llama 3 等大型语言模型。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-安装-Ollama"><a href="#1-安装-Ollama" class="headerlink" title="1. 安装 Ollama"></a>1. 安装 Ollama</h2><p>访问 Ollama 官网下载 macOS 版本进行安装：<br><a href="https://ollama.com/">https://ollama.com/</a></p><h2 id="2-常用命令速查"><a href="#2-常用命令速查" class="headerlink" title="2. 常用命令速查"></a>2. 常用命令速查</h2><h3 id="2-1-服务管理"><a href="#2-1-服务管理" class="headerlink" title="2.1 服务管理"></a>2.1 服务管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动 Ollama 服务 (一般安装后会自动启动)</span></span><br><span class="line">ollama serve</span><br></pre></td></tr></table></figure><h3 id="2-2-模型运行与管理"><a href="#2-2-模型运行与管理" class="headerlink" title="2.2 模型运行与管理"></a>2.2 模型运行与管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 运行模型 (如果模型不存在会自动下载)</span></span><br><span class="line"><span class="comment"># 例如运行 Google 的 Gemma 2</span></span><br><span class="line">ollama run gemma2:27b</span><br><span class="line"></span><br><span class="line"><span class="comment"># 从注册表拉取模型 (仅下载不运行)</span></span><br><span class="line">ollama pull llama3</span><br><span class="line"></span><br><span class="line"><span class="comment"># 列出本地所有模型</span></span><br><span class="line">ollama list</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除模型</span></span><br><span class="line">ollama <span class="built_in">rm</span> gemma2:27b</span><br></pre></td></tr></table></figure><h3 id="2-3-其他操作"><a href="#2-3-其他操作" class="headerlink" title="2.3 其他操作"></a>2.3 其他操作</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看模型详细信息</span></span><br><span class="line">ollama show gemma2:27b</span><br><span class="line"></span><br><span class="line"><span class="comment"># 复制模型 (用于创建副本或重命名)</span></span><br><span class="line">ollama <span class="built_in">cp</span> source-model new-model</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将模型推送到 ollama.com 注册表</span></span><br><span class="line">ollama push my-model</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看帮助</span></span><br><span class="line">ollama <span class="built_in">help</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看版本</span></span><br><span class="line">ollama -v</span><br></pre></td></tr></table></figure><h2 id="3-实战示例"><a href="#3-实战示例" class="headerlink" title="3. 实战示例"></a>3. 实战示例</h2><p><strong>运行 Gemma 2 (27B)</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ollama run gemma2:27b</span><br></pre></td></tr></table></figure><p>运行后，你将进入一个交互式的聊天界面，可以直接输入问题与模型进行对话。</p><p><img src="http://pic.uilucky.com/blog/source/assets/blogimage/20240701/14-03-44-PB3DeN_ZgQ43x.png" alt="14-03-44-PB3DeN_ZgQ43x"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 Mac（特别是 M 系列芯片）上安装和使用 Ollama，以便在本地流畅运行 Gemma、Llama 3 等大型语言模型。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Mac" scheme="http://www.uilucky.com/tags/Mac/"/>
    
    <category term="AI" scheme="http://www.uilucky.com/tags/AI/"/>
    
    <category term="Ollama" scheme="http://www.uilucky.com/tags/Ollama/"/>
    
  </entry>
  
  <entry>
    <title>Mac M1/M2 芯片如何拉取 x86_64 架构 Docker 镜像</title>
    <link href="http://www.uilucky.com/post/46e942e6.html"/>
    <id>http://www.uilucky.com/post/46e942e6.html</id>
    <published>2024-06-28T02:09:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>Mac M 系列芯片（Apple Silicon）采用 ARM64 架构，默认 <code>docker pull</code> 会拉取 <code>linux/arm64</code> 版本的镜像。如果需要运行仅支持 Intel (AMD64/x86_64) 的镜像，或者为了保持与生产环境（Linux x86）一致，需要显式指定平台架构。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-拉取指定架构镜像"><a href="#1-拉取指定架构镜像" class="headerlink" title="1. 拉取指定架构镜像"></a>1. 拉取指定架构镜像</h2><p>使用 <code>--platform</code> 参数来指定拉取 <code>linux/amd64</code> 架构的镜像。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker pull --platform=linux/amd64 ubuntu:20.04</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：运行跨架构镜像（通过 Rosetta 2 转译）可能会比原生 ARM 镜像慢，并且某些涉及底层指令的操作可能会失败。</p></blockquote><h2 id="2-验证镜像架构"><a href="#2-验证镜像架构" class="headerlink" title="2. 验证镜像架构"></a>2. 验证镜像架构</h2><p>拉取完成后，可以通过 <code>docker inspect</code> 命令来确认镜像的架构是否正确。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker inspect ubuntu:20.04 | grep Architecture</span><br></pre></td></tr></table></figure><p>输出应为：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">&quot;Architecture&quot;</span><span class="punctuation">:</span> <span class="string">&quot;amd64&quot;</span><span class="punctuation">,</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Mac M 系列芯片（Apple Silicon）采用 ARM64 架构，默认 &lt;code&gt;docker pull&lt;/code&gt; 会拉取 &lt;code&gt;linux/arm64&lt;/code&gt; 版本的镜像。如果需要运行仅支持 Intel (AMD64/x86_64) 的镜像，或者为了保持与生产环境（Linux x86）一致，需要显式指定平台架构。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Mac" scheme="http://www.uilucky.com/tags/Mac/"/>
    
    <category term="Docker" scheme="http://www.uilucky.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Linux 环境下离线安装 CDH 集群实战指南</title>
    <link href="http://www.uilucky.com/post/5a1d538c.html"/>
    <id>http://www.uilucky.com/post/5a1d538c.html</id>
    <published>2024-06-26T09:29:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文详细记录在 Linux 环境下离线部署 Cloudera Manager (CM) 和 CDH 集群的全过程，包括 HBase、JDK、MySQL 等组件的安装与配置。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-环境准备"><a href="#1-环境准备" class="headerlink" title="1. 环境准备"></a>1. 环境准备</h2><p><strong>集群规划：</strong><br>本文演示环境为三台机器：</p><ul><li>  <strong>Master</strong>: 10.0.0.10</li><li>  <strong>Node1</strong>: 10.0.0.11</li><li>  <strong>Node2</strong>: 10.0.0.12</li></ul><h3 id="1-1-修改主机名-Hostname"><a href="#1-1-修改主机名-Hostname" class="headerlink" title="1.1 修改主机名 (Hostname)"></a>1.1 修改主机名 (Hostname)</h3><p>在三台机器上分别执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#  Master 节点</span></span><br><span class="line">hostnamectl set-hostname master</span><br><span class="line"></span><br><span class="line"><span class="comment"># Node1 节点</span></span><br><span class="line">hostnamectl set-hostname node1</span><br><span class="line"></span><br><span class="line"><span class="comment"># Node2 节点</span></span><br><span class="line">hostnamectl set-hostname node2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line"><span class="built_in">cat</span> /etc/hostname</span><br></pre></td></tr></table></figure><h3 id="1-2-配置-Hosts"><a href="#1-2-配置-Hosts" class="headerlink" title="1.2 配置 Hosts"></a>1.2 配置 Hosts</h3><p>修改所有节点的 <code>/etc/hosts</code> 文件，内容需保持一致：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">10.0.0.10 master</span><br><span class="line">10.0.0.11 node1</span><br><span class="line">10.0.0.12 node2</span><br></pre></td></tr></table></figure><h3 id="1-3-配置-SSH-免密登录"><a href="#1-3-配置-SSH-免密登录" class="headerlink" title="1.3 配置 SSH 免密登录"></a>1.3 配置 SSH 免密登录</h3><p>在 Master 节点生成密钥并分发给所有节点（包括自己）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 生成密钥 (一路回车)</span></span><br><span class="line">ssh-keygen -t rsa</span><br><span class="line"></span><br><span class="line"><span class="comment"># 分发公钥</span></span><br><span class="line">ssh-copy-id master</span><br><span class="line">ssh-copy-id node1</span><br><span class="line">ssh-copy-id node2</span><br></pre></td></tr></table></figure><h3 id="1-4-关闭防火墙与-SELinux"><a href="#1-4-关闭防火墙与-SELinux" class="headerlink" title="1.4 关闭防火墙与 SELinux"></a>1.4 关闭防火墙与 SELinux</h3><p><strong>所有节点执行：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 关闭防火墙</span></span><br><span class="line">systemctl stop firewalld</span><br><span class="line">systemctl <span class="built_in">disable</span> firewalld</span><br><span class="line"></span><br><span class="line"><span class="comment"># 关闭 SELinux (临时+永久)</span></span><br><span class="line">setenforce 0</span><br><span class="line">sed -i <span class="string">&#x27;s/SELINUX=enforcing/SELINUX=disabled/&#x27;</span> /etc/selinux/config</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：如果不关闭 SELinux，后续 HTTP 服务可能会报 403 Forbidden 错误。</p></blockquote><h3 id="1-5-配置-NTP-时间同步"><a href="#1-5-配置-NTP-时间同步" class="headerlink" title="1.5 配置 NTP 时间同步"></a>1.5 配置 NTP 时间同步</h3><p><strong>所有节点执行：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 修改时区</span></span><br><span class="line"><span class="built_in">ln</span> -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 NTP</span></span><br><span class="line">yum -y install ntp</span><br><span class="line"></span><br><span class="line"><span class="comment"># 修改配置 /etc/ntp.conf (使用阿里源)</span></span><br><span class="line"><span class="comment"># server ntp.aliyun.com</span></span><br><span class="line"><span class="comment"># systemctl restart ntpd</span></span><br></pre></td></tr></table></figure><h2 id="2-离线安装资源准备"><a href="#2-离线安装资源准备" class="headerlink" title="2. 离线安装资源准备"></a>2. 离线安装资源准备</h2><h3 id="2-1-搭建本地-Yum-源"><a href="#2-1-搭建本地-Yum-源" class="headerlink" title="2.1 搭建本地 Yum 源"></a>2.1 搭建本地 Yum 源</h3><p>选择 Master (10.0.0.10) 作为本地仓库服务器。</p><ol><li><p><strong>安装 HTTPD</strong></p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum install -y httpd createrepo</span><br><span class="line">systemctl start httpd</span><br></pre></td></tr></table></figure></li><li><p><strong>准备 RPM 包</strong><br> 创建目录 <code>/var/www/html/cm6</code>，将下载好的 CM6 RPM 包和 JDK RPM 包放入其中。</p></li><li><p><strong>生成 Repodata</strong></p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /var/www/html/cm6</span><br><span class="line">createrepo .</span><br></pre></td></tr></table></figure></li><li><p><strong>配置 Yum Repo文件 (所有节点)</strong><br> 创建 <code>/etc/yum.repos.d/cm6.repo</code>：</p> <figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[cm6-local]</span></span><br><span class="line"><span class="attr">name</span>=cm6-local</span><br><span class="line"><span class="attr">baseurl</span>=http://<span class="number">10.0</span>.<span class="number">0.10</span>/cm6/</span><br><span class="line"><span class="attr">enabled</span>=<span class="number">1</span></span><br><span class="line"><span class="attr">gpgcheck</span>=<span class="number">0</span></span><br></pre></td></tr></table></figure></li><li><p><strong>刷新缓存</strong></p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum clean all &amp;&amp; yum makecache</span><br></pre></td></tr></table></figure></li></ol><h3 id="2-2-安装-JDK"><a href="#2-2-安装-JDK" class="headerlink" title="2.2 安装 JDK"></a>2.2 安装 JDK</h3><p><strong>所有节点执行：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 假设 RPM 包已在 yum 源中，或者直接安装</span></span><br><span class="line">yum install -y oracle-j2sdk1.8-1.8.0+update181-1.x86_64</span><br></pre></td></tr></table></figure><h3 id="2-3-安装-MySQL-Master-节点"><a href="#2-3-安装-MySQL-Master-节点" class="headerlink" title="2.3 安装 MySQL (Master 节点)"></a>2.3 安装 MySQL (Master 节点)</h3><p>安装 MySQL 5.7 作为元数据库。</p><ol><li><p><strong>卸载旧版本 (Mariadb)</strong></p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rpm -qa | grep mariadb | xargs rpm -e --nodeps</span><br></pre></td></tr></table></figure></li><li><p><strong>安装新版本</strong><br> 解压 RPM Bundle 包并安装：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">tar -xvf mysql-5.7.19-1.el7.x86_64.rpm-bundle.tar</span><br><span class="line">rpm -ivh mysql-community-common-*.rpm</span><br><span class="line">rpm -ivh mysql-community-libs-*.rpm</span><br><span class="line">rpm -ivh mysql-community-client-*.rpm</span><br><span class="line">rpm -ivh mysql-community-server-*.rpm</span><br></pre></td></tr></table></figure></li><li><p><strong>配置 <code>/etc/my.cnf</code></strong></p> <figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="comment"># 允许远程连接</span></span><br><span class="line"><span class="attr">bind-address</span>=<span class="number">0.0</span>.<span class="number">0.0</span></span><br><span class="line"><span class="attr">character_set_server</span>=utf8mb4</span><br><span class="line"><span class="attr">explicit_defaults_for_timestamp</span>=<span class="literal">true</span></span><br><span class="line"><span class="comment"># ... 其他标准配置</span></span><br></pre></td></tr></table></figure></li><li><p><strong>启动并初始化</strong></p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">systemctl start mysqld</span><br><span class="line"><span class="comment"># 获取临时密码</span></span><br><span class="line">grep <span class="string">&#x27;temporary password&#x27;</span> /var/log/mysqld.log</span><br></pre></td></tr></table></figure></li><li><p><strong>修改密码与授权</strong></p> <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">mysql <span class="operator">-</span>u root <span class="operator">-</span>p</span><br><span class="line"><span class="comment">-- 修改密码</span></span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">USER</span> <span class="string">&#x27;root&#x27;</span>@<span class="string">&#x27;localhost&#x27;</span> IDENTIFIED <span class="keyword">BY</span> <span class="string">&#x27;12345678Qq!&#x27;</span>;</span><br><span class="line"><span class="comment">-- 允许远程 Root 登录</span></span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">ALL</span> PRIVILEGES <span class="keyword">ON</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">TO</span> <span class="string">&#x27;root&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED <span class="keyword">BY</span> <span class="string">&#x27;12345678Qq!&#x27;</span> <span class="keyword">WITH</span> <span class="keyword">GRANT</span> OPTION;</span><br><span class="line">FLUSH PRIVILEGES;</span><br></pre></td></tr></table></figure></li><li><p><strong>准备 JDBC 驱动</strong><br> 创建目录并放置驱动：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /usr/share/java</span><br><span class="line"><span class="built_in">cp</span> mysql-connector-java-5.1.49.jar /usr/share/java/mysql-connector-java.jar</span><br></pre></td></tr></table></figure></li></ol><h3 id="2-4-创建业务数据库"><a href="#2-4-创建业务数据库" class="headerlink" title="2.4 创建业务数据库"></a>2.4 创建业务数据库</h3><p>登录 MySQL，执行建库脚本（为 scm, amon, rman, hue, hive, oozie 等服务创建数据库和用户）。</p><p><em>(此处省略详细 SQL，参照原文即可，重点是字符集必须为 utf8)</em></p><h2 id="3-安装-Cloudera-Manager"><a href="#3-安装-Cloudera-Manager" class="headerlink" title="3. 安装 Cloudera Manager"></a>3. 安装 Cloudera Manager</h2><h3 id="3-1-安装-Server-与-Agent"><a href="#3-1-安装-Server-与-Agent" class="headerlink" title="3.1 安装 Server 与 Agent"></a>3.1 安装 Server 与 Agent</h3><p><strong>Master 节点：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install cloudera-manager-daemons cloudera-manager-agent cloudera-manager-server</span><br></pre></td></tr></table></figure><p><strong>其他节点：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install cloudera-manager-daemons cloudera-manager-agent</span><br></pre></td></tr></table></figure><h3 id="3-2-准备-Parcel-包"><a href="#3-2-准备-Parcel-包" class="headerlink" title="3.2 准备 Parcel 包"></a>3.2 准备 Parcel 包</h3><p><strong>Master 节点：</strong><br>将 CDH Parcel 文件（<code>.parcel</code>, <code>.sha</code>）放入 <code>/opt/cloudera/parcel-repo</code>。<br><em>注意：将 <code>.sha1</code> 后缀重命名为 <code>.sha</code>。</em></p><h3 id="3-3-初始化-CM-数据库"><a href="#3-3-初始化-CM-数据库" class="headerlink" title="3.3 初始化 CM 数据库"></a>3.3 初始化 CM 数据库</h3><p><strong>Master 节点执行：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/opt/cloudera/cm/schema/scm_prepare_database.sh mysql -h master -uroot -p<span class="string">&#x27;12345678Qq!&#x27;</span> --scm-host master scm scm scm</span><br></pre></td></tr></table></figure><h3 id="3-4-启动-CM-Server"><a href="#3-4-启动-CM-Server" class="headerlink" title="3.4 启动 CM Server"></a>3.4 启动 CM Server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">systemctl start cloudera-scm-server</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看日志</span></span><br><span class="line"><span class="built_in">tail</span> -f /var/log/cloudera-scm-server/cloudera-scm-server.log</span><br></pre></td></tr></table></figure><p>当出现 <code>Started Jetty server</code> 即表示启动成功。</p><h2 id="4-Web-界面安装-CDH-集群"><a href="#4-Web-界面安装-CDH-集群" class="headerlink" title="4. Web 界面安装 CDH 集群"></a>4. Web 界面安装 CDH 集群</h2><ol><li> 访问 <code>http://10.0.0.10:7180</code>，默认账号密码 <code>admin</code>。</li><li> 按照向导添加主机（搜索 master, node1, node2）。</li><li> <strong>选择存储库</strong>：选择“使用 Parcel”，此时应能识别到本地的 CDH 版本。</li><li> <strong>主机检查</strong>：根据提示调整 linux 内核参数（Swappiness, THP 等）。</li><li> <strong>选择服务</strong>：根据需求勾选 HDFS, YARN, Zookeeper, HBase, Hive 等。</li><li> <strong>数据库配置</strong>：填写之前创建的数据库用户和密码。</li><li> 等待安装完成。</li></ol><h2 id="5-常见问题排查"><a href="#5-常见问题排查" class="headerlink" title="5. 常见问题排查"></a>5. 常见问题排查</h2><h3 id="5-1-主机运行状况不良-cm-guid-冲突"><a href="#5-1-主机运行状况不良-cm-guid-冲突" class="headerlink" title="5.1 主机运行状况不良 (cm_guid 冲突)"></a>5.1 主机运行状况不良 (cm_guid 冲突)</h3><p>如果克隆的虚拟机，可能会导致 UUID 冲突。<br><strong>解决：</strong> 删除所有 Agent 节点的 <code>/var/lib/cloudera-scm-agent/cm_guid</code> 文件并重启 Agent。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -f /var/lib/cloudera-scm-agent/cm_guid</span><br><span class="line">systemctl restart cloudera-scm-agent</span><br></pre></td></tr></table></figure><h3 id="5-2-日志清理脚本"><a href="#5-2-日志清理脚本" class="headerlink" title="5.2 日志清理脚本"></a>5.2 日志清理脚本</h3><p>CM 相关服务产生的日志较大，可配置定时任务清理 <code>*.log.*</code> 和 <code>*.out.*</code> 文件。清理后若监控页面无数据，需重启 <code>Cloudera Management Service</code>。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文详细记录在 Linux 环境下离线部署 Cloudera Manager (CM) 和 CDH 集群的全过程，包括 HBase、JDK、MySQL 等组件的安装与配置。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="CDH" scheme="http://www.uilucky.com/tags/CDH/"/>
    
  </entry>
  
  <entry>
    <title>Linux 环境下 OpenVPN 安装与服务端配置详解</title>
    <link href="http://www.uilucky.com/post/5f5a2f48.html"/>
    <id>http://www.uilucky.com/post/5f5a2f48.html</id>
    <published>2024-03-26T02:29:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>当本地设备需要通过加密通道访问远程网络资源时，OpenVPN 是一个非常成熟且强大的解决方案。本文将介绍如何在 Linux 上快速部署 OpenVPN 并进行详细配置。</p><span id="more"></span><p><img src="https://pic.uilucky.com/blog/source/assets/blogimage/20240807/09-38-08-J2VxkM_%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E6%A0%87%E5%87%86%E8%89%B2%E7%89%88.png?x-oss-process=style/resize" alt="09-38-08-J2VxkM_扫码_搜索联合传播样式-标准色版"></p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-快速安装-OpenVPN"><a href="#1-快速安装-OpenVPN" class="headerlink" title="1. 快速安装 OpenVPN"></a>1. 快速安装 OpenVPN</h2><p>我们将使用一个开源脚本来简化安装过程。</p><h3 id="1-1-下载并运行脚本"><a href="#1-1-下载并运行脚本" class="headerlink" title="1.1 下载并运行脚本"></a>1.1 下载并运行脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建目录</span></span><br><span class="line"><span class="built_in">mkdir</span> OpenVPN &amp;&amp; <span class="built_in">cd</span> OpenVPN</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载安装脚本</span></span><br><span class="line">wget http://pic.uilucky.com/blog/source/assets/blogimage/20240326/10-22-22-JZ265v_openvpn-install.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 赋予执行权限</span></span><br><span class="line"><span class="built_in">chmod</span> +x openvpn-install.sh</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行脚本</span></span><br><span class="line">./openvpn-install.sh</span><br></pre></td></tr></table></figure><h3 id="1-2-交互式配置"><a href="#1-2-交互式配置" class="headerlink" title="1.2 交互式配置"></a>1.2 交互式配置</h3><p>运行脚本后，根据指引进行配置：</p><ol><li> <strong>IP Address</strong>: 确认检测到的公网 IP 是否正确。</li><li> <strong>Protocol</strong>: 推荐选择 UDP (速度更快)，也可以选择 TCP。</li><li> <strong>Port</strong>: 设置 OpenVPN 监听端口，默认 1194。</li><li> <strong>DNS</strong>: 选择 DNS 服务器 (如 Google, AdGuard 等)。</li><li> <strong>Client Name</strong>: 输入第一个客户端用户的名称。</li></ol><p>安装完成后，脚本会生成一个 <code>.ovpn</code> 文件（通常在 <code>/root</code> 目录下），将其下载到客户端电脑导入 OpenVPN Connect 即可连接。</p><h2 id="2-服务端配置详解"><a href="#2-服务端配置详解" class="headerlink" title="2. 服务端配置详解"></a>2. 服务端配置详解</h2><p>配置文件默认路径：<code>/etc/openvpn/server.conf</code></p><p>如果修改了配置文件，记得重启服务：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl restart openvpn-server@server.service</span><br></pre></td></tr></table></figure><h3 id="2-1-常用配置项说明"><a href="#2-1-常用配置项说明" class="headerlink" title="2.1 常用配置项说明"></a>2.1 常用配置项说明</h3><p>以下是一些关键配置项的解释，您可以根据需求进行修改：</p><p><strong>网络与路由</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"># 监听端口</span><br><span class="line">port 51194</span><br><span class="line"></span><br><span class="line"># 协议 (udp 或 tcp)</span><br><span class="line">proto tcp</span><br><span class="line"></span><br><span class="line"># 网络设备类型 (tun: 路由模式, tap: 桥接模式)</span><br><span class="line">dev tap</span><br><span class="line"></span><br><span class="line"># VPN 虚拟网段 (不要与服务器局域网段冲突)</span><br><span class="line">server 10.8.0.0 255.255.255.0</span><br><span class="line"></span><br><span class="line"># 允许客户端之间互访</span><br><span class="line">client-to-client</span><br></pre></td></tr></table></figure><p><strong>推送设置 (Push Options)</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"># 推送路由信息给客户端</span><br><span class="line"># 让客户端能够访问服务器所在的内网网段 (例如 192.168.0.0/24)</span><br><span class="line">push &quot;route 192.168.0.0 255.255.255.0&quot;</span><br><span class="line"></span><br><span class="line"># 全局流量转发</span><br><span class="line"># 启用后，客户端的所有上网流量都会通过 VPN 转发 (默认网关重定向)</span><br><span class="line"># push &quot;redirect-gateway def1 bypass-dhcp&quot;</span><br><span class="line"></span><br><span class="line"># 推送 DNS 设置</span><br><span class="line"># 如果客户端无法打开网页，可能需要推送 DNS</span><br><span class="line"># push &quot;dhcp-option DNS 223.5.5.5&quot;</span><br><span class="line"># push &quot;dhcp-option DNS 8.8.8.8&quot;</span><br></pre></td></tr></table></figure><p><strong>证书与安全</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ca         /etc/openvpn/pki/ca.crt</span><br><span class="line">cert       /etc/openvpn/pki/openvpn-server.crt</span><br><span class="line">key        /etc/openvpn/pki/openvpn-server.key</span><br><span class="line">dh         /etc/openvpn/pki/dh.pem</span><br><span class="line">tls-auth   /etc/openvpn/pki/ta.key 0</span><br><span class="line"></span><br><span class="line"># 加密算法配置 (建议保持默认或根据客户端支持情况修改)</span><br><span class="line">cipher AES-256-CBC</span><br><span class="line">auth SHA256</span><br></pre></td></tr></table></figure><p><strong>日志与运维</strong></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"># 状态日志路径</span><br><span class="line">status /var/log/openvpn/openvpn-status.log</span><br><span class="line"></span><br><span class="line"># 运行日志</span><br><span class="line"># log-append  /var/log/openvpn/openvpn.log</span><br><span class="line"></span><br><span class="line"># 日志级别 (0-9，4 为合理详细程度)</span><br><span class="line">verb 4</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;当本地设备需要通过加密通道访问远程网络资源时，OpenVPN 是一个非常成熟且强大的解决方案。本文将介绍如何在 Linux 上快速部署 OpenVPN 并进行详细配置。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="OpenVPN" scheme="http://www.uilucky.com/tags/OpenVPN/"/>
    
  </entry>
  
  <entry>
    <title>解决 Mac M 芯片 Docker 打包 Intel 镜像运行失败问题</title>
    <link href="http://www.uilucky.com/post/1ea3e7f6.html"/>
    <id>http://www.uilucky.com/post/1ea3e7f6.html</id>
    <published>2023-12-11T09:29:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>Mac M 芯片（ARM 架构）电脑上构建的 Docker 镜像，在 Linux (AMD64/Intel) 服务器上运行时可能会出现 <code>exec format error</code> 等错误。这是由于 CPU 架构不兼容导致的。本文介绍如何使用 <code>docker buildx</code> 来解决跨平台构建问题。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-什么是-Docker-Buildx？"><a href="#1-什么是-Docker-Buildx？" class="headerlink" title="1. 什么是 Docker Buildx？"></a>1. 什么是 Docker Buildx？</h2><p><code>Docker Buildx</code> 是一个 CLI 插件，扩展了 docker 命令，利用 Moby BuildKit 提供的功能，支持创建多个构建器实例，最重要的是<strong>支持同时针对多个节点（平台）进行构建</strong>。</p><blockquote><p>M1/M2 Mac 上默认的构建架构是 <code>linux/arm64</code>，而大部分服务器是 <code>linux/amd64</code>。</p></blockquote><h2 id="2-启用-Buildx"><a href="#2-启用-Buildx" class="headerlink" title="2. 启用 Buildx"></a>2. 启用 Buildx</h2><p>Docker 19.03+ 版本已包含 Buildx。如果未启用，可通过环境变量开启：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> DOCKER_CLI_EXPERIMENTAL=enabled</span><br></pre></td></tr></table></figure><h2 id="3-创建构建器实例"><a href="#3-创建构建器实例" class="headerlink" title="3. 创建构建器实例"></a>3. 创建构建器实例</h2><p>默认的构建器可能不支持多平台构建，建议创建一个新的构建器。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建名为 mybuilder 的构建器并切换使用</span></span><br><span class="line">docker buildx create --use --name mybuilder</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证构建器状态</span></span><br><span class="line">docker buildx <span class="built_in">ls</span></span><br></pre></td></tr></table></figure><p>输出示例：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">NAME/NODE    DRIVER/ENDPOINT             STATUS  PLATFORMS</span><br><span class="line">mybuilder *  docker-container</span><br><span class="line">  mybuilder0 unix:///var/run/docker.sock running linux/amd64, linux/386</span><br><span class="line">default      docker</span><br><span class="line">  default    default                     running linux/amd64, linux/386</span><br></pre></td></tr></table></figure><h2 id="4-编写-Dockerfile"><a href="#4-编写-Dockerfile" class="headerlink" title="4. 编写 Dockerfile"></a>4. 编写 Dockerfile</h2><p>Dockerfile 本身通常不需要修改，但可以利用 <code>TARGETPLATFORM</code> 等参数进行更高级的条件构建。</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 示例：打印构建平台信息</span></span><br><span class="line"><span class="keyword">FROM</span> --platform=$BUILDPLATFORM node:alpine AS build</span><br><span class="line"><span class="keyword">ARG</span> TARGETPLATFORM</span><br><span class="line"><span class="keyword">ARG</span> BUILDPLATFORM</span><br><span class="line"><span class="keyword">RUN</span><span class="language-bash"> <span class="built_in">echo</span> <span class="string">&quot;I am running on <span class="variable">$BUILDPLATFORM</span>, building for <span class="variable">$TARGETPLATFORM</span>&quot;</span> &gt; /log</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">FROM</span> alpine</span><br><span class="line"><span class="keyword">COPY</span><span class="language-bash"> --from=build /log /log</span></span><br><span class="line"><span class="keyword">CMD</span><span class="language-bash"> [<span class="string">&quot;cat&quot;</span>, <span class="string">&quot;/log&quot;</span>]</span></span><br></pre></td></tr></table></figure><h2 id="5-构建多平台镜像"><a href="#5-构建多平台镜像" class="headerlink" title="5. 构建多平台镜像"></a>5. 构建多平台镜像</h2><h3 id="5-1-推送到远程仓库-推荐"><a href="#5-1-推送到远程仓库-推荐" class="headerlink" title="5.1 推送到远程仓库 (推荐)"></a>5.1 推送到远程仓库 (推荐)</h3><p>Buildx 构建多平台镜像时，最佳实践是直接 push 到镜像仓库（如 Docker Hub），因为本地的 docker images 无法同时存储同一 Tag 的多种架构镜像。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 同时也构建 arm 和 amd64 架构</span></span><br><span class="line">docker buildx build -t yangpeng2468/test --platform=linux/arm,linux/arm64,linux/amd64 . --push</span><br></pre></td></tr></table></figure><h3 id="5-2-导出到本地-单平台"><a href="#5-2-导出到本地-单平台" class="headerlink" title="5.2 导出到本地 (单平台)"></a>5.2 导出到本地 (单平台)</h3><p>如果只需要打一个能在 Intel 服务器运行的包，可以指定单一平台并输出为 Docker 格式或 tar 包。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 构建 linux/amd64 镜像并导出为 tar 文件</span></span><br><span class="line">docker buildx build -t demo:0.1 --platform=linux/amd64 -o <span class="built_in">type</span>=docker,dest=./demo.tar .</span><br></pre></td></tr></table></figure><p>构建完成后，将 <code>demo.tar</code> 上传至目标 Linux 服务器，加载镜像：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker load -i demo.tar</span><br></pre></td></tr></table></figure><h2 id="6-清理缓存"><a href="#6-清理缓存" class="headerlink" title="6. 清理缓存"></a>6. 清理缓存</h2><p>如果构建占用过多空间，可以清理 Buildx 缓存：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker buildx prune</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;Mac M 芯片（ARM 架构）电脑上构建的 Docker 镜像，在 Linux (AMD64/Intel) 服务器上运行时可能会出现 &lt;code&gt;exec format error&lt;/code&gt; 等错误。这是由于 CPU 架构不兼容导致的。本文介绍如何使用 &lt;code&gt;docker buildx&lt;/code&gt; 来解决跨平台构建问题。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Mac" scheme="http://www.uilucky.com/tags/Mac/"/>
    
    <category term="Docker" scheme="http://www.uilucky.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 22.04 编译安装 Nginx 指南</title>
    <link href="http://www.uilucky.com/post/ab2ca36d.html"/>
    <id>http://www.uilucky.com/post/ab2ca36d.html</id>
    <published>2023-09-20T09:32:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文详细介绍在 Ubuntu 22.04 上通过源码编译安装 Nginx 的步骤。</p><span id="more"></span><h1 id="Nginx-安装指南"><a href="#Nginx-安装指南" class="headerlink" title="Nginx 安装指南"></a>Nginx 安装指南</h1><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-下载源码包"><a href="#1-下载源码包" class="headerlink" title="1. 下载源码包"></a>1. 下载源码包</h2><p>建议下载 Nginx 官方稳定版。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /home</span><br><span class="line"><span class="built_in">mkdir</span> downloads</span><br><span class="line"><span class="built_in">cd</span> downloads</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载 Nginx 源码 (示例版本 1.25.2，建议查阅官网获取最新版)</span></span><br><span class="line">wget https://nginx.org/download/nginx-1.25.2.tar.gz</span><br><span class="line"></span><br><span class="line"><span class="comment"># 解压</span></span><br><span class="line">tar -zxvf nginx-1.25.2.tar.gz</span><br><span class="line"><span class="built_in">cd</span> nginx-1.25.2</span><br></pre></td></tr></table></figure><h2 id="2-安装编译依赖"><a href="#2-安装编译依赖" class="headerlink" title="2. 安装编译依赖"></a>2. 安装编译依赖</h2><p>编译 Nginx 需要一些基础库（如 zlib, pcre, openssl 等）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update</span><br><span class="line">sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libgd-dev libssl-dev -y</span><br></pre></td></tr></table></figure><h2 id="3-编译与安装"><a href="#3-编译与安装" class="headerlink" title="3. 编译与安装"></a>3. 编译与安装</h2><p>配置编译选项并安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置编译参数</span></span><br><span class="line">./configure \</span><br><span class="line">  --prefix=/usr/local/nginx \</span><br><span class="line">  --with-http_stub_status_module \</span><br><span class="line">  --with-http_ssl_module \</span><br><span class="line">  --with-stream \</span><br><span class="line">  --with-http_image_filter_module \</span><br><span class="line">  --with-http_realip_module \</span><br><span class="line">  --with-stream_ssl_module</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编译并安装</span></span><br><span class="line">make &amp;&amp; sudo make install</span><br></pre></td></tr></table></figure><h2 id="4-配置系统服务-Systemd"><a href="#4-配置系统服务-Systemd" class="headerlink" title="4. 配置系统服务 (Systemd)"></a>4. 配置系统服务 (Systemd)</h2><p>为了方便管理通过源码安装的 Nginx，我们可以创建一个 Systemd 服务文件。</p><p>创建文件 <code>/lib/systemd/system/nginx.service</code>：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=The NGINX HTTP and reverse proxy server</span><br><span class="line"><span class="attr">After</span>=syslog.target network-<span class="literal">on</span>line.target remote-fs.target nss-lookup.target</span><br><span class="line"><span class="attr">Wants</span>=network-<span class="literal">on</span>line.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=forking</span><br><span class="line"><span class="attr">PIDFile</span>=/usr/local/nginx/logs/nginx.pid</span><br><span class="line"><span class="attr">ExecStartPre</span>=/usr/local/nginx/sbin/nginx -t</span><br><span class="line"><span class="attr">ExecStart</span>=/usr/local/nginx/sbin/nginx</span><br><span class="line"><span class="attr">ExecReload</span>=/usr/local/nginx/sbin/nginx -s reload</span><br><span class="line"><span class="attr">ExecStop</span>=/bin/kill -s QUIT <span class="variable">$MAINPID</span></span><br><span class="line"><span class="attr">PrivateTmp</span>=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><h2 id="5-启动服务"><a href="#5-启动服务" class="headerlink" title="5. 启动服务"></a>5. 启动服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 重新加载 Systemd 配置</span></span><br><span class="line">sudo systemctl daemon-reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># 启动 Nginx</span></span><br><span class="line">sudo systemctl start nginx</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置开机自启</span></span><br><span class="line">sudo systemctl <span class="built_in">enable</span> nginx</span><br></pre></td></tr></table></figure><p>或者使用传统的 init.d 脚本（不推荐 Systemd 系统使用）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx</span><br><span class="line">sudo <span class="built_in">chmod</span> +x /etc/init.d/nginx</span><br><span class="line">sudo update-rc.d nginx defaults</span><br><span class="line">service nginx start</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文详细介绍在 Ubuntu 22.04 上通过源码编译安装 Nginx 的步骤。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Ubuntu" scheme="http://www.uilucky.com/tags/Ubuntu/"/>
    
    <category term="Nginx" scheme="http://www.uilucky.com/tags/Nginx/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 22.04 安装 Docker 及配置镜像加速</title>
    <link href="http://www.uilucky.com/post/8d42b14b.html"/>
    <id>http://www.uilucky.com/post/8d42b14b.html</id>
    <published>2023-09-20T09:29:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文记录了在 Ubuntu 22.04 LTS 系统下安装 Docker CE、Docker Compose 以及配置镜像加速源的步骤。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-卸载旧版本-可选"><a href="#1-卸载旧版本-可选" class="headerlink" title="1. 卸载旧版本 (可选)"></a>1. 卸载旧版本 (可选)</h2><p>如果之前安装过旧版本，建议先卸载：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get remove docker docker-engine docker.io containerd runc</span><br></pre></td></tr></table></figure><h2 id="2-设置-apt-仓库"><a href="#2-设置-apt-仓库" class="headerlink" title="2. 设置 apt 仓库"></a>2. 设置 apt 仓库</h2><h3 id="2-1-安装必要的工具"><a href="#2-1-安装必要的工具" class="headerlink" title="2.1 安装必要的工具"></a>2.1 安装必要的工具</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo apt update</span><br><span class="line">sudo apt install ca-certificates curl gnupg lsb-release</span><br></pre></td></tr></table></figure><h3 id="2-2-添加-Docker-官方-GPG-密钥"><a href="#2-2-添加-Docker-官方-GPG-密钥" class="headerlink" title="2.2 添加 Docker 官方 GPG 密钥"></a>2.2 添加 Docker 官方 GPG 密钥</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 创建密钥目录</span></span><br><span class="line">sudo <span class="built_in">mkdir</span> -p /etc/apt/keyrings</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下载官方 GPG Key</span></span><br><span class="line">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg</span><br></pre></td></tr></table></figure><h3 id="2-3-添加-Docker-仓库源"><a href="#2-3-添加-Docker-仓库源" class="headerlink" title="2.3 添加 Docker 仓库源"></a>2.3 添加 Docker 仓库源</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> \</span><br><span class="line">  <span class="string">&quot;deb [arch=<span class="subst">$(dpkg --print-architecture)</span> signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \</span></span><br><span class="line"><span class="string">  <span class="subst">$(lsb_release -cs)</span> stable&quot;</span> | sudo <span class="built_in">tee</span> /etc/apt/sources.list.d/docker.list &gt; /dev/null</span><br></pre></td></tr></table></figure><h2 id="3-安装-Docker-Engine"><a href="#3-安装-Docker-Engine" class="headerlink" title="3. 安装 Docker Engine"></a>3. 安装 Docker Engine</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 更新 apt 包索引</span></span><br><span class="line">sudo apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装最新版 Docker</span></span><br><span class="line">sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin</span><br></pre></td></tr></table></figure><h2 id="4-安装-Docker-Compose"><a href="#4-安装-Docker-Compose" class="headerlink" title="4. 安装 Docker Compose"></a>4. 安装 Docker Compose</h2><p>手动下载 Docker Compose 二进制文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 下载指定版本 (目前 v2.23.3)</span></span><br><span class="line">sudo curl -L <span class="string">&quot;https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-<span class="subst">$(uname -s)</span>-<span class="subst">$(uname -m)</span>&quot;</span> -o /usr/local/bin/docker-compose</span><br><span class="line"></span><br><span class="line"><span class="comment"># 添加可执行权限</span></span><br><span class="line">sudo <span class="built_in">chmod</span> +x /usr/local/bin/docker-compose</span><br><span class="line"></span><br><span class="line"><span class="comment"># 验证</span></span><br><span class="line">docker-compose --version</span><br></pre></td></tr></table></figure><h2 id="5-配置-Docker-镜像加速"><a href="#5-配置-Docker-镜像加速" class="headerlink" title="5. 配置 Docker 镜像加速"></a>5. 配置 Docker 镜像加速</h2><p>为了加快拉取镜像的速度，建议配置国内镜像源。</p><p>编辑或创建 <code>/etc/docker/daemon.json</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/docker/daemon.json</span><br></pre></td></tr></table></figure><p>写入以下内容：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;registry-mirrors&quot;</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line">    <span class="string">&quot;http://hub-mirror.c.163.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="string">&quot;https://registry.docker-cn.com&quot;</span><span class="punctuation">,</span></span><br><span class="line">    <span class="string">&quot;https://docker.mirrors.ustc.edu.cn&quot;</span></span><br><span class="line">  <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>重新加载并重启 Docker：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 刷新配置</span></span><br><span class="line">sudo systemctl daemon-reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启服务</span></span><br><span class="line">sudo systemctl restart docker</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看信息</span></span><br><span class="line">docker info</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文记录了在 Ubuntu 22.04 LTS 系统下安装 Docker CE、Docker Compose 以及配置镜像加速源的步骤。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Docker" scheme="http://www.uilucky.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 环境下手动编译安装 Python Guide</title>
    <link href="http://www.uilucky.com/post/1cc79d67.html"/>
    <id>http://www.uilucky.com/post/1cc79d67.html</id>
    <published>2023-09-20T09:28:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 Ubuntu 22.04 系统下，通过下载源码的方式手动编译并安装指定版本的 Python（以 Python 3.11 为例）。</p><span id="more"></span><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script><h2 id="1-更新软件包并安装依赖"><a href="#1-更新软件包并安装依赖" class="headerlink" title="1. 更新软件包并安装依赖"></a>1. 更新软件包并安装依赖</h2><p>首先更新系统源，并安装编译 Python 所需的依赖库。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 刷新软件包目录</span></span><br><span class="line">sudo apt update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装编译依赖</span></span><br><span class="line">sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libbz2-dev liblzma-dev sqlite3 libsqlite3-dev tk-dev uuid-dev libgdbm-compat-dev -y</span><br></pre></td></tr></table></figure><h2 id="2-下载-Python-源码"><a href="#2-下载-Python-源码" class="headerlink" title="2. 下载 Python 源码"></a>2. 下载 Python 源码</h2><p>从 Python 官网下载所需的源码包。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ~</span><br><span class="line">wget https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tgz</span><br><span class="line">tar -xvzf Python-3.11.5.tgz</span><br><span class="line"><span class="built_in">cd</span> Python-3.11.5</span><br></pre></td></tr></table></figure><h2 id="3-编译与安装"><a href="#3-编译与安装" class="headerlink" title="3. 编译与安装"></a>3. 编译与安装</h2><p>配置编译参数并开始安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置安装路径和 SSL 支持</span></span><br><span class="line">./configure --with-ssl --prefix=/usr/local/python3.11.5</span><br><span class="line"></span><br><span class="line"><span class="comment"># 编译</span></span><br><span class="line">make</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装</span></span><br><span class="line"><span class="comment"># 使用 altinstall 而不是 install，以防止覆盖自带的 python3 命令</span></span><br><span class="line">sudo make altinstall</span><br></pre></td></tr></table></figure><blockquote><p><strong>Tips:</strong><br>使用 <code>make altinstall</code> 而不是 <code>make install</code>。二者的一个重要区别在于，后者会创建符号链接，将 <code>python3</code> 等命令指向正在安装的新版本，这可能会破坏依赖系统 Python 的工具。</p></blockquote><h2 id="4-配置环境变量"><a href="#4-配置环境变量" class="headerlink" title="4. 配置环境变量"></a>4. 配置环境变量</h2><p>为了方便使用新安装的 Python，我们需要将其添加到 PATH 中。</p><h3 id="方法一：创建软链接"><a href="#方法一：创建软链接" class="headerlink" title="方法一：创建软链接"></a>方法一：创建软链接</h3><p>将新版 python 的可执行文件链接到 <code>/usr/local/bin</code>。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">ln</span> -s /usr/local/python3.11.5/bin/python3.11 /usr/local/bin/python3.11</span><br><span class="line">sudo <span class="built_in">ln</span> -s /usr/local/python3.11.5/bin/pip3.11 /usr/local/bin/pip3.11</span><br></pre></td></tr></table></figure><h3 id="方法二：修改-PATH-环境变量-推荐"><a href="#方法二：修改-PATH-环境变量-推荐" class="headerlink" title="方法二：修改 PATH 环境变量 (推荐)"></a>方法二：修改 PATH 环境变量 (推荐)</h3><p>将 Python 的 binary 目录添加到系统 PATH。</p><ol><li>编辑 <code>/etc/profile</code> 文件： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vi /etc/profile</span><br></pre></td></tr></table></figure></li><li>在文件末尾添加： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> PATH=/usr/local/python3.11.5/bin:<span class="variable">$PATH</span></span><br></pre></td></tr></table></figure></li><li>重新加载配置： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">source</span> /etc/profile</span><br></pre></td></tr></table></figure></li></ol><h2 id="5-使用-pip-安装库"><a href="#5-使用-pip-安装库" class="headerlink" title="5. 使用 pip 安装库"></a>5. 使用 pip 安装库</h2><p>安装完成后，可以使用对应版本的 pip 安装所需的第三方库。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip3.11 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 Ubuntu 22.04 系统下，通过下载源码的方式手动编译并安装指定版本的 Python（以 Python 3.11 为例）。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Python" scheme="http://www.uilucky.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>Linux 创建 SAMBA 共享文件夹及账号指南</title>
    <link href="http://www.uilucky.com/post/d63cbdc7.html"/>
    <id>http://www.uilucky.com/post/d63cbdc7.html</id>
    <published>2023-07-12T06:28:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何在 Linux 系统（以 CentOS/RHEL 为例）并通过 Samba 服务实现文件共享。</p><span id="more"></span><h2 id="1-安装-Samba-服务"><a href="#1-安装-Samba-服务" class="headerlink" title="1. 安装 Samba 服务"></a>1. 安装 Samba 服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CentOS / RHEL</span></span><br><span class="line">yum install samba -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># Ubuntu / Debian</span></span><br><span class="line"><span class="comment"># sudo apt install samba</span></span><br></pre></td></tr></table></figure><h2 id="2-创建共享目录"><a href="#2-创建共享目录" class="headerlink" title="2. 创建共享目录"></a>2. 创建共享目录</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo <span class="built_in">mkdir</span> /home/share</span><br><span class="line"><span class="comment"># 赋予适当的权限，确保其他用户可以访问（根据实际需求设置）</span></span><br><span class="line">sudo <span class="built_in">chmod</span> 777 /home/share</span><br></pre></td></tr></table></figure><h2 id="3-配置-Samba"><a href="#3-配置-Samba" class="headerlink" title="3. 配置 Samba"></a>3. 配置 Samba</h2><p>编辑配置文件 <code>/etc/samba/smb.conf</code>，在文件末尾添加以下内容：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[Share]</span></span><br><span class="line">    <span class="attr">comment</span> = Shared Folder with username and password</span><br><span class="line">    <span class="attr">path</span> = /home/share</span><br><span class="line">    valid <span class="attr">users</span> = smbuser</span><br><span class="line">    <span class="attr">public</span> = <span class="literal">no</span></span><br><span class="line">    <span class="attr">writable</span> = <span class="literal">yes</span></span><br><span class="line">    <span class="attr">printable</span> = <span class="literal">no</span></span><br><span class="line">    create <span class="attr">mask</span> = <span class="number">0765</span></span><br></pre></td></tr></table></figure><p><strong>配置说明：</strong></p><ul><li>  <code>comment</code>: 提示信息，在 Windows 网络邻居中显示的备注。</li><li>  <code>path</code>: Linux 上的共享目录路径。</li><li>  <code>valid users</code>: 允许访问该共享的用户（必须是 Samba 用户）。</li><li>  <code>public</code>: 是否允许 Guest（匿名）访问。</li><li>  <code>writable</code>: 是否允许写入。</li><li>  <code>printable</code>: 若设为 yes，则被认定为打印机。</li><li>  <code>create mask</code>: 在共享目录上新建文件的默认权限。</li></ul><h2 id="4-创建-Samba-用户"><a href="#4-创建-Samba-用户" class="headerlink" title="4. 创建 Samba 用户"></a>4. 创建 Samba 用户</h2><p>Samba 用户必须首先是系统中的 Linux 用户。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 创建系统用户 (如果用户已存在可跳过)</span></span><br><span class="line">useradd smbuser</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. (可选) 将用户加入 smb 组</span></span><br><span class="line"><span class="comment"># groupadd smb</span></span><br><span class="line"><span class="comment"># usermod -g smb smbuser </span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 设置 Samba 用户密码</span></span><br><span class="line"><span class="comment"># 该步骤会要求输入密码，该密码用于连接共享时使用</span></span><br><span class="line">smbpasswd -a smbuser </span><br></pre></td></tr></table></figure><h2 id="5-启动与重启服务"><a href="#5-启动与重启服务" class="headerlink" title="5. 启动与重启服务"></a>5. 启动与重启服务</h2><p>配置完成后，重启 Samba 服务使配置生效。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动服务</span></span><br><span class="line">systemctl start smb</span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启服务</span></span><br><span class="line">systemctl restart smb</span><br><span class="line"></span><br><span class="line"><span class="comment"># 设置开机自启</span></span><br><span class="line">systemctl <span class="built_in">enable</span> smb</span><br></pre></td></tr></table></figure><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何在 Linux 系统（以 CentOS/RHEL 为例）并通过 Samba 服务实现文件共享。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
  </entry>
  
  <entry>
    <title>FFmpeg 进阶操作：分离音频声道与多音轨合并</title>
    <link href="http://www.uilucky.com/post/ad164b73.html"/>
    <id>http://www.uilucky.com/post/ad164b73.html</id>
    <published>2023-06-20T06:28:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>本文介绍如何使用 FFmpeg 进行一些高级的音频处理操作，包括提取音频、分离左右声道以及将分离的声道重新封装回视频。</p><span id="more"></span><h3 id="1-预处理：转码为-MP4"><a href="#1-预处理：转码为-MP4" class="headerlink" title="1. 预处理：转码为 MP4"></a>1. 预处理：转码为 MP4</h3><p>如果源文件格式较为特殊（如 rmvb），建议先转码为通用的 MP4 格式，以便后续处理。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用 NVIDIA 硬件加速转码 (示例)</span></span><br><span class="line">ffmpeg -i input.rmvb -s 512x384 -c:v h264_nvenc -b:v 768k output_tmp.mp4</span><br><span class="line"></span><br><span class="line"><span class="comment"># CPU 转码 (通用)</span></span><br><span class="line">ffmpeg -i input.dat -c:v libx264 -c:a aac -strict -2 output_tmp.mp4</span><br></pre></td></tr></table></figure><h3 id="2-提取音频流"><a href="#2-提取音频流" class="headerlink" title="2. 提取音频流"></a>2. 提取音频流</h3><p>将视频中的音频提取出来，不进行重新编码（copy 模式）。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -i output_tmp.mp4 -vn -acodec copy audio.aac</span><br></pre></td></tr></table></figure><h3 id="3-分离左右声道"><a href="#3-分离左右声道" class="headerlink" title="3. 分离左右声道"></a>3. 分离左右声道</h3><p>使用 <code>-map_channel</code> 参数将立体声文件拆分为两个单声道文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 0.0.0 代表: 第0个输入文件.第0个流.第0个声道 (左)</span></span><br><span class="line"><span class="comment"># 0.0.1 代表: 第0个输入文件.第0个流.第1个声道 (右)</span></span><br><span class="line">ffmpeg -i audio.aac \</span><br><span class="line">  -map_channel 0.0.0 audio_left.aac \</span><br><span class="line">  -map_channel 0.0.1 audio_right.aac</span><br></pre></td></tr></table></figure><h3 id="4-重新封装音轨"><a href="#4-重新封装音轨" class="headerlink" title="4. 重新封装音轨"></a>4. 重新封装音轨</h3><p>将分离出的单声道音频作为独立的轨道添加到视频中。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -i output_tmp.mp4 -i audio_left.aac -i audio_right.aac \</span><br><span class="line">  -map 0:v \</span><br><span class="line">  -map 1:a -c:a copy \</span><br><span class="line">  -map 2:a -c:a copy \</span><br><span class="line">  -shortest \</span><br><span class="line">  output_final.mp4</span><br></pre></td></tr></table></figure><p><strong>参数解释：</strong></p><ul><li>  <code>-map 0:v</code>: 选取第 0 个输入文件（视频源）的视频流。</li><li>  <code>-map 1:a</code>: 选取第 1 个输入文件（audio_left.aac）的音频流。</li><li>  <code>-map 2:a</code>: 选取第 2 个输入文件（audio_right.aac）的音频流。</li><li>  <code>-shortest</code>: 以时间最短的流为准结束输出（防止音频比视频长）。</li></ul><p>这样生成的视频将包含两个可选的音轨，分别对应原先的左声道和右声道。</p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文介绍如何使用 FFmpeg 进行一些高级的音频处理操作，包括提取音频、分离左右声道以及将分离的声道重新封装回视频。&lt;/p&gt;</summary>
    
    
    
    
    <category term="FFmpeg" scheme="http://www.uilucky.com/tags/FFmpeg/"/>
    
    <category term="音视频处理" scheme="http://www.uilucky.com/tags/%E9%9F%B3%E8%A7%86%E9%A2%91%E5%A4%84%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Linux 修改 pip 默认对应的 Python 版本</title>
    <link href="http://www.uilucky.com/post/3cd3d870.html"/>
    <id>http://www.uilucky.com/post/3cd3d870.html</id>
    <published>2023-06-14T09:28:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>在同时安装了 Python 2 和 Python 3 的 Linux 系统上，<code>pip</code> 命令默认可能指向 Python 2。本文介绍如何手动修改 <code>pip</code> 脚本，使其默认使用 Python 3。</p><span id="more"></span><h3 id="修改步骤"><a href="#修改步骤" class="headerlink" title="修改步骤"></a>修改步骤</h3><p><strong>1. 确认 pip 路径</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">which</span> pip</span><br><span class="line"><span class="comment"># 输出示例: /usr/local/bin/pip</span></span><br></pre></td></tr></table></figure><p><strong>2. 确认 Python 3 路径</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">which</span> python3</span><br><span class="line"><span class="comment"># 输出示例: /usr/bin/python3</span></span><br></pre></td></tr></table></figure><p><strong>3. 修改 pip 脚本</strong><br>使用 root 权限编辑 pip 可执行文件（它本质上是一个 Python 脚本）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo vim /usr/local/bin/pip</span><br></pre></td></tr></table></figure><p><strong>4. 更改 Shebang 行</strong><br>将文件的第一行（Shebang）：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python</span></span><br></pre></td></tr></table></figure><p>修改为你的 Python 3 路径：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/python3</span></span><br></pre></td></tr></table></figure><p><strong>5. 验证</strong><br>保存退出后，检查 pip 版本信息：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip -V</span><br><span class="line"><span class="comment"># 输出应包含 (python 3.x)</span></span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong>：更推荐的做法是使用 <code>pip3</code> 命令，或者通过 <code>alias pip=pip3</code> 来实现，直接修改二进制/脚本文件可能会在系统更新后被覆盖。</p></blockquote><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script>]]></content>
    
    
    <summary type="html">&lt;p&gt;在同时安装了 Python 2 和 Python 3 的 Linux 系统上，&lt;code&gt;pip&lt;/code&gt; 命令默认可能指向 Python 2。本文介绍如何手动修改 &lt;code&gt;pip&lt;/code&gt; 脚本，使其默认使用 Python 3。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Python" scheme="http://www.uilucky.com/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>使用 Nginx 反向代理访问 OpenAI API</title>
    <link href="http://www.uilucky.com/post/28a39057.html"/>
    <id>http://www.uilucky.com/post/28a39057.html</id>
    <published>2023-05-31T09:32:00.000Z</published>
    <updated>2026-06-30T02:16:22.939Z</updated>
    
    <content type="html"><![CDATA[<p>通过配置 Nginx 反向代理，利用海外服务器中转请求，解决国内环境无法直接访问 OpenAI API 的问题。</p><span id="more"></span><h3 id="Nginx-配置示例"><a href="#Nginx-配置示例" class="headerlink" title="Nginx 配置示例"></a>Nginx 配置示例</h3><p>在 Nginx 配置文件（如 <code>nginx.conf</code> 或 <code>conf.d/openai.conf</code>）中添加以下 <code>server</code> 块：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl;</span><br><span class="line">    <span class="attribute">server_name</span> your.domain.com;  <span class="comment"># 替换为你的域名</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># SSL 证书配置</span></span><br><span class="line">    <span class="attribute">ssl_certificate</span> /path/to/your/cert.pem;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /path/to/your/key.pem;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># SSL 优化配置 (可选)</span></span><br><span class="line">    <span class="attribute">ssl_session_cache</span> shared:le_nginx_SSL:<span class="number">1m</span>;</span><br><span class="line">    <span class="attribute">ssl_session_timeout</span> <span class="number">1440m</span>;</span><br><span class="line">    <span class="attribute">ssl_protocols</span> TLSv1.<span class="number">2</span> TLSv1.<span class="number">3</span>;</span><br><span class="line">    <span class="attribute">ssl_prefer_server_ciphers</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="attribute">ssl_ciphers</span> EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:!MD5;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="comment"># 反向代理到 OpenAI</span></span><br><span class="line">        <span class="attribute">proxy_pass</span>  https://api.openai.com/;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 关键配置：启用 SNI，否则握手会失败</span></span><br><span class="line">        <span class="attribute">proxy_ssl_server_name</span> <span class="literal">on</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 修改 Host 头</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host api.openai.com;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 关闭连接保持，避免长时间占用</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 优化传输</span></span><br><span class="line">        <span class="attribute">chunked_transfer_encoding</span> <span class="literal">off</span>;</span><br><span class="line">        <span class="attribute">proxy_buffering</span> <span class="literal">off</span>;</span><br><span class="line">        <span class="attribute">proxy_cache</span> <span class="literal">off</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="comment"># 传递客户端 IP (可选)</span></span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>配置完成后，使用 <code>nginx -t</code> 检查配置，并重启 Nginx。<br>客户端调用时，将 <code>https://api.openai.com</code> 替换为 <code>https://your.domain.com</code> 即可。</p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8471002472506164"     crossorigin="anonymous"></script><p><ins class="adsbygoogle"     style="display:block; text-align:center;"     data-ad-layout="in-article"     data-ad-format="fluid"     data-ad-client="ca-pub-8471002472506164"     data-ad-slot="9742153457"></ins></p><script>     (adsbygoogle = window.adsbygoogle || []).push({});</script>]]></content>
    
    
    <summary type="html">&lt;p&gt;通过配置 Nginx 反向代理，利用海外服务器中转请求，解决国内环境无法直接访问 OpenAI API 的问题。&lt;/p&gt;</summary>
    
    
    
    
    <category term="Linux" scheme="http://www.uilucky.com/tags/Linux/"/>
    
    <category term="Nginx" scheme="http://www.uilucky.com/tags/Nginx/"/>
    
    <category term="AI" scheme="http://www.uilucky.com/tags/AI/"/>
    
  </entry>
  
</feed>
