<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lixx</title><link>https://www.lixx.org/</link><description>Recent content on Lixx</description><generator>Hugo -- gohugo.io</generator><language>zh</language><copyright>LIXX.org All Rights Reserved.</copyright><lastBuildDate>Wed, 20 May 2026 11:30:00 +0000</lastBuildDate><atom:link href="https://www.lixx.org/index.xml" rel="self" type="application/rss+xml"/><item><title>`.org` 域名从 2026 年 6 月 1 日起涨价</title><link>https://www.lixx.org/a/acab/</link><pubDate>Wed, 20 May 2026 11:30:00 +0000</pubDate><guid>https://www.lixx.org/a/acab/</guid><description>&lt;h2 id="spaceship"&gt;&lt;a href="#spaceship" class="header-anchor"&gt;&lt;/a&gt;Spaceship
&lt;/h2&gt;&lt;p&gt;根据 Spaceship 发送给用户的邮件显示，从 2026 年 6 月 1 日起，&lt;code&gt;.org&lt;/code&gt; 域名的注册、续费、转移价格从之前的 $9.80 变为 $11.39&lt;/p&gt;
&lt;blockquote class="alert alert-tip"&gt;
 &lt;div class="alert-header"&gt;
 &lt;span class="alert-icon"&gt;💡&lt;/span&gt;
 &lt;span class="alert-title"&gt;提示&lt;/span&gt;
 &lt;/div&gt;
 &lt;div class="alert-body"&gt;
 &lt;p&gt;Spaceship 的价格不包含 $0.20 / year 的 ICANN fee&lt;/p&gt;
 &lt;/div&gt;
 &lt;/blockquote&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Types&lt;/th&gt;
 &lt;th&gt;Previously Pricing&lt;/th&gt;
 &lt;th&gt;New Pricing&lt;/th&gt;
 &lt;th&gt;Changes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;registrations / reactivations / renewals / transfers&lt;/td&gt;
 &lt;td&gt;$9.80&lt;/td&gt;
 &lt;td&gt;$11.39&lt;/td&gt;
 &lt;td&gt;+1.59&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;img src="https://www.lixx.org/images/5d47d9902c21c3e9b9ec483fa8fc582f545ee871e986decc81c72741c2ca6e58.avif" data-u-e-src="https://www.lixx.org/images/5d47d9902c21c3e9b9ec483fa8fc582f545ee871e986decc81c72741c2ca6e58.avif"
	
	
	
	loading="lazy"
	
		alt="Spaceship - Important Alert: Price increase for .org"
 data-u-e-alt="Spaceship - Important Alert: Price increase for .org"

	
	
	data-zoomable
 data-u-e="img"
&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="cloudflare"&gt;&lt;a href="#cloudflare" class="header-anchor"&gt;&lt;/a&gt;Cloudflare
&lt;/h2&gt;&lt;p&gt;根据 Cloudflare 控制台 的域名注册页面和域名续费页面显示，从 2026 年 6 月 1 日起，&lt;code&gt;.ORG&lt;/code&gt; 域名的注册价格从 $7.50 变为 $8.50 , 域名的转移/续费价格从 $10.13 变为 $11.20&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Types&lt;/th&gt;
 &lt;th&gt;Previously Pricing&lt;/th&gt;
 &lt;th&gt;New Pricing&lt;/th&gt;
 &lt;th&gt;Changes&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Registration&lt;/td&gt;
 &lt;td&gt;$7.50&lt;/td&gt;
 &lt;td&gt;$8.50&lt;/td&gt;
 &lt;td&gt;+1.00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Renewal / Transfer&lt;/td&gt;
 &lt;td&gt;$10.13&lt;/td&gt;
 &lt;td&gt;$11.20&lt;/td&gt;
 &lt;td&gt;+1.07&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;img src="https://www.lixx.org/images/872ba2a8dc1edd559a9c946472395bb3806497ced22a6bbed849288ee14654d6.avif" data-u-e-src="https://www.lixx.org/images/872ba2a8dc1edd559a9c946472395bb3806497ced22a6bbed849288ee14654d6.avif"
	
	
	
	loading="lazy"
	
		alt="Cloudflare - .ORG pricing will change on June 1, 2026"
 data-u-e-alt="Cloudflare - .ORG pricing will change on June 1, 2026"

	
	
	data-zoomable
 data-u-e="img"
&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>无须 Grub2, 使用 EFIStub 直接通过 UEFI 启动 Debian</title><link>https://www.lixx.org/a/dea7/</link><pubDate>Sun, 01 Jun 2025 09:35:21 +0000</pubDate><guid>https://www.lixx.org/a/dea7/</guid><description>&lt;p&gt;默认情况下，Debian 的启动过程分为主板启动 Grub2, 再由 Grub2 启动 Linux 两部分。&lt;/p&gt;
&lt;p&gt;然而从 Debian Wheezy 起，Debian Linux 内核包含了一个自己的 &lt;a class="link" href="https://wiki.debian.org/BootLoader" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/BootLoader" data-u-e-text="BootLoader"&gt;BootLoader&lt;/a&gt;
 叫作 &lt;a class="link" href="https://wiki.debian.org/EFIStub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/EFIStub" data-u-e-text="EFI stub"&gt;EFI stub&lt;/a&gt;
 （或者叫作 &lt;a class="link" href="https://wiki.archlinux.org/title/EFI_boot_stub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.archlinux.org/title/EFI_boot_stub" data-u-e-text="EFI boot stub"&gt;EFI boot stub&lt;/a&gt;
