<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sergio7的博客</title><link>http://sergget.qzz.io/</link><description>Recent content on Sergio7的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 13 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://sergget.qzz.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code 免订阅桥接 DeepSeek</title><link>http://sergget.qzz.io/posts/20260713-01/</link><pubDate>Mon, 13 Jul 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260713-01/</guid><description>&lt;p&gt;通过配置系统环境变量，可绕过 Anthropic 官方订阅限制，将 Claude Code 命令行客户端的底层大模型切换为 DeepSeek 引擎。所有请求和扣费均通过个人的 DeepSeek API 账户处理。&lt;/p&gt;
&lt;h2 id="一-客户端安装"&gt;一、 客户端安装
&lt;/h2&gt;&lt;p&gt;由于存在地区限制，直接使用官方 &lt;code&gt;curl&lt;/code&gt; 或 &lt;code&gt;powershell&lt;/code&gt; 脚本下载可能会触发风控阻断。请使用各系统的原生包管理器绕过限制进行安装：&lt;/p&gt;
&lt;h3 id="1-全平台通用使用-nodejs--npm-推荐"&gt;1. 全平台通用（使用 Node.js / npm 推荐）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @anthropic-ai/claude-code
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-mac-用户使用-homebrew"&gt;2. Mac 用户（使用 Homebrew）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install anthropic-ai/claude-code/claude-code
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-windows-用户使用-winget"&gt;3. Windows 用户（使用 winget）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-PowerShell" data-lang="PowerShell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;winget&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;ClaudeCode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="二-永久系统环境变量配置"&gt;二、 永久系统环境变量配置
&lt;/h2&gt;&lt;p&gt;将环境变量写入系统，使 Claude Code 全局默认重定向至 DeepSeek 服务器。&lt;/p&gt;
&lt;h3 id="1-linux--macos-环境"&gt;1. Linux / macOS 环境
&lt;/h3&gt;&lt;p&gt;打开终端配置文件（以 &lt;code&gt;~/.zshrc&lt;/code&gt; 为例，若使用 Bash 请改为 &lt;code&gt;~/.bashrc&lt;/code&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在文件末尾添加以下配置内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Claude Code 切换为 DeepSeek 引擎&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.deepseek.com/anthropic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;你的_DEEPSEEK_API_KEY&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 模型映射配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-v4-pro
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-v4-flash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CLAUDE_CODE_SUBAGENT_MODEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;deepseek-v4-flash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CLAUDE_CODE_EFFORT_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;max
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;保存并退出编辑器后，使配置在当前终端生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-windows-环境图形界面配置"&gt;2. Windows 环境（图形界面配置）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;按下 &lt;code&gt;Win + S&lt;/code&gt;，搜索并打开“编辑系统环境变量”。&lt;/li&gt;
&lt;li&gt;点击右下角“环境变量”按钮。&lt;/li&gt;
&lt;li&gt;在“用户变量”区域点击“新建”，依次将下列键值对添加至系统中：&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;变量名 (Variable Name)&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;变量值 (Variable Value)&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;https://api.deepseek.com/anthropic&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_AUTH_TOKEN&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;em&gt;你的_DEEPSEEK_API_KEY&lt;/em&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_DEFAULT_OPUS_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_DEFAULT_SONNET_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek-v4-pro&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;ANTHROPIC_DEFAULT_HAIKU_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CLAUDE_CODE_SUBAGENT_MODEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;deepseek-v4-flash&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;CLAUDE_CODE_EFFORT_LEVEL&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;max&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;⚠️ &lt;strong&gt;注意&lt;/strong&gt;：配置完成后，必须重新启动当前打开的终端（或关闭并重新打开 VS Code），新加的环境变量方能生效。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="三-启动与验证"&gt;三、 启动与验证
&lt;/h2&gt;&lt;p&gt;完成上述配置后，&lt;strong&gt;无需使用 Claude Desktop 桌面软件&lt;/strong&gt;。直接在终端中切换到项目目录并执行以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;交互式编程助手将被拉起，其底层交互全面由绑定的 DeepSeek 账户承载。&lt;/p&gt;</description></item><item><title>WordPress导航栏添加带 Iconify 图标的常用服务下拉菜单</title><link>http://sergget.qzz.io/posts/20260703-01/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260703-01/</guid><description>&lt;h2 id="背景"&gt;背景
&lt;/h2&gt;&lt;p&gt;自建了 RDP 远程桌面、Immich 相册、Aria2 下载、SSH 面板等一批常用服务的入口，想在博客导航栏里加一个下拉菜单集中收纳，点开就能跳转，并且每一项都带上对应的图标（图标来自 &lt;a class="link" href="https://iconify.design/" target="_blank" rel="noopener"
 &gt;iconify.design&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;站点主题是 &lt;strong&gt;Blogsy&lt;/strong&gt;（Peregrine Themes 出品），确认下来是&lt;strong&gt;经典/混合主题&lt;/strong&gt;：内容用 Gutenberg 编辑，但整站结构（导航菜单、头部/尾部）走的是外观 → 自定义（Customizer）和外观 → 菜单，不是 FSE 站点编辑器。因此方案完全基于 WordPress 原生的「菜单」组件，不需要额外装插件（除了一个可选的头部代码插件）。&lt;/p&gt;
&lt;h2 id="思路"&gt;思路
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;全站加载 Iconify 的 Web Component 脚本，让 &lt;code&gt;&amp;lt;iconify-icon&amp;gt;&lt;/code&gt; 标签能正常渲染成图标&lt;/li&gt;
&lt;li&gt;在「外观 → 菜单」里建一个带子菜单的导航项，子菜单每一项的「导航标签」里直接写入 &lt;code&gt;&amp;lt;iconify-icon&amp;gt;&lt;/code&gt; + 文字的 HTML（WordPress 菜单标签字段允许写入 HTML，不会被转义）&lt;/li&gt;
&lt;li&gt;用一段 CSS，让图标和文字在下拉菜单里对齐、间距合理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="一加载-iconify-脚本"&gt;一、加载 Iconify 脚本
&lt;/h2&gt;&lt;p&gt;装一个免费插件 &lt;strong&gt;WPCode&lt;/strong&gt;（或 Insert Headers and Footers），在&amp;quot;代码片段 → 头部&amp;quot;粘贴：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://code.iconify.design/iconify-icon/2.1.0/iconify-icon.min.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果 Blogsy 主题设置里自带「自定义代码 / Header Scripts」选项，也可以直接填在那里，省得装插件。&lt;/p&gt;
&lt;h2 id="二建立菜单结构"&gt;二、建立菜单结构
&lt;/h2&gt;&lt;p&gt;外观 → 菜单：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加一个「自定义链接」，URL 填 &lt;code&gt;#&lt;/code&gt;，链接文字填 &lt;strong&gt;&amp;ldquo;常用服务&amp;rdquo;&lt;/strong&gt;，作为呼出下拉菜单的顶级按钮&lt;/li&gt;
&lt;li&gt;依次添加若干个「自定义链接」，URL 填各服务地址，&lt;strong&gt;链接文字直接粘贴带图标的 HTML&lt;/strong&gt;，例如：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;devicon:windows11&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; RDP 远程桌面
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;selfhst:immich&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Immich 相册
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;mdi:download-circle&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;color:#f59e0b&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Aria2 下载
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;famicons:terminal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; SSH homeserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;devicon:linux&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; Linux 学习
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;把这几个自定义链接&lt;strong&gt;向右拖动缩进&lt;/strong&gt;到&amp;quot;常用服务&amp;quot;下面一级（WordPress 菜单编辑器里拖动即可产生父子关系），保存菜单&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;保存后前台会出现一个&amp;quot;常用服务&amp;quot;顶级菜单项，悬停/点击会弹出下拉子菜单，每一项都带图标。&lt;/p&gt;
&lt;h2 id="三css-美化关键坑点"&gt;三、CSS 美化（关键坑点）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;踩坑记录&lt;/strong&gt;：Blogsy 实际渲染出的下拉菜单结构，是把图标和文字&lt;strong&gt;包在同一个 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;&lt;/strong&gt; 里：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;menu-item ...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="na"&gt;icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;iconify-icon&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; RDP 远程桌面&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不是&amp;quot;图标、文字各自独立&amp;quot;的结构。所以 flex 布局必须加在这个内层 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 上，而不是 &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; 标签本身，否则样式不会生效。&lt;/p&gt;
&lt;p&gt;外观 → 自定义 → 附加CSS，加入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 子菜单容器宽度 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;menu-item-has-children&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sub-menu&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 每一行链接的内边距 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sub-menu&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;menu-item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 关键：图标+文字都在这个 span 里，flex 要加在这里 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sub-menu&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;menu-item&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-flex&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;/* 图标本身的大小和对齐 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;sub-menu&lt;/span&gt; &lt;span class="nt"&gt;iconify-icon&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;inline-flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;vertical-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;middle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;flex-shrink&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="小结"&gt;小结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;图标直接调用 iconify.design 的在线图标库，去 &lt;a class="link" href="https://icon-sets.iconify.design/" target="_blank" rel="noopener"
 &gt;https://icon-sets.iconify.design/&lt;/a&gt; 搜索关键词即可换用其他图标，写法是 &lt;code&gt;icon=&amp;quot;集合前缀:图标名&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;核心坑点：Blogsy 主题把图标和文字包在同一个 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 里渲染，CSS 的 flex 布局必须作用在这个内层 &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; 上&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>基于 IPv6 直连与 Cloudflare Tunnel 的 Immich 双链路高可用照片备份</title><link>http://sergget.qzz.io/posts/20260703-02/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260703-02/</guid><description>&lt;h3 id="痛点与背景"&gt;痛点与背景
&lt;/h3&gt;&lt;p&gt;在搭建私有相册部署服务（如 Immich）时，远程访问通常面临两个抉择：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Tunnel（内网穿透）&lt;/strong&gt;：免去公网 IP 的烦恼，且带有安全防护和标准 HTTPS。但免费版存在&lt;strong&gt;单个文件上传最大 100MB&lt;/strong&gt; 的硬性限制，在备份动辄数 GB 的手机原画视频时极易断开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公网 IPv6 直连&lt;/strong&gt;：随着家宽 IPv6 的普及，端到端的直连速度极快，且&lt;strong&gt;完全没有上传大小限制&lt;/strong&gt;。但 IPv6 地址是动态变化的，且直接暴露端口存在安全隐患。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;为了兼顾“大文件无限制传输（IPv6直连）”与“全网无缝容灾（CF Tunnel）”，本文实践了一套双链路高可用方案。当处于良好 IPv6 网络下，客户端优先走高带宽直连；在纯 IPv4 环境下，自动降级走 Tunnel 容灾。&lt;/p&gt;
&lt;h3 id="第一部分方案架构设计"&gt;第一部分：方案架构设计
&lt;/h3&gt;&lt;p&gt;本方案的核心在于通过 Nginx 精确分流，将现有的 Web 服务（如 WordPress）与相册服务隔离，同时利用 &lt;code&gt;acme.sh&lt;/code&gt; 的 DNS API 模式自动为 IPv6 直连申请原生 SSL 证书。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第一顺位（主力）&lt;/strong&gt;：&lt;code&gt;https://your-ipv6-subdomain.domain.com&lt;/code&gt; $\rightarrow$ Nginx (443) $\rightarrow$ Immich (2283)【灰云直连，无限制】&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二顺位（容灾）&lt;/strong&gt;：&lt;code&gt;https://your-tunnel-subdomain.domain.com&lt;/code&gt; $\rightarrow$ Cloudflare Tunnel $\rightarrow$ Immich (2283)【黄云穿透，100MB限制】&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="第二部分核心配置步骤"&gt;第二部分：核心配置步骤
&lt;/h3&gt;&lt;h4 id="1-nginx-宿主机反向代理与大文件优化"&gt;1. Nginx 宿主机反向代理与大文件优化
&lt;/h4&gt;&lt;p&gt;在 &lt;code&gt;/etc/nginx/sites-available/&lt;/code&gt; 下为 IPv6 直连域名创建独立的虚拟主机配置，利用精确的 &lt;code&gt;server_name&lt;/code&gt; 匹配，避免被已有的默认重定向规则（如 &lt;code&gt;server_name _&lt;/code&gt;）拦截。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nginx" data-lang="nginx"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt; &lt;span class="s"&gt;http2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;your-ipv6-subdomain.domain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# SSL 证书路径
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/immich.crt&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="s"&gt;/etc/nginx/ssl/immich.key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 核心：解除 Nginx 自身的上传限制（0 代表无限）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;client_max_body_size&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 关闭临时文件缓冲，大文件直接透传给后端容器，避免磁盘 I/O 瓶颈
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_request_buffering&lt;/span&gt; &lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:2283&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 传递必要的 Header
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 开启 WebSocket 支持（Immich 实时同步必须）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="s"&gt;.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;upgrade&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 延长超时时间到 10 分钟以上，防止大视频切片传输时间过长
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;600s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;proxy_send_timeout&lt;/span&gt; &lt;span class="s"&gt;600s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kn"&gt;keepalive_timeout&lt;/span&gt; &lt;span class="s"&gt;620s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="2-轻量化-ssl-证书自动化acmesh"&gt;2. 轻量化 SSL 证书自动化（acme.sh）
&lt;/h4&gt;&lt;p&gt;避免引入沉重的可视化证书管理容器，直接在宿主机利用 &lt;code&gt;acme.sh&lt;/code&gt; 配合 Cloudflare DNS API 验证申请 ECC 证书：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 导入 Cloudflare 凭证&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CF_Token&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your_cloudflare_dns_edit_token&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CF_Account_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your_cloudflare_account_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 申请证书&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --set-default-ca --server letsencrypt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --issue --dns dns_cf -d your-ipv6-subdomain.domain.com --ecc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 安全安装证书至 Nginx 目录并配置自动重载&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;acme.sh --install-cert -d your-ipv6-subdomain.domain.com --ecc &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--key-file /etc/nginx/ssl/immich.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--fullchain-file /etc/nginx/ssl/immich.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--reloadcmd &lt;span class="s2"&gt;&amp;#34;sudo systemctl reload nginx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="3-稳健的-shell--crontab-ipv6-ddns-脚本"&gt;3. 稳健的 Shell + Crontab IPv6 DDNS 脚本
&lt;/h4&gt;&lt;p&gt;家宽 IPv6 变化频繁，且 Cloudflare API 对于 Token 鉴权较为严格。当使用局部的 &lt;code&gt;DNS:Edit&lt;/code&gt; 权限 Token 时，必须通过特定的 &lt;code&gt;ZONE_ID&lt;/code&gt; 精确发起 &lt;code&gt;PATCH&lt;/code&gt; 请求，否则极易触发误导性的 &lt;code&gt;10000 Authentication error&lt;/code&gt;。
编写自动化更新脚本 &lt;code&gt;~/scripts/cf-ddns.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --- 配置区域 ---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CF_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your_cloudflare_dns_edit_token&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ZONE_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your_cloudflare_zone_id&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SUBDOMAIN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;your-ipv6-subdomain.domain.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----------------&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 获取服务器当前的公网 IPv6 地址（排除本地链路和临时地址）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CURRENT_IPV6&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ip -6 addr show scope global &lt;span class="p"&gt;|&lt;/span&gt; grep -v &lt;span class="s2"&gt;&amp;#34;deprecated&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -oE &lt;span class="s1"&gt;&amp;#39;([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n 1&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_IPV6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: 未检测到公网 IPv6 地址&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 查询 Cloudflare 当前的 AAAA 记录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DNS_RECORD_INFO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -X GET &lt;span class="s2"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;&lt;span class="nv"&gt;$ZONE_ID&lt;/span&gt;&lt;span class="s2"&gt;/dns_records?type=AAAA&amp;amp;name=&lt;/span&gt;&lt;span class="nv"&gt;$SUBDOMAIN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CF_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DNS_RECORD_INFO&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; *&lt;span class="s2"&gt;&amp;#34;\&amp;#34;success\&amp;#34;:false&amp;#34;&lt;/span&gt;* &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: Cloudflare API 鉴权失败！详细报错: &lt;/span&gt;&lt;span class="nv"&gt;$DNS_RECORD_INFO&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RECORD_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DNS_RECORD_INFO&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="s1"&gt;&amp;#39;&amp;#34;id&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CLOUDFLARE_IPV6&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DNS_RECORD_INFO&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="s1"&gt;&amp;#39;&amp;#34;content&amp;#34;:&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print $1}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$RECORD_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: 未在 Cloudflare 中找到 &lt;/span&gt;&lt;span class="nv"&gt;$SUBDOMAIN&lt;/span&gt;&lt;span class="s2"&gt; 的 AAAA 记录，请确认后台已手动添加过该记录。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 比对并执行轻量更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_IPV6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CLOUDFLARE_IPV6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: IP 未发生改变 (&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_IPV6&lt;/span&gt;&lt;span class="s2"&gt;)，无需更新。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: IP 发生改变，正在将 [&lt;/span&gt;&lt;span class="nv"&gt;$CLOUDFLARE_IPV6&lt;/span&gt;&lt;span class="s2"&gt;] 更新为 [&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_IPV6&lt;/span&gt;&lt;span class="s2"&gt;]...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;UPDATE_RESULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s -X PATCH &lt;span class="s2"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&lt;/span&gt;&lt;span class="nv"&gt;$ZONE_ID&lt;/span&gt;&lt;span class="s2"&gt;/dns_records/&lt;/span&gt;&lt;span class="nv"&gt;$RECORD_ID&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$CF_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --data &lt;span class="s2"&gt;&amp;#34;{\&amp;#34;content\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CURRENT_IPV6&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$UPDATE_RESULT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; *&lt;span class="s2"&gt;&amp;#34;\&amp;#34;success\&amp;#34;:true&amp;#34;&lt;/span&gt;* &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: Cloudflare DNS 更新成功！&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: Cloudflare DNS 更新失败！错误信息: &lt;/span&gt;&lt;span class="nv"&gt;$UPDATE_RESULT&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过 &lt;code&gt;crontab -e&lt;/code&gt; 设置每 5 分钟定时对齐：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*/5 * * * * /bin/bash /home/username/scripts/cf-ddns.sh &amp;gt;&amp;gt; /home/username/scripts/ddns.log 2&amp;gt;&amp;amp;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="第三部分避坑指南总结"&gt;第三部分：避坑指南总结
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 10000 报错陷阱&lt;/strong&gt;：CF API Token 在进行 &lt;code&gt;zones&lt;/code&gt; 查询或修改时，如果传入的 &lt;code&gt;ZONE_ID&lt;/code&gt; 实际上是 &lt;code&gt;Account ID&lt;/code&gt;，接口不会返回“未找到该区域”，而是直接抛出权限不足的混淆报错。可通过 &lt;code&gt;curl -s -X GET &amp;quot;https://api.cloudflare.com/client/v4/zones&amp;quot; -H &amp;quot;Authorization: Bearer &amp;lt;TOKEN&amp;gt;&amp;quot;&lt;/code&gt; 准确核对专属的 32 位 Zone ID。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全性防探测兜底&lt;/strong&gt;：灰云直连意味着向公网暴露了 443 端口。建议修改全局 &lt;code&gt;nginx.conf&lt;/code&gt; 引入 &lt;code&gt;server_tokens off;&lt;/code&gt; 隐藏版本。同时配置未匹配域名的默认 &lt;code&gt;443&lt;/code&gt; 虚拟主机，对直接扫描公网 IPv6 地址的请求直接返回 &lt;code&gt;444&lt;/code&gt;（断开连接），确保只有通过专属合法域名访问的客户端才能安全握手。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>优雅的外网离线下载：Aria2 + AriaNg + Cloudflare Tunnel 安全长常驻方案</title><link>http://sergget.qzz.io/posts/20260630-01/</link><pubDate>Tue, 30 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260630-01/</guid><description>&lt;p&gt;在现代私有云与数字化工作流中，拥有一个能够“随时随地、即添加即走”的远程离线下载服务器是极大地提升生产力的利器。本文将完整记录如何从零开始，在服务器侧部署 Aria2 核心，通过 Systemd 实现无缝系统常驻，并利用 Cloudflare Tunnel 与 Zero Trust 构建免公网 IP、免配置 SSL 证书的超安全外网访问控制。同时，本文还包含了一套全自动、具备错误熔断机制的 BT Tracker 定态跟踪优化脚本。&lt;/p&gt;
&lt;h2 id="-一-后端核心aria2-安装配置与-systemd-常驻服务"&gt;🛠 一、 后端核心：Aria2 安装、配置与 Systemd 常驻服务
&lt;/h2&gt;&lt;h3 id="11-基础目录准备与配置分离"&gt;1.1 基础目录准备与配置分离
&lt;/h3&gt;&lt;p&gt;为了保证系统升级或脚本读写时不破坏核心参数，推荐将 &lt;strong&gt;主配置&lt;/strong&gt; 与 &lt;strong&gt;动态变化的 Tracker 列表&lt;/strong&gt; 进行文件分离。&lt;/p&gt;
&lt;p&gt;在当前用户的家目录下创建配置目录（以用户 &lt;code&gt;user&lt;/code&gt; 为例）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.aria2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch ~/.aria2/aria2.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch ~/.aria2/tracker.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch ~/.aria2/aria2.session
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;打开 &lt;code&gt;~/.aria2/aria2.conf&lt;/code&gt;，写入以下经过优化的核心基础配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ====== 基础与下载设置 ======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;your&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;downloads&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;warn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;concurrent&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;downloads&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ====== RPC 远程控制设置 ======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;origin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;listen&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 强烈建议设置复杂的 Secret Token 保护接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;rpc&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;YOUR_HEAVY_RPC_SECRET_TOKEN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ====== BT 特殊设置 ======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;peers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dht&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;enable&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;exchange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ====== 核心重点：解耦引入外部 Tracker ======&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;tracker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Aria2 的 &lt;code&gt;include&lt;/code&gt; 语法要求被引入文件绝不能为空。请在 &lt;code&gt;tracker.conf&lt;/code&gt; 中首行预先写入 &lt;code&gt;bt-tracker=&lt;/code&gt; 占位，否则启动会报错。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="12-构建-systemd-服务实现无缝常驻"&gt;1.2 构建 Systemd 服务实现无缝常驻
&lt;/h3&gt;&lt;p&gt;为了让 Aria2 在系统崩溃或重启时能够自动拉起，我们需要将其托管给系统的 init 进程。&lt;/p&gt;
&lt;p&gt;创建服务单元文件：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/systemd/system/aria2.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;写入以下配置（&lt;strong&gt;关键点在于显式指定普通用户 &lt;code&gt;User&lt;/code&gt; 运行，避免遭遇权限壁垒&lt;/strong&gt;）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Aria2&lt;/span&gt; &lt;span class="n"&gt;Download&lt;/span&gt; &lt;span class="n"&gt;Manager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Service&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;aria2c&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Restart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;on&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;RestartSec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Install&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;multi&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;确保文件的所有权正确，然后启动并启用开机自启：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;aria2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;daemon&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;aria2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;aria2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;通过 &lt;code&gt;sudo systemctl status aria2&lt;/code&gt; 验证，若看到一片绿色的 &lt;code&gt;active (running)&lt;/code&gt; 则说明后端核心部署成功。&lt;/p&gt;
&lt;h2 id="-二-网络穿透nginx-转发与-cloudflare-tunnel-边缘映射"&gt;🌐 二、 网络穿透：Nginx 转发与 Cloudflare Tunnel 边缘映射
&lt;/h2&gt;&lt;h3 id="21-应对-rpc-协议限制的痛点"&gt;2.1 应对 RPC 协议限制的痛点
&lt;/h3&gt;&lt;p&gt;Cloudflare Tunnel 默认只转发标准的 HTTP/HTTPS（80/443）流量，而 Aria2 RPC 采用的是原生的 TCP 协议（6800端口）。为了规避浏览器的“混合内容安全策略（Mixed Content）”拦截，最优雅的解法是&lt;strong&gt;通过 Nginx 拦截 RPC 的 WebSocket 长连接，将其伪装并合并到 80 端口，再交给 Tunnel 加密上云&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="22-nginx-反向代理配置"&gt;2.2 Nginx 反向代理配置
&lt;/h3&gt;&lt;p&gt;在 Nginx 的站点配置文件中，为 RPC 请求专门开辟一条伪装路径（例如 &lt;code&gt;/jsonrpc&lt;/code&gt;），并开启对 WebSocket 协议头（Upgrade）的支持：&lt;/p&gt;
&lt;p&gt;Nginx&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server_name&lt;/span&gt; &lt;span class="n"&gt;aria&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;yourdomain&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 你的 Cloudflare 映射域名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 转发 Aria2 RPC 信号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jsonrpc&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_pass&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="mf"&gt;127.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6800&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_redirect&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Real&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;IP&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Forwarded&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;For&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 核心：支持 WebSocket 长连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Upgrade&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxy_set_header&lt;/span&gt; &lt;span class="n"&gt;Connection&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;upgrade&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 可选：如果你将 AriaNg 前端静态文件也托管在该服务器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;aria&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;配置完成后重载服务：&lt;code&gt;sudo nginx -s reload&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="23-cloudflare-tunnel-绑定"&gt;2.3 Cloudflare Tunnel 绑定
&lt;/h3&gt;&lt;p&gt;进入 Cloudflare Zero Trust 控制台，在 Tunnels 页面下为该容器或守护进程添加一个 &lt;strong&gt;Public Hostname&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subdomain / Domain:&lt;/strong&gt; &lt;code&gt;aria.yourdomain.com&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Type:&lt;/strong&gt; &lt;code&gt;HTTP&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL:&lt;/strong&gt; &lt;code&gt;localhost:80&lt;/code&gt; (指向 Nginx 端口，而不是直连 6800)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;此时，Cloudflare 会在边缘自动为你生成 SSL 证书，全权接管 HTTPS 443 加密。&lt;/p&gt;
&lt;h2 id="-三-访问控制zero-trust-拦截下的-rpc-策略穿透"&gt;🔒 三、 访问控制：Zero Trust 拦截下的 RPC 策略穿透
&lt;/h2&gt;&lt;p&gt;当我们在 Cloudflare Access 中为 &lt;code&gt;aria.yourdomain.com&lt;/code&gt; 部署了身份验证（如邮箱验证码）后，由于 AriaNg 前端发起的 RPC 异步长连接无法自动携带 Cloudflare 的认证 Cookie，会导致前端报错“Aria2 未连接”。&lt;/p&gt;
&lt;h3 id="最佳安全策略bypass-路由分割"&gt;最佳安全策略：Bypass 路由分割
&lt;/h3&gt;&lt;p&gt;为了既保护网页前端（防止不法分子窥探下载列表），又保障 RPC 通道顺畅，我们可以&lt;strong&gt;针对具体的 RPC 路径配置免认证白名单&lt;/strong&gt;（由 Aria2 自带的 &lt;code&gt;rpc-secret&lt;/code&gt; 进行二次鉴权，安全性完备）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录 Cloudflare Zero Trust 平台，进入 &lt;strong&gt;Access -&amp;gt; Applications&lt;/strong&gt;，编辑你的 Aria2 应用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;导航至 &lt;strong&gt;Policies&lt;/strong&gt; 选项卡，点击 &lt;strong&gt;Add a policy&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建名为 &lt;code&gt;Bypass-RPC&lt;/code&gt; 的策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Action:&lt;/strong&gt; 必须选择 &lt;strong&gt;Bypass&lt;/strong&gt;（绕过）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在下面的 &lt;strong&gt;Configure rules&lt;/strong&gt; 规则选择器中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Selector:&lt;/strong&gt; 选择 &lt;strong&gt;Path&lt;/strong&gt; (部分中文面板可能归类在 URL/HTTP 属性下)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Value:&lt;/strong&gt; 精确填写 &lt;code&gt;/jsonrpc&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存应用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;⚠️ &lt;strong&gt;国内网络连通性贴士&lt;/strong&gt;：因 WebSocket 协议对网络丢包极其敏感，在国内直连海外 Cloudflare 节点时可能会因跨境网络波动导致 RPC 偶尔断开。但由于 Aria2 后端进程是独立常驻的，&lt;strong&gt;一旦点击下载开始，关闭网页、断开网络或关闭代理均不影响服务器的正常下载流程&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="-四-动态调优tracker-自动更新脚本"&gt;🚀 四、 动态调优：Tracker 自动更新脚本
&lt;/h2&gt;&lt;p&gt;下载 BitTorrent 资源极其依赖优质的 Tracker 服务器，然而网络上的节点瞬息万变。我们可以编写一套 Bash 脚本，既能免代理直连国内优化的加速源，又能在网络异常时实施“熔断”，保护服务器配置不被洗白。&lt;/p&gt;
&lt;h3 id="41-编写高鲁棒性脚本"&gt;4.1 编写高鲁棒性脚本
&lt;/h3&gt;&lt;p&gt;创建并编辑 &lt;code&gt;~/.aria2/trackers-update.sh&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ================= 配置区域 =================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TRACKER_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/user/.aria2/tracker.conf&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 采用作者 XIU2 官方提供的 Cloudflare 边缘加速源，国内直连极度丝滑&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TRACKER_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://cf.trackerslist.com/best.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/tmp/aria2_trackers.tmp&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date &lt;span class="s1"&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;] 开始更新 Tracker 列表...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 抓取远程列表，设置超时限制&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sS -L --connect-timeout &lt;span class="m"&gt;15&lt;/span&gt; --max-time &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRACKER_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -o &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 容错校验：检查网络请求是否遭遇中断&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; -ne &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;【错误】网络请求失败，无法连接到远程服务器！保持原本地可用配置不变。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 容错校验：检查下载到的内容是否为空&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -s &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;【错误】下载到的文件内容为空！保持原本地可用配置不变。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 容错校验：通过特征字符检测内容合法性，防止被 404 等网页内容覆盖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; ! grep -qE &lt;span class="s2"&gt;&amp;#34;udp://|http://|ws://&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;【错误】下载的文件内容格式不正确（未检测到有效协议）！保持原本地可用配置不变。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 格式化处理：将换行符替换为 Aria2 所需的逗号分隔符&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NEW_TRACKERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;awk &lt;span class="s1"&gt;&amp;#39;{if(NR==1){printf &amp;#34;%s&amp;#34;, $0}else{printf &amp;#34;,%s&amp;#34;, $0}}&amp;#39;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/,,*/,/g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/,$//&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -z &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NEW_TRACKERS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;【错误】数据格式化转换异常！保持原本地可用配置不变。&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rm -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 6. 安全覆盖原独立配置文件并重载服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bt-tracker=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NEW_TRACKERS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRACKER_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;【成功】最新 Tracker 列表已安全写入: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TRACKER_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;正在重启 Aria2 服务...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart aria2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date &lt;span class="s1"&gt;&amp;#39;+%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;] 全步聚更新完成，新 Tracker 已生效！&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;赋予脚本可执行权限：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x /home/user/.aria2/trackers-update.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="42-配置-linux-cron-定时任务"&gt;4.2 配置 Linux Cron 定时任务
&lt;/h3&gt;&lt;p&gt;为了实现无需人工干预的动态跟踪，设置 Linux 定时任务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在末尾添加一行，使其在每天凌晨 04:00 自动执行该脚本并过滤日常冗余日志：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 4 * * * /bin/bash /home/user/.aria2/trackers-update.sh &amp;gt; /dev/null 2&amp;gt;&amp;amp;1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-五-最终客户端连接配置指南"&gt;🎛 五、 最终客户端连接配置指南
&lt;/h2&gt;&lt;p&gt;当你在外网环境打开 AriaNg 网页前端时，请定位到 &lt;strong&gt;AriaNg 设置 -&amp;gt; RPC&lt;/strong&gt;，按照以下映射关系进行填写：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Aria2 RPC 别名&lt;/strong&gt;：自定义&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RPC 协议&lt;/strong&gt;：选择 &lt;strong&gt;WebSocket (WXS)&lt;/strong&gt; (必须是带安全加密的 WSS)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RPC 主机&lt;/strong&gt;：填写你在 Cloudflare 绑定的主域名（例如：&lt;code&gt;aria.yourdomain.com&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RPC 端口&lt;/strong&gt;：填写 &lt;strong&gt;443&lt;/strong&gt; (因为外网 HTTPS 默认为 443)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RPC 路径&lt;/strong&gt;：填写 &lt;strong&gt;&lt;code&gt;/jsonrpc&lt;/code&gt;&lt;/strong&gt; (契合你在 Nginx 与 Cloudflare Bypass 策略中指定的路径)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;RPC 密匙&lt;/strong&gt;：填写你在 &lt;code&gt;aria2.conf&lt;/code&gt; 中配置的 &lt;code&gt;rpc-secret&lt;/code&gt; 令牌。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;至此，整套离线下载系统已完美闭环。你可以享受到安全、干净、不受公网 IP 限制且具备高容错更新能力的私有云下载体验。&lt;/p&gt;</description></item><item><title>零额外功耗！利用 Tailscale + 自建私有 DERP 完美搞定跨地域异地组网</title><link>http://sergget.qzz.io/posts/20260629-01/</link><pubDate>Mon, 29 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260629-01/</guid><description>&lt;p&gt;在跨地域或严格的内网环境下，Tailscale 经常因打洞失败而不得不求助于官方的 DERP 中转服务器。由于官方节点均在海外，动辄 200ms+ 的延迟和极低的带宽严重影响体验。本文将详细介绍如何在拥有&lt;strong&gt;动态公网 IPv4&lt;/strong&gt; 且常开的 Windows 11 设备上，利用&lt;strong&gt;纯原生工具&lt;/strong&gt;（不依赖任何第三方服务注册软件）搭建高速、低延迟的私有 DERP 中转站，并配置故障自愈和完全隐身运行。&lt;/p&gt;
&lt;h2 id="-第一步用-go-纯净环境编译-derper-核心"&gt;🛠️ 第一步：用 Go 纯净环境编译 derper 核心
&lt;/h2&gt;&lt;p&gt;新版的 &lt;code&gt;derper&lt;/code&gt; 强制要求验证和本地配置文件。我们直接在本地的 Go 环境下进行编译。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;准备 Go 语言环境&lt;/strong&gt;：前往 &lt;a class="link" href="https://go.dev/" target="_blank" rel="noopener"
 &gt;Go 官网&lt;/a&gt; 下载 Windows 版本的安装包（&lt;code&gt;.msi&lt;/code&gt;）并完成安装。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开 PowerShell 窗口，配置国内代理加速并下载编译 &lt;code&gt;derper&lt;/code&gt;：PowerShell&lt;code&gt;$env:GO111MODULE=&amp;quot;on&amp;quot; $env:GOPROXY=&amp;quot;https://goproxy.cn,direct&amp;quot; # 下载并编译二进制文件 go install tailscale.com/cmd/derper@main&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编译完成后，核心程序 &lt;code&gt;derper.exe&lt;/code&gt; 会生成在 &lt;code&gt;C:\Users\你的用户名\go\bin\&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-第二步一键用-go-生成合规的自签名-ssl-证书"&gt;🔐 第二步：一键用 Go 生成合规的自签名 SSL 证书