）。因此可以从 UEFI 直接启动内核，而不需要额外的 bootloader 例如 Grub2.&lt;/p&gt;
&lt;p&gt;要实现以上所述，需要进行一些设置，大致可以分为以下两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a class="link" href="#%e5%a4%8d%e5%88%b6-kernel-%e5%92%8c-initrd-%e5%88%b0-efi-%e5%88%86%e5%8c%ba" data-u-e="a" data-u-e-url="#%e5%a4%8d%e5%88%b6-kernel-%e5%92%8c-initrd-%e5%88%b0-efi-%e5%88%86%e5%8c%ba" data-u-e-text="复制 kernel 和 initrd 到 EFI 分区"&gt;复制 kernel 和 initrd 到 EFI 分区&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="#%e5%88%9b%e5%bb%ba-uefi-%e5%90%af%e5%8a%a8%e6%9d%a1%e7%9b%ae" data-u-e="a" data-u-e-url="#%e5%88%9b%e5%bb%ba-uefi-%e5%90%af%e5%8a%a8%e6%9d%a1%e7%9b%ae" data-u-e-text="创建 UEFI 启动条目"&gt;创建 UEFI 启动条目&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="复制-kernel-和-initrd-到-efi-分区"&gt;&lt;a href="#%e5%a4%8d%e5%88%b6-kernel-%e5%92%8c-initrd-%e5%88%b0-efi-%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;复制 kernel 和 initrd 到 EFI 分区
&lt;/h2&gt;&lt;p&gt;根据 &lt;a class="link" href="https://wiki.debian.org/EFIStub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/EFIStub" data-u-e-text="EFIStub - Debian Wiki"&gt;EFIStub - Debian Wiki&lt;/a&gt;
 ， UEFI 启动只能从 EFI 分区加载文件。因此需要将内核文件和 initrd 文件放置到 EFI 分区。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;lsblk&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ lsblk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nvme0n1 259:0 &lt;span class="m"&gt;0&lt;/span&gt; 476.9G &lt;span class="m"&gt;0&lt;/span&gt; disk
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-nvme0n1p1 259:1 &lt;span class="m"&gt;0&lt;/span&gt; 976M &lt;span class="m"&gt;0&lt;/span&gt; part /boot/efi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-nvme0n1p2 259:2 &lt;span class="m"&gt;0&lt;/span&gt; 977M &lt;span class="m"&gt;0&lt;/span&gt; part /boot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;-nvme0n1p3 259:3 &lt;span class="m"&gt;0&lt;/span&gt; 475G &lt;span class="m"&gt;0&lt;/span&gt; part
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt;-Debian-root 254:0 &lt;span class="m"&gt;0&lt;/span&gt; 31.3G &lt;span class="m"&gt;0&lt;/span&gt; lvm /
&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="手动复制内核和-initrd"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e5%a4%8d%e5%88%b6%e5%86%85%e6%a0%b8%e5%92%8c-initrd" class="header-anchor"&gt;&lt;/a&gt;手动复制内核和 initrd
&lt;/h3&gt;&lt;p&gt;默认情况下，Debian 的内核和 initrd 文件位于 Boot 分区，即 &lt;code&gt;/boot/&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-4"&gt;&lt;a class="lnlinks" href="#hl-1-4"&gt;4&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -Alhs /boot/&lt;span class="o"&gt;{&lt;/span&gt;vmlinuz,initrd&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;45M -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root 45M Dec &lt;span class="m"&gt;31&lt;/span&gt; 03:37 /boot/initrd.img-6.12.63+deb13-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;12M -rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root 12M Dec &lt;span class="m"&gt;31&lt;/span&gt; 03:37 /boot/vmlinuz-6.12.63+deb13-amd64
&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;a href="#%e5%a4%8d%e5%88%b6%e5%86%85%e6%a0%b8%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp --verbose &lt;span class="s2"&gt;&amp;#34;/boot/vmlinuz-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; /boot/efi/EFI/debian/vmlinuz.efi
&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="复制-initrd-文件"&gt;&lt;a href="#%e5%a4%8d%e5%88%b6-initrd-%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;复制 initrd 文件
&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo cp --verbose &lt;span class="s2"&gt;&amp;#34;/boot/initrd.img-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; /boot/efi/EFI/debian/initrd.img
&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="自动复制内核和-initrd"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e5%a4%8d%e5%88%b6%e5%86%85%e6%a0%b8%e5%92%8c-initrd" class="header-anchor"&gt;&lt;/a&gt;自动复制内核和 initrd
&lt;/h3&gt;&lt;h4 id="自动化复制内核"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%8d%e5%88%b6%e5%86%85%e6%a0%b8" class="header-anchor"&gt;&lt;/a&gt;自动化复制内核
&lt;/h4&gt;&lt;p&gt;创建文件 &lt;code&gt;/etc/kernel/postinst.d/zz-update-efistub&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/kernel/postinst.d/zz-update-efistub
&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt;4&lt;/a&gt;
&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-sh" data-lang="sh"&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 class="nb"&gt;set&lt;/span&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;cp --verbose &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; /boot/efi/EFI/debian/vmlinuz.efi
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /etc/kernel/postinst.d/zz-update-efistub
&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="自动化复制-initrd"&gt;&lt;a href="#%e8%87%aa%e5%8a%a8%e5%8c%96%e5%a4%8d%e5%88%b6-initrd" class="header-anchor"&gt;&lt;/a&gt;自动化复制 initrd
&lt;/h4&gt;&lt;p&gt;创建文件 &lt;code&gt;/etc/initramfs/post-update.d/zz-update-efistub&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /etc/initramfs/post-update.d/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo nano /etc/initramfs/post-update.d/zz-update-efistub
&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-8-3"&gt;&lt;a class="lnlinks" href="#hl-8-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-8-4"&gt;&lt;a class="lnlinks" href="#hl-8-4"&gt;4&lt;/a&gt;
&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-sh" data-lang="sh"&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 class="nb"&gt;set&lt;/span&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;cp --verbose &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; /boot/efi/EFI/debian/initrd.img
&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /etc/initramfs/post-update.d/zz-update-efistub
&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;h4 id="警告"&gt;&lt;a href="#%e8%ad%a6%e5%91%8a" class="header-anchor"&gt;&lt;/a&gt;警告
&lt;/h4&gt;&lt;p&gt;根据 &lt;a class="link" href="https://wiki.debian.org/EFIStub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/EFIStub" data-u-e-text="EFIStub - Debian Wiki"&gt;EFIStub - Debian Wiki&lt;/a&gt;
，以上脚本会在每一个 kernel 或 initrd 更新时被执行，根据更新操作的顺序可能会导致复制错误版本的文件到 EFI 分区，可能无法正常启动系统。因此建议保留其他启动手段如 Grub2 或 rEFInd 作为备用。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h4 id="测试脚本是否正常运行"&gt;&lt;a href="#%e6%b5%8b%e8%af%95%e8%84%9a%e6%9c%ac%e6%98%af%e5%90%a6%e6%ad%a3%e5%b8%b8%e8%bf%90%e8%a1%8c" class="header-anchor"&gt;&lt;/a&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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo dpkg-reconfigure linux-image-&lt;span class="k"&gt;$(&lt;/span&gt;uname -r&lt;span class="k"&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;从输出的日志中，可以看到前面创建的脚本被运行，内核文件和 initrd 文件被复制到 EFI 分区。&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" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-11-2"&gt;&lt;a class="lnlinks" href="#hl-11-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-11-3"&gt;&lt;a class="lnlinks" href="#hl-11-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-11-4"&gt;&lt;a class="lnlinks" href="#hl-11-4"&gt;4&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-initramfs: Generating /boot/initrd.img-6.12.63+deb13-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;/boot/initrd.img-6.12.63+deb13-amd64&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/boot/efi/EFI/debian/initrd.img&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/kernel/postinst.d/zz-update-efistub:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;/boot/vmlinuz-6.12.63+deb13-amd64&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/boot/efi/EFI/debian/vmlinuz.efi&amp;#39;&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="创建-uefi-启动条目"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba-uefi-%e5%90%af%e5%8a%a8%e6%9d%a1%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;创建 UEFI 启动条目
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;本文使用 &lt;code&gt;efibootmgr&lt;/code&gt; 为例创建 UEFI 条目，使用其他工具或方法也是可行的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;efibootmgr&lt;/code&gt; 创建 UEFI 启动条目，如：&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" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-3"&gt;&lt;a class="lnlinks" href="#hl-12-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-4"&gt;&lt;a class="lnlinks" href="#hl-12-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-5"&gt;&lt;a class="lnlinks" href="#hl-12-5"&gt;5&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo efibootmgr --create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disk /dev/sdX --part YY &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --label &lt;span class="s2"&gt;&amp;#34;LABEL_NAME&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; --loader /EFI/debian/vmlinuz.efi &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --unicode &lt;span class="s2"&gt;&amp;#34;root=BLOCK_DEVICE_IDENTIFIER ro quiet initrd=\\EFI\\debian\\initrd.img&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;ul&gt;
&lt;li&gt;&lt;code&gt;--disk&lt;/code&gt; 指定硬盘设备。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--part&lt;/code&gt; 指定硬盘第几个分区为 EFI 分区。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--label&lt;/code&gt; 指定自己喜欢的名字，会显示在主板开机启动项菜单中。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;BLOCK_DEVICE_IDENTIFIER&lt;/code&gt; 填写系统根目录 &lt;code&gt;/&lt;/code&gt; 所在分区的标识符，一般是 &lt;code&gt;UUID=*******&lt;/code&gt; 的形式。可以通过 &lt;code&gt;lsblk -f&lt;/code&gt; 或者 &lt;code&gt;blkid&lt;/code&gt; 查询。也可以参照 Grub2 的配置文件进行设置 &lt;code&gt;sudo cat /boot/grub/grub.cfg | grep -i 'root='&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;该命令在不指定 &lt;code&gt;--index&lt;/code&gt; 参数的情况下，创建的条目将会被放在启动顺序 &lt;code&gt;0&lt;/code&gt; 的位置, 即开机时第一个启动。&lt;/p&gt;
&lt;h3 id="示例"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;示例
&lt;/h3&gt;&lt;p&gt;以我的电脑为例，我的硬盘为 &lt;code&gt;/dev/nvme0n1&lt;/code&gt;, 第 &lt;code&gt;1&lt;/code&gt; 个分区为 EFI 分区。因为我将根分区安装在 LVM 中，参考 Grub2 的配置文件写作 &lt;code&gt;root=/dev/mapper/Debian-root&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" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-3"&gt;&lt;a class="lnlinks" href="#hl-13-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-4"&gt;&lt;a class="lnlinks" href="#hl-13-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-5"&gt;&lt;a class="lnlinks" href="#hl-13-5"&gt;5&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cat /boot/grub/grub.cfg &lt;span class="p"&gt;|&lt;/span&gt; grep -i &lt;span class="s1"&gt;&amp;#39;root=&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; linux /vmlinuz-6.12.63+deb13-amd64 &lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/Debian-root ro quiet
&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;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" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-3"&gt;&lt;a class="lnlinks" href="#hl-14-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-4"&gt;&lt;a class="lnlinks" href="#hl-14-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-5"&gt;&lt;a class="lnlinks" href="#hl-14-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-6"&gt;&lt;a class="lnlinks" href="#hl-14-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-7"&gt;&lt;a class="lnlinks" href="#hl-14-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-8"&gt;&lt;a class="lnlinks" href="#hl-14-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-9"&gt;&lt;a class="lnlinks" href="#hl-14-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-10"&gt;&lt;a class="lnlinks" href="#hl-14-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-11"&gt;&lt;a class="lnlinks" href="#hl-14-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-12"&gt;&lt;a class="lnlinks" href="#hl-14-12"&gt;12&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo efibootmgr --create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disk /dev/nvme0n1 --part &lt;span class="m"&gt;1&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; --label &lt;span class="s2"&gt;&amp;#34;Debian EFIstub&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; --loader /EFI/debian/vmlinuz.efi &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --unicode &lt;span class="s2"&gt;&amp;#34;root=/dev/mapper/Debian-root ro quiet initrd=\\EFI\\debian\\initrd.img&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;BootCurrent: &lt;span class="m"&gt;0000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Timeout: &lt;span class="m"&gt;2&lt;/span&gt; seconds
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BootOrder: 0000,0002,0010,0011,0012,0013,0018,0019,001A,0017,0016,001B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Boot0002* debian HD&lt;span class="o"&gt;(&lt;/span&gt;1,GPT,c7bzfazx-bap4-q7ch-bd3m-bucyj939s4hq,0x800,0x1e8000&lt;span class="o"&gt;)&lt;/span&gt;/File&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;FI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\s&lt;/span&gt;himx64.efi&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;Boot0000* Debian EFIstub HD&lt;span class="o"&gt;(&lt;/span&gt;1,GPT,c7bzfazx-bap4-q7ch-bd3m-bucyj939s4hq,0x800,0x1e8000&lt;span class="o"&gt;)&lt;/span&gt;/File&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;FI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\v&lt;/span&gt;mlinuz.efi&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/Debian-root ro quiet &lt;span class="nv"&gt;initrd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EFI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\i&lt;/span&gt;nitrd.img
&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;Boot0000&lt;/code&gt; 的条目，名为 &lt;code&gt;Debian EFIstub&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;而 &lt;code&gt;Boot0002 debian&lt;/code&gt; 是原有 Grub2 的 UEFI 启动条目。&lt;/p&gt;
&lt;h2 id="测试"&gt;&lt;a href="#%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;测试
&lt;/h2&gt;&lt;p&gt;完成以上设置后，正常情况下，重启电脑，成功通过 UEFI 直接启动 Debian，而无须经由 Grub2 启动。&lt;/p&gt;
&lt;h2 id="提示"&gt;&lt;a href="#%e6%8f%90%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;提示
&lt;/h2&gt;&lt;p&gt;根据 &lt;a class="link" href="https://wiki.debian.org/EFIStub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/EFIStub" data-u-e-text="EFIStub - Debian Wiki"&gt;EFIStub - Debian Wiki&lt;/a&gt;
 和 &lt;a class="link" href="https://wiki.debian.org/BootLoader#:~:text=is%20another%20matter.-,CONs,-%3A*%20not%20flexible.*%20not" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/BootLoader#:~:text=is%20another%20matter.-,CONs,-%3A*%20not%20flexible.*%20not" data-u-e-text="EFI boot stub CONs"&gt;EFI boot stub CONs&lt;/a&gt;
 的建议，最好保留例如 Grub2 这样 bootloader 以避免意外情况下无法启动系统。&lt;/p&gt;
&lt;h3 id="有关-efibootmgr"&gt;&lt;a href="#%e6%9c%89%e5%85%b3-efibootmgr" class="header-anchor"&gt;&lt;/a&gt;有关 &lt;code&gt;efibootmgr&lt;/code&gt;
&lt;/h3&gt;&lt;h4 id="显示所有-uefi-启动条目"&gt;&lt;a href="#%e6%98%be%e7%a4%ba%e6%89%80%e6%9c%89-uefi-%e5%90%af%e5%8a%a8%e6%9d%a1%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;显示所有 UEFI 启动条目
&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" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-3"&gt;&lt;a class="lnlinks" href="#hl-15-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-4"&gt;&lt;a class="lnlinks" href="#hl-15-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-5"&gt;&lt;a class="lnlinks" href="#hl-15-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-6"&gt;&lt;a class="lnlinks" href="#hl-15-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-7"&gt;&lt;a class="lnlinks" href="#hl-15-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-8"&gt;&lt;a class="lnlinks" href="#hl-15-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-9"&gt;&lt;a class="lnlinks" href="#hl-15-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-10"&gt;&lt;a class="lnlinks" href="#hl-15-10"&gt;10&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo efibootmgr -u
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BootCurrent: &lt;span class="m"&gt;0000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Timeout: &lt;span class="m"&gt;2&lt;/span&gt; seconds
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BootOrder: 0000,0002,0010,0011,0012,0013,0018,0019,001A,0017,0016,001B
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Boot0000* Debian EFIstub HD&lt;span class="o"&gt;(&lt;/span&gt;1,GPT,c7bzfazx-bap4-q7ch-bd3m-bucyj939s4hq,0x800,0x1e8000&lt;span class="o"&gt;)&lt;/span&gt;/File&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;FI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\v&lt;/span&gt;mlinuz.efi&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nv"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/mapper/Debian-root ro quiet &lt;span class="nv"&gt;initrd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;EFI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\i&lt;/span&gt;nitrd.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Boot0002* debian HD&lt;span class="o"&gt;(&lt;/span&gt;1,GPT,c7bzfazx-bap4-q7ch-bd3m-bucyj939s4hq,0x800,0x1e8000&lt;span class="o"&gt;)&lt;/span&gt;/File&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\E&lt;/span&gt;FI&lt;span class="se"&gt;\d&lt;/span&gt;ebian&lt;span class="se"&gt;\s&lt;/span&gt;himx64.efi&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&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;h4 id="删除-uefi-启动条目"&gt;&lt;a href="#%e5%88%a0%e9%99%a4-uefi-%e5%90%af%e5%8a%a8%e6%9d%a1%e7%9b%ae" class="header-anchor"&gt;&lt;/a&gt;删除 UEFI 启动条目
&lt;/h4&gt;&lt;p&gt;本文写作时，&lt;code&gt;efibootmgr&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" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo efibootmgr --delete-bootnum --bootnum YYYY
&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;Debian EFIstub&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" id="hl-17-1"&gt;&lt;a class="lnlinks" href="#hl-17-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo efibootmgr &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;Debian EFIstub&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -F&lt;span class="s1"&gt;&amp;#39;Boot&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{print substr($2, 1, 4)}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -I &lt;span class="o"&gt;{}&lt;/span&gt; sudo efibootmgr --delete-bootnum --bootnum &lt;span class="o"&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;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.debian.org/EFIStub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.debian.org/EFIStub" data-u-e-text="EFIStub - Debian Wiki"&gt;EFIStub - Debian Wiki&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://wiki.archlinux.org/title/EFI_boot_stub" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wiki.archlinux.org/title/EFI_boot_stub" data-u-e-text="EFI boot stub - ArchWiki"&gt;EFI boot stub - ArchWiki&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>PVE 配置 bonding 聚合网卡</title><link>https://www.lixx.org/a/957a/</link><pubDate>Mon, 05 May 2025 10:30:49 +0000</pubDate><guid>https://www.lixx.org/a/957a/</guid><description>&lt;p&gt;我的需求是聚合有线网卡和 Wi-Fi 无线网卡。问了 AI ，AI 说不行。&lt;/p&gt;
&lt;p&gt;我之前在 armbian 上用 &lt;code&gt;netplan&lt;/code&gt; 进行过配置和尝试，结果是可行的。&lt;/p&gt;
&lt;p&gt;以我的机器为例，我的有线网卡接口名为 &lt;code&gt;eth0&lt;/code&gt;, 无线网卡接口名是 &lt;code&gt;wlan0&lt;/code&gt;.
新建的聚合接口名会是 &lt;code&gt;bond0&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="系统信息"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e4%bf%a1%e6%81%af" class="header-anchor"&gt;&lt;/a&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -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;Linux armbian 6.1.159-happy-new-year &lt;span class="c1"&gt;#1 SMP Wed Dec 31 14:07:28 UTC 2025 aarch64 GNU/Linux&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="加载-bonding-模块"&gt;&lt;a href="#%e5%8a%a0%e8%bd%bd-bonding-%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;加载 bonding 模块
&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo modprobe bonding
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep bonding
&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;bonding&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/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;h2 id="interfaces-设置"&gt;&lt;a href="#interfaces-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;interfaces 设置
&lt;/h2&gt;&lt;h3 id="eth0-设置"&gt;&lt;a href="#eth0-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;eth0&lt;/code&gt; 设置
&lt;/h3&gt;&lt;p&gt;armbian 安装 pve 后，&lt;code&gt;eth0&lt;/code&gt; 就已经变成 &lt;code&gt;manual&lt;/code&gt;. 无须修改。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-/etc/network/interfaces" data-lang="/etc/network/interfaces"&gt;# /etc/network/interfaces

auto eth0
iface eth0 inet manual
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="wlan0-设置"&gt;&lt;a href="#wlan0-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;wlan0&lt;/code&gt; 设置
&lt;/h3&gt;&lt;p&gt;添加 &lt;code&gt;wlan0&lt;/code&gt; 的设置。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-/etc/network/interfaces" data-lang="/etc/network/interfaces"&gt;# /etc/network/interfaces

auto wlan0
iface wlan0 inet manual
 wpa-ssid &amp;#34;wifissidqwe123&amp;#34;
 wpa-psk &amp;#34;wifipskasdzxc&amp;#34;
 metric 666
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="bond0-设置"&gt;&lt;a href="#bond0-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;bond0&lt;/code&gt; 设置
&lt;/h3&gt;&lt;p&gt;添加 &lt;code&gt;bond0&lt;/code&gt; 的设置。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bond-slaves&lt;/code&gt; 填写被聚合网卡接口名。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bond-mode&lt;/code&gt; 填写 bond 模式。我需要的是 &lt;code&gt;active-backup&lt;/code&gt;， 因为我这个无线网卡有问题，只有 2.4Ghz，速度慢，还会断流、会丢包，仅作为备用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bond-primary&lt;/code&gt; 填写主要接口，即流量优先从这个口传输。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-/etc/network/interfaces" data-lang="/etc/network/interfaces"&gt;# /etc/network/interfaces

auto bond0
iface bond0 inet manual
 bond-slaves eth0 wlan0
 bond-miimon 100
 bond-mode active-backup
 bond-primary eth0
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="vmbr0-设置"&gt;&lt;a href="#vmbr0-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;vmbr0&lt;/code&gt; 设置
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;vmbr0&lt;/code&gt; 是 pve 默认的虚拟网桥，默认使用 &lt;code&gt;eth0&lt;/code&gt; 作为网桥接口。这里改成我需要的 &lt;code&gt;bond0&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-2"&gt;&lt;a class="lnlinks" href="#hl-5-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-3"&gt;&lt;a class="lnlinks" href="#hl-5-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-4"&gt;&lt;a class="lnlinks" href="#hl-5-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-5"&gt;&lt;a class="lnlinks" href="#hl-5-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-5-6"&gt;&lt;a class="lnlinks" href="#hl-5-6"&gt;6&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# /etc/network/interfaces
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;auto vmbr0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;iface vmbr0 inet static
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- bridge-ports eth0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ bridge-ports bond0
&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="完整的-interfaces-配置"&gt;&lt;a href="#%e5%ae%8c%e6%95%b4%e7%9a%84-interfaces-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;完整的 interfaces 配置
&lt;/h3&gt;&lt;p&gt;仅供参考，不要直接复制粘贴。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;警告&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;谨慎设置，小心失联！&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-/etc/network/interfaces" data-lang="/etc/network/interfaces"&gt;# /etc/network/interfaces

# network interface settings; autogenerated
# Please do NOT modify this file directly, unless you know what
# you&amp;#39;re doing.
#
# If you want to manage parts of the network configuration manually,
# please utilize the &amp;#39;source&amp;#39; or &amp;#39;source-directory&amp;#39; directives to do
# so.
# PVE will preserve these directives, but will NOT read its network
# configuration from sourced files, so do not attempt to move any of
# the PVE managed interfaces into external files!

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto wlan0
iface wlan0 inet manual
 wpa-ssid &amp;#34;wifissidqwe123&amp;#34;
 wpa-psk &amp;#34;wifipskasdzxc&amp;#34;
 metric 666

auto bond0
iface bond0 inet manual
 bond-slaves eth0 wlan0
 bond-miimon 100
 bond-mode active-backup
 bond-primary eth0

auto vmbr0
iface vmbr0 inet static
 address 192.168.666.555/24
 gateway 192.168.666.1
 dns-nameservers 192.168.666.1
 bridge-ports bond0
 bridge-stp off
 bridge-fd 0
 hwaddress ether 84:c6:4d:ef:12:47
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="应用设置"&gt;&lt;a href="#%e5%ba%94%e7%94%a8%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;应用设置
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;我的设备没有显示接口，为了防止意外，我插了额外的一张 USB 无线网卡并配置好联网，以免失联。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;在确保安全的前提下&lt;/strong&gt;，重启 pve 主机。&lt;/p&gt;
&lt;p&gt;不出意外的话应该不出意外。我的 pve 主机重启后可以正常联网，在我的 openwrt 路由器上可以看到 pve 主机对应的 lan 口处于启用状态， pve 主机也连接到 Wi-Fi 网络中。&lt;/p&gt;
&lt;h2 id="测试"&gt;&lt;a href="#%e6%b5%8b%e8%af%95" class="header-anchor"&gt;&lt;/a&gt;测试
&lt;/h2&gt;&lt;p&gt;测试 bond 是否能够正常切换网卡，可以使用另一台设备持续 &lt;code&gt;ping&lt;/code&gt; pve 主机，
如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ping -i 1 -W 1 192.168.666.555&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ping -i 1 -W 1 192.168.666.555 -A&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后插、拔网线，查看 pve 主机是否有回应 ping。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;我在 &lt;code&gt;seq=10&lt;/code&gt; 时，断开了 pve 主机网线，随即看到 ping 的回应停顿了一下，随后延迟变大。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;seq=20&lt;/code&gt; 左右，重新插上了网线，ping 回应没有停顿，过了一会，延迟变小。&lt;/p&gt;
&lt;p&gt;通常来说，无线网卡的延迟大于有线网卡。因此在我的这个案例中，借助 ping 工具即可简单地观测 bond 网卡的切换情况。&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-4"&gt;&lt;a class="lnlinks" href="#hl-7-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-5"&gt;&lt;a class="lnlinks" href="#hl-7-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-6"&gt;&lt;a class="lnlinks" href="#hl-7-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-7"&gt;&lt;a class="lnlinks" href="#hl-7-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-8"&gt;&lt;a class="lnlinks" href="#hl-7-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-9"&gt;&lt;a class="lnlinks" href="#hl-7-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-10"&gt;&lt;a class="lnlinks" href="#hl-7-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-11"&gt;&lt;a class="lnlinks" href="#hl-7-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-12"&gt;&lt;a class="lnlinks" href="#hl-7-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-13"&gt;&lt;a class="lnlinks" href="#hl-7-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-14"&gt;&lt;a class="lnlinks" href="#hl-7-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-15"&gt;&lt;a class="lnlinks" href="#hl-7-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-16"&gt;&lt;a class="lnlinks" href="#hl-7-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-17"&gt;&lt;a class="lnlinks" href="#hl-7-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-18"&gt;&lt;a class="lnlinks" href="#hl-7-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-19"&gt;&lt;a class="lnlinks" href="#hl-7-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-20"&gt;&lt;a class="lnlinks" href="#hl-7-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-21"&gt;&lt;a class="lnlinks" href="#hl-7-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-22"&gt;&lt;a class="lnlinks" href="#hl-7-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-23"&gt;&lt;a class="lnlinks" href="#hl-7-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-24"&gt;&lt;a class="lnlinks" href="#hl-7-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-25"&gt;&lt;a class="lnlinks" href="#hl-7-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-26"&gt;&lt;a class="lnlinks" href="#hl-7-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-27"&gt;&lt;a class="lnlinks" href="#hl-7-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-28"&gt;&lt;a class="lnlinks" href="#hl-7-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-29"&gt;&lt;a class="lnlinks" href="#hl-7-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-30"&gt;&lt;a class="lnlinks" href="#hl-7-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-31"&gt;&lt;a class="lnlinks" href="#hl-7-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-32"&gt;&lt;a class="lnlinks" href="#hl-7-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-33"&gt;&lt;a class="lnlinks" href="#hl-7-33"&gt;33&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ping -i &lt;span class="m"&gt;1&lt;/span&gt; -W &lt;span class="m"&gt;1&lt;/span&gt; 192.168.666.555
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PING 192.168.666.555 &lt;span class="o"&gt;(&lt;/span&gt;192.168.666.555&lt;span class="o"&gt;)&lt;/span&gt;: &lt;span class="m"&gt;56&lt;/span&gt; data bytes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.187 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.816 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.897 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.928 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.992 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.980 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.970 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.917 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.050 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.917 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.947 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6.971 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;13&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.994 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;14&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.845 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.862 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.659 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;17&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.638 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9.053 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;19&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.115 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;20&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6.334 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;21&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;7.020 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4.329 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;23&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.063 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;24&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.906 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.920 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;26&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.844 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;27&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.896 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;28&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.855 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;29&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.918 ms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;64&lt;/span&gt; bytes from 192.168.666.555: &lt;span class="nv"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="nv"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;64&lt;/span&gt; &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.900 ms
&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>初始化我的 Debian</title><link>https://www.lixx.org/a/93d1/</link><pubDate>Sat, 01 Mar 2025 10:19:14 +0000</pubDate><guid>https://www.lixx.org/a/93d1/</guid><description>&lt;p&gt;前两天更新显卡驱动，把系统搞崩了。&lt;/p&gt;
&lt;p&gt;不得已重装系统，顺便简单记录下来。&lt;/p&gt;
&lt;h2 id="系统设置"&gt;&lt;a href="#%e7%b3%bb%e7%bb%9f%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;系统设置
&lt;/h2&gt;&lt;h3 id="禁用-root-账户"&gt;&lt;a href="#%e7%a6%81%e7%94%a8-root-%e8%b4%a6%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;禁用 root 账户
&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;sudo passwd -l root
&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&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;sudo usermod -s /usr/sbin/nologin root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sudo usermod -s /bin/false root&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;禁止 root 账户登录 ssh&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PermitRootLogin no&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/ssh/sshd_config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl restart sshd
&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="禁止使用密码登陆-ssh"&gt;&lt;a href="#%e7%a6%81%e6%ad%a2%e4%bd%bf%e7%94%a8%e5%af%86%e7%a0%81%e7%99%bb%e9%99%86-ssh" class="header-anchor"&gt;&lt;/a&gt;禁止使用密码登陆 ssh
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# /etc/ssh/sshd_config
PasswordAuthentication no
PermitEmptyPasswords no
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# /etc/ssh/sshd_config
Port 22222
&lt;/code&gt;&lt;/pre&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart sshd
&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="优化-swap-频率"&gt;&lt;a href="#%e4%bc%98%e5%8c%96-swap-%e9%a2%91%e7%8e%87" class="header-anchor"&gt;&lt;/a&gt;优化 swap 频率
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;vm.swappiness=10&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee -a /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl -p
&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;a href="#%e8%bd%af%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;软件
&lt;/h2&gt;&lt;h3 id="必备软件"&gt;&lt;a href="#%e5%bf%85%e5%a4%87%e8%bd%af%e4%bb%b6" class="header-anchor"&gt;&lt;/a&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-4"&gt;&lt;a class="lnlinks" href="#hl-7-4"&gt;4&lt;/a&gt;
&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;sudo apt install ca-certificates -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install apt-transport-https -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install curl -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install wget -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="常用软件"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8%e8%bd%af%e4%bb%b6" class="header-anchor"&gt;&lt;/a&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-8-2"&gt;&lt;a class="lnlinks" href="#hl-8-2"&gt;2&lt;/a&gt;
&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;sudo apt install zsh -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chsh -s /bin/zsh
&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-2"&gt;&lt;a class="lnlinks" href="#hl-9-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-9-3"&gt;&lt;a class="lnlinks" href="#hl-9-3"&gt;3&lt;/a&gt;
&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;sudo apt install mosh -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install htop -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install iperf3 -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;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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-4"&gt;&lt;a class="lnlinks" href="#hl-10-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-5"&gt;&lt;a class="lnlinks" href="#hl-10-5"&gt;5&lt;/a&gt;
&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;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;deb http://download.opensuse.org/repositories/shells:/fish:/release:/4/Debian_12/ /&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/shells:fish:release:4.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://download.opensuse.org/repositories/shells:fish:release:4/Debian_12/Release.key &lt;span class="p"&gt;|&lt;/span&gt; gpg --dearmor &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/trusted.gpg.d/shells_fish_release_4.gpg &amp;gt; /dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install fish -y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chsh -s /usr/bin/fish
&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="flatpak"&gt;&lt;a href="#flatpak" class="header-anchor"&gt;&lt;/a&gt;Flatpak
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://flatpak.org/setup/Debian" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://flatpak.org/setup/Debian" data-u-e-text="https://flatpak.org/setup/Debian"&gt;https://flatpak.org/setup/Debian&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-11-2"&gt;&lt;a class="lnlinks" href="#hl-11-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-11-3"&gt;&lt;a class="lnlinks" href="#hl-11-3"&gt;3&lt;/a&gt;
&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;sudo apt install flatpak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install plasma-discover-backend-flatpak
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
&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="keepassxc-flatpak"&gt;&lt;a href="#keepassxc-flatpak" class="header-anchor"&gt;&lt;/a&gt;Keepassxc (flatpak)
&lt;/h3&gt;&lt;p&gt;密码、OTP、passkey、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" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;
&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;flatpak remote-add --user --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flatpak install --user flathub org.keepassxc.KeePassXC
&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;Keepassxc 开启 ssh-agent 功能。&lt;/li&gt;
&lt;li&gt;设置 ssh 的 ssh-agent 自动启动 （kde system setting - Autostart）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="syncthing"&gt;&lt;a href="#syncthing" class="header-anchor"&gt;&lt;/a&gt;Syncthing
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://apt.syncthing.net" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://apt.syncthing.net" data-u-e-text="https://apt.syncthing.net"&gt;https://apt.syncthing.net&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-3"&gt;&lt;a class="lnlinks" href="#hl-13-3"&gt;3&lt;/a&gt;
&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;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
&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;deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/syncthing.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;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" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt;2&lt;/a&gt;
&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install syncthing -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;syncthing 配置目录： &lt;code&gt;~/.config/syncthing/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;启用 syncthing 服务：&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" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;
&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;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now syncthing@&amp;lt;username&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="zerotier"&gt;&lt;a href="#zerotier" class="header-anchor"&gt;&lt;/a&gt;Zerotier
&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" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-16-2"&gt;&lt;a class="lnlinks" href="#hl-16-2"&gt;2&lt;/a&gt;
&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;curl -s &lt;span class="s1"&gt;&amp;#39;https://raw.githubusercontent.com/zerotier/ZeroTierOne/main/doc/contact%40zerotier.com.gpg&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; gpg --import &lt;span class="o"&gt;&amp;amp;&amp;amp;&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;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s &lt;span class="s1"&gt;&amp;#39;https://install.zerotier.com/&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; gpg&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&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;$z&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo bash&lt;span class="p"&gt;;&lt;/span&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;/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" id="hl-17-1"&gt;&lt;a class="lnlinks" href="#hl-17-1"&gt;1&lt;/a&gt;
&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;zerotier-cli join &amp;lt;...&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="hugo"&gt;&lt;a href="#hugo" class="header-anchor"&gt;&lt;/a&gt;Hugo
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/gohugoio/hugo/releases" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/gohugoio/hugo/releases" data-u-e-text="https://github.com/gohugoio/hugo/releases"&gt;https://github.com/gohugoio/hugo/releases&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;安装 &lt;code&gt;hugo_extended&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" id="hl-18-1"&gt;&lt;a class="lnlinks" href="#hl-18-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-18-2"&gt;&lt;a class="lnlinks" href="#hl-18-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-18-3"&gt;&lt;a class="lnlinks" href="#hl-18-3"&gt;3&lt;/a&gt;
&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="nv"&gt;hugo_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.142.0
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://github.com/gohugoio/hugo/releases/download/v&lt;span class="nv"&gt;$hugo_version&lt;/span&gt;/hugo_extended_&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$hugo_version&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;_linux-amd64.deb -O /tmp/hugo_extended.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install /tmp/hugo_extended.deb
&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="sublime-text"&gt;&lt;a href="#sublime-text" class="header-anchor"&gt;&lt;/a&gt;Sublime Text
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.sublimetext.com/download" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.sublimetext.com/download" data-u-e-text="https://www.sublimetext.com/download"&gt;https://www.sublimetext.com/download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.sublimetext.com/docs/linux_repositories.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.sublimetext.com/docs/linux_repositories.html" data-u-e-text="https://www.sublimetext.com/docs/linux_repositories.html"&gt;https://www.sublimetext.com/docs/linux_repositories.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&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" id="hl-19-1"&gt;&lt;a class="lnlinks" href="#hl-19-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-19-2"&gt;&lt;a class="lnlinks" href="#hl-19-2"&gt;2&lt;/a&gt;
&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;wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg &lt;span class="p"&gt;|&lt;/span&gt; gpg --dearmor &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/trusted.gpg.d/sublimehq-archive.gpg &amp;gt; /dev/null
&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;deb https://download.sublimetext.com/ apt/stable/&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/sublime-text.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;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" id="hl-20-1"&gt;&lt;a class="lnlinks" href="#hl-20-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-20-2"&gt;&lt;a class="lnlinks" href="#hl-20-2"&gt;2&lt;/a&gt;
&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install sublime-text -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="thunderbird"&gt;&lt;a href="#thunderbird" class="header-anchor"&gt;&lt;/a&gt;Thunderbird
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://www.thunderbird.net/en-US/thunderbird/all/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.thunderbird.net/en-US/thunderbird/all/" data-u-e-text="https://www.thunderbird.net/en-US/thunderbird/all/"&gt;https://www.thunderbird.net/en-US/thunderbird/all/&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-21-1"&gt;&lt;a class="lnlinks" href="#hl-21-1"&gt;1&lt;/a&gt;
&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;flatpak install flathub org.mozilla.Thunderbird
&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="vs-code"&gt;&lt;a href="#vs-code" class="header-anchor"&gt;&lt;/a&gt;VS Code
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://code.visualstudio.com/Download" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://code.visualstudio.com/Download" data-u-e-text="https://code.visualstudio.com/Download"&gt;https://code.visualstudio.com/Download&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="chrome"&gt;&lt;a href="#chrome" class="header-anchor"&gt;&lt;/a&gt;Chrome
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://www.google.com/chrome/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.google.com/chrome/" data-u-e-text="https://www.google.com/chrome/"&gt;https://www.google.com/chrome/&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="开发环境"&gt;&lt;a href="#%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;开发环境
&lt;/h2&gt;&lt;h3 id="git"&gt;&lt;a href="#git" class="header-anchor"&gt;&lt;/a&gt;Git
&lt;/h3&gt;&lt;h4 id="github-cli-gh"&gt;&lt;a href="#github-cli-gh" class="header-anchor"&gt;&lt;/a&gt;Github Cli （gh）
&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" id="hl-22-1"&gt;&lt;a class="lnlinks" href="#hl-22-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-2"&gt;&lt;a class="lnlinks" href="#hl-22-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-3"&gt;&lt;a class="lnlinks" href="#hl-22-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-4"&gt;&lt;a class="lnlinks" href="#hl-22-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-5"&gt;&lt;a class="lnlinks" href="#hl-22-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-6"&gt;&lt;a class="lnlinks" href="#hl-22-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-7"&gt;&lt;a class="lnlinks" href="#hl-22-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-22-8"&gt;&lt;a class="lnlinks" href="#hl-22-8"&gt;8&lt;/a&gt;
&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="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; -p wget &amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install wget -y&lt;span class="o"&gt;))&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;	&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo mkdir -p -m &lt;span class="m"&gt;755&lt;/span&gt; /etc/apt/keyrings &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;out&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; wget -nv -O&lt;span class="nv"&gt;$out&lt;/span&gt; https://cli.github.com/packages/githubcli-archive-keyring.gpg &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; cat &lt;span class="nv"&gt;$out&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg &amp;gt; /dev/null &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/github-cli.list &amp;gt; /dev/null &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; sudo apt update &lt;span class="se"&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;amp;&amp;amp;&lt;/span&gt; sudo apt install gh -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;h4 id="登陆-github"&gt;&lt;a href="#%e7%99%bb%e9%99%86-github" class="header-anchor"&gt;&lt;/a&gt;登陆 Github
&lt;/h4&gt;&lt;p&gt;GH 登陆、自动设置 github 的 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" id="hl-23-1"&gt;&lt;a class="lnlinks" href="#hl-23-1"&gt;1&lt;/a&gt;
&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;gh auth login
&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;设置 https 凭据管理器&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" id="hl-24-1"&gt;&lt;a class="lnlinks" href="#hl-24-1"&gt;1&lt;/a&gt;
&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;gh auth setup-git
&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;a href="#%e8%8e%b7%e5%8f%96%e5%88%a0%e5%ba%93%e8%b7%91%e8%b7%af%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&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" id="hl-25-1"&gt;&lt;a class="lnlinks" href="#hl-25-1"&gt;1&lt;/a&gt;
&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;gh auth refresh -h github.com -s delete_repo
&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="常用-git-设置"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8-git-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;常用 Git 设置
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# ~/.gitconfig
[credential &amp;#34;https://github.com&amp;#34;]
	helper =
	helper = !/usr/bin/gh auth git-credential
[credential &amp;#34;https://gist.github.com&amp;#34;]
	helper =
	helper = !/usr/bin/gh auth git-credential
[user]
	name = lixx
	email = no-reply@lixx.org
	signingkey = 114514CFM29803FUCM9102385NV73848VN3402CQ
[commit]
	gpgsign = true
[tag]
	gpgsign = true
[core]
	safecrlf = warn
	autocrlf = input
	editor = subl -w
[init]
	defaultBranch = main
[pull]
	ff = only
[alias]
	up = &amp;#34;!git checkout master;git fetch upstream master;git reset --hard upstream/master&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="python"&gt;&lt;a href="#python" class="header-anchor"&gt;&lt;/a&gt;Python
&lt;/h3&gt;&lt;h4 id="pyenv"&gt;&lt;a href="#pyenv" class="header-anchor"&gt;&lt;/a&gt;Pyenv
&lt;/h4&gt;&lt;p&gt;python 版本管理器和虚拟环境管理器 pyenv&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" id="hl-27-1"&gt;&lt;a class="lnlinks" href="#hl-27-1"&gt;1&lt;/a&gt;
&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;curl -fsSL https://pyenv.run &lt;span class="p"&gt;|&lt;/span&gt; bash
&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;添加 fish 配置&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" id="hl-28-1"&gt;&lt;a class="lnlinks" href="#hl-28-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-28-2"&gt;&lt;a class="lnlinks" href="#hl-28-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-28-3"&gt;&lt;a class="lnlinks" href="#hl-28-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-28-4"&gt;&lt;a class="lnlinks" href="#hl-28-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-28-5"&gt;&lt;a class="lnlinks" href="#hl-28-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-28-6"&gt;&lt;a class="lnlinks" href="#hl-28-6"&gt;6&lt;/a&gt;
&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;# ~/.config/fish/config.fish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -Ux PYENV_ROOT &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.pyenv
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -U fish_user_paths &lt;span class="nv"&gt;$PYENV_ROOT&lt;/span&gt;/bin &lt;span class="nv"&gt;$fish_user_paths&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;pyenv init - fish &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;status --is-interactive&lt;span class="p"&gt;;&lt;/span&gt; and &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;pyenv virtualenv-init -&lt;span class="p"&gt;|&lt;/span&gt;psub&lt;span class="o"&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;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/pyenv/pyenv/wiki#suggested-build-environment" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/pyenv/pyenv/wiki#suggested-build-environment" data-u-e-text="https://github.com/pyenv/pyenv/wiki#suggested-build-environment"&gt;https://github.com/pyenv/pyenv/wiki#suggested-build-environment&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-29-1"&gt;&lt;a class="lnlinks" href="#hl-29-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-29-2"&gt;&lt;a class="lnlinks" href="#hl-29-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-29-3"&gt;&lt;a class="lnlinks" href="#hl-29-3"&gt;3&lt;/a&gt;
&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;sudo apt update&lt;span class="p"&gt;;&lt;/span&gt; sudo apt install build-essential libssl-dev zlib1g-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libbz2-dev libreadline-dev libsqlite3-dev curl git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
&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;构建安装 Python&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-for-maximum-performance" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-for-maximum-performance" data-u-e-text="https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-for-maximum-performance"&gt;https://github.com/pyenv/pyenv/wiki#how-to-build-cpython-for-maximum-performance&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-30-1"&gt;&lt;a class="lnlinks" href="#hl-30-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-30-2"&gt;&lt;a class="lnlinks" href="#hl-30-2"&gt;2&lt;/a&gt;
&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="nv"&gt;PY_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3.11.11
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;env &lt;span class="nv"&gt;PROFILE_TASK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-m test.regrtest --pgo -j0&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;PYTHON_CONFIGURE_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;--enable-optimizations --with-lto&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;PYTHON_CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-march=native -mtune=native&amp;#39;&lt;/span&gt; pyenv install &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PY_VERSION&lt;/span&gt;&lt;span class="s2"&gt;&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="pip-换源"&gt;&lt;a href="#pip-%e6%8d%a2%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;pip 换源
&lt;/h4&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://mirrors.tuna.tsinghua.edu.cn/help/pypi/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://mirrors.tuna.tsinghua.edu.cn/help/pypi/" data-u-e-text="https://mirrors.tuna.tsinghua.edu.cn/help/pypi/"&gt;https://mirrors.tuna.tsinghua.edu.cn/help/pypi/&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-31-1"&gt;&lt;a class="lnlinks" href="#hl-31-1"&gt;1&lt;/a&gt;
&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;pip config &lt;span class="nb"&gt;set&lt;/span&gt; global.extra-index-url &lt;span class="s2"&gt;&amp;#34;https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple&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" id="hl-32-1"&gt;&lt;a class="lnlinks" href="#hl-32-1"&gt;1&lt;/a&gt;
&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;pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
&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="pipx"&gt;&lt;a href="#pipx" class="header-anchor"&gt;&lt;/a&gt;pipx
&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" id="hl-33-1"&gt;&lt;a class="lnlinks" href="#hl-33-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-33-2"&gt;&lt;a class="lnlinks" href="#hl-33-2"&gt;2&lt;/a&gt;
&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;sudo apt install pipx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pipx ensurepath
&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;添加 completions&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" id="hl-34-1"&gt;&lt;a class="lnlinks" href="#hl-34-1"&gt;1&lt;/a&gt;
&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;register-python-argcomplete --shell fish pipx &amp;gt; ~/.config/fish/completions/pipx.fish
&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="poetry"&gt;&lt;a href="#poetry" class="header-anchor"&gt;&lt;/a&gt;poetry
&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" id="hl-35-1"&gt;&lt;a class="lnlinks" href="#hl-35-1"&gt;1&lt;/a&gt;
&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;pipx install poetry -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
&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;添加 completions&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" id="hl-36-1"&gt;&lt;a class="lnlinks" href="#hl-36-1"&gt;1&lt;/a&gt;
&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;poetry completions fish &amp;gt; ~/.config/fish/completions/poetry.fish
&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="poetry-换源"&gt;&lt;a href="#poetry-%e6%8d%a2%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;poetry 换源
&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" id="hl-37-1"&gt;&lt;a class="lnlinks" href="#hl-37-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-37-2"&gt;&lt;a class="lnlinks" href="#hl-37-2"&gt;2&lt;/a&gt;
&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;poetry &lt;span class="nb"&gt;source&lt;/span&gt; add --priority&lt;span class="o"&gt;=&lt;/span&gt;primary mirrors https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;poetry &lt;span class="nb"&gt;source&lt;/span&gt; add --priority&lt;span class="o"&gt;=&lt;/span&gt;supplemental mirrors https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/
&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="node"&gt;&lt;a href="#node" class="header-anchor"&gt;&lt;/a&gt;Node
&lt;/h3&gt;&lt;h4 id="fnm"&gt;&lt;a href="#fnm" class="header-anchor"&gt;&lt;/a&gt;fnm
&lt;/h4&gt;&lt;p&gt;安装 fnm&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" id="hl-38-1"&gt;&lt;a class="lnlinks" href="#hl-38-1"&gt;1&lt;/a&gt;
&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;curl -fsSL https://fnm.vercel.app/install &lt;span class="p"&gt;|&lt;/span&gt; bash
&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;添加 completions&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" id="hl-39-1"&gt;&lt;a class="lnlinks" href="#hl-39-1"&gt;1&lt;/a&gt;
&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;fnm completions --shell fish &amp;gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.config/fish/completions/fnm.fish&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;使用 fnm 安装 lts 版本 node&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" id="hl-40-1"&gt;&lt;a class="lnlinks" href="#hl-40-1"&gt;1&lt;/a&gt;
&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;fnm install --lts
&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;添加 shell 配置&lt;/p&gt;
&lt;p&gt;fish&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" id="hl-41-1"&gt;&lt;a class="lnlinks" href="#hl-41-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-41-2"&gt;&lt;a class="lnlinks" href="#hl-41-2"&gt;2&lt;/a&gt;
&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;# ~/.config/fish/config.fish&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fnm env --use-on-cd --shell fish &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&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;zsh&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" id="hl-42-1"&gt;&lt;a class="lnlinks" href="#hl-42-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-42-2"&gt;&lt;a class="lnlinks" href="#hl-42-2"&gt;2&lt;/a&gt;
&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;# ~/.zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;fnm env --use-on-cd --shell zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&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="pnpm"&gt;&lt;a href="#pnpm" class="header-anchor"&gt;&lt;/a&gt;pnpm
&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" id="hl-43-1"&gt;&lt;a class="lnlinks" href="#hl-43-1"&gt;1&lt;/a&gt;
&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;wget -qO- https://get.pnpm.io/install.sh &lt;span class="p"&gt;|&lt;/span&gt; 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;p&gt;添加 completions&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" id="hl-44-1"&gt;&lt;a class="lnlinks" href="#hl-44-1"&gt;1&lt;/a&gt;
&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;pnpm completion fish &amp;gt; ~/.config/fish/completions/pnpm.fish
&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;a href="#%e5%88%87%e6%8d%a2%e6%b7%98%e5%ae%9d%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;切换淘宝源
&lt;/h4&gt;&lt;p&gt;全局设置&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pnpm config set --global registry https://registry.npmmirror.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;或者&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;nrm use taobao
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="常用-npm-包"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8-npm-%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;常用 npm 包
&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" id="hl-47-1"&gt;&lt;a class="lnlinks" href="#hl-47-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-47-2"&gt;&lt;a class="lnlinks" href="#hl-47-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-47-3"&gt;&lt;a class="lnlinks" href="#hl-47-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-47-4"&gt;&lt;a class="lnlinks" href="#hl-47-4"&gt;4&lt;/a&gt;
&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;pnpm add -g nrm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -g serve
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -g http-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pnpm add -g surge
&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="常用-npmrc-配置"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8-npmrc-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;常用 npmrc 配置
&lt;/h4&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# ~/.npmrc

init-author-name=lixx
init-author-url=https://lixx.org/
init-version=0.0.0
init-license=MPL-2.0

strict-ssl=true
git-tag-version=true
message=release: %s
sign-git-commit=true
sign-git-tag=true

home=https://npmmirror.com
registry=https://registry.npmmirror.com/
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="jetbrains-系列软件"&gt;&lt;a href="#jetbrains-%e7%b3%bb%e5%88%97%e8%bd%af%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;JetBrains 系列软件
&lt;/h3&gt;&lt;p&gt;通过 &amp;ldquo;JetBrains ToolBox&amp;rdquo; 下载 JetBrains 系列软件&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://www.jetbrains.com/toolbox-app/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.jetbrains.com/toolbox-app/" data-u-e-text="https://www.jetbrains.com/toolbox-app/"&gt;https://www.jetbrains.com/toolbox-app/&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;这玩意会自动在 &lt;code&gt;/home/&amp;lt;username&amp;gt;/.local/share/JetBrains/Toolbox/&lt;/code&gt; 下蛋，不必手动安装到 &lt;code&gt;bin/&lt;/code&gt;&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>Debian/Ubuntu 安装 Syncthing</title><link>https://www.lixx.org/a/23b8/</link><pubDate>Fri, 07 Feb 2025 07:03:52 +0000</pubDate><guid>https://www.lixx.org/a/23b8/</guid><description>&lt;h2 id="通过-apt-安装最新版-syncthing"&gt;&lt;a href="#%e9%80%9a%e8%bf%87-apt-%e5%ae%89%e8%a3%85%e6%9c%80%e6%96%b0%e7%89%88-syncthing" class="header-anchor"&gt;&lt;/a&gt;通过 apt 安装最新版 Syncthing
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;相关文档&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://apt.syncthing.net/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://apt.syncthing.net/" data-u-e-text="https://apt.syncthing.net/"&gt;https://apt.syncthing.net/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="安装必要的-apt-工具如果无"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%bf%85%e8%a6%81%e7%9a%84-apt-%e5%b7%a5%e5%85%b7%e5%a6%82%e6%9e%9c%e6%97%a0" class="header-anchor"&gt;&lt;/a&gt;安装必要的 apt 工具（如果无）
&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&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;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install apt-transport-https ca-certificates
&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="添加-aptsyncthingnet-apt-源"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0-aptsyncthingnet-apt-%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;添加 &lt;code&gt;apt.syncthing.net&lt;/code&gt; apt 源
&lt;/h3&gt;&lt;h4 id="下载-syncthingnet-公钥"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd-syncthingnet-%e5%85%ac%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;下载 syncthing.net 公钥
&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&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;sudo mkdir -p /etc/apt/keyrings
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo curl -L -o /etc/apt/keyrings/syncthing-archive-keyring.gpg https://syncthing.net/release-key.gpg
&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="添加-apt-源"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0-apt-%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;添加 apt 源
&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/syncthing-archive-keyring.gpg] https://apt.syncthing.net/ syncthing stable&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/syncthing.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;h3 id="安装-syncthing"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-syncthing" class="header-anchor"&gt;&lt;/a&gt;安装 Syncthing
&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;
&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;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install syncthing/syncthing
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;syncthing --version
&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&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;syncthing v1.29.2 &lt;span class="s2"&gt;&amp;#34;Gold Grasshopper&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;go1.23.4 linux-amd64&lt;span class="o"&gt;)&lt;/span&gt; debian@github.syncthing.net 2025-01-11 16:38:29 UTC &lt;span class="o"&gt;[&lt;/span&gt;noupgrade&lt;span class="o"&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="使用-systemd-配置-syncthing-服务"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8-systemd-%e9%85%8d%e7%bd%ae-syncthing-%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;使用 systemd 配置 Syncthing 服务
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;相关文档&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.syncthing.net/users/autostart.html#using-systemd" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://docs.syncthing.net/users/autostart.html#using-systemd" data-u-e-text="https://docs.syncthing.net/users/autostart.html#using-systemd"&gt;https://docs.syncthing.net/users/autostart.html#using-systemd&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h3 id="新建一个用户如果需要"&gt;&lt;a href="#%e6%96%b0%e5%bb%ba%e4%b8%80%e4%b8%aa%e7%94%a8%e6%88%b7%e5%a6%82%e6%9e%9c%e9%9c%80%e8%a6%81" class="header-anchor"&gt;&lt;/a&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;sudo adduser syncthinguser
&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="启用并启动-syncthing-服务"&gt;&lt;a href="#%e5%90%af%e7%94%a8%e5%b9%b6%e5%90%af%e5%8a%a8-syncthing-%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;启用并启动 Syncthing 服务
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;
&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;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; syncthing@syncthinguser.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl start syncthing@syncthinguser.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;然后就可以通过浏览器访问默认的 Web GUI 地址 &lt;code&gt;http://127.0.0.1:8384&lt;/code&gt; 对 syncthing 进行配置和使用。&lt;/p&gt;
&lt;h3 id="修改配置文件"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;修改配置文件
&lt;/h3&gt;&lt;p&gt;如果不使用 Web GUI，可以手动修改配置文件。默认的配置文件位于 &lt;code&gt;~/.local/state/syncthing/&lt;/code&gt;，修改后重启 syncthing：&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&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;systemctl restart syncthing@syncthinguser.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;h4 id="检查"&gt;&lt;a href="#%e6%a3%80%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;检查
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看 syncthing 状态&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&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;systemctl status syncthing@syncthinguser.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;/li&gt;
&lt;li&gt;
&lt;p&gt;查看 syncthing 日志&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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;journalctl -e -u syncthing@syncthinguser.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;/li&gt;
&lt;li&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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&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;ss -tuln
&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;/li&gt;
&lt;/ul&gt;
&lt;h2 id="通过-cloudflare-tunnel-访问-syncthing-的-web-gui"&gt;&lt;a href="#%e9%80%9a%e8%bf%87-cloudflare-tunnel-%e8%ae%bf%e9%97%ae-syncthing-%e7%9a%84-web-gui" class="header-anchor"&gt;&lt;/a&gt;通过 Cloudflare Tunnel 访问 Syncthing 的 Web GUI
&lt;/h2&gt;&lt;p&gt;因为懒得为 Syncthing 的 Web GUI 暴露公网端口、绑定域名、开启 https，使用 Cloudflare Tunnel 访问 Syncthing 的 Web GUI 是一个简单、安全的方法。&lt;/p&gt;
&lt;h3 id="一般前提"&gt;&lt;a href="#%e4%b8%80%e8%88%ac%e5%89%8d%e6%8f%90" class="header-anchor"&gt;&lt;/a&gt;一般前提
&lt;/h3&gt;&lt;p&gt;要使用 Cloudflare Tunnel，一般需要：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拥有一个 Cloudflare 账号。&lt;/li&gt;
&lt;li&gt;拥有一个可以绑定 Cloudflare 的域名。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="创建设置-tunnel"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e8%ae%be%e7%bd%ae-tunnel" class="header-anchor"&gt;&lt;/a&gt;创建、设置 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"
 data-u-e="a" data-u-e-url="https://one.dash.cloudflare.com/" data-u-e-text="Cloudflare One"&gt;Cloudflare One&lt;/a&gt;
，转到 Networks &amp;gt; Tunnels 页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;点击 “Create a tunnel” 创建一个新 tunnel， tunnel 类型选择 “cloudflared”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为 tunnel 起一个名字。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择自己服务器的系统和架构，复制页面上的代码到服务器中运行，即完成安装 “cloudflared”。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/47581e557362c3fe088a0a28f7e7eefa63cb6fc5c3fe2acdfbecbed00a32191c.webp" data-u-e-src="https://www.lixx.org/images/47581e557362c3fe088a0a28f7e7eefa63cb6fc5c3fe2acdfbecbed00a32191c.webp"
	
	
	
	loading="lazy"
	
		alt="the guide to install cloudflared"
 data-u-e-alt="the guide to install cloudflared"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;the guide to install cloudflared&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;为 Web GUI 设置域名。URL 处填写 Syncthing Web GUI 的地址，例如 &lt;code&gt;localhost:8384&lt;/code&gt; (本地地址，不需要公网地址)。HTTP Host Header 填写&lt;code&gt;localhost&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/b15b7d0a5cfa4eca792034f32464b14b05c884468a5dab108711d94f91758235.webp" data-u-e-src="https://www.lixx.org/images/b15b7d0a5cfa4eca792034f32464b14b05c884468a5dab108711d94f91758235.webp"
	
	
	
	loading="lazy"
	
		alt="public hostname setting"
 data-u-e-alt="public hostname setting"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;public hostname setting&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存 tunnel 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;不要忘记为 Web GUI 设置密码。&lt;/li&gt;
&lt;li&gt;额外地，可以使用 Cloudflare Zero Trust（即 Access）进行进一步保护，例如在访问时要求 OTP 验证。&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;p&gt;随后，即可以通过绑定的域名访问 Syncthing Web GUI。而无需配置 Web GUI 侦听公网地址、暴露公网端口、绑定域名。无需手动配置域名 dns 指向、无需手动配置 https。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/d7b24a6b67837b830260b302c2e94554b764a61b4fe1e84ae1d58940615f674a.webp" data-u-e-src="https://www.lixx.org/images/d7b24a6b67837b830260b302c2e94554b764a61b4fe1e84ae1d58940615f674a.webp"
	
	
	
	loading="lazy"
	
		alt="Syncthing Web GUI via cloudflare tunnel"
 data-u-e-alt="Syncthing Web GUI via cloudflare tunnel"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Syncthing Web GUI via cloudflare tunnel&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>在 Debian 服务器上部署 Wavelog</title><link>https://www.lixx.org/a/5ecc/</link><pubDate>Fri, 17 Jan 2025 07:39:18 +0000</pubDate><guid>https://www.lixx.org/a/5ecc/</guid><description>&lt;p&gt;简单记录在 DigitalOcean 的 Debian 服务器上使用 Linux + Nginx + PHP + MariaDB 部署 Wavelog 的过程。&lt;/p&gt;
&lt;h2 id="软件版本"&gt;&lt;a href="#%e8%bd%af%e4%bb%b6%e7%89%88%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;软件版本
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;nginx version: nginx/1.22.1
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;PHP 8.2.26 (cli) (built: Nov 25 2024 17:21:51) (NTS)
Zend Engine v4.2.26, Copyright (c) Zend Technologies
 with Zend OPcache v8.2.26, Copyright (c), by Zend Technologies
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;mariadb Ver 15.1 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64) using EditLine wrapper
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Wavelog Version: 1.9.1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="创建-droplets"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba-droplets" class="header-anchor"&gt;&lt;/a&gt;创建 Droplets
&lt;/h2&gt;&lt;p&gt;首先在 DigitalOcean 网站上创建 Droplets 实例，很简单。
选择需要的数据中心、系统版本、配置即可。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/aa752892f6ed9df396d64ac59b8a67fa703cb94db2833d2ad7207d7816043d7c.webp" data-u-e-src="https://www.lixx.org/images/aa752892f6ed9df396d64ac59b8a67fa703cb94db2833d2ad7207d7816043d7c.webp"
	
	
	
	loading="lazy"
	
		alt="Choose Size"
 data-u-e-alt="Choose Size"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Choose Size&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;我比较喜欢使用新加坡数据中心、Debian 12、6 刀配置、SSH 登录、开启性能监控、开启 IPv6。&lt;/p&gt;
&lt;p&gt;等待几分钟即创建完成，在控制面版查看并记录机器的 IP。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/ff85a286b33f10d1d7176534296f1d25c415386aa485ad4da9b3127e9911b217.webp" data-u-e-src="https://www.lixx.org/images/ff85a286b33f10d1d7176534296f1d25c415386aa485ad4da9b3127e9911b217.webp"
	
	
	
	loading="lazy"
	
		alt="droplets dashboard"
 data-u-e-alt="droplets dashboard"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;droplets dashboard&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;开机后连接上去，更新软件、安装 git。&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt;4&lt;/a&gt;
&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;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -v
&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;开启 DigitalOcean 的&lt;a class="link" href="https://docs.digitalocean.com/products/monitoring/how-to/install-agent/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://docs.digitalocean.com/products/monitoring/how-to/install-agent/" data-u-e-text="性能监控与警告（improved metrics monitoring and alerting）"&gt;性能监控与警告（improved metrics monitoring and alerting）&lt;/a&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;curl -sSL https://repos.insights.digitalocean.com/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sudo bash
&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="安装-nginx"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-nginx" class="header-anchor"&gt;&lt;/a&gt;安装 nginx
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;
&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;sudo apt install nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nginx -v
&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;安装 nginx 后，浏览器打开 &lt;code&gt;http://&amp;lt;IP&amp;gt;:80/&lt;/code&gt; 或者 &lt;code&gt;http://[&amp;lt;IPv6&amp;gt;]:80/&lt;/code&gt; 应该可以看到默认的 nginx 网页。
&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/0e2cc54c8f063a46f2ced410b84afc3a4a1b1fe31beedca041dcaefdf1251cce.webp" data-u-e-src="https://www.lixx.org/images/0e2cc54c8f063a46f2ced410b84afc3a4a1b1fe31beedca041dcaefdf1251cce.webp"
	
	
	
	loading="lazy"
	
		alt="Welcome to nginx"
 data-u-e-alt="Welcome to nginx"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Welcome to nginx&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="安装-php-fpm"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-php-fpm" class="header-anchor"&gt;&lt;/a&gt;安装 php-fpm
&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-2"&gt;&lt;a class="lnlinks" href="#hl-7-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-7-3"&gt;&lt;a class="lnlinks" href="#hl-7-3"&gt;3&lt;/a&gt;
&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;sudo apt-get install php-fpm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sudo apt-get install php8.2-fpm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php -v
&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="安装-wavelog-需要的-php-组件"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-wavelog-%e9%9c%80%e8%a6%81%e7%9a%84-php-%e7%bb%84%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;安装 wavelog 需要的 php 组件
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/wavelog/Wavelog/wiki/Installation#debian" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/Wavelog/wiki/Installation#debian" data-u-e-text="https://github.com/wavelog/Wavelog/wiki/Installation#debian"&gt;https://github.com/wavelog/Wavelog/wiki/Installation#debian&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&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;sudo apt install php-curl php-mysql php-mbstring php-xml php-zip php-gd
&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;a href="#%e9%85%8d%e7%bd%ae%e7%bd%91%e9%a1%b5%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;配置网页服务
&lt;/h2&gt;&lt;h3 id="下载-wavelog"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd-wavelog" class="header-anchor"&gt;&lt;/a&gt;下载 wavelog
&lt;/h3&gt;&lt;p&gt;使用 git 下载 wavelog 到 &lt;code&gt;/var/www/wavelog/&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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;git clone https://github.com/wavelog/Wavelog.git /var/www/wavelog/ --depth &lt;span class="m"&gt;1&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="设置-wavelog-文件夹权限"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae-wavelog-%e6%96%87%e4%bb%b6%e5%a4%b9%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;设置 wavelog 文件夹权限
&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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-3"&gt;&lt;a class="lnlinks" href="#hl-10-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-4"&gt;&lt;a class="lnlinks" href="#hl-10-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-5"&gt;&lt;a class="lnlinks" href="#hl-10-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-6"&gt;&lt;a class="lnlinks" href="#hl-10-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-7"&gt;&lt;a class="lnlinks" href="#hl-10-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-8"&gt;&lt;a class="lnlinks" href="#hl-10-8"&gt;8&lt;/a&gt;
&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="nv"&gt;directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/var/www/wavelog
&lt;/span&gt;&lt;/span&gt;&lt;span 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;# debian&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R www-data:www-data &lt;span class="nv"&gt;$directory&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;# change permissions of directories and files&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo find &lt;span class="nv"&gt;$directory&lt;/span&gt; -type d -exec chmod &lt;span class="m"&gt;755&lt;/span&gt; &lt;span class="o"&gt;{}&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;sudo find &lt;span class="nv"&gt;$directory&lt;/span&gt; -type f -exec chmod &lt;span class="m"&gt;664&lt;/span&gt; &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="se"&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;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Wavelog 官方的警告:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It is your responsibility to ensure you protect your system from intruders/attacks. These commands and permissions are just examples used to get Wavelog up and running and are not a guide on how to achieve a secure system. You should review these permissions after installation and make appropriate changes if you determine that finer-grained access control is needed.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="关闭默认的-nginx-服务器配置"&gt;&lt;a href="#%e5%85%b3%e9%97%ad%e9%bb%98%e8%ae%a4%e7%9a%84-nginx-%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;关闭默认的 nginx 服务器配置
&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" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;
&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;sudo rm -rf /etc/nginx/sites-enabled/default
&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="复制一份默认的-nginx-服务器配置并启用"&gt;&lt;a href="#%e5%a4%8d%e5%88%b6%e4%b8%80%e4%bb%bd%e9%bb%98%e8%ae%a4%e7%9a%84-nginx-%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%85%8d%e7%bd%ae%e5%b9%b6%e5%90%af%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;复制一份默认的 nginx 服务器配置并启用
&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" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;
&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;sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/wavelog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /etc/nginx/sites-available/wavelog /etc/nginx/sites-enabled/wavelog
&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="编辑-nginx-服务器配置"&gt;&lt;a href="#%e7%bc%96%e8%be%91-nginx-%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;编辑 nginx 服务器配置
&lt;/h3&gt;&lt;p&gt;借助 nano，vim 等工具远程编辑 wavelog 的配置文件：&lt;code&gt;/etc/nginx/sites-available/wavelog&lt;/code&gt;。
或者使用 WinScp，MobaXterm 等软件在本地编辑后上传。&lt;/p&gt;

&lt;details&gt;
 &lt;summary&gt;默认的配置大概长这样&lt;/summary&gt;
 &lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# /etc/nginx/sites-enabled/default
##
# You should look at the following URL&amp;#39;s in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
 listen 80 default_server;
 listen [::]:80 default_server;

 # SSL configuration
 #
 # listen 443 ssl default_server;
 # listen [::]:443 ssl default_server;
 #
 # Note: You should disable gzip for SSL traffic.
 # See: https://bugs.debian.org/773332
 #
 # Read up on ssl_ciphers to ensure a secure configuration.
 # See: https://bugs.debian.org/765782
 #
 # Self signed certs generated by the ssl-cert package
 # Don&amp;#39;t use them in a production server!
 #
 # include snippets/snakeoil.conf;

 root /var/www/html;

 # Add index.php to the list if you are using PHP
 index index.html index.htm index.nginx-debian.html;

 server_name _;

 location / {
 # First attempt to serve request as file, then
 # as directory, then fall back to displaying a 404.
 try_files $uri $uri/ =404;
 }

 # pass PHP scripts to FastCGI server
 #
 location ~ \.php$ {
 include snippets/fastcgi-php.conf;

 # With php-fpm (or other unix sockets):
 fastcgi_pass unix:/run/php/php-fpm.sock;
 # With php-cgi (or other tcp sockets):
 #fastcgi_pass 127.0.0.1:9000;
 }

 # deny access to .htaccess files, if Apache&amp;#39;s document root
 # concurs with nginx&amp;#39;s one
 #
 location ~ /\.ht {
 deny all;
 }
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
# listen 80;
# listen [::]:80;
#
# server_name example.com;
#
# root /var/www/example.com;
# index index.html;
#
# location / {
# try_files $uri $uri/ =404;
# }
#}
&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;

&lt;p&gt;主要修改以下几项：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;listen&lt;/code&gt; 设置绑定的 IP 和端口：&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" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;
&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-cfg" data-lang="cfg"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;listen 80 default_server;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="na"&gt;listen [::]:80 default_server;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;root&lt;/code&gt; 设置 wavelog 的文件目录：&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" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-14-2"&gt;&lt;a class="lnlinks" href="#hl-14-2"&gt;2&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- root /var/www/html;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ root /var/www/wavelog;
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;index&lt;/code&gt; 项增加 &lt;code&gt;index.php&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" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-15-2"&gt;&lt;a class="lnlinks" href="#hl-15-2"&gt;2&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- index index.html index.htm;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ index index.php index.html index.htm;
&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;/li&gt;
&lt;li&gt;
&lt;p&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" id="hl-16-1"&gt;&lt;a class="lnlinks" href="#hl-16-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-16-2"&gt;&lt;a class="lnlinks" href="#hl-16-2"&gt;2&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- server_name _;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ server_name log.example.com;
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;启用 PHP FastCGI：&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" id="hl-17-1"&gt;&lt;a class="lnlinks" href="#hl-17-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-2"&gt;&lt;a class="lnlinks" href="#hl-17-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-3"&gt;&lt;a class="lnlinks" href="#hl-17-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-4"&gt;&lt;a class="lnlinks" href="#hl-17-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-5"&gt;&lt;a class="lnlinks" href="#hl-17-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-6"&gt;&lt;a class="lnlinks" href="#hl-17-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-7"&gt;&lt;a class="lnlinks" href="#hl-17-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-8"&gt;&lt;a class="lnlinks" href="#hl-17-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-9"&gt;&lt;a class="lnlinks" href="#hl-17-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-10"&gt;&lt;a class="lnlinks" href="#hl-17-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-11"&gt;&lt;a class="lnlinks" href="#hl-17-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-17-12"&gt;&lt;a class="lnlinks" href="#hl-17-12"&gt;12&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # pass PHP scripts to FastCGI server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; #
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; location ~ \.php$ {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; include snippets/fastcgi-php.conf;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # With php-fpm (or other unix sockets):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- # fastcgi_pass unix:/run/php/php-fpm.sock;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ fastcgi_pass unix:/run/php/php-fpm.sock;
&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; # With php-cgi (or other tcp sockets):
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # fastcgi_pass 127.0.0.1:9000;
&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编辑完成后，可以使用 &lt;code&gt;sudo nginx -t&lt;/code&gt; 检查配置是否出错，根据提示进行相应修改即可。随后使用 &lt;code&gt;sudo nginx -s reload&lt;/code&gt; 重载 nginx 或者用 &lt;code&gt;sudo systemctl restart nginx&lt;/code&gt; 重启 nginx，此时访问 IP 或者域名应该可以看到 Wavelog 的安装界面，表明 Nginx 和 PHP 的配置基本正常。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/3d2c97179df9997a67b2d1f2d1534294fc3802571058a382bfc0d42dbc4453a3.webp" data-u-e-src="https://www.lixx.org/images/3d2c97179df9997a67b2d1f2d1534294fc3802571058a382bfc0d42dbc4453a3.webp"
	
	
	
	loading="lazy"
	
		alt="Wavelog Installer"
 data-u-e-alt="Wavelog Installer"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Wavelog Installer&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="添加官方推荐的-nginx-配置"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e5%ae%98%e6%96%b9%e6%8e%a8%e8%8d%90%e7%9a%84-nginx-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;添加官方推荐的 nginx 配置
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#nginx" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#nginx" data-u-e-text="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#nginx"&gt;https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#nginx&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;参照 Wavelog 官方 wiki 给出的 nginx 配置，添加到自己的配置中。不要忘记检查和重载。&lt;/p&gt;

&lt;details&gt;
 &lt;summary&gt;一个完整的配置的例子&lt;/summary&gt;
 &lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# /etc/nginx/sites-enabled/wavelog

server {
 listen 80 default_server;
 listen [::]:80 default_server;

 root /var/www/wavelog;

 index index.php index.html index.htm;

 server_name wavelog.example.com;
 server_tokens off;

 location / {
 try_files $uri $uri/ /index.php?$query_string;
 }

 location = /favicon.ico {
 log_not_found off;
 }

 location = /robots.txt {
 log_not_found off;
 }

 location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
 expires 7d;
 }

 location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
 add_header Access-Control-Allow-Origin &amp;#34;*&amp;#34;;
 expires 7d;
 }

 ## gzip (optional)
 # gzip on;
 # gzip_vary on;
 # gzip_proxied any;
 # gzip_comp_level 6;
 # gzip_types text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

 location ~ \.php(/|$) {
 include snippets/fastcgi-php.conf;

 fastcgi_pass unix:/run/php/php-fpm.sock;
 include fastcgi_params;

 # fastcgi settings
 fastcgi_buffers 8 16k;
 fastcgi_buffer_size 32k;

 # fastcgi params
 fastcgi_split_path_info ^(.+\.php)(/.*)$;
 fastcgi_param DOCUMENT_ROOT $realpath_root;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 fastcgi_param PATH_INFO $fastcgi_path_info;
 }

 location ~ /\.ht {
 deny all;
 }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/details&gt;

&lt;h2 id="安装数据库"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e6%95%b0%e6%8d%ae%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;安装数据库
&lt;/h2&gt;&lt;h3 id="安装-mariadb"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-mariadb" class="header-anchor"&gt;&lt;/a&gt;安装 MariaDB
&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" id="hl-18-1"&gt;&lt;a class="lnlinks" href="#hl-18-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-18-2"&gt;&lt;a class="lnlinks" href="#hl-18-2"&gt;2&lt;/a&gt;
&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;sudo apt install mariadb-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mariadb -V
&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="启用-mariadb-安全设置"&gt;&lt;a href="#%e5%90%af%e7%94%a8-mariadb-%e5%ae%89%e5%85%a8%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;启用 MariaDB 安全设置
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;mysql_secure_installation&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" id="hl-19-1"&gt;&lt;a class="lnlinks" href="#hl-19-1"&gt;1&lt;/a&gt;
&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;sudo mysql_secure_installation
&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;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/0b5939752b38b22e04ffad850c53e39f8af39b3be8b29a68427df3bf0b216857.webp" data-u-e-src="https://www.lixx.org/images/0b5939752b38b22e04ffad850c53e39f8af39b3be8b29a68427df3bf0b216857.webp"
	
	
	
	loading="lazy"
	
		alt="mysql_secure_installation"
 data-u-e-alt="mysql_secure_installation"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mysql_secure_installation&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="创建数据库"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e6%95%b0%e6%8d%ae%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;创建数据库
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;进入 MariaDB 命令行界面。&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" id="hl-20-1"&gt;&lt;a class="lnlinks" href="#hl-20-1"&gt;1&lt;/a&gt;
&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;sudo mariadb -u root -p
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;创建一个名为 &lt;code&gt;wavelog_db&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" id="hl-21-1"&gt;&lt;a class="lnlinks" href="#hl-21-1"&gt;1&lt;/a&gt;
&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-mariadb" data-lang="mariadb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;DATABASE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wavelog_db&lt;/span&gt;&lt;span class="p"&gt;;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;创建一个用户 &lt;code&gt;wavelog_username&lt;/code&gt;，并设置密码 &lt;code&gt;wavelog_password&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" id="hl-22-1"&gt;&lt;a class="lnlinks" href="#hl-22-1"&gt;1&lt;/a&gt;
&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-mariadb" data-lang="mariadb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wavelog_username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;localhost&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;IDENTIFIED&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wavelog_password&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&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;blockquote&gt;
 &lt;p&gt;建议使用高强度密码，并妥善保管密码。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;向用户 &lt;code&gt;wavelog_username&lt;/code&gt; 授予 &lt;code&gt;wavelog_db&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" id="hl-23-1"&gt;&lt;a class="lnlinks" href="#hl-23-1"&gt;1&lt;/a&gt;
&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-mariadb" data-lang="mariadb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;GRANT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ALL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;PRIVILEGES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;ON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wavelog_db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;TO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;wavelog_username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&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;/li&gt;
&lt;li&gt;
&lt;p&gt;退出 MariaDB 命令行界面。&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" id="hl-24-1"&gt;&lt;a class="lnlinks" href="#hl-24-1"&gt;1&lt;/a&gt;
&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-mariadb" data-lang="mariadb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;QUIT&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;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/19e36ea340251615ff8a69a3615956e218f7cbf10ad6a7a627fcbffc590fdbb1.webp" data-u-e-src="https://www.lixx.org/images/19e36ea340251615ff8a69a3615956e218f7cbf10ad6a7a627fcbffc590fdbb1.webp"
	
	
	
	loading="lazy"
	
		alt="create database and user in MariaDB"
 data-u-e-alt="create database and user in MariaDB"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;create database and user in MariaDB&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="安装-wavelog"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-wavelog" class="header-anchor"&gt;&lt;/a&gt;安装 Wavelog
&lt;/h2&gt;&lt;p&gt;浏览打开你绑定 IP 或者域名，根据网页提示对 wavelog 进行初始化。&lt;/p&gt;
&lt;p&gt;可以看到 Pre Checks 提示部分 PHP 设置不满足要求。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/c3ee7d238228a425c08e9a04af3d8b8b54103f0f35b970f751629795940f06df.webp" data-u-e-src="https://www.lixx.org/images/c3ee7d238228a425c08e9a04af3d8b8b54103f0f35b970f751629795940f06df.webp"
	
	
	
	loading="lazy"
	
		alt="the Pre Checks in Wavelog Installer"
 data-u-e-alt="the Pre Checks in Wavelog Installer"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;the Pre Checks in Wavelog Installer&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="修改-php-fpm-设置"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9-php-fpm-%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;修改 php-fpm 设置
&lt;/h3&gt;&lt;p&gt;打开 &lt;code&gt;/etc/php/8.2/fpm/php.ini&lt;/code&gt;，使用搜索功能搜索相应的设置项，修改其值使其符合要求:&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/a27016eab4562424f6f83ae85d96b6592be7d28c6027abeaa3f11f9490c17f83.webp" data-u-e-src="https://www.lixx.org/images/a27016eab4562424f6f83ae85d96b6592be7d28c6027abeaa3f11f9490c17f83.webp"
	
	
	
	loading="lazy"
	
		alt="max_execution_time in php.ini"
 data-u-e-alt="max_execution_time in php.ini"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;max_execution_time in php.ini&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;并重启 php-fpm :&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" id="hl-25-1"&gt;&lt;a class="lnlinks" href="#hl-25-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart php8.2-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;p&gt;再次打开 Wavelog install 继续进行安装。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/310ed7dbbcb283d0800f8f9883d934905871b2993eab28462133576f999435c4.webp" data-u-e-src="https://www.lixx.org/images/310ed7dbbcb283d0800f8f9883d934905871b2993eab28462133576f999435c4.webp"
	
	
	
	loading="lazy"
	
		alt="Wavelog Pre Checks after setting php.ini"
 data-u-e-alt="Wavelog Pre Checks after setting php.ini"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Wavelog Pre Checks after setting php.ini&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="设定-wavelog-使用的数据库和用户"&gt;&lt;a href="#%e8%ae%be%e5%ae%9a-wavelog-%e4%bd%bf%e7%94%a8%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93%e5%92%8c%e7%94%a8%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;设定 Wavelog 使用的数据库和用户
&lt;/h3&gt;&lt;p&gt;将前面创建的数据库和用户填入 Wavelog 的数据库设置中。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/34be7a6d3b42c99f3d3e771b61ebfa9d21e7ad6c7609cf03e8d8e0cb0897055e.webp" data-u-e-src="https://www.lixx.org/images/34be7a6d3b42c99f3d3e771b61ebfa9d21e7ad6c7609cf03e8d8e0cb0897055e.webp"
	
	
	
	loading="lazy"
	
		alt="the database setting in Wavelog Installer"
 data-u-e-alt="the database setting in Wavelog Installer"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;the database setting in Wavelog Installer&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="完成安装"&gt;&lt;a href="#%e5%ae%8c%e6%88%90%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;完成安装
&lt;/h3&gt;&lt;p&gt;随后根据提示，填入用户信息，即可完成安装。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/99d0f5f6591f9df5d573832b654d21f2a11fa96b94fca587c2b46a47b1a96145.webp" data-u-e-src="https://www.lixx.org/images/99d0f5f6591f9df5d573832b654d21f2a11fa96b94fca587c2b46a47b1a96145.webp"
	
	
	
	loading="lazy"
	
		alt="Wavelog Installation"
 data-u-e-alt="Wavelog Installation"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Wavelog Installation&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="额外的设置"&gt;&lt;a href="#%e9%a2%9d%e5%a4%96%e7%9a%84%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;额外的设置
&lt;/h3&gt;&lt;h4 id="设置-wavelog-自动任务的-cron"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae-wavelog-%e8%87%aa%e5%8a%a8%e4%bb%bb%e5%8a%a1%e7%9a%84-cron" class="header-anchor"&gt;&lt;/a&gt;设置 Wavelog 自动任务的 cron
&lt;/h4&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/wavelog/wavelog/wiki/Recommended-Cron-Jobs-and-Cronmanager" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/wavelog/wiki/Recommended-Cron-Jobs-and-Cronmanager" data-u-e-text="https://github.com/wavelog/wavelog/wiki/Recommended-Cron-Jobs-and-Cronmanager"&gt;https://github.com/wavelog/wavelog/wiki/Recommended-Cron-Jobs-and-Cronmanager&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;打开 &lt;code&gt;crontab -e&lt;/code&gt;, 将&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-cron" data-lang="cron"&gt;# Wavelog Master Cron
* * * * * curl --silent https://&amp;lt;URL-To-Wavelog&amp;gt;/index.php/cron/run &amp;amp;&amp;gt;/dev/null
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打开 Wavelog 的 Cron Manager（&lt;code&gt;https://&amp;lt;URL-To-Wavelog&amp;gt;/cron&lt;/code&gt;），显示 OK 即可。并在页面中启用自己需要的定时任务。&lt;/p&gt;
&lt;h4 id="手动下载数据"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e4%b8%8b%e8%bd%bd%e6%95%b0%e6%8d%ae" class="header-anchor"&gt;&lt;/a&gt;手动下载数据
&lt;/h4&gt;&lt;p&gt;新安装的 Wavelog 可能没有包含一些附加数据，例如 DXCC 地区数据、LoTW 用户数据、POTA 数据等等，可以在 Debug Information 页面（&lt;code&gt;https://&amp;lt;URL-To-Wavelog&amp;gt;/debug&lt;/code&gt;）手动更新。如果开启了自动任务，也可以等待自动更新。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/0d7b11ae1b3225660f38ca8e232b4be2edfa589dd93b5d7d90025225e1808e44.webp" data-u-e-src="https://www.lixx.org/images/0d7b11ae1b3225660f38ca8e232b4be2edfa589dd93b5d7d90025225e1808e44.webp"
	
	
	
	loading="lazy"
	
		alt="get extra data files"
 data-u-e-alt="get extra data files"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;get extra data files&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h4 id="url-美化"&gt;&lt;a href="#url-%e7%be%8e%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;URL 美化
&lt;/h4&gt;&lt;p&gt;默认的 URL 中间会带着 &lt;code&gt;/index.php/&lt;/code&gt; ，
参照 wiki ，在 &lt;code&gt;application/config/config.php&lt;/code&gt; 将 &lt;code&gt;$config['index_page']&lt;/code&gt; 设置为 &lt;code&gt;''&lt;/code&gt; 空即可删除。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/2f5e24ef2130c70800a1905c3a63dab4c68416cf5a1cb89f5cef1e87697c0c11.webp" data-u-e-src="https://www.lixx.org/images/2f5e24ef2130c70800a1905c3a63dab4c68416cf5a1cb89f5cef1e87697c0c11.webp"
	
	
	
	loading="lazy"
	
		alt="ugly URL"
 data-u-e-alt="ugly URL"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;ugly URL&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#remove-indexphp-from-the-url-with-nginx-pretty-url" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#remove-indexphp-from-the-url-with-nginx-pretty-url" data-u-e-text="https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#remove-indexphp-from-the-url-with-nginx-pretty-url"&gt;https://github.com/wavelog/wavelog/wiki/Webserver-Configurations#remove-indexphp-from-the-url-with-nginx-pretty-url&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/wavelog/Wavelog/wiki/Wavelog.php-Configuration-File#remove-indexphp-from-your-url" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/Wavelog/wiki/Wavelog.php-Configuration-File#remove-indexphp-from-your-url" data-u-e-text="https://github.com/wavelog/Wavelog/wiki/Wavelog.php-Configuration-File#remove-indexphp-from-your-url"&gt;https://github.com/wavelog/Wavelog/wiki/Wavelog.php-Configuration-File#remove-indexphp-from-your-url&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h4 id="修改-encryption_key"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9-encryption_key" class="header-anchor"&gt;&lt;/a&gt;修改 &lt;code&gt;encryption_key&lt;/code&gt;
&lt;/h4&gt;&lt;p&gt;根据 &lt;a class="link" href="https://github.com/wavelog/wavelog/wiki/Wavelog.php-Configuration-File#configuration-items" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/wavelog/wavelog/wiki/Wavelog.php-Configuration-File#configuration-items" data-u-e-text="https://github.com/wavelog/wavelog/wiki/Wavelog.php-Configuration-File#configuration-items"&gt;https://github.com/wavelog/wavelog/wiki/Wavelog.php-Configuration-File#configuration-items&lt;/a&gt;
 ， 建议修改 &lt;code&gt;$config['encryption_key']&lt;/code&gt; 为更复杂的字符串 。&lt;/p&gt;
&lt;h2 id="建议"&gt;&lt;a href="#%e5%bb%ba%e8%ae%ae" class="header-anchor"&gt;&lt;/a&gt;建议
&lt;/h2&gt;&lt;h3 id="安全强化"&gt;&lt;a href="#%e5%ae%89%e5%85%a8%e5%bc%ba%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;安全强化
&lt;/h3&gt;&lt;p&gt;一般情况下，安装完成后，网页服务器会暴露在公网中，服务器的所有者应当采取各种措施增强服务器的安全性，以免发生服务器被攻破、数据丢失、隐私泄露等问题。&lt;/p&gt;
&lt;p&gt;通常来说，Wavelog 一般个人使用，没有必要将其暴露在公网当中。我个人偏向于使用 Cloudflare Tunnel 这类穿透工具进行反向代理、或者使用 Zerotier 这类组网工具进行组网以避免将服务器暴露在公网中，减少服务器被攻击的可能。&lt;/p&gt;
&lt;p&gt;如果确需公开你的 Wavelog，你应当具备一定的服务器安全知识和技能，例如使用防火墙、配置 https、禁止通过 IP 访问、性能优化、备份数据等等。&lt;/p&gt;
&lt;h2 id="相关命令"&gt;&lt;a href="#%e7%9b%b8%e5%85%b3%e5%91%bd%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;相关命令
&lt;/h2&gt;
&lt;details&gt;
 &lt;summary&gt;相关命令&lt;/summary&gt;
 &lt;h3 id="查看-nginx-状态"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b-nginx-%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;查看 nginx 状态
&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;sudo systemctl status nginx
&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="查看-php-fpm-状态"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b-php-fpm-%e7%8a%b6%e6%80%81" class="header-anchor"&gt;&lt;/a&gt;查看 php-fpm 状态
&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;sudo systemctl status php8.2-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="检查-nginx-配置"&gt;&lt;a href="#%e6%a3%80%e6%9f%a5-nginx-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;检查 nginx 配置
&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;sudo nginx -t
&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="重新加载-nginx"&gt;&lt;a href="#%e9%87%8d%e6%96%b0%e5%8a%a0%e8%bd%bd-nginx" class="header-anchor"&gt;&lt;/a&gt;重新加载 nginx
&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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;sudo nginx -s reload
&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="重启-nginx"&gt;&lt;a href="#%e9%87%8d%e5%90%af-nginx" class="header-anchor"&gt;&lt;/a&gt;重启 nginx
&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart nginx
&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="重启-php-fpm"&gt;&lt;a href="#%e9%87%8d%e5%90%af-php-fpm" class="header-anchor"&gt;&lt;/a&gt;重启 php-fpm
&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart php8.2-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;/details&gt;
</description></item><item><title>在 Debian 构建 Transmission</title><link>https://www.lixx.org/a/5c0b/</link><pubDate>Thu, 12 Dec 2024 12:40:01 +0000</pubDate><guid>https://www.lixx.org/a/5c0b/</guid><description>&lt;h2 id="安装依赖"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e4%be%9d%e8%b5%96" class="header-anchor"&gt;&lt;/a&gt;安装依赖
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#prerequisites" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#prerequisites" data-u-e-text="https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#prerequisites"&gt;https://github.com/transmission/transmission/blob/main/docs/Building-Transmission.md#prerequisites&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="基本依赖"&gt;&lt;a href="#%e5%9f%ba%e6%9c%ac%e4%be%9d%e8%b5%96" class="header-anchor"&gt;&lt;/a&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;sudo apt install build-essential cmake libcurl4-openssl-dev libssl-dev
&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;a href="#%e5%8f%af%e9%80%89%e4%be%9d%e8%b5%96" class="header-anchor"&gt;&lt;/a&gt;可选依赖
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;a class="link" href="https://github.com/transmission/transmission/issues/6873" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/transmission/transmission/issues/6873" data-u-e-text="https://github.com/transmission/transmission/issues/6873"&gt;https://github.com/transmission/transmission/issues/6873&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;v4.0.6 的 release 缺少了某个依赖，这里一并安装.&lt;/p&gt;

 &lt;/blockquote&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;sudo apt install libb64-dev libdeflate-dev libevent-dev libminiupnpc-dev libnatpmp-dev libpsl-dev libsystemd-dev
&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="下载最新的-release"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd%e6%9c%80%e6%96%b0%e7%9a%84-release" class="header-anchor"&gt;&lt;/a&gt;下载最新的 Release
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://transmissionbt.com/download" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://transmissionbt.com/download" data-u-e-text="https://transmissionbt.com/download"&gt;https://transmissionbt.com/download&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz" data-u-e-text="https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz"&gt;https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;wget https://github.com/transmission/transmission/releases/download/4.0.6/transmission-4.0.6.tar.xz
&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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;tar -xvJf transmission-4.0.6.tar.xz
&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;a href="#%e6%9e%84%e5%bb%ba" class="header-anchor"&gt;&lt;/a&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&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;cd&lt;/span&gt; transmission-4.0.6
&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;只构建 daemon 和 web&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;cmake -B build -DCMAKE_BUILD_TYPE&lt;span class="o"&gt;=&lt;/span&gt;Release -DENABLE_DAEMON&lt;span class="o"&gt;=&lt;/span&gt;ON -DENABLE_GTK&lt;span class="o"&gt;=&lt;/span&gt;OFF -DENABLE_QT&lt;span class="o"&gt;=&lt;/span&gt;OFF -DINSTALL_WEB&lt;span class="o"&gt;=&lt;/span&gt;ON -DENABLE_CLI&lt;span class="o"&gt;=&lt;/span&gt;OFF -DENABLE_UTILS&lt;span class="o"&gt;=&lt;/span&gt;ON
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;
&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;cd&lt;/span&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cmake --build . -j8
&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&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;sudo cmake --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;h2 id="启动"&gt;&lt;a href="#%e5%90%af%e5%8a%a8" class="header-anchor"&gt;&lt;/a&gt;启动
&lt;/h2&gt;&lt;p&gt;启用并启动 transmission-daemon 服务&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&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;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now transmission-daemon
&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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;sudo systemctl status transmission-daemon
&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>为域名配置 DNSSEC</title><link>https://www.lixx.org/a/030d/</link><pubDate>Mon, 04 Nov 2024 03:10:08 +0000</pubDate><guid>https://www.lixx.org/a/030d/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;DNSSEC 使用公开发布的 DNS 记录的加密签名来保护您的域名，防止伪造 DNS 应答。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="cloudflare-开启-dnssec"&gt;&lt;a href="#cloudflare-%e5%bc%80%e5%90%af-dnssec" class="header-anchor"&gt;&lt;/a&gt;Cloudflare 开启 DNSSEC
&lt;/h2&gt;&lt;p&gt;假设域名已托管在 Cloudflare。&lt;/p&gt;
&lt;p&gt;打开 Cloudflare 控制面板，转到对应的域名。&lt;/p&gt;
&lt;p&gt;跳转到 DNS - Settings 页面，找到 DNSSEC，点击 setup。就会生成 DS 记录。如下：&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/3a99566bda5eba2801d4503d41284a27b7b8ed9cae9b57a7a44d5ec7881dca3e.webp" data-u-e-src="https://www.lixx.org/images/3a99566bda5eba2801d4503d41284a27b7b8ed9cae9b57a7a44d5ec7881dca3e.webp"
	
	
	
	loading="lazy"
	
		alt="DS Record example"
 data-u-e-alt="DS Record example"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;DS Record example&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="在注册域名的服务商处添加-ds-record"&gt;&lt;a href="#%e5%9c%a8%e6%b3%a8%e5%86%8c%e5%9f%9f%e5%90%8d%e7%9a%84%e6%9c%8d%e5%8a%a1%e5%95%86%e5%a4%84%e6%b7%bb%e5%8a%a0-ds-record" class="header-anchor"&gt;&lt;/a&gt;在注册域名的服务商处添加 DS Record
&lt;/h2&gt;&lt;p&gt;在 Cloudflare 生成 DS 记录后，要在注册域名的服务商处进行相应的设置。&lt;/p&gt;
&lt;h3 id="namecheap"&gt;&lt;a href="#namecheap" class="header-anchor"&gt;&lt;/a&gt;Namecheap
&lt;/h3&gt;&lt;p&gt;以 Namecheap 为例，打开对应域名的控制面板，转到 Advanced DNS - DNSSEC ,&lt;/p&gt;
&lt;p&gt;将前面获得的 &lt;code&gt;Key Tag&lt;/code&gt;, &lt;code&gt;Algorithm&lt;/code&gt;, &lt;code&gt;Digest Type&lt;/code&gt;, &lt;code&gt;Digest&lt;/code&gt; 分别填入，然后保存即可。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/51d3f27d41672b22259d7b412568ccc1452a10e646e9ceead4eb2feb67d4b3a2.webp" data-u-e-src="https://www.lixx.org/images/51d3f27d41672b22259d7b412568ccc1452a10e646e9ceead4eb2feb67d4b3a2.webp"
	
	
	
	loading="lazy"
	
		alt="DS Record setting in Namecheap"
 data-u-e-alt="DS Record setting in Namecheap"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;DS Record setting in Namecheap&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="spaceship"&gt;&lt;a href="#spaceship" class="header-anchor"&gt;&lt;/a&gt;Spaceship
&lt;/h3&gt;&lt;p&gt;以 Spaceship 为例， 在 Spaceship 控制面板转到 Advanced DNS ，选择对应的域名，转到 Dnssec 选项卡，&lt;/p&gt;
&lt;p&gt;将前面获得的 &lt;code&gt;Key Tag&lt;/code&gt;, &lt;code&gt;Algorithm&lt;/code&gt;, &lt;code&gt;Digest Type&lt;/code&gt;, &lt;code&gt;Digest&lt;/code&gt; 分别填入，然后保存即可。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/c82a4519133ac5ea887955dfaef1dea5e213d6cab2b76994e50cc64d95ef73aa.webp" data-u-e-src="https://www.lixx.org/images/c82a4519133ac5ea887955dfaef1dea5e213d6cab2b76994e50cc64d95ef73aa.webp"
	
	
	
	loading="lazy"
	
		alt="DS Record setting in Spaceship"
 data-u-e-alt="DS Record setting in Spaceship"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;DS Record setting in Spaceship&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="等待生效"&gt;&lt;a href="#%e7%ad%89%e5%be%85%e7%94%9f%e6%95%88" class="header-anchor"&gt;&lt;/a&gt;等待生效
&lt;/h2&gt;&lt;p&gt;设置完成后，可能需要等待 10 分钟甚至 1 小时才能完全生效。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/ce3b95612e7382208211f958ee1b728b29a6062ba08b978557a6bee24615d2d3.webp" data-u-e-src="https://www.lixx.org/images/ce3b95612e7382208211f958ee1b728b29a6062ba08b978557a6bee24615d2d3.webp"
	
	
	
	loading="lazy"
	
		alt="Check DNSSEC status in Cloudflare"
 data-u-e-alt="Check DNSSEC status in Cloudflare"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Check DNSSEC status in Cloudflare&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Windows 清理重复网络名称</title><link>https://www.lixx.org/a/dbcf/</link><pubDate>Sun, 27 Oct 2024 01:25:03 +0000</pubDate><guid>https://www.lixx.org/a/dbcf/</guid><description>&lt;p&gt;电脑用久了，发现网络名称后面会出现数字，比如 “网络 1”、“网络 23”、 “**** 5” 这样的网络名称。虽然没什么影响，但看着太丑了。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/" data-u-e-text="https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/"&gt;https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;h2 id="手动清理"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e6%b8%85%e7%90%86" class="header-anchor"&gt;&lt;/a&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles
&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged
&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="注入-reg-文件"&gt;&lt;a href="#%e6%b3%a8%e5%85%a5-reg-%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;注入 reg 文件
&lt;/h2&gt;&lt;p&gt;手动进行删除比较麻烦，还有误操作的风险。
将以下内容保存为 &lt;code&gt;.reg&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-6"&gt;&lt;a class="lnlinks" href="#hl-2-6"&gt;6&lt;/a&gt;
&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-reg" data-lang="reg"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Windows Registry Editor Version 5.00
&lt;/span&gt;&lt;/span&gt;&lt;span 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;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Profiles]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkList\Signatures\Unmanaged]&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;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>SSH Connection Reset by Github</title><link>https://www.lixx.org/a/6c5e/</link><pubDate>Tue, 10 Sep 2024 02:14:25 +0000</pubDate><guid>https://www.lixx.org/a/6c5e/</guid><description>&lt;p&gt;今天起来敲代码，敲完之后发现无法推送至 Github&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt;6&lt;/a&gt;
&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;$ git push
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection reset by 20.205.243.166 port &lt;span class="m"&gt;22&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fatal: Could not &lt;span class="nb"&gt;read&lt;/span&gt; from remote repository.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Please make sure you have the correct access rights
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;and the repository exists.
&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 密钥也没有用。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;ssh -T git@github.com&lt;/code&gt; 检测，同样提示连接被重置。猜测是网络问题，尝试使用环境变量 &lt;code&gt;*_PROXY&lt;/code&gt; 指定代理连接 github 依然失败。可能 git 或 ssh 不支持 &lt;code&gt;*_PROXY&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&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;$ ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection reset by 20.205.243.166 port &lt;span class="m"&gt;22&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;a class="link" href="https://zhuanlan.zhihu.com/p/690536358" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://zhuanlan.zhihu.com/p/690536358" data-u-e-text="https://zhuanlan.zhihu.com/p/690536358"&gt;https://zhuanlan.zhihu.com/p/690536358&lt;/a&gt;
 ，根据这篇文章对 &lt;code&gt;~/.ssh/config&lt;/code&gt; 的 &lt;code&gt;ProxyCommand&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-6"&gt;&lt;a class="lnlinks" href="#hl-2-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-7"&gt;&lt;a class="lnlinks" href="#hl-2-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-8"&gt;&lt;a class="lnlinks" href="#hl-2-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-9"&gt;&lt;a class="lnlinks" href="#hl-2-9"&gt;9&lt;/a&gt;
&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# ~/.ssh/config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Host github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; port 22
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; User git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; HostName github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PreferredAuthentications publickey
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; IdentityFile ~/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ProxyCommand connect -S 127.0.0.1:114514 -a none %h %p
&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;ProxyCommand&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&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;$ ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hi LIXX.org! You&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;ve successfully authenticated, but GitHub does not provide shell access.
&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>Hello Hugo</title><link>https://www.lixx.org/a/95d7/</link><pubDate>Fri, 06 Sep 2024 10:57:56 +0800</pubDate><guid>https://www.lixx.org/a/95d7/</guid><description>&lt;p&gt;Hello World!&lt;/p&gt;
&lt;p&gt;Now, the blog have been migrated to Hugo.&lt;/p&gt;</description></item><item><title>提高 Linux 系统的 SSH 安全性</title><link>https://www.lixx.org/a/80a3/</link><pubDate>Sat, 10 Aug 2024 07:22:17 +0000</pubDate><guid>https://www.lixx.org/a/80a3/</guid><description>&lt;h2 id="更改-sshd-默认端口"&gt;&lt;a href="#%e6%9b%b4%e6%94%b9-sshd-%e9%bb%98%e8%ae%a4%e7%ab%af%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;更改 sshd 默认端口
&lt;/h2&gt;&lt;p&gt;编辑 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;，修改 &lt;code&gt;Port&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- #Port 22
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ Port 11451
&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;重启 sshd&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart sshd
&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="禁用-root-用户使用普通用户"&gt;&lt;a href="#%e7%a6%81%e7%94%a8-root-%e7%94%a8%e6%88%b7%e4%bd%bf%e7%94%a8%e6%99%ae%e9%80%9a%e7%94%a8%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;禁用 root 用户，使用普通用户
&lt;/h2&gt;&lt;h3 id="新建新用户"&gt;&lt;a href="#%e6%96%b0%e5%bb%ba%e6%96%b0%e7%94%a8%e6%88%b7" class="header-anchor"&gt;&lt;/a&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;sudo adduser lixx
&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;details&gt;
 &lt;summary&gt;sudo adduser lixx&lt;/summary&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-16"&gt;&lt;a class="lnlinks" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-17"&gt;&lt;a class="lnlinks" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-18"&gt;&lt;a class="lnlinks" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-19"&gt;&lt;a class="lnlinks" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-20"&gt;&lt;a class="lnlinks" href="#hl-0-20"&gt;20&lt;/a&gt;
&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;root@lixx:~# sudo adduser lixx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding user &lt;span class="sb"&gt;`&lt;/span&gt;lixx&lt;span class="s1"&gt;&amp;#39; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Adding new group `lixx&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;1000&lt;span class="o"&gt;)&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding new user &lt;span class="sb"&gt;`&lt;/span&gt;lixx&lt;span class="s1"&gt;&amp;#39; (1000) with group `lixx (1000)&amp;#39;&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Creating home directory &lt;span class="sb"&gt;`&lt;/span&gt;/home/lixx&lt;span class="s1"&gt;&amp;#39; ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;Copying files from `/etc/skel&amp;#39;&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;New password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Retype new password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd: password updated successfully
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Changing the user information &lt;span class="k"&gt;for&lt;/span&gt; lixx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter the new value, or press ENTER &lt;span class="k"&gt;for&lt;/span&gt; the default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Full Name &lt;span class="o"&gt;[]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Room Number &lt;span class="o"&gt;[]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Work Phone &lt;span class="o"&gt;[]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Home Phone &lt;span class="o"&gt;[]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Other &lt;span class="o"&gt;[]&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Is the information correct? &lt;span class="o"&gt;[&lt;/span&gt;Y/n&lt;span class="o"&gt;]&lt;/span&gt; y
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding new user &lt;span class="sb"&gt;`&lt;/span&gt;lixx&lt;span class="s1"&gt;&amp;#39; to supplemental / extra groups `users&amp;#39;&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding user &lt;span class="sb"&gt;`&lt;/span&gt;lixx&lt;span class="s1"&gt;&amp;#39; to group `users&amp;#39;&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@lixx:~#
&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;/details&gt;