&lt;/h2&gt;&lt;p&gt;由于 DERP 强制要求 HTTPS 且新版对密钥格式审查严格，Windows 自带的 &lt;code&gt;certutil&lt;/code&gt; 导出的私钥经常触发 &lt;code&gt;found a certificate rather than a key&lt;/code&gt; 的报错。最稳妥的办法是直接用 Go 的标准加密库生成纯正的 PEM 格式证书。&lt;/p&gt;
&lt;p&gt;确保在 &lt;code&gt;C:\Users\你的用户名\go\bin&lt;/code&gt; 路径下，运行以下长命令。它会在本地临时创建一个 &lt;code&gt;gen.go&lt;/code&gt; 脚本，生成专用的 &lt;code&gt;.crt&lt;/code&gt; 和 &lt;code&gt;.key&lt;/code&gt; 文件后自动自我销毁：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="n"&gt;qiniupkg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;crypto&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;v7&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;keypair&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;你的DDNS域名&amp;#34;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;$&lt;/span&gt;&lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gen.go&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ItemType&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;File&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;package main; import (&amp;#34;crypto/rand&amp;#34;; &amp;#34;crypto/rsa&amp;#34;; &amp;#34;crypto/x509&amp;#34;; &amp;#34;crypto/x509/pkix&amp;#34;; &amp;#34;encoding/pem&amp;#34;; &amp;#34;math/big&amp;#34;; &amp;#34;net&amp;#34;; &amp;#34;os&amp;#34;; &amp;#34;time&amp;#34;); func main() { priv, _ := rsa.GenerateKey(rand.Reader, 2048); template := x509.Certificate{SerialNumber: big.NewInt(1), Subject: pkix.Name{CommonName: &amp;#34;你的DDNS域名&amp;#34;}, NotBefore: time.Now(), NotAfter: time.Now().AddDate(10, 0, 0), KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature, ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth}, DNSNames: []string{&amp;#34;你的DDNS域名&amp;#34;}, IPAddresses: []net.IP{net.ParseIP(&amp;#34;127.0.0.1&amp;#34;)}}; certBytes, _ := x509.CreateCertificate(rand.Reader, &amp;amp;template, &amp;amp;template, &amp;amp;priv.PublicKey, priv); certFile, _ := os.Create(&amp;#34;你的DDNS域名.crt&amp;#34;); pem.Encode(certFile, &amp;amp;pem.Block{Type: &amp;#34;CERTIFICATE&amp;#34;, Bytes: certBytes}); certFile.Close(); keyFile, _ := os.Create(&amp;#34;你的DDNS域名.key&amp;#34;); pem.Encode(keyFile, &amp;amp;pem.Block{Type: &amp;#34;RSA PRIVATE KEY&amp;#34;, Bytes: x509.MarshalPKCS1PrivateKey(priv)}); keyFile.Close() }&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Force&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FullName&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Remove&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;\&lt;span class="n"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;确认目录下成功生成了 &lt;code&gt;你的DDNS域名.crt&lt;/code&gt; 和 &lt;code&gt;你的DDNS域名.key&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="-第三步主路由端口转发配置"&gt;🌐 第三步：主路由端口转发配置
&lt;/h2&gt;&lt;p&gt;前往公网 IPv4 所在的路由器后台（例如华硕路由器），为运行 &lt;code&gt;derper&lt;/code&gt; 的本地 Win11 笔记本配置虚拟服务器/端口转发：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;服务名称&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;外网端口&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;内网 IP 地址&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;内网端口&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;协议&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;DERP-HTTPS&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;8443&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;你的Win11本地内网IP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;8443&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;TCP&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DERP-STUN&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;3478&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;你的Win11本地内网IP&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;3478&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;UDP&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;em&gt;注：Windows 防火墙可能会拦截入站流量，建议在 Win11 高级防火墙中同样为 &lt;code&gt;8443(TCP)&lt;/code&gt; 和 &lt;code&gt;3478(UDP)&lt;/code&gt; 放行。&lt;/em&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="-第四步tailscale-控制台-acl-接入"&gt;📝 第四步：Tailscale 控制台 ACL 接入
&lt;/h2&gt;&lt;p&gt;登录 Tailscale 管理后台，在 &lt;strong&gt;Access Controls&lt;/strong&gt; 配置文件中加入自签名白名单节点。注意：&lt;strong&gt;新版 Tailscale 参数字段严格区分大小写，且不支持 JSON 注释&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;请粘贴以下标准格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&amp;#34;grants&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		{&amp;#34;src&amp;#34;: [&amp;#34;*&amp;#34;], &amp;#34;dst&amp;#34;: [&amp;#34;*&amp;#34;], &amp;#34;ip&amp;#34;: [&amp;#34;*&amp;#34;]}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&amp;#34;ssh&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&amp;#34;action&amp;#34;: &amp;#34;check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&amp;#34;src&amp;#34;: [&amp;#34;autogroup:member&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&amp;#34;dst&amp;#34;: [&amp;#34;autogroup:self&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&amp;#34;users&amp;#34;: [&amp;#34;autogroup:nonroot&amp;#34;, &amp;#34;root&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	&amp;#34;derpMap&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&amp;#34;OmitDefaultRegions&amp;#34;: false,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		&amp;#34;Regions&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			&amp;#34;901&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;				&amp;#34;RegionID&amp;#34;: 901,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;				&amp;#34;RegionCode&amp;#34;: &amp;#34;my-home-derp&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;				&amp;#34;RegionName&amp;#34;: &amp;#34;Private Home DERP&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;				&amp;#34;Nodes&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;					{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;Name&amp;#34;: &amp;#34;win11-derp&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;RegionID&amp;#34;: 901,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;HostName&amp;#34;: &amp;#34;你的DDNS域名&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;derpPort&amp;#34;: 8443,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;stunPort&amp;#34;: 3478,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;						&amp;#34;InsecureForTests&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;					}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;				]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;			}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第五步完美隐身开机延迟自启与断网自愈配置"&gt;第五步：完美隐身、开机延迟自启与断网自愈配置
&lt;/h2&gt;&lt;p&gt;为了避免桌面上一直挂着一个易被误关的 PowerShell 黑色窗口，同时为了让服务在设备重启、网络恢复后能自动重连，我们采用 &lt;strong&gt;VBS 脚本 + Windows 任务计划程序&lt;/strong&gt;的纯原生方案。&lt;/p&gt;
&lt;h3 id="1-编写隐身-vbs-启动脚本"&gt;1. 编写隐身 VBS 启动脚本
&lt;/h3&gt;&lt;p&gt;在 &lt;code&gt;C:\Users\你的用户名\go\bin&lt;/code&gt; 目录下，新建一个文本文档，重命名为 &lt;code&gt;run_derp.vbs&lt;/code&gt;（注意后缀名切换）。用记事本写入以下 1 行代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CreateObject(&amp;#34;Wscript.Shell&amp;#34;).Run &amp;#34;C:\Users\你的用户名\go\bin\derper.exe -hostname 你的DDNS域名 -certmode manual -certdir C:\Users\你的用户名\go\bin -a :8443 -stun-port 3478 -verify-clients -c C:\Users\你的用户名\go\bin\derp.conf&amp;#34;, 0, False
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;(末尾的 &lt;code&gt;, 0&lt;/code&gt; 参数代表彻底隐藏该进程引发的所有黑窗口)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="2-配置任务计划程序task-scheduler"&gt;2. 配置任务计划程序（Task Scheduler）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;管理员身份打开“任务计划程序”，点击右侧 &lt;strong&gt;创建基本任务&lt;/strong&gt;，命名为 &lt;code&gt;TailscaleDERP&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;触发器&lt;/strong&gt;：选择“计算机启动时”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;操作&lt;/strong&gt;：选择“启动程序”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;程序或脚本&lt;/strong&gt;：输入 &lt;code&gt;wscript.exe&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;添加参数&lt;/strong&gt;：输入 &lt;code&gt;&amp;quot;C:\Users\你的用户名\go\bin\run_derp.vbs&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;起始于&lt;/strong&gt;：输入 &lt;code&gt;C:\Users\你的用户名\go\bin&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;勾选“当单击完成时，打开此任务的属性对话框”并点击完成。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="3-高级属性微调防灾核心"&gt;3. 高级属性微调（防灾核心）
&lt;/h3&gt;&lt;p&gt;在弹出的属性面板中调整三个关键标签页：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;常规&lt;/strong&gt;：选择“不管用户是否登录都要运行”，彻底压制潜在的交互弹窗。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;触发器&lt;/strong&gt;：双击“计算机启动时”，勾选 &lt;strong&gt;“延迟任务时间”&lt;/strong&gt; 改为 &lt;strong&gt;1 分钟&lt;/strong&gt;。给系统网络和 DDNS 解析留出初始化时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设置（断网自愈）&lt;/strong&gt;：勾选 &lt;strong&gt;“如果任务失败，按以下时间间隔重新启动”&lt;/strong&gt; 改为 &lt;strong&gt;1 分钟&lt;/strong&gt;，并将 &lt;strong&gt;“尝试重新启动的次数”&lt;/strong&gt; 改为 &lt;strong&gt;99 次&lt;/strong&gt;。这样一旦遭遇宽带偶发断网，Windows 会在后台无限期每隔 1 分钟自动拉起进程，直至网络恢复。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-验证连接状态"&gt;⚡ 验证连接状态
&lt;/h2&gt;&lt;p&gt;在远端任意一台 Tailscale 节点上打开终端执行验证：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;运行 &lt;code&gt;tailscale netcheck&lt;/code&gt;：在返回的 &lt;code&gt;DERP latency&lt;/code&gt; 列表中可以清晰地看到 &lt;code&gt;my-home-derp&lt;/code&gt; 已经榜上有名，且延迟会从海外节点的 150ms+ 断崖式下跌到 &lt;strong&gt;15ms~25ms&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;运行 &lt;code&gt;tailscale status&lt;/code&gt; 确认流量不再绕道海外。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在 Windows 任务管理器中，该服务会以一个隐身的 &lt;code&gt;wscript.exe&lt;/code&gt; 宿主和独立的 &lt;code&gt;derper.exe&lt;/code&gt; 进程在后台默默工作，至此，一套&lt;strong&gt;零额外功耗、纯原生自愈&lt;/strong&gt;的 Tailscale 加速方案搭建完成。&lt;/p&gt;</description></item><item><title>通过 Cloudflare Tunnel 在浏览器中远程访问 Windows 桌面（RDP）</title><link>http://sergget.qzz.io/posts/20260626-01/</link><pubDate>Fri, 26 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260626-01/</guid><description>&lt;p&gt;Cloudflare 于 2025 年推出了浏览器内 RDP 功能，基于 Zero Trust Access 实现。无需在客户端安装任何 RDP 软件，也无需开放任何入站端口，只需一个浏览器即可远程访问 Windows 桌面。&lt;/p&gt;
&lt;p&gt;前面我们讲了使用Apache Guacamole (Docker)作为中转来远程访问，但实际上，将windows密码明文写在配置文件中不安全，新开一个本地账户也需要重新安装、登录软件，配置权限等。总之非常不方便，今天我们使用cloudflare直接在浏览器中远程访问windows桌面。&lt;/p&gt;
&lt;h2 id="前提条件"&gt;前提条件
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows 10/11 主机已开启远程桌面（RDP）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;已安装 cloudflared 并建立了 Tunnel&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;域名已托管在 Cloudflare（需要 DNS 管理权）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;拥有 Cloudflare Zero Trust 账户（免费计划即可）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="第一步windows-开启远程桌面"&gt;第一步：Windows 开启远程桌面
&lt;/h2&gt;&lt;p&gt;进入 &lt;strong&gt;设置 → 系统 → 远程桌面&lt;/strong&gt;，开启远程桌面功能。建议同时启用 &lt;strong&gt;网络级别身份验证（NLA）&lt;/strong&gt;。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Windows 账户必须设置有传统密码，Windows Hello PIN 无法用于 RDP 登录。若使用 Microsoft 账户，需确认密码已在本地缓存。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="第二步配置-tunnel-私有网络路由"&gt;第二步：配置 Tunnel 私有网络路由
&lt;/h2&gt;&lt;p&gt;进入 &lt;a class="link" href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare Zero Trust 控制台&lt;/a&gt;，依次进入：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Networks → Connectors → Cloudflare Tunnels → 选择你的 Tunnel → 编辑&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;切换到 &lt;strong&gt;Private Networks（CIDR）&lt;/strong&gt; 标签，添加 Win10 所在的内网网段，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;192.168.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="第三步创建-target目标资源"&gt;第三步：创建 Target（目标资源）
&lt;/h2&gt;&lt;p&gt;进入 &lt;strong&gt;Access controls → Targets → Add a target&lt;/strong&gt;，填写以下信息：&lt;/p&gt;
&lt;p&gt;| 字段 | 示例值 | ||&amp;ndash;| | Target hostname | &lt;code&gt;win10-home&lt;/code&gt;（自定义友好名称） | | IP address | &lt;code&gt;192.168.0.10&lt;/code&gt;（Win10 内网 IP） | | Port | &lt;code&gt;3389&lt;/code&gt; | | Virtual network | &lt;code&gt;default&lt;/code&gt; |&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Target hostname 是自定义名称，不是域名也不是 IP，后续在 Application 中需要引用这个名称。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="第四步创建-dns-记录"&gt;第四步：创建 DNS 记录
&lt;/h2&gt;&lt;p&gt;在 Cloudflare DNS 面板为你的域名新建一条 CNAME 记录，例如 &lt;code&gt;rdp.yourdomain.com&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;类型&lt;/strong&gt;：CNAME&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;名称&lt;/strong&gt;：&lt;code&gt;rdp&lt;/code&gt;（或其他自定义前缀）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：&lt;code&gt;&amp;lt;tunnel-id&amp;gt;.cfargotunnel.com&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Proxy 状态&lt;/strong&gt;：橙色云朵（Proxied）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;这条 DNS 记录不需要指向实际服务器 IP，Cloudflare 的 RDP 代理会处理路由。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="第五步创建-access-application"&gt;第五步：创建 Access Application
&lt;/h2&gt;&lt;p&gt;进入 &lt;strong&gt;Access controls → Applications → Add an application → Self-hosted&lt;/strong&gt;，配置如下：&lt;/p&gt;
&lt;p&gt;| 字段 | 填写内容 | ||| | Application name | 自定义，如 &lt;code&gt;Win10 RDP&lt;/code&gt; | | Public hostname | &lt;code&gt;rdp.yourdomain.com&lt;/code&gt; | | &lt;strong&gt;Browser rendering&lt;/strong&gt; | &lt;strong&gt;RDP&lt;/strong&gt;（关键步骤） | | Target hostname | 选择第三步创建的 Target 名称 | | Port | &lt;code&gt;3389&lt;/code&gt; |&lt;/p&gt;
&lt;p&gt;然后配置 &lt;strong&gt;Policy（访问策略）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;类型选 &lt;strong&gt;Allow&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Include 条件选 &lt;strong&gt;Emails&lt;/strong&gt;，填入允许访问的邮箱地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多个邮箱分别添加为独立的 Include 条目（OR 逻辑）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后在 &lt;strong&gt;Experience Settings&lt;/strong&gt; 中勾选 &lt;strong&gt;Show application in App Launcher&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="使用方式"&gt;使用方式
&lt;/h2&gt;&lt;h3 id="方式一通过-app-launcher-访问推荐"&gt;方式一：通过 App Launcher 访问（推荐）
&lt;/h3&gt;&lt;p&gt;访问你的 Access 团队地址：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://&amp;lt;your-team-name&amp;gt;.cloudflareaccess.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入邮箱，接收验证码登录后，在 App Launcher 中点击 RDP 应用即可在浏览器中启动会话。&lt;/p&gt;
&lt;h3 id="方式二收藏完整-url-直接访问"&gt;方式二：收藏完整 URL 直接访问
&lt;/h3&gt;&lt;p&gt;App Launcher 启动 RDP 时会跳转到如下格式的 URL：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://rdp.yourdomain.com/rdp/&amp;lt;vnet-id&amp;gt;/&amp;lt;target-ip&amp;gt;/3389
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;将此完整 URL 加入浏览器书签，以后可直接访问，无需每次经过 App Launcher。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;直接访问根域名 rdp.yourdomain.com 会报错 Unable to find your RDP target，这是 Cloudflare 的产品设计限制，必须携带完整的 target 参数。&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="登录流程"&gt;登录流程
&lt;/h2&gt;&lt;p&gt;完整的连接流程如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 访问 https://&amp;lt;team-name&amp;gt;.cloudflareaccess.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 输入邮箱 → 接收验证码 → 完成 Access 身份验证
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 在 App Launcher 中点击 RDP 应用
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 在浏览器 RDP 窗口中输入 Windows 用户名和密码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. 进入 Windows 桌面
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;建议将 Access Session Duration 设置为 1 month，这样在同一台设备的同一浏览器中，一次登录后长期有效，无需频繁接收验证码。&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="安全特性"&gt;安全特性
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;零端口暴露&lt;/strong&gt;：3389 端口完全不对外开放，所有流量通过 Cloudflare 出站隧道传输&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无需客户端软件&lt;/strong&gt;：任何支持现代浏览器的设备均可访问&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access 身份验证&lt;/strong&gt;：连接前必须通过 Cloudflare Access 验证，支持邮件 OTP、Google、GitHub 等多种登录方式&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cloudflare 不保存 Windows 凭据&lt;/strong&gt;：每次会话需手动输入 Windows 用户名和密码&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="常见问题"&gt;常见问题
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：报错 &lt;code&gt;Unable to find your RDP target&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
A：通常是以下原因之一：Browser rendering 未选择 RDP；Application 中 Target criteria 未关联 Target；访问的是根域名而非完整 URL。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：App Launcher 中看不到应用&lt;/strong&gt;&lt;br&gt;
A：检查 Application 的 Experience Settings 是否勾选了 Show in App Launcher；检查 Policy 中的邮箱是否与登录邮箱一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：Target 创建时 IP 下拉框为空&lt;/strong&gt;&lt;br&gt;
A：说明 Tunnel 的 Private Networks CIDR 未配置，或路由未生效，先检查 Networks → Routes 中是否有对应条目。&lt;/p&gt;</description></item><item><title>【玩机归档】旧款 OPPO 手机（PBAM00/A5）忘记密码，利用 UnlockTool 强制解锁与避坑指南</title><link>http://sergget.qzz.io/posts/20260624-01/</link><pubDate>Wed, 24 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260624-01/</guid><description>&lt;p&gt;在折腾旧手机或进行自动化脚本测试（如 Bing 积分、挂机薅羊毛）时，经常会遇到&lt;strong&gt;手机型号模糊、锁屏密码忘记&lt;/strong&gt;的尴尬情况。本文将以一台标有 &lt;strong&gt;PBAM00&lt;/strong&gt; 的旧款 OPPO 手机为例，完整记录如何从“盲测型号”到“绕过官方固件限制”，最终利用 &lt;strong&gt;UnlockTool&lt;/strong&gt; 成功实现 Factory Reset（恢复出厂设置）与清除 FRP 激活锁的全过程。&lt;/p&gt;
&lt;h2 id="一-前期准备如何盲测锁定手机型号"&gt;一、 前期准备：如何盲测锁定手机型号？
&lt;/h2&gt;&lt;p&gt;在无法进入系统的前提下，以下几种方法是锁定老旧 OPPO 手机型号的最有效手段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;紧急拨号法&lt;/strong&gt;：在锁屏界面点击“紧急呼叫”，输入 &lt;code&gt;*#899#&lt;/code&gt;。如果能进入工程师模式，点击“软件版本”查看 &lt;code&gt;Model&lt;/code&gt; 一栏（通常以 CPH 或者是 PB 开头）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设备管理器硬件 ID 法&lt;/strong&gt;：手机关机，长按 &lt;strong&gt;【音量加 + 音量减】&lt;/strong&gt; 插线连接电脑。在电脑的&lt;code&gt;设备管理器 -&amp;gt; 端口 (COM 和 LPT)&lt;/code&gt;中观察底层驱动响应：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;出现 &lt;code&gt;MediaTek USB Port&lt;/code&gt;：说明是联发科（MTK）平台。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出现 &lt;code&gt;Qualcomm HS-USB QDLoader 9008&lt;/code&gt;：说明是高通（Qualcomm）平台。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;进阶&lt;/strong&gt;：右键该端口 -&amp;gt; 属性 -&amp;gt; 详细信息 -&amp;gt; 硬件 ID，复制 VID 和 PID 代码去搜索引擎检索，能直接精确到具体芯片。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;本案对象：&lt;/strong&gt; 经查询，型号 &lt;strong&gt;PBAM00&lt;/strong&gt; 对应的国行商业名称为 &lt;strong&gt;OPPO A5（全网通版）&lt;/strong&gt;，底层搭载的是&lt;strong&gt;高通骁龙 450 (SDM450)&lt;/strong&gt; 芯片。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="二-踩坑记录unlocktool-官方预设的型号合并陷阱"&gt;二、 踩坑记录：UnlockTool 官方预设的“型号合并陷阱”
&lt;/h2&gt;&lt;p&gt;在使用 UnlockTool 进行解锁时，我们在 OPPO 专用选项卡中搜索 “A5”，通常会引导至以下选项：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Selected Model : Oppo A5 (A5s) [CPH1909 / PBAM00]&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="-报错现象"&gt;❌ 报错现象
&lt;/h3&gt;&lt;p&gt;直接选择该型号并点击 &lt;code&gt;FACTORY RESET&lt;/code&gt;，手机进入 9008 模式插线后，UnlockTool 会直接报错：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connecting to device... OK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Handshaking... FAIL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[Sahara] Reading Hello - Failed to handshake with device PBL!
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connecting to flash programmer... FAIL
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Waiting for response timeout!
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="-原因分析"&gt;🔍 原因分析
&lt;/h3&gt;&lt;p&gt;这是 UnlockTool 官方库的一个逻辑漏洞。官方将 &lt;strong&gt;CPH1909（OPPO A5s，联发科 MT6765 芯片）&lt;/strong&gt; 与 &lt;strong&gt;PBAM00（OPPO A5，高通骁龙 450 芯片）&lt;/strong&gt; 错误地归类到了同一个选项里。这导致软件在握手时发送了错误的底层协议引导（Firehose），从而引发高通底层的 &lt;strong&gt;Sahara 协议握手失败 (Handshake FAIL)&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="三-终极解决方案巧用同芯片平替法绕过限制"&gt;三、 终极解决方案：巧用“同芯片平替法”绕过限制
&lt;/h2&gt;&lt;p&gt;既然 OPPO 专区下的 A5 引导文件有误，我们选择&lt;strong&gt;跳出型号限制，改用同芯片、同主板架构的纯净高通引导进行欺骗。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 OPPO 产品线中，海外版的 &lt;strong&gt;OPPO A3s (CPH1803)&lt;/strong&gt; 同样采用了高通骁龙 450 芯片，其底层包与 PBAM00 完全通用。&lt;/p&gt;
&lt;h3 id="-成功解锁实操步骤"&gt;🛠️ 成功解锁实操步骤
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;彻底切断连接&lt;/strong&gt;：拔掉手机数据线。长按 &lt;strong&gt;【电源键 + 音量加键】&lt;/strong&gt; 10 秒以上，确保手机强制黑屏关机。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;软件跨区选型&lt;/strong&gt;：切换到 UnlockTool 的 &lt;strong&gt;&lt;code&gt;QUALCOMM&lt;/code&gt;（高通）&lt;/strong&gt; 专区（而非 OPPO 专区）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Brand (品牌)&lt;/strong&gt;: 选择 &lt;code&gt;OPPO&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Model (型号)&lt;/strong&gt;: 放弃 A5，点击选择 &lt;strong&gt;&lt;code&gt;Oppo A3s [CPH1803|CPH1805]&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;下发布局指令&lt;/strong&gt;：点击右侧功能栏的 &lt;strong&gt;&lt;code&gt;FACTORY RESET&lt;/code&gt;&lt;/strong&gt;，软件下发指令并进入 &lt;code&gt;Waiting for HS-USB QDLoader 9008...&lt;/code&gt; 状态。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;纯净联机&lt;/strong&gt;：死死按住手机的 &lt;strong&gt;【音量加键】和【音量减键】&lt;/strong&gt; 不松手，插入高规格的 Micro-USB 数据线连接电脑。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="四-成功解锁日志复盘"&gt;四、 成功解锁日志复盘
&lt;/h2&gt;&lt;p&gt;改用 CPH1803 引导后，UnlockTool 成功与手机 PBL 握手，27 秒内直接秒杀锁屏密码，以下为核心日志：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Selected&lt;/span&gt; &lt;span class="n"&gt;Model&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Oppo&lt;/span&gt; &lt;span class="n"&gt;A3s&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Code&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CPH1803&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;CPH1805&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Operation&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Factory&lt;/span&gt; &lt;span class="n"&gt;Reset&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Waiting&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;HS&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;USB&lt;/span&gt; &lt;span class="n"&gt;QDLoader&lt;/span&gt; &lt;span class="mf"&gt;9008.&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="n"&gt;COM8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Connecting&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Handshaking&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Reading&lt;/span&gt; &lt;span class="n"&gt;bootloader&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Serial&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3299746999&lt;/span&gt; &lt;span class="n"&gt;SoC&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Snapdragon&lt;/span&gt; &lt;span class="mi"&gt;450&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SDM450&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x0009A0E1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Writing&lt;/span&gt; &lt;span class="n"&gt;flash&lt;/span&gt; &lt;span class="n"&gt;programmer&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Connecting&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;flash&lt;/span&gt; &lt;span class="n"&gt;programmer&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Configuring&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Reading&lt;/span&gt; &lt;span class="n"&gt;partition&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;LU&lt;/span&gt; &lt;span class="n"&gt;Count&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Reading&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Manufacturer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;OPPO&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Platform&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;msm8953&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Android&lt;/span&gt; &lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;8.1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Erasing&lt;/span&gt; &lt;span class="n"&gt;FRP&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;--&lt;/span&gt; &lt;span class="err"&gt;完美擦除激活锁，防卡激活向导&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Erasing&lt;/span&gt; &lt;span class="n"&gt;USERDATA&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;--&lt;/span&gt; &lt;span class="err"&gt;成功抹除锁屏密码和用户数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Rebooting&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Elapsed&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt; &lt;span class="n"&gt;seconds&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="五-后续与开机避坑说明"&gt;五、 后续与开机避坑说明
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;首次开机耗时较长&lt;/strong&gt;：执行完 &lt;code&gt;FACTORY RESET&lt;/code&gt; 后，手机会自动重启。由于需要重建 eMMC 闪存的系统缓存，手机会停留在 OPPO Logo 界面 &lt;strong&gt;3 至 10 分钟&lt;/strong&gt;，此期间切勿强行断电。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;激活绕过技巧&lt;/strong&gt;：由于 UnlockTool 在擦除数据的同时执行了 &lt;code&gt;Erasing FRP... OK&lt;/code&gt;，手机开机进入欢迎向导后，Wi-Fi 验证连接界面可直接点击“跳过”。若遇到顽固固件，可在初始语言选择界面的“紧急呼叫”中输入 &lt;code&gt;*#813#&lt;/code&gt;，即可直接闪进系统桌面。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-总结归纳"&gt;💡 总结归纳
&lt;/h2&gt;&lt;p&gt;刷机解锁的本质是&lt;strong&gt;与手机芯片（CPU）通信&lt;/strong&gt;，而非与手机的“外壳型号”通信。当遇到专业的刷机软件对特定机型划分模糊、报错 Sahara 协议失败时，&lt;strong&gt;查明其底层芯片，寻找同芯片、同平台的标准机型进行通用引导（Firehose）替代&lt;/strong&gt;，往往是高效解决问题的终极秘籍。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;本文首发于我的 WordPress 博客，记录旨在备忘，希望能帮到遇到同类高通 Sahara 报错的折腾同好。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>【玩机归档】修复Nexus 6P (angler) 因主板脱焊导致无限重启的四核硬件续命指南</title><link>http://sergget.qzz.io/posts/20260622-01/</link><pubDate>Mon, 22 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260622-01/</guid><description>&lt;h2 id="-核心技术背景"&gt;📋 核心技术背景
&lt;/h2&gt;&lt;p&gt;Nexus 6P（代号：&lt;code&gt;angler&lt;/code&gt;，搭载骁龙 810 处理器）因硬件设计缺陷，极易因主板大核发热导致&lt;strong&gt;芯片脱焊&lt;/strong&gt;，引发俗称的 &lt;strong&gt;“死亡无限重启（Bootloop of Death, BLOD）”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文档归档了通过&lt;strong&gt;物理屏蔽 4 个大核、重构底层 EXT4 分区表&lt;/strong&gt;的方式，将一台脑死亡的 Nexus 6P 成功降级至官方 Android 7.1.2，并将其改造为低功耗、免发热的“24小时无人值守自动化挂机节点”的完整全流程。&lt;/p&gt;
&lt;h2 id="-归档必须提前准备的文件清单"&gt;📥 归档：必须提前准备的文件清单
&lt;/h2&gt;&lt;p&gt;在开始前，请务必建立本地工作目录，并下载以下精确对应版本的固件与补丁文件：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;文件分类&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;推荐下载文件名/版本&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;获取途径与说明&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;1. 基础工具包&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;platform-tools&lt;/code&gt; (最新版)&lt;/td&gt;
					&lt;td&gt;谷歌官方 Android SDK 命令行工具（含 &lt;code&gt;fastboot.exe&lt;/code&gt; / &lt;code&gt;adb.exe&lt;/code&gt;）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;2. 官方底包&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;angler-n2g48c-factory-xxx.zip&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;谷歌官方开发者网站下载 &lt;strong&gt;Android 7.1.2 (N2G48C)&lt;/strong&gt; 线刷包。需解压提取出 &lt;code&gt;system.img&lt;/code&gt; 与 &lt;code&gt;vendor.img&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;3. 四核专用内核&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;boot_4cores_48C.img&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;XDA 经典死而复生神帖。下载精确对应 48C (7.1.2) 的修改版 4核 &lt;code&gt;boot.img&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;4. 恢复模式镜像&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;twrp-3.3.1-0-angler.img&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;TWRP 官方镜像，用于后续引导或高级分区维护&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;5. 权限管理 (可选)&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;Magisk.zip&lt;/code&gt; (建议 v23.0 或适合 7.1.2 的版本)&lt;/td&gt;
					&lt;td&gt;用于进系统后获取 Root 权限，部署自动化锁电与定时重启&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;xda论坛链接：&lt;a class="link" href="https://xdaforums.com/t/guide-fix-for-nexus-6p-bootloop-of-death-8-22-android-o-working.3640279/" target="_blank" rel="noopener"
 &gt;https://xdaforums.com/t/guide-fix-for-nexus-6p-bootloop-of-death-8-22-android-o-working.3640279/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="-终极平推步骤从底层重构到完美开机"&gt;🛠️ 终极平推步骤：从底层重构到完美开机
&lt;/h2&gt;&lt;p&gt;由于硬件损坏与多次尝试刷机，手机的 Data 分区通常带有官方强制加密锁，且分区表极易逻辑死锁（在 TWRP 中表现为 &lt;code&gt;unable to mount data/cache&lt;/code&gt; 或 &lt;code&gt;error changing file system&lt;/code&gt;）。&lt;strong&gt;必须放弃手机端操作，完全依靠电脑端 Fastboot 底层硬件指令进行物理暴力重构。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id="第一步拦截并进入-fastboot"&gt;第一步：拦截并进入 Fastboot
&lt;/h3&gt;&lt;p&gt;长按手机 &lt;strong&gt;【电源键 + 音量下键】&lt;/strong&gt; 强行中断无限重启，直到屏幕亮起绿色的 Fastboot 机器人界面，使用数据线连接电脑。&lt;/p&gt;
&lt;h3 id="第二步电脑端终端物理重构核心步骤"&gt;第二步：电脑端终端物理重构（核心步骤）
&lt;/h3&gt;&lt;p&gt;打开 PowerShell 或 CMD，进入 &lt;code&gt;platform-tools&lt;/code&gt; 目录，依次轰炸以下底层物理指令。这一步将彻底击碎分区加密，并在闪存颗粒上重新开辟干净的可读写空间：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1. 彻底擦除旧分区的混乱缓存与残留数据
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe erase boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe erase system
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe erase vendor
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe erase userdata
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe erase cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 2. 强行以标准 ext4 格式物理格式化 Data（userdata）与 Cache 分区（彻底解决 Unable to mount 红字报错）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe format:ext4 userdata
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe format:ext4 cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 3. 刷入从 XDA 下载的 7.1.2 专属四核内核（精准锁定硬件，关闭大核大门）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe flash boot .\boot_4cores_48C.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 4. 刷入从官方线刷包中解压提取的 7.1.2 系统主体与驱动层
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe flash system .\system.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe flash vendor .\vendor.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 5. 执行重启命令
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.\fastboot.exe reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="-开机心理预期与终极避风港"&gt;⏱️ 开机心理预期与终极避风港
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;首次开机耗时：&lt;/strong&gt; 拔掉数据线，将手机平放在冰凉的桌面（或瓷砖上）散热。由于此时手机&lt;strong&gt;仅靠 4 个残缺的低频小核&lt;/strong&gt;在全速解压和重构 7.1.2 的系统底层组件，速度会慢上 5-10 倍。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;耐力等待：&lt;/strong&gt; 手机会稳稳地播放官方四色滚珠启动动画。&lt;strong&gt;首次开机可能耗时 15 到 20 分钟&lt;/strong&gt;。只要硬件没有断电重启，就绝不要强行干预。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动画一闪，透出久违的经典“欢迎使用”语言选择界面，即宣告救机大功告成！&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-延伸部署24小时无人值守挂机节点优化"&gt;🤖 延伸部署：24小时无人值守挂机节点优化
&lt;/h2&gt;&lt;p&gt;降级至 Android 7.1.2 后，该设备具备极高的稳定性与极低的发热量，是挂机刷分（如 &lt;strong&gt;Bing Rewards 微软积分&lt;/strong&gt;）的完美载体。&lt;/p&gt;
&lt;h3 id="1-物理安全防护开启充电锁电"&gt;1. 物理安全防护：开启“充电锁电”
&lt;/h3&gt;&lt;p&gt;2.05A 长期插线极易导致老旧电池鼓包或起火。进系统获取 Root 权限后，务必安装 Magisk 模块 &lt;strong&gt;ACCA（Advanced Charging Controller）&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;限制电量 &lt;strong&gt;60% 停止充电&lt;/strong&gt;，跌至 &lt;strong&gt;40% 恢复充电&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;强制整机直接从充电头取电，不经过电池循环，确保无人值守下的绝对物理安全。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-挂机防封生态tasker--慢节奏随机触发"&gt;2. 挂机防封生态：Tasker + 慢节奏随机触发
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;环境选择：&lt;/strong&gt; 采用极其轻量的 &lt;strong&gt;Via 浏览器&lt;/strong&gt;（对 4 小核极度友好），在其中登录微软账号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;逻辑设计：&lt;/strong&gt; 在 &lt;strong&gt;Tasker&lt;/strong&gt; 中利用 &lt;code&gt;For&lt;/code&gt; 循环，定时发送带有 &lt;code&gt;q=关键词&lt;/code&gt; 的 Bing 搜索链接。将每次搜索的延时（Delay）设置为 &lt;strong&gt;5 到 10 秒之间的随机数&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;双重保障：&lt;/strong&gt; 4 个小核的绝对算力瓶颈与长间隔的随机延迟，刚好形成了完美的“人类真实搜索行为”伪装，能最大程度绕过微软风控，避免被判定为多线程机刷而封号。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-终极自愈机制深夜定时重启"&gt;3. 终极自愈机制：深夜定时重启
&lt;/h3&gt;&lt;p&gt;为了防止老旧设备因 App 内存泄露（OOM）而中途假死，在 Tasker 中建立一个 Shell 脚本触发器，设定在&lt;strong&gt;每天凌晨 4:00 执行&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;reboot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;手机每天自动重启，在深夜彻底释放积攒的系统缓存与内存垃圾，醒来后继续冷酷、安全地输出自动化生产力。&lt;/p&gt;</description></item><item><title>基于 Cloudflare Tunnel + Docker 搭建安全无公网的 Web RDP 远程桌面备份方案</title><link>http://sergget.qzz.io/posts/20260620-01/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260620-01/</guid><description>&lt;p&gt;在日常工作和运维中，我们经常需要远程控制办公室的 Windows 计算机。传统的 RDP（3389 端口）直连方式不仅需要公网 IP，还会将端口暴露在公网，极易遭受自动化脚本的暴力破解。&lt;/p&gt;
&lt;p&gt;本文将分享如何利用 &lt;strong&gt;Cloudflare Zero Trust (Tunnel)&lt;/strong&gt; 与 &lt;strong&gt;Apache Guacamole (Docker)&lt;/strong&gt;，在&lt;strong&gt;不暴露任何公网端口、不需要公网 IP&lt;/strong&gt; 的情况下，搭建一个纯网页端（Web-based）的远程桌面备份方案。在外只需通过浏览器输入专属域名，经过双重安全验证后即可秒变 Windows 桌面。&lt;/p&gt;
&lt;h2 id="-方案架构概述"&gt;🛠️ 方案架构概述
&lt;/h2&gt;&lt;p&gt;整个架构的数据流向如下：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;外网浏览器&lt;/code&gt; -&amp;gt; &lt;code&gt;Cloudflare Access (邮箱验证码拦截)&lt;/code&gt; -&amp;gt; &lt;code&gt;Cloudflare Tunnel 边缘网络&lt;/code&gt; -&amp;gt; &lt;code&gt;本地 cloudflared 守护进程&lt;/code&gt; -&amp;gt; &lt;code&gt;Docker 内部 Guacamole 网关 (RDP转HTML5)&lt;/code&gt; -&amp;gt; &lt;code&gt;Windows 本地远程桌面 (3389)&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="一-计算机侧配置windows-10-宿主机"&gt;一、 计算机侧配置（Windows 10 宿主机）
&lt;/h2&gt;&lt;h3 id="1-安装docker"&gt;1. 安装docker
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在docker.com注册docker账户&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载docker，并安装后登录&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;确保本机wsl、虚拟机平台启用后打开docker&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-编写-docker-compose-配置文件"&gt;2. 编写 Docker Compose 配置文件
&lt;/h3&gt;&lt;p&gt;在本地创建工作目录（如 &lt;code&gt;C:\Guacamole&lt;/code&gt;），并在该目录下创建以下两个核心配置文件。&lt;/p&gt;
&lt;h4 id="-docker-composeyml"&gt;① &lt;code&gt;docker-compose.yml&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;最新版的 Guacamole 支持通过 &lt;code&gt;WEBAPP_CONTEXT&lt;/code&gt; 环境变量直接将服务挂载到根路径（&lt;code&gt;/&lt;/code&gt;），从而完美配合 Cloudflare Tunnel 的转发规则：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; guacd:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: guacamole/guacd:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; guacamole:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: guacamole/guacamole:latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; restart: always
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ports:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &amp;#34;8080:8080&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; environment:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GUACD_HOSTNAME: guacd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INDEX_AUTH_PROVIDER: basic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 核心配置：将 Web 路径直接映射为根目录，避免外网访问时输入 /guacamole 后缀
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; WEBAPP_CONTEXT: ROOT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - ./user-mapping.xml:/etc/guacamole/user-mapping.xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="-user-mappingxml脱敏版"&gt;② &lt;code&gt;user-mapping.xml&lt;/code&gt;（脱敏版）
&lt;/h4&gt;&lt;p&gt;用于配置登录 Guacamole 网页端的账号密码，以及映射本机的 RDP 连接。&lt;strong&gt;出于安全考虑，强烈建议在 Windows 侧创建一个低权限的本地专用 RDP 账户，或在此配置文件中删掉密码参数，在网页端现场输入，避免将微软在线账户的明文密码暴露在本地配置文件中&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;user-mapping&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;authorize username=&amp;#34;web_admin&amp;#34; password=&amp;#34;your_secure_web_password&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;connection name=&amp;#34;Work Desktop Backup&amp;#34;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;protocol&amp;gt;rdp&amp;lt;/protocol&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;hostname&amp;#34;&amp;gt;host.docker.internal&amp;lt;/param&amp;gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;port&amp;#34;&amp;gt;3389&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;username&amp;#34;&amp;gt;your_windows_username&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;password&amp;#34;&amp;gt;your_windows_password&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;ignore-cert&amp;#34;&amp;gt;true&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;param name=&amp;#34;resize-method&amp;#34;&amp;gt;display-update&amp;lt;/param&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;/connection&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;/authorize&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;/user-mapping&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-启动容器网关"&gt;3. 启动容器网关
&lt;/h3&gt;&lt;p&gt;在当前目录下打开终端，执行以下命令后台运行服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此时在本地浏览器访问 &lt;code&gt;http://localhost:8080&lt;/code&gt; 即可看到原生的登录窗并成功连接桌面。&lt;/p&gt;
&lt;h2 id="二-网页端与-cloudflare-侧配置"&gt;二、 网页端与 Cloudflare 侧配置
&lt;/h2&gt;&lt;h3 id="1-创建-cloudflare-tunnel"&gt;1. 创建 Cloudflare Tunnel
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;登录 &lt;a class="link" href="https://one.dash.cloudflare.com/" target="_blank" rel="noopener"
 &gt;Cloudflare Zero Trust 控制台&lt;/a&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 &lt;strong&gt;Networks&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Tunnels&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Create a tunnel&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;环境选择 &lt;strong&gt;Windows&lt;/strong&gt;，复制页面上给出的命令行安装包指令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;回到单位电脑，以&lt;strong&gt;管理员身份&lt;/strong&gt;打开 PowerShell 粘贴并运行该指令。&lt;code&gt;cloudflared&lt;/code&gt; 将会自动注册为 Windows 本地系统服务，实现开机自启。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="2-配置公网域名路由-public-hostnames"&gt;2. 配置公网域名路由 (Public Hostnames)
&lt;/h3&gt;&lt;p&gt;当 Tunnel 状态变为 &lt;strong&gt;Healthy&lt;/strong&gt; 后，添加一条 Ingress 路由规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Subdomain&lt;/strong&gt;: &lt;code&gt;rdp&lt;/code&gt; &lt;em&gt;(可自定义)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Domain&lt;/strong&gt;: &lt;code&gt;yourdomain.com&lt;/code&gt; &lt;em&gt;(选择你接入 CF 的自备域名)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;留空&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Type&lt;/strong&gt;: &lt;code&gt;HTTP&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;URL&lt;/strong&gt;: &lt;code&gt;http://localhost:8080&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;⚠️ 注意&lt;/strong&gt;：Cloudflare Tunnel 的 Ingress 规则由于安全架构限制，&lt;strong&gt;不支持&lt;/strong&gt;在转发时进行路径重写（例如不能在 URL 后面加 &lt;code&gt;/guacamole/&lt;/code&gt;）。我们已经在 Docker 侧通过 &lt;code&gt;WEBAPP_CONTEXT: ROOT&lt;/code&gt; 彻底解决了这个问题，此处保持纯净的端口映射即可。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="三--终极安全加固-cloudflare-access-零信任策略"&gt;三、 📝 终极安全加固 (Cloudflare Access 零信任策略)
&lt;/h2&gt;&lt;p&gt;为了防止域名暴露后网页端密码遭遇暴力破解，必须引入 Cloudflare Edge 端的&lt;strong&gt;身份验证拦截（自托管应用策略）&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 Zero Trust 控制台，前往 &lt;strong&gt;Access&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Applications&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Add an application&lt;/strong&gt; -&amp;gt; 选择 &lt;strong&gt;Self-hosted&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Application URL&lt;/strong&gt;: 填写你刚才配置的完整二级域名（如 &lt;code&gt;rdp.yourdomain.com&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Session Duration&lt;/strong&gt;: 建议设为 &lt;code&gt;24 Hours&lt;/code&gt;（一天只需认证一次）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;进入 &lt;strong&gt;Rules (策略配置)&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;: &lt;code&gt;Allow&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Include&lt;/strong&gt;: 选择 &lt;strong&gt;Emails&lt;/strong&gt;，并在右侧输入你&lt;strong&gt;私人的常用电子邮箱&lt;/strong&gt;（如 Gmail/Outlook）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存策略。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="-紧急情况下的实际使用流体验"&gt;🚀 紧急情况下的实际使用流体验
&lt;/h2&gt;&lt;p&gt;当下班回家或在外出差，遭遇紧急情况需要控制单位电脑时：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第一道防线&lt;/strong&gt;：打开任意设备浏览器访问 &lt;code&gt;https://rdp.yourdomain.com&lt;/code&gt;，页面会被 Cloudflare 强行拦截，要求输入预设的邮箱。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全验证&lt;/strong&gt;：输入邮箱后，查收 6 位数动态验证码并填入网页。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第二道防线&lt;/strong&gt;：通过拦截后，页面无缝展露出 Guacamole 登录窗，输入你在 &lt;code&gt;user-mapping.xml&lt;/code&gt; 中设置的网页端账密。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完美控端&lt;/strong&gt;：登录成功，整个浏览器窗口秒变单位的 Windows 10 桌面。键盘、鼠标、丝滑全屏以及剪贴板双向同步均能完美工作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>解构规训与泛在识读：儿童阅读能力发展的认知负荷、动机调控与生活化重构评估报告</title><link>http://sergget.qzz.io/posts/20260609-01/</link><pubDate>Tue, 09 Jun 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260609-01/</guid><description>&lt;p&gt;在儿童早期发展与认知心理学领域，关于阅读能力的提升路径长期存在“控制型规训”与“自主发展”两种范式的冲突。前者主张通过硬性设定“固定时段、固定时长、家长绝对掌控内容”的程序化安排来强迫建立阅读习惯；后者则强调阅读耐力是底层认知自动化的涌现结果，且其持久性必须依赖于儿童内部的探究欲与自主感。&lt;/p&gt;
&lt;p&gt;特别需要警惕的是，将阅读窄化为“纸质书本”并施以硬性时间规训，极易使儿童将书本与学校学习、外在评价进行强绑定，进而触发防御性的&lt;strong&gt;心理抗拒（Psychological Reactance）&lt;/strong&gt;。本报告旨在系统梳理相关逻辑，论证为何阅读耐力是“果”而非“因”，并提出打破“书本-学业”负面联结的“广义实用识读”（Functional Literacy）范式，结合汉语及中国社会生活实际，提供协调“建设性结构”与“高度自主权”的系统化家庭重构方案。&lt;/p&gt;
&lt;h2 id="一-认知负荷视阈下的专注力本质阅读耐力是自动化的结果而非训练途径"&gt;一、 认知负荷视阈下的专注力本质：阅读耐力是“自动化的结果”而非“训练途径”
&lt;/h2&gt;&lt;p&gt;家长常持有一种直觉假说，即长时间对文字保持专注（即阅读耐力，Reading Stamina）是一种可以通过硬性拉伸“坐地阅读时间”来加以训练的肌肉记忆。然而，认知心理学与神经科学的研究表明，这一因果逻辑存在严重的倒置。在阅读科学中，长时间专注不是阅读训练的“起点”，而是底层认知技能高度自动化后的“结果”与“涌现表现”。&lt;/p&gt;
&lt;p&gt;根据经典阅读简单视图（Simple View of Reading, SVR）与认知负荷理论，人类的工作记忆带宽极其有限。在汉语语境下，阅读理解的过程可以简化为底层汉字认读与字音字义译码自动化、高层词汇与语言理解能力的双重任务组合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;阅读理解 (R) = 字词认读/译码自动化 (D) × 语言理解能力 (C)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;C (Comprehension)：&lt;/strong&gt; 语言与背景知识的理解能力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;R (Reading Comprehension)：&lt;/strong&gt; 最终的阅读理解水平&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;D (Decoding)：&lt;/strong&gt; 底层字词认读与解码的自动化程度&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当儿童处于阅读发展早期时，其视觉字词识别路径尚未成熟，未能跨越字词认读的“自动化阈值”（例如在标准化字词认读与译码评估中，WRD指数低于 225 的关键阈值）。此时，儿童的大脑必须动用几乎全部的认知资源去进行汉字形音义匹配（如字形结构辨识、偏旁部首发音联结、汉字到词组的切分等）或拼音拼读。在这种状态下，工作记忆处于极度超载状态，根本没有多余的认知带宽用于语义连接、逻辑推理或情境想象。&lt;/p&gt;
&lt;p&gt;如果在字词认读尚未实现自动化时，强行让儿童进行长时间的独立文字阅读，不仅无法训练出专注力，反而会导致大脑产生防御性的认知疲劳。研究表明，未跨越译码阈值的弱读者在面对冗长文字时，通常会表现出眼动轨迹杂乱、盲目猜测字义、跳过困难段落或“有口无心”的机械朗读等现象，这些行为本质上是大脑在认知过载下的自我保护与任务回避。&lt;/p&gt;
&lt;p&gt;相反，优秀阅读者展现出的超常专注力，是因为其大脑左侧语言、视觉及认知控制区域之间建立了高度通畅的神经功能连接，实现了字词的瞬间自动识别。这种高度的自动化（如汉字“形-音-义”通路的高效直连）使得底层译码过程对工作记忆的占用接近于零，从而释放出几乎全部的认知带宽用于沉浸于情节或汲取新知。因此，逻辑上不应试图通过强迫儿童维持“专注状态”来提升其阅读能力，而应当通过降低底层认知负荷、提高字词认读与拼读的自动化程度，来自然诱发和涌现出持久的专注与耐力。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;控制型耐力训练（控制型范式观点）&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;认知自动化涌现（自主发展范式规律）&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;逻辑本质&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;将“长时间专注”视为一种可通过行为规训强行拉伸的“输入变量”。&lt;/td&gt;
					&lt;td&gt;将“长时间专注”视为底层技能熟练后自然发生的“涌现结果”。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;认知机制&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;强制在认知过载状态下延长任务时间，寄望于儿童自行适应。&lt;/td&gt;
					&lt;td&gt;通过系统性字词认读、偏旁析形、重读及多元支架降低解码负荷，释放工作记忆。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;脑力消耗&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;导致持续的神经疲劳、挫败感及认知回避行为。&lt;/td&gt;
					&lt;td&gt;伴随心流体验，脑区连接效率提升，阅读体验走向顺畅。&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;发展结果&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;产生“任务应付”与隐性抗拒，损害自我效能感。&lt;/td&gt;
					&lt;td&gt;建立真正的自动译码技能，稳步拉长独立阅读时间。&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="二-动机心理学与心理抗拒学校强绑定如何摧毁阅读内驱力"&gt;二、 动机心理学与心理抗拒：“学校强绑定”如何摧毁阅读内驱力
&lt;/h2&gt;&lt;p&gt;原案中“固定时段、固定时长、家长掌握内容”的教养提案，在动机心理学中是一项具有高风险的行为干预。&lt;/p&gt;
&lt;h3 id="1-心理控制与过度理由效应overjustification-effect"&gt;1. 心理控制与过度理由效应（Overjustification Effect）
&lt;/h3&gt;&lt;p&gt;自我决定理论（Self-Determination Theory, SDT）指出，人类内部动机的激发高度依赖于三种基本心理需要的满足：自主感（Autonomy）、胜任感（Competence）和归属感（Relatedness）。&lt;/p&gt;
&lt;p&gt;当家长剥夺儿童选择书目、题材及阅读方式的权力，并辅以绝对的时间限制时，儿童的阅读环境便从“支持自主型”转变为“高度控制型”。这种控制型教养极易激活“过度理由效应”。其核心机制在于：当个体本具有探索世界、解决心中疑问等内部动机去从事一项行为（如阅读）时，如果外界强加了高强度的外部规训与强制性指标，儿童的认知系统会对行为的归因进行重构——从“我阅读是因为我渴望了解世界”转变为“我阅读是因为我必须服从家长的规则并完成任务指标”。这种感知因果点的外移，会导致内部动机遭遇系统性且不可逆的侵蚀。&lt;/p&gt;
&lt;h3 id="2-心理抗拒与学业规训的负面绑定"&gt;2. 心理抗拒与学业规训的负面绑定
&lt;/h3&gt;&lt;p&gt;当书本阅读被硬性规定为每天必须履行的“家庭功课”时，孩子极易产生心理抗拒。他们会将“纸质书本”与“学校生活、学业考核、家长监视”进行强绑定。&lt;/p&gt;
&lt;p&gt;阅读的本质原本是高度自主的“信息检索与问题解决工具”。儿童面对大千世界天然拥有探究欲（如恐龙为何灭绝、游戏角色如何升级等），为了解答自身真实的疑问而主动去书中寻找答案时，属于高阶的“主动阅读”。&lt;/p&gt;
&lt;p&gt;然而，一旦纸质书被规训化，阅读的功能便退化为“应付家长的指标”。儿童会将纸质书视为学校课业压力的眼神延伸，产生“书本=强制学习=失去自由”的直觉联结。这不仅无法培养出终身阅读者，反而会在学业评价稍有降低或监管撤除时，引发爆发性的避读行为和逆反心理。&lt;/p&gt;
&lt;h2 id="三-范式升维从纸质书本阅读走向广义实用识读functional-literacy"&gt;三、 范式升维：从“纸质书本阅读”走向“广义实用识读”（Functional Literacy）
&lt;/h2&gt;&lt;p&gt;为了防止儿童陷入对书本的条件反射式抗拒，阅读培养必须从狭隘的“书本范式”升维到“广义实用识读”或“多元识读能力”（Multiliteracies）范式。&lt;/p&gt;
&lt;p&gt;广义阅读能力（Functional Literacy）的核心逻辑是：&lt;strong&gt;阅读不是一个孤立的学业功课，而是个体为了解决现实生活问题、获取有用信息并独立参与社会生活的“生存工具”&lt;/strong&gt;。当我们将阅读的载体从“课桌上的纸质书”释放到“大千世界的信息符号”中，阅读便能脱离规训，展现其本真的实用价值。&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;评估维度&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;狭义控制型规训&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;广义结构化自主&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;逻辑本质&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;将“专注时间”视为强制输入的指标&lt;/td&gt;
					&lt;td&gt;将“专注时间”视为认知自动化的自然涌现&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;载体定位&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;局限于纸质书本，易与学业和考核产生强绑定&lt;/td&gt;
					&lt;td&gt;泛在的生活化信息符号（招牌、包装、食谱、说明书）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;动机激发&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;触发过度理由效应，感知因果点由内转向外&lt;/td&gt;
					&lt;td&gt;满足自主与胜任感，利用信息解决真实疑问&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;发展结果&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;带来防御性疲劳与隐性抗拒，导致长期的“避读”&lt;/td&gt;
					&lt;td&gt;建立实用性工具意识，走向良性“马太效应”&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;通过引入广义实用识读，儿童在超市里对比标签、在厨房里阅读食谱、在街道上辨识路标，都是在进行高品质的阅读实践。这种“知行合一”的无痛认知，不仅能加速字词译码的自动化，更彻底消解了规训带来的抗拒心理。&lt;/p&gt;
&lt;h2 id="四-破局路径家庭环境中的结构化自主重构策略"&gt;四、 破局路径：家庭环境中的“结构化自主”重构策略
&lt;/h2&gt;&lt;p&gt;健康的早期教养需要家长提供高水平的“结构（Structure）”，而不是“控制（Control）”。家庭阅读常规的建立，应当推行“结构化自主”（Structured Autonomy）模式，即由家长构建充满支持的日常仪式与物理时空，而在框架内部，将内容选择、阅读介质和实践方式的“绝对控制权”还给儿童。&lt;/p&gt;
&lt;h3 id="1-善用环境字词environmental-print完成无痛识字"&gt;1. 善用“环境字词”（Environmental Print）完成无痛识字
&lt;/h3&gt;&lt;p&gt;“环境字词”是孩子在日常生活中随处可见的各种标志、标签、商标和招牌，是儿童走向非学术性识字的重要桥梁。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;街头寻宝：&lt;/strong&gt; 散步、乘车或逛街时，引导孩子观察路边的“停”字交通路标、商场里的“安全出口”指示牌、小区里的“禁止吸烟”提示语等。通过自然对话（如“你看这个绿色的牌子写着‘安全出口’，代表遇到紧急情况可以从这里出去”）让孩子理解“符号/汉字蕴含着特定现实含义”这一阅读本质。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;商品包装交互：&lt;/strong&gt; 在拆玩具包装（如乐高拼装说明书）或吃零食（如牛奶盒、饼干袋）时，和孩子一起玩“寻找熟悉的字”的游戏（例如寻找“大白兔”、“旺仔”或配料表中的特定字）。这能让孩子在高度兴奋、且无任何学业压力的生活环境中熟悉汉字结构。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-将阅读嵌入功能性生活场景functional-reading"&gt;2. 将阅读嵌入“功能性生活场景”（Functional Reading）
&lt;/h3&gt;&lt;p&gt;脱离为了阅读而阅读的死循环，让孩子为了“解决实际问题、完成生活任务”而读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;超市采购向导：&lt;/strong&gt; 出门购物前，邀请孩子一起“画/写购物清单”。在超市中，由孩子担任导视向导，去阅读货架上方的分类标识（如“日用品区”、“生鲜区”、“乳制品区”），对比商品包装袋上的名称，并匹配价格标签。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;家庭烹饪实操：&lt;/strong&gt; 选择配有丰富插图或极简步骤的儿童食谱（如制作水果沙拉、自制迷你三明治等）。让孩子负责阅读并执行步骤指令（如“切”、“加入”、“搅拌”），当孩子通过阅读指引亲手做出美食时，阅读的自我胜任感和实用工具感会被瞬间建立。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;生活检索任务：&lt;/strong&gt; 引导孩子共同查阅小区平面图、地铁线路图、游乐园游玩指南等，让他们感知阅读能够切实指导自己的行动。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-引入多通道对话式阅读dialogic-reading打破字词障碍"&gt;3. 引入多通道“对话式阅读”（Dialogic Reading）打破字词障碍
&lt;/h3&gt;&lt;p&gt;对于独立认读仍有困难的儿童，家长不应将其置于独自解码的认知孤岛。应积极引入“对话式阅读”范式，亲子双方互换角色：儿童作为故事讲述者（看着画面讲故事），家长作为引导者和倾听者，灵活运用 PEER 互动循环：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;P (Prompt) 提示：&lt;/strong&gt; 主动发起邀请，如“看这个图画，你觉得小熊为什么在哭呀？”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;E (Evaluate) 评估：&lt;/strong&gt; 温和评估反馈，给予情感肯定而不作对错判别（如“你说得对，它确实哭了”）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;E (Expand) 拓展：&lt;/strong&gt; 对儿童的语言词汇进行多维度扩展，如“对，小熊因为找不到妈妈，感到非常伤心和无助，所以坐在树底下大声哭泣”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;R (Repeat) 重复：&lt;/strong&gt; 鼓励儿童尝试重复新学到的丰富表达（如“来，你试试说‘伤心和无助’”），促进汉语词汇库的自然更新。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在PEER循环中，字词翻译与理解的巨大负荷被家长的口语互动和精美画面平摊，儿童得以在极低负荷下进行高品质的语义加工，这既能稳步提升其词汇量，更能带来强烈的胜任感与亲子情感联结。&lt;/p&gt;
&lt;h3 id="4-实施温和渗透法strewing与介质解绑"&gt;4. 实施“温和渗透法”（Strewing）与介质解绑
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无声书籍暴露：&lt;/strong&gt; 放弃指令性的“强制看书时间”，采用环境行为学的“温和渗透”。将符合儿童当前生活兴趣（如最近迷上的恐龙、昆虫、航天或积木游戏）的少儿科普图册或趣味故事书，有意且无声地散落在他们视线和身体可及的物理空间（如沙发角、床头边、玩具箱旁）。不附加任何“你必须读它”的言语施压，让孩子在无聊或闲暇时不经意地瞥见并自主拾起。这种“意外发现”能最大限度地触发其内部探索神经通路的兴奋度。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;接纳非典型媒介作为脚手架：&lt;/strong&gt; 允许并鼓励儿童阅读高画质的多格漫画、图形小说、游戏说明书、乐高搭建手册，甚至配合高质量普通话有声书进行“双通道协同伴读”。这些多通道输入能显著降低儿童在拼读拼音、认读复杂汉字时的即时工作记忆负担，使他们能够顺畅地追踪故事逻辑，在不产生抵抗情绪的前提下稳步跨越纯文字的“字词认读阈值”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="结论"&gt;结论
&lt;/h2&gt;&lt;p&gt;基思·斯坦诺维奇（Keith Stanovich）提出的阅读“马太效应”指出，阅读能力的发展是一个强者愈强、弱者愈弱的循环系统。健康的阅读习惯培养，其底层闭环为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;真实疑问/情境兴趣 → 主动信息检索（广义识读） → 频繁自发实践 → 底层字词认读自动化 → 高阶专注力与阅读耐力涌现
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;试图通过“固定时段、固定时长、家长掌控内容”等强规训手段来培养阅读能力，不仅违反了字词自动化发展的神经科学与认知负荷规律，更极易将书本与学业考核强行绑定，进而触发心理抗拒，将儿童推入向下衰退的马太螺旋。&lt;/p&gt;
&lt;p&gt;唯有将阅读彻底“去功利化”与“去规训化”，将其还原为超市、厨房、街头、游戏等泛在生活场景中的信息工具，才能真正保护儿童的内部探究欲，培养出具有终身信息检索与现实问题解决能力的泛在识读者。&lt;/p&gt;</description></item><item><title>npm 全局安装权限问题解决方案原理详解</title><link>http://sergget.qzz.io/posts/20260416-01/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260416-01/</guid><description>&lt;h2 id="问题背景"&gt;问题背景
&lt;/h2&gt;&lt;p&gt;当执行 &lt;code&gt;npm i -g cline&lt;/code&gt; 时遇到权限错误：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zed" data-lang="zed"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ERR&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EACCES&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ERR&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nn"&gt;usr/local/lib/node_modules/&lt;/span&gt;&lt;span class="n"&gt;cline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ERR&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EACCES&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;permission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denied&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nn"&gt;usr/local/lib/node_modules/&lt;/span&gt;&lt;span class="n"&gt;cline&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="问题根源分析"&gt;问题根源分析
&lt;/h2&gt;&lt;h3 id="1-系统目录权限机制"&gt;1. 系统目录权限机制
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/lib/node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 所有者: root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── 所属组: staff/admin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── 权限: drwxr-xr-x (755)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;普通用户&lt;/strong&gt;只有读和执行权限（r-x）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;写入操作&lt;/strong&gt;需要写权限（w），只有 root 用户拥有&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;npm 全局安装需要在此目录&lt;strong&gt;创建/修改&lt;/strong&gt;文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-npm-默认行为"&gt;2. npm 默认行为
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm 全局安装流程：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 确定 prefix 路径 → /usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 构建目标路径 → /usr/local/lib/node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 尝试 mkdir 创建包目录 → 需要写权限 ❌
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 操作系统拒绝 → EACCES 错误
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-为什么不推荐使用-sudo"&gt;3. 为什么不推荐使用 sudo？
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo npm i -g cline # ⚠️ 存在风险
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安全隐患&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;npm 包可能包含&lt;strong&gt;安装脚本&lt;/strong&gt;（postinstall）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;脚本以 &lt;strong&gt;root 权限&lt;/strong&gt;执行，可执行任意系统操作&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;恶意包可能&lt;strong&gt;破坏系统&lt;/strong&gt;或&lt;strong&gt;窃取数据&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后续 npm 操作可能产生&lt;strong&gt;权限混乱&lt;/strong&gt;的文件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="解决方法与原理解析"&gt;解决方法与原理解析
&lt;/h2&gt;&lt;h3 id="核心思想重定向-npm-全局目录"&gt;核心思想：重定向 npm 全局目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;系统默认：/usr/local/ (需要 root 权限)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户自定义：~/.npm-global/ (用户完全控制)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="步骤-1创建用户级全局目录"&gt;步骤 1：创建用户级全局目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir ~/.npm-global
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;目录结构变化&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;修改前：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/username/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .npm/ # npm 缓存
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .bashrc # shell 配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── (无独立全局包目录)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;修改后：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/username/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .npm-global/ # 🆕 用户级全局 npm 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── bin/ # 可执行文件链接
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── lib/ # 库文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── node_modules/ # 全局包实体
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="步骤-2修改-npm-配置"&gt;步骤 2：修改 npm 配置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm config set prefix &amp;#39;~/.npm-global&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;配置生效机制&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm 配置文件优先级：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. 项目级: ./.npmrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. 用户级: ~/.npmrc ← 此命令修改这里
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. 全局级: $PREFIX/etc/npmrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. 内置默认: /usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;写入 ~/.npmrc 的内容：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefix=/home/username/.npm-global
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;npm 行为变化&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;修改前：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g package
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → prefix = /usr/local
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → target = /usr/local/lib/node_modules/package
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 需要 sudo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;修改后：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g package
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → prefix = /home/username/.npm-global
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → target = /home/username/.npm-global/lib/node_modules/package
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; → 用户拥有完全权限 ✅
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="步骤-3更新-path-环境变量"&gt;步骤 3：更新 PATH 环境变量
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=~/.npm-global/bin:$PATH&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;PATH 机制详解&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;修改前的 PATH&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo $PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 输出：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;&lt;strong&gt;npm 全局命令的执行过程&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户执行：cline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shell 在 PATH 中搜索 &amp;#34;cline&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;找到：/usr/local/bin/cline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;实际是符号链接 → /usr/local/lib/node_modules/cline/bin/cline.js
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;&lt;strong&gt;修改后的 PATH&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo $PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 输出：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/username/.npm-global/bin:/usr/local/bin:/usr/bin:...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;&lt;strong&gt;新的命令查找机制&lt;/strong&gt;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;用户执行：cline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shell 按顺序搜索 PATH：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1. /home/username/.npm-global/bin/cline ✅ 找到！
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2. (不再继续搜索)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;执行用户级安装的 cline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="步骤-4重载配置"&gt;步骤 4：重载配置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; 是 Bash shell 的&lt;strong&gt;启动脚本&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;每次打开新终端时自动执行&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;source&lt;/code&gt; 命令&lt;strong&gt;立即执行&lt;/strong&gt;脚本内容，无需重启终端&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;执行过程&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Bash&lt;/span&gt; &lt;span class="err"&gt;逐行执行&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt; &lt;span class="err"&gt;中的命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=~/.&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;↓&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;环境变量&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt; &lt;span class="err"&gt;在当前&lt;/span&gt; &lt;span class="n"&gt;shell&lt;/span&gt; &lt;span class="err"&gt;中立即更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="完整工作流程示例"&gt;完整工作流程示例
&lt;/h2&gt;&lt;h3 id="安装-cline-的完整过程"&gt;安装 cline 的完整过程
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 创建目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 配置 npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;~/.npm-global&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 验证配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出：/home/username/.npm-global&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. 更新 PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=~/.npm-global/bin:$PATH&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5. 安装包（无需 sudo）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;npm&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;cline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 6. 内部执行流程&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# npm 创建目录：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.npm-global/lib/node_modules/cline/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# npm 创建符号链接：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.npm-global/bin/cline -&amp;gt; ../lib/node_modules/cline/bin/cline.js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 7. 验证安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;which&lt;/span&gt; &lt;span class="n"&gt;cline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 输出：/home/username/.npm-global/bin/cline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cline&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 成功执行 ✅&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="文件系统变化对比"&gt;文件系统变化对比
&lt;/h2&gt;&lt;h3 id="修改前的系统状态"&gt;修改前的系统状态
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/ (系统目录，需要 root)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── bin/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── node
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── npm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── npx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── lib/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── (全局包安装失败 ❌)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/.npmrc (可能不存在)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="修改后的系统状态"&gt;修改后的系统状态
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;用户目录，完全控制&lt;/span&gt; &lt;span class="err"&gt;✅&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;cline&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;../&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cline&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;cline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;js&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;其他全局命令的符号链接&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;cline&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;│&lt;/span&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="n"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;其他全局包&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;npmrc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;新增配置&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;内容：&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;bashrc&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;追加了一行&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;内容：&lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;/.&lt;/span&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="优势与注意事项"&gt;优势与注意事项
&lt;/h2&gt;&lt;h3 id="优势"&gt;优势
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安全性&lt;/strong&gt;：避免使用 root 权限运行未知脚本&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;隔离性&lt;/strong&gt;：用户级包不影响系统或其他用户&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可维护性&lt;/strong&gt;：无需担心权限混乱&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可移植性&lt;/strong&gt;：配置可随用户迁移&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="注意事项"&gt;注意事项
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PATH 优先级&lt;/strong&gt;：新路径在系统路径&lt;strong&gt;之前&lt;/strong&gt;，会优先使用用户安装的版本&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多用户环境&lt;/strong&gt;：每个用户有独立的全局包，节省空间但可能版本不一致&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;系统工具冲突&lt;/strong&gt;：如果同时存在系统级和用户级的同名命令，会优先执行用户级&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="与其他方法的对比"&gt;与其他方法的对比
&lt;/h3&gt;&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;方法&lt;/th&gt;
					&lt;th&gt;原理&lt;/th&gt;
					&lt;th&gt;优点&lt;/th&gt;
					&lt;th&gt;缺点&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;sudo 安装&lt;/td&gt;
					&lt;td&gt;临时提权&lt;/td&gt;
					&lt;td&gt;简单快速&lt;/td&gt;
					&lt;td&gt;安全风险&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;修改目录权限&lt;/td&gt;
					&lt;td&gt;chown 改变所有者&lt;/td&gt;
					&lt;td&gt;一劳永逸&lt;/td&gt;
					&lt;td&gt;破坏系统权限模型&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;用户级目录&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;重定向 prefix&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;安全、标准&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;需配置一次&lt;/strong&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;nvm 管理&lt;/td&gt;
					&lt;td&gt;Node 版本隔离&lt;/td&gt;
					&lt;td&gt;最灵活强大&lt;/td&gt;
					&lt;td&gt;学习成本稍高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="验证配置是否成功"&gt;验证配置是否成功
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1. 检查 npm 配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm config get prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 应输出：/home/username/.npm-global
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 2. 检查 PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;echo $PATH | grep &amp;#34;.npm-global&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 应包含：/home/username/.npm-global/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 3. 测试安装
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g cowsay
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cowsay &amp;#34;Success!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 应正常显示牛说话的 ASCII 艺术
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="回滚操作如需恢复"&gt;回滚操作（如需恢复）
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 恢复 npm 默认配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm config delete prefix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 从 .bashrc 中移除 PATH 修改
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -i &amp;#39;/.npm-global/d&amp;#39; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除用户级目录（可选）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf ~/.npm-global
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重载配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;source ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;核心要点&lt;/strong&gt;：方法 2 通过&lt;strong&gt;重定向 npm 工作目录&lt;/strong&gt;而非&lt;strong&gt;突破系统权限限制&lt;/strong&gt;来解决问题，是 Node.js 官方推荐的最佳实践之一。它既保证了系统安全，又提供了完整的功能，是处理 npm 全局安装权限问题的首选方案。&lt;/p&gt;</description></item><item><title>深度解码：TCP 三次握手——为什么两次绝对不够？</title><link>http://sergget.qzz.io/posts/20260310-01/</link><pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260310-01/</guid><description>&lt;p&gt;在网络工程的学习中，很多人能背出 TCP 三次握手的过程，却常卡在“为什么不能是两次”这个深度考题上。本文将跳出枯燥的状态机，从&lt;strong&gt;资源成本&lt;/strong&gt;、&lt;strong&gt;安全验证&lt;/strong&gt;和&lt;strong&gt;逻辑闭环&lt;/strong&gt;三个维度彻底看透其背后的设计哲学。&lt;/p&gt;
&lt;h2 id="1-交互流程状态与报文的对齐"&gt;1. 交互流程：状态与报文的对齐
&lt;/h2&gt;&lt;p&gt;理解握手的首要逻辑是看清**状态（State）**的跃迁。只有掌握了状态机，才能理解协议是如何在不稳定的网络中寻找“确定性”的。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="256px" data-flex-grow="106" height="1218" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20260310-01/network-tcp-handshake-01.png" srcset="http://sergget.qzz.io/posts/20260310-01/network-tcp-handshake-01_hu_b20fdb1c2d0c148f.png 800w, http://sergget.qzz.io/posts/20260310-01/network-tcp-handshake-01.png 1300w" width="1300"&gt;&lt;/p&gt;
&lt;h2 id="2-核心比喻序列号就是动态验证码"&gt;2. 核心比喻：序列号就是“动态验证码”
&lt;/h2&gt;&lt;p&gt;这是理解三次握手最直观的角度。为了对抗虚假请求，TCP 的初始序列号（ISN）是随机生成的，我们可以将其看作是服务端签发的“随机验证码”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第一次握手 (SYN)&lt;/strong&gt;：客户端提供自己的验证码 &lt;em&gt;x&lt;/em&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第二次握手 (SYN+ACK)&lt;/strong&gt;：服务端确认 &lt;em&gt;x&lt;/em&gt;，同时签发自己的随机验证码 &lt;em&gt;y&lt;/em&gt; 。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第三次握手 (ACK)&lt;/strong&gt;：客户端必须回传 &lt;em&gt;y+1&lt;/em&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如果没有第三步：&lt;/strong&gt; 服务端发出的验证码 &lt;em&gt;y&lt;/em&gt; 就没有得到确认。服务端无法知道客户端是否真的收到了这个码，也就无法确认对方是一个真实的对话者，还是一个伪造了 IP 却“只发不收”的攻击者。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-为什么两次握手2-way会崩溃"&gt;3. 为什么两次握手（2-way）会崩溃？
&lt;/h2&gt;&lt;h3 id="a-解决幽灵连接导致的资源浪费"&gt;A. 解决“幽灵连接”导致的资源浪费
&lt;/h3&gt;&lt;p&gt;网络是会拥塞的。假设客户端发的第一个 SYN 包因为迷路迟到了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：客户端超时重传了第二个 SYN，顺利完成通信并关闭了连接。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;危机&lt;/strong&gt;：这时，那个迷路的旧 SYN 终于到达了服务端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;两次握手的后果&lt;/strong&gt;：服务端会误以为这是一个新请求，立即建立连接并分配资源。但客户端早已不再理会，服务端将背负着这个“幽灵连接”直到长达数小时的 &lt;code&gt;Keep-alive&lt;/code&gt; 超时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;三次握手的化解&lt;/strong&gt;：由于服务端处于 &lt;code&gt;SYN_RCVD&lt;/code&gt; 状态，只有收到客户端对新验证码的 ACK 才会转为 &lt;code&gt;ESTABLISHED&lt;/code&gt;。旧请求发不出新 ACK，服务端超时自动释放，避免浪费。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="b-提高-syn-flood-攻击的成本"&gt;B. 提高 SYN Flood 攻击的成本
&lt;/h3&gt;&lt;p&gt;在 SYN Flood 攻击中，黑客利用伪造的 IP 地址发送大量 SYN 包。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;防御逻辑&lt;/strong&gt;：因为 IP 是伪造的，黑客无法收到服务端回发的 &lt;code&gt;_Seq=y_&lt;/code&gt;（验证码）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;阻断点&lt;/strong&gt;：没有第三次握手的 ACK 包，连接就卡在半开状态。配合 &lt;strong&gt;SYN Cookie&lt;/strong&gt; 技术，服务端甚至可以不分配内存来应对这些垃圾包，从而保护系统不瘫痪。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="c-确认全双工通路的闭环"&gt;C. 确认“全双工”通路的闭环
&lt;/h3&gt;&lt;p&gt;TCP 是双向通信（Full Duplex）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;前两步&lt;/strong&gt;：服务端确认了“我能收，客户端能发”以及“客户端能收，我能发”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第三步&lt;/strong&gt;：&lt;strong&gt;服务端确认“我发出去的，客户端确实能收到”&lt;/strong&gt;。至此，双向的发送与接收能力才完成了 100% 的逻辑闭环。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="4-备考金句总结"&gt;4. 备考金句总结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;三次握手的本质&lt;/strong&gt;：同步并确认双方的初始序列号（ISN）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不能两次的原因&lt;/strong&gt;：防止失效的连接请求突然到达引起错误，同时确保服务端发出的 ISN 得到客户端确认。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;状态记忆&lt;/strong&gt;：&lt;em&gt;&lt;code&gt;SYN_SENT&lt;/code&gt; -&amp;gt; &lt;code&gt;SYN_RCVD&lt;/code&gt; -&amp;gt; &lt;code&gt;ESTABLISHED&lt;/code&gt;&lt;/em&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;结语&lt;/strong&gt;：TCP 的设计体现了在不可靠网络环境下对“确定性”的极致追求。每一步多出来的确认，都是为了在资源利用与系统安全之间达成最优的平衡。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Power Query 技巧：如何比较顺序不同的文本</title><link>http://sergget.qzz.io/posts/20260309-01/</link><pubDate>Mon, 09 Mar 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260309-01/</guid><description>&lt;p&gt;在 Power Query 中处理数据时，经常会遇到这样的情况：两个查询中都有“单位名称”列，但每个单元格内的单位顺序可能不同（例如 “甲公司、乙公司” 与 “乙公司、甲公司”）。直接比较文本会认为它们不同，但实际上内容一致。本文将介绍如何通过拆分、排序再比较的方法，准确判断两个文本列表是否相同，并分享处理空值（null）的实用技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="问题背景"&gt;问题背景
&lt;/h2&gt;&lt;p&gt;假设有两个查询：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查询 A 的单位名称：&lt;code&gt;丙公司、甲公司、乙公司&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查询 B 的单位名称：&lt;code&gt;甲公司、乙公司、丙公司&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;肉眼可见它们包含相同的三个单位，但直接使用等于（=）判断会返回 &lt;strong&gt;false&lt;/strong&gt;。我们需要一种方法，忽略顺序的影响，只比较内容是否一致。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="解决思路"&gt;解决思路
&lt;/h2&gt;&lt;p&gt;核心思想：&lt;strong&gt;将文本拆分成单位列表 → 对列表排序 → 比较排序后的列表（或合并后再比较）&lt;/strong&gt;。排序后，无论原始顺序如何，都会得到相同顺序的列表，从而可以进行公平比较。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="具体步骤"&gt;具体步骤
&lt;/h2&gt;&lt;h3 id="第一步将文本拆分成列表"&gt;第一步：将文本拆分成列表
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;Text.Split&lt;/code&gt; 函数，根据实际分隔符（如顿号、逗号）将单位名称拆分为列表。&lt;/p&gt;
&lt;p&gt;假设待拆分的列名是“单位名称”，分隔符是顿号“、”，添加自定义列：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= Text.Split([单位名称], &amp;#34;、&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果分隔符不固定，可能需要先用替换函数统一分隔符，或使用 &lt;code&gt;Splitter.SplitTextByAnyDelimiter&lt;/code&gt; 等高级方法，但本文以顿号为例。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第二步对列表进行排序"&gt;第二步：对列表进行排序
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;List.Sort&lt;/code&gt; 对第一步得到的列表进行排序。可以直接在同一个自定义列公式中嵌套：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= List.Sort(Text.Split([单位名称], &amp;#34;、&amp;#34;))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样，原始文本被拆分后立即排序，生成一个顺序统一的列表。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="第三步执行内容比较"&gt;第三步：执行内容比较
&lt;/h3&gt;&lt;p&gt;现在有两个查询都生成了排序后的列表列（假设命名为“排序后列表1”和“排序后列表2”）。可以采用以下两种方式判断它们是否相同：&lt;/p&gt;
&lt;h4 id="方法-a使用-listdifference"&gt;方法 A：使用 &lt;code&gt;List.Difference&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;&lt;code&gt;List.Difference&lt;/code&gt; 返回第一个列表中有但第二个列表中没有的项目。如果返回空列表 &lt;code&gt;{}&lt;/code&gt;，说明两个列表内容一致。&lt;/p&gt;
&lt;p&gt;添加自定义列进行判断：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= List.Difference([排序后列表1], [排序后列表2]) = {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;结果返回 &lt;strong&gt;true&lt;/strong&gt; 或 &lt;strong&gt;false&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id="方法-b合并为文本后再比较"&gt;方法 B：合并为文本后再比较
&lt;/h4&gt;&lt;p&gt;如果后续需要保留文本格式，也可以将排序后的列表用 &lt;code&gt;Text.Combine&lt;/code&gt; 合并回字符串，然后直接比较。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= Text.Combine([排序后列表1], &amp;#34;、&amp;#34;) = Text.Combine([排序后列表2], &amp;#34;、&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="处理空值null避免报错"&gt;处理空值（null）避免报错
&lt;/h2&gt;&lt;p&gt;在实际数据中，难免会有单元格为空（null）。如果不加处理，&lt;code&gt;Text.Split&lt;/code&gt; 会报错：“无法将值 null 转换为类型 Text”。解决方法是添加空值判断或错误处理。&lt;/p&gt;
&lt;h3 id="推荐在拆分排序时返回空列表"&gt;推荐：在拆分排序时返回空列表
&lt;/h3&gt;&lt;p&gt;修改自定义列公式，如果原始值为 null，则返回空列表 &lt;code&gt;{}&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= if [单位名称] &amp;lt;&amp;gt; null then List.Sort(Text.Split([单位名称], &amp;#34;、&amp;#34;)) else {}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这样做的好处是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;后续操作（如提取值、&lt;code&gt;Text.Combine&lt;/code&gt;）不会因为 null 而中断。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空列表在合并时会得到空字符串 &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;，符合逻辑预期。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="备选在后续拼接时处理-null"&gt;备选：在后续拼接时处理 null
&lt;/h3&gt;&lt;p&gt;如果你希望保留 null 以区分“无数据”和“空数据”，可以在最后合并列表时做判断：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= if [排序后列表] &amp;lt;&amp;gt; null then Text.Combine([排序后列表], &amp;#34;;&amp;#34;) else null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或使用 &lt;code&gt;try…otherwise&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= try Text.Combine([排序后列表], &amp;#34;;&amp;#34;) otherwise null
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;但请注意，如果使用界面上的“提取值”功能（右键点击列表列 → 提取值），&lt;strong&gt;该功能无法处理包含 null 的列表列&lt;/strong&gt;，会直接报错。因此，如果打算使用提取值，强烈建议在生成列表列时就避免 null（即返回空列表）。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="完整示例"&gt;完整示例
&lt;/h2&gt;&lt;p&gt;假设数据如下：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;单位名称（原始）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;丙公司、甲公司、乙公司&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;乙厂、甲厂、丙厂&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;null&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;添加排序列表列&lt;/strong&gt;&lt;br&gt;
公式：&lt;code&gt;= if [单位名称] &amp;lt;&amp;gt; null then List.Sort(Text.Split([单位名称], &amp;quot;、&amp;quot;)) else {}&lt;/code&gt;&lt;br&gt;
结果列将包含：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;{&amp;quot;甲公司&amp;quot;,&amp;quot;乙公司&amp;quot;,&amp;quot;丙公司&amp;quot;}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;{&amp;quot;甲厂&amp;quot;,&amp;quot;乙厂&amp;quot;,&amp;quot;丙厂&amp;quot;}&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;{}&lt;/code&gt; （空列表）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;合并回文本（可选）&lt;/strong&gt;&lt;br&gt;
公式：&lt;code&gt;= Text.Combine([排序后列表], &amp;quot;、&amp;quot;)&lt;/code&gt;&lt;br&gt;
结果：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;甲公司、乙公司、丙公司&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;甲厂、乙厂、丙厂&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;（空字符串）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;与另一个查询比较&lt;/strong&gt;&lt;br&gt;
假设有另一个查询的对应列表列名为“排序后列表B”，判断是否相等：&lt;br&gt;
&lt;code&gt;= List.Difference([排序后列表], [排序后列表B]) = {}&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;核心函数&lt;/strong&gt;：&lt;code&gt;Text.Split&lt;/code&gt;、&lt;code&gt;List.Sort&lt;/code&gt;、&lt;code&gt;List.Difference&lt;/code&gt;、&lt;code&gt;Text.Combine&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键技巧&lt;/strong&gt;：先拆分再排序，消除顺序影响。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;空值处理&lt;/strong&gt;：在拆分排序时就返回空列表 &lt;code&gt;{}&lt;/code&gt;，可以简化后续操作，避免报错。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：对比单位名称、关键词列表、标签集合等任何顺序不重要但内容需一致的文本数据。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过以上方法，你可以轻松在 Power Query 中实现忽略顺序的文本内容比较，并稳健地处理空值。希望这篇笔记对你的数据处理工作有所帮助！&lt;/p&gt;</description></item><item><title>Windows Terminal 完整美化指南</title><link>http://sergget.qzz.io/posts/20260119-01/</link><pubDate>Mon, 19 Jan 2026 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20260119-01/</guid><description>&lt;h2 id="1前置准备"&gt;1.前置准备
&lt;/h2&gt;&lt;h3 id="系统要求"&gt;系统要求
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows 10 1903 (build 18362) 或更高版本&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows 11（推荐）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PowerShell 5.1 或更高版本&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="检查-powershell-版本"&gt;检查 PowerShell 版本
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$PSVersionTable.PSVersion
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="2安装-windows-terminal"&gt;2.安装 Windows Terminal
&lt;/h2&gt;&lt;h3 id="方法-1microsoft-store推荐"&gt;方法 1：Microsoft Store（推荐）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开 Microsoft Store&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;搜索 &amp;ldquo;Windows Terminal&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击&amp;quot;安装&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="方法-2使用-winget"&gt;方法 2：使用 winget
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WindowsTerminal
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="验证安装"&gt;验证安装
&lt;/h3&gt;&lt;p&gt;打开 Windows Terminal，应该能看到终端界面。&lt;/p&gt;
&lt;h2 id="3配置执行策略"&gt;3.配置执行策略
&lt;/h2&gt;&lt;h3 id="为什么需要这一步"&gt;为什么需要这一步？
&lt;/h3&gt;&lt;p&gt;PowerShell 默认不允许运行脚本，需要修改执行策略。&lt;/p&gt;
&lt;h3 id="操作步骤"&gt;操作步骤
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;以管理员身份打开 PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在开始菜单搜索 &amp;ldquo;PowerShell&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键选择&amp;quot;以管理员身份运行&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行以下命令&lt;/strong&gt; &lt;code&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;确认更改&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提示时输入 &lt;code&gt;Y&lt;/code&gt; 并回车&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证设置&lt;/strong&gt; &lt;code&gt;Get-ExecutionPolicy -List&lt;/code&gt; 应该看到 &lt;code&gt;CurrentUser&lt;/code&gt; 的策略为 &lt;code&gt;RemoteSigned&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="4安装-oh-my-posh"&gt;4.安装 Oh My Posh
&lt;/h2&gt;&lt;h3 id="什么是-oh-my-posh"&gt;什么是 Oh My Posh？
&lt;/h3&gt;&lt;p&gt;一个强大的提示符主题引擎，让终端更美观、信息更丰富。&lt;/p&gt;
&lt;h3 id="安装步骤"&gt;安装步骤
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 winget 安装（推荐）&lt;/strong&gt; &lt;code&gt;winget install JanDeDobbeleer.OhMyPosh -s winget&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完全关闭并重新打开 PowerShell&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;必须重启才能生效&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;关闭所有 PowerShell 和 Windows Terminal 窗口&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证安装&lt;/strong&gt; &lt;code&gt;oh-my-posh version&lt;/code&gt; 应该显示版本号，如 &lt;code&gt;29.0.2&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="检查主题路径"&gt;检查主题路径
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 检查环境变量
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$env:POSH_THEMES_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 验证主题文件是否存在
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test-Path $env:POSH_THEMES_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="如果主题路径不存在常见问题"&gt;如果主题路径不存在（常见问题）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;手动下载主题文件：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 1. 创建主题目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;New-Item -ItemType Directory -Path &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes&amp;#34; -Force
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 2. 下载常用主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$themes = @(&amp;#34;paradox&amp;#34;, &amp;#34;atomic&amp;#34;, &amp;#34;agnoster&amp;#34;, &amp;#34;jandedobbeleer&amp;#34;, &amp;#34;powerlevel10k_rainbow&amp;#34;, &amp;#34;night-owl&amp;#34;, &amp;#34;clean-detailed&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;foreach ($theme in $themes) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; $url = &amp;#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/$theme.omp.json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; $output = &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes\$theme.omp.json&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; try {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Invoke-WebRequest -Uri $url -OutFile $output
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Write-Host &amp;#34;✓ 已下载: $theme.omp.json&amp;#34; -ForegroundColor Green
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } catch {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Write-Host &amp;#34;✗ 下载失败: $theme.omp.json&amp;#34; -ForegroundColor Red
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 3. 验证下载
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-ChildItem &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5安装字体"&gt;5.安装字体
&lt;/h2&gt;&lt;h3 id="为什么需要-nerd-font"&gt;为什么需要 Nerd Font？
&lt;/h3&gt;&lt;p&gt;Oh My Posh 主题使用特殊图标，需要支持这些图标的字体。&lt;/p&gt;
&lt;h3 id="推荐字体"&gt;推荐字体
&lt;/h3&gt;&lt;h4 id="英文环境"&gt;英文环境
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CascadiaCode Nerd Font&lt;/strong&gt;（推荐）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;FiraCode Nerd Font&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JetBrainsMono Nerd Font&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="中英文混排推荐"&gt;中英文混排（推荐）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sarasa Mono SC Nerd&lt;/strong&gt;（更纱黑体，完美支持中文）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="安装方法"&gt;安装方法
&lt;/h3&gt;&lt;h4 id="方法-1使用-oh-my-posh-字体安装工具最简单"&gt;方法 1：使用 Oh My Posh 字体安装工具（最简单）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh font install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;选择推荐字体：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用方向键选择 &lt;code&gt;CascadiaCode&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按回车确认&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="方法-2手动下载安装"&gt;方法 2：手动下载安装
&lt;/h4&gt;&lt;p&gt;&lt;strong&gt;CascadiaCode Nerd Font：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;访问：https://github.com/ryanoasis/nerd-fonts/releases/latest&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;code&gt;CascadiaCode.zip&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解压 ZIP 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择所有 &lt;code&gt;.ttf&lt;/code&gt; 文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键 → &amp;ldquo;为所有用户安装&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Sarasa Mono SC Nerd（中文支持）：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;访问：https://github.com/be5invis/Sarasa-Gothic/releases&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载 &lt;code&gt;Sarasa-TTF-&amp;lt;version&amp;gt;.7z&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;解压后找到 &lt;code&gt;sarasa-mono-sc-nerd-*.ttf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;右键 → &amp;ldquo;为所有用户安装&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="方法-3使用-scoop推荐给开发者"&gt;方法 3：使用 Scoop（推荐给开发者）
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 安装 Scoop（如果没有）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;irm get.scoop.sh | iex
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 添加 nerd-fonts bucket
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scoop bucket add nerd-fonts
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 安装字体
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scoop install CascadiaCode-NF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 或
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;scoop install Sarasa-Gothic
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="6配置-windows-terminal"&gt;6.配置 Windows Terminal
&lt;/h2&gt;&lt;h3 id="设置字体"&gt;设置字体
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开 Windows Terminal&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;按 &lt;code&gt;Ctrl + ,&lt;/code&gt; 打开设置&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;左侧选择 &amp;ldquo;配置文件&amp;rdquo; → &amp;ldquo;默认值&amp;rdquo;&lt;/strong&gt;（或选择特定的 PowerShell 配置）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;点击 &amp;ldquo;外观&amp;rdquo; 选项卡&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 &amp;ldquo;字体&amp;rdquo; 下拉菜单中选择：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;纯英文：&lt;code&gt;CaskaydiaCove Nerd Font&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;中英文：&lt;code&gt;CaskaydiaCove Nerd Font, Microsoft YaHei UI&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完美中文：&lt;code&gt;Sarasa Mono SC Nerd&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;字体大小设置为 &lt;code&gt;11&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;点击 &amp;ldquo;保存&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="设置配色方案可选"&gt;设置配色方案（可选）
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在设置界面左侧选择 &amp;ldquo;配色方案&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推荐方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;One Half Dark&lt;/strong&gt; - 优雅深色&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Campbell Powershell&lt;/strong&gt; - 经典&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Dracula&lt;/strong&gt; - 流行主题&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;返回 &amp;ldquo;配置文件&amp;rdquo; → 选择你的 PowerShell&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &amp;ldquo;外观&amp;rdquo; 中选择配色方案&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="json-配置示例"&gt;JSON 配置示例
&lt;/h3&gt;&lt;p&gt;如果想直接编辑配置文件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按 &lt;code&gt;Ctrl + ,&lt;/code&gt; 打开设置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击左下角 &amp;ldquo;打开 JSON 文件&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到你的 PowerShell 配置，添加或修改：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;profiles&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;list&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;guid&amp;#34;: &amp;#34;{你的PowerShell GUID}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;name&amp;#34;: &amp;#34;PowerShell&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;font&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;face&amp;#34;: &amp;#34;CaskaydiaCove Nerd Font, Microsoft YaHei UI&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;size&amp;#34;: 11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;colorScheme&amp;#34;: &amp;#34;One Half Dark&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;useAcrylic&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;acrylicOpacity&amp;#34;: 0.85,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;cursorShape&amp;#34;: &amp;#34;bar&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;padding&amp;#34;: &amp;#34;8&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="7配置-powershell"&gt;7.配置 PowerShell
&lt;/h2&gt;&lt;h3 id="创建配置文件"&gt;创建配置文件
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检查配置文件是否存在&lt;/strong&gt; &lt;code&gt;Test-Path $PROFILE&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;如果不存在，创建配置文件&lt;/strong&gt; &lt;code&gt;New-Item -Path $PROFILE -Type File -Force&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编辑配置文件&lt;/strong&gt; &lt;code&gt;notepad $PROFILE&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="基础配置推荐"&gt;基础配置（推荐）
&lt;/h3&gt;&lt;p&gt;将以下内容粘贴到配置文件中：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Oh My Posh - 使用本地主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes\paradox.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Terminal Icons（文件和文件夹图标）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Import-Module -Name Terminal-Icons
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="如果本地主题不存在使用在线主题"&gt;如果本地主题不存在，使用在线主题
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Oh My Posh - 使用在线主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/paradox.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Terminal Icons
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Import-Module -Name Terminal-Icons
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="推荐主题"&gt;推荐主题
&lt;/h3&gt;&lt;p&gt;本地主题路径格式：&lt;code&gt;$env:LOCALAPPDATA\Programs\oh-my-posh\themes\&amp;lt;主题名&amp;gt;.omp.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在线主题格式：&lt;code&gt;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/&amp;lt;主题名&amp;gt;.omp.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;轻量简洁：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jandedobbeleer&lt;/code&gt; - 默认主题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;paradox&lt;/code&gt; - 简洁现代&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;agnoster&lt;/code&gt; - 经典设计&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;信息丰富：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;atomic&lt;/code&gt; - 详细信息（需要 Nerd Font）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;powerlevel10k_rainbow&lt;/code&gt; - 彩色炫酷&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;night-owl&lt;/code&gt; - 深色优雅&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="保存并加载配置"&gt;保存并加载配置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 保存配置文件后，重新加载
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. $PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="8安装增强模块"&gt;8.安装增强模块
&lt;/h2&gt;&lt;h3 id="psreadline命令行增强"&gt;PSReadLine（命令行增强）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;检查版本：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-Module PSReadLine -ListAvailable
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;更新到最新版（需要管理员权限）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Install-Module PSReadLine -Force -SkipPublisherCheck
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;添加到配置文件：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编辑 &lt;code&gt;$PROFILE&lt;/code&gt;，添加以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# PSReadLine 配置（需要 2.2.0+ 版本）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if ((Get-Module PSReadLine).Version -ge &amp;#39;2.2.0&amp;#39;) {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Set-PSReadLineOption -PredictionSource History
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Set-PSReadLineOption -PredictionViewStyle ListView
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineOption -EditMode Windows
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineKeyHandler -Key UpArrow -Function HistorySearchBackward
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineKeyHandler -Key DownArrow -Function HistorySearchForward
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="terminal-icons文件图标"&gt;Terminal-Icons（文件图标）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;安装：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Install-Module -Name Terminal-Icons -Repository PSGallery -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;已在基础配置中包含，无需额外配置&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="9常见问题排查"&gt;9.常见问题排查
&lt;/h2&gt;&lt;h3 id="问题-1禁止运行脚本"&gt;问题 1：禁止运行脚本
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;无法加载文件...因为在此系统上禁止运行脚本
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 以管理员身份运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="问题-2config-not-found"&gt;问题 2：CONFIG NOT FOUND
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONFIG NOT FOUND
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 主题文件路径不存在&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案 1：检查路径&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Test-Path $env:POSH_THEMES_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决方案 2：手动下载主题（见&amp;quot;安装 Oh My Posh&amp;quot;章节）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案 3：使用在线主题&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 编辑配置文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notepad $PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 使用在线主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/paradox.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="问题-3图标显示为问号或方框"&gt;问题 3：图标显示为问号或方框
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 没有安装 Nerd Font 字体或 Windows Terminal 未配置正确字体&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装 Nerd Font 字体&lt;/strong&gt;（见&amp;quot;安装字体&amp;quot;章节）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在 Windows Terminal 中设置字体&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;按 &lt;code&gt;Ctrl + ,&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置文件 → 默认值 → 外观&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字体选择：&lt;code&gt;CaskaydiaCove Nerd Font&lt;/code&gt; 或 &lt;code&gt;Sarasa Mono SC Nerd&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完全关闭并重启 Windows Terminal&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id="问题-4psreadline-参数错误"&gt;问题 4：PSReadLine 参数错误
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;错误信息：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;找不到与参数名称&amp;#34;PredictionSource&amp;#34;匹配的参数
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; PSReadLine 版本过旧&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 以管理员身份运行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Install-Module PSReadLine -Force -SkipPublisherCheck
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 或使用兼容配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notepad $PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;兼容配置：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 只使用基础功能
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineOption -EditMode Windows
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-PSReadLineKeyHandler -Key Tab -Function Complete
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="问题-5加载时间过长2000-毫秒"&gt;问题 5：加载时间过长（2000+ 毫秒）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;原因：&lt;/strong&gt; 使用在线主题或模块加载慢&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案 1：使用本地主题&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 下载主题到本地（见&amp;#34;安装 Oh My Posh&amp;#34;章节的手动下载部分）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 使用本地路径
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes\paradox.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解决方案 2：优化配置&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 使用更轻量的主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh\themes\jandedobbeleer.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 延迟加载 Terminal Icons
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$null = Register-EngineEvent PowerShell.OnIdle -Action {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Import-Module Terminal-Icons
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Unregister-Event PowerShell.OnIdle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;测试加载时间：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure-Command { . $PROFILE }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;正常应该在 300-800 毫秒之间。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="问题-6中文显示问题"&gt;问题 6：中文显示问题
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt; 使用支持中文的字体配置&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Windows Terminal 设置：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;字体：CaskaydiaCove Nerd Font, Microsoft YaHei UI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;或
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;字体：Sarasa Mono SC Nerd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="10进阶优化"&gt;10.进阶优化
&lt;/h2&gt;&lt;h3 id="完整配置示例"&gt;完整配置示例
&lt;/h3&gt;&lt;p&gt;编辑 &lt;code&gt;$PROFILE&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Oh My Posh 主题配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oh&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;posh&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;pwsh&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$env:LOCALAPPDATA\Programs\oh-my-posh&lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;hemes\paradox.omp.json&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Invoke&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Expression&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 模块导入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Import&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Icons&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Import&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# PSReadLine 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Module&lt;/span&gt; &lt;span class="n"&gt;PSReadLine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ge&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2.2.0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 历史记录预测&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineOption&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PredictionSource&lt;/span&gt; &lt;span class="n"&gt;History&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineOption&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PredictionViewStyle&lt;/span&gt; &lt;span class="n"&gt;ListView&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 基础配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineOption&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;EditMode&lt;/span&gt; &lt;span class="n"&gt;Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineOption&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;BellStyle&lt;/span&gt; &lt;span class="n"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 快捷键绑定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineKeyHandler&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Tab&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="n"&gt;MenuComplete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineKeyHandler&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;UpArrow&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="n"&gt;HistorySearchBackward&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;PSReadLineKeyHandler&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;DownArrow&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Function&lt;/span&gt; &lt;span class="n"&gt;HistorySearchForward&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 别名和函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 快速清屏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Alias&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;cls&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="n"&gt;Clear&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 快速编辑配置文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;Edit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;notepad&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PROFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Alias&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;ep&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="n"&gt;Edit&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 快速重载配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;function&lt;/span&gt; &lt;span class="n"&gt;Reload&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;PROFILE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Alias&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="n"&gt;rp&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="n"&gt;Reload&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 欢迎信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ============================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PowerShell $($PSVersionTable.PSVersion) - &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;NoNewline&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Oh My Posh $(oh-my-posh version)&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Cyan&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="自定义配色方案"&gt;自定义配色方案
&lt;/h3&gt;&lt;p&gt;创建自定义 Dracula 主题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按 &lt;code&gt;Ctrl + ,&lt;/code&gt; 打开设置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击左下角 &amp;ldquo;打开 JSON 文件&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;schemes&lt;/code&gt; 数组中添加：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;schemes&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;name&amp;#34;: &amp;#34;Dracula&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;background&amp;#34;: &amp;#34;#282A36&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;foreground&amp;#34;: &amp;#34;#F8F8F2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;black&amp;#34;: &amp;#34;#21222C&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;blue&amp;#34;: &amp;#34;#BD93F9&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;cyan&amp;#34;: &amp;#34;#8BE9FD&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;green&amp;#34;: &amp;#34;#50FA7B&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;purple&amp;#34;: &amp;#34;#FF79C6&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;red&amp;#34;: &amp;#34;#FF5555&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;white&amp;#34;: &amp;#34;#F8F8F2&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;yellow&amp;#34;: &amp;#34;#F1FA8C&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightBlack&amp;#34;: &amp;#34;#6272A4&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightBlue&amp;#34;: &amp;#34;#D6ACFF&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightCyan&amp;#34;: &amp;#34;#A4FFFF&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightGreen&amp;#34;: &amp;#34;#69FF94&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightPurple&amp;#34;: &amp;#34;#FF92DF&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightRed&amp;#34;: &amp;#34;#FF6E6E&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightWhite&amp;#34;: &amp;#34;#FFFFFF&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;brightYellow&amp;#34;: &amp;#34;#FFFFA5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;在配置文件中使用：&lt;code&gt;&amp;quot;colorScheme&amp;quot;: &amp;quot;Dracula&amp;quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="背景图片和透明效果"&gt;背景图片和透明效果
&lt;/h3&gt;&lt;p&gt;在 Windows Terminal 设置 JSON 中添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;profiles&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;list&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;backgroundImage&amp;#34;: &amp;#34;C:/Users/YourName/Pictures/background.jpg&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;backgroundImageOpacity&amp;#34;: 0.2,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;useAcrylic&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;acrylicOpacity&amp;#34;: 0.8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="11验证最终效果"&gt;11.验证最终效果
&lt;/h2&gt;&lt;h3 id="检查清单"&gt;检查清单
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;[ ] Windows Terminal 已安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] PowerShell 执行策略已配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] Oh My Posh 已安装并显示版本号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] Nerd Font 字体已安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] Windows Terminal 字体已配置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] PowerShell 配置文件已创建&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] 主题正常显示，无 &amp;ldquo;CONFIG NOT FOUND&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] 图标正常显示，无乱码&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] 加载时间在 800ms 以内&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[ ] PSReadLine 自动补全正常工作&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="测试命令"&gt;测试命令
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 查看版本
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$PSVersionTable.PSVersion
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-Module PSReadLine | Select-Object Version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 测试加载时间
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Measure-Command { . $PROFILE }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 测试图标显示
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-ChildItem
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="快速参考"&gt;快速参考
&lt;/h2&gt;&lt;h3 id="常用命令"&gt;常用命令
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 编辑配置文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;notepad $PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重载配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. $PROFILE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 查看主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-ChildItem $env:POSH_THEMES_PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 预览所有主题
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Get-PoshThemes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 切换主题（临时）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;oh-my-posh init pwsh --config &amp;#34;$env:POSH_THEMES_PATH\atomic.omp.json&amp;#34; | Invoke-Expression
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="推荐资源"&gt;推荐资源
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Oh My Posh 官方文档：https://ohmyposh.dev/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh My Posh 主题预览：https://ohmyposh.dev/docs/themes&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nerd Fonts：https://www.nerdfonts.com/&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows Terminal 文档：https://docs.microsoft.com/zh-cn/windows/terminal/&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="12总结"&gt;12.总结
&lt;/h2&gt;&lt;p&gt;完成以上配置后，你将拥有：&lt;/p&gt;
&lt;p&gt;✅ 现代化、美观的终端界面&lt;br&gt;
✅ 丰富的 Git 信息显示&lt;br&gt;
✅ 智能命令补全和历史记录&lt;br&gt;
✅ 文件和文件夹图标&lt;br&gt;
✅ 快速的加载速度&lt;br&gt;
✅ 完美的中英文支持&lt;/p&gt;
&lt;p&gt;享受你的全新终端体验！🎉&lt;/p&gt;</description></item><item><title>WordPress大图、HEIC上传故障排查</title><link>http://sergget.qzz.io/posts/20251219-01/</link><pubDate>Fri, 19 Dec 2025 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20251219-01/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;适用环境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu Server 22.04&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;自建 LNMP（Nginx + PHP-FPM + MySQL）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WordPress（后台上传 / WP-CLI 上传）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;图片来源：iPhone（HEIC / Live Photo / 高分辨率 JPEG 4000×3000+）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;服务器物理内存：4GB&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一问题背景"&gt;一、问题背景
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;后台上传高分辨率图片（4032×3024 及以上）持续报错：服务器无法处理图片。如果服务器繁忙或没有足够的资源来完成任务，就会发生这种情况。建议的最大尺寸为 2560 像素。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HEIC 图片、MOV 视频上传失败或上传后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;媒体库无缩略图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插入文章/页面不显示&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP / Nginx / WordPress 日志无明显错误输出&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="二排查与尝试过的操作事实记录"&gt;二、排查与尝试过的操作（事实记录）
&lt;/h2&gt;&lt;h3 id="1-php-层"&gt;1. PHP 层
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;修改 PHP 配置：&lt;code&gt;memory_limit = -1 max_execution_time = 0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;无效&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WordPress 图像处理失败并非 PHP 限制，而是 ImageMagick / Imagick 资源策略&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-wordpress-调试"&gt;2. WordPress 调试
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;启用调试：&lt;code&gt;define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); define('WP_DEBUG_DISPLAY', false);&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;wp-content/debug.log&lt;/code&gt; 未生成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;上传失败时无 PHP / Nginx 错误日志&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;图像处理失败发生在底层库（Imagick），并未抛出 PHP 致命错误&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3-imagemagick--imagick"&gt;3. ImageMagick / Imagick
&lt;/h3&gt;&lt;h4 id="31-系统默认版本失败"&gt;3.1 系统默认版本（失败）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Ubuntu 22.04 apt 安装版本：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ImageMagick 6.9.x&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;php-imagick 3.6.x&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;HEIC 支持不稳定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;高分辨率图片裁剪 / 生成缩略图失败&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="32-编译安装-imagemagick-7尝试"&gt;3.2 编译安装 ImageMagick 7（尝试）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;手动编译安装 ImageMagick 7.1.x&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 libheif-dev 以支持 HEIC&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;通过 pecl 安装 imagick（指向 IM7）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WordPress 站点健康显示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Imagick 可用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;资源限制显示为几十 GB（虚高）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;实际结果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;问题仍然存在&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HEIC 报错：&lt;code&gt;Too many auxiliary image references&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;IM7 + HDRI + HEIC 在 &lt;strong&gt;4GB 内存服务器&lt;/strong&gt; 上不稳定&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;WordPress 对 HEIC 的支持并不成熟&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-imagemagick-policyxml-调整失败"&gt;4. ImageMagick policy.xml 调整（失败）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;调整内容：&lt;code&gt;&amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;memory&amp;quot; value=&amp;quot;256MiB&amp;quot;/&amp;gt; &amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;map&amp;quot; value=&amp;quot;512MiB&amp;quot;/&amp;gt; &amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;width&amp;quot; value=&amp;quot;16KP&amp;quot;/&amp;gt; &amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;height&amp;quot; value=&amp;quot;16KP&amp;quot;/&amp;gt; &amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;area&amp;quot; value=&amp;quot;128MP&amp;quot;/&amp;gt; &amp;lt;policy domain=&amp;quot;resource&amp;quot; name=&amp;quot;disk&amp;quot; value=&amp;quot;1GiB&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;仅能解决 &lt;strong&gt;部分尺寸 JPEG&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;无法根本解决 HEIC / 超大图上传失败&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5-wordpress-层自定义代码风险点"&gt;5. WordPress 层自定义代码（风险点）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;禁用大图裁剪（&lt;code&gt;big_image_size_threshold&lt;/code&gt;）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 mu-plugin / functions.php 强行放宽限制&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;后果：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;媒体库无缩略图&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插入内容失败&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不建议禁用 WordPress 默认大图裁剪&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6-wp-cli-批量上传部分成功"&gt;6. WP-CLI 批量上传（部分成功）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;未指定 &lt;code&gt;--path&lt;/code&gt; → 报错不是 WordPress 安装&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;权限不一致 → 无法移动文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;HEIC 仍然无法稳定生成元数据&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WP-CLI &lt;strong&gt;不能绕过 WordPress 的图像处理限制&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7-imagick-卸载与还原"&gt;7. Imagick 卸载与还原
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pecl 卸载：&lt;code&gt;sudo pecl uninstall imagick&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;现象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;卸载成功&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PHP 启动报错（残留配置）：&lt;code&gt;Unable to load dynamic library 'imagick.so'&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;php.ini / mods-available 中仍有 &lt;code&gt;extension=imagick.so&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三最终结论经验总结"&gt;三、最终结论（经验总结）
&lt;/h2&gt;&lt;h3 id="-关键结论"&gt;✅ 关键结论
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;WordPress 对 HEIC 的支持不可靠&lt;/strong&gt;（尤其是 Live Photo / HDR）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;4GB 内存服务器不适合在线处理超大图 + HEIC&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ImageMagick 7 并不能从根本解决 WordPress 媒体处理问题&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;禁用大图裁剪会直接破坏媒体库显示&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="四推荐的稳定方案最终方案"&gt;四、推荐的稳定方案（最终方案）
&lt;/h2&gt;&lt;h3 id="-推荐方案上传后自动转小尺寸-jpeg插件"&gt;✅ 推荐方案：上传后自动转小尺寸 JPEG（插件）
&lt;/h3&gt;&lt;h4 id="插件-1resize-image-after-upload推荐"&gt;插件 1：Resize Image After Upload（推荐）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;上传后自动调整图片尺寸&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可设置最大长边（如 2560px）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输出 JPEG&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;不依赖 HEIC 原生支持&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 WordPress 官方图像流程&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;稳定、低风险&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="插件-2imagemagick-engine可选"&gt;插件 2：ImageMagick Engine（可选）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;作用：
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;指定使用 Imagick&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配合 Resize Image After Upload 使用&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-不推荐方案"&gt;🚫 不推荐方案
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;后台直接上传 HEIC / Live Photo&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;禁用 WordPress 默认大图裁剪&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在低内存服务器上强行启用 HDRI Imagick&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五服务器还原清单可操作"&gt;五、服务器还原清单（可操作）
&lt;/h2&gt;&lt;h3 id="1-imagick-清理"&gt;1️⃣ Imagick 清理
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -R &amp;#34;imagick.so&amp;#34; /etc/php/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 注释或删除 extension=imagick.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -f /usr/lib/php/*/imagick.so
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart php-fpm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-恢复-php-配置"&gt;2️⃣ 恢复 PHP 配置
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;memory_limit = 256M
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;max_execution_time = 30
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-恢复-wordpress-默认行为"&gt;3️⃣ 恢复 WordPress 默认行为
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;删除 mu-plugin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除禁用大图裁剪的代码&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六一句话经验"&gt;六、一句话经验
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;WordPress + 小内存服务器的正确姿势：&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;让图片在进入媒体库之前或上传后尽早变小，&lt;br&gt;
而不是试图让服务器“强行处理原图”。&lt;/strong&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Edge 浏览器 IE 模式按钮强制开启指南</title><link>http://sergget.qzz.io/posts/20251218-01/</link><pubDate>Thu, 18 Dec 2025 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20251218-01/</guid><description>&lt;h3 id="问题描述"&gt;问题描述
&lt;/h3&gt;&lt;p&gt;在 Windows 10 环境下，尽管已在系统功能中勾选 IE11 并在 Edge 设置中开启了“允许重新加载”，但 Edge 143+ 版本的“外观”设置中仍不显示 &lt;strong&gt;IE 模式切换按钮&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="核心原理"&gt;核心原理
&lt;/h3&gt;&lt;p&gt;通过修改注册表，下发 Microsoft Edge 的管理策略（Policy），强制浏览器激活 IE 整合功能。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id="自动化修复方案脚本版"&gt;自动化修复方案（脚本版）
&lt;/h3&gt;&lt;p&gt;您可以选择以下任意一种脚本运行，效果相同。请务必以&lt;strong&gt;管理员身份&lt;/strong&gt;运行。&lt;/p&gt;
&lt;h4 id="选项-a快捷批处理脚本-bat"&gt;选项 A：快捷批处理脚本 (.bat)
&lt;/h4&gt;&lt;p&gt;新建一个文本文档，粘贴以下内容，保存为 &lt;code&gt;FixEdgeIE.bat&lt;/code&gt;，右键选择 &lt;strong&gt;“以管理员身份运行”&lt;/strong&gt;。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="n"&gt;off&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;::&lt;/span&gt; &lt;span class="err"&gt;强制开启&lt;/span&gt; &lt;span class="n"&gt;Edge&lt;/span&gt; &lt;span class="n"&gt;IE&lt;/span&gt; &lt;span class="err"&gt;模式策略脚本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;正在写入注册表策略&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;InternetExplorerIntegrationLevel&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;REG_DWORD&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;InternetExplorerIntegrationReloadInIEModeAllowed&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;REG_DWORD&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;echo&lt;/span&gt; &lt;span class="err"&gt;注册表项已添加！请重启&lt;/span&gt; &lt;span class="n"&gt;Edge&lt;/span&gt; &lt;span class="err"&gt;浏览器。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pause&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="选项-bpowershell-脚本-ps1"&gt;选项 B：PowerShell 脚本 (.ps1)
&lt;/h4&gt;&lt;p&gt;右键点击开始菜单，选择 &lt;strong&gt;“Windows PowerShell (管理员)”&lt;/strong&gt;，复制并执行以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 定义注册表路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;registryPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;HKLM:\SOFTWARE\Policies\Microsoft\Edge&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 如果路径不存在则创建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;registryPath&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Item&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;registryPath&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Force&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 写入策略值&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ItemProperty&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;registryPath&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;InternetExplorerIntegrationLevel&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ItemProperty&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="ne"&gt;Path&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;registryPath&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;InternetExplorerIntegrationReloadInIEModeAllowed&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Host&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;策略已生效，请重启 Edge 浏览器。&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ForegroundColor&lt;/span&gt; &lt;span class="n"&gt;Green&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h3 id="脚本执行后的后续操作"&gt;脚本执行后的后续操作
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重启浏览器&lt;/strong&gt;：在 Edge 地址栏输入 &lt;code&gt;edge://policy&lt;/code&gt; 并回车，点击 &lt;strong&gt;“刷新策略”&lt;/strong&gt;，确保能看到上述两条策略显示为“正常”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;显示按钮&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进入 &lt;strong&gt;设置 -&amp;gt; 外观&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在“选择要在工具栏上显示的按钮”下方，&lt;strong&gt;“Internet Explorer 模式按钮”&lt;/strong&gt; 开关现在应该已经出现并可以手动开启了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证&lt;/strong&gt;：点击工具栏新出现的蓝色的 IE 图标，页面应能成功切换至兼容模式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;需要注意：&lt;/strong&gt; 开启策略后，设置页面可能会显示“由你的组织管理”，这是正常现象，说明注册表策略已生效。&lt;/p&gt;</description></item><item><title>PowerShell远程连接教程</title><link>http://sergget.qzz.io/posts/20251104-02/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20251104-02/</guid><description>&lt;h2 id="1-powershell远程管理基础"&gt;1 PowerShell远程管理基础
&lt;/h2&gt;&lt;p&gt;PowerShell远程管理功能基于WS-Management协议，由Windows远程管理服务实现，允许用户跨网络在一台或多台远程计算机上执行命令和脚本。与仅支持单个命令的cmdlet不同，PowerShell Remoting支持交互式会话和复杂的脚本执行。&lt;/p&gt;
&lt;p&gt;​&lt;strong&gt;核心组件&lt;/strong&gt;是WinRM服务，它默认使用HTTP端口5985或HTTPS端口5986进行通信。这种基于标准HTTP/S的设计使其能够较容易地穿透防火墙。&lt;/p&gt;
&lt;h2 id="2-环境配置步骤"&gt;2 环境配置步骤
&lt;/h2&gt;&lt;h3 id="21-远程主机配置"&gt;2.1 远程主机配置
&lt;/h3&gt;&lt;p&gt;远程主机是需要被管理的计算机，必须首先启用PowerShell远程处理功能。&lt;/p&gt;
&lt;p&gt;​1.&lt;strong&gt;以管理员身份启动PowerShell&lt;/strong&gt;​：右键点击PowerShell图标，选择“以管理员身份运行”。&lt;/p&gt;
&lt;p&gt;​2.&lt;strong&gt;设置执行策略&lt;/strong&gt;​（可选，但建议设置）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-ExecutionPolicy RemoteSigned -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;​3.&lt;strong&gt;启用PowerShell远程处理&lt;/strong&gt;​：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enable-PSRemoting -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;此命令将：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;启动或重启WinRM服务&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将WinRM服务启动类型设置为“自动”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建侦听程序以接受任意IP地址上的请求&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为WS-Management通信启用Windows防火墙入站规则例外&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​4.&lt;strong&gt;检查网络连接类型&lt;/strong&gt;​：确保网络位置不是“公用”，因为Windows防火墙例外不能在公用网络位置启用。如果是公用网络，需更改为“专用”：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-NetConnectionProfile -InterfaceAlias &amp;#34;以太网&amp;#34; -NetworkCategory Private
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="22-客户端配置"&gt;2.2 客户端配置
&lt;/h3&gt;&lt;p&gt;客户端是用于发起远程连接的管理计算机。&lt;/p&gt;
&lt;p&gt;​1.&lt;strong&gt;设置TrustedHosts&lt;/strong&gt;​：在非域环境中，必须将远程主机添加到客户端的信任主机列表。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-Item WSMan:\localhost\Client\TrustedHosts -Value &amp;#34;远程主机IP&amp;#34; -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如需信任所有计算机（测试环境），可使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-Item WSMan:\localhost\Client\TrustedHosts -Value &amp;#34;*&amp;#34; -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.&lt;strong&gt;启用客户端远程支持&lt;/strong&gt;​：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enable-PSRemoting -SkipNetworkProfileCheck -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-远程连接方法"&gt;3 远程连接方法
&lt;/h2&gt;&lt;h3 id="31-交互式会话"&gt;3.1 交互式会话
&lt;/h3&gt;&lt;p&gt;交互式会话允许用户像在远程计算机上直接操作一样执行命令。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter-PSSession -ComputerName 192.168.1.100 -Credential administrator
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;连接成功后，提示符会变为&lt;code&gt;[远程主机IP]: PS ...&lt;/code&gt;，此时输入的命令将在远程主机上执行。&lt;/p&gt;
&lt;p&gt;退出会话使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Exit-PSSession
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="32-执行单条命令"&gt;3.2 执行单条命令
&lt;/h3&gt;&lt;p&gt;对于单条命令或简单任务，使用&lt;code&gt;Invoke-Command&lt;/code&gt;更高效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Invoke-Command -ComputerName 192.168.1.100 -Credential administrator -ScriptBlock {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Get-Process | Where-Object { $_.CPU -gt 10 }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="33-持久连接"&gt;3.3 持久连接
&lt;/h3&gt;&lt;p&gt;对于需要多次执行的相关命令，可创建持久连接以提高效率：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$session = New-PSSession -ComputerName 192.168.1.100 -Credential administrator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Invoke-Command -Session $session -ScriptBlock {$processes = Get-Process}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Invoke-Command -Session $session -ScriptBlock {$processes.Count}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Remove-PSSession $session
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="4-高级配置与故障排除"&gt;4 高级配置与故障排除
&lt;/h2&gt;&lt;h3 id="41-常见错误及解决方案"&gt;4.1 常见错误及解决方案
&lt;/h3&gt;&lt;p&gt;​&lt;strong&gt;错误&lt;/strong&gt;​：WinRM 客户端无法处理该请求。如果身份验证方案与 Kerberos 不同&amp;hellip;​&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解决方案&lt;/strong&gt;​：将远程主机IP添加到客户端的TrustedHosts列表。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Set-Item WSMan:\localhost\Client\TrustedHosts -Value &amp;#34;本地机ip&amp;#34; -Force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="42-认证方式选择"&gt;4.2 认证方式选择
&lt;/h3&gt;&lt;p&gt;在不同网络环境下，可能需要指定不同的认证机制：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter-PSSession -ComputerName 192.168.1.100 -Credential administrator -Authentication CredSSP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;特别是当需要从远程会话访问另一台服务器资源时，CredSSP认证可以传递凭据。&lt;/p&gt;
&lt;h3 id="43-服务管理与诊断"&gt;4.3 服务管理与诊断
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;检查WinRM服务状态&lt;/strong&gt;​：&lt;code&gt;Get-Service WinRM Test-WSMan -ComputerName 192.168.1.100&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;查看当前WinRM配置&lt;/strong&gt;​：&lt;code&gt;winrm get winrm/config&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;快速检查配置&lt;/strong&gt;​：&lt;code&gt;winrm quickconfig&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="5-安全注意事项"&gt;5 安全注意事项
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;最小权限原则&lt;/strong&gt;​：只授予必要的远程访问权限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;使用HTTPS传输&lt;/strong&gt;​：生产环境建议配置证书并使用5986端口&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;限制TrustedHosts&lt;/strong&gt;​：尽量避免使用&lt;code&gt;*&lt;/code&gt;，而是指定具体IP或计算机名&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;定期审查&lt;/strong&gt;​：定期检查远程访问日志和配置&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>在excel中用行号、列的序号来获取单元格的值</title><link>http://sergget.qzz.io/posts/20251104-01/</link><pubDate>Tue, 04 Nov 2025 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20251104-01/</guid><description>&lt;p&gt;&lt;strong&gt;用行号与列序号获取单元格值的常用方法&lt;/strong&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;INDEX&lt;/strong&gt;​ 函数按“区域内的第几行、第几列”取值，语法：&lt;code&gt;=INDEX(array, row_num, [column_num])&lt;/code&gt;。其中 ​&lt;strong&gt;row_num、column_num&lt;/strong&gt;​ 是相对于 array 的位置（从 ​&lt;strong&gt;1&lt;/strong&gt;​ 开始）。例如：&lt;code&gt;=INDEX(A1:D10, 3, 2)&lt;/code&gt;取 A1:D10 区域中第 ​&lt;strong&gt;3&lt;/strong&gt;​ 行、第 ​&lt;strong&gt;2&lt;/strong&gt;​ 列的值。若区域只有一行或一列，可省略相应参数；将列参数设为 ​&lt;strong&gt;0&lt;/strong&gt;​ 可返回整行，行参数设为 ​&lt;strong&gt;0&lt;/strong&gt;​ 返回整列（旧版需用 Ctrl+Shift+Enter 作为数组公式，Microsoft 365 直接回车即可）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;INDIRECT + ADDRESS&lt;/strong&gt;​ 组合用“绝对地址文本”取值，语法思路：先用 &lt;code&gt;ADDRESS(row_num, col_num)&lt;/code&gt;生成如 ​&lt;strong&gt;​_B_5&lt;/strong&gt;​ 的地址文本，再用 &lt;code&gt;INDIRECT&lt;/code&gt;解析为引用。例如：&lt;code&gt;=INDIRECT(ADDRESS(5, 2))&lt;/code&gt;取第 ​&lt;strong&gt;5&lt;/strong&gt;​ 行第 ​&lt;strong&gt;2&lt;/strong&gt;​ 列（即 B5）的值；若行号、列号存放在单元格中（如 ​&lt;strong&gt;F4、F5&lt;/strong&gt;），可写：&lt;code&gt;=INDIRECT(ADDRESS(F4, F5))&lt;/code&gt;。注意 ADDRESS 可返回 A1 或 R1C1 样式，且可包含工作表名；INDIRECT 为易挥发函数，大数据量时可能影响性能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;OFFSET&lt;/strong&gt;​ 从基点按偏移量取值，语法：&lt;code&gt;=OFFSET(reference, rows, cols, [height], [width])&lt;/code&gt;。例如从 ​&lt;strong&gt;A1&lt;/strong&gt;​ 开始，向下偏移 ​&lt;strong&gt;2&lt;/strong&gt;​ 行、向右偏移 ​&lt;strong&gt;1&lt;/strong&gt;​ 列：&lt;code&gt;=OFFSET(A1, 2, 1)&lt;/code&gt;得到 ​&lt;strong&gt;B3&lt;/strong&gt;；要返回一整行可用：&lt;code&gt;=OFFSET(A1, 2, 0, 1, 4)&lt;/code&gt;（第 3 行、1 行高、4 列宽）。适合动态偏移场景，但引用会随偏移变化，需注意稳定性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​&lt;strong&gt;实用示例&lt;/strong&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;已知行号在 ​&lt;strong&gt;F2&lt;/strong&gt;、列号在 ​&lt;strong&gt;F3&lt;/strong&gt;​（数值为 ​&lt;strong&gt;5&lt;/strong&gt;​ 和 ​&lt;strong&gt;2&lt;/strong&gt;）：
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;取值（INDEX）：&lt;code&gt;=INDEX(A1:D10, F2, F3)&lt;/code&gt;，等价于取 A1:D10 的第 5 行第 2 列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取值（INDIRECT+ADDRESS）：&lt;code&gt;=INDIRECT(ADDRESS(F2, F3))&lt;/code&gt;，等价于取第 5 行第 2 列。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取整行（INDEX）：&lt;code&gt;=INDEX(A1:D10, F2, 0)&lt;/code&gt;（返回第 5 行的整行数据）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;取整列（INDEX）：&lt;code&gt;=INDEX(A1:D10, 0, F3)&lt;/code&gt;（返回第 2 列的整列数据）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​&lt;strong&gt;注意事项与小技巧&lt;/strong&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;行号与列号从 1 开始&lt;/strong&gt;​：在 INDEX 的 array 范围内计数；超出范围会返回 ​&lt;strong&gt;​#REF&lt;/strong&gt;。如需行列序号来自单元格，直接引用即可（如 &lt;code&gt;=INDEX(A1:D10, F2, F3)&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;INDEX 返回整行/整列&lt;/strong&gt;​：将列（或行）参数设为 ​&lt;strong&gt;0&lt;/strong&gt;；Microsoft 365 直接回车返回溢出数组，旧版可能需要 Ctrl+Shift+Enter。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;动态列字母场景&lt;/strong&gt;​：如果“列序号”是字母（如“C”），可先转列号：&lt;code&gt;=COLUMN(INDIRECT(F3&amp;amp;1))&lt;/code&gt;，再代入：&lt;code&gt;=INDEX(A1:D10, F2, COLUMN(INDIRECT(F3&amp;amp;1)))&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;​&lt;strong&gt;性能建议&lt;/strong&gt;​：避免在大表中大量使用 ​&lt;strong&gt;INDIRECT&lt;/strong&gt;​（易挥发）；能用 ​&lt;strong&gt;INDEX&lt;/strong&gt;​ 尽量用 INDEX，或用 ​&lt;strong&gt;INDEX+MATCH&lt;/strong&gt;​ 做动态查找更稳更高效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;​&lt;strong&gt;进阶 VBA 自定义函数&lt;/strong&gt;​&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 VBA 中可封装一个按“行号、列号”取值的函数：
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;按 ​&lt;strong&gt;Alt+F11&lt;/strong&gt;​ 打开 VBA 编辑器 → 插入模块；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;粘贴代码：复制&lt;code&gt;Function GetValueByRowCol(row As Long, col As Long, Optional ws As Worksheet) As Variant If ws Is Nothing Then Set ws = ActiveSheet GetValueByRowCol = ws.Cells(row, col).Value End Function&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;工作表中直接用：&lt;code&gt;=GetValueByRowCol(6, 3)&lt;/code&gt;（取第 ​&lt;strong&gt;6&lt;/strong&gt;​ 行第 ​&lt;strong&gt;3&lt;/strong&gt;​ 列）；也可指定表：&lt;code&gt;=GetValueByRowCol(6,3,Sheet2)&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Excel断开外部顽固链接</title><link>http://sergget.qzz.io/posts/20220618-01/</link><pubDate>Sat, 18 Jun 2022 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20220618-01/</guid><description>&lt;p&gt;Excel在公式、名称管理器等处等引用外部文件时会默认弹窗询问是否更新单元格的值，一般来说，发送给他人的Excel文件不应引用未发送文件的外部链接。&lt;/p&gt;
&lt;h2 id="断开普通外部链接"&gt;断开普通外部链接
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;点击“文件——信息”，在右下角的&lt;code&gt;相关文档&lt;/code&gt;中点击&lt;code&gt;编辑指向文件的链接&lt;/code&gt;，选中需要断开的链接，点击&lt;code&gt;断开链接&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击“公式——名称管理器”，选中引用了需要删除的项目和有&lt;code&gt;#REF&lt;/code&gt;的项目，点击删除&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;更改格式，将&lt;code&gt;xlsx&lt;/code&gt;格式的表格另存为&lt;code&gt;xls&lt;/code&gt;格式后，链接自动消失，如有需要再另存为&lt;code&gt;xlsx&lt;/code&gt;格式&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="断开顽固外部链接"&gt;断开顽固外部链接
&lt;/h2&gt;&lt;p&gt;EXCEL本质上是一个压缩文件，直接使用压缩软件打开解压：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用vscode或者其他文本编辑器打开&lt;code&gt;xlworksheets&lt;/code&gt;中各个SHEET的XML文件，找到你需要断开的链接，并将&lt;code&gt;&amp;lt;extLst&amp;gt;.........&amp;lt;/extLst&amp;gt;&lt;/code&gt;删掉，CTRL+S保存；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将&lt;code&gt;xlexternalLinks_rels&lt;/code&gt;中的文件删除；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将原文件夹重新压缩成zip格式，并将后缀名改回原来的后缀&lt;code&gt;xls,xlsx,xlsm&lt;/code&gt;；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;打开表格后会提示需要修复，选择“是”，保存即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>硬盘SMART检测参数详解</title><link>http://sergget.qzz.io/posts/20210518-01/</link><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20210518-01/</guid><description>&lt;hr&gt;
&lt;p&gt;本文转自：&lt;a class="link" href="https://www.cnblogs.com/xqzt/p/5512075.html" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/xqzt/p/5512075.html&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="一smart概述"&gt;&lt;strong&gt;一、SMART概述&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;​ 要说Linux用户最不愿意看到的事情，莫过于在毫无警告的情况下发现硬盘崩溃了。诸如RAID的备份和存储技术可以在任何时候帮用户恢复数据，但为预防硬件崩溃造成数据丢失所花费的代价却是相当可观的，特别是在用户从来没有提前考虑过在这些情况下的应对措施时。&lt;/p&gt;
&lt;p&gt;硬盘的故障一般分为两种：可预测的（predictable）和不可预测的（unpredictable）。后者偶而会发生，也没有办法去预防它，例如芯片突然失效，机械撞击等。但像电机轴承磨损、盘片磁介质性能下降等都属于可预测的情况，可以在在几天甚至几星期前就发现这种不正常的现象。&lt;/p&gt;
&lt;p&gt;​ 对于可预测的情况，如果能通过磁盘监控技术，通过测量硬盘的几个重要的安全参数和评估他们的情况，然后由监控软件得出两种结果：“硬盘安全”或“不久后会发生故障”。那么在发生故障前，至少有足够的时间让使用者把重要资料转移到其它储存设备上。&lt;/p&gt;
&lt;p&gt;最早期的硬盘监控技术起源于1992年，IBM在AS/400计算机的IBM 0662 SCSI 2代硬盘驱动器中使用了后来被命名为Predictive Failure Analysis（故障预警分析技术）的监控技术，它是通过在固件中测量几个重要的硬盘安全参数和评估他们的情况，然后由监控软件得出两种结果：“硬盘安全”或“不久后会发生故障”。&lt;/p&gt;
&lt;p&gt;不久，当时的微机制造商康柏和硬盘制造商希捷、昆腾以及康纳共同提出了名为IntelliSafe的类似技术。通过该技术，硬盘可以测量自身的的健康指标并将参量值传送给操作系统和用户的监控软件中，每个硬盘生产商有权决定哪些指标需要被监控以及设定它们的安全阈值。&lt;/p&gt;
&lt;p&gt;1995年，康柏公司将该技术方案提交到Small Form Factor(SFF)委员会进行标准化，该方案得到IBM、希捷、昆腾、康纳和西部数据的支持，1996年6月进行了1.3版的修正，正式更名为S.M.A.R.T.（Self-Monitoring Analysis And Reporting Technology），全称就是“自我检测分析与报告技术”，成为一种自动监控硬盘驱动器完好状况和报告潜在问题的技术标准。&lt;/p&gt;
&lt;p&gt;SMART的目的是监控硬盘的可靠性、预测磁盘故障和执行各种类型的磁盘自检。如今大部分的ATA/SATA、SCSI/SAS和固态硬盘都搭载内置的SMART系统。作为行业规范，SMART规定了硬盘制造厂商应遵循的标准，满足SMART标准的条件主要包括：&lt;/p&gt;
&lt;p&gt;1）在设备制造期间完成SMART需要的各项参数、属性的设定；&lt;/p&gt;
&lt;p&gt;2）在特定系统平台下，能够正常使用SMART；通过BIOS检测，能够识别设备是否支持SMART并可显示相关信息，而且能辨别有效和失效的SMART信息；&lt;/p&gt;
&lt;p&gt;3）允许用户自由开启和关闭SMART功能；&lt;/p&gt;
&lt;p&gt;4）在用户使用过程中，能提供SMART的各项有效信息，确定设备的工作状态，并能发出相应的修正指令或警告。在硬盘及操作系统都支持SMART技术并且开启的情况下，若硬盘状态不良，SMART功能会在开机时响起警报，SMART技术能够在屏幕上显示英文警告信息：“WARNING IMMEDIATLY BACKUP YOUR DATA AND REPLACE YOUR HARD DISK DRIVE，A FAILURE MAY BE IMMINENT．”(警告：立刻备份你的数据并更换硬盘，硬盘可能失效。)&lt;/p&gt;
&lt;p&gt;SMART功能不断从硬盘上的各个传感器收集信息，并把信息保存在硬盘的系统保留区(service area)内，这个区域一般位于硬盘0物理面的最前面几十个物理磁道，由厂商写入相关的内部管理程序。这里除了SMART信息表外还包括低级格式化程序、加密解密程序、自监控程序、自动修复程序等。用户使用的监测软件通过名为“SMART Return Status”的命令（命令代码为：B0h）对SMART信息进行读取，且不允许最终用户对信息进行修改。&lt;/p&gt;
&lt;p&gt;smartmontools是smart的的软件包程序，由smartctl和smartd两部分工具程序组成，它们一起为Linux平台提供对磁盘退化和故障的高级警告。&lt;/p&gt;
&lt;h3 id="二smart信息解读"&gt;&lt;strong&gt;二、smart信息解读&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="441px" data-flex-grow="183" height="634" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210518-01/computer-smartctl-01.png" srcset="http://sergget.qzz.io/posts/20210518-01/computer-smartctl-01_hu_b3b55d7154cd731e.png 800w, http://sergget.qzz.io/posts/20210518-01/computer-smartctl-01.png 1165w" width="1165"&gt;&lt;/p&gt;
&lt;h4 id="id"&gt;&lt;strong&gt;ID&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;属性ID，通常是一个1到255之间的十进制或十六进制的数字。硬盘SMART检测的ID代码以两位十六进制数表示（括号里对应的是十进制数）硬盘的各项检测参数。目前，各硬盘制造商的绝大部分SMART ID代码所代表的参数含义是一致的，但厂商也可以根据需要使用不同的ID代码，或者根据检测项目的多少增减ID代码。一般来说，以下这些检测项是必需的：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;01（001） Raw_Read_Error_Rate 底层数据读取错误率 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;04（004） Start_Stop_Count 启动/停止计数 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;05（005） Reallocated_Sector_Ct 重映射扇区数 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;09（009） Power_On_Hours 通电时间累计，出厂后通电的总时间，一般磁盘寿命三万小时 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0A（010） Spin_Retry_Count 主轴起旋重试次数（即硬盘主轴电机启动重试次数） 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0B（011） Calibration_Retry_Count 磁盘校准重试次数 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0C（012） Power_Cycle_Count 磁盘通电次数 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C2（194） Temperature_Celsius 温度 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C7（199） UDMA_CRC_Error_Count 奇偶校验错误率 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C8（200） Write_Error_Rate: 写错误率 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;F1（241） Total_LBAs_Written：表示磁盘自出厂总共写入的的数据，单位是LBAS=512Byte 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;F2（242） Total_LBAs_Read：表示磁盘自出厂总共读取的数据，单位是LBAS=512Byte 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="attribute_name"&gt;&lt;strong&gt;ATTRIBUTE_NAME&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;硬盘制造商定义的属性名。，即某一检测项目的名称，是ID代码的文字解释。&lt;/p&gt;
&lt;h4 id="flag"&gt;&lt;strong&gt;FLAG&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;属性操作标志（可以忽略）&lt;/p&gt;
&lt;h4 id="当前值value"&gt;&lt;em&gt;当前值（value）&lt;/em&gt;
&lt;/h4&gt;&lt;p&gt;当前值是各ID项在硬盘运行时根据实测原始数据（Raw value）通过公式计算的结果，1到253之间。253意味着最好情况，1意味着最坏情况。计算公式由硬盘厂家自定。&lt;/p&gt;
&lt;p&gt;硬盘出厂时各ID项目都有一个预设的最大正常值，也即出厂值，这个预设的依据及计算方法为硬盘厂家保密，不同型号的硬盘都不同，最大正常值通常为100或200或253，新硬盘刚开始使用时显示的当前值可以认为是预设的最大正常值（有些ID项如温度等除外）。随着使用损耗或出现错误，当前值会根据实测数据而不断刷新并逐渐减小。因此，当前值接近临界值就意味着硬盘寿命的减少，发生故障的可能性增大，所以当前值也是判定硬盘健康状态或推测寿命的依据之一。&lt;/p&gt;
&lt;h4 id="最差值worst"&gt;&lt;strong&gt;最差值（Worst）&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;最差值是硬盘运行时各ID项曾出现过的最小的value。&lt;br&gt;
最差值是对硬盘运行中某项数据变劣的峰值统计，该数值也会不断刷新。通常，最差值与当前值是相等的，如果最差值出现较大的波动（小于当前值），表明硬盘曾出现错误或曾经历过恶劣的工作环境（如温度）。&lt;/p&gt;
&lt;h4 id="临界值threshold"&gt;&lt;strong&gt;临界值（Threshold）&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;在报告硬盘FAILED状态前，WORST可以允许的最小值。&lt;/p&gt;
&lt;p&gt;临界值是硬盘厂商指定的表示某一项目可靠性的门限值，也称阈值，它通过特定公式计算而得。如果某个参数的当前值接近了临界值，就意味着硬盘将变得不可靠，可能导致数据丢失或者硬盘故障。由于临界值是硬盘厂商根据自己产品特性而确定的，因此用厂商提供的专用检测软件往往会跟Windows下检测软件的检测结果有较大出入。&lt;/p&gt;
&lt;p&gt;硬盘的每项SMART信息中都有一个临界值（阈值），不同硬盘的临界值是不同的，SMART针对各项的当前值、最差值和临界值的比较结果以及数据值进行分析后，提供硬盘当前的评估状态，也是我们直观判断硬盘健康状态的重要信息。根据SMART的规定，状态一般有正常、警告、故障或错误三种状态。&lt;/p&gt;
&lt;p&gt;SMART判定这三个状态与SMART的 Pre-failure/advisory BIT（预测错误/发现位）参数的赋值密切相关，当Pre-failure/advisory BIT=0，并且当前值、最差值远大于临界值的情况下，为正常标志。当Pre-failure/advisory BIT=0，并且当前值、最差值大于但接近临界值时，为警告标志；当Pre-failure/advisory BIT=1，并且当前值、最差值小于临界值时，为故障或错误标志&lt;/p&gt;
&lt;h4 id="原始值raw_value"&gt;&lt;strong&gt;原始值(RAW_VALUE)&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;制造商定义的原始值，从VALUE派生。&lt;/p&gt;
&lt;p&gt;数据值是硬盘运行时各项参数的实测值，大部分SMART工具以十进制显示数据。&lt;br&gt;
数据值代表的意义随参数而定，大致可以分为三类：&lt;br&gt;
1）数据值并不直接反映硬盘状态，必须经过硬盘内置的计算公式换算成当前值才能得出结果；&lt;br&gt;
2）数据值是直接累计的，如Start/Stop Count（启动/停止计数）的数据是50，即表示该硬盘从出厂到现在累计启停了50次；&lt;br&gt;
3）有些参数的数据是即时数，如Temperature（温度）的数据值是44，表示硬盘的当前温度是44℃。&lt;br&gt;
因此，有些参数直接查看数据也能大致了解硬盘目前的工作状态。&lt;/p&gt;
&lt;h4 id="type"&gt;&lt;strong&gt;TYPE&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;属性的类型（Pre-fail或Oldage）。Pre-fail类型的属性可被看成一个关键属性，表示参与磁盘的整体SMART健康评估（PASSED/FAILED）。如果任何Pre-fail类型的属性故障，那么可视为磁盘将要发生故障。另一方面，Oldage类型的属性可被看成一个非关键的属性（如正常的磁盘磨损），表示不会使磁盘本身发生故障。&lt;/p&gt;
&lt;h4 id="updated"&gt;&lt;strong&gt;UPDATED&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;表示属性的更新频率。Offline代表磁盘上执行离线测试的时间。&lt;/p&gt;
&lt;h4 id="when_failed"&gt;&lt;strong&gt;WHEN_FAILED&lt;/strong&gt;
&lt;/h4&gt;&lt;p&gt;如果VALUE小于等于THRESH，会被设置成“FAILING_NOW”；如果WORST小于等于THRESH会被设置成“In_the_past”；如果都不是，会被设置成“-”。在“FAILING_NOW”情况下，需要尽快备份重要 文件，特别是属性是Pre-fail类型时。“In_the_past”代表属性已经故障了，但在运行测试的时候没问题。“-”代表这个属性从没故障过。&lt;/p&gt;
&lt;h3 id="三smart参数详解"&gt;&lt;strong&gt;三、SMART参数详解&lt;/strong&gt;
&lt;/h3&gt;&lt;p&gt;一般情况下，用户只要观察当前值、最差值和临界值的关系，并注意状态提示信息即可大致了解硬盘的健康状况。下面简单介绍各参数的含义，以红色标出的项目是寿命关键项，蓝色为固态硬盘（SSD）特有的项目。&lt;br&gt;
在基于闪存的固态硬盘中，存储单元分为两类：SLC（Single Layer Cell，单层单元）和MLC（Multi-Level Cell，多层单元）。SLC成本高、容量小、但读写速度快，可靠性高，擦写次数可高达100000次，比MLC高10倍。而MLC虽容量大、成本低，但其性能大幅落后于SLC。为了保证MLC的寿命，控制芯片还要有智能磨损平衡技术算法，使每个存储单元的写入次数可以平均分摊，以达到100万小时的平均无故障时间。因此固态硬盘有许多SMART参数是机械硬盘所没有的，如存储单元的擦写次数、备用块统计等等，这些新增项大都由厂家自定义，有些尚无详细的解释，有些解释也未必准确，此处也只是仅供参考。下面凡未注明厂商的固态硬盘特有的项均为SandForce主控芯片特有的，其它厂商各自单独注明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;01（001）底层数据读取错误率 Raw Read Error Rate&lt;/strong&gt;&lt;br&gt;
数据为0或任意值，当前值应远大于与临界值。&lt;br&gt;
底层数据读取错误率是磁头从磁盘表面读取数据时出现的错误，对某些硬盘来说，大于0的数据表明磁盘表面或者读写磁头发生问题，如介质损伤、磁头污染、磁头共振等等。不过对希捷硬盘来说，许多硬盘的这一项会有很大的数据量，这不代表有任何问题，主要是看当前值下降的程度。&lt;br&gt;
在固态硬盘中，此项的数据值包含了可校正的错误与不可校正的RAISE错误（UECC＋URAISE）。&lt;/p&gt;
&lt;p&gt;注：RAISE（Redundant Array of Independent Silicon Elements）意为独立硅元素冗余阵列，是固态硬盘特有的一种冗余恢复技术，保证内部有类似RAID阵列的数据安全性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;02（002）磁盘读写通量性能 Throughput Performance&lt;/strong&gt;&lt;br&gt;
此参数表示硬盘的读写通量性能，数据值越大越好。当前值如果偏低或趋近临界值，表示硬盘存在严重的问题，但现在的硬盘通常显示数据值为0或根本不显示此项，一般在进行了人工脱机SMART测试后才会有数据量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;03（003）主轴起旋时间 Spin Up Time&lt;/strong&gt;&lt;br&gt;
主轴起旋时间就是主轴电机从启动至达到额定转速所用的时间，数据值直接显示时间，单位为毫秒或者秒，因此数据值越小越好。不过对于正常硬盘来说，这一项仅仅是一个参考值，硬盘每次的启动时间都不相同，某次启动的稍慢些也不表示就有问题。&lt;br&gt;
硬盘的主轴电机从启动至达到额定转速大致需要4秒～15秒左右，过长的启动时间说明电机驱动电路或者轴承机构有问题。旦这一参数的数据值在某些型号的硬盘上总是为0，这就要看当前值和最差值来判断了。&lt;br&gt;
对于固态硬盘来说，所有的数据都是保存在半导体集成电路中，没有主轴电机，所以这项没有意义，数据固定为0，当前值固定为100。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;04（004）启停计数 Start/Stop Count&lt;/strong&gt;&lt;br&gt;
这一参数的数据是累计值，表示硬盘主轴电机启动/停止的次数，新硬盘通常只有几次，以后会逐渐增加。系统的某些功能如空闲时关闭硬盘等会使硬盘启动/停止的次数大为增加，在排除定时功能的影响下，过高的启动/停止次数（远大于通电次数0C）暗示硬盘电机及其驱动电路可能有问题。&lt;br&gt;
这个参数的当前值是依据某种公式计算的结果，例如对希捷某硬盘来说临界值为20，当前值是通过公式“100－（启停计数/1024）”计算得出的。若新硬盘的启停计数为0，当前值为100－(0/1024)＝100，随着启停次数的增加，该值不断下降，当启停次数达到81920次时，当前值为100－(81920/1024)＝20，已达到临界值，表示从启停次数来看，该硬盘已达设计寿命，当然这只是个寿命参考值，并不具有确定的指标性。&lt;br&gt;
这一项对于固态硬盘同样没有意义，数据固定为0，当前值固定为100。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;05（005）重映射扇区计数 Reallocated Sectors Count/ 退役块计数 Retired Block Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于临界值。&lt;br&gt;
当硬盘的某扇区持续出现读/写/校验错误时，硬盘固件程序会将这个扇区的物理地址加入缺陷表(G-list)，将该地址重新定向到预先保留的备用扇区并将其中的数据一并转移，这就称为重映射。执行重映射操作后的硬盘在Windows常规检测中是无法发现不良扇区的，因其地址已被指向备用扇区，这等于屏蔽了不良扇区。&lt;br&gt;
这项参数的数据值直接表示已经被重映射扇区的数量，当前值则随着数据值的增加而持续下降。当发现此项的数据值不为零时，要密切注意其发展趋势，若能长期保持稳定，则硬盘还可以正常运行；若数据值不断上升，说明不良扇区不断增加，硬盘已处于不稳定状态，应当考虑更换了。如果当前值接近或已到达临界值（此时的数据值并不一定很大，因为不同硬盘保留的备用扇区数并不相同），表示缺陷表已满或备用扇区已用尽，已经失去了重映射功能，再出现不良扇区就会显现出来并直接导致数据丢失。&lt;br&gt;
这一项不仅是硬盘的寿命关键参数，而且重映射扇区的数量也直接影响硬盘的性能，例如某些硬盘会出现数据量很大，但当前值下降不明显的情况，这种硬盘尽管还可正常运行，但也不宜继续使用。因为备用扇区都是位于磁盘尾部（靠近盘片轴心处），大量的使用备用扇区会使寻道时间增加，硬盘性能明显下降。&lt;br&gt;
这个参数在机械硬盘上是非常敏感的，而对于固态硬盘来说同样具有重要意义。闪存的寿命是正态分布的，例如说MLC能写入一万次以上，实际上说的是写入一万次之前不会发生“批量损坏”，但某些单元可能写入几十次就损坏了。换言之，机械硬盘的盘片不会因读写而损坏，出现不良扇区大多与工艺质量相关，而闪存的读写次数则是有限的，因而损坏是正常的。所以固态硬盘在制造时也保留了一定的空间，当某个存储单元出现问题后即把损坏的部分隔离，用好的部分来顶替。这一替换方法和机械硬盘的扇区重映射是一个道理，只不过机械硬盘正常时极少有重映射操作，而对于固态硬盘是经常性的。&lt;br&gt;
在固态硬盘中这一项的数据会随着使用而不断增长，只要增长的速度保持稳定就可以。通常情况下，数据值＝100－（100×被替换块/必需块总数），因此也可以估算出硬盘的剩余寿命。&lt;br&gt;
Intel固态硬盘型号的第十二个字母表示了两种规格，该字母为1表示第一代的50纳米技术的SSD，为2表示第二代的34纳米技术的SSD，如SSDSA2M160G2GN就表示是34nm的SSD。所以参数的查看也有两种情况：&lt;br&gt;
50nm的SSD（一代）要看当前值。这个值初始是100，当出现替换块的时候这个值并不会立即变化，一直到已替换四个块时这个值变为1，之后每增加四个块当前值就＋1。也就是100对应0～3个块，1对应4～7个块，2对应8～11个块……&lt;br&gt;
34nm的SSD（二代）直接查看数据值，数据值直接表示有多少个被替换的块。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;06（006）读取通道余量 Read Channel Margin&lt;/strong&gt;&lt;br&gt;
这一项功能不明，现在的硬盘也不显示这一项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;07（007）寻道错误率 Seek Error Rate&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于与临界值。&lt;br&gt;
这一项表示磁头寻道时的错误率，有众多因素可导致寻道错误率上升，如磁头组件的机械系统、伺服电路有局部问题，盘片表面介质不良，硬盘温度过高等等。&lt;br&gt;
通常此项的数据应为0，但对希捷硬盘来说，即使是新硬盘，这一项也可能有很大的数据量，这不代表有任何问题，还是要看当前值是否下降。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;08（008）寻道性能 Seek Time Performance&lt;/strong&gt;&lt;br&gt;
此项表示硬盘寻道操作的平均性能（寻道速度），通常与前一项（寻道错误率）相关联。当前值持续下降标志着磁头组件、寻道电机或伺服电路出现问题，但现在许多硬盘并不显示这一项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;09（009）通电时间累计 Power-On Time Count (POH)&lt;/strong&gt;&lt;br&gt;
这个参数的含义一目了然，表示硬盘通电的时间，数据值直接累计了设备通电的时长，新硬盘当然应该接近0，但不同硬盘的计数单位有所不同，有以小时计数的，也有以分、秒甚至30秒为单位的，这由磁盘制造商来定义。&lt;br&gt;
这一参数的临界值通常为0，当前值随着硬盘通电时间增加会逐渐下降，接近临界值表明硬盘已接近预计的设计寿命，当然这并不表明硬盘将出现故障或立即报废。参考磁盘制造商给出的该型号硬盘的MTBF（平均无故障时间）值，可以大致估计剩余寿命或故障概率。&lt;br&gt;
对于固态硬盘，要注意“设备优先电源管理功能（device initiated power management，DIPM）”会影响这个统计：如果启用了DIPM，持续通电计数里就不包括睡眠时间；如果关闭了DIPM功能，那么活动、空闲和睡眠三种状态的时间都会被统计在内。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;0A（010）主轴起旋重试次数 Spin up Retry Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应大于临界值。&lt;br&gt;
主轴起旋重试次数的数据值就是主轴电机尝试重新启动的计数，即主轴电机启动后在规定的时间里未能成功达到额定转速而尝试再次启动的次数。数据量的增加表示电机驱动电路或是机械子系统出现问题，整机供电不足也会导致这一问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;0B（011）磁头校准重试计数 Calibration Retry Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于与临界值。&lt;br&gt;
硬盘在温度发生变化时，机械部件（特别是盘片）会因热胀冷缩出现形变，因此需要执行磁头校准操作消除误差，有的硬盘还内置了磁头定时校准功能。这一项记录了需要再次校准（通常因上次校准失败）的次数。&lt;br&gt;
这一项的数据量增加，表示电机驱动电路或是机械子系统出现问题，但有些型号的新硬盘也有一定的数据量，并不表示有问题，还要看当前值和最差值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;0C（012）通电周期计数 Power Cycle Count&lt;/strong&gt;&lt;br&gt;
通电周期计数的数据值表示了硬盘通电/断电的次数，即电源开关次数的累计，新硬盘通常只有几次。&lt;br&gt;
这一项与启停计数（04）是有区别的，一般来说，硬盘通电/断电意味着计算机的开机与关机，所以经历一次开关机数据才会加1；而启停计数（04）表示硬盘主轴电机的启动/停止（硬盘在运行时可能多次启停，如系统进入休眠或被设置为空闲多少时间而关闭）。所以大多情况下这个通电/断电的次数会小于启停计数（04）的次数。&lt;/p&gt;
&lt;p&gt;通常，硬盘设计的通电次数都很高，如至少5000次，因此这一计数只是寿命参考值，本身不具指标性。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;0D（013）软件读取错误率 Soft Read Error Rate&lt;/strong&gt;&lt;br&gt;
软件读取错误率也称为可校正的读取误码率，就是报告给操作系统的未经校正的读取错误。数据值越低越好，过高则可能暗示盘片磁介质有问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AA（170）坏块增长计数 Grown Failing Block Count（Micron 镁光）&lt;/strong&gt;&lt;br&gt;
读写失败的块增长的总数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AB（171）编程失败块计数 Program Fail Block Count&lt;/strong&gt;&lt;br&gt;
Flash编程失败块的数量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AC（172）擦写失败块计数 Erase Fail Block Count&lt;/strong&gt;&lt;br&gt;
擦写失败块的数量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AD（173）磨损平衡操作次数（平均擦写次数） / Wear Leveling Count（Micron 镁光）&lt;/strong&gt;&lt;br&gt;
所有好块的平均擦写次数。&lt;br&gt;
Flash芯片有写入次数限制，当使用FAT文件系统时，需要频繁地更新文件分配表。如果闪存的某些区域读写过于频繁，就会比其它区域磨损的更快，这将明显缩短整个硬盘的寿命（即便其它区域的擦写次数还远小于最大限制）。所以，如果让整个区域具有均匀的写入量，就可明显延长芯片寿命，这称为磨损均衡措施。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AE（174）意外失电计数 Unexpected Power Loss Count&lt;/strong&gt;&lt;br&gt;
硬盘自启用后发生意外断电事件的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B1（177）磨损范围对比值 Wear Range Delta&lt;/strong&gt;&lt;br&gt;
磨损最重的块与磨损最轻的块的磨损百分比之差。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B4（180）未用的备用块计数 Unused Reserved Block Count Total（惠普）&lt;/strong&gt;&lt;br&gt;
固态硬盘会保留一些容量来准备替换损坏的存储单元，所以可用的预留空间数非常重要。这个参数的当前值表示的是尚未使用的预留的存储单元数量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B5（181）编程失败计数 Program Fail Count&lt;/strong&gt;&lt;br&gt;
用4个字节显示已编程失败的次数，与（AB）参数相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B5（181）非4KB对齐访问数 Non-4k Aligned Access（Micron 镁光）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B6（182）擦写失败计数 Erase Fail Count&lt;/strong&gt;&lt;br&gt;
用4个字节显示硬盘自启用后块擦写失败的次数，与（AC）参数相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B7（183）串口降速错误计数 SATA Downshift Error Count&lt;/strong&gt;&lt;br&gt;
这一项表示了SATA接口速率错误下降的次数。通常硬盘与主板之间的兼容问题会导致SATA传输级别降级运行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B8（184）I/O错误检测与校正 I/O Error Detection and Correction（IOEDC）&lt;/strong&gt;&lt;br&gt;
“I/O错误检测与校正”是惠普公司专有的SMART IV技术的一部分，与其他制造商的I/O错误检测和校正架构一样，它记录了数据通过驱动器内部高速缓存RAM传输到主机时的奇偶校验错误数量。&lt;br&gt;
B8（184）点到点错误检测计数 End to End Error Detection Count&lt;br&gt;
Intel第二代的34nm固态硬盘有点到点错误检测计数这一项。固态硬盘里有一个LBA（logical block addressing，逻辑块地址）记录，这一项显示了SSD内部逻辑块地址与真实物理地址间映射的出错次数。&lt;br&gt;
B8（184）原始坏块数 Init Bad Block Count（Indilinx芯片）&lt;br&gt;
硬盘出厂时已有的坏块数量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B9（185）磁头稳定性 Head Stability（西部数据）&lt;/strong&gt;&lt;br&gt;
意义不明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BA（186）感应运算振动检测 nduced Op-Vibration Detection（西部数据）&lt;/strong&gt;&lt;br&gt;
意义不明。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BB（187）无法校正的错误 Reported Uncorrectable Errors（希捷）&lt;/strong&gt;&lt;br&gt;
报告给操作系统的无法通过硬件ECC校正的错误。如果数据值不为零，就应该备份硬盘上的数据了。&lt;br&gt;
报告给操作系统的在所有存取命令中出现的无法校正的RAISE（URAISE）错误。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BC（188）命令超时 Command Timeout&lt;/strong&gt;&lt;br&gt;
由于硬盘超时导致操作终止的次数。通常数据值应为0，如果远大于零，最有可能出现的是电源供电问题或者数据线氧化致使接触不良，也可能是硬盘出现严重问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BD（189）高飞写入 High Fly Writes&lt;/strong&gt;&lt;br&gt;
磁头飞行高度监视装置可以提高读写的可靠性，这一装置时刻监测磁头的飞行高度是否在正常范围来保证可靠的写入数据。如果磁头的飞行高度出现偏差，写入操作就会停止，然后尝试重新写入或者换一个位置写入。这种持续的监测过程提高了写入数据的可靠性，同时也降低了读取错误率。这一项的数据值就统计了写入时磁头飞行高度出现偏差的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BD（189）出厂坏块计数 Factory Bad Block Count（Micron 镁光芯片）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BE（190）气流温度 Airflow Temperature&lt;/strong&gt;&lt;br&gt;
这一项表示的是硬盘内部盘片表面的气流温度。在希捷公司的某些硬盘中，当前值=（100－当前温度），因此气流温度越高，当前值就越低，最差值则是当前值曾经到达过的最低点，临界值由制造商定义的最高允许温度来确定，而数据值不具实际意义。许多硬盘也没有这一项参数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BF（191）冲击错误率 G-sense error rate&lt;/strong&gt;&lt;br&gt;
这一项的数据值记录了硬盘受到机械冲击导致出错的频度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C0（192）断电返回计数 Power-Off Retract Count&lt;/strong&gt;&lt;br&gt;
当计算机关机或意外断电时，硬盘的磁头都要返回停靠区，不能停留在盘片的数据区里。正常关机时电源会给硬盘一个通知，即Standby Immediate，就是说主机要求将缓存数据写入硬盘，然后就准备关机断电了（休眠、待机也是如此）；意外断电则表示硬盘在未收到关机通知时就失电，此时磁头会自动复位，迅速离开盘片。&lt;br&gt;
这个参数的数据值累计了磁头返回的次数。但要注意这个参数对某些硬盘来说仅记录意外断电时磁头的返回动作；而某些硬盘记录了所有（包括休眠、待机，但不包括关机时）的磁头返回动作；还有些硬盘这一项没有记录。因此这一参数的数据值在某些硬盘上持续为0或稍大于0，但在另外的硬盘上则会大于通电周期计数（0C）或启停计数（04）的数据。在一些新型节能硬盘中，这一参数的数据量还与硬盘的节能设计相关，可能会远大于通电周期计数（0C）或启停计数（04）的数据，但又远小于磁头加载/卸载计数（C1）的数据量。&lt;br&gt;
对于固态硬盘来说，虽然没有磁头的加载/卸载操作，但这一项的数据量仍然代表了不安全关机，即发生意外断电的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C1（193）磁头加载/卸载计数 Load/Unload Cycle Count&lt;/strong&gt;&lt;br&gt;
对于过去的硬盘来说，盘片停止旋转时磁头臂停靠于盘片中心轴处的停泊区，磁头与盘片接触，只有当盘片旋转到一定转速时，磁头才开始漂浮于盘片之上并开始向外侧移动至数据区。这使得磁头在硬盘启停时都与盘片发生摩擦，虽然盘片的停泊区不存储数据，但无疑启停一个循环，就使磁头经历两次磨损。所以对以前的硬盘来说，磁头起降（加载/卸载）次数是一项重要的寿命关键参数。&lt;/p&gt;
&lt;p&gt;而在现代硬盘中，平时磁头臂是停靠于盘片之外的一个专门设计的停靠架上，远离盘片。只有当盘片旋转达到额定转速后，磁头臂才开始向内（盘片轴心）转动使磁头移至盘片区域（加载），磁头臂向外转动返回至停靠架即卸载。这样就彻底杜绝了硬盘启停时磁头与盘片接触的现象，西部数据公司将其称为“斜坡加载技术”。由于磁头在加载/卸载过程中始终不与盘片接触，不存在磁头的磨损，使得这一参数的重要性已经大大下降。&lt;/p&gt;
&lt;p&gt;这个参数的数据值就是磁头执行加载/卸载操作的累计次数。从原理上讲，这个加载/卸载次数应当与硬盘的启停次数相当，但对于笔记本内置硬盘以及台式机新型节能硬盘来说，这一项的数据量会很大。这是因为磁头臂组件设计有一个固定的返回力矩，保证在意外断电时磁头能靠弹簧力自动离开盘片半径范围，迅速返回停靠架。所以要让硬盘运行时磁头保持在盘片的半径之内，就要使磁头臂驱动电机（寻道电机）持续通以电流。而让磁头臂在硬盘空闲几分钟后就立即执行卸载动作，返回到停靠架上，既有利于节能，又降低了硬盘受外力冲击导致磁头与盘片接触的概率。虽然再次加载会增加一点寻道时间，但毕竟弊大于利，所以在这类硬盘中磁头的加载/卸载次数会远远大于通电周期计数（0C）或启停计数（04）的数据量。不过这种加载/卸载方式已经没有了磁头与盘片的接触，所以设计值也已大大增加，通常笔记本内置硬盘的磁头加载/卸载额定值在30～60万次，而台式机新型节能硬盘的磁头加载/卸载设计值可达一百万次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C2（194）温度 Temperature&lt;/strong&gt;&lt;br&gt;
温度的数据值直接表示了硬盘内部的当前温度。硬盘运行时最好不要超过45℃，温度过高虽不会导致数据丢失，但引起的机械变形会导致寻道与读写错误率上升，降低硬盘性能。硬盘的最高允许运行温度可查看硬盘厂商给出的数据，一般不会超过60℃。&lt;br&gt;
不同厂家对温度参数的当前值、最差值和临界值有不同的表示方法：希捷公司某些硬盘的当前值就是实际温度（摄氏）值，最差值则是曾经达到过的最高温度，临界值不具意义；而西部数据公司一些硬盘的最差值是温度上升到某值后的时间函数，每次升温后的持续时间都将导致最差值逐渐下降，当前值则与当前温度成反比，即当前温度越高，当前值越低，随实际温度波动。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C3（195）硬件ECC校正 Hardware ECC Recovered&lt;/strong&gt;&lt;br&gt;
ECC（Error Correcting Code）的意思是“错误检查和纠正”，这个技术能够容许错误，并可以将错误更正，使读写操作得以持续进行，不致因错误而中断。这一项的数据值记录了磁头在盘片上读写时通过ECC技术校正错误的次数，不过许多硬盘有其制造商特定的数据结构，因此数据量的大小并不能直接说明问题。&lt;br&gt;
C3（195）实时无法校正错误计数 On the fly ECC Uncorrectable Error Count&lt;br&gt;
这一参数记录了无法校正（UECC）的错误数量。&lt;br&gt;
C3（195）编程错误块计数 Program Failure block Count（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C4（196）重映射事件计数 Reallocetion Events Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于临界值。&lt;br&gt;
这个参数的数据值记录了将重映射扇区的数据转移到备用扇区的尝试次数，是重映射操作的累计值，成功的转移和不成功的转移都会被计数。因此这一参数与重映射扇区计数（05）相似，都是反映硬盘已经存在不良扇区。&lt;br&gt;
C4（196）擦除错误块计数 Erase Failure block Count（Indilinx芯片）&lt;br&gt;
在固态硬盘中，这一参数记录了被重映射的块编程失败的数量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C5（197）当前待映射扇区计数 Current Pending Sector Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于临界值。&lt;br&gt;
这个参数的数据表示了“不稳定的”扇区数，即等待被映射的扇区（也称“被挂起的扇区”）数量。如果不稳定的扇区随后被读写成功，该扇区就不再列入等待范围，数据值就会下降。&lt;br&gt;
仅仅读取时出错的扇区并不会导致重映射，只是被列入“等待”，也许以后读取就没有问题，所以只有在写入失败时才会发生重映射。下次对该扇区写入时如果继续出错，就会产生一次重映射操作，此时重映射扇区计数（05）与重映射事件计数（C4）的数据值增加，此参数的数据值下降。&lt;br&gt;
C5（197）读取错误块计数（不可修复错误）Read Failure block Count（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C6（198）脱机无法校正的扇区计数 Offline Uncorrectable Sector Count&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于临界值。&lt;br&gt;
这个参数的数据累计了读写扇区时发生的无法校正的错误总数。数据值上升表明盘片表面介质或机械子系统出现问题，有些扇区肯定已经不能读取，如果有文件正在使用这些扇区，操作系统会返回读盘错误的信息。下一次写操作时会对该扇区执行重映射。&lt;br&gt;
C6（198）总读取页数 Total Count of Read Sectors（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C7（199）Ultra ATA访问校验错误率 Ultra ATA CRC Error Rate&lt;/strong&gt;&lt;br&gt;
这个参数的数据值累计了通过接口循环冗余校验（Interface Cyclic Redundancy Check，ICRC）发现的数据线传输错误的次数。如果数据值不为0且持续增长，表示硬盘控制器→数据线→硬盘接口出现错误，劣质的数据线、接口接触不良都可能导致此现象。由于这一项的数据值不会复零，所以某些新硬盘也会出现一定的数据量，只要更换数据线后数据值不再继续增长，即表示问题已得到解决。&lt;br&gt;
C7（199）总写入页数 Total Count of Write Sectors（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C8（200）写入错误率 Write Error Rate / 多区域错误率 Multi-Zone Error Rate（西部数据）&lt;/strong&gt;&lt;br&gt;
数据应为0，当前值应远大于临界值。&lt;br&gt;
这个参数的数据累计了向扇区写入数据时出现错误的总数。有的新硬盘也会有一定的数据量，若数据值持续快速升高（当前值偏低），表示盘片、磁头组件可能有问题。&lt;br&gt;
C8（200）总读取指令数 Total Count of Read Command（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C9（201）脱道错误率 Off Track Error Rate / 逻辑读取错误率 Soft Read Error Rate&lt;/strong&gt;&lt;br&gt;
数据值累积了读取时脱轨的错误数量，如果数据值不为0，最好备份硬盘上的资料。&lt;br&gt;
C9（201）TA Counter Detected（意义不明）&lt;br&gt;
C9（201）写入指令总数 Total Count of Write Command（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CA（202）数据地址标记错误 Data Address Mark errors&lt;/strong&gt;&lt;br&gt;
此项的数据值越低越好（或者由制造商定义）。&lt;br&gt;
CA（202）TA Counter Increased（意义不明）&lt;br&gt;
CA（202）剩余寿命 Percentage Of The Rated Lifetime Used（Micron 镁光芯片）&lt;br&gt;
当前值从100开始下降至0，表示所有块的擦写余量统计。计算方法是以MLC擦写次数除以50，SLC擦写次数除以1000，结果取整数，将其与100的差值作为当前值（MLC预计擦写次数为5000，SLC预计擦写次数为100000）。&lt;br&gt;
CA（202）闪存总错误bit数 Total Count of error bits from flash（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CB（203）软件ECC错误数 Run Out Cancel&lt;/strong&gt;&lt;br&gt;
错误检查和纠正（ECC）出错的频度。&lt;br&gt;
CB（203）校正bit错误的总读取页数 Total Count of Read Sectors with correct bits error（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CC（204）软件ECC校正 Soft ECC Correction&lt;/strong&gt;&lt;br&gt;
通过软件ECC纠正错误的计数。&lt;br&gt;
CC（204）坏块满标志 Bad Block Full Flag（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CD（205）热骚动错误率 Thermal Asperity Rate (TAR)&lt;/strong&gt;&lt;br&gt;
由超温导致的错误。数据值应为0。&lt;br&gt;
CD（205）最大可编程/擦除次数 Max P/E Count（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CE（206）磁头飞行高度 Flying Height&lt;/strong&gt;&lt;br&gt;
磁头距离盘片表面的垂直距离。高度过低则增加了磁头与盘片接触导致损坏的可能性；高度偏高则增大了读写错误率。不过准确地说，硬盘中并没有任何装置可以直接测出磁头的飞行高度，制造商也只是根据磁头读取的信号强度来推算磁头飞行高度。&lt;br&gt;
CE（206）底层数据写入出错率 Write Error Rate&lt;br&gt;
CE（206）最小擦写次数 Erase Count Min（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CF（207）主轴过电流 Spin High Current&lt;/strong&gt;&lt;br&gt;
数据值记录了主轴电机运行时出现浪涌电流的次数，数据量的增加意味着轴承或电机可能有问题。&lt;br&gt;
CF（207）最大擦写次数 Erase Count Max（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D0（208）主轴电机重启次数 Spin Buzz&lt;/strong&gt;&lt;br&gt;
数据值记录了主轴电机反复尝试启动的次数，这通常是由于电源供电不足引起的。&lt;br&gt;
D0（208）平均擦写次数Erase Count Average（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D1（209）脱机寻道性能 Offline Seek Performance&lt;/strong&gt;&lt;br&gt;
这一项表示驱动器在脱机状态下的寻道性能，通常用于工厂内部测试。&lt;br&gt;
D1（209）剩余寿命百分比 Remaining Life %（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D2（210）斜坡加载值 Ramp Load Value&lt;/strong&gt;&lt;br&gt;
这一项仅见于几年前迈拓制造的部分硬盘。通常数据值为0，意义不明。&lt;br&gt;
D2（210）坏块管理错误日志 BBM Error Log（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D3（211）写入时振动 Vibration During Write&lt;/strong&gt;&lt;br&gt;
写入数据时受到受到外部振动的记录。&lt;br&gt;
D3（211）SATA主机接口CRC写入错误计数 SATA Error Count CRC (Write)（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;D4（212）写入时冲击 Shock During Write&lt;/strong&gt;&lt;br&gt;
写入数据时受到受到外部机械冲击的记录。&lt;br&gt;
D4（212）SATA主机接口读取错误计数 SATA Error Count Count CRC (Read)（Indilinx芯片）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DC（220）盘片偏移量 Disk Shift&lt;/strong&gt;&lt;br&gt;
硬盘中的盘片相对主轴的偏移量（通常是受外力冲击或温度变化所致），单位未知，数据值越小越好。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DD（221）冲击错误率 G-sense error rate&lt;/strong&gt;&lt;br&gt;
与（BF）相同，数据值记录了硬盘受到外部机械冲击或振动导致出错的频度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DE（222）磁头寻道时间累计 Loaded Hours&lt;/strong&gt;&lt;br&gt;
磁头臂组件运行的小时数，即寻道电机运行时间累计。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DF（223）磁头加载/卸载重试计数 Load/Unload Retry Count&lt;/strong&gt;&lt;br&gt;
这一项与（C1）项类似，数据值累积了磁头尝试重新加载/卸载的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E0（224）磁头阻力 Load Friction&lt;/strong&gt;&lt;br&gt;
磁头工作时受到的机械部件的阻力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E1**&lt;/strong&gt;（&lt;strong&gt;&lt;strong&gt;225&lt;/strong&gt;&lt;/strong&gt;）主机写入数据量 Host Writes**&lt;br&gt;
由于闪存的擦写次数是有限的，所以这项是固态硬盘特有的统计。Intel的SSD是每当向硬盘写入了65536个扇区，这一项的数据就＋1。如果用HDTune等软件查看SMART时可以自己计算，&lt;a class="link" href="http://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&amp;amp;DwnldID=18455&amp;amp;lang=zho" target="_blank" rel="noopener"
 &gt;Intel SSD Toolbox&lt;/a&gt;已经为你算好了，直接就显示了曾向SSD中写入过的数据量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E2（226）磁头加载时间累计 Load &amp;lsquo;In&amp;rsquo;-time&lt;/strong&gt;&lt;br&gt;
磁头组件运行时间的累积数，即磁头臂不在停靠区的时间，与（DE）项相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E3（227）扭矩放大计数 Torque Amplification Count&lt;/strong&gt;&lt;br&gt;
主轴电机试图提高扭矩来补偿盘片转速变化的次数。当主轴轴承存在问题时，主轴电机会尝试增加驱动力使盘片稳定旋转。这个参数的当前值下降，说明硬盘的机械子系统出现了严重的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E4（228）断电返回计数 Power-Off Retract Cycle&lt;/strong&gt;&lt;br&gt;
数据值累计了磁头因设备意外断电而自动返回的次数，与（C0）项相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E6（230）GMR磁头振幅 GMR Head Amplitude&lt;/strong&gt;&lt;br&gt;
磁头“抖动”，即正向/反向往复运动的距离。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E7（231）温度 Temperature&lt;/strong&gt;&lt;br&gt;
温度的数据值直接表示了硬盘内部的当前温度，与（C2）项相同。&lt;br&gt;
&lt;strong&gt;E7（231）剩余寿命 SSD Life Left&lt;/strong&gt;&lt;br&gt;
剩余寿命是基于P/E周期与可用的备用块作出的预测。新硬盘为100；10表示PE周期已到设计值，但尚有足够的保留块；0表示保留块不足，硬盘将处于只读方式以便备份数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E8（232）寿命余量 Endurance Remaining&lt;/strong&gt;&lt;br&gt;
寿命余量是指硬盘已擦写次数与设计最大可擦写次数的百分比，与（CA）项相似。&lt;br&gt;
E8（232）预留空间剩余量 Available Reserved Space（Intel芯片）&lt;br&gt;
对于Intel的SSD来说，前边05项提到会保留一些容量来准备替换损坏的存储单元，所以可用的预留空间数非常重要。当保留的空间用尽，再出现损坏的单元就将出现数据丢失，这个SSD的寿命就结束了。所以仅看05项意义并不大，这一项才最重要。这项参数可以看当前值，新的SSD里所有的预留空间都在，所以是100。随着预留空间的消耗，当前值将不断下降，减小到接近临界值（一般是10）时，就说明只剩下10%的预留空间了，SSD的寿命将要结束。这个与（B4）项相似。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E9（233）通电时间累计 Power-On Hours&lt;/strong&gt;&lt;br&gt;
对于普通硬盘来说，这一项与（09）相同。&lt;br&gt;
E9（233）介质磨耗指数 Media Wareout Indicator（Intel芯片）&lt;br&gt;
由于固态硬盘的擦写次数是有限的，当到达一定次数的时候，就会出现大量的单元同时损坏，这时候预留空间也顶不住了，所以这项参数实际上表示的是硬盘设计寿命。Intel的SSD要看当前值，随着NAND的平均擦写次数从0增长到最大的设计值，这一参数的当前值从开始的100逐渐下降至1为止。这表示SSD的设计寿命已经终结。当然到达设计寿命也不一定意味着SSD就立即报废，这与闪存芯片的品质有着很大的关系。&lt;/p&gt;
&lt;p&gt;注：Total Erase Count全擦写计数是指固态硬盘中所有块的擦写次数的总和，不同规格的NAND芯片以及不同容量的SSD，其最大全擦写次数均有所不同。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F0（240）磁头飞行时间 Head Flying Hours / 传输错误率 Transfer Error Rate（富士通）&lt;/strong&gt;&lt;br&gt;
磁头位于工作位置的时间。&lt;br&gt;
富士通硬盘表示在数据传输时连接被重置的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F1（241）LBA写入总数 Total LBAs Written&lt;/strong&gt;&lt;br&gt;
LBA写入数的累计。&lt;br&gt;
F1（241）写入剩余寿命 Lifetime Writes from Host&lt;br&gt;
自硬盘启用后主机向硬盘写入的数据总量，以4个字节表示，每写入64GB字节作为一个单位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;F2（242）LBA读取总数 Total LBAs Read&lt;/strong&gt;&lt;br&gt;
LBA读取数的累计。某些SMART读取工具会显示负的数据值，是因为采用了48位LBA，而不是32位LBA。&lt;br&gt;
F2（242）读取剩余寿命 Lifetime Reads from Host&lt;br&gt;
自硬盘启用后主机从硬盘读取的数据总量，以4个字节表示，每读取64GB字节作为一个单位。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FA（250）读取错误重试率 Read Error Retry Rate&lt;/strong&gt;&lt;br&gt;
从磁盘上读取时出错的次数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FE（254）自由坠落保护 Free Fall Protection&lt;/strong&gt;&lt;br&gt;
现在有些笔记本硬盘具有自由坠落保护功能，当硬盘内置的加速度探测装置检测到硬盘位移时，会立即停止读写操作，将磁头臂复位。这个措施防止了磁头与盘片之间发生摩擦撞击，提高了硬盘的抗震性能。这个参数的数据里记录了这一保护装置动作的次数。&lt;/p&gt;</description></item><item><title>硬盘自检工具-smartctl的使用</title><link>http://sergget.qzz.io/posts/20210518-02/</link><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20210518-02/</guid><description>&lt;h2 id="1-简介"&gt;1. 简介
&lt;/h2&gt;&lt;p&gt;smartctl是Linux系统中常用的磁盘健康检查工具，基于SMART（Self-Monitoring, Analysis and Reporting Technology）技术。SMART是一种现代硬盘普遍支持的自我监测、分析和报告技术，能够提前预警磁盘可能发生的故障。&lt;/p&gt;
&lt;p&gt;smartmontools软件包包含两个主要工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;smartctl：命令行工具，用于控制和监控存储设备&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;smartd：守护进程，用于自动监控和报告磁盘状态&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-安装"&gt;2. 安装
&lt;/h2&gt;&lt;p&gt;Ubuntu/Debian系统&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;CentOS/RHEL系统&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;yum&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 或对于较新版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;dnf&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;启动服务&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu/Debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CentOS/RHEL&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="n"&gt;smartd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="n"&gt;smartd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-基本使用"&gt;3. 基本使用
&lt;/h2&gt;&lt;h3 id="31-检查磁盘是否支持smart"&gt;3.1 检查磁盘是否支持SMART
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -i /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;关键查看最后两行输出：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART support is: Available - device has SMART capability.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SMART support is: Enabled
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="32-启用smart支持如未开启"&gt;3.2 启用SMART支持（如未开启）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl --smart=on --offlineauto=on --saveauto=on /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;--smart=on：启用SMART功能&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;--offlineauto=on：启用自动离线测试&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;--saveauto=on：启用属性自动保存&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="33-检查磁盘健康状况"&gt;3.3 检查磁盘健康状况
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -H /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;健康状态显示为&amp;quot;PASSED&amp;quot;表示正常，&amp;ldquo;FAILED&amp;quot;表示磁盘可能出现问题。&lt;/p&gt;
&lt;h3 id="34-查看详细smart信息"&gt;3.4 查看详细SMART信息
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -a /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 或仅显示属性表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -A /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="4-smart属性详解"&gt;4. SMART属性详解
&lt;/h2&gt;&lt;p&gt;SMART属性表包含以下重要列：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;列名&lt;/th&gt;
					&lt;th&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;ID&lt;/td&gt;
					&lt;td&gt;属性ID，1-255之间的数字&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ATTRIBUTE_NAME&lt;/td&gt;
					&lt;td&gt;制造商定义的属性名称&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;VALUE&lt;/td&gt;
					&lt;td&gt;标准化值（1-253），值越高越好&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WORST&lt;/td&gt;
					&lt;td&gt;历史最低值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;THRESH&lt;/td&gt;
					&lt;td&gt;故障阈值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;TYPE&lt;/td&gt;
					&lt;td&gt;属性类型（Pre-fail关键属性/Old_age非关键属性）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;WHEN_FAILED&lt;/td&gt;
					&lt;td&gt;故障状态指示&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAW_VALUE&lt;/td&gt;
					&lt;td&gt;原始数值&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;重点关注属性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;5 Reallocated_Sector_Ct：重映射扇区计数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;197 Current_Pending_Sector：当前待处理扇区数&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;198 Offline_Uncorrectable：离线无法校正扇区数&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-磁盘测试"&gt;5. 磁盘测试
&lt;/h2&gt;&lt;h3 id="51-短期测试约2分钟"&gt;5.1 短期测试（约2分钟）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -t short /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="52-长期测试全面扫描时间较长"&gt;5.2 长期测试（全面扫描，时间较长）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -t long /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="53-查看测试进度和结果"&gt;5.3 查看测试进度和结果
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -l selftest /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="54-中止测试"&gt;5.4 中止测试
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -X /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="6-高级功能"&gt;6. 高级功能
&lt;/h2&gt;&lt;h3 id="61-查看错误日志"&gt;6.1 查看错误日志
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -l error /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="62-查看测试时间估算"&gt;6.2 查看测试时间估算
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo smartctl -c /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="63-自动监控配置"&gt;6.3 自动监控配置
&lt;/h3&gt;&lt;p&gt;编辑/etc/smartd.conf配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEVICESCAN -a -o on -S on -s (S/../.././02|L/../../6/03) -m admin@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;参数说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;-a：监控所有属性&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-o on：开启自动离线测试&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-S on：开启属性自动保存&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-s：定期测试计划&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;-m：发送邮件通知&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="7-实际应用建议"&gt;7. 实际应用建议
&lt;/h2&gt;&lt;h3 id="71-定期检查计划"&gt;7.1 定期检查计划
&lt;/h3&gt;&lt;p&gt;建议将以下命令加入crontab定期执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 每周执行一次短期测试
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 2 * * 0 /usr/sbin/smartctl -t short` /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 每月执行一次长期测试
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0 3 1 * * /usr/sbin/smartctl -t long /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="72-故障预警指标"&gt;7.2 故障预警指标
&lt;/h3&gt;&lt;p&gt;当出现以下情况时应立即备份数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;健康检查结果为&amp;quot;FAILED&amp;rdquo;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;任何Pre-fail属性显示&amp;quot;FAILING_NOW&amp;quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Reallocated_Sector_Ct值持续增加&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;出现大量待处理扇区&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="73-注意事项"&gt;7.3 注意事项
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;RAID阵列中的磁盘可能需要特殊参数（如-d megaraid,N）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;USB外接磁盘的SMART支持可能有限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虚拟机中的磁盘可能无法使用SMART功能&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="8-总结"&gt;8. 总结
&lt;/h2&gt;&lt;p&gt;smartctl是Linux系统管理员必备的磁盘健康监测工具，通过定期监控可以提前发现磁盘潜在问题，避免数据丢失。结合smartd守护进程，可以实现自动化监控和报警，为系统稳定性提供重要保障。&lt;/p&gt;</description></item><item><title>ubuntu 20.04 安装配置Samba服务</title><link>http://sergget.qzz.io/posts/20210516-02/</link><pubDate>Sun, 16 May 2021 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20210516-02/</guid><description>&lt;p&gt;文章转自：&lt;a class="link" href="https://blog.csdn.net/mvp_Dawn/article/details/105847485" target="_blank" rel="noopener"
 &gt;https://blog.csdn.net/mvp_Dawn/article/details/105847485&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1-安装samba服务"&gt;1. 安装Samba服务
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install samba samba-common
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果安装失败，请检查你的网络，确认linux可以访问互联网，若可以联网请尝试更换ubuntu镜像源，桌面版直接在软件和更新中配置，服务器版百度上很多&lt;/p&gt;
&lt;h2 id="2-配置需要共享的目录"&gt;2. 配置需要共享的目录
&lt;/h2&gt;&lt;p&gt;改变需要共享目录的权限，让其他人可以更改文件和目录，以/home为例（若多人使用同一服务器建议在每个用户家目录单独共享，不建议共享整个home目录，防止误操作删除他人文件）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo chmod 777 /home/ -R
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3-添加samba用户"&gt;3. 添加samba用户
&lt;/h2&gt;&lt;p&gt;添加samba用户，用于其他人或设备认证，这里添加的用户需要在系统账号中存在，否则添加失败&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dwan@ubuntu20:~/桌面$ sudo smbpasswd -a dwan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;New SMB password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Retype new SMB password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Added user dwan.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="4-配置samba"&gt;4. 配置samba
&lt;/h2&gt;&lt;p&gt;先备份&lt;code&gt;sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak&lt;/code&gt;，以防改错，修改配置文件时建议养成备份的好习惯，改错了还能恢复，&lt;code&gt;sudo vim /etc/samba/smb.conf&lt;/code&gt; 修改配置，添加共享，可直接加到文件尾&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[home] #共享名，该共享标签，可随意取，该名字为在其他电脑上看到的共享名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; comment = home directories #该共享描述
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; path = /home/ #共享路径
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; public = yes #指定该共享是否允许guest账户访问
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; writable = yes #writable用来指定该共享路径是否可写
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; workgroup = DAWN #设定 Samba Server 所要加入的工作组或者域
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;workgroup 根据windows工作组来确定，右键我的电脑（win10为此电脑）-&amp;gt;属性 工作组，该选项有的版本需要配置，有的版本不需要，若访问不了可检查一下该配置，更多配置详见samba配置详解&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="589px" data-flex-grow="245" height="151" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-01.png" width="371"&gt;&lt;/p&gt;
&lt;h2 id="5-重启samba服务"&gt;5. 重启samba服务
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo service smbd restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若找不到服务可尝试如下方法，不过得具体看，有的版本路径不是/etc/init.d/samba，比如我的为/etc/init.d/samba-ad-dc，可以看对应路径是啥，决定用哪个命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo /etc/init.d/samba restart
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#sudo /etc/init.d/samba-ad-dc restart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="6-在windows中访问samba服务"&gt;6. 在Windows中访问samba服务
&lt;/h2&gt;&lt;p&gt;在Windows文件管理器中输入&lt;code&gt;\linux ip&lt;/code&gt; 便可以看到linux samba服务共享的文件夹&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="499px" data-flex-grow="207" height="113" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-02.png" width="235"&gt;&lt;/p&gt;
&lt;h2 id="7-将共享路径映射为windows磁盘非必须"&gt;7. 将共享路径映射为Windows磁盘（非必须）
&lt;/h2&gt;&lt;p&gt;若经常使用的共享，可直接映射为Windows的磁盘，不用每次都输ip，但linux ip变了需要重新映射，所以建议将linux ip设为固定ip&lt;/p&gt;
&lt;p&gt;我的电脑 -&amp;gt;右键 -&amp;gt;映射网络驱动器，文件夹输入框输入linux ip共享名，不能直接输ip，一定要加上共享名，点击完成&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="583px" data-flex-grow="242" height="228" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-03.png" width="554"&gt;&lt;/p&gt;
&lt;p&gt;接下来就可以在我的电脑里看到映射的网络磁盘了&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="570px" data-flex-grow="237" height="396" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-04.png" srcset="http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-04_hu_54a2d3e5fb926a4b.png 800w, http://sergget.qzz.io/posts/20210516-02/network-ubuntu-samba-04.png 941w" width="941"&gt;&lt;/p&gt;
&lt;p&gt;接下来你就可以在Windows上编写代码，然后在linux下编译验证了&lt;/p&gt;
&lt;p&gt;引用：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.csdn.net/weixin" target="_blank" rel="noopener"
 &gt;https://blog.csdn.net/weixin&lt;/a&gt;_40806910/article/details/81917077&lt;/p&gt;</description></item><item><title>电子书网站大全</title><link>http://sergget.qzz.io/posts/20210516-01/</link><pubDate>Sun, 16 May 2021 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20210516-01/</guid><description>&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;&lt;strong&gt;网站名称&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;地址&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;语言&lt;/strong&gt;&lt;/th&gt;
					&lt;th&gt;&lt;strong&gt;推荐指数&lt;/strong&gt;&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;BookYards&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.bookyards.com/en/welcome" target="_blank" rel="noopener"
 &gt;https://www.bookyards.com/en/welcome&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;主要面向教师的门户网站，免费提供，教辅资料最多。&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;搬书匠&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.banshujiang.cn/" target="_blank" rel="noopener"
 &gt;http://www.banshujiang.cn/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;主要提供编程类书籍的下载&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Z-Library&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://z-lib.org/" target="_blank" rel="noopener"
 &gt;https://z-lib.org/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Iread&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.iread.cf/" target="_blank" rel="noopener"
 &gt;http://www.iread.cf/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;网站不对外搜索引擎开放，站内的资源只能通过站内搜索搜到，要登录&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;我爱书籍&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.52book.me/" target="_blank" rel="noopener"
 &gt;http://www.52book.me/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;分类详细，书还算比较齐全&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;伴读&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.bandubook.com/" target="_blank" rel="noopener"
 &gt;https://www.bandubook.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;一个电子书百度云资源专搜网站&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;书享家&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://shuxiangjia.cn/" target="_blank" rel="noopener"
 &gt;http://shuxiangjia.cn/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;整合了上百个电子书下载网站&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;鸠摩搜索&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.jiumodiary.com/" target="_blank" rel="noopener"
 &gt;https://www.jiumodiary.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;强推！专业搜书的聚合搜索引擎&lt;/td&gt;
					&lt;td&gt;中文/英文&lt;/td&gt;
					&lt;td&gt;★★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;每日书单&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://shudan.vip/" target="_blank" rel="noopener"
 &gt;https://shudan.vip/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;主页界面不错，分类放置资源的形式很适合不知道看什么书的人随便逛逛。&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ePUBee电子书库&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://cn.epubee.com/books/" target="_blank" rel="noopener"
 &gt;http://cn.epubee.com/books/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;电子书版本、格式都很多，可以一键添加进网站个人账户，再进行下载。&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Z-Library&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://z-lib.org/" target="_blank" rel="noopener"
 &gt;https://z-lib.org/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;喜欢看英文原版的推荐使用，下载的电子书是mobi、epub格式。&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;LibraryGenesis&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://gen.lib.rus.ec/" target="_blank" rel="noopener"
 &gt;http://gen.lib.rus.ec/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;功能很强大的下载网站，收录各大下载网站，&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;ProjectGutenberg&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.gutenberg.org/ebooks/4351" target="_blank" rel="noopener"
 &gt;http://www.gutenberg.org/ebooks/4351&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;对电子书的分类非常细致，但似乎电子书比较旧&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;LibgenOnlineLibrary&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://libgen.pw/search?q=A&amp;#43;brief&amp;#43;history&amp;#43;of&amp;#43;humankind" target="_blank" rel="noopener"
 &gt;https://libgen.pw/search?q=A+brief+history+of+humankind&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;很简单直接的下载网站，电子书版本多，下载也比较方便&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;文叔叔&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.wenshushu.cn/about" target="_blank" rel="noopener"
 &gt;https://www.wenshushu.cn/about&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;用来分享电子书非常方便，当然你也可以分享其它资源&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;BookSC&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://booksc.org/" target="_blank" rel="noopener"
 &gt;http://booksc.org/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;苦瓜书盘&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://kgbook.com/" target="_blank" rel="noopener"
 &gt;https://kgbook.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;和我的小书屋差不多，现仅提供epub下载&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;走读派&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://zoudupai.com/" target="_blank" rel="noopener"
 &gt;http://zoudupai.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;kindle电子书资源&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;西林街&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://xilinjie.cc/" target="_blank" rel="noopener"
 &gt;https://xilinjie.cc/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;聚合全网各种来源并分类，也是搜索引擎，不止有电子书，期刊、报纸等都可以搜索。&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;众人搜索网&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.renrensousuo.com/" target="_blank" rel="noopener"
 &gt;http://www.renrensousuo.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;除了电子书，一些学习资料、文献也可以搜到，功能比较多。&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;周读&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.ireadweek.com/" target="_blank" rel="noopener"
 &gt;http://www.ireadweek.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;DigiLibraries&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://digilibraries.com/" target="_blank" rel="noopener"
 &gt;https://digilibraries.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;英文下载，适合kindle&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;书格&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://shuge.org/" target="_blank" rel="noopener"
 &gt;https://shuge.org/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;可以看到一些旧典籍，很有格调的网站&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;蚂蚁搬书&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.mybanshu.com/" target="_blank" rel="noopener"
 &gt;http://www.mybanshu.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;KindleMate官方网站，阅读极客的聚集地&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;好读&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.haodoo.net/" target="_blank" rel="noopener"
 &gt;http://www.haodoo.net/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;kindle漫画&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.kindlecomic.net/" target="_blank" rel="noopener"
 &gt;http://www.kindlecomic.net/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;高清kindle格式漫画下载&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;古籍馆&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.gujiguan.com/" target="_blank" rel="noopener"
 &gt;https://www.gujiguan.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;中国最大的古籍图书馆&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;亚马逊免费kindle电子书&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.amazon.cn/Kindle%e5%85%8d%e8%b4%b9%e7%94%b5%e5%ad%90%e4%b9%a6/b?node=116175071" target="_blank" rel="noopener"
 &gt;https://www.amazon.cn/Kindle免费电子书/b?node=116175071&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;中文/英文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;OpenLibrary&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://openlibrary.org/" target="_blank" rel="noopener"
 &gt;https://openlibrary.org/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;英文原版书的免费电子资源&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Manybooks&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://manybooks.net" target="_blank" rel="noopener"
 &gt;http://manybooks.net&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;大部分英文原版书都是免费的&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;亿年书海&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.inien.com/w/#/Index" target="_blank" rel="noopener"
 &gt;http://www.inien.com/w/#/Index&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;支持不同尺寸、格式的电子书下载&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;掌上书苑&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.soepub.com/" target="_blank" rel="noopener"
 &gt;https://www.soepub.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;下载需要书币，电子书可以推送到kindle&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;七彩英语&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="http://www.qcenglish.com/" target="_blank" rel="noopener"
 &gt;http://www.qcenglish.com/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;英文原版书下载&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;kindleshare&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://kindleshare.cn/" target="_blank" rel="noopener"
 &gt;https://kindleshare.cn/&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;无&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;mlook&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.mlook.mobi/member/login" target="_blank" rel="noopener"
 &gt;https://www.mlook.mobi/member/login&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;要登录&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;书单网&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://www.shudan.vip" target="_blank" rel="noopener"
 &gt;https://www.shudan.vip&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;网站收录了30多个电子书网站的下载资源&lt;/td&gt;
					&lt;td&gt;中文&lt;/td&gt;
					&lt;td&gt;★★★★&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Mobilism&lt;/td&gt;
					&lt;td&gt;&lt;a class="link" href="https://forum.mobilism.org/viewforum.php?f=19" target="_blank" rel="noopener"
 &gt;https://forum.mobilism.org/viewforum.php?f=19&lt;/a&gt;&lt;/td&gt;
					&lt;td&gt;英文原版书下载，推荐&lt;/td&gt;
					&lt;td&gt;英语&lt;/td&gt;
					&lt;td&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Docker新手入门</title><link>http://sergget.qzz.io/posts/20210403-01/</link><pubDate>Sat, 03 Apr 2021 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20210403-01/</guid><description>&lt;h2 id="1-docker是什么"&gt;1. Docker是什么？
&lt;/h2&gt;&lt;p&gt;Docker 是一个开源的应用容器引擎，让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中，然后发布到任何主流操作系统上，也可以实现虚拟化。&lt;/p&gt;
&lt;h2 id="2-docker解决什么问题"&gt;2. Docker解决什么问题？
&lt;/h2&gt;&lt;p&gt;软件开发阶段在开发者的设备上往往开发环境都是完整的，甚至“多余”的，然而：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在另一台机器（比如测试）上环境往往不同（软件、版本）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在生产服务器需要最小限度的环境配置&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker可以在应用的层面上打包其所有的依赖并和操作系统实际的环境进行隔离，避免更改、污染操作系统本身的配置、文件或干扰其他进程。&lt;/p&gt;
&lt;h2 id="3-docker与虚拟机"&gt;3. Docker与虚拟机？
&lt;/h2&gt;&lt;p&gt;Docker容器不是模拟一个完整的操作系统，而是对进程进行隔离。或者说，在正常进程的外面套了一个保护层。对于容器里面的进程来说，它接触到的各种资源（文件系统、网络）都是虚拟的，从而实现与底层系统的隔离。&lt;/p&gt;
&lt;p&gt;Docker容器无需运行一个完整的操作系统，从而最大限度地降低对硬件资源的占用。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="526px" data-flex-grow="219" height="508" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20210403-01/code-docker-beginner-01.png" srcset="http://sergget.qzz.io/posts/20210403-01/code-docker-beginner-01_hu_6805ff989f65edac.png 800w, http://sergget.qzz.io/posts/20210403-01/code-docker-beginner-01.png 1114w" width="1114"&gt;&lt;/p&gt;
&lt;h2 id="4-docker的安装与基本使用"&gt;4. Docker的安装与基本使用
&lt;/h2&gt;&lt;h3 id="41-安装"&gt;4.1 安装
&lt;/h3&gt;&lt;p&gt;Docker安装请根据服务器操作系统选择相应的安装方法：&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.docker.com/engine/install" target="_blank" rel="noopener"
 &gt;https://docs.docker.com/engine/install&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="42-使用"&gt;4.2 使用
&lt;/h3&gt;&lt;p&gt;在我的个人服务器上曾部署过为知笔记的私有服务端，服务端就是以docker镜像的方式提供的;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.wiz.cn/zh-cn/docker" target="_blank" rel="noopener"
 &gt;为知笔记官方部署教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官方教程中将容器的80端口映射到了本地机器的80端口，但是本人服务器还部署了nginx服务器的3个站点，因此本人将本地的8080端口映射到容器的80端口，并在nginx中配置一个反向代理来访问该为知笔记的docker容器（为知笔记的docker镜像无法代理到域名的子目录下）。&lt;/p&gt;
&lt;h2 id="5-docker命令基础"&gt;5. Docker命令基础
&lt;/h2&gt;&lt;p&gt;以下命令介绍均以Linux平台下，windows平台的docker应该也是差不多的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; docker在大多数情况下需要root或管理员权限，请适时增加sudo或以管理员身份打开命令行。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;从官方源中拉取镜像：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image pull &amp;lt;image name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看本机镜像：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker image ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;运行一个镜像：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker container run &amp;lt;image name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker container run&lt;/code&gt;命令会从 image 文件，生成一个正在运行的容器实例。一个镜像相当于一个模板，可以创建运行多个容器。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt; &lt;code&gt;docker container run&lt;/code&gt;命令如果发现本地没有指定的 image 文件，就会从仓库自动抓取。因此，前面的&lt;code&gt;docker image pull&lt;/code&gt;命令并不是必需的步骤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看正在运行的容器&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker container ls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;查看所有容器（含停止的容器）&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker container ls -all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;停止一个容器：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一些容器会在运行结束后停止，但大多数不会，因为它们提供的是一项持续的服务。停止这些容器就需要：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker container kill &amp;lt;Container ID&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;删除容器&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;容器停止后还会保留容器文件，占据硬盘空间，如果需要可以将其删除&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker container rm &amp;lt;Container ID&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="6-制作docker镜像"&gt;6. 制作docker镜像
&lt;/h2&gt;&lt;p&gt;本人由于是完全的业余折腾了下，还没到必须要制作一个docker的程度，我找了几个入门教程，希望对你有所帮助：&lt;/p&gt;
&lt;h4 id="制作docker镜像"&gt;制作docker镜像
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;请参考“&lt;strong&gt;十、实例：制作自己的 Docker 容器&lt;/strong&gt;”：&lt;a class="link" href="http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html" target="_blank" rel="noopener"
 &gt;Docker 入门教程&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;较详细的dockerfile配置说明：&lt;a class="link" href="https://www.runoob.com/docker/docker-dockerfile.html" target="_blank" rel="noopener"
 &gt;Docker Dockerfile&lt;/a&gt;**注：**配置可以关注&lt;code&gt;COPY&lt;/code&gt;,&lt;code&gt;CMD&lt;/code&gt;,&lt;code&gt;ENTRYPOINT&lt;/code&gt;,&lt;code&gt;ENV&lt;/code&gt;,&lt;code&gt;VOLUME&lt;/code&gt;,&lt;code&gt;EXPOSE&lt;/code&gt;,&lt;code&gt;USER&lt;/code&gt;命令配置&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="微服务与docker-compose"&gt;微服务与docker compose
&lt;/h3&gt;&lt;p&gt;对于一些较为大型或需要一定部署灵活性的需求，一般来说可以将语言环境如php，python和数据库等设施分开，分别运行在不同的docker容器中，教程可参考：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="http://www.ruanyifeng.com/blog/2018/02/docker-wordpress-tutorial.html" target="_blank" rel="noopener"
 &gt;Docker 微服务教程&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/docker/docker-compose.html" target="_blank" rel="noopener"
 &gt;Docker Compose&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Deepin入门指南</title><link>http://sergget.qzz.io/posts/20200605-01/</link><pubDate>Fri, 05 Jun 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200605-01/</guid><description>&lt;h2 id="1-简介"&gt;1. 简介
&lt;/h2&gt;&lt;p&gt;当前的大环境下，不少单位可能会面临无法通过正式渠道获得windows操作系统和相应支持的情况。一些单位或个人已经转向国产操作系统，比如ubuntu kylin（麒麟）、deepin（深度）等。比如华为笔记本提供了预装Linux的版本，预装的就是Deepin。Kylin、deepin、ubuntu等都是Debian系的Linux发行版（Debian也是一个Linux发行版本），在目前我的使用体验来说，和Ubuntu的体验没有什么大的区别，你可以使用Ubuntu的教程或者文档，但是深度提供了专门本地化的软件商店和桌面环境，还提供了一些Windows 软件的wine打包版本，使得新手能更方便的安装和使用。&lt;/p&gt;
&lt;p&gt;对Linux新手：请注意，所有Windows下的exe可执行程序，都不能在Linux平台下直接运行，部分程序可以使用wine模拟器来运行，但请注意，即便有wine模拟器，Linux下能运行的Windows程序依然不多。&lt;/p&gt;
&lt;h2 id="2-适用人群"&gt;2. 适用人群
&lt;/h2&gt;&lt;p&gt;最低能力配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;愿意尝试新东西&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;有阅读文档并尝试解决问题的耐心和时间&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;知道自己电脑的操作系统版本、了解32位/64位操作系统以及自己电脑的硬件是否兼容&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Windows系统下熟练管理文件和软件&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐能力配置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;对软件操作有较为抽象的步骤概念，可以使用不同界面的软件完成相似的任务（例如在WPS和MS Office间可无压力切换）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;英文文档阅读能力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;梯子&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;基础cmd或powershell命令，如&lt;code&gt;cd&lt;/code&gt;、&lt;code&gt;mkdir&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt;等&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然如果你有Ubuntu或Debian或者其他发行版的使用经验，那么你&lt;strong&gt;不需要&lt;/strong&gt;这个指南。&lt;/p&gt;
&lt;h2 id="3-系统安装"&gt;3. 系统安装
&lt;/h2&gt;&lt;p&gt;U盘安装系统与Windows基本无异：用&lt;a class="link" href="https://rufus.ie/" target="_blank" rel="noopener"
 &gt;rufus&lt;/a&gt;或其他U盘启动制作工具将iso镜像刻录到U盘中，然后重启，在BIOS中将第一启动项更改为U盘（或者相应的UEFI分区），开机按提示设置用户名、密码然后等待安装完成即可。详细安装教程可见&lt;a class="link" href="https://www.deepin.org/installation/" target="_blank" rel="noopener"
 &gt;官方教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意：安装向导询问安装位置时，请不要自行分区和设置挂载点，直接选择全盘安装到一整块不小于40GB的硬盘中，后续我们再涉及磁盘管理的问题。&lt;/p&gt;
&lt;h2 id="4-基本gui界面使用"&gt;4. 基本GUI界面使用
&lt;/h2&gt;&lt;p&gt;GUI = Graphical User Interface，即图形用户交互界面，与之相对的是字符界面，只能输入命令执行任务。Deepin的UI界面与Windows有较大的差距，但是请不要慌，他们的基本操作逻辑大致相同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;双击打开/右键菜单&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除文件到回收站/从回收站恢复文件&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;设置界面更接近手机的设置界面&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;事实上，Deepin的设置等界面其实更接近安卓或者iOS系统，UI界面的操作方法都是很简单的，当然右键菜单的内容比Windows上要少一些，其他的一些不好找的设置可以参考官方用户手册：&lt;a class="link" href="https://wiki.deepin.org/" target="_blank" rel="noopener"
 &gt;https://wiki.deepin.org/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="5-文件结构基本逻辑"&gt;5. 文件结构基本逻辑
&lt;/h2&gt;&lt;h3 id="51-根目录的概念"&gt;5.1 根目录的概念
&lt;/h3&gt;&lt;p&gt;前面安装系统时安装向导会询问系统的安装位置，官方教程中提到了根目录：&lt;code&gt;/&lt;/code&gt;。请注意，在操作系统中，目录=文件夹，请注意这一措辞的变化。&lt;/p&gt;
&lt;p&gt;与Windows的文件结构不同的是，无论你有多少硬盘、分了多少分区，所有的目录都在根目录下，我们在Windows下熟悉的诸如&lt;strong&gt;C盘&lt;/strong&gt;，&lt;strong&gt;D盘&lt;/strong&gt;等盘符的概念，在Linux操作系统中是不存在的，不同的分区和硬盘都是以目录（挂载点）的形式在文件系统中管理，例如：我们可以将C盘理解成 &lt;strong&gt;根目录-C目录&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----C/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----D/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----E/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+----F/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="52-家目录的概念"&gt;5.2 家目录的概念
&lt;/h3&gt;&lt;p&gt;家目录就是/home目录，系统会默认在这个目录下创建一个与用户名同名的目录，用于存放该用户的所有文件。目录结构如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;|
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+---- home/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---&amp;lt;用户名&amp;gt;/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---文档/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---音乐/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---图片/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---下载/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---视频/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---……
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;请将所有的文件例如文档、照片、视频、软件安装包等内容分类放在你的目录下。默认情况下，新用户只有自己的家目录的写权限，其他文件最多只会有读权限（&lt;strong&gt;请注意&lt;/strong&gt;：&lt;strong&gt;删除&lt;/strong&gt;也是&lt;strong&gt;写&lt;/strong&gt;操作）。&lt;/p&gt;
&lt;h3 id="53-root权限"&gt;5.3 root权限
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;em&gt;由于本文面向新手，所以会尽量少介绍命令，此处内容了解即可。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;root用户、用户组有系统最高的权限，可以无视任何文件权限配置读写文件系统下的任意一个文件或目录，那也就是说拥有“&lt;strong&gt;一键删除一切&lt;/strong&gt;”的功能：&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="271px" data-flex-grow="113" height="175" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-01.png" width="198"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;（注意：Windows下的Administrator权限是用户能获得的最高权限，并不是系统的最高权限，不能和root类比）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;在系统安装时添加的第一个用户会默认加入root用户组，直接执行命令时仅仅是以用户本身的权限执行。如果需要root权限，就在命令前加上sudo，然后会提示输入用户密码，以root用户的身份执行相应的命令。&lt;/p&gt;
&lt;p&gt;请注意，只有加入了root用户组的用户才能借用root权限。正是因为root权限几乎是“无可阻挡”，以root身份执行命令时请务必谨慎。&lt;/p&gt;
&lt;p&gt;文件的权限可以使用&lt;a class="link" href="https://man.linuxde.net/chmod" target="_blank" rel="noopener"
 &gt;chmod&lt;/a&gt;更改，大多数情况下，需要借用root权限，即使用&lt;code&gt;sudo chmod ...&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="6-压缩文件与解压缩"&gt;6. 压缩文件与解压缩
&lt;/h2&gt;&lt;h3 id="61-文件格式"&gt;6.1 文件格式
&lt;/h3&gt;&lt;p&gt;请注意，在Linux平台下源码包的打包压缩格式常常为&lt;code&gt;.tar.gz&lt;/code&gt;，其他文件的压缩包多为&lt;code&gt;zip&lt;/code&gt;格式。另外虽然Deepin也添加了7z、rar等格式的支持，请在打包压缩文件时尽量选择&lt;code&gt;zip&lt;/code&gt;或&lt;code&gt;tar.gz&lt;/code&gt;/&lt;code&gt;tar.bz2&lt;/code&gt;格式&lt;/p&gt;
&lt;h3 id="62-压缩和解压缩"&gt;6.2 压缩和解压缩
&lt;/h3&gt;&lt;p&gt;deepin的压缩和解压非常简单，与Windows相同，在压缩包上右键-压缩/解压，按提示选择保存位置即可。&lt;/p&gt;
&lt;h2 id="7-软件的安装与卸载"&gt;7. 软件的安装与卸载：
&lt;/h2&gt;&lt;p&gt;如同在简介中提到的，你下载一个Windows的程序到Linux平台下会发现打不开/无法运行，Linux平台的软件包是通过与windows完全不同的方式安装的。请通过以下方式安装软件：&lt;/p&gt;
&lt;h3 id="71-软件商店"&gt;7.1 软件商店
&lt;/h3&gt;&lt;p&gt;第8节中的软件可以首先尝试在深度自带的应用商店中搜索，尝试安装前，请先到设置中更新软件信息，更新完成后才能正常安装，否则会报错。&lt;/p&gt;
&lt;p&gt;优先安装备注了Linux版的软件，而不是wine版本的，网页版最不推荐安装，有些软件是打包浏览器的网页版本， 没有备注，这种只能是下载后使用时才能发现。&lt;/p&gt;
&lt;h3 id="72-下载deb包"&gt;7.2 下载deb包
&lt;/h3&gt;&lt;p&gt;并不是所有的软件都收录到了深度的软件商店中，另外一些软件需要我们自行下载安装包，请注意即便同样是Linux平台，不同格式的软件包也不是通用的，Debian系发行版的软件安装包都是&lt;code&gt;.deb&lt;/code&gt;后缀，这也是最常见的一种格式，以网易云音乐为例：&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="447px" data-flex-grow="186" height="625" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-02.png" srcset="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-02_hu_4f9587c4f9e77e6d.png 800w, http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-02.png 1165w" width="1165"&gt;&lt;/p&gt;
&lt;p&gt;其下载客户端的页面提供了Linux版本的下载，选择自己对应的发行版下载后，双击安装即可。无论是双击deb安装还是直接在软件商店内下载的软件都可以直接在已安装软件列表中一键卸载。&lt;/p&gt;
&lt;h3 id="73-aptapt-getdpkg命令"&gt;7.3 apt/apt-get/dpkg命令
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;em&gt;7.3及后续的安装方法了解即可&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;上述通过商店安装软件实际上就是用过apt命令安装了对应的安装包，apt又是通过调用dpkg进行解包、安装，如果你需要安装一个名为smartmontools （硬盘检测）的软件包，那么，你只需要打开终端或者按下Ctrl+Alt+T调出终端，然后输入命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;apt&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;smartmontools&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;回车，终端会提示输入密码，按要求输入你的密码然后回车后就会进行下载和安装。不过你能使用apt安装一个软件的前提是，软件开发者已经在apt的源仓库中已经提交了对应的软件包，和商店的其实是很相似的。&lt;/p&gt;
&lt;p&gt;卸载软件只需要运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt remove &amp;lt;软件包名&amp;gt; -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;输入密码，回车确认即可。&lt;/p&gt;
&lt;p&gt;**那么我们能不能用命令安装自己下载的软件包呢？**答案是可以的。我们以网易云音乐（假设文件名为：&lt;code&gt;netease_music.deb&lt;/code&gt;）为例，在官网下载了安装包后，打开到安装包所在的目录，然后右键-在终端中打开，然后输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ./netease_music.deb -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;回车，输入密码再回车即可安装&lt;/p&gt;
&lt;p&gt;当然，也可以使用&lt;code&gt;dpkg&lt;/code&gt;命令进行安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -i ./netease_music.deb -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;那么&lt;code&gt;apt-get&lt;/code&gt;又是什么命令呢？&lt;code&gt;apt-get&lt;/code&gt;基本等同于&lt;code&gt;apt&lt;/code&gt;命令，后者更新，我们应使用更新的版本。&lt;/p&gt;
&lt;p&gt;注意：由于商店和&lt;code&gt;apt&lt;/code&gt;/&lt;code&gt;apt-get&lt;/code&gt;命令都使用了&lt;code&gt;dpkg&lt;/code&gt;命令，如果你正在安装或更新deb软件包，它就会被加锁，在其结束安装或更新前，你将不能再打开一个安装或更新过程。软件商店安装失败多半是因为系统在后台运行了一个更新过程，所以，安装失败的时候请先到设置里确认更新是否在运行中。&lt;/p&gt;
&lt;h3 id="74-脚本安装"&gt;7.4 脚本安装
&lt;/h3&gt;&lt;p&gt;部分软件不能通过apt安装，也没有提供deb包，但是在下载页面提供了一个脚本，我们可以打开终端，直接复制粘贴脚本，回车即可安装，例如zerotier-one（虚拟局域网工具）：&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="618px" data-flex-grow="257" height="592" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-03.png" srcset="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-03_hu_5ceb1cb3eeebf42d.png 800w, http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-03.png 1526w" width="1526"&gt;&lt;/p&gt;
&lt;p&gt;注意：有一些通过脚本安装的软件可能不会提供卸载方法或者卸载方法比较复杂，这类软件的安装务必谨慎进行。另外脚本安装的可能是deb包软件，也可能不是，具体请阅读对应软件的安装说明。&lt;/p&gt;
&lt;h3 id="75-其他类型snapappimage"&gt;7.5 其他类型：snap，appimage
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Snap：Snap是Canonical公司（Ubuntu的发行公司）的新一代包管理器，安全方便，部分软件会提供snap包，但它的权限管理比较复杂，初学者请不要尝试安装该类软件包。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;appimage：部分软件在Linux平台会提供appimage，这种包将其需要的所有依赖软件全部打包在一起，因此通常来说体积会比较大，但是不需要担心任何依赖问题，基本可以做到在任何发行版中，双击即可运行，因此，在没有提供deb包时，可以优先选择appimage格式打包的软件，例如mkvtoolnix就在下载页面提供了appimage：&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="507px" data-flex-grow="211" height="485" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-04.png" srcset="http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-04_hu_db23e8155d92df52.png 800w, http://sergget.qzz.io/posts/20200605-01/computer-deepin-guide-04.png 1026w" width="1026"&gt;&lt;/p&gt;
&lt;h3 id="76-源码安装"&gt;7.6 源码安装：
&lt;/h3&gt;&lt;p&gt;有些软件提供源码包，需要自行编译安装。与一些脚本安装的软件类似，编译安装的软件往往依赖较多的外部软件包，需要手动安装，而且安装文件的步骤多，部分源码包不提供卸载方法，编译源码安装的软件同样不适合新手使用。&lt;/p&gt;
&lt;p&gt;如果你有了解&lt;code&gt;cd ls mkdir&lt;/code&gt;这类基础命令，可以参考源码包内的安装方法（大多是英文），然后参考&lt;a class="link" href="https://blog.sergget.ga/20200418/6a36829358ea/" target="_blank" rel="noopener"
 &gt;本文&lt;/a&gt;安装源码包&lt;/p&gt;
&lt;h2 id="8-windows平台软件的替换"&gt;8. windows平台软件的替换
&lt;/h2&gt;&lt;p&gt;靠前=更推荐，深度提供了部分工具：录屏、截图、分区工具&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;输入法：搜狗（预装）、Sunpinyin&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;浏览器：chrome（预装）、firefox&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Office三件套: WPS（预装）（Ubuntu下默认安装的字体和Windows下有很多不同，请自行搜索下载需要的字体）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;邮件客户端：Evolution、Thunderbird（预装）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;pdf阅读器：福昕阅读器Linux版、Okular、金山PDF（预装）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;流程图/Visio替代：Dia&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;下载：qbittorrent、uget、百度网盘Linux版&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;笔记：Evernote(使用第三方linux客户端Nixnote)、为知笔记（会员或&lt;a class="link" href="https://www.wiz.cn/zh-cn/enterprise-private-cloud.html" target="_blank" rel="noopener"
 &gt;自行部署服务端&lt;/a&gt;）、simplenote&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;网页剪辑：pocket扩展+手机端应用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频相关：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;播放器：VLC、kodi&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;剪辑：kdenlive、shocut&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字幕编辑：subtitle editor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mkv打包和拆包：mkvtoolnix&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;视频转码：HandBrake&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;录屏：kazam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;3D动画：Blender&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;音乐播放器：网易云音乐、VLC、Spotify&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;图片和照片：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;相册：shotwell、digikam&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;PS替代：GIMP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;矢量图：InkScape&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CAD：中望CAD Linux版、freeCAD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虚拟局域网：zerotier-one&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虚拟机：Virtualbox&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;梯子：Github上搜索你使用的协议名称+Linux即可，有UI的更好。不要问推荐什么，咱不知道。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="9-磁盘分区和管理"&gt;9. 磁盘分区和管理：
&lt;/h2&gt;&lt;p&gt;如果你没有在Windows下使用过系统自带分区工具、diskgenius或其他的分区工具，请忽略本节内容，相关需求请联系专业人员处理。&lt;/p&gt;
&lt;h3 id="91-gui工具disks"&gt;9.1 GUI工具：disks
&lt;/h3&gt;&lt;p&gt;Deepin下使用系统自带的分区工具或者下载disks工具即可，操作其他的分区工具类似。&lt;/p&gt;
&lt;p&gt;Linux下常用的文件系统为&lt;code&gt;ext3&lt;/code&gt;, &lt;code&gt;ext4&lt;/code&gt;，不能直接使用Windows常见的NTFS文件系统，对于一些小文件需要在Windows和Linux之间频繁切换的U盘可以格式化成&lt;code&gt;FAT32&lt;/code&gt;格式，这种文件系统在两个平台上都能直接使用，代价是不能存储单个大于4G的文件。&lt;/p&gt;
&lt;p&gt;如果一定要使用NTFS文件系统，可以使用如下命令安装软件包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install ntfs-3g -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;即可挂载NTFS分区&lt;/p&gt;
&lt;h3 id="92-命令行partedfdiskmkfs"&gt;9.2 命令行：parted/fdisk+mkfs
&lt;/h3&gt;&lt;p&gt;Linux平台下更多的使用命令行来对硬盘进行分区和格式化，常用的分区命令：parted、fdisk，格式化工具：mkfs（make file system）&lt;/p&gt;
&lt;p&gt;关于这些命令的使用，可以阅读：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;parted命令：&lt;a class="link" href="https://man.linuxde.net/parted" target="_blank" rel="noopener"
 &gt;https://man.linuxde.net/parted&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;fdisk命令：&lt;a class="link" href="http://man.linuxde.net/fdisk" target="_blank" rel="noopener"
 &gt;http://man.linuxde.net/fdisk&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;mkfs命令：&lt;a class="link" href="https://man.linuxde.net/mkfs" target="_blank" rel="noopener"
 &gt;https://man.linuxde.net/mkfs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请注意：parted用于gpt分区，fdisk用于mbr分区&lt;/p&gt;
&lt;h3 id="93-挂载点的概念"&gt;9.3 挂载点的概念
&lt;/h3&gt;&lt;p&gt;挂载点是Linux平台与Windows平台对存储资源管理的最大不同点之一，由于Linux平台文件系统始终以根目录作为最初始的目录，如果我们需要使用硬盘的某一个分区，就只能把它作为一个目录添加到Linux的文件系统中，代表这个分区的目录就被我们称作挂载点，为硬盘分区分配一个目录的动作就被称为挂载。&lt;/p&gt;
&lt;p&gt;我们存储在挂载点这个目录的所有文件，在物理上就存储在其对应的硬盘分区中。&lt;/p&gt;
&lt;p&gt;分区的挂载操作和卸载操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;挂载分区：&lt;a class="link" href="https://man.linuxde.net/mount" target="_blank" rel="noopener"
 &gt;https://man.linuxde.net/mount&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;卸载分区：&lt;a class="link" href="https://man.linuxde.net/umount" target="_blank" rel="noopener"
 &gt;https://man.linuxde.net/umount&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：使用mount命令挂载的分区会在重启后消失，如需要开机就自动挂载，请阅读：&lt;a class="link" href="https://www.cnblogs.com/qiyebao/p/4484047.html" target="_blank" rel="noopener"
 &gt;https://www.cnblogs.com/qiyebao/p/4484047.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果你新增加了一块硬盘，需要将你的家目录转移到该硬盘上，可以参考：&lt;a class="link" href="https://sergget.ga/20200426/0cad07e5443e/" target="_blank" rel="noopener"
 &gt;https://sergget.ga/20200426/0cad07e5443e/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="10-小结"&gt;10. 小结
&lt;/h2&gt;&lt;p&gt;由于Linux教程大多是开篇介绍命令，对于桌面用户非常不友好，所以本文致力于介绍其逻辑，但是即便deepin做了很多本地化和图形化的工作，作为一个Linux系统仍然有很多地方不得不使用命令行/字符界面，作为桌面用户仍然需要适时地学习相关的命令。网上有很多Linux教程，可以参考视频教程：&lt;a class="link" href="https://www.imooc.com/course/programdetail/pid/45" target="_blank" rel="noopener"
 &gt;https://www.imooc.com/course/programdetail/pid/45&lt;/a&gt; 选择性地学习。&lt;/p&gt;
&lt;p&gt;最后请善用搜索引擎（推荐必应，国内搜索引擎真是一言难尽）！&lt;/p&gt;
&lt;h2 id="11-题外话"&gt;11. 题外话
&lt;/h2&gt;&lt;p&gt;从第8节的可以看出，Deepin可以完成不少的基础和进阶任务，但一些特定的专业软件没有Linux平台的版本，即便有，也有很大概率是英文版，不适合在从事这一类活动的企业中大面积推广。这决定了它目前只能在一些政府单位等行业等文书类工作比较集中的地方，至于这些人能不能/愿不愿意学这个东西就是另外一回事了。&lt;/p&gt;
&lt;p&gt;要说另一个好处就是适合仅限于“查资料/学习用途”的学生了，毕竟Linux平台下游戏少得可怜，质量还不好，即便是Steam平台有Linux版本，上面也有一些游戏，作为家长只要管控住银行卡，孩子们基本就没有什么游戏的空间。毕竟总不会有谁扫雷玩儿一天吧？不会吧？不会吧？&lt;/p&gt;</description></item><item><title>常用Git 命令清单</title><link>http://sergget.qzz.io/posts/20200418-02/</link><pubDate>Sat, 18 Apr 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200418-02/</guid><description>&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;本文转载自阮一峰的《&lt;a class="link" href="http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html" target="_blank" rel="noopener"
 &gt;常用Git命令清单&lt;/a&gt;》&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我每天使用 Git ，但是很多命令记不住。&lt;/p&gt;
&lt;p&gt;一般来说，日常使用只要记住下图6个命令，就可以了。但是熟练使用，恐怕要记住60～100个命令。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="827px" data-flex-grow="344" height="340" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200418-02/code-git-command-cheatsheet-01.png" srcset="http://sergget.qzz.io/posts/20200418-02/code-git-command-cheatsheet-01_hu_54d0635c93ea54d8.png 800w, http://sergget.qzz.io/posts/20200418-02/code-git-command-cheatsheet-01.png 1172w" width="1172"&gt;&lt;/p&gt;
&lt;p&gt;下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Workspace：工作区&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Index / Stage：暂存区&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Repository：仓库区（或本地仓库）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Remote：远程仓库&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="一新建代码库"&gt;一、新建代码库
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 在当前目录新建一个Git代码库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个目录，将其初始化为Git代码库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git init [project-name]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 下载一个项目和它的整个代码历史
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone [url]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="二配置"&gt;二、配置
&lt;/h2&gt;&lt;p&gt;Git的设置文件为&lt;code&gt;.gitconfig&lt;/code&gt;，它可以在用户主目录下（全局配置），也可以在项目目录下（项目配置）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示当前的Git配置
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 编辑Git配置文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config -e [--global]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 设置提交代码时的用户信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config [--global] user.name &amp;#34;[name]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config [--global] user.email &amp;#34;[email address]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="三增加删除文件"&gt;三、增加/删除文件
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 添加指定文件到暂存区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add [file1] [file2] ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 添加指定目录到暂存区，包括子目录
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add [dir]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 添加当前目录的所有文件到暂存区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 添加每个变化前，都会要求确认
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 对于同一个文件的多处变化，可以实现分次提交
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add -p
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除工作区文件，并且将这次删除放入暂存区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git rm [file1] [file2] ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 停止追踪指定文件，但该文件会保留在工作区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git rm --cached [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 改名文件，并且将这个改名放入暂存区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git mv [file-original] [file-renamed]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="四代码提交"&gt;四、代码提交
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交暂存区到仓库区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -m [message]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交暂存区的指定文件到仓库区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit [file1] [file2] ... -m [message]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交工作区自上次commit之后的变化，直接到仓库区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交时显示所有diff信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 使用一次新的commit，替代上一次提交
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 如果代码没有任何新变化，则用来改写上一次commit的提交信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit --amend -m [message]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重做上一次commit，并包括指定文件的新变化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit --amend [file1] [file2] ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="五分支"&gt;五、分支
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 列出所有本地分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 列出所有远程分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch -r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 列出所有本地分支和远程分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch -a
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个分支，但依然停留在当前分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch [branch-name]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个分支，并切换到该分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout -b [branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个分支，指向指定commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch [branch] [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个分支，与指定的远程分支建立追踪关系
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch --track [branch] [remote-branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 切换到指定分支，并更新工作区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout [branch-name]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 切换到上一个分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 建立追踪关系，在现有分支与指定的远程分支之间
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch --set-upstream [branch] [remote-branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 合并指定分支到当前分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git merge [branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 选择一个commit，合并进当前分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git cherry-pick [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch -d [branch-name]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除远程分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push origin --delete [branch-name]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch -dr [remote/branch]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="六标签"&gt;六、标签
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 列出所有tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个tag在当前commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag [tag]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个tag在指定commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag [tag] [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除本地tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag -d [tag]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 删除远程tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push origin :refs/tags/[tagName]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 查看tag信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git show [tag]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交指定tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push [remote] [tag]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 提交所有tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push [remote] --tags
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个分支，指向某个tag
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout -b [branch] [tag]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="七查看信息"&gt;七、查看信息
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示有变更的文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示当前分支的版本历史
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示commit历史，以及每次commit发生变更的文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log --stat
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 搜索提交历史，根据关键词
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log -S [keyword]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某个commit之后的所有变动，每个commit占据一行
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log [tag] HEAD --pretty=format:%s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某个commit之后的所有变动，其&amp;#34;提交说明&amp;#34;必须符合搜索条件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log [tag] HEAD --grep feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某个文件的版本历史，包括文件改名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log --follow [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git whatchanged [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示指定文件相关的每一次diff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log -p [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示过去5次提交
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log -5 --pretty --oneline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示所有提交过的用户，按提交次数排序
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git shortlog -sn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示指定文件是什么人在什么时间修改过
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git blame [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示暂存区和工作区的差异
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git diff
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示暂存区和上一个commit的差异
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git diff --cached [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示工作区与当前分支最新commit之间的差异
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git diff HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示两次提交之间的差异
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git diff [first-branch]...[second-branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示今天你写了多少行代码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git diff --shortstat &amp;#34;@{0 day ago}&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某次提交的元数据和内容变化
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git show [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某次提交发生变化的文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git show --name-only [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某次提交时，某个文件的内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git show [commit]:[filename]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示当前分支的最近几次提交
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reflog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="八远程同步"&gt;八、远程同步
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 下载远程仓库的所有变动
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git fetch [remote]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示所有远程仓库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 显示某个远程仓库的信息
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote show [remote]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 增加一个新的远程仓库，并命名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote add [shortname] [url]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 取回远程仓库的变化，并与本地分支合并
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git pull [remote] [branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 上传本地指定分支到远程仓库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push [remote] [branch]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 强行推送当前分支到远程仓库，即使有冲突
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push [remote] --force
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 推送所有分支到远程仓库
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git push [remote] --all
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="九撤销"&gt;九、撤销
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 恢复暂存区的指定文件到工作区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 恢复某个commit的指定文件到暂存区和工作区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout [commit] [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 恢复暂存区的所有文件到工作区
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重置暂存区的指定文件，与上一次commit保持一致，但工作区不变
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reset [file]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重置暂存区与工作区，与上一次commit保持一致
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reset --hard
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reset [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reset --hard [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 重置当前HEAD为指定commit，但保持暂存区和工作区不变
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git reset --keep [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 新建一个commit，用来撤销指定commit
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 后者的所有变化都将被前者抵消，并且应用到当前分支
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git revert [commit]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 暂时将未提交的变化移除，稍后再移入
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git stash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git stash pop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="十其他"&gt;十、其他
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 生成一个可供发布的压缩包
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git archive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>将源码包编译成Deb包–Checkinstall</title><link>http://sergget.qzz.io/posts/20200418-01/</link><pubDate>Sat, 18 Apr 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200418-01/</guid><description>&lt;p&gt;&lt;strong&gt;翻译自：&lt;/strong&gt; &lt;a class="link" href="https://help.ubuntu.com/community/CheckInstall" target="_blank" rel="noopener"
 &gt;https://help.ubuntu.com/community/CheckInstall&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="1简介"&gt;1.简介
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;CheckInstall&lt;/code&gt; 跟踪由&lt;code&gt;make install&lt;/code&gt;或类似命令生成安装的所有文件，并创建&lt;code&gt;Slackware&lt;/code&gt;, &lt;code&gt;RPM&lt;/code&gt;或&lt;code&gt;Debian&lt;/code&gt;包，将其添加到包的数据库，可以方便地卸载或分发软件包。&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;CheckInstall&lt;/code&gt;来替代&lt;code&gt;sudo make install&lt;/code&gt;，由于后者可能将文件安装到文件系统的各种位置，导致在出现问题的情况下卸载困难。而且如果将来你安装的某个软件包中的某些文件和你现在编译安装的某些文件相同，则会导致你编译安装的软件出错甚至停止工作。&lt;/p&gt;
&lt;p&gt;（实际上，不仅仅是&lt;code&gt;make install&lt;/code&gt;，&lt;code&gt;CheckInstall&lt;/code&gt;能跟踪任何命令所修改的文件，这是得它能够用于&lt;code&gt;apt&lt;/code&gt;以外的的任何类型的软件包的安装，并使用包管理器跟踪其安装过程。）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CheckInstall&lt;/code&gt;不适合用于生成用于发行目的的软件包。不要使用该软件来为Ubuntu archive或PPA源的软件打包。请遵循相应的打包方法。&lt;/p&gt;
&lt;p&gt;CheckInstall 的README文件：”CheckInstall对Debian的支持尚未稳定，请小心使用。对于某些Debian系的操作系统，用户反馈该软件包工作正常，当然它在我的已安装了dpkg的Slackware开发环境下表现良好，但是在你的环境里可能各有不同。”&lt;/p&gt;
&lt;h2 id="2安装"&gt;2.安装
&lt;/h2&gt;&lt;p&gt;执行以下命令从软件仓库进行安装：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update &amp;amp;&amp;amp; sudo apt-get install checkinstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="3使用"&gt;3.使用
&lt;/h2&gt;&lt;p&gt;编译安装时，不再使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo checkinstall
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;执行命令时不带任何参数，&lt;code&gt;checkinstall&lt;/code&gt;则会默认调用&lt;code&gt;make install&lt;/code&gt;。如果你需要使用其他参数，则可以这样使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo checkinstall make install_package
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装的包可以非常轻松地使用Synaptic或终端来删除：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -r packagename
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg -r pidgin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 生成的&lt;code&gt;.deb&lt;/code&gt;包也可以在其他地方使用，极大地简化了同一软件包在大量机器上的安装过程。&lt;/p&gt;
&lt;h2 id="4-配合auto-apt使用checkinstall"&gt;4. 配合auto-apt使用checkinstall
&lt;/h2&gt;&lt;p&gt;你也可以使用&lt;code&gt;auto-apt&lt;/code&gt;与&lt;code&gt;checkinstall&lt;/code&gt;配合，从源代码创建一个简单的软件包（需要安装&lt;code&gt;auto-apt&lt;/code&gt;）：&lt;/p&gt;
&lt;p&gt;不再使用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;请使用:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;auto-apt run ./configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果依赖都可用，一个对话框会被打开，并要求你安装它们，剩下的则保持不变：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo checkinstall
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Related Links
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CategorySoftware CategoryCommandLine
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Power query插件简介 — 强大的excel辅助工具</title><link>http://sergget.qzz.io/posts/20200228-01/</link><pubDate>Fri, 28 Feb 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200228-01/</guid><description>&lt;h2 id="前言"&gt;前言
&lt;/h2&gt;&lt;p&gt;一直以来，excel都是被作为一个表格制作工具而不是一个数据处理工具来使用，不少人判断一个人对于excel的熟练程度往往都是看他能不能熟练地在excel里面添加各种花里胡哨的样式，而不是根据业务实际判断其对数据的组织方式的合理性。&lt;/p&gt;
&lt;p&gt;本人在工作中使用excel做过大量的数据处理，然而，在引入较大量的数据比如100行以上的情况下，数据统计计算的复杂度就随着数据量的增长而成指数量级增长。&lt;/p&gt;
&lt;p&gt;因此对于大批量的数据，本人倾向于1行记录1条数据进行存储，另开表格进行统计和计算。对于大批量的数据，利用excel自带的统计函数如SUMIF和AVERAGEIF在这种情况下就略显疲态，我们需要更强大的查询和统计工具。&lt;/p&gt;
&lt;h2 id="power-query简介"&gt;power query简介
&lt;/h2&gt;&lt;p&gt;power query是微软官方发布的一个excel插件，office 2016以上版本自带该工具，office 2010专业增强版、2013版本需要手动下载、安装&lt;a class="link" href="https://www.microsoft.com/zh-CN/download/details.aspx?id=39379" target="_blank" rel="noopener"
 &gt;power query插件&lt;/a&gt;。本文以office 2016版本为例，介绍power query的基本使用方法。2019版界面略有变化，请自行试验。&lt;/p&gt;
&lt;h2 id="先决知识"&gt;先决知识
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;基本的Excel公式知识。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;充分认识到仅依靠公式面对批量的业务数据的局限性。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="power-query编辑的基本思路"&gt;power query编辑的基本思路
&lt;/h2&gt;&lt;h3 id="1数据存储与数据处理"&gt;1、数据存储与数据处理
&lt;/h3&gt;&lt;p&gt;了解一些编程语言的读者应该清楚的一个原则是，我们需要将数据的存储与数据的处理分开，数据的存储应由处理数据的程序写入文件或者数据库、存储在硬盘上，在需要进行数据处理时，由程序将数据读取到内存中进行增删改查等操作。数据库程序作为数据处理的部分，则是常驻在内存中，而数据本身只有在需要的时候才会被读取，以减少内存占用。power query实际上就是提供了一个图形界面，用于编写和维护上述的处理数据的程序，我们不需要关心内存管理的问题。在power query处理过程中，我们需要关心的是数据处理的结果（power query生成的结果表格）与源数据的分离。&lt;/p&gt;
&lt;h3 id="2power-query维护数据关系"&gt;2、power query维护数据关系
&lt;/h3&gt;&lt;p&gt;由1我们知道，power query编辑的是&lt;code&gt;数据源 ====&amp;gt; 统计结果&lt;/code&gt;的映射，我们维护的是这一对应关系，在后续有任何数据增加、更新时，我们只需要点击&lt;code&gt;刷新&lt;/code&gt;按钮，power query 会根据我们事先编辑好地规则处理源数据，然后跟新最新的结果，不再是像传统的编辑excel表格的方式；&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="images/query-1.png"&gt;&lt;/p&gt;
&lt;h3 id="3power-query不直接修改行数据"&gt;3、power query不直接修改行数据
&lt;/h3&gt;&lt;p&gt;正是因为power query预设的工作环境是源数据在不断变化，所以更改某一具体的行或单元格的数据是没有意义的，因此所有的操作基本对象是1列。比如，替换字符串的操作，power query不提供对某一些具体的单元格范围内的字符串进行查找、替换的功能，而是在1列内查找、替换数据，因此一列的数据必须要是同一类型且表示同一个含义。只有这样的数据，在我们进行批量操作时才有意义。&lt;/p&gt;
&lt;h3 id="4关系的鲁棒性"&gt;4、关系的鲁棒性
&lt;/h3&gt;&lt;p&gt;鲁棒性是在写代码中非常常见的一个词，音/意译自英语&lt;code&gt;robust&lt;/code&gt;，实际上翻译成&lt;code&gt;健壮性&lt;/code&gt;更容易理解，但是&lt;code&gt;鲁棒&lt;/code&gt;这个翻译实在是太接地气了，又&lt;code&gt;“鲁”&lt;/code&gt;又&lt;code&gt;“棒”&lt;/code&gt;。不论是哪种翻译，都是在说程序的代码需要足够的稳定、健全。可是，&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="429px" data-flex-grow="178" height="577" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-01.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-01_hu_e0dd3584d9fa7936.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-01.png 1032w" width="1032"&gt;&lt;/p&gt;
&lt;p&gt;我们前面提到，power query编辑的是&lt;code&gt;数据源 ====&amp;gt; 统计结果&lt;/code&gt;的映射，这个映射是靠一步一步的步骤处理每一列来实现的，因此我们需要尽可能考虑到每一步都应全面考虑到这一步出现的所有可能情况，保证数据源数据的合法性和power query中编辑步骤的全面性。比如，分解日期列就需要保证数据源这一列全部是合理的日期。替换不需要的符号的时候就需要将所有可能出现的不需要的符号全部替换掉，即便当前数据中没有出现。如果没有考虑到所有的情况，在后续更新数据时很有可能出现某一步报错，造成后续步骤报错无法处理。这个时候再来排查错误就会非常耗时。&lt;/p&gt;
&lt;h2 id="基本的工作流程"&gt;基本的工作流程
&lt;/h2&gt;&lt;p&gt;对于一个基本的Power query的使用，我们首先需要准备如下的内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;1行存储1条数据的数据源，文中使用了一个随机生成的数据列表作为示例&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;已安装了power query插件的excel&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以上准备完成，我们就可以开始创建一个query：&lt;/p&gt;
&lt;p&gt;1、打开空excel表格，切换到&lt;code&gt;数据&lt;/code&gt;标签，可以看到左面的标签有几个不同的数据导入来源，由于我们刚刚开始，因此，我们选择&lt;code&gt;新建查询(New Query)&lt;/code&gt; =&amp;gt; &lt;code&gt;来自文件(From File)&lt;/code&gt; =&amp;gt; &lt;code&gt;来自工作簿(From Workbook)&lt;/code&gt;，然后选择上面准备的数据源。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1540px" data-flex-grow="642" height="183" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-02.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-02_hu_e1e0a8401060bd3d.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-02.png 1175w" width="1175"&gt;&lt;/p&gt;
&lt;p&gt;2、选择&lt;code&gt;编辑（Edit）&lt;/code&gt;，进入power query编辑器。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="301px" data-flex-grow="125" height="702" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-03.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-03_hu_45bf0d7a31b6491e.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-03.png 882w" width="882"&gt;&lt;/p&gt;
&lt;p&gt;3、进入编辑器后，我们可以看到一共提供了4个编辑标签页，其中前3个是我们经常使用的功能：&lt;code&gt;主页(home)&lt;/code&gt;、&lt;code&gt;转换(transform)&lt;/code&gt;、&lt;code&gt;添加列(add column)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1001px" data-flex-grow="417" height="304" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-04.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-04_hu_1f45939e5d6f7234.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-04.png 1269w" width="1269"&gt;&lt;/p&gt;
&lt;p&gt;4、在主页标签下，我们可以数据分组统计计算、管理列（删除）、行（删除错误行，前n行，后n行），进行排序、分列、合并查询(merge query)、添加查询(append query)等操作&lt;/p&gt;
&lt;p&gt;5、在转换标签下，我们可以调整列的数据类形，替换值，透视列或者反透视列，对列的数据进行计算，分析、格式化日期时间等操作&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1574px" data-flex-grow="655" height="211" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-05.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-05_hu_a1a58704eeb1a1a0.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-05.png 1384w" width="1384"&gt;&lt;/p&gt;
&lt;p&gt;6、在添加列标签下，我们可以在保留原数据列的前提下，进行计算、解析并新增列。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="938px" data-flex-grow="390" height="233" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-06.png" srcset="http://sergget.qzz.io/posts/20200228-01/computer-power-query-06_hu_55a33b41b52c44f3.png 800w, http://sergget.qzz.io/posts/20200228-01/computer-power-query-06.png 911w" width="911"&gt;&lt;/p&gt;
&lt;p&gt;在power query中，最常用的功能是&lt;code&gt;分组(group by)&lt;/code&gt;，合并查询(常用成多条件vlookup)、添加查询(同一类表格数据的合并)、日期时间解析和字符串的处理，这几项功能是我们在处理批量数据中最需要的功能，对批量的数据进行分组统计、并分配好对应的时间、分类之后得到的最终数据，即可再使用excel自带的透视图标进行分析。&lt;/p&gt;
&lt;p&gt;如果你需要一个源数据分多个透视表进行分析，也可以在power query中在某一步查询后复制查询，作为同一个数据源的分支，另行处理数据至想要的状态。&lt;/p&gt;
&lt;p&gt;7、处理数据后，我们点击主页标签下的&lt;code&gt;关闭并上载(close &amp;amp; load)&lt;/code&gt;即可将编辑后的数据导入到excel表格中。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="155px" data-flex-grow="64" height="814" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-07.png" width="527"&gt;&lt;/p&gt;
&lt;p&gt;power query生成的数据会新开一个标签，不会覆盖当前的工作表。上载数据后，我们会发现，当我们选中任意一个由power query生成的数据单元格的时候，excel会多出两个标签，&lt;code&gt;表设计&lt;/code&gt;和&lt;code&gt;查询&lt;/code&gt;，后续如果发生数据更新时，直接点击&lt;code&gt;查询&lt;/code&gt;标签下的&lt;code&gt;刷新&lt;/code&gt;即可。&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="1248px" data-flex-grow="520" height="135" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-08.png" width="702"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意:&lt;/strong&gt; 请在创建查询之前就将数据源表格放在你最终需要它们的文件夹下，否则事后移动数据源文件会导致查询找不到文件。&lt;/p&gt;
&lt;p&gt;8、当然，我们可以更改每一步步骤的参数，在编辑器的右边提供了步骤窗口，我们可以在这个窗口插入、删除、修改步骤：&lt;/p&gt;
&lt;p&gt;&lt;img class="gallery-image" data-flex-basis="247px" data-flex-grow="103" height="372" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="http://sergget.qzz.io/posts/20200228-01/computer-power-query-09.png" width="384"&gt;&lt;/p&gt;
&lt;p&gt;插入步骤：选中你想要插入步骤的位置的前一个步骤，然后在标签页进行需要插入的操作即可；&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;删除步骤：点击每一步前面的叉即可&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改步骤：能够修改的步骤在后面都有一个齿轮，点击齿轮则会弹出这一步骤的操作窗口&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此如果我们移动了工作簿的位置，就可以点击&lt;code&gt;源(Source)&lt;/code&gt;，并找到移动后的源数据工作簿的位置。&lt;/p&gt;
&lt;h2 id="结语"&gt;结语
&lt;/h2&gt;&lt;p&gt;power query 实际上是帮助我们方便地将数据源和数据结果分离的工具，作为真正的自动化工具非常适合各类市场、销售、运营等部门使用，配合透视图表能够自动化、可视化地更新各种日常化的数据，能够为制作报表的人员节省大量的时间，并且还能确保数据格式、图表规则的统一性。&lt;/p&gt;
&lt;p&gt;关于分组、合并查询、添加查询等功能具体教程会在后续继续增加，敬请期待。当然，你也可以自行尝试摸索，我相信自己摸索出来的知识远比看教程记得要牢固的多。&lt;/p&gt;
&lt;h2 id="题外话"&gt;题外话
&lt;/h2&gt;&lt;p&gt;对于互联网公司或者自行运行了sql数据库的大型企业，更适合使用微软基于power query、power map等工具研发的Power BI，它从数据库等获得数据源、通过查询工具加工处理，再通过power map 和透视图表和其他可视化部件直观地展现当前的运营状态等数据，同时还提供了移动端的报表面板，非常适合各种大中型企业使用。&lt;/p&gt;</description></item><item><title>抛弃迅雷，投入BT的怀抱吧</title><link>http://sergget.qzz.io/posts/20200205-01/</link><pubDate>Wed, 05 Feb 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200205-01/</guid><description>&lt;hr&gt;
&lt;p&gt;由于最近的特殊情况，不得不宅在家中（其实没这档子事儿我也乐意待家里），于是乎就下载了大量的电影，迅雷加速基本和百度网盘一个性质，本人都没有购买会员，通过bt种子或磁力链接进行下载。并且可以跑满带宽上限。下面就分享下：&lt;/p&gt;
&lt;h2 id="客户端"&gt;客户端
&lt;/h2&gt;&lt;p&gt;我是用的客户端是比特彗星&lt;a class="link" href="http://www.bitcomet.com/" target="_blank" rel="noopener"
 &gt;bitcomet&lt;/a&gt;，所谓的登录和上传升级加速之类的都是扯淡，实际当中考虑到这些bt客户端往往都有防吸血的功能，因此，上传的限速不要太过分就可以了。&lt;/p&gt;
&lt;p&gt;也可以考虑使用uTorrent客户端或者uTorrent web。&lt;/p&gt;
&lt;h2 id="添加tracker"&gt;添加Tracker
&lt;/h2&gt;&lt;h3 id="tracker是什么"&gt;Tracker是什么？
&lt;/h3&gt;&lt;p&gt;我们知道BT下载或者磁力下载是一种去中心化的网络内容分发的机制，每个人既是下载的，也是上传的，没人做种，也就没法下载。做种的人越多，你下载的速度就能越快，但是这并不是完全意义上的去中心化，因为你不知道有谁在做种。&lt;/p&gt;
&lt;p&gt;因此我们需要中心化的服务器，来将大家上传和下载的请求信息进行交换，然后各个客户端各自进行连接交换数据。&lt;/p&gt;
&lt;h3 id="为什么添加tracker"&gt;为什么添加Tracker?
&lt;/h3&gt;&lt;p&gt;简单地说， &lt;strong&gt;优质的 Tracker，可以有效提高资源解析速度及下载速度。&lt;/strong&gt; &lt;strong&gt;同时，用这些 Tracker 的人越多，大家的下载速度就越快&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="向比特彗星添加tracker"&gt;向比特彗星添加Tracker
&lt;/h3&gt;&lt;p&gt;点击&lt;a class="link" href="http://www.bitcomet.com/en/downloads" target="_blank" rel="noopener"
 &gt;链接&lt;/a&gt;下载比特彗星，安装完成后，可能是默认为英语，选择工具栏的Tools =&amp;gt; Language =&amp;gt; Chinese&lt;/p&gt;
&lt;p&gt;更改语言后，添加Tracker服务器的订阅链接。Github的XIU2汇总了一些优质的Tracker列表:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;项目地址： &lt;a class="link" href="https://github.com/XIU2/TrackersListCollection" target="_blank" rel="noopener"
 &gt;https://github.com/XIU2/TrackersListCollection&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;项目网站： &lt;a class="link" href="https://trackerslist.com/#/zh" target="_blank" rel="noopener"
 &gt;https://trackerslist.com/#/zh&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;项目提供了两个订阅列表：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;精选版： &lt;a class="link" href="https://trackerslist.com/best.txt" target="_blank" rel="noopener"
 &gt;https://trackerslist.com/best.txt&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完整版： &lt;a class="link" href="https://trackerslist.com/all.txt" target="_blank" rel="noopener"
 &gt;https://trackerslist.com/all.txt&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;请选择上面任意一个链接，复制。打开比特彗星 =&amp;gt; 工具 =&amp;gt; 人物设置 =&amp;gt; Tracker =&amp;gt; 勾选”每天自动更新Tracker服务器列表”，然后在下面的输入框内粘贴刚才复制的订阅列表，点击立即更新，确定即可。&lt;/p&gt;</description></item><item><title>排除文件共享故障</title><link>http://sergget.qzz.io/posts/20200126-01/</link><pubDate>Sun, 26 Jan 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200126-01/</guid><description>&lt;p&gt;“文件共享”（Sharing）是被使用最多的网络远程文件访问功能，却也是最容易出问题的一部分，许多用户在使用一些优化工具后，发现文件共享功能突然就失效了，或者无论如何都无法成功共享文件，这也是很多网络管理员要面对的棘手问题，如果你也不巧遇到了，那么可以尝试检查以下几种原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;相应的服务被禁止&lt;br&gt;
文件共享功能依赖于这4个服务：Computer Browser、TCP/IP NetBIOS Helper Service、Server、Workstation，如果它们的其中一个被禁止了，文件共享功能就会出现各种古怪问题如不能通过计算机名访问等，甚至完全不能访问。&lt;/li&gt;
&lt;li&gt;内置来宾账户组成员Guest未启用&lt;br&gt;
文件共享功能需要使用Guest权限访问网络资源。&lt;/li&gt;
&lt;li&gt;内置来宾账户组成员Guest被禁止从网络访问&lt;br&gt;
这问题常见于XP系统，因为它在组策略（gpedit.msc）-&amp;gt;计算机配置-&amp;gt;Windows设置-&amp;gt;安全设置-&amp;gt;本地策略-&amp;gt;用户权利指派-&amp;gt;拒绝从网络访问这台计算机里把Guest账户添加进去了，删除掉即可真正启用Guest远程访问权限。&lt;/li&gt;
&lt;li&gt;限制了匿名访问的权限&lt;br&gt;
默认情况下，组策略（gpedit.msc）-&amp;gt;计算机配置-&amp;gt;Windows设置-&amp;gt;安全设置-&amp;gt;本地策略-&amp;gt;安全选项-&amp;gt;对匿名连结的额外限制的设置应该是“无。依赖于默认许可权限”或者“不允许枚举SAM账号和共享”，如果有工具自作聪明帮你把它设置为“没有显式匿名权限就无法访问”，那么我可以很负责的告诉你，你的共享全完蛋了。&lt;/li&gt;
&lt;li&gt;系统权限指派出现意外&lt;br&gt;
默认情况下，系统会给共享目录指派一个“Everyone”账户访问授权，然而实际上它还是要使用Guest成员完成访问的工作，但是有时候，Everyone却忘记Guest的存在了，这是或我们就需要自己给共享目录手动添加一个Guest账户，才能完成远程访问。（图.手动添加一个账户权限）&lt;/li&gt;
&lt;li&gt;NTFS权限限制&lt;br&gt;
一些刚接触NTFS的用户或者新手管理员经常会出这个差错，在排除以上所有问题的前提下依然无法实现文件共享，哪里都碰过了就是偏偏不知道来看看这个目录的“安全”选项卡，并在里面设置好Everyone的相应权限和添加一个Guest权限进去。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;———————————–&lt;/p&gt;
&lt;h2 id="故障排除"&gt;故障排除
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;启用来宾帐户&lt;br&gt;
“控制面板-用户帐户-启用来宾帐户”&lt;/li&gt;
&lt;li&gt;安装NetBEUI协议&lt;br&gt;
查看“网上邻居”属性——查看“本地连接”属性——点击“安装”——查看 “协议”——看其中NetBEUI协议是否存在，如果存在则安装这个协议，如果不存在则表明已经安装了该协议，在Winxp系统默认的情况下该协议是已经安装好了的。&lt;/li&gt;
&lt;li&gt;查看本地安全策略设置是否禁用了GUEST账号&lt;br&gt;
控制面板——管理工具——本地安全策略——用户权利指派——查看“拒绝从网络访问这台计算机”项的属性——看里面是否有GUEST帐户，如果有就把它删除掉。&lt;/li&gt;
&lt;li&gt;设置共享文件夹&lt;br&gt;
你如果不设置共享文件夹的话，网内的其它机器无法访问到你的机器。设置文件夹共享的方法有三种：
&lt;ul&gt;
&lt;li&gt;“工具－－文件夹选项－－查看－－使用简单文件夹共享”。这样设置后，其他用户只能以Guest用户的身份访问你共享的文件或者是文件夹。&lt;/li&gt;
&lt;li&gt;“控制面板－－管理工具－－计算机管理”，在“计算机管理”这个对话框中，依次点击“文件夹共享－－共享”，然后在右键中选择“新建共享”即可。&lt;/li&gt;
&lt;li&gt;直接在你想要共享的文件夹上点击右键,通过“共享和安全”选项即可设置共享。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;建立工作组&lt;br&gt;
在Windows桌面上用右键点击“我的电脑”，选择“属性”，然后单击“计算机名”选项卡，看看该选项卡中有没有出现你的局域网工作组名称，如“workgroup”等。然后单击“网络 ID”按钮，开始“网络标识向导”：单击“下一步”，选择“本机是商业网络的一部分，用它连接到其他工作着的计算机”；单击“下一步”，选择“公司使用没有域的网络”；单击“下一步”按钮，然后输入你的局域网的工作组名，这里我建议大家用“BROADVIEW”，再次单击“下一步”按钮，最后单击“完成”按钮完成设置&lt;br&gt;
重新启动计算机后，局域网内的计算机就可以互访了。&lt;/li&gt;
&lt;li&gt;查看“计算机管理”是否启用来宾帐户。&lt;br&gt;
控制面版——计算机管理——本地用户和组——用户——启用来宾帐户。机器重新启动后就可以了&lt;br&gt;
如果大家想提高访问别人机器的速度的话，还可以做一些相关操作：控制面版——管理工具——服务——Task Scheduler——属性——启动方式改为手动，这样就可以了。&lt;/li&gt;
&lt;li&gt;用户权利指派&lt;br&gt;
“控制面板－－管理工具－－本地安全策略”，在“本地安全策略”对话框中，依次选择“本地策略－－用户权利指派”，在右边的选项中依次对“从网络上访问这台计算机”和“拒绝从网络上访问这台计算机”这两个选项进行设置&lt;br&gt;
“从网络上访问这台计算机”选项需要将guest用户和everyone添加进去；“拒绝从网络上访问这台计算机”需要将被拒绝的所有用户删除掉，默认情况下guest是被拒绝访问的。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;上述方法的所有步骤并不是设置局域网都必须进行的，因为有些步骤在默认情况下已经设置。但是只要你的局域网出现了不能访问的现象，通过上述设置肯定能保证局域网的畅通.&lt;/p&gt;</description></item><item><title>Git 配置指南</title><link>http://sergget.qzz.io/posts/20200101-01/</link><pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200101-01/</guid><description>&lt;hr&gt;
&lt;h2 id="安装"&gt;安装
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install git git-core
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="初始配置"&gt;初始配置
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;用户信息 配置个人的用户名称和电子邮件地址：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config –global user.name “runoob”
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config –global user.email test@runoob.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;文本编辑器&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config –global core.editor vim
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;差异分析工具&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;$&lt;/span&gt; &lt;span class="n"&gt;git&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="err"&gt;–&lt;/span&gt;&lt;span class="n"&gt;global&lt;/span&gt; &lt;span class="n"&gt;merge&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="k"&gt;tool&lt;/span&gt; &lt;span class="n"&gt;vimdiff&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;检查已有的配置信息&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config –list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="命令"&gt;命令
&lt;/h2&gt;&lt;h3 id="git-diff"&gt;git diff
&lt;/h3&gt;&lt;p&gt;执行 git diff 来查看执行 git status 的结果的详细信息。git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;尚未缓存的改动：git diff&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看已缓存的改动： git diff –cached&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看已缓存的与未缓存的所有改动：git diff HEAD&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;显示摘要而非整个 diff：git diff –stat&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="git-log-查看提交历史"&gt;Git log 查看提交历史
&lt;/h3&gt;&lt;p&gt;在使用 Git 提交了若干更新之后，又或者克隆了某个项目，想回顾下提交历史，我们可以使用 git log 命令查看。&lt;br&gt;
针对我们前一章节的操作，使用 git log 命令列出历史提交记录如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;em&gt;参数：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--oneline&lt;/code&gt;选项来查看历史记录的简洁的版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log –oneline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--graph&lt;/code&gt; 选项，查看历史中什么时候出现了分支、合并。以下为相同的命令，开启了拓扑图选项：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log –oneline –graph
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--reverse&lt;/code&gt;参数来逆向显示所有日志。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log –reverse –oneline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;查找指定用户的提交日志可以使用命令：&lt;code&gt;git log --author&lt;/code&gt; , 例如，比方说我们要找 Git 源码中 Linus 提交的部分：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log –author=Linus –oneline -5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果你要指定日期，可以执行几个选项：–since 和 –before，但是你也可以用 –until 和 –after。&lt;br&gt;
例如，如果我要看 Git 项目中三周前且在四月十八日之后的所有提交，我可以执行这个（我还用了 –no-merges 选项以隐藏合并提交）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git log –oneline –before={3.weeks.ago} –after={2010-04-18} –no-merges
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="git-tag-标签"&gt;Git tag 标签
&lt;/h3&gt;&lt;p&gt;如果你达到一个重要的阶段，并希望永远记住那个特别的提交快照，你可以使用 git tag 给它打上标签。&lt;/p&gt;
&lt;p&gt;比如说，我们想为我们的 w3cschoolcc 项目发布一个”1.0″版本：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag -a v1.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;选项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-a 选项意为”创建一个带注解的标签”。不用 -a 选项也可以执行的，但它不会记录这标签是什么时候打的，谁打的，也不会让你添加个标签的注解。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="追加标签"&gt;追加标签
&lt;/h4&gt;&lt;p&gt;如果我们忘了给某个提交打标签，又将它发布了，我们可以给它追加标签。例如，假设我们发布了提交 85fc7e7，但是那时候忘了给它打标签。 我们现在也可以：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag -a v0.9 85fc7e7
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="指定标签信息命令"&gt;指定标签信息命令：
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag -a -m “w3cschool.cc标签”
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="pgp签名标签命令"&gt;PGP签名标签命令：
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag -s -m “w3cschool.cc标签”
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="git-远程仓库github"&gt;Git 远程仓库(Github)
&lt;/h3&gt;&lt;h4 id="添加远程库"&gt;添加远程库
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote add [shortname] [url]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的，所以我们需要配置验证信息：&lt;br&gt;
使用以下命令生成SSH Key：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ssh-keygen -t rsa -C “youremail@example.com”
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;成功的话会在~/下生成.ssh文件夹，进去，打开 id_rsa.pub，复制里面的 key。&lt;br&gt;
回到 github 上，进入 Account =&amp;gt; Settings（账户配置）。&lt;/p&gt;
&lt;p&gt;左边选择 SSH and GPG keys，然后点击 New SSH key 按钮,title 设置标题，可以随便填，粘贴在你电脑上生成的 key。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;查看当前的远程库&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;配置上游分支&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push –set-upstream [repo] [branch]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;提取远程仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;从远程仓库下载新分支与数据：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;该命令执行完后需要执行git merge 远程分支到你所在的分支。&lt;/p&gt;
&lt;p&gt;2.从远端仓库提取数据并尝试合并到当前分支：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="推送到远程仓库"&gt;推送到远程仓库
&lt;/h4&gt;&lt;p&gt;推送你的新分支与数据到某个远端仓库命令:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push [alias] [branch]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="删除远程仓库"&gt;删除远程仓库
&lt;/h4&gt;&lt;p&gt;删除远程仓库你可以使用命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote rm [别名]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>gitbook 使用入门</title><link>http://sergget.qzz.io/posts/20200101-02/</link><pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200101-02/</guid><description>&lt;p&gt;&lt;a class="link" href="https://www.gitbook.com/" target="_blank" rel="noopener"
 &gt;GitBook 官网&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/GitbookIO/gitbook" target="_blank" rel="noopener"
 &gt;GitBook 文档&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="gitbook-准备工作"&gt;GitBook 准备工作
&lt;/h2&gt;&lt;h3 id="安装-nodejs"&gt;安装 Node.js
&lt;/h3&gt;&lt;p&gt;GitBook 是一个基于 Node.js 的命令行工具，下载安装 Node.js，安装完成之后，你可以使用下面的命令来检验是否安装成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v7.7.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="安装-gitbook"&gt;安装 GitBook
&lt;/h3&gt;&lt;p&gt;输入下面的命令来安装 GitBook&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm install gitbook-cli -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;安装完成之后，你可以使用下面的命令来检验是否安装成功。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gitbook -V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CLI version: 2.3.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GitBook version: 3.2.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;更多详情请参照 &lt;a class="link" href="https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md" target="_blank" rel="noopener"
 &gt;GitBook 安装文档&lt;/a&gt; 来安装 GitBook。&lt;/p&gt;
&lt;h3 id="安装-gitbook-编辑器"&gt;安装 GitBook 编辑器
&lt;/h3&gt;&lt;p&gt;去 GitBook 官网 下载 GitBook 编辑器；如果是 Mac 用户且安装过 &lt;code&gt;brew cask&lt;/code&gt; 的话可以使用 &lt;strong&gt;&lt;code&gt;brew cask install gitbook-editor&lt;/code&gt;&lt;/strong&gt; 命令行来安装 GitBook 编辑器。&lt;/p&gt;
&lt;h2 id="先睹为快"&gt;先睹为快
&lt;/h2&gt;&lt;p&gt;GitBook 准备工作做好之后，我们进入一个你要写书的目录，输入如下命令。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gitbook init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;warn: no summary file in this book
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: create README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: create SUMMARY.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;info: initialization is finished
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;可以看到他会创建 README.md 和 SUMMARY.md 这两个文件，README.md 应该不陌生，就是说明文档，而 SUMMARY.md 其实就是书的章节目录，其默认内容如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Summary
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* [Introduction](README.md)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接下来，我们输入&lt;code&gt;$ gitbook serve&lt;/code&gt; 命令，然后在浏览器地址栏中输入&lt;code&gt;http://localhost:4000&lt;/code&gt; 便可预览书籍。&lt;/p&gt;
&lt;p&gt;运行该命令后会在书籍的文件夹中生成一个 &lt;code&gt;_book&lt;/code&gt; 文件夹, 里面的内容即为生成的 html 文件，我们可以使用下面命令来生成网页而不开启服务器。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gitbook build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;下面我们来详细介绍下 GitBook 目录结构及相关文件。&lt;/p&gt;
&lt;h3 id="目录结构"&gt;目录结构
&lt;/h3&gt;&lt;p&gt;GitBook 基本的目录结构如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── book.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── SUMMARY.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── chapter-1/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| ├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;| └── something.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── chapter-2/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── something.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h4 id="summarymd"&gt;SUMMARY.md
&lt;/h4&gt;&lt;p&gt;这个文件主要决定 GitBook 的章节目录，它通过 Markdown 中的列表语法来表示文件的父子关系，下面是一个简单的示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Introduction&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt; &lt;span class="n"&gt;I&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Writing&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;nice&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;writing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GitBook&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;nice&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gitbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Part&lt;/span&gt; &lt;span class="n"&gt;II&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;We&lt;/span&gt; &lt;span class="n"&gt;love&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;feedback_please&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Better&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;better_tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我们通过使用 标题 或者 水平分割线 将 GitBook 分为几个不同的部分，如下所示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Summary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### Part I&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Introduction&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;README&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Writing&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;nice&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;writing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;GitBook&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;nice&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gitbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;### Part II&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;We&lt;/span&gt; &lt;span class="n"&gt;love&lt;/span&gt; &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;feedback_please&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Better&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;authors&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;better_tools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Last&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="n"&gt;without&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;part3&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="插件"&gt;插件
&lt;/h3&gt;&lt;p&gt;GitBook 有 插件官网，默认带有 5 个插件，highlight、search、sharing、font-settings、livereload，如果要去除自带的插件， 可以在插件名称前面加 -，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;plugins&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;-search&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果要配置使用的插件可以在 book.json 文件中加入即可，比如我们添加 plugin-github，我们在 book.json 中加入配置如下即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;plugins&amp;#34;: [ &amp;#34;github&amp;#34; ],
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;pluginsConfig&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;github&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;#34;url&amp;#34;: &amp;#34;https://github.com/your/repo&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后在终端输入&lt;code&gt;gitbook install ./&lt;/code&gt; 即可。&lt;br&gt;
如果要指定插件的版本可以使用 &lt;code&gt;plugin@0.3.1&lt;/code&gt;，因为一些插件可能不会随着 GitBook 版本的升级而升级。&lt;/p&gt;
&lt;h2 id="导出pdf文件"&gt;导出pdf文件
&lt;/h2&gt;&lt;p&gt;安装&lt;a class="link" href="https://calibre-ebook.com/" target="_blank" rel="noopener"
 &gt;&lt;code&gt;calibre-ebook&lt;/code&gt;&lt;/a&gt;和&lt;code&gt;ebook-convert&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install ebook-convert -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然后再执行转换&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;windows下: &lt;code&gt;gitbook pdf [被转换目录] [转换后的文件名]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;linux下的转换需要退回到上一层目录：&lt;code&gt;gitbook pdf [被转换目录]&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>搭建一个webdav 服务器</title><link>http://sergget.qzz.io/posts/20200101-03/</link><pubDate>Wed, 01 Jan 2020 00:00:00 +0000</pubDate><guid>http://sergget.qzz.io/posts/20200101-03/</guid><description>&lt;h2 id="什么是webdav"&gt;什么是WebDAV？
&lt;/h2&gt;&lt;p&gt;WebDAV（Web Distributed Authoring and Versioning）是HTTP/1.1协议的扩展，支持：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文件锁定（防止编辑冲突）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;元数据管理（作者、修改日期等）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;命名空间操作（移动/复制文件）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;版本控制（通过DeltaV扩展）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相比FTP，WebDAV使用标准HTTP端口（80/443），更易穿透防火墙，且支持加密传输。&lt;/p&gt;
&lt;h2 id="环境准备"&gt;环境准备
&lt;/h2&gt;&lt;h3 id="1-安装apache2"&gt;1. 安装Apache2
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install apache2 -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-安装测试工具可选"&gt;2. 安装测试工具（可选）
&lt;/h3&gt;&lt;p&gt;cadaver是命令行WebDAV客户端：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cadaver -y
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="配置步骤"&gt;配置步骤
&lt;/h2&gt;&lt;h3 id="1-启用apache模块"&gt;1. 启用Apache模块
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo a2enmod dav_fs # 自动包含dav模块
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo a2enmod dav_lock # 文件锁定支持
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart apache2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="2-创建共享目录"&gt;2. 创建共享目录
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chown&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;chmod&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;R&lt;/span&gt; &lt;span class="mi"&gt;775&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt; &lt;span class="c1"&gt;# 确保可写权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="3-创建认证用户"&gt;3. 创建认证用户
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#创建密码文件（首次使用-c参数）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo htpasswd -c /etc/apache2/webdav.passwd sergget
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#添加额外用户（省略-c参数）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo htpasswd /etc/apache2/webdav.passwd user2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#设置权限
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown root:www-data /etc/apache2/webdav.passwd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod 640 /etc/apache2/webdav.passwd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="4-配置虚拟主机"&gt;4. 配置虚拟主机
&lt;/h3&gt;&lt;p&gt;创建配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/apache2/sites-available/webdav.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;添加以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;VirtualHost&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ServerAdmin&lt;/span&gt; &lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DocumentRoot&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;www&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# WebDAV专属路径&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Alias&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/var/www/webdav&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ne"&gt;Directory&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/var/www/webdav&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DAV&lt;/span&gt; &lt;span class="n"&gt;On&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Options&lt;/span&gt; &lt;span class="n"&gt;Indexes&lt;/span&gt; &lt;span class="n"&gt;FollowSymLinks&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 认证配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AuthType&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AuthName&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WebDAV Access&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AuthUserFile&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;apache2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Require&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 权限设置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;LimitExcept&lt;/span&gt; &lt;span class="n"&gt;GET&lt;/span&gt; &lt;span class="n"&gt;POST&lt;/span&gt; &lt;span class="n"&gt;OPTIONS&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Require&lt;/span&gt; &lt;span class="n"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;LimitExcept&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="ne"&gt;Directory&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ErrorLog&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APACHE_LOG_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CustomLog&lt;/span&gt; &lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APACHE_LOG_DIR&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;webdav&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;access&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt; &lt;span class="n"&gt;combined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="n"&gt;VirtualHost&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="5-启用站点"&gt;5. 启用站点
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;a2dissite&lt;/span&gt; &lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="c1"&gt;# 禁用默认站点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;a2ensite&lt;/span&gt; &lt;span class="n"&gt;webdav&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conf&lt;/span&gt; &lt;span class="c1"&gt;# 启用WebDAV配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sudo&lt;/span&gt; &lt;span class="n"&gt;systemctl&lt;/span&gt; &lt;span class="n"&gt;reload&lt;/span&gt; &lt;span class="n"&gt;apache2&lt;/span&gt; &lt;span class="c1"&gt;# 平滑重载配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="连接验证"&gt;连接验证
&lt;/h2&gt;&lt;h3 id="命令行测试"&gt;命令行测试
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cadaver http://localhost/webdav/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#输入创建的用户名/密码
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls # 列出文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;put test.txt # 上传文件
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;get document.pdf # 下载文件
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="客户端支持"&gt;客户端支持
&lt;/h3&gt;&lt;p&gt;常用支持WebDAV的客户端：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Windows：映射网络驱动器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;macOS：Finder &amp;gt; 连接服务器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Linux：Dolphin/GNOME Files&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;手机：Solid Explorer, FE File Explorer&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="高级配置建议"&gt;高级配置建议
&lt;/h2&gt;&lt;p&gt;1.&lt;strong&gt;启用HTTPS加密&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install certbot python3-certbot-apache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot --apache
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;2.&lt;strong&gt;存储配额限制&lt;/strong&gt;&lt;br&gt;
在&lt;code&gt;&amp;lt;Directory&amp;gt;&lt;/code&gt;块中添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DavQuota on
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DavQuotaLimit &amp;#34;1 GB&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;增强安全设置&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 禁用目录列表
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Options -Indexes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 限制IP访问
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Require ip 192.168.1.0/24
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="故障排查"&gt;故障排查
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;权限问题&lt;/strong&gt;：确保&lt;code&gt;www-data&lt;/code&gt;用户对目录有写权限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;连接拒绝&lt;/strong&gt;：检查防火墙设置 &lt;code&gt;sudo ufw allow 80/tcp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认证失败&lt;/strong&gt;：验证密码文件路径和权限&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看日志&lt;/strong&gt;：&lt;code&gt;tail -f /var/log/apache2/webdav-*.log&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;最佳实践提示：生产环境务必启用HTTPS，定期使用&lt;code&gt;htpasswd&lt;/code&gt;命令更新密码，敏感文件避免使用WebDAV共享。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item></channel></rss>