&lt;h3 id="为新用户授予-sudo-权限"&gt;&lt;a href="#%e4%b8%ba%e6%96%b0%e7%94%a8%e6%88%b7%e6%8e%88%e4%ba%88-sudo-%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;为新用户授予 &lt;code&gt;sudo&lt;/code&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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;sudo usermod -aG sudo lixx
&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="禁止-root-通过-ssh-登录"&gt;&lt;a href="#%e7%a6%81%e6%ad%a2-root-%e9%80%9a%e8%bf%87-ssh-%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;禁止 root 通过 ssh 登录
&lt;/h3&gt;&lt;p&gt;编辑 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;，修改 &lt;code&gt;PermitRootLogin&lt;/code&gt; 值为 &lt;code&gt;no&lt;/code&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-config" data-lang="config"&gt;PermitRootLogin no
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重启 sshd&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart sshd
&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;a href="#%e4%bd%bf%e7%94%a8%e5%af%86%e9%92%a5%e5%af%b9%e7%99%bb%e5%bd%95%e7%a6%81%e6%ad%a2%e4%bd%bf%e7%94%a8%e5%af%86%e7%a0%81%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;使用密钥对登录。禁止使用密码登录
&lt;/h2&gt;&lt;h3 id="生成-ssh-密钥对"&gt;&lt;a href="#%e7%94%9f%e6%88%90-ssh-%e5%af%86%e9%92%a5%e5%af%b9" class="header-anchor"&gt;&lt;/a&gt;生成 ssh 密钥对
&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-2"&gt;&lt;a class="lnlinks" href="#hl-6-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-3"&gt;&lt;a class="lnlinks" href="#hl-6-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-4"&gt;&lt;a class="lnlinks" href="#hl-6-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-6-5"&gt;&lt;a class="lnlinks" href="#hl-6-5"&gt;5&lt;/a&gt;
&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;ssh-keygen -t ed25519 -f ~/.ssh/lixx_ed25519 -C &lt;span class="s2"&gt;&amp;#34;lixx_ed25519-20240810&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;# -t 密钥类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -f 输出的密钥文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -C 自定义的标注&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;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="上传公钥到服务器"&gt;&lt;a href="#%e4%b8%8a%e4%bc%a0%e5%85%ac%e9%92%a5%e5%88%b0%e6%9c%8d%e5%8a%a1%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;上传公钥到服务器
&lt;/h3&gt;&lt;p&gt;将生成的公钥（&lt;code&gt;~/.ssh/lixx_ed25519.pub&lt;/code&gt;）的文本内容复制粘贴到服务器的 &lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; 文件中。&lt;/p&gt;
&lt;h3 id="禁止使用密码登录"&gt;&lt;a href="#%e7%a6%81%e6%ad%a2%e4%bd%bf%e7%94%a8%e5%af%86%e7%a0%81%e7%99%bb%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;禁止使用密码登录
&lt;/h3&gt;&lt;p&gt;编辑 &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt;，修改 &lt;code&gt;PasswordAuthentication&lt;/code&gt; 值为 &lt;code&gt;no&lt;/code&gt;，禁用密码认证&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-config" data-lang="config"&gt;PasswordAuthentication no
PermitEmptyPasswords no
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;重启 sshd&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&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;sudo systemctl restart sshd
&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>mosquitto bridge 无法连接至 EMQX Cloud 服务器</title><link>https://www.lixx.org/a/ae17/</link><pubDate>Tue, 30 Jul 2024 20:34:01 +0000</pubDate><guid>https://www.lixx.org/a/ae17/</guid><description>&lt;h2 id="问题"&gt;&lt;a href="#%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;问题
&lt;/h2&gt;&lt;p&gt;希望使用 mosquitto 的 bridge 功能，将本地 mqtt 服务器的信息转发至 EMQX Cloud 服务器上，但始终提示无法连接。&lt;code&gt;Client local.client_id closed its connection.&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;
&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;root@OpenWrt:~# mosquitto -c /etc/mosquitto/mosquitto.conf -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: mosquitto version 2.0.18 starting
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Config loaded from /etc/mosquitto/mosquitto.conf.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Opening ipv4 listen socket on port 1883.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Opening ipv6 listen socket on port 1883.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Bridge local.OpenWrt.emqx doing &lt;span class="nb"&gt;local&lt;/span&gt; SUBSCRIBE on topic mytopic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Connecting bridge emqx &lt;span class="o"&gt;(&lt;/span&gt;v6q9efjc.abc.cn-hangzhou.emqxsl.cn:8883&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: Bridge OpenWrt.emqx sending CONNECT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342917: mosquitto version 2.0.18 running
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342918: Client local.OpenWrt.emqx closed its connection.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342924: Bridge local.OpenWrt.emqx doing &lt;span class="nb"&gt;local&lt;/span&gt; SUBSCRIBE on topic mytopic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342924: Connecting bridge emqx &lt;span class="o"&gt;(&lt;/span&gt;v6q9efjc.abc.cn-hangzhou.emqxsl.cn:8883&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342924: Bridge OpenWrt.emqx sending CONNECT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722342924: Client local.OpenWrt.emqx closed its connection.
&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;a href="#%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决办法
&lt;/h2&gt;&lt;p&gt;多次尝试后，无意中发现将 &lt;code&gt;bridge_protocol_version&lt;/code&gt; 的值从默认的 &lt;code&gt;mqttv311&lt;/code&gt; 修改为 &lt;code&gt;mqttv50&lt;/code&gt; 即可解决。原因不详。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我在个人电脑上使用 MQTTX 通过 MQTTv3 连接 EMQX 实例是可以正常正常连接的。&lt;/p&gt;

 &lt;/blockquote&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-4"&gt;&lt;a class="lnlinks" href="#hl-1-4"&gt;4&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# mosquitto.conf
&lt;/span&gt;&lt;/span&gt;&lt;span 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="gd"&gt;- bridge_protocol_version mqttv311
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ bridge_protocol_version mqttv50
&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;a href="#%e6%88%90%e5%8a%9f%e8%bf%9e%e6%8e%a5" class="header-anchor"&gt;&lt;/a&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-6"&gt;&lt;a class="lnlinks" href="#hl-2-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-7"&gt;&lt;a class="lnlinks" href="#hl-2-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-8"&gt;&lt;a class="lnlinks" href="#hl-2-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-9"&gt;&lt;a class="lnlinks" href="#hl-2-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-10"&gt;&lt;a class="lnlinks" href="#hl-2-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-11"&gt;&lt;a class="lnlinks" href="#hl-2-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-12"&gt;&lt;a class="lnlinks" href="#hl-2-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-13"&gt;&lt;a class="lnlinks" href="#hl-2-13"&gt;13&lt;/a&gt;
&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;root@OpenWrt:~# mosquitto -c /etc/mosquitto/mosquitto.conf -v
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: mosquitto version 2.0.18 starting
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Config loaded from /etc/mosquitto/mosquitto.conf.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Opening ipv4 listen socket on port 1883.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Opening ipv6 listen socket on port 1883.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Bridge local.OpenWrt.emqx doing &lt;span class="nb"&gt;local&lt;/span&gt; SUBSCRIBE on topic mytopic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Connecting bridge emqx &lt;span class="o"&gt;(&lt;/span&gt;v6q9efjc.abc.cn-hangzhou.emqxsl.cn:8883&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: Bridge OpenWrt.emqx sending CONNECT
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343382: mosquitto version 2.0.18 running
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343384: Received CONNACK on connection local.OpenWrt.emqx.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343384: Bridge local.OpenWrt.emqx sending SUBSCRIBE &lt;span class="o"&gt;(&lt;/span&gt;Mid: 2, Topic: mytopic, QoS: 0, Options: 0x0c&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343384: Received PUBACK from local.OpenWrt.emqx &lt;span class="o"&gt;(&lt;/span&gt;Mid: 1, RC:16&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1722343384: Received SUBACK from local.OpenWrt.emqx
&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>小米盒子3s 刷机 Android TV 跳过谷歌登录和升级 8.0</title><link>https://www.lixx.org/a/4525/</link><pubDate>Thu, 04 Jul 2024 22:06:48 +0000</pubDate><guid>https://www.lixx.org/a/4525/</guid><description>&lt;p&gt;没用的小米盒子 3s 不要扔，&lt;del&gt;裹上鸡蛋液、沾上面包糠，下锅炸至金黄酥脆控油捞出，老人小孩都爱吃，隔壁小孩都馋哭了。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;闲来没事给它刷个机吧，试试所谓 Android TV。&lt;/p&gt;
&lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;小米盒子 3s 刷原生安卓系统详细步骤 &lt;a class="link" href="https://www.znds.com/tv-1027245-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.znds.com/tv-1027245-1-1.html" data-u-e-text="https://www.znds.com/tv-1027245-1-1.html"&gt;https://www.znds.com/tv-1027245-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小米盒子 3S(MDZ-19-AA)刷 Android TV 过程及跳过谷歌帐号登录 &lt;a class="link" href="https://www.znds.com/tv-1164732-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.znds.com/tv-1164732-1-1.html" data-u-e-text="https://www.znds.com/tv-1164732-1-1.html"&gt;https://www.znds.com/tv-1164732-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小米盒子 3S（MDZ-19-AA）的刷机教程！附刷机工具 &lt;a class="link" href="https://www.znds.com/tv-1215651-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.znds.com/tv-1215651-1-1.html" data-u-e-text="https://www.znds.com/tv-1215651-1-1.html"&gt;https://www.znds.com/tv-1215651-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;亲测有效！小米盒子 3S Android TV 6 检测不到升级的解决方案 &lt;a class="link" href="https://www.znds.com/tv-1208154-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.znds.com/tv-1208154-1-1.html" data-u-e-text="https://www.znds.com/tv-1208154-1-1.html"&gt;https://www.znds.com/tv-1208154-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;小米盒子 3S（mdz-19-aa）刷入 Android TV 6 升级 Android TV 9 经验 &lt;a class="link" href="https://www.znds.com/tv-1208855-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.znds.com/tv-1208855-1-1.html" data-u-e-text="https://www.znds.com/tv-1208855-1-1.html"&gt;https://www.znds.com/tv-1208855-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="需要的工具"&gt;&lt;a href="#%e9%9c%80%e8%a6%81%e7%9a%84%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;需要的工具
&lt;/h2&gt;&lt;p&gt;本文使用的设备是小米盒子 3s，机身标注型号为 MDZ-19-AA&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;双头 USB 线，用于连接电脑和小米盒子。&lt;/li&gt;
&lt;li&gt;不大于 32GB 的 fat32 格式的 U 盘。&lt;/li&gt;
&lt;li&gt;adb 软件。&lt;/li&gt;
&lt;li&gt;固件包。（从上述链接中获取）&lt;/li&gt;
&lt;li&gt;谷歌账号及带魔法的路由器。（可通过 adb 禁用谷歌开机向导进行跳过）&lt;/li&gt;
&lt;li&gt;&lt;del&gt;搞基&lt;/del&gt;搞机工具箱，方便禁用谷歌开机界面。（如果熟悉 adb 命令的话，直接用 adb 命令禁用也是一样的）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="步骤"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;步骤
&lt;/h2&gt;&lt;h3 id="刷入-mibox3s_queenchristina_r145-降级"&gt;&lt;a href="#%e5%88%b7%e5%85%a5-mibox3s_queenchristina_r145-%e9%99%8d%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;刷入 &lt;code&gt;MiBOX3S_queenchristina_r145&lt;/code&gt; 降级
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;MiBOX3S_queenchristina_r145&lt;/code&gt; 中的文件复制至 U 盘。&lt;/li&gt;
&lt;li&gt;U 盘插入小米盒子，断电。按住遥控器的主页键和菜单键，给小米盒子通电。&lt;/li&gt;
&lt;li&gt;机器开始自动刷入降级包。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/af16f834d8c4bfcd44adafdb0ef52f4010757e385d07c30428a3a1941b71f22c.webp" data-u-e-src="https://www.lixx.org/images/af16f834d8c4bfcd44adafdb0ef52f4010757e385d07c30428a3a1941b71f22c.webp"
	
	
	
	loading="lazy"
	
		alt="mibox3s downgrade"
 data-u-e-alt="mibox3s downgrade"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mibox3s downgrade&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="刷入-dump_16abimg"&gt;&lt;a href="#%e5%88%b7%e5%85%a5-dump_16abimg" class="header-anchor"&gt;&lt;/a&gt;刷入 &lt;code&gt;dump_16AB.img&lt;/code&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;在小米盒子的 设置 - 账户与安全 中打开 USB 调试。&lt;/li&gt;
&lt;li&gt;小米盒子连接电脑。（在我的使用中，无需安装驱动）&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;dump_16AB.img&lt;/code&gt; 复制到小米盒子的根目录中。&lt;/li&gt;
&lt;li&gt;打开 adb 命令行，输入：
&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&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;adb root
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adb remount
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adb shell dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/sdcard/dump_16AB.img &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/block/mmcblk0
&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;/li&gt;
&lt;/ol&gt;
&lt;h3 id="刷入-mibox3_user_once_r750"&gt;&lt;a href="#%e5%88%b7%e5%85%a5-mibox3_user_once_r750" class="header-anchor"&gt;&lt;/a&gt;刷入 &lt;code&gt;MiBOX3_user_once_r750&lt;/code&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;MiBOX3_user_once_r750&lt;/code&gt; 中的文件复制至 U 盘。&lt;/li&gt;
&lt;li&gt;U 盘插入小米盒子，断电。按住遥控器的主页键和菜单键，给小米盒子通电，进入恢复模式。&lt;/li&gt;
&lt;li&gt;进行双清。（wipe data 和 wipe cache）&lt;/li&gt;
&lt;li&gt;点击 Apply update from EXT &amp;gt; Update from udisk &amp;gt; 选择刚刚放进去的固件刷入。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/8e194ca9b52d8b20cfef0f7968c970af7718f97a653c7ef7107cfb135d91f353.webp" data-u-e-src="https://www.lixx.org/images/8e194ca9b52d8b20cfef0f7968c970af7718f97a653c7ef7107cfb135d91f353.webp"
	
	
	
	loading="lazy"
	
		alt="Apply update from EXT"
 data-u-e-alt="Apply update from EXT"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Apply update from EXT&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="跳过谷歌账户"&gt;&lt;a href="#%e8%b7%b3%e8%bf%87%e8%b0%b7%e6%ad%8c%e8%b4%a6%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;跳过谷歌账户
&lt;/h3&gt;&lt;p&gt;完成上面的步骤后，系统已经变成 Android TV。但如果没有谷歌账号就无法进入系统。如果你有相应的条件，可以跳过本步骤。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/1f360588929b121da3e3e23af63eba47e4b77908b819eccce32ba4d8b2a1b698.webp" data-u-e-src="https://www.lixx.org/images/1f360588929b121da3e3e23af63eba47e4b77908b819eccce32ba4d8b2a1b698.webp"
	
	
	
	loading="lazy"
	
		alt="setupwraith"
 data-u-e-alt="setupwraith"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;setupwraith&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;本质上，开机的引导画面也是一个应用，所以可以通过 adb 禁用掉开机向导以跳过登录。但刷入的 Android TV 并没有开启调试功能，于是就需要一些迂回操作开启 adb 调试。&lt;/p&gt;
&lt;h4 id="刷入-mibox3_userdebug_once_r454"&gt;&lt;a href="#%e5%88%b7%e5%85%a5-mibox3_userdebug_once_r454" class="header-anchor"&gt;&lt;/a&gt;刷入 &lt;code&gt;MiBOX3_userdebug_once_r454&lt;/code&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;MiBOX3_userdebug_once_r454&lt;/code&gt; 中的 &lt;code&gt;update-once.zip&lt;/code&gt; 文件复制至 U 盘。&lt;/li&gt;
&lt;li&gt;U 盘插入小米盒子，断电。按住遥控器的主页键和菜单键，给小米盒子通电，进入恢复模式。&lt;/li&gt;
&lt;li&gt;点击 Apply update from EXT &amp;gt; Update from udisk &amp;gt; 选择 &lt;code&gt;update-once.zip&lt;/code&gt; 刷入。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="禁用-setupwraith"&gt;&lt;a href="#%e7%a6%81%e7%94%a8-setupwraith" class="header-anchor"&gt;&lt;/a&gt;禁用 &lt;code&gt;****.Setupwraith&lt;/code&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;发现开机界面依然存在，但是在这个包中 adb 调试已经默认打开了。&lt;/li&gt;
&lt;li&gt;小米盒子连接电脑。&lt;/li&gt;
&lt;li&gt;打开搞机工具箱，切换到应用管理界面，会看到开机界面的包名（包名大概为 &lt;code&gt;***.google.****.Setupwraith&lt;/code&gt;，我忘记截图了），点击“禁用”（安卓里一般称为“停用”）即可进入桌面。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/5fad42417727d5b8d3d83895c52cb932bfc81d8ac3007dbd13499e500e8ee305.webp" data-u-e-src="https://www.lixx.org/images/5fad42417727d5b8d3d83895c52cb932bfc81d8ac3007dbd13499e500e8ee305.webp"
	
	
	
	loading="lazy"
	
		alt="gaoji tool applications manager"
 data-u-e-alt="gaoji tool applications manager"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;gaoji tool applications manager&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h4 id="再次刷入-mibox3_user_once_r750"&gt;&lt;a href="#%e5%86%8d%e6%ac%a1%e5%88%b7%e5%85%a5-mibox3_user_once_r750" class="header-anchor"&gt;&lt;/a&gt;再次刷入 &lt;code&gt;MiBOX3_user_once_r750&lt;/code&gt;
&lt;/h4&gt;&lt;ol&gt;
&lt;li&gt;将 &lt;code&gt;MiBOX3_user_once_r750&lt;/code&gt; 中的文件复制至 U 盘。&lt;/li&gt;
&lt;li&gt;U 盘插入小米盒子，断电。按住遥控器的主页键和菜单键，给小米盒子通电，进入恢复模式。&lt;/li&gt;
&lt;li&gt;点击 Apply update from EXT &amp;gt; Update from udisk &amp;gt; 选择 &lt;code&gt;MiBOX3_user_once_r750&lt;/code&gt; 固件刷入。&lt;/li&gt;
&lt;li&gt;完成后开机。此时就直接进入到桌面了，没有开机向导的阻拦，adb 也是开启状态。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/02974483fcc99b4b8664ee94edeeb65b67d17284c0ce7dcee943353e7c603feb.webp" data-u-e-src="https://www.lixx.org/images/02974483fcc99b4b8664ee94edeeb65b67d17284c0ce7dcee943353e7c603feb.webp"
	
	
	
	loading="lazy"
	
		alt="mibox3s android TV 6.0"
 data-u-e-alt="mibox3s android TV 6.0"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mibox3s android TV 6.0&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/96bb59207cfae470cf0d376e914f8c7fd3b1be887082741dc8565dcfe902f6a2.webp" data-u-e-src="https://www.lixx.org/images/96bb59207cfae470cf0d376e914f8c7fd3b1be887082741dc8565dcfe902f6a2.webp"
	
	
	
	loading="lazy"
	
		alt="mibox3s android TV 6.0 storage"
 data-u-e-alt="mibox3s android TV 6.0 storage"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mibox3s android TV 6.0 storage&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="升级到-android-8"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e5%88%b0-android-8" class="header-anchor"&gt;&lt;/a&gt;升级到 Android 8
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;下载 &lt;a class="link" href="http://www.mediafire.com/file/fhh4zjspge6eh22/once-8.0-2167.7z/file" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="http://www.mediafire.com/file/fhh4zjspge6eh22/once-8.0-2167.7z/file" data-u-e-text="http://www.mediafire.com/file/fhh4zjspge6eh22/once-8.0-2167.7z/file"&gt;http://www.mediafire.com/file/fhh4zjspge6eh22/once-8.0-2167.7z/file&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;once-8.0-2167.7z&lt;/code&gt; 中的 &lt;code&gt;update.zip&lt;/code&gt; 文件复制至 U 盘。&lt;/li&gt;
&lt;li&gt;U 盘插入小米盒子，断电。按住遥控器的主页键和菜单键，给小米盒子通电，进入恢复模式。&lt;/li&gt;
&lt;li&gt;点击 Apply update from EXT &amp;gt; Update from udisk &amp;gt; 选择 &lt;code&gt;update.zip&lt;/code&gt; 刷入。&lt;/li&gt;
&lt;li&gt;完成后，系统已经变成 8.0&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/5c204a0ebe9a026ff26db6e536795e8e514f18c967119f9c8950a9931638552b.webp" data-u-e-src="https://www.lixx.org/images/5c204a0ebe9a026ff26db6e536795e8e514f18c967119f9c8950a9931638552b.webp"
	
	
	
	loading="lazy"
	
		alt="mibox3s upgrade to 8.0"
 data-u-e-alt="mibox3s upgrade to 8.0"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mibox3s upgrade to 8.0&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/378d87e1ff47549cadb7001a3c6de935d09e97812bba122f8e10afb2d8e17e77.webp" data-u-e-src="https://www.lixx.org/images/378d87e1ff47549cadb7001a3c6de935d09e97812bba122f8e10afb2d8e17e77.webp"
	
	
	
	loading="lazy"
	
		alt="mibox3s android TV 8.0"
 data-u-e-alt="mibox3s android TV 8.0"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;mibox3s android TV 8.0&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;论坛的两位楼主均称可以升级到 9.0，但我这里不显示，可能是我的网络不通或者年代久远升级服务已经关闭。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="提示"&gt;&lt;a href="#%e6%8f%90%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;提示
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;上述步骤中涉及 4 个卡刷包，除第 1 个需要将两个文件（一个&lt;code&gt;zip&lt;/code&gt;，一个&lt;code&gt;xiaomi_upadte&lt;/code&gt;）复制到 U 盘进行刷入。其他 3 个可以将&lt;code&gt;xiaomi_upadte&lt;/code&gt;删除，只复制&lt;code&gt;zip&lt;/code&gt;文件，在 recovery 中进行手动选择刷入即可。所以可以在完成 1 个包刷入后，一次性复制 3 个 zip 文件进去（注意区分文件名，文件名也可以修改），节约时间避免反复传输文件。（一次性复制 4 个也可以，但要注意&lt;code&gt;xiaomi_upadte&lt;/code&gt;中的内容和&lt;code&gt;zip&lt;/code&gt;文件名对应，以及完成第 1 个刷入后删除要&lt;code&gt;xiaomi_upadte&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;刷回原版的方法详见前面参考的文章。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="体会"&gt;&lt;a href="#%e4%bd%93%e4%bc%9a" class="header-anchor"&gt;&lt;/a&gt;体会
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;确实比原来的小米系统要快一点，没有乱七八糟的广告。但毕竟也是很久的设备了，只是刷着玩，不要有太高的期待。&lt;/li&gt;
&lt;li&gt;我这个盒子只能连上 2.4g 的 wifi，5g 的 wifi 能看见但连不上。不一定是盒子的问题，也可能是 wifi 设置问题。我 2.4g 的 wifi 是给物联网智能家居用的，所以规格设置得比较低，在盒子上看个超清的 IPTV 都比较呛（虽然超清也只有几个频道，不看也罢）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/c98d8a0c9550a0edc5a934500fb39593f354d07184e913880e1851b47526aac4.webp" data-u-e-src="https://www.lixx.org/images/c98d8a0c9550a0edc5a934500fb39593f354d07184e913880e1851b47526aac4.webp"
	
	
	
	loading="lazy"
	
		alt="kodi iptv in mibox3s"
 data-u-e-alt="kodi iptv in mibox3s"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;kodi iptv in mibox3s&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>通过 Github Action 将 Python 包发布到 pypi</title><link>https://www.lixx.org/a/a1b5/</link><pubDate>Wed, 26 Jun 2024 16:49:46 +0000</pubDate><guid>https://www.lixx.org/a/a1b5/</guid><description>&lt;h2 id="desc"&gt;&lt;a href="#desc" class="header-anchor"&gt;&lt;/a&gt;Desc
&lt;/h2&gt;&lt;p&gt;通过 &lt;a class="link" href="https://docs.github.com/actions" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://docs.github.com/actions" data-u-e-text="Github Action"&gt;Github Action&lt;/a&gt;
 将自己的 &lt;a class="link" href="https://www.python.org/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.python.org/" data-u-e-text="Python"&gt;Python&lt;/a&gt;
 包自动化发布到 &lt;a class="link" href="https://pypi.org/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://pypi.org/" data-u-e-text="PyPI"&gt;PyPI&lt;/a&gt;
。实际上 Python 官方在这方面的文档非常齐全，跟着官方教程点点鼠标、复制粘贴就可以完成。比那个什么 NPM 不知道高到哪里去了。&lt;/p&gt;
&lt;p&gt;本文简单介绍基于 &lt;code&gt;pyproject.toml&lt;/code&gt; 的通过 Github Action 进行打包和发布的大概步骤以及一些注意事项，至于一些细节、个性化的东西请看官方文档。&lt;/p&gt;
&lt;h2 id="reference"&gt;&lt;a href="#reference" class="header-anchor"&gt;&lt;/a&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setuptools&lt;/code&gt; 的简单介绍 - &lt;a class="link" href="https://setuptools.pypa.io/en/latest/userguide/quickstart.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://setuptools.pypa.io/en/latest/userguide/quickstart.html" data-u-e-text="https://setuptools.pypa.io/en/latest/userguide/quickstart.html"&gt;https://setuptools.pypa.io/en/latest/userguide/quickstart.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;pyproject.toml&lt;/code&gt; 配置 &lt;code&gt;setuptools&lt;/code&gt; - &lt;a class="link" href="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html" data-u-e-text="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html"&gt;https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;打包 Python 项目 - &lt;a class="link" href="https://packaging.python.org/en/latest/tutorials/packaging-projects/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/tutorials/packaging-projects/" data-u-e-text="https://packaging.python.org/en/latest/tutorials/packaging-projects/"&gt;https://packaging.python.org/en/latest/tutorials/packaging-projects/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;编写自己的 &lt;code&gt;pyproject.toml&lt;/code&gt; - &lt;a class="link" href="https://packaging.python.org/en/latest/guides/writing-pyproject-toml/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/guides/writing-pyproject-toml/" data-u-e-text="https://packaging.python.org/en/latest/guides/writing-pyproject-toml/"&gt;https://packaging.python.org/en/latest/guides/writing-pyproject-toml/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;通过 Github Action 工作流发布 Python 包 - &lt;a class="link" href="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/" data-u-e-text="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/"&gt;https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="前置准备"&gt;&lt;a href="#%e5%89%8d%e7%bd%ae%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;前置准备
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;拥有 Github 账户；&lt;/li&gt;
&lt;li&gt;注册 PyPI 账户并开启 2FA（双因素认证）；&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装和升级-setuptoolsbuild"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%92%8c%e5%8d%87%e7%ba%a7-setuptoolsbuild" class="header-anchor"&gt;&lt;/a&gt;安装和升级 &lt;code&gt;setuptools&lt;/code&gt;、&lt;code&gt;build&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;只是用于后面调试本地打包和调试 &lt;code&gt;pyproject.toml&lt;/code&gt;。实际上使用 Github Action 打包，不需要在本地安装打包工具。&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&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;pip install --upgrade setuptools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install --upgrade 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;pip 最好也更新一下。&lt;/p&gt;
&lt;h2 id="目录结构"&gt;&lt;a href="#%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84" class="header-anchor"&gt;&lt;/a&gt;目录结构
&lt;/h2&gt;&lt;p&gt;根据官方文档
&lt;a class="link" href="https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-the-package-files" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-the-package-files" data-u-e-text="https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-the-package-files"&gt;https://packaging.python.org/en/latest/tutorials/packaging-projects/#creating-the-package-files&lt;/a&gt;
 ，使用 &lt;code&gt;pyproject.toml&lt;/code&gt; 时，建议将代码放置在 src 目录下。&lt;/p&gt;
&lt;p&gt;代码文件较多时，可以分包分成多个文件夹。如果只是小项目代码少，直接放在 &lt;code&gt;src&lt;/code&gt; 目录下也是可以的。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-tree" data-lang="tree"&gt;&amp;lt;project_name&amp;gt;/
├── LICENSE
├── pyproject.toml
├── README.md
├── src/
│ └── &amp;lt;package_name&amp;gt;/
│ │ ├── __init__.py
│ │ └── &amp;lt;module_name&amp;gt;.py
│ └── &amp;lt;module2_name&amp;gt;.py
│ └── &amp;lt;module3_name&amp;gt;.py
└── tests/
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="编写-pyprojecttoml"&gt;&lt;a href="#%e7%bc%96%e5%86%99-pyprojecttoml" class="header-anchor"&gt;&lt;/a&gt;编写 &lt;code&gt;pyproject.toml&lt;/code&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-5"&gt;&lt;a class="lnlinks" href="#hl-2-5"&gt;5&lt;/a&gt;
&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-pyproject.toml" data-lang="pyproject.toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# pyproject.toml&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="nx"&gt;project&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="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;example_project_name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.0.1&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;code&gt;name&lt;/code&gt;, &lt;code&gt;version&lt;/code&gt; 字段。&lt;/p&gt;
&lt;p&gt;其他的字段可根据文档自行添加：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html" data-u-e-text="https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html"&gt;https://setuptools.pypa.io/en/latest/userguide/pyproject_config.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://packaging.python.org/en/latest/tutorials/packaging-projects/#configuring-metadata" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/tutorials/packaging-projects/#configuring-metadata" data-u-e-text="https://packaging.python.org/en/latest/tutorials/packaging-projects/#configuring-metadata"&gt;https://packaging.python.org/en/latest/tutorials/packaging-projects/#configuring-metadata&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="本地调试打包"&gt;&lt;a href="#%e6%9c%ac%e5%9c%b0%e8%b0%83%e8%af%95%e6%89%93%e5%8c%85" class="header-anchor"&gt;&lt;/a&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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;python -m 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;即可进行打包。输出的 &lt;code&gt;tar&lt;/code&gt; 文件和 &lt;code&gt;wheel&lt;/code&gt; 文件会在 &lt;code&gt;dist&lt;/code&gt; 中。通过此步骤检查打包是否可以正常运行，及时调整，节省后面调整 CI 的时间。&lt;/p&gt;
&lt;p&gt;打包完成后要记得检查 tar 文件里，各种文件是否齐全。设置不当可能一些文件没有打包进来。&lt;/p&gt;
&lt;h2 id="配置-github-action-工作流"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae-github-action-%e5%b7%a5%e4%bd%9c%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;配置 Github Action 工作流
&lt;/h2&gt;&lt;h3 id="创建工作流"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba%e5%b7%a5%e4%bd%9c%e6%b5%81" class="header-anchor"&gt;&lt;/a&gt;创建工作流
&lt;/h3&gt;&lt;p&gt;本地打包没有问题就可以创建 Github Action 工作流。官方文档 &lt;a class="link" href="https://packaging.python.org/en/latest/guides/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/guides/" data-u-e-text="https://packaging.python.org/en/latest/guides/"&gt;https://packaging.python.org/en/latest/guides/&lt;/a&gt;
 里写得挺详细，步骤也很简单，也没有什么 Bug。直接用就可以了。&lt;/p&gt;
&lt;p&gt;例如在 &lt;code&gt;.github/workflows/&lt;/code&gt; 目录下创建 &lt;code&gt;publish.yml&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-5"&gt;&lt;a class="lnlinks" href="#hl-4-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-6"&gt;&lt;a class="lnlinks" href="#hl-4-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-7"&gt;&lt;a class="lnlinks" href="#hl-4-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-8"&gt;&lt;a class="lnlinks" href="#hl-4-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-9"&gt;&lt;a class="lnlinks" href="#hl-4-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-10"&gt;&lt;a class="lnlinks" href="#hl-4-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-11"&gt;&lt;a class="lnlinks" href="#hl-4-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-12"&gt;&lt;a class="lnlinks" href="#hl-4-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-13"&gt;&lt;a class="lnlinks" href="#hl-4-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-14"&gt;&lt;a class="lnlinks" href="#hl-4-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-15"&gt;&lt;a class="lnlinks" href="#hl-4-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-16"&gt;&lt;a class="lnlinks" href="#hl-4-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-17"&gt;&lt;a class="lnlinks" href="#hl-4-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-18"&gt;&lt;a class="lnlinks" href="#hl-4-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-19"&gt;&lt;a class="lnlinks" href="#hl-4-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-20"&gt;&lt;a class="lnlinks" href="#hl-4-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-21"&gt;&lt;a class="lnlinks" href="#hl-4-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-22"&gt;&lt;a class="lnlinks" href="#hl-4-22"&gt;22&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-23"&gt;&lt;a class="lnlinks" href="#hl-4-23"&gt;23&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-24"&gt;&lt;a class="lnlinks" href="#hl-4-24"&gt;24&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-25"&gt;&lt;a class="lnlinks" href="#hl-4-25"&gt;25&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-26"&gt;&lt;a class="lnlinks" href="#hl-4-26"&gt;26&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-27"&gt;&lt;a class="lnlinks" href="#hl-4-27"&gt;27&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-28"&gt;&lt;a class="lnlinks" href="#hl-4-28"&gt;28&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-29"&gt;&lt;a class="lnlinks" href="#hl-4-29"&gt;29&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-30"&gt;&lt;a class="lnlinks" href="#hl-4-30"&gt;30&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-31"&gt;&lt;a class="lnlinks" href="#hl-4-31"&gt;31&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-32"&gt;&lt;a class="lnlinks" href="#hl-4-32"&gt;32&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-33"&gt;&lt;a class="lnlinks" href="#hl-4-33"&gt;33&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-34"&gt;&lt;a class="lnlinks" href="#hl-4-34"&gt;34&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-35"&gt;&lt;a class="lnlinks" href="#hl-4-35"&gt;35&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-36"&gt;&lt;a class="lnlinks" href="#hl-4-36"&gt;36&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-37"&gt;&lt;a class="lnlinks" href="#hl-4-37"&gt;37&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-38"&gt;&lt;a class="lnlinks" href="#hl-4-38"&gt;38&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-39"&gt;&lt;a class="lnlinks" href="#hl-4-39"&gt;39&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-40"&gt;&lt;a class="lnlinks" href="#hl-4-40"&gt;40&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-41"&gt;&lt;a class="lnlinks" href="#hl-4-41"&gt;41&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-42"&gt;&lt;a class="lnlinks" href="#hl-4-42"&gt;42&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-43"&gt;&lt;a class="lnlinks" href="#hl-4-43"&gt;43&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-44"&gt;&lt;a class="lnlinks" href="#hl-4-44"&gt;44&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-45"&gt;&lt;a class="lnlinks" href="#hl-4-45"&gt;45&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-46"&gt;&lt;a class="lnlinks" href="#hl-4-46"&gt;46&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-47"&gt;&lt;a class="lnlinks" href="#hl-4-47"&gt;47&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-48"&gt;&lt;a class="lnlinks" href="#hl-4-48"&gt;48&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-49"&gt;&lt;a class="lnlinks" href="#hl-4-49"&gt;49&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-50"&gt;&lt;a class="lnlinks" href="#hl-4-50"&gt;50&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-51"&gt;&lt;a class="lnlinks" href="#hl-4-51"&gt;51&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-52"&gt;&lt;a class="lnlinks" href="#hl-4-52"&gt;52&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-53"&gt;&lt;a class="lnlinks" href="#hl-4-53"&gt;53&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-54"&gt;&lt;a class="lnlinks" href="#hl-4-54"&gt;54&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-55"&gt;&lt;a class="lnlinks" href="#hl-4-55"&gt;55&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-56"&gt;&lt;a class="lnlinks" href="#hl-4-56"&gt;56&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-57"&gt;&lt;a class="lnlinks" href="#hl-4-57"&gt;57&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-58"&gt;&lt;a class="lnlinks" href="#hl-4-58"&gt;58&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-59"&gt;&lt;a class="lnlinks" href="#hl-4-59"&gt;59&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-60"&gt;&lt;a class="lnlinks" href="#hl-4-60"&gt;60&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-61"&gt;&lt;a class="lnlinks" href="#hl-4-61"&gt;61&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-62"&gt;&lt;a class="lnlinks" href="#hl-4-62"&gt;62&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-63"&gt;&lt;a class="lnlinks" href="#hl-4-63"&gt;63&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-64"&gt;&lt;a class="lnlinks" href="#hl-4-64"&gt;64&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-65"&gt;&lt;a class="lnlinks" href="#hl-4-65"&gt;65&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-66"&gt;&lt;a class="lnlinks" href="#hl-4-66"&gt;66&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-67"&gt;&lt;a class="lnlinks" href="#hl-4-67"&gt;67&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-68"&gt;&lt;a class="lnlinks" href="#hl-4-68"&gt;68&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-69"&gt;&lt;a class="lnlinks" href="#hl-4-69"&gt;69&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-70"&gt;&lt;a class="lnlinks" href="#hl-4-70"&gt;70&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-71"&gt;&lt;a class="lnlinks" href="#hl-4-71"&gt;71&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-72"&gt;&lt;a class="lnlinks" href="#hl-4-72"&gt;72&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-73"&gt;&lt;a class="lnlinks" href="#hl-4-73"&gt;73&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-74"&gt;&lt;a class="lnlinks" href="#hl-4-74"&gt;74&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-75"&gt;&lt;a class="lnlinks" href="#hl-4-75"&gt;75&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-76"&gt;&lt;a class="lnlinks" href="#hl-4-76"&gt;76&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-77"&gt;&lt;a class="lnlinks" href="#hl-4-77"&gt;77&lt;/a&gt;
&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-yml" data-lang="yml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish Python 🐍 distribution 📦 to PyPI&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 手动触发&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 推送 tag 是 v*.*.*时触发&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;push&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;v*.*.*&amp;#34;&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 以下是推送到 main 分支时触发&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# push:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# branches:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# - &amp;#39;main&amp;#39;&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;build&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 打包&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build distribution 📦&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# clone 仓库&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v4&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 设置 Python环境和版本&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Set up Python&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/setup-python@v5&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;python-version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.x&amp;#34;&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 安装 build&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Install pypa/build&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; python3 -m
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; pip install
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; build
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --user&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 打包你的项目&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Build a binary wheel and a source tarball&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;python3 -m build&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 将打包得到的文件上传到 artifact&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Store the distribution packages&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/upload-artifact@v3&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;python-package-distributions&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dist/&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;retention-days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 1 天后删除 artifact&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;publish-to-pypi&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 上传到 PPyPIypi&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;&amp;gt;-&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; Publish Python 🐍 distribution 📦 to PyPI&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;if&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;startsWith(github.ref, &amp;#39;refs/tags/&amp;#39;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 只在推送tag时，才发布到 PyPI&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;needs&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;build&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-latest&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pypi&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;https://pypi.org/p/&amp;lt;package-name&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 将 &amp;lt;package-name&amp;gt; with 改成你自己的项目名字&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;permissions&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;id-token: write # IMPORTANT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mandatory for trusted publishing&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 从 artifact 下载打包的文件&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Download all the dists&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/download-artifact@v3&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;with&lt;/span&gt;&lt;span class="p"&gt;:&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;python-package-distributions&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;dist/&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="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 通过 pypa/gh-action-pypi-publish 这个 action 发布到 PyPI&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="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Publish distribution 📦 to PyPI&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="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pypa/gh-action-pypi-publish@release/v1&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;blockquote&gt;
 &lt;p&gt;官方文档中 &lt;a class="link" href="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/" data-u-e-text="https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/"&gt;https://packaging.python.org/en/latest/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/&lt;/a&gt;
 ，还有发布到 TestPyPI 和发布 Github Release 的工作流。原理相似的，这里不赘述。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="设置-pypi-的可信发布者"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae-pypi-%e7%9a%84%e5%8f%af%e4%bf%a1%e5%8f%91%e5%b8%83%e8%80%85" class="header-anchor"&gt;&lt;/a&gt;设置 PyPI 的可信发布者
&lt;/h3&gt;&lt;p&gt;建立工作流后不要着急推送到仓库。先要到 PyPI 中设置可信发布者。&lt;/p&gt;
&lt;p&gt;设置 PyPI 的项目名、Github 仓库的拥有者、Github 仓库名、工作流的文件名。
Gitub Action 的环境名可以不设置，但强烈建议设置（strongly encouraged）。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://pypi.org/manage/account/publishing/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://pypi.org/manage/account/publishing/" data-u-e-text="https://pypi.org/manage/account/publishing/"&gt;https://pypi.org/manage/account/publishing/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/a734ea2d3dd606d240edbefa81f68f388614cfdee65d9aecdc5ca2e3a4ab93e1.webp" data-u-e-src="https://www.lixx.org/images/a734ea2d3dd606d240edbefa81f68f388614cfdee65d9aecdc5ca2e3a4ab93e1.webp"
	
	
	
	loading="lazy"
	
		alt="pypi_trusted_publisher"
 data-u-e-alt="pypi_trusted_publisher"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;pypi_trusted_publisher&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="推送到-github"&gt;&lt;a href="#%e6%8e%a8%e9%80%81%e5%88%b0-github" class="header-anchor"&gt;&lt;/a&gt;推送到 Github
&lt;/h3&gt;&lt;p&gt;完成上面的步骤就可以将工作流推送到 Github 上。&lt;/p&gt;
&lt;p&gt;根据触发条件触发工作流，测试是否可以正常运行。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/7cfc807f621de9ef3332661add02f314ba3373170ed8d7485f927e99c2fedbb6.webp" data-u-e-src="https://www.lixx.org/images/7cfc807f621de9ef3332661add02f314ba3373170ed8d7485f927e99c2fedbb6.webp"
	
	
	
	loading="lazy"
	
		alt="ci_publish_to_pypi"
 data-u-e-alt="ci_publish_to_pypi"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;ci_publish_to_pypi&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="end"&gt;&lt;a href="#end" class="header-anchor"&gt;&lt;/a&gt;End
&lt;/h2&gt;&lt;p&gt;整个流程下来感觉没什么坑，连 token 都不需要设置。Python 官方的文档教程都很全面和清晰。跟 NPM 比起来，要简便很多。&lt;/p&gt;</description></item><item><title>吉比特 HG51e 光猫开启 telnet、获取超级密码的方法</title><link>https://www.lixx.org/a/8fd0/</link><pubDate>Sun, 14 Apr 2024 12:00:15 +0000</pubDate><guid>https://www.lixx.org/a/8fd0/</guid><description>
 &lt;blockquote&gt;
 &lt;h2 id="参考"&gt;&lt;a href="#%e5%8f%82%e8%80%83" class="header-anchor"&gt;&lt;/a&gt;参考
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.right.com.cn/forum/thread-8378369-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.right.com.cn/forum/thread-8378369-1-1.html" data-u-e-text="https://www.right.com.cn/forum/thread-8378369-1-1.html"&gt;https://www.right.com.cn/forum/thread-8378369-1-1.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;p&gt;中国移动 吉比特 HG51e 光猫开启 telnet、获取超级密码。&lt;/p&gt;
&lt;h2 id="开启-telnet"&gt;&lt;a href="#%e5%bc%80%e5%90%af-telnet" class="header-anchor"&gt;&lt;/a&gt;开启 telnet
&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://192.168.1.1/webcmcc/telnet.html
&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;浏览器访问上面这个网址，即可开启 telnet 。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/0c6a4e3ff801f3a2fe37a6d81d747dc5dba36126ed1c7f5c4308441d00bf64a2.webp" data-u-e-src="https://www.lixx.org/images/0c6a4e3ff801f3a2fe37a6d81d747dc5dba36126ed1c7f5c4308441d00bf64a2.webp"
	
	
	
	loading="lazy"
	
		alt="enable telnet for hg51e"
 data-u-e-alt="enable telnet for hg51e"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;enable telnet for hg51e&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="获取超级密码"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96%e8%b6%85%e7%ba%a7%e5%af%86%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;获取超级密码
&lt;/h2&gt;&lt;h3 id="连接-telnet"&gt;&lt;a href="#%e8%bf%9e%e6%8e%a5-telnet" class="header-anchor"&gt;&lt;/a&gt;连接 telnet
&lt;/h3&gt;&lt;p&gt;使用 telnet 工具连接到光猫，我这里使用 MobaXterm，其他软件也是类似的。&lt;/p&gt;
&lt;p&gt;端口 &lt;code&gt;23&lt;/code&gt;，&lt;/p&gt;
&lt;p&gt;用户名和密码输入光猫背面写的账号密码。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/5285ff58c1756c91ea5fea9cd2549f3b7e42b1408aa9e82aa65e74a484e6b5b6.webp" data-u-e-src="https://www.lixx.org/images/5285ff58c1756c91ea5fea9cd2549f3b7e42b1408aa9e82aa65e74a484e6b5b6.webp"
	
	
	
	loading="lazy"
	
		alt="MobaXterm new session"
 data-u-e-alt="MobaXterm new session"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;MobaXterm new session&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/7bd0aade39fe5eec6362e00db655a2979db8df5de7777c7b57757de5a6ed6fd6.webp" data-u-e-src="https://www.lixx.org/images/7bd0aade39fe5eec6362e00db655a2979db8df5de7777c7b57757de5a6ed6fd6.webp"
	
	
	
	loading="lazy"
	
		alt="login telnet at hg51e"
 data-u-e-alt="login telnet at hg51e"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;login telnet at hg51e&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h3 id="查询超级密码"&gt;&lt;a href="#%e6%9f%a5%e8%af%a2%e8%b6%85%e7%ba%a7%e5%af%86%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;查询超级密码
&lt;/h3&gt;&lt;p&gt;使用 &lt;code&gt;cat&lt;/code&gt; 和 &lt;code&gt;grep&lt;/code&gt; 指令读取这个 &lt;code&gt;lastgood.xml&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;cat /config/work/lastgood.xml &lt;span class="p"&gt;|&lt;/span&gt; grep aucTeleAccountPassword
&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;cat /config/workb/backup_lastgood.xml &lt;span class="p"&gt;|&lt;/span&gt; grep aucTeleAccountPassword
&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;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/d49da5c0c1c03df951216ea28dccefd4320f5cef427f3c8541f7463fbbe92fdd.webp" data-u-e-src="https://www.lixx.org/images/d49da5c0c1c03df951216ea28dccefd4320f5cef427f3c8541f7463fbbe92fdd.webp"
	
	
	
	loading="lazy"
	
		alt="grep aucTeleAccountPassword"
 data-u-e-alt="grep aucTeleAccountPassword"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;grep aucTeleAccountPassword&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/79284910e99a86fc83a66b87debcabfaa4f32bc74a48140bea2d2272253b5e89.webp" data-u-e-src="https://www.lixx.org/images/79284910e99a86fc83a66b87debcabfaa4f32bc74a48140bea2d2272253b5e89.webp"
	
	
	
	loading="lazy"
	
		alt="grep aucTeleAccountPassword"
 data-u-e-alt="grep aucTeleAccountPassword"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;grep aucTeleAccountPassword&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我这里是默认的超级密码，估计是因为我刚刚对光猫进行了恢复出厂设置、还没有下发新密码。在之前，我使用这个方法是可以获取到超级密码的。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>关于部署和使用 AdGuard Home 的一些经验心得体会</title><link>https://www.lixx.org/a/f253/</link><pubDate>Mon, 01 Apr 2024 20:40:42 +0000</pubDate><guid>https://www.lixx.org/a/f253/</guid><description>&lt;h2 id="adguard-home"&gt;&lt;a href="#adguard-home" class="header-anchor"&gt;&lt;/a&gt;AdGuard Home
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/AdguardTeam/AdGuardHome" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/AdguardTeam/AdGuardHome" data-u-e-text="https://github.com/AdguardTeam/AdGuardHome"&gt;https://github.com/AdguardTeam/AdGuardHome&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;简单地说，AdGuard Home 是一个 DNS 服务器软件。官方的描述是，你和你的设备的隐私保护中心，免费、开源、强大的屏蔽广告和跟踪器的 DNS 服务器。&lt;/p&gt;
&lt;p&gt;得益于 AdGuard Home 的易用的图形化界面，即使是一个普通用户，也可以轻松地在自己的电脑或者路由器中部署自己的 DNS 服务器。&lt;/p&gt;
&lt;h2 id="openwrt-使用设置-adguard-home"&gt;&lt;a href="#openwrt-%e4%bd%bf%e7%94%a8%e8%ae%be%e7%bd%ae-adguard-home" class="header-anchor"&gt;&lt;/a&gt;Openwrt 使用、设置 AdGuard Home
&lt;/h2&gt;&lt;p&gt;本文基于在 Openwrt 22 及 23 版本使用 AdGuard Home 的经验写就，不同版本可能略有不同。&lt;/p&gt;
&lt;h3 id="安装"&gt;&lt;a href="#%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;安装
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;opkg&lt;/code&gt; 中有现成的 &lt;code&gt;adguardhome&lt;/code&gt; 包，直接通过 &lt;code&gt;luci&lt;/code&gt; 或者 &lt;code&gt;ssh&lt;/code&gt; 安装即可。安装好后它会自动启动。&lt;/p&gt;
&lt;h3 id="修改-dnsmasq-默认端口"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9-dnsmasq-%e9%bb%98%e8%ae%a4%e7%ab%af%e5%8f%a3" class="header-anchor"&gt;&lt;/a&gt;修改 Dnsmasq 默认端口
&lt;/h3&gt;&lt;p&gt;Openwrt 中默认使用 dnsmasq 作为 DNS 服务器，就会占用 DNS 的 53 端口。要使用 AdGuard Home 就需要做出一些修改，一般有两种方案：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一是继续使用 dnsmasq 使用 &lt;code&gt;53&lt;/code&gt; 端口作为默认 DNS 服务器，AdGuard Home 使用其他端口。通过设置转发或者设置上游的方式将 AdGuard Home 作为 dnsmasq 的上游 DNS 服务器。但这样在 AdGuard Home 无法得知查询 DNS 的客户端，使得部分日志和统计功能变得无意义。&lt;/li&gt;
&lt;li&gt;另外一种就是 AdGuard Home 使用 &lt;code&gt;53&lt;/code&gt; 端口作为默认的 DNS 服务器，dnsmasq 则使用其他端口。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;个人倾向于后者。&lt;/p&gt;
&lt;p&gt;因此需要现在 network - DHCP and DNS 页面的 &lt;code&gt;Devices &amp;amp; Ports&lt;/code&gt; 设置中将 dnsmasq 的 DNS 服务端口（DNS server port）从 &lt;code&gt;53&lt;/code&gt; 修改为其他端口，例如 &lt;code&gt;5353&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="初始化配置"&gt;&lt;a href="#%e5%88%9d%e5%a7%8b%e5%8c%96%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;初始化配置
&lt;/h3&gt;&lt;p&gt;通过 opkg 安装 AdGuard Home 后，已自动将 AdGuard Home 添加为启动项并启动。浏览器打开 &lt;code&gt;http://&amp;lt;路由器地址&amp;gt;:3000&lt;/code&gt; 即可进入 AdGuard Home 的初始配置界面。根据提示设定 AdGuard Home 网页服务的账号和密码、AdGuard Home 网页服务绑定的接口和端口、DNS 服务器绑定的接口和端口。&lt;/p&gt;
&lt;p&gt;页面还有清晰的指引，告知用户如何在不同的终端设备上 设定 DNS 查询使用 AdGuard Home。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;出于安全考虑，应避免将网页服务、和 DNS 服务暴露在公网中。&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;出于安全考虑，应使用具有一定强度的密码。&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果希望通过 IPv6 使用 AdGuard Home，不要为 DNS 服务器绑定 IPv4 地址。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;完成初始化配置后，AdGuard Home 会重启。&lt;/p&gt;
&lt;h3 id="具体设置"&gt;&lt;a href="#%e5%85%b7%e4%bd%93%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;具体设置
&lt;/h3&gt;&lt;p&gt;完成初始化配置后，通过设定的网页地址和端口进入 AdGuard Home 控制面板。可以为 AdGuard Home 配置更多具体的设置，笔者不作详细介绍，只分享一些个人经验。&lt;/p&gt;
&lt;h4 id="常规设置general-setting"&gt;&lt;a href="#%e5%b8%b8%e8%a7%84%e8%ae%be%e7%bd%aegeneral-setting" class="header-anchor"&gt;&lt;/a&gt;常规设置（General setting）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;AdGuard 浏览安全、家长控制等功能由于国内众所周知原因无法启用，启用后可能无法上网。&lt;/li&gt;
&lt;li&gt;日志保留时间以及统计数据保留时间不要设置太长，尤其是低配置的设备，容易崩。例如日志我只保留 1 小时，统计保留 24 小时。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="加密设置encryption-settings"&gt;&lt;a href="#%e5%8a%a0%e5%af%86%e8%ae%be%e7%bd%aeencryption-settings" class="header-anchor"&gt;&lt;/a&gt;加密设置（Encryption settings）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;对于内网使用，一般不必设置加密。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="dhcp-设置dhcp-settings"&gt;&lt;a href="#dhcp-%e8%ae%be%e7%bd%aedhcp-settings" class="header-anchor"&gt;&lt;/a&gt;DHCP 设置（DHCP settings）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;个人并不是十分信任 AdGuard Home 的可靠性，因此不建议启用 AdGuard Home 的 DHCP 服务器。避免因为 AdGuard Home 崩溃，导致 DHCP 也无法使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="dns-设置dns-settings"&gt;&lt;a href="#dns-%e8%ae%be%e7%bd%aedns-settings" class="header-anchor"&gt;&lt;/a&gt;DNS 设置（DNS settings）
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;知名的公共 DNS 服务器信息可从 &lt;a class="link" href="https://adguard-dns.io/kb/general/dns-providers/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://adguard-dns.io/kb/general/dns-providers/" data-u-e-text="Known DNS Providers"&gt;Known DNS Providers&lt;/a&gt;
 页面获取。&lt;/li&gt;
&lt;li&gt;上游 DNS、后备 DNS、Bootstrap DNS 均建议使用 DOT、DOH、DOQ 等协议，避免 DNS 被劫持。&lt;/li&gt;
&lt;li&gt;如果上游 DNS 使用域名形式且对应 IP 地址不经常变动，建议写进 host，节约从 Bootstrap DNS 服务器解析上游 DNS 服务器域名的时间。也能避免上游 DNS 的域名被污染（这里指的上游 DNS 的域名的解析结果被 Bootstrap 污染，与上游 DNS 提供的 DNS 是否被污染无关）。&lt;/li&gt;
&lt;li&gt;设置私人反向 DNS：由于没有使用 AdGuard Home 的 DHCP 服务，AdGuard Home 无法解析私人反向 DNS（即将局域网地址反向解析为对应主机名，例如将 &lt;code&gt;192.168.1.1&lt;/code&gt; 反向解析为 &lt;code&gt;openwrt&lt;/code&gt;）。通过将 dnsmasq 的 DNS 地址（例如前文提到的 &lt;code&gt;127.0.0.1:5353&lt;/code&gt; 或 &lt;code&gt;[::1]:5353&lt;/code&gt;）作为私人反向 DNS 即可解决此问题。&lt;/li&gt;
&lt;li&gt;本地主机查询：与上一项类似， AdGuard Home 可能无法解析本地域，可以添加例如 &lt;code&gt;[/*.lan/]127.0.0.1:5353&lt;/code&gt; 到上游服务器中，以将本地域查询转发至 dnsmasq。&lt;/li&gt;
&lt;li&gt;DNS 策略：如果选择使用最快的 IP 地址（Fastest IP Address）策略，建议使用少且快的上游 DNS 服务器，否则会起反效果。&lt;/li&gt;
&lt;li&gt;默认客户端速度限制较低，如有需要可以适当提高。&lt;/li&gt;
&lt;li&gt;开启 EDNS 客户端子网（ECS）理论上可以从支持 ECS 的上游 DNS 服务器获取到更合适的 IP 地址。&lt;/li&gt;
&lt;li&gt;DNSSEC 对保护 DNS 有一些帮助，聊胜于无，建议开启。&lt;/li&gt;
&lt;li&gt;过滤器封禁模式（Blocking mode）： 决定以什么形式响应被过滤器过滤的主机名。一些应用，例如浏览器，当访问的主机名被封禁，例如如果 DNS 返回的形式是 &lt;code&gt;0.0.0.0&lt;/code&gt;，一些应用可能不会及时中断连接，从而导致使用体验不佳。（未经严格验证，仅个人感觉。）&lt;/li&gt;
&lt;li&gt;缓存大小可以根据设备的性能和个人喜好适当调整。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="过滤器设置"&gt;&lt;a href="#%e8%bf%87%e6%bb%a4%e5%99%a8%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;过滤器设置
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;类似于 host 封禁，可添加主流的广告屏蔽器列表达到屏蔽广告、跟踪器的效果，相当于一个前置过滤，无需终端设备的支持。&lt;/li&gt;
&lt;li&gt;同样地，应该根据设备的性能添加适当的过滤器，不宜过多。&lt;/li&gt;
&lt;li&gt;这种基于主机名的广告屏蔽器在实践中的效果聊胜于无，它更适合用于屏蔽跟踪器、恶意网站等等。如果需要更好的广告屏蔽效果，依然建议使用专门的广告过滤软件/插件。&lt;/li&gt;
&lt;li&gt;在路由器上添加推荐的过滤器可能会遇到众所周知的网络问题，可以尝试使用镜像服务。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="通过-dhcp-通报默认-dns-地址"&gt;&lt;a href="#%e9%80%9a%e8%bf%87-dhcp-%e9%80%9a%e6%8a%a5%e9%bb%98%e8%ae%a4-dns-%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;通过 DHCP 通报默认 DNS 地址
&lt;/h2&gt;&lt;p&gt;经过上述的设置，一个基于 AdGuard Home 的个人 DNS 服务器已经部署完成，但仍需要在各个设备上修改 DNS 地址。通过修改 DHCP 选项，可以让连接到路由器的设备默认使用指定的 DNS 服务器。&lt;/p&gt;
&lt;p&gt;打开 network - interfaces 页面，编辑 &lt;code&gt;lan&lt;/code&gt; 接口，转到 DHCP Server 选项卡，转到高级设定，可以看到有一项 DHCP 选项（DHCP-Options），底下的说明就介绍了如何设定向 DHCP 客户端通报的 DNS 地址，我们甚至不需要去查询 DHCP 的文档。&lt;/p&gt;
&lt;p&gt;例如，在 DHCP 选项（DHCP-Options）中新增一项 “&lt;code&gt;6,192.168.2.1&lt;/code&gt;”，意为向 DHCP 客户端通报 应使用 &lt;code&gt;192.168.2.1&lt;/code&gt; 作为 DNS 查询服务器。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;建议设置两个地址，一个为 AdGuard Home 的地址，另一个则为公共 DNS 或者运营商的 DNS，避免因 AdGuard Home 崩溃造成无法访问网络。例如 “&lt;code&gt;6,192.168.2.1,1.0.0.1&lt;/code&gt;”&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="设置-openwrt-使用的-dns"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae-openwrt-%e4%bd%bf%e7%94%a8%e7%9a%84-dns" class="header-anchor"&gt;&lt;/a&gt;设置 Openwrt 使用的 DNS
&lt;/h2&gt;&lt;p&gt;安装 AdGuard Home 一段时间后查看 AdGuard Home 的日志，发现有很多来自 &lt;code&gt;localhost&lt;/code&gt; 的本地域查询、PTR 查询。一来不开启 DHCP 的 AdGuard Home 本身无法处理这些查询，而需要让 dnsmasq 处理。二来这样的意义不大的查询多了之后，会影响查看日志的观感和数据统计功能。&lt;/p&gt;
&lt;p&gt;因此我建议将 openwrt 所使用的 DNS 修改为 dnsmasq，这样本地查询就不会出现在 AdGuard Home 的日志中。方法步骤如下：&lt;/p&gt;
&lt;h3 id="让-dnsmasq-忽略上级网关通报的-dns"&gt;&lt;a href="#%e8%ae%a9-dnsmasq-%e5%bf%bd%e7%95%a5%e4%b8%8a%e7%ba%a7%e7%bd%91%e5%85%b3%e9%80%9a%e6%8a%a5%e7%9a%84-dns" class="header-anchor"&gt;&lt;/a&gt;让 dnsmasq 忽略上级网关通报的 DNS
&lt;/h3&gt;&lt;p&gt;在 network - DHCP and DNS 页面的 &lt;code&gt;Resolv &amp;amp; Hosts Files&lt;/code&gt; 选项卡中，勾选忽略 resolv 文件 (Ignore resolv file)。这个文件是上级网关通报的默认 DNS，一般为运营商的 DNS。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果不这样做，dnsmasq 将会把这些运营商 DNS 作为上游进行 DNS 查询。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="将-dnsmasq-的上游设置-adguard-home"&gt;&lt;a href="#%e5%b0%86-dnsmasq-%e7%9a%84%e4%b8%8a%e6%b8%b8%e8%ae%be%e7%bd%ae-adguard-home" class="header-anchor"&gt;&lt;/a&gt;将 dnsmasq 的上游设置 AdGuard Home
&lt;/h3&gt;&lt;p&gt;在 network - DHCP and DNS 页面的 &lt;code&gt;Forwards&lt;/code&gt; 选项卡中，将 DNS 转发（DNS Forwards）设定为 AdGuard Home 的地址，例如 &lt;code&gt;127.0.0.1&lt;/code&gt; 或 &lt;code&gt;::1&lt;/code&gt; 或 &lt;code&gt;localhost&lt;/code&gt;。意为将其作为 dnsmasq 的上游 DNS。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果不这样做，openwrt 本身将无法访问互联网主机。因为在上一步中已经将默认的 DNS 上游取消了。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="将-opnewrt-的-dns-设置为-dnsmasq"&gt;&lt;a href="#%e5%b0%86-opnewrt-%e7%9a%84-dns-%e8%ae%be%e7%bd%ae%e4%b8%ba-dnsmasq" class="header-anchor"&gt;&lt;/a&gt;将 Opnewrt 的 DNS 设置为 dnsmasq
&lt;/h3&gt;&lt;p&gt;openwrt 自身的 DNS 设定存储于 &lt;code&gt;/etc/resolv.conf&lt;/code&gt;，如果它是一个链接，则将它删除重建。默认情况下，openwrt 使用&lt;code&gt;127.0.0.1:53&lt;/code&gt;用作 DNS 查询，在前文中 &lt;code&gt;53&lt;/code&gt; 端口已用作 AdGuard Home 的 DNS 监听端口， &lt;code&gt;5353&lt;/code&gt;端口才是 dnsmasq 的监听端口。
将 &lt;code&gt;/etc/resolv.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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt;5&lt;/a&gt;
&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-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; search lan
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- nameserver 127.0.0.1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ nameserver 127.0.0.1:5353
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- nameserver ::1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ nameserver [::1]:5353
&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;</description></item><item><title>桥接模式下让 openwrt 可以访问光猫和互联网</title><link>https://www.lixx.org/a/8584/</link><pubDate>Thu, 21 Mar 2024 15:12:51 +0000</pubDate><guid>https://www.lixx.org/a/8584/</guid><description>&lt;p&gt;在光猫拨号的情况下，openwrt 可以上网，也可以直接访问光猫的管理页面，也可以直接访问光猫下面连接的其他设备。
但在光猫桥接模式下，openwrt 进行拨号，则无法直接访问光猫的管理页面。这时如果需要设置光猫就比较麻烦，需要连接光猫的 wifi 或者网线连接到光猫进行配置。&lt;/p&gt;
&lt;p&gt;通过在 openwrt 进行一些设置，则可以通过 openwrt 直接访问光猫的管理页面。&lt;/p&gt;
&lt;h2 id="一般前提"&gt;&lt;a href="#%e4%b8%80%e8%88%ac%e5%89%8d%e6%8f%90" class="header-anchor"&gt;&lt;/a&gt;一般前提
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文基于 openwrt 23.05 进行设置。不同版本的界面可能有所不同，但原理是相同的。&lt;/li&gt;
&lt;li&gt;本文假设光猫和 openwrt 使用不同的网段（例如光猫的网段为 &lt;code&gt;192.168.1.*&lt;/code&gt;，openwrt 的网段为 &lt;code&gt;192.168.2.*&lt;/code&gt;），方便进行设置。&lt;/li&gt;
&lt;li&gt;本位假设你已在 openwrt 中完成 pppoe 拨号上网的设置。&lt;/li&gt;
&lt;li&gt;假设 &lt;code&gt;wan&lt;/code&gt; 口的设备（device）名为 &lt;code&gt;wan&lt;/code&gt;，接口（interface）名为 &lt;code&gt;wan&lt;/code&gt; 及 &lt;code&gt;wan6&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="步骤-1-设备选择"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4-1-%e8%ae%be%e5%a4%87%e9%80%89%e6%8b%a9" class="header-anchor"&gt;&lt;/a&gt;步骤 1. 设备选择
&lt;/h2&gt;&lt;p&gt;笔者尝试使用 4 种方法配置 openwrt 让其可以同时访问光猫和互联网。经测试 4 种方法均可以正常使用。4 种方法的主要区别在于接口设置中的设备选择上，其他的步骤大同小异。&lt;/p&gt;
&lt;h3 id="方案-1---使用-wan-设备"&gt;&lt;a href="#%e6%96%b9%e6%a1%88-1---%e4%bd%bf%e7%94%a8-wan-%e8%ae%be%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;方案 1 - 使用 &lt;code&gt;wan&lt;/code&gt; 设备
&lt;/h3&gt;&lt;p&gt;直接使用 &lt;code&gt;wan&lt;/code&gt; 设备最简单，无需新增设备。&lt;/p&gt;
&lt;p&gt;缺点是在 网络 - 接口 页面中，&lt;code&gt;wan&lt;/code&gt; 接口 和 &lt;code&gt;to_modem&lt;/code&gt; 接口显示的使用流量相同，不便于查看，并不影响使用。而后面 3 种方案均没有这个问题。&lt;/p&gt;
&lt;p&gt;在步骤 2 中新建接口时，设备（device）直接选择 &lt;code&gt;wan&lt;/code&gt; 设备即可。&lt;/p&gt;
&lt;h3 id="方案-2---macvlan--macvlan"&gt;&lt;a href="#%e6%96%b9%e6%a1%88-2---macvlan--macvlan" class="header-anchor"&gt;&lt;/a&gt;方案 2 - &lt;code&gt;macvlan&lt;/code&gt; + &lt;code&gt;macvlan&lt;/code&gt;
&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;首先需要安装 &lt;code&gt;macvlan&lt;/code&gt; 软件包。&lt;/li&gt;
&lt;li&gt;在 network - devices 页面中新增 2 个 MAC VLAN 设备，基础设备（base device）选择 &lt;code&gt;wan&lt;/code&gt; 设备。名字可以自定，默认是 &lt;code&gt;wanmac0&lt;/code&gt; 和 &lt;code&gt;wanmac1&lt;/code&gt;。mac 地址可以留空（每次启动时会自动生成），或自行指定 2 个不同的 mac 地址。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;2 个 MAC VLAN 设备，一个用于 pppoe 拨号上网，另一个用于连接光猫。&lt;/p&gt;
&lt;p&gt;注意：在接口设置中，要将接口 &lt;code&gt;wan&lt;/code&gt; 和 &lt;code&gt;wan6&lt;/code&gt; 的设备（device）设置为其中一个 MAC VLAN 设备，例如 &lt;code&gt;wanmac1&lt;/code&gt; 设备。&lt;/p&gt;
&lt;p&gt;在步骤 2 中新建接口时，将设备（device）设置另一个 MAC VLAN 设备，例如 &lt;code&gt;wanmac0&lt;/code&gt; 设备。&lt;/p&gt;
&lt;h3 id="方案-3---vlan--macvlan"&gt;&lt;a href="#%e6%96%b9%e6%a1%88-3---vlan--macvlan" class="header-anchor"&gt;&lt;/a&gt;方案 3 - &lt;code&gt;vlan&lt;/code&gt; + &lt;code&gt;macvlan&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;适合光猫启用了 &lt;code&gt;vlan&lt;/code&gt; 绑定的情况，例如单线复用。本文假定你已完成了 &lt;code&gt;vlan&lt;/code&gt; 的相关设置，故 &lt;code&gt;vlan&lt;/code&gt; 的设置本文不赘述。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;首先需要安装 &lt;code&gt;macvlan&lt;/code&gt; 软件包。&lt;/li&gt;
&lt;li&gt;与方案 2 类似，在 network - devices 页面新增 1 个 MAC VLAN 设备。基础设备（base device）选择 &lt;code&gt;wan&lt;/code&gt;。名字可以自定，默认是 &lt;code&gt;wanmac0&lt;/code&gt;。mac 地址可以留空（每次启动时启动生成），或自行指定 1 个 mac 地址。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;vlan 设备用于 pppoe 拨号上网，MAC VLAN 设备则用于连接光猫。&lt;/p&gt;
&lt;p&gt;在步骤 2 中新建接口时，设备（device）选择这个 MAC VLAN 设备，例如 &lt;code&gt;wanmac0&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="方案-4---双线接入"&gt;&lt;a href="#%e6%96%b9%e6%a1%88-4---%e5%8f%8c%e7%ba%bf%e6%8e%a5%e5%85%a5" class="header-anchor"&gt;&lt;/a&gt;方案 4 - 双线接入
&lt;/h3&gt;&lt;p&gt;如果有富余的网线和端口，则可以考虑采用双线接入的方式，例如 openwrt 的 &lt;code&gt;wan&lt;/code&gt; 口连接光猫的 &lt;code&gt;lan1&lt;/code&gt; 口，用于拨号上网。openwrt 的 &lt;code&gt;lan1&lt;/code&gt; 口连接光猫的 &lt;code&gt;lan2&lt;/code&gt; 口（也可以是其他端口，自行设置），用于访问光猫网络。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在光猫管理界面的宽带设置中，将 &lt;code&gt;lan2&lt;/code&gt; 解绑（也可以是其他端口，自行设置）。&lt;/li&gt;
&lt;li&gt;在 openwrt 的 network - devices 页面将 &lt;code&gt;br-lan&lt;/code&gt; 设备的桥接端口中，取消 openwrt 的 &lt;code&gt;lan1&lt;/code&gt; 口（也可以是其他端口，自行设置）。&lt;/li&gt;
&lt;li&gt;用网线连接 openwrt 的 &lt;code&gt;lan1&lt;/code&gt; 口和光猫的 &lt;code&gt;lan2&lt;/code&gt; 口。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在步骤 2 中新建接口时，设备（device）选择这个 &lt;code&gt;lan1&lt;/code&gt; 口。&lt;/p&gt;
&lt;h2 id="步骤-2-接口设置"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4-2-%e6%8e%a5%e5%8f%a3%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;步骤 2. 接口设置
&lt;/h2&gt;&lt;h3 id="新建接口和设备选择"&gt;&lt;a href="#%e6%96%b0%e5%bb%ba%e6%8e%a5%e5%8f%a3%e5%92%8c%e8%ae%be%e5%a4%87%e9%80%89%e6%8b%a9" class="header-anchor"&gt;&lt;/a&gt;新建接口和设备选择
&lt;/h3&gt;&lt;p&gt;在 network - interfaces 页面中 新增一个新的 interface （接口）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;名字（name）随意，例如：&lt;code&gt;to_modem&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;协议（protocol）选择“静态地址”。&lt;/li&gt;
&lt;li&gt;设备（device）根据&lt;strong&gt;步骤 1&lt;/strong&gt; 选择相应的设备。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="接口设置"&gt;&lt;a href="#%e6%8e%a5%e5%8f%a3%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;接口设置
&lt;/h3&gt;&lt;p&gt;在基本设置中，填入 ipv4 地址、掩码、网关。这里说的 ip 地址、掩码、网关是 openwrt 相对光猫而言的，例如光猫的网段是 &lt;code&gt;192.168.1.*&lt;/code&gt; ，那么地址应该 &lt;code&gt;192.168.1.114514&lt;/code&gt; (自行设定)。网关是光猫的地址，一般是 &lt;code&gt;192.168.1.1&lt;/code&gt; ，掩码一般为 &lt;code&gt;/24&lt;/code&gt; 即 &lt;code&gt;255.255.255.0&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;高级设置中，取消勾选使用默认网关（Use default gateway）。DNS 权重（DNS weight）和网关跃点（Use gateway metric）设置一个比 &lt;code&gt;lan&lt;/code&gt; 接口的跃点大但比 &lt;code&gt;wan&lt;/code&gt; 接口的跃点小的数字，例如 &lt;code&gt;lan&lt;/code&gt; 的跃点设置 &lt;code&gt;0&lt;/code&gt;，&lt;code&gt;to_modem&lt;/code&gt; 接口的跃点设置 &lt;code&gt;5&lt;/code&gt;，&lt;code&gt;wan&lt;/code&gt; 接口的跃点设置 &lt;code&gt;10&lt;/code&gt;.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;跃点或网关设置不当，则可能会导致无法访问互联网。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;防火墙设置中，可以选择 &lt;code&gt;lan&lt;/code&gt; 区域或者 &lt;code&gt;wan&lt;/code&gt; 区域。建议新建一个区域，例如 &lt;code&gt;modem_zone&lt;/code&gt; 。&lt;/p&gt;
&lt;h3 id="步骤-3-防火墙设置"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4-3-%e9%98%b2%e7%81%ab%e5%a2%99%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;步骤 3. 防火墙设置
&lt;/h3&gt;&lt;p&gt;打开 network - firewall 页面，
编辑 &lt;code&gt;modem_zone&lt;/code&gt; 区域设置：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;覆盖网络（Covered networks）：选择前面建立的 &lt;code&gt;to_modem&lt;/code&gt; 接口。&lt;/li&gt;
&lt;li&gt;允许从源区域转发（Allow forward from source zones）：选择 &lt;code&gt;lan&lt;/code&gt; 区域。&lt;/li&gt;
&lt;li&gt;开启 伪装（Masquerading）。（建议开启。不开也行，但需要在光猫中设置路由）&lt;/li&gt;
&lt;li&gt;开启 MSS 钳制（MSS clamping）。&lt;/li&gt;
&lt;li&gt;入站（input）：根据自己的需求设置。建议拒绝或者丢弃，表示不允许光猫及光猫下的设备访问 openwrt。&lt;/li&gt;
&lt;li&gt;出站（output）：根据自己的需求设置。表示是否允许 openwrt 访问光猫及光猫下的设备。设置接受。&lt;/li&gt;
&lt;li&gt;转发（forward）：根据自己的需求设置。表示是否允许源区域设备访问光猫区域。可以接受。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="步骤-4-静态路由设置"&gt;&lt;a href="#%e6%ad%a5%e9%aa%a4-4-%e9%9d%99%e6%80%81%e8%b7%af%e7%94%b1%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;步骤 4. 静态路由设置
&lt;/h3&gt;&lt;p&gt;转到 network - routing 页面，点击添加静态路由：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;接口（inteface）：选择前面的新建的 &lt;code&gt;to_modem&lt;/code&gt; 接口。&lt;/li&gt;
&lt;li&gt;目标网络（target）：填写光猫的网段及掩码，例如 &lt;code&gt;192.168.1.0/24&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;网关（gateway）：填写 光猫网关的 ip 地址，一般为 &lt;code&gt;192.168.1.1&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;跃点（Metric）：填写一个比 &lt;code&gt;lan&lt;/code&gt; 接口的跃点大但比 &lt;code&gt;wan&lt;/code&gt; 接口的跃点小的数字，例如笔者将静态路由的跃点设置为 &lt;code&gt;5&lt;/code&gt;， &lt;code&gt;lan&lt;/code&gt; 接口的跃点设置为 &lt;code&gt;0&lt;/code&gt;，&lt;code&gt;wan&lt;/code&gt; 接口的跃点设置 &lt;code&gt;10&lt;/code&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="end"&gt;&lt;a href="#end" class="header-anchor"&gt;&lt;/a&gt;End
&lt;/h2&gt;&lt;p&gt;完成设置后，openwrt 路由器下的设备就可以直接访问光猫的管理页面了。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ping 光猫地址可以 ping 通：&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;
&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="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ping&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&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;正在&lt;/span&gt; &lt;span class="n"&gt;Ping&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;具有&lt;/span&gt; &lt;span class="mf"&gt;32&lt;/span&gt; &lt;span class="n"&gt;字节的数据&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;来自&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;的回复&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;字节&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;32&lt;/span&gt; &lt;span class="n"&gt;时间&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;1ms&lt;/span&gt; &lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;63&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;来自&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;的回复&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;字节&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;32&lt;/span&gt; &lt;span class="n"&gt;时间&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;1ms&lt;/span&gt; &lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;63&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;来自&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;的回复&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;字节&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;32&lt;/span&gt; &lt;span class="n"&gt;时间&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;1ms&lt;/span&gt; &lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;63&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;来自&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;的回复&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;字节&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;32&lt;/span&gt; &lt;span class="n"&gt;时间&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="n"&gt;3ms&lt;/span&gt; &lt;span class="n"&gt;TTL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;63&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="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt; &lt;span class="n"&gt;的&lt;/span&gt; &lt;span class="n"&gt;Ping&lt;/span&gt; &lt;span class="n"&gt;统计信息&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;数据包&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;已发送&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;已接收&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;丢失&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;%&lt;/span&gt; &lt;span class="n"&gt;丢失&lt;/span&gt;&lt;span class="p"&gt;)&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;往返行程的估计时间&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;以毫秒为单位&lt;/span&gt;&lt;span class="p"&gt;)&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;最短&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;1ms&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;最长&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;3ms&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;平均&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;1ms&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;/li&gt;
&lt;li&gt;
&lt;p&gt;在 window 下，可以通过 tracert 指令可以查看路由情况：&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-4"&gt;&lt;a class="lnlinks" href="#hl-1-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-5"&gt;&lt;a class="lnlinks" href="#hl-1-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-6"&gt;&lt;a class="lnlinks" href="#hl-1-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-7"&gt;&lt;a class="lnlinks" href="#hl-1-7"&gt;7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-8"&gt;&lt;a class="lnlinks" href="#hl-1-8"&gt;8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-9"&gt;&lt;a class="lnlinks" href="#hl-1-9"&gt;9&lt;/a&gt;
&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="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tracert&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&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;通过最多&lt;/span&gt; &lt;span class="mf"&gt;30&lt;/span&gt; &lt;span class="n"&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;到&lt;/span&gt; &lt;span class="n"&gt;cmcc&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;的路由&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="n"&gt;openwrt&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&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="mf"&gt;2&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="mf"&gt;1&lt;/span&gt; &lt;span class="n"&gt;ms&lt;/span&gt; &lt;span class="n"&gt;cmcc&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;跟踪完成&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;/li&gt;
&lt;/ul&gt;</description></item><item><title>openwrt 宽带拨号频繁掉线重连: No response to 5 echo-requests</title><link>https://www.lixx.org/a/433b/</link><pubDate>Fri, 15 Mar 2024 11:08:37 +0000</pubDate><guid>https://www.lixx.org/a/433b/</guid><description>&lt;p&gt;近日升级了 openwrt 的版本 23.05.4 并重新设置，发现宽带 pppoe 拨号频繁地断线重连，发生时间从几十秒到几分钟不等，已经影响到网络的正常使用，一些物联网设备也因此出错重启。&lt;/p&gt;
&lt;p&gt;查看 openwrt 的日志发现，可能与 pppd 的这句 &lt;code&gt;No response to 5 echo-requests&lt;/code&gt; 有关。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;09:30:25 2024 daemon.info pppd[18184]: No response to 5 echo-requests
09:30:25 2024 daemon.notice pppd[18184]: Serial link appears to be disconnected.
09:30:25 2024 daemon.info pppd[18184]: Connect time 10.8 minutes.
09:30:25 2024 daemon.info pppd[18184]: Sent 598878 bytes, received 128821 bytes.
09:30:25 2024 daemon.notice ttyd[3380]: [ 09:30:25:3453] N: rops_handle_POLLIN_netlink: DELADDR
09:30:25 2024 daemon.notice ttyd[3380]: [ 09:30:25:3529] N: rops_handle_POLLIN_netlink: DELADDR
09:30:25 2024 daemon.err odhcp6c[18588]: Failed to send RS (Network unreachable)
09:30:25 2024 daemon.err odhcp6c[18588]: Failed to send RELEASE message to ff02::1:2 (Network unreachable)
09:30:25 2024 daemon.notice ttyd[3380]: [ 09:30:25:3619] N: rops_handle_POLLIN_netlink: DELADDR
09:30:25 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; is disabled
09:30:25 2024 daemon.notice netifd: Network device &amp;#39;pppoe-wan&amp;#39; link is down
09:30:25 2024 daemon.notice netifd: Network alias &amp;#39;pppoe-wan&amp;#39; link is down
09:30:25 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; has link connectivity loss
09:30:25 2024 daemon.notice netifd: Interface &amp;#39;wan&amp;#39; has lost the connection
09:30:25 2024 daemon.notice netifd: wan6 (18588): Command failed: ubus call network.interface notify_proto { &amp;#34;action&amp;#34;: 0, &amp;#34;link-up&amp;#34;: false, &amp;#34;keep&amp;#34;: false, &amp;#34;interface&amp;#34;: &amp;#34;wan6&amp;#34; } (Permission denied)
09:30:26 2024 user.notice mwan3-hotplug[23451]: mwan3 hotplug on wan6 not called because interface disabled
09:30:26 2024 daemon.err odhcp6c[18588]: Failed to send SOLICIT message to ff02::1:2 (Network unreachable)
09:30:26 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; is now down
09:30:27 2024 user.notice mwan3-hotplug[24159]: mwan3 hotplug on wan not called because interface disabled
09:30:31 2024 daemon.notice pppd[18184]: Connection terminated.
09:30:31 2024 daemon.info pppd[18184]: Connect time 10.8 minutes.
09:30:31 2024 daemon.info pppd[18184]: Sent 598878 bytes, received 128821 bytes.
09:30:31 2024 daemon.notice pppd[18184]: Modem hangup
09:30:31 2024 daemon.info pppd[18184]: Exit.
09:30:31 2024 daemon.notice netifd: Interface &amp;#39;wan&amp;#39; is now down
09:30:31 2024 daemon.notice netifd: Interface &amp;#39;wan&amp;#39; is setting up now
09:30:31 2024 daemon.info pppd[24717]: Plugin pppoe.so loaded.
09:30:31 2024 daemon.info pppd[24717]: PPPoE plugin from pppd 2.4.9
09:30:31 2024 daemon.notice pppd[24717]: pppd 2.4.9 started by root, uid 0
09:30:37 2024 daemon.info pppd[24717]: PPP session is 46903
09:30:37 2024 daemon.warn pppd[24717]: Connected to CC:**:**:**:**:00 via interface wan.41
09:30:37 2024 kern.info kernel: [22535.653978] pppoe-wan: renamed from ppp0
09:30:37 2024 daemon.info pppd[24717]: Renamed interface ppp0 to pppoe-wan
09:30:37 2024 daemon.info pppd[24717]: Using interface pppoe-wan
09:30:37 2024 daemon.notice pppd[24717]: Connect: pppoe-wan &amp;lt;--&amp;gt; wan.41
09:30:37 2024 daemon.info pppd[24717]: CHAP authentication succeeded: Authentication Successful,Welcome!
09:30:37 2024 daemon.notice pppd[24717]: CHAP authentication succeeded
09:30:37 2024 daemon.notice pppd[24717]: peer from calling number CC:**:**:**:**:00 authorized
09:30:37 2024 daemon.notice pppd[24717]: local LL address fe80::****:f63a
09:30:37 2024 daemon.notice pppd[24717]: remote LL address fe80::****:3100
09:30:37 2024 daemon.notice ttyd[3380]: [ 09:30:37:5595] N: rops_handle_POLLIN_netlink: DELADDR
09:30:37 2024 daemon.notice pppd[24717]: local IP address 172.**.**.**
09:30:37 2024 daemon.notice pppd[24717]: remote IP address 172.**.**.**
09:30:37 2024 daemon.notice pppd[24717]: primary DNS address 211.**.**.**
09:30:37 2024 daemon.notice pppd[24717]: secondary DNS address 120.**.**.**
09:30:37 2024 daemon.notice netifd: Network device &amp;#39;pppoe-wan&amp;#39; link is up
09:30:37 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; is enabled
09:30:37 2024 daemon.notice netifd: Network alias &amp;#39;pppoe-wan&amp;#39; link is up
09:30:37 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; has link connectivity
09:30:37 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; is setting up now
09:30:37 2024 daemon.notice netifd: Interface &amp;#39;wan&amp;#39; is now up
09:30:38 2024 user.notice mwan3-hotplug[25420]: mwan3 hotplug on wan not called because interface disabled
09:30:39 2024 user.notice firewall: Reloading firewall due to ifup of wan (pppoe-wan)
09:30:41 2024 daemon.notice netifd: Interface &amp;#39;wan6&amp;#39; is now up
09:30:42 2024 user.notice mwan3-hotplug[26292]: mwan3 hotplug on wan6 not called because interface disabled
09:30:42 2024 user.notice firewall: Reloading firewall due to ifup of wan6 (pppoe-wan)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;找到 wan 接口高级设置中有两个可能相关的选项 &lt;code&gt;LCP echo failure threshold&lt;/code&gt; , &lt;code&gt;LCP echo interval&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;结合页面上的描述和网络资料，这个功能会向上级设备发送所谓 &lt;code&gt;LCP echo request&lt;/code&gt; ，上级设备回应则视为正常，上级设备不回应则视为失败，失败次数达到设定的阈值时则触发重连。&lt;/p&gt;
&lt;p&gt;例如这篇文章 &lt;a class="link" href="https://www.chiphell.com/thread-1352411-1-1.html" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.chiphell.com/thread-1352411-1-1.html" data-u-e-text="https://www.chiphell.com/thread-1352411-1-1.html"&gt;https://www.chiphell.com/thread-1352411-1-1.html&lt;/a&gt;
 就提到华硕路由器默认开启这个功能，但国内某些运营商不会对 &lt;code&gt;LCP echo request&lt;/code&gt; 进行回应导致路由器掉线重拨。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/d08a02c036d9f963a96e08596076b3be0399a638781a261b9cae74e61af74bf3.webp" data-u-e-src="https://www.lixx.org/images/d08a02c036d9f963a96e08596076b3be0399a638781a261b9cae74e61af74bf3.webp"
	
	
	
	loading="lazy"
	
		alt="advance setting of wan interface"
 data-u-e-alt="advance setting of wan interface"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;advance setting of wan interface&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;但在 openwrt 中 &lt;code&gt;LCP echo failure threshold&lt;/code&gt; 的默认值为 0，根据页面上的描述，即忽略错误、不开启这个功能。我在配置路由器时也没有修改此项，按理说不应该会出现这个问题。&lt;/p&gt;
&lt;p&gt;当我将 &lt;code&gt;LCP echo failure threshold&lt;/code&gt; 修改为 &lt;code&gt;0&lt;/code&gt;，&lt;code&gt;LCP echo interval&lt;/code&gt; 修改为 &lt;code&gt;3600&lt;/code&gt;。luci 没有显示可变更的内容。&lt;/p&gt;
&lt;p&gt;我只能将 &lt;code&gt;LCP echo failure threshold&lt;/code&gt; 修改为 &lt;code&gt;10&lt;/code&gt;，&lt;code&gt;LCP echo interval&lt;/code&gt; 修改为 &lt;code&gt;3600&lt;/code&gt;。然后前面说的几分钟就断线重连的这种状况就没有再出现了，wan 接口稳定运行。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/290e7036a03e06b606062cc352133e85d63154f3a9b0e61aed2b08767db8d264.webp" data-u-e-src="https://www.lixx.org/images/290e7036a03e06b606062cc352133e85d63154f3a9b0e61aed2b08767db8d264.webp"
	
	
	
	loading="lazy"
	
		alt="uptime of wan interface"
 data-u-e-alt="uptime of wan interface"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;uptime of wan interface&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;出现问题的具体原因我没有细究，猜测可能 openwrt 的默认设置与 pppd 的默认设置有一些冲突，导致设置 &lt;code&gt;LCP echo failure threshold&lt;/code&gt; 为 0 不生效。&lt;/p&gt;</description></item><item><title>在 VS Code 中添加 Git Bash 终端集成</title><link>https://www.lixx.org/a/4632/</link><pubDate>Tue, 20 Feb 2024 20:28:21 +0000</pubDate><guid>https://www.lixx.org/a/4632/</guid><description>&lt;p&gt;最近重装了 vscode 和 git，发现在 vscode 中无法直接使用 git bash 终端。估计是因为没装到默认路径或者没添加 path 导致 vscode 找不到 git bash。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/15b742b56d15a3aa40ce62ff7edb991c297e4397c3b29be2803006925f67770d.webp" data-u-e-src="https://www.lixx.org/images/15b742b56d15a3aa40ce62ff7edb991c297e4397c3b29be2803006925f67770d.webp"
	
	
	
	loading="lazy"
	
		alt="terminal profile option"
 data-u-e-alt="terminal profile option"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;terminal profile option&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="解决方法"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决方法
&lt;/h2&gt;&lt;p&gt;在 vscode 的 &lt;code&gt;setting.json&lt;/code&gt; 中添加相应的设置即可。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;ctrl + ,&lt;/code&gt; 打开 &lt;code&gt;Settings&lt;/code&gt; 页面。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;搜索 &lt;code&gt;@feature:terminal profile window&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到 &lt;code&gt;Terminal › Integrated › Profiles: Windows&lt;/code&gt;,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择&lt;code&gt;Edit in settings.json&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/71e7f912056b1486401b52db85e9af61a08e3c30dd3eb1a2df49ab8dcf51c822.webp" data-u-e-src="https://www.lixx.org/images/71e7f912056b1486401b52db85e9af61a08e3c30dd3eb1a2df49ab8dcf51c822.webp"
	
	
	
	loading="lazy"
	
		alt="Terminal › Integrated › Profiles: Windows"
 data-u-e-alt="Terminal › Integrated › Profiles: Windows"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Terminal › Integrated › Profiles: Windows&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;settings.json&lt;/code&gt; 文件中，向 &lt;code&gt;&amp;quot;terminal.integrated.profiles.windows&amp;quot;: { }&lt;/code&gt; 对象中新增 git 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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt;5&lt;/a&gt;
&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-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;Git Bash&amp;#34;&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="nt"&gt;&amp;#34;source&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Git Bash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// A profile source that will auto detect the paths to the shell. Note that non-standard executable locations are not supported and must be created manually in a new profile.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;D:\\Scoop\\apps\\git\\current\\bin\\bash.exe&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// A single path to a shell executable or an array of paths that will be used as fallbacks when one fails.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;icon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;terminal-bash&amp;#34;&lt;/span&gt; &lt;span class="c1"&gt;// A codicon ID to associate with the terminal icon.
&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;path&lt;/code&gt; 属性，&lt;code&gt;source&lt;/code&gt; 和 &lt;code&gt;icon&lt;/code&gt; 属性可删除，&lt;code&gt;icon&lt;/code&gt; 也可以设置为自己喜欢的图标。
注意将 &lt;code&gt;path&lt;/code&gt; 属性设置为你自己的路径。一般位于 &lt;code&gt;......\\git\\bin\\bash.exe&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/7ff98ab1c1fae7c975355526499fb05b9a7f267745026c12227fd98a88b3d2bb.webp" data-u-e-src="https://www.lixx.org/images/7ff98ab1c1fae7c975355526499fb05b9a7f267745026c12227fd98a88b3d2bb.webp"
	
	
	
	loading="lazy"
	
		alt="settings.json example"
 data-u-e-alt="settings.json example"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;settings.json example&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存设置后，应该就能在新建终端选项中看到 git bash 了。如果没有，则检查 &lt;code&gt;path&lt;/code&gt; 属性的路径是否正确。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/4704c52ed6acd5a5afc0f4707d2e1ba405dc960cdf33dbcaf3ff8fb267509fb1.webp" data-u-e-src="https://www.lixx.org/images/4704c52ed6acd5a5afc0f4707d2e1ba405dc960cdf33dbcaf3ff8fb267509fb1.webp"
	
	
	
	loading="lazy"
	
		alt="terminal profile option"
 data-u-e-alt="terminal profile option"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;terminal profile option&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果有需要，可通过 &lt;code&gt;Terminal › Integrated › Default Profile: Windows&lt;/code&gt; 将 git bash 设置为默认终端。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/9ae9f822a39920b101b763fc16715366de76727fbe070e41cfb2d9f456b5feb8.webp" data-u-e-src="https://www.lixx.org/images/9ae9f822a39920b101b763fc16715366de76727fbe070e41cfb2d9f456b5feb8.webp"
	
	
	
	loading="lazy"
	
		alt="Terminal › Integrated › Default Profile: Windows"
 data-u-e-alt="Terminal › Integrated › Default Profile: Windows"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Terminal › Integrated › Default Profile: Windows&lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/c2d9d867488bc5d6026cec7d16d4999a253d1e6c08a4fffa3a5fce7ca7a55de6.webp" data-u-e-src="https://www.lixx.org/images/c2d9d867488bc5d6026cec7d16d4999a253d1e6c08a4fffa3a5fce7ca7a55de6.webp"
	
	
	
	loading="lazy"
	
		alt="terminal profile option"
 data-u-e-alt="terminal profile option"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;terminal profile option&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>git-bash (MINGW64) 速度慢</title><link>https://www.lixx.org/a/27d9/</link><pubDate>Wed, 03 Jan 2024 17:57:31 +0000</pubDate><guid>https://www.lixx.org/a/27d9/</guid><description>&lt;p&gt;之前一直觉得在 Windows 上使用 git-bash (MINGW64)运行 hexo 速度慢。今天在 Windows 10 和 WSL 中分别测试了一下，结果表明这是真的，不是错觉。&lt;/p&gt;
&lt;h2 id="windows-10"&gt;&lt;a href="#windows-10" class="header-anchor"&gt;&lt;/a&gt;Windows 10
&lt;/h2&gt;&lt;p&gt;在 Windows 10 中使用 git-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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt;4&lt;/a&gt;
&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;rm -rf public db.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;time&lt;/span&gt; pnpm build
&lt;/span&gt;&lt;/span&gt;&lt;span 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;# pnpm build = hexo generate&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;得到结果，用时约为 11 秒。&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-3"&gt;&lt;a class="lnlinks" href="#hl-1-3"&gt;3&lt;/a&gt;
&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;real 0m11.384s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user 0m0.000s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys 0m0.015s
&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="wsl"&gt;&lt;a href="#wsl" class="header-anchor"&gt;&lt;/a&gt;WSL
&lt;/h2&gt;&lt;p&gt;在 WSL 中 git clone 我的博客仓库，运行同样的命令：&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-3"&gt;&lt;a class="lnlinks" href="#hl-2-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-4"&gt;&lt;a class="lnlinks" href="#hl-2-4"&gt;4&lt;/a&gt;
&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;rm -rf public db.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;time&lt;/span&gt; pnpm build
&lt;/span&gt;&lt;/span&gt;&lt;span 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;# pnpm build = hexo generate&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;用时仅为 6.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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;
&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;real 0m6.503s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user 0m11.209s
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys 0m1.927s
&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;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;不过，我一般使用 Github Action 进行构建博客，在 Windows 上速度如何，影响并不大。
但是，如果其他的应用、工具也有这样问题，那么对效率影响还是挺大的。&lt;/p&gt;

 &lt;/blockquote&gt;</description></item><item><title>HSTS 需注意跳转顺序</title><link>https://www.lixx.org/a/8267/</link><pubDate>Wed, 03 Jan 2024 13:05:38 +0000</pubDate><guid>https://www.lixx.org/a/8267/</guid><description>&lt;p&gt;我很早就在我的网站上开启了这个功能。并加入了 &lt;a class="link" href="https://hstspreload.org/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://hstspreload.org/" data-u-e-text="hstspreload.org"&gt;hstspreload.org&lt;/a&gt;
 ，但今天偶然发现 HSTS Preload 并没有生效。原因是我之前迁移网站时，手贱将网站在 cloudflare 的页面规则修改了，导致不符合 hstspreload 的要求。&lt;/p&gt;
&lt;h2 id="hsts-是什么"&gt;&lt;a href="#hsts-%e6%98%af%e4%bb%80%e4%b9%88" class="header-anchor"&gt;&lt;/a&gt;HSTS 是什么
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://developer.mozilla.org/docs/Web/HTTP/Headers/Strict-Transport-Security" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://developer.mozilla.org/docs/Web/HTTP/Headers/Strict-Transport-Security" data-u-e-text="HTTP Strict Transport Security"&gt;HTTP Strict Transport Security&lt;/a&gt;
 简称 HSTS。&lt;/p&gt;
&lt;p&gt;简单来说，在网站中启用这个标头可以让浏览器只通过 https 协议进行访问，避免浏览器或用户访问 http 地址时被劫持。比&lt;strong&gt;仅&lt;/strong&gt;配置 &amp;ldquo;HTTP 到 HTTPS（301）重定向&amp;rdquo; 要安全。&lt;/p&gt;
&lt;h2 id="需要注意的问题"&gt;&lt;a href="#%e9%9c%80%e8%a6%81%e6%b3%a8%e6%84%8f%e7%9a%84%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;需要注意的问题
&lt;/h2&gt;&lt;h3 id="https-跳转"&gt;&lt;a href="#https-%e8%b7%b3%e8%bd%ac" class="header-anchor"&gt;&lt;/a&gt;https 跳转
&lt;/h3&gt;&lt;p&gt;HSTS Preload 要求，域名应该由 &lt;code&gt;http&lt;/code&gt; 跳转到对应的 &lt;code&gt;https&lt;/code&gt; 。不能直接跳转到子域名。&lt;/p&gt;
&lt;p&gt;而我的网站使用 &lt;code&gt;www&lt;/code&gt; 子域名，我正好犯了这个错误，迁移时不慎将页面规则修改成：主域名 &lt;code&gt;http&lt;/code&gt; 直接跳转到子域名 &lt;code&gt;www&lt;/code&gt; 的 &lt;code&gt;https&lt;/code&gt; ，导致不符合 HSTS Preload 的要求。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/281f1c6c58de983f078d5a5e59c43c089aaa91520bf2121fe03a9f75cc63b8e7.webp" data-u-e-src="https://www.lixx.org/images/281f1c6c58de983f078d5a5e59c43c089aaa91520bf2121fe03a9f75cc63b8e7.webp"
	
	
	
	loading="lazy"
	
		alt="ERROR: HTTP redirects to www first"
 data-u-e-alt="ERROR: HTTP redirects to www first"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;ERROR: HTTP redirects to www first&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;如果不使用主域名而是使用子域名（例如 &lt;code&gt;www&lt;/code&gt; ），那么正确的跳转顺序应该为：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从主域名的 &lt;code&gt;http&lt;/code&gt; 跳转到主域名的 &lt;code&gt;https&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再由主域名的 &lt;code&gt;https&lt;/code&gt; 跳转到子域名 &lt;code&gt;www&lt;/code&gt; 的 &lt;code&gt;https。&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="过期时间"&gt;&lt;a href="#%e8%bf%87%e6%9c%9f%e6%97%b6%e9%97%b4" class="header-anchor"&gt;&lt;/a&gt;过期时间
&lt;/h3&gt;&lt;p&gt;Cloudflare 推荐的过期时间为 6 个月，最大可设置的时间为 12 个月，但 &lt;a class="link" href="https://hstspreload.org/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://hstspreload.org/" data-u-e-text="hstspreload.org"&gt;hstspreload.org&lt;/a&gt;
 要求最低 1 年，推荐 2 年。&lt;/p&gt;
&lt;p&gt;所以在 Cloudflare 上开启 hsts 时，要注意将 hsts 的 &lt;code&gt;max-age&lt;/code&gt; 设置为 12 个月。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/ffddd43ab9058ec78aad88ce2a2e956e310b8e051863eaf9666902fc19914fe6.webp" data-u-e-src="https://www.lixx.org/images/ffddd43ab9058ec78aad88ce2a2e956e310b8e051863eaf9666902fc19914fe6.webp"
	
	
	
	loading="lazy"
	
		alt="cloudflare hsts setting"
 data-u-e-alt="cloudflare hsts setting"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;cloudflare hsts setting&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>git 文件大小写问题</title><link>https://www.lixx.org/a/5497/</link><pubDate>Wed, 03 Jan 2024 00:46:30 +0000</pubDate><guid>https://www.lixx.org/a/5497/</guid><description>&lt;h2 id="问题"&gt;&lt;a href="#%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;问题
&lt;/h2&gt;&lt;p&gt;今天偶然发现，对于已经在 git 中 commit 的文件，修改其文件名大小写，git 不会记录文件名的变化。上网搜索发现不少人都遇到过这个坑。&lt;/p&gt;
&lt;h2 id="解决"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3" class="header-anchor"&gt;&lt;/a&gt;解决
&lt;/h2&gt;&lt;p&gt;对于已 commit 的文件，使用 &lt;code&gt;git mv &amp;lt;src&amp;gt; &amp;lt;dest&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;git mv file_name.ts File_Name.ts
&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;然后进行 commit，push 即可。&lt;/p&gt;
&lt;h2 id="后续"&gt;&lt;a href="#%e5%90%8e%e7%bb%ad" class="header-anchor"&gt;&lt;/a&gt;后续
&lt;/h2&gt;&lt;p&gt;为免后患，可以修改 git 配置项。
将 &lt;a class="link" href="https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreignoreCase" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://git-scm.com/docs/git-config#Documentation/git-config.txt-coreignoreCase" data-u-e-text="core.ignorecase"&gt;&lt;code&gt;core.ignorecase&lt;/code&gt;&lt;/a&gt;
 修改为 &lt;code&gt;false&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="修改当前项目的设置"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9%e5%bd%93%e5%89%8d%e9%a1%b9%e7%9b%ae%e7%9a%84%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&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;# git config core.ignorecase false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --local core.ignorecase &lt;span class="nb"&gt;false&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;a href="#%e4%bf%ae%e6%94%b9%e5%85%a8%e5%b1%80%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;git config --global core.ignorecase &lt;span class="nb"&gt;false&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;</description></item><item><title>git sparse checkout 的正确操作方式</title><link>https://www.lixx.org/a/1365/</link><pubDate>Fri, 29 Dec 2023 19:13:51 +0000</pubDate><guid>https://www.lixx.org/a/1365/</guid><description>&lt;p&gt;网上有的文章修改 &lt;code&gt;.git/info/sparse-checkout&lt;/code&gt; 以进行 sparse checkout，实际上 &lt;code&gt;git&lt;/code&gt; 有自带的 &lt;code&gt;sparse-checkout&lt;/code&gt; 命令。&lt;/p&gt;
&lt;h2 id="操作步骤"&gt;&lt;a href="#%e6%93%8d%e4%bd%9c%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;操作步骤
&lt;/h2&gt;&lt;h3 id="带参数克隆仓库"&gt;&lt;a href="#%e5%b8%a6%e5%8f%82%e6%95%b0%e5%85%8b%e9%9a%86%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;git clone --no-checkout --sparse --filter&lt;span class="o"&gt;=&lt;/span&gt;blob:none git@github.com:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git
&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;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;&lt;code&gt;--no-checkout&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;不 checkout 到 HEAD&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--sparse&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;开启 sparse-checkout 功能&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--filter=blob:none&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;不下载 blob 对象（重要，否则还是需要下载大量数据）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;a class="link" href="https://git-scm.com/docs/git-clone" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://git-scm.com/docs/git-clone" data-u-e-text="refs: git clone"&gt;refs: git clone&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id="进入目录"&gt;&lt;a href="#%e8%bf%9b%e5%85%a5%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;cd&lt;/span&gt; &amp;lt;repo&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="指定需要-checkout-的目录"&gt;&lt;a href="#%e6%8c%87%e5%ae%9a%e9%9c%80%e8%a6%81-checkout-%e7%9a%84%e7%9b%ae%e5%bd%95" class="header-anchor"&gt;&lt;/a&gt;指定需要 checkout 的目录
&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;git sparse-checkout add &amp;lt;path/to/&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;a class="link" href="https://git-scm.com/docs/git-sparse-checkout" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://git-scm.com/docs/git-sparse-checkout" data-u-e-text="refs: git sparse-checkout"&gt;refs: git sparse-checkout&lt;/a&gt;
&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注意：默认情况下 sparse-checkout 为 &lt;code&gt;cone&lt;/code&gt; 模式。默认情况下 &lt;code&gt;sparse-checkout&lt;/code&gt; 会包含根目录下的文件。
非 &lt;code&gt;cone&lt;/code&gt; 模式存在诸多问题，因此 git 官方文档不建议使用非 &lt;code&gt;cone&lt;/code&gt; 模式。
详见文档。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="进行-checkout"&gt;&lt;a href="#%e8%bf%9b%e8%a1%8c-checkout" class="header-anchor"&gt;&lt;/a&gt;进行 checkout
&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&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;git checkout &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;branch&amp;gt;&lt;span class="o"&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;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;remote: Enumerating objects: 31, done.
remote: Counting objects: 100% (11/11), done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 31 (delta 0), reused 0 (delta 0), pack-reused 20
Receiving objects: 100% (31/31), 616.91 KiB | 636.00 KiB/s, done.
Resolving deltas: 100% (1/1), done.
Updating files: 100% (32/32), done.
Already on &amp;#39;main&amp;#39;
Your branch is up to date with &amp;#39;origin/main&amp;#39;.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Windows 修改 Docker Desktop 安装位置和数据位置</title><link>https://www.lixx.org/a/2888/</link><pubDate>Fri, 22 Dec 2023 14:03:46 +0000</pubDate><guid>https://www.lixx.org/a/2888/</guid><description>&lt;p&gt;在 Windows 下，Docker Desktop 的安装位置默认在 C 盘， WSL 的数据位置也默认在 C 盘。C 盘分区小就很难受了。&lt;/p&gt;
&lt;p&gt;网上有通过修改注册表和建立链接来修改 Docker Desktop 安装位置的方法，也有通过导出导入 WSL 数据 实现修改 WSL 数据位置的方法。
但这些都比较麻烦，实际上 Docker 的安装程序有提供修改位置的接口，使用命令行安装即可指定安装位置和数据位置，并且官方文档有介绍，详见 &lt;a class="link" href="https://docs.docker.com/desktop/install/windows-install/#install-docker-desktop-on-windows" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://docs.docker.com/desktop/install/windows-install/#install-docker-desktop-on-windows" data-u-e-text="Install Docker Desktop on Windows"&gt;Install Docker Desktop on Windows&lt;/a&gt;
。&lt;/p&gt;
&lt;h2 id="命令行安装"&gt;&lt;a href="#%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;命令行安装
&lt;/h2&gt;&lt;p&gt;下载 &lt;code&gt;Docker Desktop Installer.exe&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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="s2"&gt;&amp;#34;Docker Desktop Installer.exe&amp;#34;&lt;/span&gt; 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;code&gt;--installation-dir=&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--hyper-v-default-data-root=&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--windows-containers-default-data-root=&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--wsl-default-data-root=&amp;lt;path&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;即可指定安装位置以及数据位置。&lt;/p&gt;
&lt;h3 id="示例"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;示例
&lt;/h3&gt;&lt;p&gt;例如，在 git-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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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="s1"&gt;&amp;#39;./Docker Desktop Installer.exe&amp;#39;&lt;/span&gt; install --installation-dir&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D:\docker\docker&amp;#39;&lt;/span&gt; --wsl-default-data-root&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D:\docker\wsl-data&amp;#39;&lt;/span&gt; --hyper-v-default-data-root&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D:\docker\hyper-data&amp;#39;&lt;/span&gt; --windows-containers-default-data-root&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;D:\docker\windows-data&amp;#39;&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;</description></item><item><title>Cloudflare Pages 推出构建缓存（Build cache）功能</title><link>https://www.lixx.org/a/4a7a/</link><pubDate>Thu, 12 Oct 2023 00:13:09 +0000</pubDate><guid>https://www.lixx.org/a/4a7a/</guid><description>&lt;p&gt;今天无意中看到 Cloudflare Pages 新推出构建缓存（Build cache）支持，试用了一下，提升还是挺大的。&lt;/p&gt;
&lt;h2 id="cloudflare-pages-build-cache-beta"&gt;&lt;a href="#cloudflare-pages-build-cache-beta" class="header-anchor"&gt;&lt;/a&gt;Cloudflare Pages Build cache (beta)
&lt;/h2&gt;&lt;p&gt;Cloudflare Pages 的官方文档 &lt;a class="link" href="https://developers.cloudflare.com/pages/platform/build-caching/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://developers.cloudflare.com/pages/platform/build-caching/" data-u-e-text="https://developers.cloudflare.com/pages/platform/build-caching/"&gt;https://developers.cloudflare.com/pages/platform/build-caching/&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Cloudflare Pages Build cache 类似于 Github Action 的 Cache，可以将依赖缓存起来以加快构建速度。目前还是 beta 状态，支持部分包管理器和框架，可以在自己的项目设置中进行开启。需要注意的是构建缓存（Build cache） 依赖于 &lt;a class="link" href="https://developers.cloudflare.com/pages/platform/language-support-and-tools/#v2-build-system" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://developers.cloudflare.com/pages/platform/language-support-and-tools/#v2-build-system" data-u-e-text="V2 构建系统（build system）"&gt;V2 构建系统（build system）&lt;/a&gt;
。如果你正在使用 V1，需要先先升级到 V2.&lt;/p&gt;
&lt;p&gt;注意这是 &lt;a class="link" href="https://developers.cloudflare.com/pages/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://developers.cloudflare.com/pages/" data-u-e-text="Cloudflare Pages"&gt;Cloudflare Pages&lt;/a&gt;
 的构建缓存，不是 Cloudflare CDN 的缓存。&lt;/p&gt;
&lt;h3 id="配置"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;配置
&lt;/h3&gt;&lt;p&gt;配置界面目前很简单，只需要在在你的 pages 项目中的 &amp;ldquo;Settings &amp;gt; Builds &amp;amp; deployments &amp;gt; Build cache&amp;rdquo; 中点击开启即可。另外在设置中可以手动清除缓存（Clear cache）。&lt;/p&gt;
&lt;h3 id="支持范围"&gt;&lt;a href="#%e6%94%af%e6%8c%81%e8%8c%83%e5%9b%b4" class="header-anchor"&gt;&lt;/a&gt;支持范围
&lt;/h3&gt;&lt;p&gt;根据&lt;a class="link" href="https://developers.cloudflare.com/pages/platform/build-caching/#how-build-caching-works" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://developers.cloudflare.com/pages/platform/build-caching/#how-build-caching-works" data-u-e-text="官方文档"&gt;官方文档&lt;/a&gt;
，目前支持&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yarn 1, npm, pnpm, bun 包管理器，（Cloudflare 将其称为 &lt;code&gt;dependencies cache&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;Gatsby, Next.js, Astro 框架。（Cloudflare 将其称为 &lt;code&gt;build output cache&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="限制"&gt;&lt;a href="#%e9%99%90%e5%88%b6" class="header-anchor"&gt;&lt;/a&gt;限制
&lt;/h3&gt;&lt;p&gt;目前的缓存保留 7 天，每个项目最多 10GB 的缓存空间。&lt;/p&gt;
&lt;h2 id="试用"&gt;&lt;a href="#%e8%af%95%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;试用
&lt;/h2&gt;&lt;p&gt;开启前触发一次构建，开启后再触发一次构建，对比两次构建的速度。&lt;/p&gt;
&lt;p&gt;我使用的是 pnpm 包管理器。&lt;/p&gt;
&lt;h3 id="开启前"&gt;&lt;a href="#%e5%bc%80%e5%90%af%e5%89%8d" class="header-anchor"&gt;&lt;/a&gt;开启前
&lt;/h3&gt;&lt;p&gt;开启前，&lt;code&gt;pnpm install&lt;/code&gt; 耗时 9.9s，所有的包都是通过下载（download）进行安装的。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;09:01:12.995 Detected the following tools from environment: pnpm@8.7.1, nodejs@18.17.1
09:01:15.074 Installing project dependencies: pnpm install
09:01:16.011 Lockfile is up to date, resolution step is skipped
09:01:16.047 Progress: resolved 1, reused 0, downloaded 0, added 0
09:01:16.178 Packages: +490
09:01:16.179 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
09:01:16.723 Packages are hard linked from the content-addressable store to the virtual store.
09:01:16.724 Content-addressable store is at: /opt/buildhome/.pnpm-store/v3
09:01:16.724 Virtual store is at: node_modules/.pnpm
09:01:17.054 Progress: resolved 490, reused 0, downloaded 36, added 30
09:01:18.058 Progress: resolved 490, reused 0, downloaded 82, added 75
09:01:19.062 Progress: resolved 490, reused 0, downloaded 155, added 150
09:01:20.070 Progress: resolved 490, reused 0, downloaded 243, added 242
09:01:21.079 Progress: resolved 490, reused 0, downloaded 345, added 344
09:01:22.079 Progress: resolved 490, reused 0, downloaded 445, added 444
09:01:23.081 Progress: resolved 490, reused 0, downloaded 486, added 486
09:01:23.855 .../node_modules/****** postinstall$ ......
09:01:24.084 Progress: resolved 490, reused 0, downloaded 490, added 490, done
09:01:24.668 .../node_modules/****** postinstall: &amp;gt; ......
09:01:25.455
09:01:25.456 dependencies:
......
09:01:25.460 + ......
09:01:25.460
09:01:25.465 Done in 9.9s
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="开启后"&gt;&lt;a href="#%e5%bc%80%e5%90%af%e5%90%8e" class="header-anchor"&gt;&lt;/a&gt;开启后
&lt;/h3&gt;&lt;p&gt;开启后，&lt;code&gt;pnpm install&lt;/code&gt; 耗时 3.4 秒。所有的包都是通过重用（reuse）进行安装。&lt;/p&gt;
&lt;p&gt;可以看到日志中多出 &lt;code&gt;Restoring from dependencies cache&lt;/code&gt;, &lt;code&gt;Restoring from build output cache&lt;/code&gt;，值得注意的是这个过程将近 4 秒（我这里只有 &lt;code&gt;dependencies cache&lt;/code&gt;）。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;22:35:03.716 Restoring from dependencies cache
22:35:03.739 Restoring from build output cache
22:35:07.525 Success: Dependencies restored from build cache.

22:35:07.663 Detected the following tools from environment: pnpm@8.7.1, nodejs@18.17.1
22:35:09.726 Installing project dependencies: pnpm install
22:35:10.632 Lockfile is up to date, resolution step is skipped
22:35:10.668 Progress: resolved 1, reused 0, downloaded 0, added 0
22:35:10.791 Packages: +490
22:35:10.791 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
22:35:11.137 Packages are hard linked from the content-addressable store to the virtual store.
22:35:11.138 Content-addressable store is at: /opt/buildhome/.pnpm-store/v3
22:35:11.138 Virtual store is at: node_modules/.pnpm
22:35:11.669 Progress: resolved 490, reused 59, downloaded 0, added 56
22:35:12.669 Progress: resolved 490, reused 411, downloaded 0, added 410
22:35:13.635
22:35:13.635 dependencies:
......
22:35:13.637 + ......
22:35:13.638
22:35:13.645 Done in 3.4s
22:35:13.670 Progress: resolved 490, reused 490, downloaded 0, added 490, done
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="结果"&gt;&lt;a href="#%e7%bb%93%e6%9e%9c" class="header-anchor"&gt;&lt;/a&gt;结果
&lt;/h3&gt;&lt;p&gt;可以看到 &lt;code&gt;pnpm install&lt;/code&gt; 从 9.9 秒缩短到 3.4 秒，我认为这个速度提升还是挺大的。&lt;/p&gt;
&lt;p&gt;我这个网站是小项目，依赖少，提升还不算明显。如果是稍大的项目，相信效果会更明显。&lt;/p&gt;
&lt;p&gt;目前构建缓存（Build cache）这个功能支持的范围较少，也不能自定义缓存的内容，希望未来会有所改进。&lt;/p&gt;</description></item><item><title>ERR_PNPM_UNEXPECTED_PKG_CONTENT_IN_STORE</title><link>https://www.lixx.org/a/ffe9/</link><pubDate>Sat, 02 Sep 2023 16:26:32 +0000</pubDate><guid>https://www.lixx.org/a/ffe9/</guid><description>&lt;p&gt;今天为一个仓库执行 &lt;code&gt;pnpm i&lt;/code&gt; 时出现错误 &lt;code&gt;ERR_PNPM_UNEXPECTED_PKG_CONTENT_IN_STORE&lt;/code&gt; 。 在网络上一番搜索后无果。&lt;/p&gt;
&lt;p&gt;从字面意思上看，pnpm 的 store 里出现了一些不应该出现的东西。&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;pnpm store prune&lt;/code&gt; 后依然出错。&lt;/p&gt;
&lt;p&gt;最后用 &lt;code&gt;rm -rf $(pnpm store path)&lt;/code&gt; 解决，即&lt;strong&gt;强制删除整个 store&lt;/strong&gt;。代价是要所有项目都要重新安装依赖。&lt;/p&gt;</description></item><item><title>用 Github CLI 删除仓库</title><link>https://www.lixx.org/a/ea81/</link><pubDate>Fri, 01 Sep 2023 09:12:17 +0000</pubDate><guid>https://www.lixx.org/a/ea81/</guid><description>&lt;p&gt;一行命令快捷删除 Github 上的仓库，让删库跑路更简单。&lt;/p&gt;
&lt;h2 id="背景"&gt;&lt;a href="#%e8%83%8c%e6%99%af" class="header-anchor"&gt;&lt;/a&gt;背景
&lt;/h2&gt;&lt;p&gt;组织的仓库太多了。但我不喜欢在我的账户里保留太多仓库。我一般在使用的时候才 fork， pull request 被合并后就删除仓库。&lt;/p&gt;
&lt;p&gt;但在网页上删除仓库实在是有点繁琐：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先要找到那个仓库&lt;/li&gt;
&lt;li&gt;再点击设置&lt;/li&gt;
&lt;li&gt;再点击删除&lt;/li&gt;
&lt;li&gt;再点击删除对话框里的 &amp;ldquo;I want to delete the repository&amp;rdquo;&lt;/li&gt;
&lt;li&gt;再点击删除对话框里的 &amp;ldquo;I have read and understand these effects&amp;rdquo;&lt;/li&gt;
&lt;li&gt;最后还得输入或者复制仓库名进行确认。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;再加上网络问题，以上过程就更折磨了。&lt;/p&gt;
&lt;h2 id="解决方法"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决方法
&lt;/h2&gt;&lt;p&gt;Github 有一款工具叫 &lt;a class="link" href="https://cli.github.com/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://cli.github.com/" data-u-e-text="Github CLI"&gt;Github CLI&lt;/a&gt;
，我之前一般用来克隆仓库和看 PR，突发奇想或许 &lt;a class="link" href="https://cli.github.com/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://cli.github.com/" data-u-e-text="Github CLI"&gt;Github CLI&lt;/a&gt;
 可以删除仓库，查了一下 &lt;a class="link" href="https://cli.github.com/manual/" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://cli.github.com/manual/" data-u-e-text="Manual"&gt;Manual&lt;/a&gt;
 果然有这样的功能。&lt;/p&gt;
&lt;h2 id="gh-repo-delete"&gt;&lt;a href="#gh-repo-delete" class="header-anchor"&gt;&lt;/a&gt;&lt;code&gt;gh repo delete&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;官方文档 &lt;a class="link" href="https://cli.github.com/manual/gh_repo_delete" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://cli.github.com/manual/gh_repo_delete" data-u-e-text="gh repo delete"&gt;gh repo delete&lt;/a&gt;
&lt;/p&gt;
&lt;h3 id="获取权限"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;获取权限
&lt;/h3&gt;&lt;p&gt;要先获取 &lt;code&gt;delete_repo&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh auth refresh -s delete_repo
&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;a href="#%e5%88%a0%e9%99%a4%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo delete &lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;repository&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;flags&lt;span class="o"&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;gh repo delete&lt;/code&gt; 的话就是删除当前仓库。也可以指定仓库。&lt;/p&gt;
&lt;p&gt;加上 &lt;code&gt;--yes&lt;/code&gt; 无需确认，直接删除。不加的话会让你确认。&lt;/p&gt;
&lt;h4 id="示例"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b" class="header-anchor"&gt;&lt;/a&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&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-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo delete username/example-repo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh repo delete username/example-repo --yes
&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;a href="#%e8%ad%a6%e5%91%8a" class="header-anchor"&gt;&lt;/a&gt;警告
&lt;/h2&gt;&lt;p&gt;进行此类高风险操作（包括删除仓库、改变仓库可见性）时，强烈建议始终&lt;strong&gt;显式指定&lt;/strong&gt;用户名和仓库名。不要依赖 &lt;code&gt;gh&lt;/code&gt; 命令的默认仓库，以免误操作。&lt;/p&gt;</description></item><item><title>git 指令备忘</title><link>https://www.lixx.org/a/4a19/</link><pubDate>Sun, 02 Jul 2023 09:27:46 +0000</pubDate><guid>https://www.lixx.org/a/4a19/</guid><description>&lt;p&gt;总是记不住命令，每次都要搜索。自己记录一下，方便查找。&lt;/p&gt;
&lt;h2 id="git-reset"&gt;&lt;a href="#git-reset" class="header-anchor"&gt;&lt;/a&gt;git reset
&lt;/h2&gt;&lt;h3 id="git-reset-hard"&gt;&lt;a href="#git-reset-hard" class="header-anchor"&gt;&lt;/a&gt;git reset &amp;ndash;hard
&lt;/h3&gt;&lt;p&gt;将本地仓库恢复至指定 commit 的状态。
commit 记录和文件都会丢失。&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;git reset --hard fjf88323horjs2eofu23u03ji332uio532u4io32
&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-reset-mixed"&gt;&lt;a href="#git-reset-mixed" class="header-anchor"&gt;&lt;/a&gt;git reset &amp;ndash;mixed
&lt;/h3&gt;&lt;p&gt;将本地仓库恢复到 &lt;code&gt;git add&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-1-2"&gt;&lt;a class="lnlinks" href="#hl-1-2"&gt;2&lt;/a&gt;
&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;git reset fjf88323horjs2eofu23u03ji332uio532u4io32
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git reset --mixed fjf88323horjs2eofu23u03ji332uio532u4io32
&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-reset-soft"&gt;&lt;a href="#git-reset-soft" class="header-anchor"&gt;&lt;/a&gt;git reset &amp;ndash;soft
&lt;/h3&gt;&lt;p&gt;恢复到 &lt;code&gt;git commit&lt;/code&gt; 之前（即 &lt;code&gt;git add&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;git reset --soft fjf88323horjs2eofu23u03ji332uio532u4io32
&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="git-pull"&gt;&lt;a href="#git-pull" class="header-anchor"&gt;&lt;/a&gt;git pull
&lt;/h2&gt;&lt;p&gt;从远程获取分支，并且与本地分支合并&lt;/p&gt;
&lt;p&gt;简单来说，&lt;code&gt;git pull&lt;/code&gt; 相当于 &lt;code&gt;git fetch&lt;/code&gt; + &lt;code&gt;git merge&lt;/code&gt;
（实际上有差别）。&lt;/p&gt;
&lt;p&gt;以下两个命令等效（默认设置下），拉取 &lt;code&gt;origin&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&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;git pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull origin
&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;main&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&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;git pull origin main
&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;main&lt;/code&gt; 分支，并与本地的 &lt;code&gt;dev&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;git pull origin main:dev
&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="git-remote"&gt;&lt;a href="#git-remote" class="header-anchor"&gt;&lt;/a&gt;git remote
&lt;/h2&gt;&lt;p&gt;管理远程分支&lt;/p&gt;
&lt;p&gt;添加一个名为 &lt;code&gt;uptream&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" id="hl-6-1"&gt;&lt;a class="lnlinks" href="#hl-6-1"&gt;1&lt;/a&gt;
&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;git remote add uptream git@github.com:mdn/content.git
&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;uptream&lt;/code&gt; 的远程分支改名为 &lt;code&gt;down&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&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;git remote rename uptream down
&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;down&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" id="hl-8-1"&gt;&lt;a class="lnlinks" href="#hl-8-1"&gt;1&lt;/a&gt;
&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;git remote remove down
&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="git-submodule"&gt;&lt;a href="#git-submodule" class="header-anchor"&gt;&lt;/a&gt;git submodule
&lt;/h2&gt;&lt;h3 id="删除子模块"&gt;&lt;a href="#%e5%88%a0%e9%99%a4%e5%ad%90%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;删除子模块
&lt;/h3&gt;&lt;p&gt;网上很多文章写的 要删除这个文件、编辑那个文件，把步骤搞得很复杂。
其实并不需要，实际上只需要三步。&lt;/p&gt;
&lt;ul&gt;
&lt;li&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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;git submodule deinit submodulePath
&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;code&gt;.git/config&lt;/code&gt; 中移除了，并未从配置中移除。
此时可以通过 &lt;code&gt;git submodule init&lt;/code&gt;, &lt;code&gt;git submodule update&lt;/code&gt; 重新加载子模块.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&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;git rm -r submodulePath
&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;.gitmodules&lt;/code&gt; 内的相应内容.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除 &lt;code&gt;.git/modules/&lt;/code&gt; 内的相应内容&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="增加子模块"&gt;&lt;a href="#%e5%a2%9e%e5%8a%a0%e5%ad%90%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&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" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;
&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;git submodule add &amp;lt;repo&amp;gt; &amp;lt;path&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;blockquote&gt;
 &lt;p&gt;这时会增加子模块的配置，以及克隆子模块到本地。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="加载子模块"&gt;&lt;a href="#%e5%8a%a0%e8%bd%bd%e5%ad%90%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&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" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-12-2"&gt;&lt;a class="lnlinks" href="#hl-12-2"&gt;2&lt;/a&gt;
&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;git submodule init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git submodule update
&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;a href="#%e6%9b%b4%e6%96%b0%e5%ad%90%e6%a8%a1%e5%9d%97" class="header-anchor"&gt;&lt;/a&gt;更新子模块
&lt;/h3&gt;&lt;p&gt;当子模块有更新，需要更新时，可以进入子模块目录中，手动 &lt;code&gt;git pull&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" id="hl-13-1"&gt;&lt;a class="lnlinks" href="#hl-13-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-13-2"&gt;&lt;a class="lnlinks" href="#hl-13-2"&gt;2&lt;/a&gt;
&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;cd&lt;/span&gt; submodulepath
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull origin main
&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 submodule foreach&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" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;
&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;git submodule foreach git pull origin main
&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;a href="#%e6%93%8d%e4%bd%9c%e5%ad%90%e6%a8%a1%e5%9d%97%e4%bb%93%e5%ba%93" class="header-anchor"&gt;&lt;/a&gt;操作子模块仓库
&lt;/h3&gt;&lt;p&gt;子模块实际上就是一个完整的仓库。进入子模块的目录，按照正常流程操作即可。&lt;/p&gt;</description></item><item><title>WSL2 安装</title><link>https://www.lixx.org/a/18a1/</link><pubDate>Mon, 26 Jun 2023 11:15:15 +0000</pubDate><guid>https://www.lixx.org/a/18a1/</guid><description>&lt;p&gt;关于 WSL 的安装，Microsoft Learn 写得已经比较完善了，网络上也有较多教程。我主要记录一下 WSL 手动安装的步骤。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Microsoft Learn - 安装 WSL - &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Microsoft Learn - 旧版 WSL 的手动安装步骤 - &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install-manual&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Zhihu Robin - Win11 WSL2 安装+配置+迁移 - &lt;a class="link" href="https://zhuanlan.zhihu.com/p/613427280" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://zhuanlan.zhihu.com/p/613427280" data-u-e-text="https://zhuanlan.zhihu.com/p/613427280"&gt;https://zhuanlan.zhihu.com/p/613427280&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CSDN - win11 安装 WSL2 在非 C 盘及配置（图形界面+代理） - &lt;a class="link" href="https://blog.csdn.net/weixin_45840825/article/details/127138564" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://blog.csdn.net/weixin_45840825/article/details/127138564" data-u-e-text="https://blog.csdn.net/weixin_45840825/article/details/127138564"&gt;https://blog.csdn.net/weixin_45840825/article/details/127138564&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="安装方式"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e6%96%b9%e5%bc%8f" class="header-anchor"&gt;&lt;/a&gt;安装方式
&lt;/h2&gt;&lt;p&gt;根据 Microsoft Learn 的说明，安装 WSL 有两种方式，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;正常安装&lt;/li&gt;
&lt;li&gt;手动安装&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="正常安装"&gt;&lt;a href="#%e6%ad%a3%e5%b8%b8%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;正常安装
&lt;/h2&gt;&lt;p&gt;根据 Microsoft Learn 的介绍，只需 &lt;code&gt;wsl --install&lt;/code&gt; 即可完成安装。但我没有尝试过。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Microsoft Learn - 安装 WSL - &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="手动安装"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;手动安装
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;Microsoft Learn - 旧版 WSL 的手动安装步骤 - &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install-manual&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="wsl2-版本要求"&gt;&lt;a href="#wsl2-%e7%89%88%e6%9c%ac%e8%a6%81%e6%b1%82" class="header-anchor"&gt;&lt;/a&gt;WSL2 版本要求
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Windows 10 (x64)：版本 1903 或更高版本，内部版本为 18362.1049 或更高版本。&lt;/li&gt;
&lt;li&gt;Windows 10 (ARM64)：版本 2004 或更高版本，内部版本为 19041 或更高版本。&lt;/li&gt;
&lt;li&gt;Windows 11。&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;在 &lt;code&gt;运行&lt;/code&gt;(win+R) 或 &lt;code&gt;Powershell&lt;/code&gt; 中输入 &lt;code&gt;winver&lt;/code&gt; 即可查看版本。
或者在设置中查看。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="启用-wsl适用于-linux-的-windows-子系统"&gt;&lt;a href="#%e5%90%af%e7%94%a8-wsl%e9%80%82%e7%94%a8%e4%ba%8e-linux-%e7%9a%84-windows-%e5%ad%90%e7%b3%bb%e7%bb%9f" class="header-anchor"&gt;&lt;/a&gt;启用 WSL（适用于 Linux 的 Windows 子系统）
&lt;/h3&gt;&lt;p&gt;以管理员身份打开 PowerShell, 执行&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;dism&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;online&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;enable-feature&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;featurename&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;Microsoft-Windows&lt;/span&gt;&lt;span class="n"&gt;-Subsystem-Linux&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;norestart&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;code&gt;程序与功能&lt;/code&gt; - &lt;code&gt;启用或关闭Windows功能&lt;/code&gt; 中启用 &lt;code&gt;适用于 Linux 的 Windows 子系统&lt;/code&gt;(WSL) 应该是等效的&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="启用虚拟机平台"&gt;&lt;a href="#%e5%90%af%e7%94%a8%e8%99%9a%e6%8b%9f%e6%9c%ba%e5%b9%b3%e5%8f%b0" class="header-anchor"&gt;&lt;/a&gt;启用虚拟机平台
&lt;/h3&gt;&lt;p&gt;以管理员身份打开 PowerShell, 执行&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" id="hl-1-1"&gt;&lt;a class="lnlinks" href="#hl-1-1"&gt;1&lt;/a&gt;
&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;dism&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;online&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;enable-feature&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;featurename&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;VirtualMachinePlatform&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;norestart&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;code&gt;程序与功能&lt;/code&gt; - &lt;code&gt;启用或关闭Windows功能&lt;/code&gt; 中启用 &lt;code&gt;虚拟机平台&lt;/code&gt; 应该是等效的。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="下载安装-linux-内核更新包"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd%e5%ae%89%e8%a3%85-linux-%e5%86%85%e6%a0%b8%e6%9b%b4%e6%96%b0%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;下载安装 Linux 内核更新包
&lt;/h3&gt;&lt;p&gt;下载并安装 Linux 内核更新包&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;适用于 x64 计算机的 WSL2 Linux 内核更新包 - &lt;a class="link" href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi" data-u-e-text="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi"&gt;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;适用于 ARM64 计算机的 WSL2 Linux 内核更新包 - &lt;a class="link" href="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi" data-u-e-text="https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi"&gt;https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_arm64.msi&lt;/a&gt;
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;如果链接失效，请查阅【Microsoft Learn - 步骤 4-下载 Linux 内核更新包】 &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-update-package&lt;/a&gt;
&lt;/p&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;p&gt;这名字起得很奇怪，Microsoft Learn 文章里面叫做【Linux kernel update package】（Linux 内核更新包），但下载的文件是【wsl_update】（应该是 wsl 的更新包）。我也不知道到底是在更新什么。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="将-wsl2-设置为默认版本"&gt;&lt;a href="#%e5%b0%86-wsl2-%e8%ae%be%e7%bd%ae%e4%b8%ba%e9%bb%98%e8%ae%a4%e7%89%88%e6%9c%ac" class="header-anchor"&gt;&lt;/a&gt;将 WSL2 设置为默认版本
&lt;/h3&gt;&lt;p&gt;Powershell 执行&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&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;wsl&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-set-default-version&lt;/span&gt; &lt;span class="mf"&gt;2&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="手动下载-linux-发行版"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e4%b8%8b%e8%bd%bd-linux-%e5%8f%91%e8%a1%8c%e7%89%88" class="header-anchor"&gt;&lt;/a&gt;手动下载 Linux 发行版
&lt;/h2&gt;&lt;p&gt;Microsoft Learn 以及网络上的文章都会教你在 Microsoft Store 下载安装 Linux 发行版。
但是这样安装会导致 Linux 被安装到 C 盘，如果 C 盘空间充足那也没什么所谓。C 盘空间不足的话就要通过其他办法安装。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;将 Linux 安装在其他位置的两种方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zhihu Robin - Win11 WSL2 安装+配置+迁移 - &lt;a class="link" href="https://zhuanlan.zhihu.com/p/613427280" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://zhuanlan.zhihu.com/p/613427280" data-u-e-text="https://zhuanlan.zhihu.com/p/613427280"&gt;https://zhuanlan.zhihu.com/p/613427280&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CSDN - win11 安装 WSL2 在非 C 盘及配置（图形界面+代理） - &lt;a class="link" href="https://blog.csdn.net/weixin_45840825/article/details/127138564" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://blog.csdn.net/weixin_45840825/article/details/127138564" data-u-e-text="https://blog.csdn.net/weixin_45840825/article/details/127138564"&gt;https://blog.csdn.net/weixin_45840825/article/details/127138564&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;
&lt;p&gt;我用的第二种办法，需要手动下载 Linux 发行版的安装包。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;Linux 发行版下载链接可以在 【Microsoft Learn - 下载发行版】 &lt;a class="link" href="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#downloading-distributions" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#downloading-distributions" data-u-e-text="https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#downloading-distributions"&gt;https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#downloading-distributions&lt;/a&gt;
 取得。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="安装-linux-发行版"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-linux-%e5%8f%91%e8%a1%8c%e7%89%88" class="header-anchor"&gt;&lt;/a&gt;安装 Linux 发行版
&lt;/h2&gt;&lt;h3 id="直接安装"&gt;&lt;a href="#%e7%9b%b4%e6%8e%a5%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;直接安装
&lt;/h3&gt;&lt;p&gt;直接安装下载得到的&lt;code&gt;.Appx&lt;/code&gt;或&lt;code&gt;.AppxBundle&lt;/code&gt;文件与从 Microsoft Store 下载安装的效果是一致的，Linux 产生的文件会被放置在 C 盘。&lt;/p&gt;
&lt;h3 id="解压安装"&gt;&lt;a href="#%e8%a7%a3%e5%8e%8b%e5%ae%89%e8%a3%85" class="header-anchor"&gt;&lt;/a&gt;解压安装
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;.Appx&lt;/code&gt;或&lt;code&gt;.AppxBundle&lt;/code&gt;文件实质上就是一个压缩包&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用压缩软件打开&lt;code&gt;.Appx&lt;/code&gt;文件&lt;/li&gt;
&lt;li&gt;将文件解压缩到你想安装的目录。&lt;/li&gt;
&lt;li&gt;运行里面的可执行程序，如&lt;code&gt;ubuntu.exe&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;正常情况下，等待片刻即可完成安装。
安装后就能看到 Linux 的硬盘映像文件（&lt;code&gt;vhdx&lt;/code&gt;）就存放在安装目录下。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/0a7bc22f749ffaceeef3be42230d1bd816fe6d4f911583608381b74b74410212.webp" data-u-e-src="https://www.lixx.org/images/0a7bc22f749ffaceeef3be42230d1bd816fe6d4f911583608381b74b74410212.webp"
	
	
	
	loading="lazy"
	
		alt="vhdx in current dir"
 data-u-e-alt="vhdx in current dir"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;vhdx in current dir&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="更新后出错不支持此接口-error-code-wsl0x80004002"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0%e5%90%8e%e5%87%ba%e9%94%99%e4%b8%8d%e6%94%af%e6%8c%81%e6%ad%a4%e6%8e%a5%e5%8f%a3-error-code-wsl0x80004002" class="header-anchor"&gt;&lt;/a&gt;更新后出错（不支持此接口 Error code: Wsl/0x80004002）
&lt;/h2&gt;&lt;h3 id="更新"&gt;&lt;a href="#%e6%9b%b4%e6%96%b0" class="header-anchor"&gt;&lt;/a&gt;更新
&lt;/h3&gt;&lt;p&gt;在我完成上面的安装后，wsl 和 ubuntu 已经可以正常运行。&lt;/p&gt;
&lt;p&gt;在运行时，wsl 会提示更新。&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-4"&gt;&lt;a class="lnlinks" href="#hl-3-4"&gt;4&lt;/a&gt;
&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;适用于&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt; &lt;span class="n"&gt;的&lt;/span&gt; &lt;span class="n"&gt;Windows&lt;/span&gt; &lt;span class="n"&gt;子系统现已在&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&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;你可以通过运行&lt;/span&gt;&lt;span class="err"&gt;“&lt;/span&gt;&lt;span class="n"&gt;wsl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;exe&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;-update&lt;/span&gt;&lt;span class="err"&gt;”&lt;/span&gt;&lt;span class="n"&gt;或通过访问&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wslstorepage&lt;/span&gt; &lt;span class="n"&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;从&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt; &lt;span class="n"&gt;Store&lt;/span&gt; &lt;span class="n"&gt;安装&lt;/span&gt; &lt;span class="n"&gt;WSL&lt;/span&gt; &lt;span class="n"&gt;将可以更快地获取最新的&lt;/span&gt; &lt;span class="n"&gt;WSL&lt;/span&gt; &lt;span class="n"&gt;更新&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;有关详细信息&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;请访问&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wslstoreinfo&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;a href="#%e5%87%ba%e9%94%99" class="header-anchor"&gt;&lt;/a&gt;出错
&lt;/h3&gt;&lt;p&gt;在我执行&lt;code&gt;wsl.exe --update&lt;/code&gt;更新后，wsl 却无法运行了。&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;
&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;不支持此接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Error&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Wsl&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;0x80004002&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;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决方法
&lt;/h3&gt;&lt;p&gt;在开始菜单或者 Microsoft Store 卸载 &lt;code&gt;Windows Subsystem for Linux&lt;/code&gt; 即可。&lt;/p&gt;</description></item><item><title>Epic 批量撤回访问权限</title><link>https://www.lixx.org/a/e33d/</link><pubDate>Thu, 01 Jun 2023 16:22:24 +0000</pubDate><guid>https://www.lixx.org/a/e33d/</guid><description>&lt;p&gt;看到 Epic 里有很多第三方应用程序可以访问自己数据，有点不爽，写了小脚本批量取消访问权限。&lt;/p&gt;
&lt;p&gt;Epic&amp;ndash;应用与账户&amp;ndash;管理应用和绑定账户的许可
&lt;a class="link" href="https://www.epicgames.com/account/connections" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.epicgames.com/account/connections" data-u-e-text="https://www.epicgames.com/account/connections"&gt;https://www.epicgames.com/account/connections&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;根据 Epic 的描述:&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;您可选择将自己的 Epic Games 账户与第三方应用程序链接。您可随时撤销第三方访问您数据的权限。您的密码和付款详细信息决不会被透露给第三方应用程序。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;总所周知，epic 送了许多游戏。因此我在这个页面有很多应用。一个一个点击太麻烦了，于是随手用 JavaScript 写了小脚本&lt;strong&gt;批量&lt;/strong&gt;撤销&lt;strong&gt;全部&lt;/strong&gt;权限。&lt;/p&gt;
&lt;p&gt;由于我一下子全撤销成功了，所以代码没有充分测试。不保证一定能用。&lt;/p&gt;
&lt;h2 id="警告"&gt;&lt;a href="#%e8%ad%a6%e5%91%8a" class="header-anchor"&gt;&lt;/a&gt;警告
&lt;/h2&gt;&lt;p&gt;脚本会撤销&lt;strong&gt;全部&lt;/strong&gt;权限&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请谨慎操作！！&lt;/strong&gt; 一切后果自负&lt;/p&gt;
&lt;h2 id="使用方法"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;使用方法
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;浏览器打开 epic 并登录，打开&lt;code&gt;应用与账户&lt;/code&gt;页面&lt;a class="link" href="https://www.epicgames.com/account/connections" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://www.epicgames.com/account/connections" data-u-e-text="https://www.epicgames.com/account/connections"&gt;https://www.epicgames.com/account/connections&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;打开浏览器的&lt;code&gt;开发者工具&lt;/code&gt;(F12)&lt;/li&gt;
&lt;li&gt;切换至&lt;code&gt;控制台&lt;/code&gt;(&lt;code&gt;Console&lt;/code&gt;)，粘贴代码，回车运行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="代码"&gt;&lt;a href="#%e4%bb%a3%e7%a0%81" class="header-anchor"&gt;&lt;/a&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;
&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-JavaScript" data-lang="JavaScript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;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="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByClassName&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="s1"&gt;&amp;#39;MuiButtonBase-root MuiButton-root MuiButton-text MuiButton-textPrimary MuiButton-disableElevation&amp;#39;&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="nx"&gt;b&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 class="nx"&gt;click&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="nx"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&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="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;confirm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;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="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByClassName&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="s1"&gt;&amp;#39;MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary MuiButton-containedSizeLarge MuiButton-sizeLarge MuiButton-disableElevation&amp;#39;&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="nx"&gt;c&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 class="nx"&gt;click&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="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2000&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;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>无需桥接，机顶盒自带功能抓取 IPTV 节目源</title><link>https://www.lixx.org/a/e4dc/</link><pubDate>Tue, 31 Jan 2023 22:56:26 +0000</pubDate><guid>https://www.lixx.org/a/e4dc/</guid><description>&lt;p&gt;无需桥接、无需交换机，机顶盒自带抓包功能抓取 IPTV 节目源。&lt;/p&gt;
&lt;p&gt;网络上有很多关于抓取 IPTV 节目源的教程，他们大多需要使用交换机的镜像端口或者两张网卡桥接进行抓包，涉及到专门的设备和接线问题，操作起来还是有一定难度的。&lt;/p&gt;
&lt;p&gt;实际上，部分机顶盒可能自带抓包功能，可以无需接线、无需复杂的设置就能抓包。&lt;/p&gt;
&lt;p&gt;本文测试使用的机顶盒型号为 &lt;code&gt;中兴ZTE&lt;/code&gt; 的 &lt;code&gt;B860AV1T&lt;/code&gt; 。&lt;/p&gt;
&lt;h2 id="查看机顶盒是否有此项功能"&gt;&lt;a href="#%e6%9f%a5%e7%9c%8b%e6%9c%ba%e9%a1%b6%e7%9b%92%e6%98%af%e5%90%a6%e6%9c%89%e6%ad%a4%e9%a1%b9%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;查看机顶盒是否有此项功能
&lt;/h2&gt;&lt;p&gt;以 &lt;code&gt;ZTE_B860AV1T&lt;/code&gt; 为例，在 &lt;code&gt;设置 &amp;gt; 更多&lt;/code&gt; 页面中找到 &lt;code&gt;U盘抓日志&lt;/code&gt; 这个选项，能找到并能打开即说明有抓包功能。&lt;/p&gt;
&lt;p&gt;如果没有，那么本文不适合你的设备，请尝试其他抓包方法。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;我没有遇到密码。部分网友反馈进入设置需要密码，如果有密码，尝试 &lt;code&gt;1234&lt;/code&gt;, &lt;code&gt;123456&lt;/code&gt;, &lt;code&gt;0000&lt;/code&gt;, &lt;code&gt;000000&lt;/code&gt;, &lt;code&gt;10000&lt;/code&gt; 等简单密码。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/12174f53a404a36e4fc1dc5c56217271a4fa1e4122612ebabf3b5dc0e5eb7f20.webp" data-u-e-src="https://www.lixx.org/images/12174f53a404a36e4fc1dc5c56217271a4fa1e4122612ebabf3b5dc0e5eb7f20.webp"
	
	
	
	loading="lazy"
	
		alt="设置"
 data-u-e-alt="设置"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;设置&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/f132398d841dad0441c62dacd841c5e598f96d3e681ae7766f08f2ec9a0b6f84.webp" data-u-e-src="https://www.lixx.org/images/f132398d841dad0441c62dacd841c5e598f96d3e681ae7766f08f2ec9a0b6f84.webp"
	
	
	
	loading="lazy"
	
		alt="更多"
 data-u-e-alt="更多"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;更多&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/ab2fde930fe7f371d13f27036b39b228c6b874b794ba3e0df34546f29bfb85c0.webp" data-u-e-src="https://www.lixx.org/images/ab2fde930fe7f371d13f27036b39b228c6b874b794ba3e0df34546f29bfb85c0.webp"
	
	
	
	loading="lazy"
	
		alt="U盘抓日志"
 data-u-e-alt="U盘抓日志"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;U盘抓日志&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="所需设备"&gt;&lt;a href="#%e6%89%80%e9%9c%80%e8%ae%be%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;所需设备
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;U 盘（插在机顶盒上，用于存放抓包日志数据）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;IPTV 机顶盒&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;电脑\计算机 及 &lt;code&gt;Wireshark&lt;/code&gt; 软件 (读取抓包日志数据)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="抓包的具体操作步骤"&gt;&lt;a href="#%e6%8a%93%e5%8c%85%e7%9a%84%e5%85%b7%e4%bd%93%e6%93%8d%e4%bd%9c%e6%ad%a5%e9%aa%a4" class="header-anchor"&gt;&lt;/a&gt;抓包的具体操作步骤
&lt;/h2&gt;&lt;h3 id="1-关机拔网线插-u-盘"&gt;&lt;a href="#1-%e5%85%b3%e6%9c%ba%e6%8b%94%e7%bd%91%e7%ba%bf%e6%8f%92-u-%e7%9b%98" class="header-anchor"&gt;&lt;/a&gt;1. 关机，拔网线，插 U 盘
&lt;/h3&gt;&lt;p&gt;首先关闭 IPTV 机顶盒，拔掉 IPTV 机顶盒的网线，插入 U 盘。&lt;/p&gt;
&lt;h3 id="2-开机进入设置页面"&gt;&lt;a href="#2-%e5%bc%80%e6%9c%ba%e8%bf%9b%e5%85%a5%e8%ae%be%e7%bd%ae%e9%a1%b5%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;2. 开机，进入设置页面
&lt;/h3&gt;&lt;p&gt;此时开机，画面会出现转圈或者提示错误，无需理会，直接点击遥控器上的 &lt;code&gt;设置&lt;/code&gt; 按钮，进入设置界面。&lt;/p&gt;
&lt;h3 id="3-开启抓包功能"&gt;&lt;a href="#3-%e5%bc%80%e5%90%af%e6%8a%93%e5%8c%85%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;3. 开启抓包功能
&lt;/h3&gt;&lt;p&gt;在设置中找到抓包功能，并勾选以太网数据包，开启抓包。&lt;/p&gt;
&lt;h3 id="4-返回首页观看直播"&gt;&lt;a href="#4-%e8%bf%94%e5%9b%9e%e9%a6%96%e9%a1%b5%e8%a7%82%e7%9c%8b%e7%9b%b4%e6%92%ad" class="header-anchor"&gt;&lt;/a&gt;4. 返回首页，观看直播
&lt;/h3&gt;&lt;p&gt;点击遥控器上的 &lt;code&gt;首页&lt;/code&gt; 键或者 &lt;code&gt;返回&lt;/code&gt; 键，等待页面加载。&lt;/p&gt;
&lt;p&gt;点击 &lt;code&gt;直播&lt;/code&gt; 键，直到可以正常观看电视节目。&lt;/p&gt;
&lt;h3 id="5-停止抓包完成"&gt;&lt;a href="#5-%e5%81%9c%e6%ad%a2%e6%8a%93%e5%8c%85%e5%ae%8c%e6%88%90" class="header-anchor"&gt;&lt;/a&gt;5. 停止抓包，完成
&lt;/h3&gt;&lt;p&gt;进入 &lt;code&gt;设置&lt;/code&gt; 页面，点击停止抓包。&lt;/p&gt;
&lt;p&gt;至此抓包结束。正常操作下来，U 盘上就会出现 &lt;code&gt;.pcap00&lt;/code&gt; 的数据包。&lt;/p&gt;
&lt;p&gt;有这个文件，你就可以在 &lt;code&gt;Wireshark&lt;/code&gt; 软件中读取抓包日志。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;注意使用单分区的 U 盘。（多分区的 U 盘，如制作了 PE 的 U 盘会含有隐藏分区，你或你的机顶盒可能无法正确读取该 U 盘的数据）&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="提取节目源地址"&gt;&lt;a href="#%e6%8f%90%e5%8f%96%e8%8a%82%e7%9b%ae%e6%ba%90%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;提取节目源地址
&lt;/h2&gt;&lt;p&gt;后续步骤就是从 &lt;code&gt;.pcap00&lt;/code&gt; 日志数据包中提取节目源地址。&lt;/p&gt;
&lt;p&gt;关于提取节目源地址和使用节目源地址的方法，网上已经有很多文章了，这里不再赘述。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/90dadd120b30e8da9a2dbf83690492c3d4aeebc3dff015392d25be5027d64740.webp" data-u-e-src="https://www.lixx.org/images/90dadd120b30e8da9a2dbf83690492c3d4aeebc3dff015392d25be5027d64740.webp"
	
	
	
	loading="lazy"
	
		alt="iptv potplayer"
 data-u-e-alt="iptv potplayer"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;iptv potplayer&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;</description></item><item><title>Win10 无网络问题</title><link>https://www.lixx.org/a/30e6/</link><pubDate>Fri, 13 May 2022 21:40:36 +0000</pubDate><guid>https://www.lixx.org/a/30e6/</guid><description>&lt;p&gt;Windows10 能上网但显示未连接网络，任务栏显示小地球图标。&lt;/p&gt;
&lt;p&gt;之前用的是 Windows10 LTSC 2019, 最近升级了 Windows10 LTSC 2021. 就出现了右下角显示未连接网络的问题，但实际上网络是正常的。&lt;/p&gt;
&lt;h2 id="原因原理"&gt;&lt;a href="#%e5%8e%9f%e5%9b%a0%e5%8e%9f%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;原因、原理
&lt;/h2&gt;&lt;p&gt;问题都出在一个叫 &lt;code&gt;ncsi&lt;/code&gt; 的东西上，这是微软用来检测网络状况的一个工具。从注册表中可以看到检测方式有两种，一种是检测 DNS 连通状况，另一种是检测网页连通状况。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/a8d55ea2a86ae3a0ea7a94761976b5688c35a55e29afd071ce31083637217257.webp" data-u-e-src="https://www.lixx.org/images/a8d55ea2a86ae3a0ea7a94761976b5688c35a55e29afd071ce31083637217257.webp"
	
	
	
	loading="lazy"
	
		alt="regedit"
 data-u-e-alt="regedit"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;regedit&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;检测 &lt;code&gt;DnsProbeHost&lt;/code&gt; 的 DNS 返回值是否等于 &lt;code&gt;DnsProbeContent&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;检测 &lt;code&gt;http://${WebProbeHost}/${WebProbePath}&lt;/code&gt; 的 Response 返回值是否等于 &lt;code&gt;WebProbeContent&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="解决办法"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e5%8a%9e%e6%b3%95" class="header-anchor"&gt;&lt;/a&gt;解决办法
&lt;/h2&gt;&lt;h3 id="关闭检测功能不推荐不实用"&gt;&lt;a href="#%e5%85%b3%e9%97%ad%e6%a3%80%e6%b5%8b%e5%8a%9f%e8%83%bd%e4%b8%8d%e6%8e%a8%e8%8d%90%e4%b8%8d%e5%ae%9e%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;关闭检测功能(不推荐，不实用)
&lt;/h3&gt;&lt;p&gt;通过配置 &lt;code&gt;\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet&lt;/code&gt; 下的 &lt;code&gt;EnableActiveProbing&lt;/code&gt; 关闭这个检测功能。&lt;/p&gt;
&lt;p&gt;据网友反馈，这样操作，一些应用依然会认为计算机没有联网而无法使用。&lt;/p&gt;
&lt;h3 id="使用之前的检测地址"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e4%b9%8b%e5%89%8d%e7%9a%84%e6%a3%80%e6%b5%8b%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;使用之前的检测地址
&lt;/h3&gt;&lt;p&gt;微软在某次更新中，使用了新的检测地址。而有一段时间这个检测地址被国内网络屏蔽了，导致 Windows 错误地提示未连接到互联网。不过现在应该已经解除屏蔽了。&lt;/p&gt;
&lt;p&gt;上方图片即为之前的检测配置，对照修改就可。&lt;/p&gt;
&lt;p&gt;下面为导出的 &lt;code&gt;.reg&lt;/code&gt; 注册表项，可复制粘贴保存为 &lt;code&gt;.reg&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt; 1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt; 2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-3"&gt;&lt;a class="lnlinks" href="#hl-0-3"&gt; 3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-4"&gt;&lt;a class="lnlinks" href="#hl-0-4"&gt; 4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-5"&gt;&lt;a class="lnlinks" href="#hl-0-5"&gt; 5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-6"&gt;&lt;a class="lnlinks" href="#hl-0-6"&gt; 6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-7"&gt;&lt;a class="lnlinks" href="#hl-0-7"&gt; 7&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-8"&gt;&lt;a class="lnlinks" href="#hl-0-8"&gt; 8&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-9"&gt;&lt;a class="lnlinks" href="#hl-0-9"&gt; 9&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-10"&gt;&lt;a class="lnlinks" href="#hl-0-10"&gt;10&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-11"&gt;&lt;a class="lnlinks" href="#hl-0-11"&gt;11&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-12"&gt;&lt;a class="lnlinks" href="#hl-0-12"&gt;12&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-13"&gt;&lt;a class="lnlinks" href="#hl-0-13"&gt;13&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-14"&gt;&lt;a class="lnlinks" href="#hl-0-14"&gt;14&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-15"&gt;&lt;a class="lnlinks" href="#hl-0-15"&gt;15&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-16"&gt;&lt;a class="lnlinks" href="#hl-0-16"&gt;16&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-17"&gt;&lt;a class="lnlinks" href="#hl-0-17"&gt;17&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-18"&gt;&lt;a class="lnlinks" href="#hl-0-18"&gt;18&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-19"&gt;&lt;a class="lnlinks" href="#hl-0-19"&gt;19&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-20"&gt;&lt;a class="lnlinks" href="#hl-0-20"&gt;20&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-21"&gt;&lt;a class="lnlinks" href="#hl-0-21"&gt;21&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-22"&gt;&lt;a class="lnlinks" href="#hl-0-22"&gt;22&lt;/a&gt;
&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-reg" data-lang="reg"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Windows Registry Editor Version 5.00
&lt;/span&gt;&lt;/span&gt;&lt;span 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;[&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;ActiveDnsProbeContent&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;131.107.255.255&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;ActiveDnsProbeContentV6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fd3e:4f5a:5b81::1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;ActiveDnsProbeHost&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dns.msftncsi.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="na"&gt;&amp;#34;ActiveDnsProbeHostV6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dns.msftncsi.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="na"&gt;&amp;#34;ActiveWebProbeContent&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Microsoft NCSI&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;ActiveWebProbeContentV6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Microsoft NCSI&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;ActiveWebProbeHost&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;www.msftncsi.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="na"&gt;&amp;#34;ActiveWebProbeHostV6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ipv6.msftncsi.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="na"&gt;&amp;#34;ActiveWebProbePath&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ncsi.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="na"&gt;&amp;#34;ActiveWebProbePathV6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ncsi.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="na"&gt;&amp;#34;CaptivePortalTimer&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00000000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;CaptivePortalTimerBackOffIncrementsInSeconds&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00000005&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;CaptivePortalTimerMaxInSeconds&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0000001e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;EnableActiveProbing&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00000001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;PassivePollPeriod&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0000000f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;StaleThreshold&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;0000001e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;&amp;#34;WebTimeout&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;dword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;00000023&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;[&lt;/span&gt;&lt;span class="nb"&gt;HKEY_LOCAL_MACHINE&lt;/span&gt;&lt;span class="k"&gt;\SYSTEM\CurrentControlSet\Services\NlaSvc\Parameters\Internet\ManualProxies]&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;a href="#%e8%af%8a%e6%96%ad%e7%bd%91%e7%bb%9c" class="header-anchor"&gt;&lt;/a&gt;诊断网络
&lt;/h3&gt;&lt;p&gt;一直以为 window 的诊断功能是没有作用的。但据一些网友反馈，前面两种方法都没有作用，使用诊断网络修复后却正常了。&lt;/p&gt;
&lt;h3 id="修改-host-文件"&gt;&lt;a href="#%e4%bf%ae%e6%94%b9-host-%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;修改 Host 文件
&lt;/h3&gt;&lt;p&gt;这是我遇到的情况，以上几种方法都尝试无果。&lt;/p&gt;
&lt;p&gt;一番折腾后发现使用 &lt;code&gt;AdGuardHome&lt;/code&gt; 的 dns 服务时，会提示未联网。但是使用自动 Dns 时，则不会提示。因此猜测是与 &lt;code&gt;AdGuardHome&lt;/code&gt; 冲突了。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt; 中添加&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-hosts" data-lang="hosts"&gt;131.107.255.255 dns.msftncsi.com
fd3e:4f5a:5b81::1 dns.msftncsi.com
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;自此问题解决&lt;/p&gt;
&lt;h3 id="替换检测地址"&gt;&lt;a href="#%e6%9b%bf%e6%8d%a2%e6%a3%80%e6%b5%8b%e5%9c%b0%e5%9d%80" class="header-anchor"&gt;&lt;/a&gt;替换检测地址
&lt;/h3&gt;&lt;p&gt;根据检测的原理，可以选择合适的域名和网站替换掉微软的检测地址。&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;th&gt;默认值&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DnsProbeHost&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dns 检测地址&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dns.msftncsi.com&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;DnsProbeContent&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;dns 解析结果&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;131.107.255.255&lt;/code&gt;, &lt;code&gt;fd3e:4f5a:5b81::1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;mdash;&lt;/td&gt;
 &lt;td&gt;&amp;mdash;&lt;/td&gt;
 &lt;td&gt;&amp;mdash;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WebProbeHost&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;web 检测域名&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;www.msftncsi.com&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WebProbePath&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;web 检测路径&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ncsi.txt&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&amp;mdash;&lt;/td&gt;
 &lt;td&gt;完整的检测地址&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;http://www.msftncsi.com/ncsi.txt&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;WebProbeContent&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;检测地址返回的内容&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Microsoft NCSI&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;例如 &lt;code&gt;dns.alidns.com&lt;/code&gt; 的 DNS 解析结果为 &lt;code&gt;2400:3200::1, 2400:3200:baba::1, 223.5.5.5, 223.6.6.6&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;自行折腾去吧。&lt;/p&gt;
&lt;h2 id="end"&gt;&lt;a href="#end" class="header-anchor"&gt;&lt;/a&gt;end
&lt;/h2&gt;&lt;p&gt;个人猜测这个东西和安卓系统上面的网络叹号是类似的。但是谷歌的那个检测地址是被墙了。&lt;/p&gt;</description></item><item><title>头部跟踪 / 头瞄简单总结</title><link>https://www.lixx.org/a/6435/</link><pubDate>Tue, 10 May 2022 16:32:47 +0000</pubDate><guid>https://www.lixx.org/a/6435/</guid><description>&lt;p&gt;国内似乎对头瞄的使用不多，淘宝上的结果也很少。简单记录我了解到的一些头瞄方法。&lt;/p&gt;
&lt;h2 id="人脸识别"&gt;&lt;a href="#%e4%ba%ba%e8%84%b8%e8%af%86%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;人脸识别
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/AIRLegend/aitrack" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/AIRLegend/aitrack" data-u-e-text="https://github.com/AIRLegend/aitrack"&gt;https://github.com/AIRLegend/aitrack&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/xuhao1/FOXTracker" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/xuhao1/FOXTracker" data-u-e-text="https://github.com/xuhao1/FOXTracker"&gt;https://github.com/xuhao1/FOXTracker&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;通过摄像头采集人脸，配合 opentrack 使用。实测 cpu 占用较高，电脑配置低的话会影响游戏，运行较慢。&lt;/p&gt;
&lt;h3 id="iphone-face-id"&gt;&lt;a href="#iphone-face-id" class="header-anchor"&gt;&lt;/a&gt;iPhone Face ID
&lt;/h3&gt;&lt;p&gt;据万能的网友，iPhone 的 face id 也能用来做人脸识别，而且得益于 iPhone 的人脸识别硬件，识别能力更强。&lt;/p&gt;
&lt;h2 id="aruco-码"&gt;&lt;a href="#aruco-%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;Aruco 码
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://github.com/opentrack/opentrack" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/opentrack/opentrack" data-u-e-text="https://github.com/opentrack/opentrack"&gt;https://github.com/opentrack/opentrack&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/e67524218a736a240ce465e1aae7afd3b47e5dc12e2b75a957e10726cd614895.webp" data-u-e-src="https://www.lixx.org/images/e67524218a736a240ce465e1aae7afd3b47e5dc12e2b75a957e10726cd614895.webp"
	
	
	
	loading="lazy"
	
		alt="Aruco码"
 data-u-e-alt="Aruco码"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Aruco码&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;将 Aruco 码打印并固定在头上，通过摄像头识别 Aruco 码，配合 opentrack 使用。cpu 占用较低，效果也比人脸识别要好。&lt;/p&gt;
&lt;h2 id="红外识别"&gt;&lt;a href="#%e7%ba%a2%e5%a4%96%e8%af%86%e5%88%ab" class="header-anchor"&gt;&lt;/a&gt;红外识别
&lt;/h2&gt;&lt;p&gt;自制有一定技术门槛，国内似乎没有商家专门做这样的产品，我找到的只有 trackir 的山寨版。简单来说就是使用几颗红外光 led 灯珠发射红外光，摄像头根据几点红外计算头部的运动情况，又分为主动红外和被动红外。动手能力强的值得一试，成本也不高。&lt;/p&gt;
&lt;h2 id="传感器"&gt;&lt;a href="#%e4%bc%a0%e6%84%9f%e5%99%a8" class="header-anchor"&gt;&lt;/a&gt;传感器
&lt;/h2&gt;&lt;p&gt;前面介绍的都是通过摄像头采集信息，因此存在一定的使用范围，例如头部转动范围不能太大、效果会受环境光影响。&lt;/p&gt;
&lt;p&gt;而传感器则没有这些限制，网上有人使用手机软件配合 opentrack 实现头部跟踪。&lt;/p&gt;
&lt;p&gt;也有商业的产品，不过价格较高，不予考虑。&lt;/p&gt;
&lt;p&gt;据网友的评价传感器的方式会发生偏移的情况，效果不是很理想。&lt;/p&gt;</description></item><item><title>使用 `gpg` 生成密钥以及对 git commit 签名</title><link>https://www.lixx.org/a/4cc3/</link><pubDate>Thu, 10 Feb 2022 16:09:57 +0000</pubDate><guid>https://www.lixx.org/a/4cc3/</guid><description>&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/e43d7ac3ec29972bac18a2d7d7be06bb02a9e5b88b770003410dc70e616b0065.webp" data-u-e-src="https://www.lixx.org/images/e43d7ac3ec29972bac18a2d7d7be06bb02a9e5b88b770003410dc70e616b0065.webp"
	
	
	
	loading="lazy"
	
		alt="Signed Commit"
 data-u-e-alt="Signed Commit"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;Signed Commit&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;p&gt;Github 的 Commits 记录中的绿色 &amp;ldquo;Verified&amp;rdquo; 挺好看的，整一个。&lt;/p&gt;
&lt;p&gt;使用 GPG Key 对 commit 签名即可在 Commits 记录中显示绿色 &amp;ldquo;Verified&amp;rdquo;。本文以 Github 为例。&lt;/p&gt;
&lt;h2 id="环境"&gt;&lt;a href="#%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;环境
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git version 2.35.1.windows.2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpg (GnuPG) 2.2.29-unknown&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;windows 的 git 自带了 gpg, 无需单独下载安装。其他平台可能需要手动下载安装。&lt;/p&gt;
&lt;h2 id="生成-gpg-key"&gt;&lt;a href="#%e7%94%9f%e6%88%90-gpg-key" class="header-anchor"&gt;&lt;/a&gt;生成 GPG Key
&lt;/h2&gt;&lt;ol&gt;
&lt;li&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&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;gpg --full-generate-key
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 key 类型，根据 Github 文档推荐选择默认，直接 enter。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;Please select what kind of key you want:
 (1) RSA and RSA (default)
 (2) DSA and Elgamal
 (3) DSA (sign only)
 (4) RSA (sign only)
(14) Existing key from card
Your selection?
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;选择 RSA 长度，根据 Github 文档推荐选择 &lt;code&gt;4096&lt;/code&gt;。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-4"&gt;&lt;a class="lnlinks" href="#hl-3-4"&gt;4&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-5"&gt;&lt;a class="lnlinks" href="#hl-3-5"&gt;5&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-6"&gt;&lt;a class="lnlinks" href="#hl-3-6"&gt;6&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-7"&gt;&lt;a class="lnlinks" href="#hl-3-7"&gt;7&lt;/a&gt;
&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;Please specify how long the key should be valid.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; key does not expire
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt; &lt;span class="o"&gt;=&lt;/span&gt; key expires in n days
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;w &lt;span class="o"&gt;=&lt;/span&gt; key expires in n weeks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;m &lt;span class="o"&gt;=&lt;/span&gt; key expires in n months
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &amp;lt;n&amp;gt;y &lt;span class="o"&gt;=&lt;/span&gt; key expires in n years
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Key is valid &lt;span class="k"&gt;for&lt;/span&gt;? &lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt; 1y
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;输入名字和邮箱，注意邮箱必须使用 Github 绑定的邮箱，否则在 Github 中会提示验证失败。如果开启了 Github 的 “Keep my email addresses private” 功能，则必须使用 Github 提供 &lt;code&gt;&amp;lt;id&amp;gt;-&amp;lt;username&amp;gt;@users.noreply.github.com&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" id="hl-4-1"&gt;&lt;a class="lnlinks" href="#hl-4-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-2"&gt;&lt;a class="lnlinks" href="#hl-4-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-3"&gt;&lt;a class="lnlinks" href="#hl-4-3"&gt;3&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-4-4"&gt;&lt;a class="lnlinks" href="#hl-4-4"&gt;4&lt;/a&gt;
&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;GnuPG needs to construct a user ID to identify your key.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Real name: lixx.org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Email address: lixx@test.org
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Comment:
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;信息无误则输入 &lt;code&gt;O&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" id="hl-5-1"&gt;&lt;a class="lnlinks" href="#hl-5-1"&gt;1&lt;/a&gt;
&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;Change &lt;span class="o"&gt;(&lt;/span&gt;N&lt;span class="o"&gt;)&lt;/span&gt;ame, &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt;omment, &lt;span class="o"&gt;(&lt;/span&gt;E&lt;span class="o"&gt;)&lt;/span&gt;mail or &lt;span class="o"&gt;(&lt;/span&gt;O&lt;span class="o"&gt;)&lt;/span&gt;kay/&lt;span class="o"&gt;(&lt;/span&gt;Q&lt;span class="o"&gt;)&lt;/span&gt;uit? o
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;输入安全口令。&lt;/p&gt;
&lt;p&gt;建议设置密码，以保护 GPG Key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;完成生成。&lt;/p&gt;
&lt;p&gt;记录 16 位的 key id，例如我这里是 &lt;code&gt;71C5EA31976DCC31&lt;/code&gt;。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

gpg: key &amp;#39;71C5EA31976DCC31&amp;#39; marked as ultimately trusted
gpg: revocation certificate stored as &amp;#39;/c/Users/lixx/.gnupg/openpgp-revocs.d/681E61312333B6D9CC0A219771C5EA31976DCC31.rev&amp;#39;
public and secret key created and signed.

pub rsa4096 2022-02-10 [SC] [expires: 2023-02-10]
 681E61312333B6D9CC0A219771C5EA31976DCC31
uid lixx.org &amp;lt;lixx@test.org&amp;gt;
sub rsa4096 2022-02-10 [E] [expires: 2023-02-10]
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="输出-gpg-公钥"&gt;&lt;a href="#%e8%be%93%e5%87%ba-gpg-%e5%85%ac%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;输出 GPG 公钥
&lt;/h2&gt;&lt;p&gt;使用 &lt;code&gt;gpg --armor --export &amp;lt;key-id&amp;gt;&lt;/code&gt; 输出公钥，我的 key-id 为 &lt;code&gt;71C5EA31976DCC31&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" id="hl-7-1"&gt;&lt;a class="lnlinks" href="#hl-7-1"&gt;1&lt;/a&gt;
&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;gpg --armor --export 71C5EA31976DCC31
&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;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----
.
.
.
-----END PGP PUBLIC KEY BLOCK-----
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="添加公钥到-github"&gt;&lt;a href="#%e6%b7%bb%e5%8a%a0%e5%85%ac%e9%92%a5%e5%88%b0-github" class="header-anchor"&gt;&lt;/a&gt;添加公钥到 Github
&lt;/h2&gt;&lt;p&gt;将上面得到的公钥添加到 Github &lt;a class="link" href="https://github.com/settings/keys" target="_blank" rel="noopener"
 data-u-e="a" data-u-e-url="https://github.com/settings/keys" data-u-e-text="账户设置"&gt;账户设置&lt;/a&gt;
的 GPG keys 中。&lt;/p&gt;
&lt;h2 id="设置-git"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae-git" class="header-anchor"&gt;&lt;/a&gt;设置 Git
&lt;/h2&gt;&lt;h3 id="使用命令行进行设置"&gt;&lt;a href="#%e4%bd%bf%e7%94%a8%e5%91%bd%e4%bb%a4%e8%a1%8c%e8%bf%9b%e8%a1%8c%e8%ae%be%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;使用命令行进行设置
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在 Git 中设置要使用哪一个 GPG Key 的 id，我这里是 &lt;code&gt;71C5EA31976DCC31&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" id="hl-9-1"&gt;&lt;a class="lnlinks" href="#hl-9-1"&gt;1&lt;/a&gt;
&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;git config --global user.signingkey 71C5EA31976DCC31
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 Git 用户名和邮箱。邮箱必须和 GPG Key 填写的邮箱以及 Github 绑定的邮箱相同，&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" id="hl-10-1"&gt;&lt;a class="lnlinks" href="#hl-10-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-10-2"&gt;&lt;a class="lnlinks" href="#hl-10-2"&gt;2&lt;/a&gt;
&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;git config --global user.name lixx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email lixx@test.org
&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;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 Git 默认对 commit 进行 GPG 签名。(如果你需要)&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" id="hl-11-1"&gt;&lt;a class="lnlinks" href="#hl-11-1"&gt;1&lt;/a&gt;
&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;git config --global commit.gpgsign &lt;span class="nb"&gt;true&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;/li&gt;
&lt;li&gt;
&lt;p&gt;设置 Git 默认对 tag 进行 GPG 签名。(如果你需要)&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" id="hl-12-1"&gt;&lt;a class="lnlinks" href="#hl-12-1"&gt;1&lt;/a&gt;
&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;git config --global tag.gpgsign &lt;span class="nb"&gt;true&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;/li&gt;
&lt;/ul&gt;
&lt;h3 id="直接设置-gitconfig"&gt;&lt;a href="#%e7%9b%b4%e6%8e%a5%e8%ae%be%e7%bd%ae-gitconfig" class="header-anchor"&gt;&lt;/a&gt;直接设置 &lt;code&gt;gitconfig&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;除了使用 &lt;code&gt;git config&lt;/code&gt; 命令，也可以直接编辑 &lt;code&gt;gitconfig&lt;/code&gt;，更为直观快捷。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全局 &lt;code&gt;gitconfig&lt;/code&gt;: &lt;code&gt;~/.gitconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;项目 &lt;code&gt;gitconfig&lt;/code&gt;: &lt;code&gt;./.git/config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;[user]
 name = lixx
 email = lixx@test.org
 signingkey = 681E61312333B6D9CC0A219771C5EA31976DCC31
[commit]
 gpgsign = true
[tag]
 gpgsign = true
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="提交-commit"&gt;&lt;a href="#%e6%8f%90%e4%ba%a4-commit" class="header-anchor"&gt;&lt;/a&gt;提交 Commit
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;若没有开启默认对 commit 签名, 则需要使用 &lt;code&gt;-S&lt;/code&gt; 参数对单个 commit 进行签名。&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" id="hl-14-1"&gt;&lt;a class="lnlinks" href="#hl-14-1"&gt;1&lt;/a&gt;
&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;git commit -S -m &lt;span class="s2"&gt;&amp;#34;message_of_commit&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;ul&gt;
&lt;li&gt;若已开启默认对 commit 签名，直接 commit 即可。&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" id="hl-15-1"&gt;&lt;a class="lnlinks" href="#hl-15-1"&gt;1&lt;/a&gt;
&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;git commit -m &lt;span class="s2"&gt;&amp;#34;message_of_commit&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;ul&gt;
&lt;li&gt;
&lt;p&gt;然后需要输入生成 GPG Key 时设置的安全口令（如果有设置）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; 推送到 Github 后，即可在网页 Commits History 中看到绿色的 &lt;code&gt;Verified&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="额外"&gt;&lt;a href="#%e9%a2%9d%e5%a4%96" class="header-anchor"&gt;&lt;/a&gt;额外
&lt;/h2&gt;&lt;h3 id="常用指令"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8%e6%8c%87%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;常用指令
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看已存在的私钥 &lt;code&gt;gpg --list-secret-keys --keyid-format=long&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;查看已存在的公钥 &lt;code&gt;gpg --list-keys --keyid-format=long&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除私钥 &lt;code&gt;gpg --delete-secret-keys &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;删除公钥 &lt;code&gt;gpg --delete-keys &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;输出公钥(ascii 格式) &lt;code&gt;gpg --armor --export &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="提示"&gt;&lt;a href="#%e6%8f%90%e7%a4%ba" class="header-anchor"&gt;&lt;/a&gt;提示
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;文中提到的 &lt;code&gt;key id&lt;/code&gt; 既可以使用 16 位的短 id，也可以使用 40 位的长 id。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;建议设置口令和有效期，降低 GPG 密钥丢失的危害。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;~/.gnupg/&lt;/code&gt; 文件夹需妥善保管。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;命令行操作生成 GPG key 还是有一点繁琐的，建议使用 GPG GUI 更为方便，例如 “Kleopatra”。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>在 Github 和 Gitee 配置多个 SSH Key</title><link>https://www.lixx.org/a/b5d1/</link><pubDate>Thu, 10 Feb 2022 15:03:55 +0000</pubDate><guid>https://www.lixx.org/a/b5d1/</guid><description>&lt;p&gt;为 Github 和 Gitee 生成、添加、部署不同的 SSH Key。&lt;/p&gt;
&lt;h2 id="环境"&gt;&lt;a href="#%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;环境
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;git version 2.35.1.windows.2&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="生成-ssh-key"&gt;&lt;a href="#%e7%94%9f%e6%88%90-ssh-key" class="header-anchor"&gt;&lt;/a&gt;生成 SSH Key
&lt;/h2&gt;&lt;p&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" id="hl-0-1"&gt;&lt;a class="lnlinks" href="#hl-0-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-0-2"&gt;&lt;a class="lnlinks" href="#hl-0-2"&gt;2&lt;/a&gt;
&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;ssh-keygen -t ed25519 -f ~/.ssh/github_ed25519 -C &lt;span class="s2"&gt;&amp;#34;Github-220210&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh-keygen -t ed25519 -f ~/.ssh/gitee_ed25519 -C &lt;span class="s2"&gt;&amp;#34;Gitee-220210&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;code&gt;-t&lt;/code&gt; 指定密钥的类型，这里选择 github 和 gitee 文档中都使用的 &lt;code&gt;ed25519&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-f&lt;/code&gt; 指定密钥生成的目录和文件名，Windows 平台 ssh 的默认目录为&lt;code&gt;USER/.ssh/&lt;/code&gt;, 文件名可以按需修改。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;-C &amp;quot;comment&amp;quot;&lt;/code&gt; 中的 &lt;code&gt;comment&lt;/code&gt; 根据自己的需要随意修改，只是作为一个标识。&lt;/p&gt;
&lt;h2 id="配置-ssh-config"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae-ssh-config" class="header-anchor"&gt;&lt;/a&gt;配置 SSH Config
&lt;/h2&gt;&lt;p&gt;在 ssh 目录 &lt;code&gt;~/.ssh/&lt;/code&gt; 中新建一个 &lt;code&gt;config&lt;/code&gt; 文件，添加内容：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-conf" data-lang="conf"&gt;# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/github_ed25519

# gitee
Host gitee.com
HostName gitee.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/gitee_ed25519
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;Host&lt;/code&gt;, &lt;code&gt;Hostname&lt;/code&gt; 填写 Git 服务器域名。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;IdentityFile&lt;/code&gt; 填写 SSH Key 私钥文件的位置。&lt;/p&gt;
&lt;h2 id="配置-ssh-key-公钥"&gt;&lt;a href="#%e9%85%8d%e7%bd%ae-ssh-key-%e5%85%ac%e9%92%a5" class="header-anchor"&gt;&lt;/a&gt;配置 SSH Key 公钥
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;~/.ssh/&lt;/code&gt; 目录中找到对应的 &lt;code&gt;*.pub&lt;/code&gt; 文件，复制其中的内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 Github, Gitee 网站的 &lt;code&gt;SSH keys&lt;/code&gt; 设置中添加相应的公钥。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="测试-ssh-连接"&gt;&lt;a href="#%e6%b5%8b%e8%af%95-ssh-%e8%bf%9e%e6%8e%a5" class="header-anchor"&gt;&lt;/a&gt;测试 SSH 连接
&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" id="hl-2-1"&gt;&lt;a class="lnlinks" href="#hl-2-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-2-2"&gt;&lt;a class="lnlinks" href="#hl-2-2"&gt;2&lt;/a&gt;
&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;ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ssh -T git@gitee.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 已经连接成功.&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" id="hl-3-1"&gt;&lt;a class="lnlinks" href="#hl-3-1"&gt;1&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-2"&gt;&lt;a class="lnlinks" href="#hl-3-2"&gt;2&lt;/a&gt;
&lt;/span&gt;&lt;span class="lnt" id="hl-3-3"&gt;&lt;a class="lnlinks" href="#hl-3-3"&gt;3&lt;/a&gt;
&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-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hi Lixx! You&amp;#39;ve successfully authenticated, but GitHub does not provide shell access.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hi Lixx! You&amp;#39;ve successfully authenticated, but GITEE.COM does not provide shell access.
&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="end"&gt;&lt;a href="#end" class="header-anchor"&gt;&lt;/a&gt;End
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;本文分别在 GitHub 和 Gitee 上配置了不同的 SSH Key(当然也可以配置相同的 SSH Key，但不推荐)， 在其他 Git 服务器配置更多 SSH Key 的操作也是类似的。&lt;/li&gt;
&lt;li&gt;对于 Github, 我建议使用 Github 的官方命令行 Github CLI（&lt;code&gt;gh&lt;/code&gt;），可以快捷自动设置 SSH key、自动设置 https 仓库的凭据，非常方便。&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>域名一定要设置邮箱反垃圾规则</title><link>https://www.lixx.org/a/2399/</link><pubDate>Fri, 28 Jan 2022 19:02:28 +0000</pubDate><guid>https://www.lixx.org/a/2399/</guid><description>&lt;p&gt;如果你有域名，不管是否使用域名邮箱，都要给域名设置反垃圾规则。&lt;/p&gt;
&lt;h2 id="为什么要做反垃圾"&gt;&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e5%81%9a%e5%8f%8d%e5%9e%83%e5%9c%be" class="header-anchor"&gt;&lt;/a&gt;为什么要做反垃圾
&lt;/h2&gt;&lt;p&gt;以前不懂域名邮箱，开通之后就不管了。后来收到很多的退信通知，才意识到我的域名邮箱被伪造冒充用于发送大量垃圾邮件。&lt;/p&gt;
&lt;p&gt;自己的个人邮箱也常常被垃圾邮件骚扰，没想到自己也成了垃圾邮件的帮凶。&lt;/p&gt;
&lt;p&gt;另外自己的域名邮箱被伪造用来发送大量的垃圾邮件，也担心自己域名会被各邮件服务商拉进黑名单&lt;/p&gt;
&lt;p&gt;因此如果你也有域名，不管是否使用域名邮箱，都要给域名设置反垃圾规则。&lt;/p&gt;
&lt;p&gt;&lt;figure class="gallery-image"&gt;&lt;img src="https://www.lixx.org/images/605f2439e752f34404ef179d0b70a4173ec79b86c2ed1f3b33c0ac3082023d1a.webp" data-u-e-src="https://www.lixx.org/images/605f2439e752f34404ef179d0b70a4173ec79b86c2ed1f3b33c0ac3082023d1a.webp"
	
	
	
	loading="lazy"
	
		alt="reject"
 data-u-e-alt="reject"

	
	
	data-zoomable
 data-u-e="img"
&gt;
&lt;figcaption&gt;reject&lt;/figcaption&gt;

&lt;/figure&gt;&lt;/p&gt;
&lt;h2 id="域名邮箱反垃圾规则"&gt;&lt;a href="#%e5%9f%9f%e5%90%8d%e9%82%ae%e7%ae%b1%e5%8f%8d%e5%9e%83%e5%9c%be%e8%a7%84%e5%88%99" class="header-anchor"&gt;&lt;/a&gt;域名邮箱反垃圾规则
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;SPF&lt;/p&gt;
&lt;p&gt;发件人策略框架或 SPF 允许您指定被允许代表您的域发送电子邮件的所有 IP 地址和主机名。如果您没有在域中配置 SPF，您的电子邮件可能会被电子邮件接收者阻止或标记为垃圾邮件。(来自 Cloudflare)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DMARC&lt;/p&gt;
&lt;p&gt;基于域的消息身份验证报告和一致性（或称 DMARC）告诉电子邮件接收者如何处理来自您的域的未通过电子邮件安全检查的传入电子邮件。您还可以指定一个报告电子邮件地址，来接收有关您的域中传出电子邮件的定期报告。(来自 Cloudflare)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;DKIM&lt;/p&gt;
&lt;p&gt;域密钥识别邮件（或称 DKIM）将公钥添加到您的 DNS 中，供电子邮件接收者验证您的传出签名电子邮件。(来自 Cloudflare)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单来说，&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这些规则是告诉收信方如何识别我方的邮件。&lt;/li&gt;
&lt;li&gt;SPF 规则规定哪些服务器或 IP 可以使用该域名邮箱发送邮件。&lt;/li&gt;
&lt;li&gt;DKIM 可以理解为使用非对称加密对邮件进行签名。&lt;/li&gt;
&lt;li&gt;DMARC 规则则是告诉收信方如何处理未通过验证的邮件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;这三个规则都是通过 DNS 记录中的 TXT 记录实现&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="spf"&gt;&lt;a href="#spf" class="header-anchor"&gt;&lt;/a&gt;SPF
&lt;/h2&gt;&lt;h3 id="组成部分"&gt;&lt;a href="#%e7%bb%84%e6%88%90%e9%83%a8%e5%88%86" class="header-anchor"&gt;&lt;/a&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;v&lt;/td&gt;
 &lt;td&gt;版本，必须放在第一项&lt;/td&gt;
 &lt;td&gt;一般为 &lt;code&gt;spf1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;include&lt;/td&gt;
 &lt;td&gt;发信服务器域名&lt;/td&gt;
 &lt;td&gt;可不填&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ip4&lt;/td&gt;
 &lt;td&gt;发信服务器 ipv4 地址&lt;/td&gt;
 &lt;td&gt;可不填&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ip6&lt;/td&gt;
 &lt;td&gt;发信服务器 ipv6 地址&lt;/td&gt;
 &lt;td&gt;可不填&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;all&lt;/td&gt;
 &lt;td&gt;告知收信方如何处理从未列出的服务器发送的电子邮件（这个参数必须在最后）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;-all&lt;/code&gt; 表示从未列出的服务器发送的电子邮件应会被拒绝。&lt;!-- raw HTML omitted --&gt; &lt;code&gt;~all&lt;/code&gt; 表示从未列出的服务器发送的电子邮件应会被接受，但可能会被标记为垃圾邮件或不安全。&lt;!-- raw HTML omitted --&gt; &lt;code&gt;+all&lt;/code&gt; 表示收件人将接受所有电子邮件，即使验证失败。&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;SPF 记录中不能包含大写字母&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="示例"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b" class="header-anchor"&gt;&lt;/a&gt;示例
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;如果不使用域名邮箱，（使用该规则会让收信方拒绝一切发信人为 &lt;code&gt;&amp;quot;*@lixx.org&amp;quot;&lt;/code&gt; 的邮件。）&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DNS 记录&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;TXT&lt;/td&gt;
 &lt;td&gt;lixx.org&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=spf1 -all&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以腾讯企业邮箱为例（其他邮箱可在相应的邮件服务商获取相关的规则）&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DNS 记录&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;TXT&lt;/td&gt;
 &lt;td&gt;lixx.org&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=spf1 include:spf.mail.qq.com -all&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;如果是自建邮箱服务器，应该在 &lt;code&gt;include&lt;/code&gt; 或 &lt;code&gt;ip4&lt;/code&gt; 或 &lt;code&gt;ip6&lt;/code&gt; 中包含自己服务器的地址&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;值得一骂的是，腾讯企业邮箱的文档中，使用的是 &lt;code&gt;~all&lt;/code&gt; ，也就是说不符合 SPF 规则的邮件还是会可能被收信方邮局接收。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dmarc"&gt;&lt;a href="#dmarc" class="header-anchor"&gt;&lt;/a&gt;DMARC
&lt;/h2&gt;&lt;h3 id="组成部分-1"&gt;&lt;a href="#%e7%bb%84%e6%88%90%e9%83%a8%e5%88%86-1" class="header-anchor"&gt;&lt;/a&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;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;v&lt;/td&gt;
 &lt;td&gt;版本，必须放在第一项&lt;/td&gt;
 &lt;td&gt;一般为 &lt;code&gt;DMARC1&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;p&lt;/td&gt;
 &lt;td&gt;收信方服务器对未通过验证的电子邮件采取的操作。&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;none&lt;/code&gt; 无操作&lt;!-- raw HTML omitted --&gt; &lt;code&gt;quarantine&lt;/code&gt; 软接收，可能会被标记为垃圾邮件或可疑邮件&lt;!-- raw HTML omitted --&gt; &lt;code&gt;reject&lt;/code&gt; 拒绝接收&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;aspf&lt;/td&gt;
 &lt;td&gt;严格的或者宽松的 SPF 身份校验模式&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;r&lt;/code&gt; 默认值，宽松&lt;!-- raw HTML omitted --&gt; &lt;code&gt;s&lt;/code&gt; 严格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;adkim&lt;/td&gt;
 &lt;td&gt;严格的或者宽松的 DKIM 身份校验模式&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;r&lt;/code&gt; 默认值，宽松&lt;!-- raw HTML omitted --&gt; &lt;code&gt;s&lt;/code&gt; 严格&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;rua&lt;/td&gt;
 &lt;td&gt;接受 DMARC 报告的邮箱地址，收信方会反馈与你的域名邮箱有关的发信活动&lt;/td&gt;
 &lt;td&gt;可不填，建议使用专门的邮件地址&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="示例-1"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b-1" class="header-anchor"&gt;&lt;/a&gt;示例
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;该记录表示，未通过 SPF 验证或 DKIM 验证的邮件均会被收信方拒收，收信方会向 &lt;code&gt;dmarc@test.org&lt;/code&gt; 发送聚合 DMARC 报告。&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DNS 记录&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;TXT&lt;/td&gt;
 &lt;td&gt;_dmarc&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=DMARC1; p=reject; adkim=s; aspf=s; rua=mailto:dmarc@test.org&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="dkim"&gt;&lt;a href="#dkim" class="header-anchor"&gt;&lt;/a&gt;DKIM
&lt;/h2&gt;&lt;p&gt;国内邮箱对 DKIM 的支持度似乎不高，笔者也没有使用过，没有调查就没有发言权，这里就不谈了。&lt;/p&gt;
&lt;h3 id="示例-2"&gt;&lt;a href="#%e7%a4%ba%e4%be%8b-2" class="header-anchor"&gt;&lt;/a&gt;示例
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;如果完全不使用域名邮箱，可以这样设置 DKIM 记录&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DNS 记录&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;TXT&lt;/td&gt;
 &lt;td&gt;*._domainkey&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=DKIM1; p=&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="小结"&gt;&lt;a href="#%e5%b0%8f%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;小结
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;本文只是简单介绍了部分常用的 SPF 和 DMARC 规则，需要强调的是，&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;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;DNS 记录&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;TXT&lt;/td&gt;
 &lt;td&gt;lixx.org&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=spf1 -all&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TXT&lt;/td&gt;
 &lt;td&gt;*._domainkey&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=DKIM1; p=&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TXT&lt;/td&gt;
 &lt;td&gt;_dmarc&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;v=DMARC1; p=reject; adkim=s; aspf=s&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;</description></item></channel></rss>