<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
    <title>米V米</title>
    <subtitle>希望你在这里能找到你需要的</subtitle>
    <link rel="self" type="application/atom+xml" href="https://www.mivm.cn/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://www.mivm.cn"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-03-29T00:00:00+00:00</updated>
    <id>https://www.mivm.cn/atom.xml</id>
    <entry xml:lang="zh">
        <title>基于 ArchLinux 构建旁路由</title>
        <published>2026-01-19T00:00:00+00:00</published>
        <updated>2026-01-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/archlinux-based-bypass-router/"/>
        <id>https://www.mivm.cn/archlinux-based-bypass-router/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/archlinux-based-bypass-router/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;其实这个标题并不正确，正确的应该是基于通用 Linux 系统构建旁路由，只不过我使用的是 ArchLinux，所以下面的教程以此为基础。&lt;&#x2F;p&gt;
&lt;p&gt;为什么要基于通用 Linux 系统构建旁路由？常见的旁路由构建方式有虚拟机或 Docker 容器，这两种方法各有优缺点。&lt;&#x2F;p&gt;
&lt;p&gt;虚拟机拥有独立且完整的网络堆栈，最易于使用，但网络性能稍差一些，由于需要预先分配固定的物理内存，对物理内存偏小的设备不友好。&lt;&#x2F;p&gt;
&lt;p&gt;Docker 容器没有独立的网络堆栈，较易于使用，但使用过程容易遇到问题，由于不需要预先分配固定的物理内存，对物理内存偏小的设备较为友好。&lt;&#x2F;p&gt;
&lt;p&gt;那么基于已有的 Linux 系统构建旁路由呢？配置比较复杂，但是性能优秀、自由度高、内存需求低，不需要维护一个单独的系统或容器，支持运行任意 Linux 系统的设备。&lt;&#x2F;p&gt;
&lt;p&gt;如果你也想使用 ArchLinux 或通用 Linux 系统构建旁路由，这篇教程会教你怎么做。&lt;&#x2F;p&gt;
&lt;p&gt;由于大部分旁路由的用途是使用代理软件，所以下面的教程仅包含如何配置代理软件和 DNS，如果有其他需求，可以加入 QQ 群与我探讨。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;以下方法并不适用于运行 Docker 的系统，会导致 Docker 容器无法联网，有一些变通方法但不完美。由于我现在使用 podman，所以暂时不会去研究让 Docker 完美兼容的方法，如果你有解决方法也可以告知于我。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;准备工作&quot;&gt;准备工作&lt;a class=&quot;zola-anchor&quot; href=&quot;#准备工作&quot; aria-label=&quot;Anchor link for: 准备工作&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 nftables：&lt;code&gt;sudo pacman -S nftables iptables-nft&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;禁用已安装的防火墙并重启系统，比如 firewalld 和 ufw，确保没有其他软件干扰 nftables，可以使用 &lt;code&gt;sudo nft list ruleset&lt;&#x2F;code&gt; 命令查看 nftables 规则集，确保规则集是空的，除非你已经在使用 nftables。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;安装一个支持 TPROXY 的代理软件，我没有对基于 eBPF 的代理软件做过测试，另外，systemd-networkd 和代理软件的 tun 模式搭配使用时可能会出现一些奇怪的问题，所以最好使用支持 TPROXY 的代理软件。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;最后，配置并启动你的代理软件，可以先不管 TPROXY 的部分，HTTP 或 SOCKS 代理协议可以正常工作即可。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;正式开始&quot;&gt;正式开始&lt;a class=&quot;zola-anchor&quot; href=&quot;#正式开始&quot; aria-label=&quot;Anchor link for: 正式开始&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;修改代理软件的配置文件&quot;&gt;修改代理软件的配置文件&lt;a class=&quot;zola-anchor&quot; href=&quot;#修改代理软件的配置文件&quot; aria-label=&quot;Anchor link for: 修改代理软件的配置文件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;启用代理软件的 TPROXY 相关设置，以 mihomo 为例，编辑配置文件并加入以下行：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; TPROXY 监听端口&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#22863A, #85E89D);&quot;&gt;proxy-port&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1234&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;注意，仅仅需要让代理软件启用 TPROXY 监听端口即可，不需要它自动设置路由和规则。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;修改代理软件的_systemd_服务文件&quot;&gt;修改代理软件的 systemd 服务文件&lt;a class=&quot;zola-anchor&quot; href=&quot;#修改代理软件的_systemd_服务文件&quot; aria-label=&quot;Anchor link for: 修改代理软件的_systemd_服务文件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;透明代理需要修改路由表才能正常工作，可以通过修改代理软件的 systemd 文件实现自动修改路由表。假设你的代理软件是 mihomo，使用命令 &lt;code&gt;sudo systemctl edit mihomo.service&lt;&#x2F;code&gt; 修改 systemd 服务文件，添加以下内容到 &lt;code&gt;### Edits below this comment will be discarded&lt;&#x2F;code&gt; 行之前。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你像我一样使用 systemd-networkd，也可以使用它管理路由表。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;Service&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ExecStartPre&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;bin&#x2F;sh -c &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;usr&#x2F;bin&#x2F;ip route add local default dev lo proto static scope host table 999 &amp;amp;&amp;amp; &#x2F;usr&#x2F;bin&#x2F;ip rule add from all fwmark 0x400&#x2F;0x400 lookup 999 proto static priority 1000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;ExecStopPost&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;bin&#x2F;sh -c &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;usr&#x2F;bin&#x2F;ip rule delete from all fwmark 0x400&#x2F;0x400 lookup 999 proto static priority 1000; &#x2F;usr&#x2F;bin&#x2F;ip route delete local default dev lo proto static scope host table 999&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 自动添加服务的 cgroup id 到目标 nft 集合。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 如果你已经在使用 nftables，请确保目标 nft 集合和下面规则所在的位置一致。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 此特性需要 systemd 255 及以上版本，如果你的系统不是 ArchLinux，请检查当前系统的 systemd 是否支持此特性。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;NFTSet&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span&gt;cgroup:inet:firewall:pass_proxy_service&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;保存文件并重启代理软件的服务，使用 &lt;code&gt;ip rule&lt;&#x2F;code&gt; 和 &lt;code&gt;ip route show table 999&lt;&#x2F;code&gt; 命令查看路由规则和路由表，输出应该类似下面这样。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; ip rule&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;0:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;	from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lookup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; local&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;1000:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;	from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fwmark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; 0x400&#x2F;0x400&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lookup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 999&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; static&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;32766:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;	from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lookup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; main&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;32767:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;	from&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; lookup&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span&gt; ip route show table 999&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;local&lt;&#x2F;span&gt;&lt;span&gt; default&lt;&#x2F;span&gt;&lt;span&gt; dev&lt;&#x2F;span&gt;&lt;span&gt; lo&lt;&#x2F;span&gt;&lt;span&gt; proto&lt;&#x2F;span&gt;&lt;span&gt; static&lt;&#x2F;span&gt;&lt;span&gt; scope&lt;&#x2F;span&gt;&lt;span&gt; host&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h3 id=&quot;添加_nftables_规则&quot;&gt;添加 nftables 规则&lt;a class=&quot;zola-anchor&quot; href=&quot;#添加_nftables_规则&quot; aria-label=&quot;Anchor link for: 添加_nftables_规则&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你已经在使用 nftables，务必将以下规则合并到现有的规则。&lt;br &#x2F;&gt;
如果你已经创建了 input 链，请将 &lt;code&gt;socket transparent 1 accept&lt;&#x2F;code&gt; 规则添加到 input 链起始位置。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;接下来添加 nftables 规则，编辑文件 &lt;code&gt;&#x2F;etc&#x2F;nftables.conf&lt;&#x2F;code&gt;，删除文件的所有内容，然后添加以下内容：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;usr&#x2F;bin&#x2F;nft -f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tproxy_mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1024&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; pass_proxy_service&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cgroupsv2&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4_reserved_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4_addr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        flags&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; interval&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        auto-merge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        elements&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            0.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            10.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            100.64.0.0&#x2F;10,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            127.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            169.254.0.0&#x2F;16,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            172.16.0.0&#x2F;12,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            192.0.0.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            192.0.2.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            192.88.99.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            192.168.0.0&#x2F;16,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            198.18.0.0&#x2F;15,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            198.51.100.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            203.0.113.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            224.0.0.0&#x2F;4,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            233.252.0.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            240.0.0.0&#x2F;4,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;            255.255.255.255&#x2F;32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; filter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mangle&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; direction&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reply&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @ipv4_reserved_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; comment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;skip from ipv4 reserved address packets&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;        #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 如果你的代理软件的 TPROXY 端口不是 1234，请更改下面的端口到对应端口。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; nfproto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;tproxy_mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tproxy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; :1234&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; output 链用于让本机数据包通过透明代理，如果你不需要可以删除。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; route&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mangle&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; direction&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reply&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        socket&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cgroupv2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; level&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @pass_proxy_service&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; comment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;skip some service&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @ipv4_reserved_address&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; comment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;skip to ipv4 reserved address packets&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; nfproto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;tproxy_mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; comment&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;send to proxy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;执行 &lt;code&gt;sudo systemctl restart nftables.service &amp;amp;&amp;amp; sudo systemctl daemon-reload&lt;&#x2F;code&gt; 命令重新加载 nftables 规则并让 systemd 重新添加 cgroup id，然后测试透明代理是否正常工作，把局域网其他设备的网关设置为当前设备的 IP 并测试是否正常。&lt;&#x2F;p&gt;
&lt;p&gt;如果全部正常工作，记得执行 &lt;code&gt;sudo systemctl enable nftables.service&lt;&#x2F;code&gt; 将其设置为自动启动，还可以看下我之前写的关于 OpenWrt 策略路由的教程《&lt;a href=&quot;..&#x2F;openwrt-policy-route&#x2F;&quot;&gt;使用 OpenWrt 策略路由把流量转发到旁路网关&lt;&#x2F;a&gt;》，增强稳定性和灵活性。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;DNS_重定向&quot;&gt;DNS 重定向&lt;a class=&quot;zola-anchor&quot; href=&quot;#DNS_重定向&quot; aria-label=&quot;Anchor link for: DNS_重定向&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果看了我写的教程《&lt;a href=&quot;..&#x2F;openwrt-policy-route&#x2F;&quot;&gt;使用 OpenWrt 策略路由把流量转发到旁路网关&lt;&#x2F;a&gt;》，里面有讲到重定向公共 DNS 到本地实现无感故障转移，要在 nftables 实现这个功能很简单。&lt;&#x2F;p&gt;
&lt;p&gt;首先确保你的系统有一个可用的 DNS 服务器，代理软件内置的也好，独立的 DNS 服务器也罢，确保局域网的其他设备可以使用它解析域名。&lt;&#x2F;p&gt;
&lt;p&gt;然后编辑 &lt;code&gt;&#x2F;etc&#x2F;nftables.conf&lt;&#x2F;code&gt; 文件并添加以下行：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;define&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; fake_dns&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 180.76.76.76&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting_nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output_nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting_nat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output_nat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;table&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; inet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;  {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting_nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dstnat&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;        #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; 6653 是本地 DNS 服务器的端口，根据你的配置修改。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;fake_dns&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; th&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dport&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 53&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; redirect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; :6653&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;    #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt; output_nat 链用于重定向本机 DNS 查询，如果你不需要可以删除。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output_nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;        type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; nat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; output&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mangle&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span&gt; $&lt;&#x2F;span&gt;&lt;span&gt;fake_dns&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; th&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dport&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 53&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; redirect&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; to&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; :6653&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重启 &lt;code&gt;nftables.service&lt;&#x2F;code&gt; 并测试 DNS 重定向是否正常工作。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;小贴士&quot;&gt;小贴士&lt;a class=&quot;zola-anchor&quot; href=&quot;#小贴士&quot; aria-label=&quot;Anchor link for: 小贴士&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;由于 Linux 路由表查询的特性，如果你需要本机的某个程序绕过透明代理，可以让它绑定到某个接口，这样就可以使其绕过透明代理。&lt;&#x2F;p&gt;
&lt;p&gt;比如可以添加 &lt;code&gt;--interface&lt;&#x2F;code&gt; 参数让 &lt;code&gt;curl&lt;&#x2F;code&gt; 绕过透明代理，例如：&lt;code&gt;curl --interface eth0 ip.sb&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果程序不支持绑定接口，也可以通过添加 nftables 规则，使用 &lt;code&gt;uid&lt;&#x2F;code&gt;, &lt;code&gt;cgroups&lt;&#x2F;code&gt; 等条件使特定进程绕过透明代理。&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;现在，你可以完全享受由 ArchLinux 驱动的旁路由了！以上只是最简单的示例，更多复杂的配置等你去探索。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>解决 ArchLinux SSH 登录后不显示最后一次登录信息</title>
        <published>2026-01-19T00:00:00+00:00</published>
        <updated>2026-01-19T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/archlinux-no-show-last-login/"/>
        <id>https://www.mivm.cn/archlinux-no-show-last-login/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/archlinux-no-show-last-login/">&lt;p&gt;ArchLinux 默认配置下，通过 SSH 登录后并不会显示 &lt;code&gt;Last Login&lt;&#x2F;code&gt; 信息。如果你需要这个信息，可以按照下面的方法启用它。&lt;&#x2F;p&gt;
&lt;p&gt;编辑文件 &lt;code&gt;&#x2F;etc&#x2F;pam.d&#x2F;system-login&lt;&#x2F;code&gt;，找到 &lt;code&gt;session    optional   pam_lastlog2.so      silent&lt;&#x2F;code&gt; 行并删除最后的 &lt;code&gt;silent&lt;&#x2F;code&gt; 参数，保存文件并再次登录，就可以看到 &lt;code&gt;Last Login&lt;&#x2F;code&gt; 信息了。&lt;&#x2F;p&gt;
&lt;p&gt;这个文件由 &lt;code&gt;pambase&lt;&#x2F;code&gt; 包管理，如果这个包下次更新，可能会生成 &lt;code&gt;.pacnew&lt;&#x2F;code&gt; 文件，届时记得替换并重新修改。&lt;&#x2F;p&gt;
&lt;p&gt;不过在某些场景下可能依然需要隐藏 &lt;code&gt;Last Login&lt;&#x2F;code&gt;，可以使用 &lt;code&gt;silent_if&lt;&#x2F;code&gt; 参数做到这一点。&lt;&#x2F;p&gt;
&lt;p&gt;手册页：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.man7.org&#x2F;linux&#x2F;man-pages&#x2F;man8&#x2F;pam_lastlog2.8.html&quot;&gt;https:&#x2F;&#x2F;www.man7.org&#x2F;linux&#x2F;man-pages&#x2F;man8&#x2F;pam_lastlog2.8.html&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>使用 OpenWrt 策略路由把流量转发到旁路网关</title>
        <published>2025-10-21T00:00:00+00:00</published>
        <updated>2026-03-29T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/openwrt-policy-route/"/>
        <id>https://www.mivm.cn/openwrt-policy-route/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/openwrt-policy-route/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;最近一段时间，小山重新规划了家里的网络，更换了主路由，并把之前主路由上运行的一些软件卸载到了旁路由。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;我目前的旁路由是基于 ArchLinux 构建的，如果你对此感兴趣可以查看《&lt;a href=&quot;..&#x2F;archlinux-based-bypass-router&#x2F;&quot;&gt;基于 ArchLinux 构建旁路由&lt;&#x2F;a&gt;》。下面的教程依然是以基于 OpenWrt 的旁路由为准。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;常见的使用旁路由的方法有两种，第一种是把设备的网关更改为旁路由的 IP，第二种是用 DHCP 为设备下发网关，两种方法都是让设备的所有流量转发到旁路由处理。无论用哪种方法设置设备的网关，都会导致两个问题，其一，如果旁路由掉线，设备将无法访问互联网，其二，IPv4 的端口转发会失效，虽然有变通的解决方法，但是都称不上完美。&lt;&#x2F;p&gt;
&lt;p&gt;如果要解决上面提到的问题，需要用第三种方法：策略路由。什么是策略路由？通过配置规则将流量路由到不同的目标&#x2F;网关，它可以在设备端实现，也可以在路由端实现，这种方法的好处在于，即使旁路由掉线，也不会影响正常上网。经过这段时间的摸索，我整理出了一套在 OpenWrt 上实现策略路由的方案，将特定的流量从主路由转发到旁路由。&lt;&#x2F;p&gt;
&lt;p&gt;开始之前，请确保你的旁路由可以正常工作并且运行模式是 &lt;code&gt;Redir-Host&lt;&#x2F;code&gt;，主路由正在运行的 OpenWrt 版本不低于 24.10.0，我没有在低版本测试过，还需要熟悉 SSH 和终端的使用，之后的大部分操作都需要运行命令。&lt;&#x2F;p&gt;
&lt;p&gt;如果你之前使用的方法是手动设置网关或 DHCP 下发网关，请先还原这些设置。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;除非另有说明，否则所有操作都是在主路由上进行。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;开启旁路由的_IP_动态伪装&quot;&gt;开启旁路由的 IP 动态伪装&lt;a class=&quot;zola-anchor&quot; href=&quot;#开启旁路由的_IP_动态伪装&quot; aria-label=&quot;Anchor link for: 开启旁路由的_IP_动态伪装&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;为了防止主路由的防火墙规则陷入循环和一些其他问题，务必开启旁路由的 IP 动态伪装。&lt;&#x2F;p&gt;
&lt;p&gt;打开旁路由的 OpenWrt 管理界面，转到「网络」-&amp;gt;「防火墙」，然后选中区域「lan」的「IP 动态伪装」选项框，最后保存并应用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;关闭主路由的丢弃无效数据包&quot;&gt;关闭主路由的丢弃无效数据包&lt;a class=&quot;zola-anchor&quot; href=&quot;#关闭主路由的丢弃无效数据包&quot; aria-label=&quot;Anchor link for: 关闭主路由的丢弃无效数据包&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;为了防止主路由的防火墙丢弃转发的数据包，务必关闭主路由的丢弃无效数据包。&lt;&#x2F;p&gt;
&lt;p&gt;此功能默认未开启，如果你已开启或不确定，可以执行以下命令关闭该功能。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;q&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; delete&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.@defaults[0].drop_invalid&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;etc&#x2F;init.d&#x2F;firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;创建路由和规则&quot;&gt;创建路由和规则&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建路由和规则&quot; aria-label=&quot;Anchor link for: 创建路由和规则&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;首先添加一个路由表和路由规则，将特定流量转发到特定网关。&lt;&#x2F;p&gt;
&lt;p&gt;给序号 288 的路由表创建别名 bypass：&lt;code&gt;echo &#x27;288 bypass&#x27; &amp;gt;&amp;gt; &#x2F;etc&#x2F;iproute2&#x2F;rt_tables&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;添加一个路由到 bypass 路由表，并将网关设置为旁路由，务必将 &lt;code&gt;%gateway%&lt;&#x2F;code&gt; 更改为你的旁路由 IP 地址：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_route=route&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_route.interface=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_route.target=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0.0.0.0&#x2F;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_route.gateway=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;%gateway%&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_route.table=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bypass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;创建路由规则，将包含特定标记的流量转发到 bypass 路由表：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_rule=rule&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_rule.in=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_rule.lookup=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bypass&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_rule.mark=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;114514&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; network.bypass_rule.priority=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;30000&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;执行命令 &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;network reload&lt;&#x2F;code&gt; 重新加载路由，然后转到 OpenWrt 管理界面查看路由是否已加载。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;openwrt-policy-route&#x2F;.&#x2F;1.webp&quot; alt=&quot;OpenWrt LuCI 路由状态界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;刚刚创建的路由规则只转发包含特定标记的流量，所以要让 nftables 给特定的流量写入标记。不过在此之前，我们先为 nftables 创建一些地址集合。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;创建_nftables_地址集合&quot;&gt;创建 nftables 地址集合&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建_nftables_地址集合&quot; aria-label=&quot;Anchor link for: 创建_nftables_地址集合&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;下载并创建国内 IPv4 地址段集合：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;wget&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;O&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;etc&#x2F;luci-uploads&#x2F;chnroutes.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; https:&#x2F;&#x2F;ispip.clang.cn&#x2F;all_cn.txt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.cn_ipv4_ipset=ipset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.cn_ipv4_ipset.name=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;cn_ipv4_ipset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.cn_ipv4_ipset.family=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.cn_ipv4_ipset.loadfile=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;etc&#x2F;luci-uploads&#x2F;chnroutes.txt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.cn_ipv4_ipset.match=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;dest_net&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;我们还需要创建一个 MAC 地址集合，用于检查流量来源，从而实现只处理特定设备的流量。&lt;&#x2F;p&gt;
&lt;p&gt;创建 MAC 地址集合：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_devices=ipset&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_devices.name=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;bypass_devices&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_devices.family=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_cn_ipset.match=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;mac&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;MAC 地址集合默认是空的，可以手动在 OpenWrt 管理界面添加地址，如下图所示：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;openwrt-policy-route&#x2F;.&#x2F;2.webp&quot; alt=&quot;OpenWrt LuCI 防火墙集合设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;比如需要让电脑和手机的流量转发到旁路由，添加这两个设备的 MAC 地址即可。需要注意的是，如果 WiFi 启用了隐私 MAC 地址，则需要添加对应的隐私 MAC 地址。&lt;strong&gt;如果删除了这个集合的 MAC 地址条目，需要重启下防火墙才可以生效。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下一步也是最关键的一步，创建 nftables 处理规则，给特定的流量写入标记，让路由规则可以工作。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;创建_nftables_处理规则&quot;&gt;创建 nftables 处理规则&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建_nftables_处理规则&quot; aria-label=&quot;Anchor link for: 创建_nftables_处理规则&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;创建并编辑规则文件 &lt;code&gt;&#x2F;etc&#x2F;nftables.d&#x2F;99-bypass.nft&lt;&#x2F;code&gt;，文件内容如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_lan_ipv4_ipset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4_addr&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    flags&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; interval&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    auto-merge&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    elements&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        0.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        10.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        100.64.0.0&#x2F;10,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        127.0.0.0&#x2F;8,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        169.254.0.0&#x2F;16,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        172.16.0.0&#x2F;12,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        192.0.0.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        192.0.2.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        192.88.99.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        192.168.0.0&#x2F;16,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        198.18.0.0&#x2F;15,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        198.51.100.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        203.0.113.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        224.0.0.0&#x2F;4,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        233.252.0.0&#x2F;24,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        240.0.0.0&#x2F;4,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        255.255.255.255&#x2F;32&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;    type&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; filter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hook&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; prerouting&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; priority&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mangle&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; policy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; accept&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ct&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; direction&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reply&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ether&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; saddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @bypass_devices&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; nfproto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_rules&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_rules&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @bypass_lan_ipv4_ipset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; l4proto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; tcp,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; udp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; th&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dport&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 53&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; daddr&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; @cn_ipv4_ipset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; return&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    goto&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_mark&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;chain&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; bypass_mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    meta&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mark&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 114514&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; counter&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;现在执行命令 &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;firewall reload&lt;&#x2F;code&gt; 重新加载防火墙规则，然后转到 OpenWrt 管理界面查看防火墙规则是否已加载。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;openwrt-policy-route&#x2F;.&#x2F;3.webp?v=2&quot; alt=&quot;OpenWrt LuCI 防火墙状态界面 1&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果确认无误，现在可以访问 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.ipip.net&quot;&gt;https:&#x2F;&#x2F;www.ipip.net&lt;&#x2F;a&gt; 和 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;ip.sb&quot;&gt;https:&#x2F;&#x2F;ip.sb&lt;&#x2F;a&gt; 确认策略路由是否工作正常。如果不工作，可以试着重来一遍，以及确保设备的 MAC 地址已经添加到集合。&lt;&#x2F;p&gt;
&lt;p&gt;还有一种特殊情况也会导致策略路由无法正常工作，旁路由如果通过一个中继路由连接到主路由，中继路由有一些特殊设置，会导致流量无法转发，要解决这个问题，可以再在主路由上为特定流量启用 IP 动态伪装。&lt;&#x2F;p&gt;
&lt;p&gt;添加防火墙规则为特定流量启用 IP 动态伪装：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq=nat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.name=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Bypass-MASQUERADE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.family=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ipv4&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.src=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.target=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;MASQUERADE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.mark=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;114514&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_masq.proto=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;all&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;etc&#x2F;init.d&#x2F;firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;创建网关状态检查脚本&quot;&gt;创建网关状态检查脚本&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建网关状态检查脚本&quot; aria-label=&quot;Anchor link for: 创建网关状态检查脚本&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;你可能注意到了，上面的 nftables 规则跳过了目标 IP 是国内 IP 的流量，但是没有跳过目标端口是 53 的流量，原因是因为要做到无感故障转移，即使旁路由掉线了，设备的网络也不会故障，不过 DNS 的故障转移要用一种特殊的方法，下一步再细说。&lt;&#x2F;p&gt;
&lt;p&gt;首先创建一个网关状态检查脚本，这个脚本会不停的检查网关可用性，如果发现网关不可用，会临时禁用路由规则，当网关可用时重新启用规则。&lt;&#x2F;p&gt;
&lt;p&gt;创建并编辑文件 &lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;check-bypass-gateway&lt;&#x2F;code&gt;，文件内容如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;sh &#x2F;etc&#x2F;rc.common&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;START&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;9&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;9&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;STOP&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;USE_PROCD&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;tmp&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;initscript&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;:-&lt;&#x2F;span&gt;&lt;span&gt;check-bypass-gateway&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;-helper.uc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;start_service&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; [&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; -e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; ]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;        rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt;    fi&lt;&#x2F;span&gt;&lt;span&gt; &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;#!&#x2F;usr&#x2F;bin&#x2F;env ucode&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;import * as uci from &amp;#39;uci&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;import * as uloop from &amp;#39;uloop&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;const gateway = uci.cursor().get(&amp;#39;network&amp;#39;,&amp;#39;bypass_route&amp;#39;, &amp;#39;gateway&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;let connectable = 1;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;if (!uloop.init()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    die(`Initialization failure: ${uloop.error()}\n`);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;function gateway_online() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    for (let i = 0; i &amp;lt; 3; i++) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (system(`ping -c 1 -W 1 &amp;#39;${gateway}&amp;#39; &amp;gt;&#x2F;dev&#x2F;null 2&amp;gt;&amp;amp;1`) == 0) return true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    return false;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;function network_reload() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    system(&amp;#39;service network reload&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;function main() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    if (gateway_online()) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (connectable == 0) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            sleep(3000);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            const ctx = uci.cursor();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            ctx.delete(&amp;#39;network&amp;#39;, &amp;#39;bypass_rule&amp;#39;, &amp;#39;disabled&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            ctx.commit();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            network_reload();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            connectable = 1;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            printf(`The gateway is back online! (${gateway})\n`);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        uloop.timer(3000, main);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    } else {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (connectable == 1) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            const ctx = uci.cursor();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            ctx.set(&amp;#39;network&amp;#39;, &amp;#39;bypass_rule&amp;#39;, &amp;#39;disabled&amp;#39;, true);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            ctx.commit();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            network_reload();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            connectable = 0;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            printf(`The gateway is unreachable! (${gateway})\n`);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        uloop.timer(5000, main);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;main();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;uloop.timer(43200 * 1000, () =&amp;gt; exit(1));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;uloop.run();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    chmod&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0700&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_open_instance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_set_param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; command&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;$&lt;&#x2F;span&gt;&lt;span&gt;_SCRIPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_set_param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; term_timeout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 60&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_set_param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; stdout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_set_param&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; respawn&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 3600&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 10&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;    procd_close_instance&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;添加执行权限：&lt;code&gt;chmod +x &#x2F;etc&#x2F;init.d&#x2F;check-bypass-gateway&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启动脚本：&lt;code&gt;&#x2F;etc&#x2F;init.d&#x2F;check-bypass-gateway enable &amp;amp;&amp;amp; &#x2F;etc&#x2F;init.d&#x2F;check-bypass-gateway start&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;现在你可以重启旁路由并检查路由规则是否被禁用。&lt;&#x2F;p&gt;
&lt;p&gt;需要注意的是，这个脚本默认并不会在系统升级时保留，除此之外，其他的设置和文件默认都会在系统升级时保留。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;修改_DHCP_给设备下发_DNS&quot;&gt;修改 DHCP 给设备下发 DNS&lt;a class=&quot;zola-anchor&quot; href=&quot;#修改_DHCP_给设备下发_DNS&quot; aria-label=&quot;Anchor link for: 修改_DHCP_给设备下发_DNS&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;以下指南假设主路由的 DNS 是污染的，如果你的主路由已经配置了无污染的 DNS，那么可以略过。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;刚才提到了要用特殊的方法做到 DNS 的故障转移，原因是，如果给设备下发主路由的 DNS，那么解析结果是污染的，如果给设备下发旁路由的 DNS，如果旁路由掉线，设备会无法使用 DNS 解析。&lt;&#x2F;p&gt;
&lt;p&gt;针对这个问题，我的解决方法是，通过 DHCP 给设备下发一个可用的公共 DNS，由于目标端口是 53 的所有流量会被转发到旁路由，就可以在旁路由上将其拦截到本地。如果旁路由正常工作，发送到这个公共 DNS 的查询会被拦截，如果旁路由掉线，则不会经过任何处理。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;如果你使用的是 ImmortalWrt 固件，请先关闭「DNS 重定向」功能，此选项位于「服务」-&amp;gt;「DHCP&#x2F;DNS」-&amp;gt;「常规」。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;首先修改主路由的 DHCP 选项，给标签为 &lt;code&gt;bypass_onlydns&lt;&#x2F;code&gt; 的客户端下发指定的 DNS，这里用的是百度的公共 DNS：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; add_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; dhcp.lan.dhcp_option=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;tag:bypass_onlydns,6,180.76.76.76&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;etc&#x2F;init.d&#x2F;dnsmasq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; restart&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;创建并编辑文件 &lt;code&gt;&#x2F;etc&#x2F;nftables.d&#x2F;99-bypass.sh&lt;&#x2F;code&gt;，这个脚本的作用是给集合里的 MAC 自动设置标签，文件内容如下：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6A737D, #6A737D);&quot;&gt;&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; &amp;lt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D73A49, #F97583);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt; ucode&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;import * as digest from &amp;#39;digest&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;import * as fs from &amp;#39;fs&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;import * as uci from &amp;#39;uci&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;const ctx = uci.cursor();&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;const g_macs = ctx.get(&amp;#39;firewall&amp;#39;, &amp;#39;bypass_devices&amp;#39;, &amp;#39;entry&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;const g_tag = &amp;#39;bypass_onlydns&amp;#39;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;let g_markd_macs = [];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;let g_restart_dnsmasq = false;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ctx.foreach(&amp;#39;dhcp&amp;#39;, &amp;#39;host&amp;#39;, (section) =&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    if (!exists(section, &amp;#39;mac&amp;#39;)) return;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const tags = type(section[&amp;#39;tag&amp;#39;]) == &amp;#39;array&amp;#39; ? section[&amp;#39;tag&amp;#39;] : [section[&amp;#39;tag&amp;#39;]];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    let markd = false;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    for (let tag in tags) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (tag == g_tag) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            markd = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;            break;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    if (markd) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        const mac = type(section[&amp;#39;mac&amp;#39;]) == &amp;#39;array&amp;#39; ? section[&amp;#39;mac&amp;#39;] : [section[&amp;#39;mac&amp;#39;]];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        push(g_markd_macs, ...map(mac, (v) =&amp;gt; lc(v)));&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;});&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;ctx.foreach(&amp;#39;dhcp&amp;#39;, &amp;#39;dnsmasq&amp;#39;, (section) =&amp;gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const cfg = section[&amp;#39;.name&amp;#39;];&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const main_conf = `&#x2F;tmp&#x2F;etc&#x2F;dnsmasq.conf.${cfg}`;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const conf = `&#x2F;tmp&#x2F;dnsmasq.${cfg}.d&#x2F;bypass.conf`;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    for (let i = 0; i &amp;lt; 10; i++) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (fs.access(fs.dirname(conf))) break;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        sleep(2000);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const conf_old_sum = digest.md5_file(conf);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    let data = &amp;quot;&amp;quot;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    for (let mac in g_macs) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        mac = lc(mac);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        if (mac in g_markd_macs) continue;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        data += `dhcp-host=${mac},set:${g_tag}\n`;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    const conf_new_sum = digest.md5(data);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    if (conf_old_sum != conf_new_sum) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        fs.writefile(conf, data);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;        g_restart_dnsmasq = true;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;});&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;if (g_restart_dnsmasq) {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;    system(&amp;#39;service dnsmasq restart&amp;#39;);&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;EOF&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;如果你已经为特定设备分配了静态 DHCP 租约，则需要手动为设备添加标签 &lt;code&gt;bypass_onlydns&lt;&#x2F;code&gt;。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;将这个脚本加入到防火墙，当防火墙启动&#x2F;重新加载时，脚本会自动运行：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_script=include&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_script.type=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.bypass_script.path=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&#x2F;etc&#x2F;nftables.d&#x2F;99-bypass.sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;etc&#x2F;init.d&#x2F;firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;现在重新让设备获取 DHCP 并检查 DNS 是否是 &lt;code&gt;180.76.76.76&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;然后在旁路由上将 &lt;code&gt;180.76.76.76&lt;&#x2F;code&gt; 的 53 端口拦截到本地，在旁路由执行下面的命令：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns=redirect&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns.target=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;DNAT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns.name=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;Intercept-BaiduDNS&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns.src=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;lan&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns.src_dport=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;53&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; set&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; firewall.intercept_dns.src_dip=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;180.76.76.76&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;uci&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; commit&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;&#x2F;etc&#x2F;init.d&#x2F;firewall&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; reload&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;现在可以在设备上使用 &lt;code&gt;nslookup&lt;&#x2F;code&gt; 命令查询 DNS 结果并检查是否和旁路由返回的 DNS 结果一致。&lt;&#x2F;p&gt;
&lt;p&gt;至此，所有工作都完成了，尽情享受吧！策略路由不仅可以搭配旁路由使用，还可以做到单线 IPTV 复用等，总之是个很有用的特性。如果遇到问题，可以加入 QQ 群或在下方评论区与我探讨。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Linux 5.16 某些游戏手柄连接异常</title>
        <published>2022-01-20T00:00:00+00:00</published>
        <updated>2022-01-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/linux-516-game-controller-bug/"/>
        <id>https://www.mivm.cn/linux-516-game-controller-bug/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/linux-516-game-controller-bug/">&lt;p&gt;Linux 内核 5.16 版本于前几天正式发布了，小山用的是 ArchLinux，自然是第一时间升级了内核。Linux 5.16 加入了很多令人兴奋的特性，比如帮助 Wine 更好的运行 Windows 游戏的 FUTEX2 系统调用。&lt;&#x2F;p&gt;
&lt;p&gt;还有一个针对游戏显著的变化是加入了 Nintendo Switch 系列手柄的支持，不需要第三方驱动便可以在 Linux 上使用 NS 的手柄。但就是这个功能，影响了那些即支持 PC，又支持 NS 的游戏手柄。&lt;&#x2F;p&gt;
&lt;p&gt;因为这些多平台支持的游戏手柄一般是先用 NS 手柄的协议进行通信协商，如果协商失败，再回退到传统的 Xbox 360 协议。由于 Linux 现在原生支持 NS 游戏手柄，当这些手柄连接到运行 Linux 5.16 内核的设备时，它们就会被系统识别为 NS 游戏手柄，因为 NS 协议协商成功了。虽然说识别为 NS 手柄并不影响这些手柄的使用，但是某些手柄可能会有些奇奇怪怪的问题，比如我手里的北通宙斯精英版，被识别为 NS 手柄后，摇杆会一直偏移在左下角，这就导致无法正常使用它游玩游戏。&lt;&#x2F;p&gt;
&lt;p&gt;解决方法也很简单，只需把支持 NS 手柄的内核模块 &lt;code&gt;hid_nintendo&lt;&#x2F;code&gt; 加入黑名单，防止系统自动加载该模块，这样游戏手柄进行协议协商时就会回退到传统的 Xbox 360 协议。&lt;&#x2F;p&gt;
&lt;p&gt;如果需要同时连接 NS 原生手柄和第三方手柄，可以先连接第三方手柄，当第三方手柄连接成功后，再手动加载 &lt;code&gt;hid_nintendo&lt;&#x2F;code&gt; 模块，然后连接 NS 原生手柄即可，因为连接成功后是不会再切换协议的，除非重新连接。&lt;&#x2F;p&gt;
&lt;p&gt;操作命令如下所示：&lt;&#x2F;p&gt;
&lt;p&gt;加入黑名单：&lt;code&gt;echo &quot;blacklist hid_nintendo&quot; | sudo tee &#x2F;etc&#x2F;modprobe.d&#x2F;no_ns_controllers.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;移出黑名单：&lt;code&gt;sudo rm &#x2F;etc&#x2F;modprobe.d&#x2F;no_ns_controllers.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;手动加载模块：&lt;code&gt;sudo modprobe hid_nintendo&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;手动卸载模块：&lt;code&gt;sudo modprobe -r hid_nintendo&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Linux Btrfs 文件系统使用指南</title>
        <published>2021-08-25T00:00:00+00:00</published>
        <updated>2021-08-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/linux-btrfs-usage-guide/"/>
        <id>https://www.mivm.cn/linux-btrfs-usage-guide/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/linux-btrfs-usage-guide/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Linux 支持诸多的文件系统，不同的文件系统有不同的特性。比如说最经典的 ext 系列文件系统，它们在以前几乎是每个 Linux 发行版的默认文件系统，也是目前为止最稳定的 Linux 文件系统之一。&lt;&#x2F;p&gt;
&lt;p&gt;但是随着硬件的进步以及用户对文件系统更加多元化的需求，越来越多的 Linux 发行版和用户开始使用像 XFS、Btrfs、ZFS 这些新型文件系统作为其默认文件系统，它们比  EXT 系列功能更丰富，性能更好，对新硬件也更加友好。&lt;&#x2F;p&gt;
&lt;p&gt;熟悉小山的都知道我一直在使用 ArchLinux，而我刚开始使用的文件系统是 EXT4，没过多久切换到了 XFS，用了好长一段时间，感觉也不错。但是某天我想要一个有快照功能的文件系统，可是 XFS 并不支持快照，而且据我所知支持快照并且流行的文件系统只有 ZFS 和 Btrfs。熟悉 Linux 的都知道 ZFS 因为开源许可证没有添加到 Linux 主线内核，想要使用还需要安装树外模块，不是很方便。我也不是很需要 ZFS 提供的其他功能以及性能，所以就选择了 Btrfs。&lt;&#x2F;p&gt;
&lt;p&gt;因为 Btrfs 有着诸多新特性，比如：子卷、快照、压缩、写时复制，用起来和其他文件系统还是有很大不同的，虽然你也可以像其他文件系统那样直接格式化使用，但那样显然不是最佳实践。&lt;&#x2F;p&gt;
&lt;p&gt;这篇文章我会根据使用体验，讲解一下 Btrfs 文件系统的几个核心功能，除了 Btrfs RAID，建议使用之前将 Linux 内核版本更新到 4.19 或以上以获得更好的体验。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;格式化为_Btrfs&quot;&gt;格式化为 Btrfs&lt;a class=&quot;zola-anchor&quot; href=&quot;#格式化为_Btrfs&quot; aria-label=&quot;Anchor link for: 格式化为_Btrfs&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Btrfs 格式化命令：&lt;code&gt;mkfs.btrfs ${partPath}&lt;&#x2F;code&gt; 或 &lt;code&gt;mkfs.btrfs -n ${nodesize} ${partPath}&lt;&#x2F;code&gt; （指定节点大小），&lt;code&gt;${partPath}&lt;&#x2F;code&gt; 替换为你要格式化的分区路径，而指定节点大小是可选的，较低的节点大小会增加碎片、降低锁定争用，较高的节点大小会以增加内存操作为代价减少碎片。默认值为 16k （btrfs-progs 3.11 之前为 4k），最大允许值为 64k，值必须是扇区大小倍数和 2 的幂。&lt;&#x2F;p&gt;
&lt;p&gt;如果你当前的文件系统是 EXT3&#x2F;4，可以使用 &lt;code&gt;btrfs-convert&lt;&#x2F;code&gt; 工具将其转换为 Btrfs。（参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Conversion_from_Ext3&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Conversion_from_Ext3&lt;&#x2F;a&gt;）&lt;&#x2F;p&gt;
&lt;p&gt;Btrfs 分区的大多数操作都由 &lt;code&gt;btrfs&lt;&#x2F;code&gt; 命令完成，手册页：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下面介绍 Btrfs 的一些特性以及简单用法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;子卷_(SubVolume)&quot;&gt;子卷 (SubVolume)&lt;a class=&quot;zola-anchor&quot; href=&quot;#子卷_(SubVolume)&quot; aria-label=&quot;Anchor link for: 子卷_(SubVolume)&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;子卷类似 LVM 的逻辑卷，但它并不是块设备，可以看作是一个独立的目录（专业点叫做 POSIX 命名空间），在文件结构中也表现为一个目录。子卷之间独立且互不影响，任何子卷可以被挂载到任何位置。&lt;&#x2F;p&gt;
&lt;p&gt;Btrfs 分区默认都有一个被称作顶级子卷的子卷。新子卷可以创建在任何子卷的下面。&lt;&#x2F;p&gt;
&lt;p&gt;创建子卷命令：&lt;code&gt;sudo btrfs subvolume create ${subvolumePath}&lt;&#x2F;code&gt;，&lt;code&gt;${subvolumePath}&lt;&#x2F;code&gt; 是新子卷路径。&lt;&#x2F;p&gt;
&lt;p&gt;可以使用 &lt;code&gt;subvolid&lt;&#x2F;code&gt; 或 &lt;code&gt;subvol&lt;&#x2F;code&gt; 挂载选项挂载对应子卷，前者使用子卷 ID，后者使用子卷路径（相对于顶级子卷）。如果不指定任何子卷挂载选项，则使用默认子卷，默认是顶级子卷，可以被修改，如果你修改了默认子卷，需要通过顶级子卷的 ID 挂载顶级子卷，顶级子卷的 ID 是 5。推荐使用子卷 ID 挂载子卷，因为这样即使子卷被移动，也可以被正确的挂载，可以使用 &lt;code&gt;sudo btrfs subvolume list &#x2F;&lt;&#x2F;code&gt; 命令查看子卷列表。&lt;&#x2F;p&gt;
&lt;p&gt;子卷的使用方式一般分为嵌套子卷和平行子卷，或者两者混用，我更偏向两者混用。&lt;&#x2F;p&gt;
&lt;p&gt;假设有一块硬盘需要分区并安装 Linux，很多人喜欢给系统文件和家目录放在不同的分区里，一般的做法是创建两个分区或者使用 LVM 逻辑卷，但现在我们可以使用一个 Btrfs 分区，然后使用子卷做到这一点。并且子卷相对于普通分区，并不需要担心某个分区空间不足的情况。&lt;&#x2F;p&gt;
&lt;p&gt;嵌套子卷：嵌套子卷就是子卷间是相互嵌套的，因为子卷在文件结构中是一个目录，所以嵌套子卷的管理就像管理目录一样简单，并且支持自动挂载，但相对缺少灵活性。挂载顶级子卷然后安装系统，此时顶级子卷被挂载在 &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;，包含所有的系统文件，当然也包含家目录。不过我们只需要删除或者移动现有的 &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; 目录，然后在 &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt; 创建一个子卷：&lt;code&gt;sudo btrfs subvolume create &#x2F;home&lt;&#x2F;code&gt;，由于是嵌套子卷，不需要手动挂载。此时顶级子卷下的 &lt;code&gt;home&lt;&#x2F;code&gt; 目录是一个单独的子卷，如果你为顶级子卷创建 &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; 还原快照，并不会影响 &lt;code&gt;home&lt;&#x2F;code&gt; 子卷。&lt;&#x2F;p&gt;
&lt;p&gt;平行子卷：平行子卷就是将所有子卷创建在顶级子卷下面，然后手动把每个子卷挂载到对应位置，这种方式管理起来相对方便，但是操作会复杂一些。首先挂载顶级子卷，然后创建 &lt;code&gt;root&lt;&#x2F;code&gt; 和 &lt;code&gt;home&lt;&#x2F;code&gt; 两个子卷，然后卸载顶级子卷，接着把 &lt;code&gt;root&lt;&#x2F;code&gt; 子卷挂载到 &lt;code&gt;&#x2F;&lt;&#x2F;code&gt;，&lt;code&gt;home&lt;&#x2F;code&gt; 子卷挂载到 &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt;。虽然挂载后的目录结构看着和嵌套子卷一样，但 &lt;code&gt;home&lt;&#x2F;code&gt; 子卷并不是 &lt;code&gt;root&lt;&#x2F;code&gt; 子卷下面，而是在顶级子卷下面，只是被挂载到了 &lt;code&gt;&#x2F;home&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;两者混用就是在平行子卷的基础上使用嵌套子卷，比如我可以在 &lt;code&gt;home&lt;&#x2F;code&gt; 子卷里创建个 &lt;code&gt;vms&lt;&#x2F;code&gt; 子卷，由于是在 &lt;code&gt;home&lt;&#x2F;code&gt; 子卷下面，所以挂载 &lt;code&gt;home&lt;&#x2F;code&gt; 子卷的时候会自动挂载它。&lt;&#x2F;p&gt;
&lt;p&gt;删除子卷可以使用 &lt;code&gt;sudo btrfs subvolume delete ${subvolumePath}&lt;&#x2F;code&gt; 命令，从 Linux 内核 4.18 开始，删除子卷目录也可以删除子卷。&lt;&#x2F;p&gt;
&lt;p&gt;如果你不需要快照功能，其实怎样使用子卷都问题不大。&lt;&#x2F;p&gt;
&lt;p&gt;Btrfs 子卷并不能替代 LVM 逻辑卷，它缺少 LVM 一些功能，以及它不是块设备。&lt;&#x2F;p&gt;
&lt;p&gt;如果还有不懂的地方，可以查看官方的子卷指南：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;SysadminGuide#Subvolumes&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;SysadminGuide#Subvolumes&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;写时复制_(CoW)&quot;&gt;写时复制 (CoW)&lt;a class=&quot;zola-anchor&quot; href=&quot;#写时复制_(CoW)&quot; aria-label=&quot;Anchor link for: 写时复制_(CoW)&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Btrfs 支持拷贝文件时不拷贝数据而只创建引用链接，引用链接和硬链接类似，都是不同文件指向同一份数据，和硬链接不同的是，引用链接不共享源文件的 Inode，所以修改引用链接并不会影响源文件。&lt;&#x2F;p&gt;
&lt;p&gt;只有当其中一个文件被修改时，另一个文件的数据会被复制并写入到新的块，这就是写时复制，只有当相同项目的某一项被修改时才会创建新的副本。如果一个文件的数据不会被更改，即使创建几万个引用链接，它们实际占用的只是一个源文件的大小（以及引用链接的元数据大小）。在某些重复文件很多的场景，比如 Wine，引用链接可以显著减少空间的实际占用。&lt;&#x2F;p&gt;
&lt;p&gt;某些文件管理器支持复制文件时引用链接，如果你需要手动复制文件为引用链接，只需在 &lt;code&gt;cp&lt;&#x2F;code&gt; 命令加上 &lt;code&gt;--reflink=always&lt;&#x2F;code&gt; 参数即可。&lt;&#x2F;p&gt;
&lt;p&gt;写时复制虽然可以减少空间占用，但也会影响性能，对于某些写入较为频繁的目录或文件，比如虚拟机的虚拟硬盘，可以使用 &lt;code&gt;chattr&lt;&#x2F;code&gt; 命令给文件或目录添加 &lt;code&gt;C&lt;&#x2F;code&gt; 属性，添加此属性后默认会禁用写时复制，只有当存在引用链接时才会使用写时复制。目录添加此属性后默认会影响新创建的文件，建议为需要此属性的目录单独创建一个子卷。你还可以通过使用 &lt;code&gt;nodatacow&lt;&#x2F;code&gt; 挂载选项禁用写时复制。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;压缩_(Compress)&quot;&gt;压缩 (Compress)&lt;a class=&quot;zola-anchor&quot; href=&quot;#压缩_(Compress)&quot; aria-label=&quot;Anchor link for: 压缩_(Compress)&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Btrfs 支持透明和自动数据压缩，文件写入时会自动压缩，文件读取时会自动解压，此特性以较少的 CPU 使用率换取较高的空间利用率。&lt;&#x2F;p&gt;
&lt;p&gt;默认不会启用数据压缩，可以使用 &lt;code&gt;compress&lt;&#x2F;code&gt; 挂载选项启用数据压缩或更改压缩方式和压缩等级，默认压缩方式是 &lt;code&gt;zlib&lt;&#x2F;code&gt;，压缩等级是 &lt;code&gt;3&lt;&#x2F;code&gt;。参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs(5)#MOUNT_OPTIONS&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs(5)#MOUNT_OPTIONS&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启用数据压缩后，当一个新文件被写入时，Btrfs 会使用一些方法检查文件是否可以被压缩，如果不可以，Btrfs 将会永久标注此文件为不可压缩。可以使用 &lt;code&gt;compress-force&lt;&#x2F;code&gt; 挂载选项让 Btrfs 尝试压缩每个新写入的文件，但是已经创建的文件默认不会被压缩。&lt;&#x2F;p&gt;
&lt;p&gt;你还可以在不使用 &lt;code&gt;compress&lt;&#x2F;code&gt; 挂载选项的情况下，使用 &lt;code&gt;chattr&lt;&#x2F;code&gt; 命令给文件或目录加上 &lt;code&gt;c&lt;&#x2F;code&gt; 属性为其启用压缩。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;快照_(Snapshot)&quot;&gt;快照 (Snapshot)&lt;a class=&quot;zola-anchor&quot; href=&quot;#快照_(Snapshot)&quot; aria-label=&quot;Anchor link for: 快照_(Snapshot)&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Btrfs 支持为子卷创建快照。快照本身实际上也是一个子卷，只不过利用了写时复制和引用链接，将源子卷的内容全部复制为引用链接到一个新的子卷。&lt;&#x2F;p&gt;
&lt;p&gt;创建快照命令：&lt;code&gt;sudo btrfs subvolume snapshot root root_backup&lt;&#x2F;code&gt;，此命令为 &lt;code&gt;root&lt;&#x2F;code&gt; 子卷创建了一个名为 &lt;code&gt;root_backup&lt;&#x2F;code&gt; 的快照，&lt;code&gt;root_backup&lt;&#x2F;code&gt; 本身是一个可用的子卷，所以如果需要还原快照，只需要挂载对应的快照子卷，或者将原子卷删掉，重命名快照子卷。如果你使用subvolid挂载子卷，需要注意快照子卷 ID 和源子卷 ID 不一样。&lt;&#x2F;p&gt;
&lt;p&gt;如果为禁用写时复制的子卷创建快照，那么创建快照后可能会重新启用源子卷的写时复制。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;一些注意事项&quot;&gt;一些注意事项&lt;a class=&quot;zola-anchor&quot; href=&quot;#一些注意事项&quot; aria-label=&quot;Anchor link for: 一些注意事项&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;虽然 Btrfs 的子卷在挂载时可以看作是不同的分区或挂载项，但是在 Linux 内核看来它们依然是指向同一分区的项目。所以大多数挂载选项将用于整个分区，只有第一个挂载的子卷选项才会生效。&lt;&#x2F;p&gt;
&lt;p&gt;Btrfs 由于存在种种新特性，某些分区统计工具可能无法精准统计。要获取分区的精准使用情况，可以使用 &lt;code&gt;sudo btrfs filesystem usage ${mountPath}&lt;&#x2F;code&gt; 查看具体信息，&lt;code&gt;${mountPath}&lt;&#x2F;code&gt; 是任意子卷的挂载路径。&lt;&#x2F;p&gt;
&lt;p&gt;如果修改了默认子卷，需要在顶级子卷下创建新的子卷时，需要先挂载顶级子卷，然后在顶级子卷挂载点下创建子卷，而不是在 &lt;code&gt;&#x2F;&lt;&#x2F;code&gt; 挂载点下创建子卷。&lt;&#x2F;p&gt;
&lt;p&gt;如果你对系统分区使用平行子卷，内核可能需要设置挂载子卷选项才能正常启动，可以通过 &lt;code&gt;rootflags&lt;&#x2F;code&gt; 内核选项设置。&lt;&#x2F;p&gt;
&lt;p&gt;如果你使用 systemd 的 GPT 分区自动发现并且设置了内核选项 &lt;code&gt;root=gpt-auto&lt;&#x2F;code&gt;，这种情况下即使设置了 &lt;code&gt;rootflags&lt;&#x2F;code&gt;，systemd 也无法挂载对应子卷，除非更改默认子卷或使用固定的 &lt;code&gt;root&lt;&#x2F;code&gt; 参数。&lt;&#x2F;p&gt;
&lt;p&gt;更多 Btrfs 常见问题：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;FAQ&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;FAQ&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;更多 Btrfs 挂载选项：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs(5)#MOUNT_OPTIONS&quot;&gt;https:&#x2F;&#x2F;btrfs.wiki.kernel.org&#x2F;index.php&#x2F;Manpage&#x2F;btrfs(5)#MOUNT_OPTIONS&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>使用 bsdtar 完整备份&#x2F;还原 Linux 系统</title>
        <published>2021-08-09T00:00:00+00:00</published>
        <updated>2021-08-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/linux-full-backup-with-bsdtar/"/>
        <id>https://www.mivm.cn/linux-full-backup-with-bsdtar/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/linux-full-backup-with-bsdtar/">&lt;p&gt;前几天小山在尝试更换 Linux 的系统分区格式，因为要格式化系统分区，所以要备份系统。Linux 下的备份工具是不少，但是既要方便使用又要在救援环境中可用，可选择的就没几个了，我当时选择了 tar。&lt;&#x2F;p&gt;
&lt;p&gt;tar 是 Linux 系统非常经典的一个工具，它可以将一个或多个文件打包成 tar 存档文件，并且支持使用其他压缩工具对 tar 文件进行压缩（tar 文件本身无任何压缩），同时它能保留 Linux 的文件权限等信息，用来备份&#x2F;还原系统再合适不过了。&lt;&#x2F;p&gt;
&lt;p&gt;但当我使用 tar 还原系统之后，发现了一个问题，某些文件的特殊权限消失了，可我在备份&#x2F;还原的时候明明使用了 &lt;code&gt;--xattrs&lt;&#x2F;code&gt; 参数，理论上它应该会保存特殊文件权限，但是并没有。搜索过后发现，这是 GNU tar 的一个错误：特殊属性的支持不完整，导致当前版本的 GNU tar 并不能很好的处理特殊属性（即使&lt;code&gt;--xattrs-include=*&lt;&#x2F;code&gt;）。&lt;&#x2F;p&gt;
&lt;p&gt;难道就没有办法了吗？其实不然，大家可能见过 bsdtar 这个工具，bsdtar 是 libarchive 捆绑的 tar 实现，正如它的名字一样，一些 BSD 系统确实使用 libarchive 作为其 tar 实现，Linux 下的很多工具也使用 bsdtar 对 tar 文件进行操作，而不是 GNU tar。bsdtar 几乎与 GNU tar 拥有相同的的参数，并且对特殊文件属性有完整的支持，以及更好的稀疏文件处理。&lt;&#x2F;p&gt;
&lt;p&gt;于是我最后使用 bsdtar 备份并还原了系统，现在就跟大家分享一下使用 bsdtar 备份还原系统的步骤，以及注意事项。&lt;&#x2F;p&gt;
&lt;p&gt;无论是备份还是还原系统，都推荐在 Live 环境中执行，这样可以确保数据一致性。我使用的是 ArchLinux 的安装镜像，因为它内置 bsdtar，也可以选择其他系统的安装镜像，不过可能需要手动安装 bsdtar。&lt;&#x2F;p&gt;
&lt;p&gt;备份系统之前推荐清理下缓存、日志等不需要的文件，可以加快备份速度以及减少备份大小。&lt;&#x2F;p&gt;
&lt;p&gt;启动安装镜像之后，首先需要挂载分区，比如使用命令 &lt;code&gt;mount &#x2F;dev&#x2F;sda1 &#x2F;mnt&lt;&#x2F;code&gt; 将 &lt;code&gt;&#x2F;dev&#x2F;sda1&lt;&#x2F;code&gt; 挂载到 &lt;code&gt;&#x2F;mnt&lt;&#x2F;code&gt; 路径，具体要挂载那些分区以及挂载到那些路径，根据你的系统情况而定。&lt;&#x2F;p&gt;
&lt;p&gt;挂载分区之后，就可以使用 bsdtar 备份和还原系统了。&lt;&#x2F;p&gt;
&lt;p&gt;务必使用 root 执行这些命令，以及把 &lt;code&gt;${mountPath}&lt;&#x2F;code&gt; 替换为系统分区挂载路径，&lt;code&gt;${tarPath}&lt;&#x2F;code&gt; 替换为 tar 文件存放目录，推荐放在其他分区。&lt;&#x2F;p&gt;
&lt;p&gt;备份命令：&lt;code&gt;bsdtar -c -f ${tarPath}&#x2F;linux-backup.tar -C ${mountPath} -v -B .&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;还原命令：&lt;code&gt;bsdtar -x -f ${tarPath}&#x2F;linux-backup.tar -C ${mountPath} -v&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;上述命令中的参数介绍：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -C : 进行操作之前更改当前位置到指定路径&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -f : 存档文件路径&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -v : 详细输出模式 (省略可加快 bsdtar 执行)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 仅备份&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -B : 不兼容其他 tar 实现&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -c : 创建存档文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#  . : 这个点代表当前目录&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 仅还原&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# -x : 释放存档文件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 你可以指定参数 -a，然后更改存档文件的后缀名为支持的压缩格式后缀名，bsdtar 会使用对应工具对存档文件进行压缩和解压，如果后缀名是未知的，默认使用 bzip2。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 比如把存档文件名更改为 linux-backup.tar.gz，bsdtar 会使用 gzip 对存档文件进行压缩和解压。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 如果使用了压缩，bsdtar 执行将需要更多的时间。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 因为是以 root 权限执行，所以 bsdtar 默认会存储和释放文件权限等信息，不需要额外的参数。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;bsdtar 手册页：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;core&#x2F;libarchive&#x2F;bsdtar.1.en&quot;&gt;https:&#x2F;&#x2F;man.archlinux.org&#x2F;man&#x2F;core&#x2F;libarchive&#x2F;bsdtar.1.en&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你更换了硬盘或对引导分区进行了修改，那么还原系统后可能需要重建引导，最简单的方法就是重新安装引导管理程序（可能需要对应系统的安装镜像）。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>斐讯 N1 运行 ArchLinuxARM</title>
        <published>2020-05-31T00:00:00+00:00</published>
        <updated>2020-05-31T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/phicomm-n1-archlinuxarm/"/>
        <id>https://www.mivm.cn/phicomm-n1-archlinuxarm/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/phicomm-n1-archlinuxarm/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;网上有很多使用 N1 运行 Armbian 的教程，这是一个专门为 ARM 设备适配的 Debian 发行版，并且一般提供现成的镜像，刷起来很方便。&lt;&#x2F;p&gt;
&lt;p&gt;虽然 Debian 是一个很棒的 Linux 发行版，但如果你想真正的掌握系统，那还是得用 ArchLinux。&lt;&#x2F;p&gt;
&lt;p&gt;众所周知，小山是一个 ArchLinux 死忠党，之前就已经给自己的电脑装上了 ArchLinux，即使是 N1，我也肯定不会放过让它运行 ArchLinux 的机会，由于 ArchLinux 本身只支持 x86_64 架构，所以要想给 ARM 的机器安装就得使用一个社区分支：ArchLinuxARM，一个适配了 ARM 的 ArchLinux 衍生版本。&lt;&#x2F;p&gt;
&lt;p&gt;下面我会教大家如何在 N1 上运行 ArchLinuxARM，如果你学会运行了 ArchLinuARM，那么想运行其他的 Linux 发行版也并非什么难事。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;准备工作&quot;&gt;准备工作&lt;a class=&quot;zola-anchor&quot; href=&quot;#准备工作&quot; aria-label=&quot;Anchor link for: 准备工作&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;你的 N1 需要具备可以从 U 盘启动 Linux 的条件，简单的说就是降级启动分区，具体操作可参考：&lt;a href=&quot;..&#x2F;phicomm-n1-unofficial&#x2F;&quot;&gt;《斐讯N1折腾记：降级及刷入官改》&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;你需要在 Linux 系统完成以下操作，虚拟机或物理机都可以，虚拟机需要直接访问 U 盘，不是共享文件的那种。&lt;&#x2F;p&gt;
&lt;p&gt;用来操作的设备 CPU 架构需要是 x86_64 或 aarch64，可以使用 &lt;code&gt;uname -m&lt;&#x2F;code&gt; 命令查看系统 CPU 架构。如果设备的系统不是 ArchLinux 则需要安装 docker，因为要用到 ArchLinux(ARM) 辅助操作。&lt;&#x2F;p&gt;
&lt;p&gt;以及一些 Linux 和 ArchLinux(ARM) 的基础知识 。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;U_盘分区和格式化&quot;&gt;U 盘分区和格式化&lt;a class=&quot;zola-anchor&quot; href=&quot;#U_盘分区和格式化&quot; aria-label=&quot;Anchor link for: U_盘分区和格式化&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;将 U 盘插入设备，并确保系统可以正常访问 U 盘，然后执行 &lt;code&gt;sudo fdisk -l&lt;&#x2F;code&gt; 查看 U 盘的设备路径，如果 U 盘是刚插入的，通常是最后一个设备。如下图所示：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;phicomm-n1-archlinuxarm&#x2F;.&#x2F;1.webp&quot; alt=&quot;fdisk -l 命令执行结果截图&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果 U 盘正常工作且得到了设备路径，那么就可以进行分区和格式化了。执行下列命令时务必将 &lt;code&gt;${devPath}&lt;&#x2F;code&gt; 替换为 U 盘的设备路径。示例：&lt;code&gt;sudo dd if=&#x2F;dev&#x2F;zero of=&#x2F;dev&#x2F;sdd bs=1M count=8 &amp;amp;&amp;amp; sudo sync&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;0&quot;&gt;
&lt;li&gt;
&lt;p&gt;清空分区表：&lt;code&gt;sudo dd if=&#x2F;dev&#x2F;zero of=${devPath} bs=1M count=8 &amp;amp;&amp;amp; sudo sync&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;进入 fdisk 交互界面：&lt;code&gt;sudo LANG=C fdisk ${devPath}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;o&lt;&#x2F;code&gt; 创建 DOS 分区表&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;n&lt;&#x2F;code&gt; 创建新分区，显示 &lt;code&gt;Partition type&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;Partition number&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;First sector&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;Last sector&lt;&#x2F;code&gt; 时输入 &lt;code&gt;+256M&lt;&#x2F;code&gt; 并按回车。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;t&lt;&#x2F;code&gt; 修改第一个分区类型，显示 &lt;code&gt;Hex code&lt;&#x2F;code&gt; 时输入 &lt;code&gt;c&lt;&#x2F;code&gt; 并按回车。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;n&lt;&#x2F;code&gt; 创建新分区，显示 &lt;code&gt;Partition type&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;Partition number&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;First sector&lt;&#x2F;code&gt; 时按回车，显示 &lt;code&gt;Last sector&lt;&#x2F;code&gt; 时按回车。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;输入 &lt;code&gt;p&lt;&#x2F;code&gt; 查看分区表，如果和下图的输出差不多，输入 &lt;code&gt;w&lt;&#x2F;code&gt; 保存分区表并退出。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;phicomm-n1-archlinuxarm&#x2F;.&#x2F;2.webp&quot; alt=&quot;fdisk 分区表输出信息截图&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ol start=&quot;7&quot;&gt;
&lt;li&gt;
&lt;p&gt;执行 &lt;code&gt;sudo mkfs.fat -F 32 ${part1Path}&lt;&#x2F;code&gt; 格式化第一个分区为 FAT32，务必替换 &lt;code&gt;${part1Path}&lt;&#x2F;code&gt; 为第一个分区路径。示例：&lt;code&gt;sudo mkfs.fat -F 32 &#x2F;dev&#x2F;sdd1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;执行 &lt;code&gt;sudo mkfs.ext4 ${part2Path}&lt;&#x2F;code&gt; 格式化第二个分区为 ext4，替换 &lt;code&gt;${part2Path}&lt;&#x2F;code&gt; 为第二个分区路径。示例：&lt;code&gt;sudo mkfs.ext4 &#x2F;dev&#x2F;sdd2&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;写入系统文件&quot;&gt;写入系统文件&lt;a class=&quot;zola-anchor&quot; href=&quot;#写入系统文件&quot; aria-label=&quot;Anchor link for: 写入系统文件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载 ArchLinuxARM 系统文件：&lt;code&gt;curl -L -o &quot;$HOME&#x2F;ArchLinuxARM-aarch64-latest.tar.gz&quot; https:&#x2F;&#x2F;mirrors.bfsu.edu.cn&#x2F;archlinuxarm&#x2F;os&#x2F;ArchLinuxARM-aarch64-latest.tar.gz&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;下载 N1 引导文件：&lt;code&gt;curl -L -o &quot;$HOME&#x2F;n1-boot.tar.gz&quot; &quot;https:&#x2F;&#x2F;cdn.mivm.cn&#x2F;www.mivm.cn&#x2F;archives&#x2F;phicomm-n1-archlinuxarm&#x2F;boot.tar.gz?ver=4&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;创建根分区挂载点：&lt;code&gt;sudo mkdir &#x2F;tmp&#x2F;archlinux-arm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;挂载根分区：&lt;code&gt;sudo mount ${part2Path} &#x2F;tmp&#x2F;archlinux-arm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;创建启动分区挂载点：&lt;code&gt;sudo mkdir &#x2F;tmp&#x2F;archlinux-arm&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;挂载第一个分区：&lt;code&gt;sudo mount -o umask=0077 ${part1Path} &#x2F;tmp&#x2F;archlinux-arm&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;解压系统文件到根分区：&lt;code&gt;sudo bsdtar -xpf &quot;$HOME&#x2F;ArchLinuxARM-aarch64-latest.tar.gz&quot; -C &#x2F;tmp&#x2F;archlinux-arm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;解压引导文件到启动分区：&lt;code&gt;sudo bsdtar -xf &quot;$HOME&#x2F;n1-boot.tar.gz&quot; -C &#x2F;tmp&#x2F;archlinux-arm&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;使用文本编辑器打开文件 &lt;code&gt;&#x2F;tmp&#x2F;archlinux-arm&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt;，添加以下内容，分别替换${part1UUID}和${part2UUID}为第一个分区和第二个分区的 UUID，可以使用sudo blkid查看所有分区的 UUID。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UUID=${part2UUID} &#x2F; ext4 rw,relatime 0 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UUID=${part1UUID} &#x2F;boot vfat rw,relatime,fmask=0077,dmask=0077,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;10&quot;&gt;
&lt;li&gt;执行 &lt;code&gt;sudo sed -i &#x27;s&#x2F;@{UUID}&#x2F;${part2UUID}&#x2F;&#x27; &#x2F;tmp&#x2F;archlinux-arm&#x2F;boot&#x2F;extlinux&#x2F;extlinux.conf&lt;&#x2F;code&gt; 指定内核引导参数的根分区，将 &lt;code&gt;${part2UUID}&lt;&#x2F;code&gt; 替换为第二个分区的 UUID。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>ArchLinux 安装指南（新手向）</title>
        <published>2020-03-01T00:00:00+00:00</published>
        <updated>2026-02-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/archlinux-installation-guide-simple/"/>
        <id>https://www.mivm.cn/archlinux-installation-guide-simple/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/archlinux-installation-guide-simple/">&lt;p&gt;&lt;strong&gt;本安装指南假设你至少知道在 Linux 如何执行命令以及一些基础的电脑知识。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;碎碎念&quot;&gt;碎碎念&lt;a class=&quot;zola-anchor&quot; href=&quot;#碎碎念&quot; aria-label=&quot;Anchor link for: 碎碎念&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;最近小山把主力系统从 Windows 换到了 Linux，开始因为懒，就用了基于 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;archlinux.org&#x2F;&quot;&gt;ArchLinux&lt;&#x2F;a&gt; 的 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;manjaro.org&#x2F;&quot;&gt;Manjaro&lt;&#x2F;a&gt;。不过没几天，被我一个不小心把 &lt;code&gt;&#x2F;etc&lt;&#x2F;code&gt; 目录给删了，熟悉 Linux 的人一定知道这个目录的重要性，导致我只能重装系统。这次我选择了原汁原味的 ArchLinux，整个安装过程虽然没有 Manjaro 方便，不过也没有多么复杂。&lt;&#x2F;p&gt;
&lt;p&gt;于是我就想写一篇面向新手，且适用于物理机和虚拟机的 ArchLinux 安装指南，目标是让你安装后可以作为日常系统使用。即使你已经装好了 ArchLinux，本指南可能也能帮助到你。&lt;&#x2F;p&gt;
&lt;p&gt;本指南基于 ArchLinux &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Installation_guide&quot;&gt;官方安装指南&lt;&#x2F;a&gt;，并对官方安装指南进行了简化，使安装过程没有过多的选择和困惑。&lt;&#x2F;p&gt;
&lt;p&gt;这份指南遵循简单原则，只会带给你一个可以正常使用并带有特定桌面环境的 ArchLinux，并不会带给你多余的东西。后面的路，由你决定！&lt;&#x2F;p&gt;
&lt;p&gt;本指南大部分操作会附带一个指向 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;&quot;&gt;ArchWiki&lt;&#x2F;a&gt; 对应页面的链接，用于帮助你了解操作的详细意义。&lt;&#x2F;p&gt;
&lt;p&gt;如果你在安装过程中遇到了问题，欢迎加入 QQ 群向我询问。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;既然你已经准备安装 ArchLinux，想必对它已经有一个大致的了解了，如果你还不了解，可以前往以下页面了解它。&lt;&#x2F;p&gt;
&lt;p&gt;ArchLinux 简介：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_Linux&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_Linux&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;ArchLinux 常问问题：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Frequently_asked_questions&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Frequently_asked_questions&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;ArchLinux 与其他发行版的区别：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_compared_to_other_distributions&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_compared_to_other_distributions&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;可能有些刚接触（了解） ArchLinux 的小伙伴困惑它是否适合自己？&lt;&#x2F;p&gt;
&lt;p&gt;如果你符合下面这几点，我觉得就可以使用 ArchLinux。&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;拥有阅读文档并动手解决问题的能力。&lt;&#x2F;li&gt;
&lt;li&gt;喜欢高度自由的系统。&lt;&#x2F;li&gt;
&lt;li&gt;追求一切保持简单，不喜欢多余的东西。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;如果你是个刚接触 Linux 的新人，我也推荐使用它来入门，ArchLinux 的文档（Wiki）非常详细，你遇到的大多数问题几乎都能在 Wiki 找到答案，同时它也是很好的 Linux 学习资料，此外，ArchLinux 还有一个用户友好的&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;bbs.archlinux.org&#x2F;&quot;&gt;社区&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;等你对 ArchLinux 熟悉之后就会发现，原来本指南安装步骤是如此简单。&lt;&#x2F;p&gt;
&lt;p&gt;如果你想找个省心省力但又拥有 ArchLinux 特性的发行版，那么 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;manjaro.org&#x2F;&quot;&gt;Manjaro&lt;&#x2F;a&gt; 或 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;endeavouros.com&#x2F;&quot;&gt;EndeavourOS&lt;&#x2F;a&gt; 可能是你更好的选择，这些是流行的基于 ArchLinux 的桌面发行版，它在保留 ArchLinux 部分特性的同时又做到了安装简单和开箱即用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;准备工作&quot;&gt;准备工作&lt;a class=&quot;zola-anchor&quot; href=&quot;#准备工作&quot; aria-label=&quot;Anchor link for: 准备工作&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;你需要一台支持 UEFI 引导的 64 位（x86_64）的电脑，最好拥有有线网络连接，务必不要使用蓝牙鼠标。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;准备一个容量大于镜像文件尺寸的 U 盘用于制作安装盘。&lt;&#x2F;p&gt;
&lt;p&gt;安装系统前首先要下载系统，前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mirrors.kernel.org&#x2F;archlinux&#x2F;iso&#x2F;latest&#x2F;&quot;&gt;https:&#x2F;&#x2F;mirrors.kernel.org&#x2F;archlinux&#x2F;iso&#x2F;latest&#x2F;&lt;&#x2F;a&gt; 下载 ArchLinux 的镜像文件，下载完成后建议使用&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;hashtab&quot;&gt;文件校验工具&lt;&#x2F;a&gt;配合 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mirrors.kernel.org&#x2F;archlinux&#x2F;iso&#x2F;latest&#x2F;sha1sums.txt&quot;&gt;sha1sums.txt&lt;&#x2F;a&gt; 验证镜像文件完整性。&lt;&#x2F;p&gt;
&lt;p&gt;前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;etcher.io&#x2F;&quot;&gt;etcher.io&lt;&#x2F;a&gt; 下载 Etcher（启动盘制作工具），Etcher 是跨平台的镜像写入工具，Windows、macOS 和 Linux 都可以使用。如果无法成功从官网下载 Etcher，可以在这里下载：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;share.weiyun.com&#x2F;5OvrT9N&quot;&gt;https:&#x2F;&#x2F;share.weiyun.com&#x2F;5OvrT9N&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;U 盘插入电脑后以 root &#x2F; 管理员身份运行 Etcher，点击「Flash form file」选择 ArchLinux 的镜像文件，然后点击「Select target」选择你用于制作安装盘的 U 盘，最后点击「Flash」。&lt;&#x2F;p&gt;
&lt;p&gt;将 ArchLinux 安装盘插入要安装 ArchLinux 的电脑并使用 ArchLinux 安装盘启动，就像安装 Windows 一样。ArchLinux 启动菜单出现后，选择第一个菜单项目并进入。&lt;&#x2F;p&gt;
&lt;p&gt;当出现类似下面的界面时，表示安装环境启动成功。（如果你的电脑启用了 UEFI 安全启动，必须关闭安全启动才可以成功启动。）&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;ls &#x2F;sys&#x2F;firmware&#x2F;efi&#x2F;efivars&lt;&#x2F;code&gt; 命令检查当前是否处于 UEFI 模式。&lt;&#x2F;p&gt;
&lt;p&gt;如果没有列出文件，表示当前没有以 UEFI 模式启动，检查电脑是否支持以及 BIOS 设置 。&lt;&#x2F;p&gt;
&lt;p&gt;稍后的安装操作会使用 nano 文本编辑器编辑文件，你也可以选择使用 vim，如果这两个编辑器你都不会使用，推荐查看 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.vpser.net&#x2F;manage&#x2F;nano.html&quot;&gt;https:&#x2F;&#x2F;www.vpser.net&#x2F;manage&#x2F;nano.html&lt;&#x2F;a&gt; 以学习 nano 的基本用法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;检查网络&quot;&gt;检查网络&lt;a class=&quot;zola-anchor&quot; href=&quot;#检查网络&quot; aria-label=&quot;Anchor link for: 检查网络&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;执行 &lt;code&gt;ip -brief link&lt;&#x2F;code&gt; 查看网卡列表，输出的第一列为网卡名称，名为 &lt;code&gt;lo&lt;&#x2F;code&gt; 的是虚拟网卡，如果列表还有其他网卡，则表示网卡正常。&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;有线网卡名称一般以 e 开头，无线网卡名称一般以 w 开头。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;有线网卡会自动配置 DHCP，一般不需要手动干预。无线网卡根据 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Iwd#iwctl&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Iwd#iwctl&lt;&#x2F;a&gt; 步骤来配置无线网络。如果你是静态 IP 网络，推荐更换为支持 DHCP 的网络再继续。&lt;&#x2F;p&gt;
&lt;p&gt;最后检查网络是否正常，执行 &lt;code&gt;ping -c 5 url.cn&lt;&#x2F;code&gt; 测试网络连通性。&lt;&#x2F;p&gt;
&lt;p&gt;如果网络正常，执行 &lt;code&gt;timedatectl set-ntp true&lt;&#x2F;code&gt; 通过互联网同步系统时间。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;通过_SSH_远程连接（可选）&quot;&gt;通过 SSH 远程连接（可选）&lt;a class=&quot;zola-anchor&quot; href=&quot;#通过_SSH_远程连接（可选）&quot; aria-label=&quot;Anchor link for: 通过_SSH_远程连接（可选）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果觉得手动执行命令太麻烦或者担心输错，想直接复制命令，那么可以使用另一台电脑或移动设备通过 SSH 控制安装环境。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;passwd&lt;&#x2F;code&gt; 为安装环境设置密码，此命令不会显示你输入的密码。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;ip -brief address&lt;&#x2F;code&gt; 查看 IP 地址列表，输出第三列是每个网卡对应的 IP 地址（如果你的网络支持 IPv6 ，可能有多个 IP 地址。），IP 地址不包含&#x2F;后面的掩码位。比如输出 &lt;code&gt;192.168.1.2&#x2F;24&lt;&#x2F;code&gt;，IP 地址应该是 &lt;code&gt;192.168.1.2&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;现在可以使用 SSH 客户端连接至安装环境了，简单说一下 Windows 10&#x2F;11、macOS、Linux、Andorid 和 iOS 如何安装并使用 SSH 客户端。&lt;&#x2F;p&gt;
&lt;p&gt;务必将下列命令中的 &lt;code&gt;${IP}&lt;&#x2F;code&gt; 替换为安装环境的 IP 地址，示例：&lt;code&gt;ssh -o StrictHostKeyChecking=no root@192.168.1.2&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Windows 10&#x2F;11 打开 命令提示符 (cmd)、PowerShell 或 Windows 终端，执行命令 &lt;code&gt;ssh -o StrictHostKeyChecking=no root@${IP}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Linux 和 macOS 在终端执行命令 &lt;code&gt;ssh -o StrictHostKeyChecking=no root@${IP}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果提示 ssh 命令不存在，Windows 系统可参考 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;docs.microsoft.com&#x2F;windows-server&#x2F;administration&#x2F;openssh&#x2F;openssh_install_firstuse&quot;&gt;https:&#x2F;&#x2F;docs.microsoft.com&#x2F;windows-server&#x2F;administration&#x2F;openssh&#x2F;openssh_install_firstuse&lt;&#x2F;a&gt; 进行安装，其他系统自行搜索 OpenSSH 客户端安装方法。&lt;&#x2F;p&gt;
&lt;p&gt;Android 前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;juicessh.com&#x2F;changelog&quot;&gt;https:&#x2F;&#x2F;juicessh.com&#x2F;changelog&lt;&#x2F;a&gt; 下载安装 JuiceSSH，打开后点击「快速连接」，「类型」选择 [SSH]，然后在下方输入 &lt;code&gt;root@${IP}&lt;&#x2F;code&gt;，点击「确定」进行连接。&lt;&#x2F;p&gt;
&lt;p&gt;iOS 前往 App Store 安装 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;apps.apple.com&#x2F;cn&#x2F;app&#x2F;id549039908&quot;&gt;Termius&lt;&#x2F;a&gt;，进入主界面后点击右上角的 +，选择「New Host」，「Hostname」填写安装环境的 IP 地址，勾选「SSH」或「Use SSH」，然后「Username」和「Password」分别填写 root 和密码，最后保存，点击列表中的项目进行连接。&lt;&#x2F;p&gt;
&lt;p&gt;如果无法连接，务必确保安装环境和 SSH 客户端处于同一局域网，以及 OpenSSH 客户端是 7.2 或更高版本（执行 &lt;code&gt;ssh -V&lt;&#x2F;code&gt; 查看版本信息）。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;硬盘分区&quot;&gt;硬盘分区&lt;a class=&quot;zola-anchor&quot; href=&quot;#硬盘分区&quot; aria-label=&quot;Anchor link for: 硬盘分区&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果你需要 Linux + Windows 双系统，建议使用两个物理硬盘安装，以下分区方式不适用于单硬盘双系统。如果你想要单硬盘双系统，可以加入 QQ 群向我询问。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;fdisk -l&lt;&#x2F;code&gt; 查看硬盘以及分区列表，确定你要用于安装系统的硬盘路径，比如这里我用的是 &lt;code&gt;&#x2F;dev&#x2F;sda&lt;&#x2F;code&gt;。loop 设备是光驱等虚拟设备，不是真实的硬盘，不能用于安装系统。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;archlinux-installation-guide-simple&#x2F;.&#x2F;2.webp&quot; alt=&quot;fdisk -l 命令执行结果&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你有多块硬盘，第一块硬盘一般为 &lt;code&gt;&#x2F;dev&#x2F;sda&lt;&#x2F;code&gt; 或 &lt;code&gt;&#x2F;dev&#x2F;nvme0n1&lt;&#x2F;code&gt; (NVME)，第二块硬盘一般为 &lt;code&gt;&#x2F;dev&#x2F;sdb&lt;&#x2F;code&gt; 或 &lt;code&gt;&#x2F;dev&#x2F;nvme0n2&lt;&#x2F;code&gt; (NVME)，以此类推。U 盘或移动硬盘也会被列出，注意不要搞错。&lt;&#x2F;p&gt;
&lt;p&gt;如果你的硬盘没有被列出，可能是在 BIOS 开启了 RAID 模式（部分笔记本会默认开启），前往 BIOS 将硬盘模式改为 AHCI 模式即可，更改后可能会导致现有的 Windows 无法启动。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;下述分区操作将清空目标硬盘数据，请在操作前做好数据备份。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;务必将下列命令中的 &lt;code&gt;${diskPath}&lt;&#x2F;code&gt; 替换为你的硬盘路径。示例：&lt;code&gt;sgdisk &#x2F;dev&#x2F;sda&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;擦除分区表：&lt;code&gt;sgdisk -Z ${diskPath}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;创建大小为 1024M 的 ESP 分区（UEFI 引导必要分区）：&lt;code&gt;sgdisk -n=0:0:+1024M -t=0:ef00 ${diskPath}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;使用剩余空间创建系统分区：&lt;code&gt;sgdisk -N=0 ${diskPath}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;显示分区信息：&lt;code&gt;fdisk -l ${diskPath}&lt;&#x2F;code&gt;，对比你的分区信息是否与下列信息相似，重点是分区类型 (Type)。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Disk ${diskPath}: *** GiB, *** bytes, *** sectors&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Disk model: ***&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Units: sectors of 1 * *** = *** bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Sector size (logical&#x2F;physical): *** bytes &#x2F; *** bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;I&#x2F;O size (minimum&#x2F;optimal): ** bytes &#x2F; *** bytes&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Disklabel type: gpt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Disk identifier: ***&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Device         Start    End    Sectors    Size    Type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;${diskPath}1   ***      ***    ***        260M    EFI System&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;${diskPath}2   ***      ***    ***        ***G    Linux filesystem&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;某些教程的分区步骤会创建一个额外的 SWAP（交换空间）分区，这里并不推荐创建，具体原因参考下面的【设置交换空间】章节&lt;&#x2F;p&gt;
&lt;p&gt;如果你的硬盘空间较大，或者想把系统和数据分别存放在不同的分区，想要多个分区也可以。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;格式化并挂载分区&quot;&gt;格式化并挂载分区&lt;a class=&quot;zola-anchor&quot; href=&quot;#格式化并挂载分区&quot; aria-label=&quot;Anchor link for: 格式化并挂载分区&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;格式化 ESP 分区为 FAT32：&lt;code&gt;mkfs.fat -F 32 ${part1Path}&lt;&#x2F;code&gt;，把 &lt;code&gt;${part1Path}&lt;&#x2F;code&gt; 替换为第一个分区的路径，示例：&lt;code&gt;mkfs.fat -F 32 &#x2F;dev&#x2F;sda1&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;注意：如果你在格式化 ESP 分区的时候提示：WARNING: Not enough clusters for a 32 bit FAT!，请尝试使用 &lt;code&gt;mkfs.fat -s 2 -F 32 ${part1Path}&lt;&#x2F;code&gt; 或 &lt;code&gt;mkfs.fat -s 1 -F 32 ${part1Path}&lt;&#x2F;code&gt; 命令来格式化 ESP 分区，否则 UEFI 固件可能会无法读取 ESP 分区。&lt;&#x2F;p&gt;
&lt;p&gt;格式化系统分区为 EXT4：&lt;code&gt;mkfs.ext4 -m 5 ${part2Path}&lt;&#x2F;code&gt;，把 &lt;code&gt;${part2Path}&lt;&#x2F;code&gt; 替换为第二个分区路径，示例：&lt;code&gt;mkfs.ext4 -m 5 &#x2F;dev&#x2F;sda2&lt;&#x2F;code&gt;。（-m是指定保留块所占百分比，默认值为 5，用作保留快的空间不能被使用。你可以减小这个值增加分区的可用空间，或者增大这个值提升固态硬盘的性能。）&lt;&#x2F;p&gt;
&lt;p&gt;如果你想要更好的性能和更现代的功能，可以在系统分区尝试使用 XFS 文件系统：&lt;code&gt;mkfs.xfs ${part2Path}&lt;&#x2F;code&gt;，XFS 可能需要手动维护，参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;XFS&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;XFS&lt;&#x2F;a&gt;，另外 XFS 分区大小目前只支持扩容，不支持缩小。&lt;&#x2F;p&gt;
&lt;p&gt;当然你也可以在系统分区使用其他文件系统，比如 Btrfs、JFS、F2FS 等，你可以前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;&quot;&gt;ArchWiki&lt;&#x2F;a&gt; 查看这些文件系统的对应文档。&lt;&#x2F;p&gt;
&lt;p&gt;挂载系统分区：&lt;code&gt;mount ${part2Path} &#x2F;mnt&lt;&#x2F;code&gt;，把 &lt;code&gt;${part2Path}&lt;&#x2F;code&gt; 替换为第二个分区路径，示例：&lt;code&gt;mount &#x2F;dev&#x2F;sda2 &#x2F;mnt&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;创建 ESP 分区挂载路径：&lt;code&gt;mkdir &#x2F;mnt&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;挂载 ESP 分区：&lt;code&gt;mount -o umask=0077 ${part1Path} &#x2F;mnt&#x2F;boot&lt;&#x2F;code&gt;，把 &lt;code&gt;${part1Path}&lt;&#x2F;code&gt; 替换为第一个分区路径，示例：&lt;code&gt;mount -o umask=0077 &#x2F;dev&#x2F;sda1 &#x2F;mnt&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;检查分区是否挂载成功：&lt;code&gt;df&lt;&#x2F;code&gt;，如果输出包含类似以下行，则代表挂载成功。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Filesystem    Size    Used    Avail    Use%    Mounted on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;${part2Path}  ***     ***     ***      ***%    &#x2F;mnt&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;${part1Path}  ***     ***     ***      ***%    &#x2F;mnt&#x2F;boot&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;&lt;h2 id=&quot;设置中国镜像源（推荐）&quot;&gt;设置中国镜像源（推荐）&lt;a class=&quot;zola-anchor&quot; href=&quot;#设置中国镜像源（推荐）&quot; aria-label=&quot;Anchor link for: 设置中国镜像源（推荐）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;安装环境默认启用了所有的软件镜像源，为了使安装更顺利，建议只使用位于中国的镜像，如果你不在中国或者对自己的网络有信心可以忽略此操作。&lt;&#x2F;p&gt;
&lt;p&gt;下载中国镜像列表：&lt;code&gt;curl -L -o &#x2F;etc&#x2F;pacman.d&#x2F;mirrorlist &quot;https:&#x2F;&#x2F;archlinux.org&#x2F;mirrorlist&#x2F;?country=CN&quot;&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;nano &#x2F;etc&#x2F;pacman.d&#x2F;mirrorlist&lt;&#x2F;code&gt; 编辑镜像列表文件，删除 &lt;code&gt;#Server =&lt;&#x2F;code&gt; 前面的#以启用镜像，不需要全部启用，一般 3 个就够了。某些镜像同时支持 HTTP 和 HTTPS 协议，只需要删除 HTTPS 协议行的 &lt;code&gt;#&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;镜像列表默认按照字母排序，推荐安装完系统后选择一个速度较快的镜像，并把它放在其他镜像前面。不同的镜像更新间隔有些许不同，而 Arch 又是一个以滚动发布著称的发行版，软件更新频率较快。如果你对更新频率有较高的要求，建议选择更新间隔较短的镜像。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装系统&quot;&gt;安装系统&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装系统&quot; aria-label=&quot;Anchor link for: 安装系统&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;设置本地化环境：&lt;code&gt;export LANG=C&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装所需软件包到系统分区：&lt;code&gt;pacstrap &#x2F;mnt base linux linux-firmware bash-completion e2fsprogs nano networkmanager pacman-contrib sudo amd-ucode intel-ucode sof-firmware&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;软件包介绍：&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base # ArchLinux 运行所需的基础软件包集合&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;linux # Linux 内核&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;linux-firmware # Linux 设备驱动集合，包含了绝大多数设备的驱动（固件）。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;bash-completion # Bash 补全支持&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;e2fsprogs # EXT4 文件系统实用工具&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nano # 文本编辑器&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;networkmanager # 网络管理器&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pacman-contrib # pacman 相关实用脚本&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo # 用于普通用户获取 root 权限&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;amd-ucode intel-ucode # AMD 和 Intel 的 CPU 微码更新，用于修补 CPU 漏洞。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sof-firmware # Open Sound 固件&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;虚拟机用户不需要安装 &lt;code&gt;amd-ucode intel-ucode&lt;&#x2F;code&gt;，物理机用户也可以只安装适用于你电脑的 CPU 的微码包，比如 AMD CPU 用户就不需要安装 &lt;code&gt;intel-ucode&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;如果你使用了 XFS 文件系统，将 &lt;code&gt;e2fsprogs&lt;&#x2F;code&gt; 替换为 &lt;code&gt;xfsprogs&lt;&#x2F;code&gt;，或者替换为你的文件系统的工具包。&lt;&#x2F;p&gt;
&lt;p&gt;如果你的设备不是笔记本可以不安装 &lt;code&gt;sof-firmware&lt;&#x2F;code&gt;，也可以等到稍后设备没声音时再安装它尝试修复。&lt;&#x2F;p&gt;
&lt;p&gt;可以趁安装的这段时间喝口水，它并不需要很久。&lt;&#x2F;p&gt;
&lt;p&gt;成功安装完成后执行 &lt;code&gt;genfstab -U &#x2F;mnt &amp;gt; &#x2F;mnt&#x2F;etc&#x2F;fstab&lt;&#x2F;code&gt; 生成 fstab 文件&lt;&#x2F;p&gt;
&lt;p&gt;最后执行 &lt;code&gt;arch-chroot &#x2F;mnt&lt;&#x2F;code&gt; 进入新系统环境。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;系统初始化设置&quot;&gt;系统初始化设置&lt;a class=&quot;zola-anchor&quot; href=&quot;#系统初始化设置&quot; aria-label=&quot;Anchor link for: 系统初始化设置&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;设置&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;System_time#Time_zone&quot;&gt;时区&lt;&#x2F;a&gt;为中国：&lt;code&gt;ln -sf &#x2F;usr&#x2F;share&#x2F;zoneinfo&#x2F;Asia&#x2F;Shanghai &#x2F;etc&#x2F;localtime&lt;&#x2F;code&gt;，你也可以设置为所在的时区。完整的时区列表：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;twiki.org&#x2F;cgi-bin&#x2F;xtra&#x2F;tzdatepick.html&quot;&gt;https:&#x2F;&#x2F;twiki.org&#x2F;cgi-bin&#x2F;xtra&#x2F;tzdatepick.html&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;同步硬件时钟：&lt;code&gt;hwclock --systohc&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;务必将下列命令中的 &lt;code&gt;${hostname}&lt;&#x2F;code&gt; 替换为你的主机名（例如：kanto）。主机名建议使用小写字母组成，最多 64 个字符，你可以使用下面的输入框验证主机名是否符合规则。&lt;&#x2F;p&gt;
&lt;form id=&quot;linux-hostname&quot; style=&quot;max-width: 512px; margin: 0 auto; text-align: center;&quot;&gt;
    &lt;input id=&quot;linux-hostname-input&quot; autocomplete=&quot;off&quot; maxlength=&quot;64&quot; pattern=&quot;[A-Za-z0-9]([A-Za-z0-9\-]*[A-Za-z0-9])?&quot; type=&quot;text&quot; placeholder=&quot;请输入主机名&quot; style=&quot;border: 2px #ff7675 solid; margin: 4px; padding: 2px 4px;&quot;&gt;
    &lt;div id=&quot;linux-hostname-result&quot; style=&quot;display: inline&quot;&gt;
    &lt;script&gt;
        document.getElementById(&#x27;linux-hostname-input&#x27;).oninput = function (ev) {
            var e = document.getElementById(&#x27;linux-hostname-result&#x27;);
            if (ev.target.value === &#x27;&#x27;) {
                e.textContent = &#x27;&#x27;
            } else {
                e.textContent = document.getElementById(&quot;linux-hostname&quot;).checkValidity() ? &#x27;正确&#x27; : &#x27;错误&#x27;
            }
        }
    &lt;&#x2F;script&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;form&gt;
&lt;p&gt;设置系统&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Network_configuration#Set_the_hostname&quot;&gt;主机名&lt;&#x2F;a&gt;：&lt;code&gt;echo ${hostname} &amp;gt; &#x2F;etc&#x2F;hostname&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;nano &#x2F;etc&#x2F;hosts&lt;&#x2F;code&gt; 编辑 hosts 文件并添加以下行：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;127.0.0.1 localhost&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;127.0.0.1 ${hostname}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;::1 ip6-localhost ip6-loopback&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;::1 ${hostname}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;执行 &lt;code&gt;nano &#x2F;etc&#x2F;locale.gen&lt;&#x2F;code&gt; 编辑&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Locale&quot;&gt;本地化&lt;&#x2F;a&gt;配置文件，删除以下行前面的 &lt;code&gt;#&lt;&#x2F;code&gt;，可以使用 &lt;kbd&gt;Page Up&lt;&#x2F;kbd&gt; 和 &lt;kbd&gt;Page Down&lt;&#x2F;kbd&gt; 健来快速翻页上下滚动。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#en_US.UTF-8 UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#zh_CN.UTF-8 UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#zh_TW.UTF-8 UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果你需要其他本地化，删除其他行前的#，行末尾务必是 UTF-8。最后保存退出，执行 &lt;code&gt;locale-gen&lt;&#x2F;code&gt; 生成本地化环境。&lt;&#x2F;p&gt;
&lt;p&gt;设置默认本地化环境：&lt;code&gt;echo LANG=en_US.UTF-8 &amp;gt; &#x2F;etc&#x2F;locale.conf&lt;&#x2F;code&gt;，为了确保兼容性，默认本地化环境最好是英语。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;SUDO_EDITOR=nano visudo&lt;&#x2F;code&gt; 编辑 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Sudo&quot;&gt;sudo&lt;&#x2F;a&gt; 配置文件，删除 &lt;code&gt;# %wheel ALL=(ALL) ALL&lt;&#x2F;code&gt; 行前面的#以便让 wheel 用户组可以使用 sudo 获取 root 权限。&lt;&#x2F;p&gt;
&lt;p&gt;务必将下列命令中的 &lt;code&gt;${username}&lt;&#x2F;code&gt; 替换为你的用户名（例如：pikachu）。用户名建议使用小写字母组成（不能包含大写字母、不能以数字开头），最多 32 个字符，你可以使用下面的输入框验证用户名是否符合规则。&lt;&#x2F;p&gt;
&lt;form id=&quot;linux-username&quot; style=&quot;max-width: 512px; margin: 0 auto; text-align: center;&quot;&gt;
    &lt;input id=&quot;linux-username-input&quot; autocomplete=&quot;off&quot; maxlength=&quot;32&quot; pattern=&quot;[a-z_][a-z0-9_-]*[$]?&quot; type=&quot;text&quot; placeholder=&quot;请输入用户名&quot; style=&quot;border: 2px #ff7675 solid; margin: 4px; padding: 2px 4px;&quot;&gt;
    &lt;div id=&quot;linux-username-result&quot; style=&quot;display: inline&quot;&gt;
    &lt;script&gt;
        document.getElementById(&#x27;linux-username-input&#x27;).oninput = function (ev) {
            var e = document.getElementById(&#x27;linux-username-result&#x27;);
            if (ev.target.value === &#x27;&#x27;) {
                e.textContent = &#x27;&#x27;
            } else {
                e.textContent = document.getElementById(&quot;linux-username&quot;).checkValidity() ? &#x27;正确&#x27; : &#x27;错误&#x27;
            }
        }
    &lt;&#x2F;script&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;form&gt;
&lt;p&gt;创建一个新&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Users_and_groups&quot;&gt;用户&lt;&#x2F;a&gt;并加入 wheel 用户组：&lt;code&gt;useradd -m -G wheel -s &#x2F;bin&#x2F;bash ${username}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;设置新用户密码：&lt;code&gt;passwd ${username}&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;安装引导管理程序（重要）&quot;&gt;安装引导管理程序（重要）&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装引导管理程序（重要）&quot; aria-label=&quot;Anchor link for: 安装引导管理程序（重要）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;安装 GRUB 软件包：&lt;code&gt;pacman -S grub&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装 GRUB 至 ESP 分区：&lt;code&gt;grub-install --removable --target=x86_64-efi --efi-directory=&#x2F;boot&lt;&#x2F;code&gt;，提示 &lt;code&gt;Installation finished. No error reported.&lt;&#x2F;code&gt; 字样表示安装成功。&lt;&#x2F;p&gt;
&lt;p&gt;生成 GRUB 配置文件：&lt;code&gt;grub-mkconfig -o &#x2F;boot&#x2F;grub&#x2F;grub.cfg&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;PS: 如果你电脑的 UEFI 固件不支持 64 位 UEFI 文件，则需要安装 32 位 UEFI 文件才能成功引导：&lt;code&gt;grub-install --removable --target=i386-efi --efi-directory=&#x2F;boot&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你不喜欢 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;GRUB&quot;&gt;GRUB&lt;&#x2F;a&gt;，或者喜欢简单的&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_boot_process#Boot_loader&quot;&gt;引导管理程序&lt;&#x2F;a&gt;，可以尝试下 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Systemd-boot&quot;&gt;systemd-boot&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;退出新系统环境：&lt;code&gt;exit&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;umount -R &#x2F;mnt&lt;&#x2F;code&gt; 卸载分区，如果没有错误，拔掉 ArchLinux 安装盘并执行 &lt;code&gt;reboot&lt;&#x2F;code&gt; 重启系统。&lt;&#x2F;p&gt;
&lt;p&gt;没有意外的话，应该成功启动至新系统并看到以下界面，login 前面显示的是主机名，输入刚刚创建的新用户名和密码登陆系统。如果你有多个系统，可能并不会重启至 ArchLinux，需要你手动选择 ArchLinux 启动。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;archlinux-installation-guide-simple&#x2F;.&#x2F;3.webp&quot; alt=&quot;Linux 系统登录界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;root_权限小贴士&quot;&gt;root 权限小贴士&lt;a class=&quot;zola-anchor&quot; href=&quot;#root_权限小贴士&quot; aria-label=&quot;Anchor link for: root_权限小贴士&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;sudo 是临时获取 root 权限的工具，如果需要 root 权限执行某个命令，可以使用 sudo 执行它。sudo 提供了细粒化的控制，使它更加的安全。&lt;&#x2F;p&gt;
&lt;p&gt;虽然 su 也可以获取 root 权限，但是正常情况下你不应该使用它，相较 sudo，它太暴力了。如果没有设置 root 密码，su也将无法工作。&lt;&#x2F;p&gt;
&lt;p&gt;一些命令内置了独立的提权实现，比如 systemctl 命令，当这些命令需要 root 权限，但是没有以 root 身份允许时，它们就会使用自己的提权实现进行提权操作。&lt;&#x2F;p&gt;
&lt;p&gt;可以使用 sudo -i 临时登陆到 root 用户的 Shell。&lt;&#x2F;p&gt;
&lt;p&gt;root 虽好，但不要滥用，使用之前应该先了解当前命令的操作是否真的需要 root 权限，滥用 root 权限轻则会导致一些程序无法正常工作，重则会危及系统安全。&lt;&#x2F;p&gt;
&lt;p&gt;ArchLinux 的 root 用户默认处于无密码锁定状态，除非你清楚自己在做什么，否则不建议解锁或设置密码。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;首次启动后的一些设置&quot;&gt;首次启动后的一些设置&lt;a class=&quot;zola-anchor&quot; href=&quot;#首次启动后的一些设置&quot; aria-label=&quot;Anchor link for: 首次启动后的一些设置&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;启用&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;NetworkManager&quot;&gt;网络管理器&lt;&#x2F;a&gt;（注意大小写）：&lt;code&gt;sudo systemctl enable --now NetworkManager&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果是无线网络，执行 &lt;code&gt;nmtui&lt;&#x2F;code&gt; 使用图形界面进行配置，选择「Activate a connection」连接无线网络。&lt;&#x2F;p&gt;
&lt;p&gt;如果你还想继续使用 SSH 远程控制，执行 &lt;code&gt;sudo pacman -S openssh&lt;&#x2F;code&gt; 安装 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;OpenSSH&quot;&gt;OpenSSH&lt;&#x2F;a&gt;，然后执行 &lt;code&gt;sudo systemctl start sshd&lt;&#x2F;code&gt; 启动 SSH 服务器。不过此时就不能使用 root 用户登陆 SSH 了，需要使用刚刚创建的新用户。&lt;&#x2F;p&gt;
&lt;p&gt;禁用网络管理器的连接等待（注意大小写）：&lt;code&gt;sudo systemctl disable NetworkManager-wait-online&lt;&#x2F;code&gt;，禁用后可以加快系统启动，不会可能会对某些程序有副作用。&lt;&#x2F;p&gt;
&lt;p&gt;启用从网络&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Systemd-timesyncd&quot;&gt;同步系统时间&lt;&#x2F;a&gt;：&lt;code&gt;sudo timedatectl set-ntp true&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启用本地 DNS 解析器（可选，建议启用）：&lt;code&gt;sudo systemctl enable --now systemd-resolved&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;创建 DNS 解析文件软链接（依赖上一个操作）：&lt;code&gt;sudo ln -sf &#x2F;run&#x2F;systemd&#x2F;resolve&#x2F;stub-resolv.conf &#x2F;etc&#x2F;resolv.conf&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启用每周自动清理不需要的 Pacman 软件包缓存（可选，建议启用）：&lt;code&gt;sudo systemctl enable paccache.timer&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你使用的硬盘支持 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Solid_state_drive#TRIM&quot;&gt;TRIM&lt;&#x2F;a&gt; 特性（大多数固态硬盘都支持），建议启用定时执行 TRIM：&lt;code&gt;sudo systemctl enable fstrim.timer&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你需要使用 Wine、Steam 或其他的 32 位程序，执行 &lt;code&gt;sudo nano &#x2F;etc&#x2F;pacman.conf&lt;&#x2F;code&gt; 编辑 Pacman 配置文件，删除以下行前面的 &lt;code&gt;#&lt;&#x2F;code&gt; 以启用 32 位系统库支持。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[multilib] &lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#Include = &#x2F;etc&#x2F;pacman.d&#x2F;mirrorlist&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;保存后执行 &lt;code&gt;sudo pacman -Sy&lt;&#x2F;code&gt; 更新软件数据库。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;添加_ArchLinuxCN_存储库（推荐）&quot;&gt;添加 ArchLinuxCN 存储库（推荐）&lt;a class=&quot;zola-anchor&quot; href=&quot;#添加_ArchLinuxCN_存储库（推荐）&quot; aria-label=&quot;Anchor link for: 添加_ArchLinuxCN_存储库（推荐）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.archlinuxcn.org&#x2F;&quot;&gt;Arch Linux 中文社区&lt;&#x2F;a&gt;仓库是由 Arch Linux 中文社区驱动的非官方软件仓库，包含许多官方仓库未提供的额外的软件包，以及已有软件的 git 版本等变种。一部分软件包的打包脚本来源于 AUR，但也有许多包与 AUR 不一样。（关于 AUR 的介绍请见下面的章节）&lt;&#x2F;p&gt;
&lt;p&gt;ArchLinuxCN 依靠镜像加速可以在国内提供比 AUR 更好的体验，而且还省去了部分软件的编译过程。如果你的网络环境导致无法顺利从 AUR 安装某些软件包，推荐添加。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;sudo nano &#x2F;etc&#x2F;pacman.conf&lt;&#x2F;code&gt; 编辑 Pacman 配置文件，在底部添加以下行。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[archlinuxcn]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Server = https:&#x2F;&#x2F;mirrors.163.com&#x2F;archlinux-cn&#x2F;$arch&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;保存后执行 &lt;code&gt;sudo pacman -Sy archlinuxcn-keyring&lt;&#x2F;code&gt; 更新软件数据库并安装 ArchLinuxCN GPG 密钥，如果安装命令出现 &lt;code&gt;error: archlinuxcn-keyring: Signature from &quot;Jiachen YANG (Arch Linux Packager Signing Key) &quot; is marginal trust&lt;&#x2F;code&gt; 这样的错误，执行命令 &lt;code&gt;sudo pacman-key --lsign-key &quot;farseerfc@archlinux.org&quot;&lt;&#x2F;code&gt; 修复，然后再重新执行安装命令。&lt;&#x2F;p&gt;
&lt;p&gt;上面的配置使用了 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;mirrors.163.com&#x2F;&quot;&gt;网易&lt;&#x2F;a&gt; 的 ArchLinuxCN 镜像，你也可以前往&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;archlinuxcn&#x2F;mirrorlist-repo&quot;&gt;镜像列表&lt;&#x2F;a&gt;查看并使用其他镜像。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装防火墙支持（可选）：&quot;&gt;安装防火墙支持（可选）：&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装防火墙支持（可选）：&quot; aria-label=&quot;Anchor link for: 安装防火墙支持（可选）：&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果你需要在非信任的网络下使用设备，推荐使用防火墙增强你的设备网络安全性，如果你只在你信任的网络下使用设备，那么可以不安装。&lt;&#x2F;p&gt;
&lt;p&gt;防火墙有很多选择，ArchLinux 的基础包默认已经包含了 &lt;code&gt;iptables&lt;&#x2F;code&gt; 实用工具，用于配置 Linux 内核实现的防火墙，不过由于它并不易用，我推荐最好是使用易用的 iptables 前端。&lt;&#x2F;p&gt;
&lt;p&gt;我推荐大家安装 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Firewalld&quot;&gt;Firewalld&lt;&#x2F;a&gt;，它简单易用，并且我们待会安装的桌面环境可以很好的集成它，便于使用图形界面管理。其他 iptables 前端可参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Iptables#Front-ends&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Iptables#Front-ends&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装防火墙：&lt;code&gt;sudo pacman -S firewalld&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启用防火墙：&lt;code&gt;sudo systemctl enable --now firewalld&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Firewalld 更多信息：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Firewalld&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Firewalld&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装显卡驱动&quot;&gt;安装显卡驱动&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装显卡驱动&quot; aria-label=&quot;Anchor link for: 安装显卡驱动&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;我只实际测试过 AMD 和 Intel 的显卡驱动安装，Nvidia 显卡驱动安装尚未测试。&lt;&#x2F;p&gt;
&lt;p&gt;Vulkan 是跨平台图形接口，目前主要用途是在 Linux 下运行 Windows 游戏以及部分 Linux 游戏，但并不是所有显卡都支持它，你可以前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;vulkan.gpuinfo.org&#x2F;listreports.php?platform=linux&quot;&gt;https:&#x2F;&#x2F;vulkan.gpuinfo.org&#x2F;listreports.php?platform=linux&lt;&#x2F;a&gt; 查询你的显卡是否支持 Vulkan。&lt;&#x2F;p&gt;
&lt;p&gt;OpenCL 是可选的，推荐需要时再安装。&lt;&#x2F;p&gt;
&lt;p&gt;如果你没有启用 32 位系统库支持，执行下列命令时务必删除 &lt;code&gt;lib32&lt;&#x2F;code&gt; 开头的软件包。&lt;&#x2F;p&gt;
&lt;p&gt;根据你的显卡品牌选择下列对应的安装步骤。如果是双显卡的笔记本，运行软件时可以选择使用的显卡（默认是集成显卡）。参见：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;PRIME&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;PRIME&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;AMD&quot;&gt;AMD&lt;a class=&quot;zola-anchor&quot; href=&quot;#AMD&quot; aria-label=&quot;Anchor link for: AMD&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;图形加速库：&lt;code&gt;sudo pacman -S mesa&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;硬件视频加速：&lt;code&gt;sudo pacman -S mesa-vdpau libva-mesa-driver lib32-mesa lib32-mesa-vdpau lib32-libva-mesa-driver lib32-opencl-mesa&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Vulkan：&lt;code&gt;sudo pacman -S vulkan-icd-loader vulkan-radeon lib32-vulkan-icd-loader lib32-vulkan-radeon&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;OpenCL: &lt;code&gt;sudo pacman -S opencl-mesa ocl-icd&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;GPUOpen-Drivers&#x2F;AMDVLK&quot;&gt;amdvlk&lt;&#x2F;a&gt; 是由 AMD 开源的 AMD GPU Vulkan 实现，这个实现比 Mesa 的 RADV 在某些场景下性能要好一些，并且系统允许安装多个 Vulkan 实现并让软件进行选择，推荐游戏玩家安装。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Intel&quot;&gt;Intel&lt;a class=&quot;zola-anchor&quot; href=&quot;#Intel&quot; aria-label=&quot;Anchor link for: Intel&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;图形加速库：&lt;code&gt;sudo pacman -S mesa&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;硬件视频加速：如果你的 Intel CPU 架构是 Broadwell 或以上（包括 Intel Arc 显卡）的安装 &lt;code&gt;intel-media-driver&lt;&#x2F;code&gt;，反之则安装 &lt;code&gt;libva-intel-driver&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;Vulkan：&lt;code&gt;sudo pacman -S vulkan-icd-loader vulkan-intel lib32-mesa lib32-vulkan-icd-loader lib32-vulkan-intel&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;OpenCL：如果你的 Intel CPU 架构是 Broadwell 或以上（包括 Intel Arc 显卡）的安装 &lt;code&gt;intel-compute-runtime ocl-icd&lt;&#x2F;code&gt;，反之则安装 &lt;code&gt;beignet ocl-icd&lt;&#x2F;code&gt;，beignet 需要通过 AUR 安装。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Nvidia&quot;&gt;Nvidia&lt;a class=&quot;zola-anchor&quot; href=&quot;#Nvidia&quot; aria-label=&quot;Anchor link for: Nvidia&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.nvidia.com&#x2F;en-us&#x2F;drivers&#x2F;unix&#x2F;legacy-gpu&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.nvidia.com&#x2F;en-us&#x2F;drivers&#x2F;unix&#x2F;legacy-gpu&#x2F;&lt;&#x2F;a&gt; 查看 Nvidia 私有驱动最新版本不支持的显卡列表，如果你的显卡不在这个列表里，那么你可以使用最新的 Nvidia 私有驱动，反之则需要使用开源驱动或旧版私有驱动（通过 AUR 安装）。&lt;&#x2F;p&gt;
&lt;p&gt;Nvidia 私有驱动：&lt;code&gt;sudo pacman -S nvidia nvidia-settings cuda xorg-server-devel lib32-nvidia-utils&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Nvidia 开源驱动 (RTX 3000 系列或更高)：&lt;code&gt;sudo pacman -S nvidia-open nvidia-settings cuda xorg-server-devel lib32-nvidia-utils&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;OpenCL: &lt;code&gt;sudo pacman -S opencl-nvidia ocl-icd lib32-opencl-nvidia&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Nouveau 是 Linux 内核的 Nvidia 显卡开源驱动，由于 Nvidia 新显卡需要签名固件，所以它无法支持一些较新系列的显卡，推荐 GTX 700 或以下系列使用。&lt;&#x2F;p&gt;
&lt;p&gt;Nouveau 图形加速库：&lt;code&gt;sudo pacman -S mesa&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Nouveau 硬件视频加速：&lt;code&gt;sudo pacman -S mesa-vdpau libva-mesa-driver lib32-mesa lib32-mesa-vdpau lib32-libva-mesa-driver&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装显示管理器和桌面环境&quot;&gt;安装显示管理器和桌面环境&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装显示管理器和桌面环境&quot; aria-label=&quot;Anchor link for: 安装显示管理器和桌面环境&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;本指南以 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;KDE#Plasma&quot;&gt;KDE Plasma&lt;&#x2F;a&gt; 桌面环境 + &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;SDDM&quot;&gt;SDDM&lt;&#x2F;a&gt; 显示管理器为例&lt;&#x2F;p&gt;
&lt;p&gt;Plasma 是功能全面且对新手友好的桌面环境，具有高度可定制性，并且它在最近的更新中，性能提升了很多。&lt;&#x2F;p&gt;
&lt;p&gt;SDDM 显示管理器是 Plasma 推荐的显示管理器&lt;&#x2F;p&gt;
&lt;p&gt;如果你想使用其他桌面环境或显示管理器，建议前往其他桌面环境或显示管理器的 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;&quot;&gt;ArchWiki&lt;&#x2F;a&gt; 页面详细了解&lt;&#x2F;p&gt;
&lt;p&gt;桌面环境列表：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Desktop_environment#List_of_desktop_environments&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Desktop_environment#List_of_desktop_environments&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;显示管理器列表：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Display_manager#List_of_display_managers&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Display_manager#List_of_display_managers&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装桌面环境、显示管理器、终端（Konsole）以及 Noto 字体集：&lt;code&gt;sudo pacman -S --noconfirm plasma sddm konsole noto-fonts noto-fonts-cjk noto-fonts-emoji&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装 Plasma 可选依赖（使其更好的工作）：&lt;code&gt;sudo pacman -S --asdeps gst-plugins-good packagekit-qt5 xsettingsd&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你是笔记本用户，推荐安装 &lt;code&gt;fwupd&lt;&#x2F;code&gt; 以便通过 LVFS 接受来自厂商的固件更新（需要厂商支持），以及安装 &lt;code&gt;power-profiles-daemon&lt;&#x2F;code&gt; 获取电源配置文件支持（需要设备支持）。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;可能无用的软件包&quot;&gt;可能无用的软件包&lt;a class=&quot;zola-anchor&quot; href=&quot;#可能无用的软件包&quot; aria-label=&quot;Anchor link for: 可能无用的软件包&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;plasma 是个软件包组，里面可能会有一些用不上的软件包。&lt;&#x2F;p&gt;
&lt;p&gt;以下软件包根据需求决定是否需要卸载&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;drkonqi # KDE 崩溃处理程序&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;kgamma5 # 调整显示器的伽玛设置&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ksshaskpass # ssh-add 密码助手&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plasma-firewall # 防火墙管理界面&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plasma-sdk # Plasma 开发工具包&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plasma-thunderbolt # Thunderbolt（雷电）设备管理界面&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plasma-vault # 创建加密的保险库（需要额外的可选依赖）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;plasma-workspace-wallpapers # Plasma 桌面的额外壁纸&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;卸载以上列出的软件包：&lt;code&gt;sudo pacman -Rns drkonqi kgamma5 ksshaskpass plasma-firewall plasma-sdk plasma-thunderbolt plasma-vault plasma-workspace-wallpapers&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装蓝牙支持（可选）：&quot;&gt;安装蓝牙支持（可选）：&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装蓝牙支持（可选）：&quot; aria-label=&quot;Anchor link for: 安装蓝牙支持（可选）：&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;安装：&lt;code&gt;sudo pacman -S bluedevil&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装可选依赖（蓝牙音频支持）：&lt;code&gt;sudo pacman -S --asdeps pulseaudio-bluetooth&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;启用：&lt;code&gt;sudo systemctl enable bluetooth&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;设置交换空间（可选）&quot;&gt;设置交换空间（可选）&lt;a class=&quot;zola-anchor&quot; href=&quot;#设置交换空间（可选）&quot; aria-label=&quot;Anchor link for: 设置交换空间（可选）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;关于交换空间的介绍，建议阅读这篇译文：https:&#x2F;&#x2F;farseerfc.me&#x2F;in-defence-of-swap.html&lt;&#x2F;p&gt;
&lt;p&gt;如果要使用交换空间，你也可以尝试一下 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Zswap&quot;&gt;Zswap&lt;&#x2F;a&gt; 和 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Improving_performance#zram_or_zswap&quot;&gt;ZRAM&lt;&#x2F;a&gt;，两者皆在物理内存中提供压缩的交换空间，从而使物理内存可以容纳更多的数据，减少硬盘上的交换空间的 I&#x2F;O 操作，有效延长固态硬盘寿命，代价是使用更多的 CPU。&lt;&#x2F;p&gt;
&lt;p&gt;**注意：当你启用了交换空间，部分桌面的电源菜单会出现「休眠」选项，但是它并不会工作，因为休眠需要配置内核参数以及 initramfs hook。**参见：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Power_management&#x2F;Suspend_and_hibernate#Hibernation&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Power_management&#x2F;Suspend_and_hibernate#Hibernation&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;交换分区还是交换文件&quot;&gt;交换分区还是交换文件&lt;a class=&quot;zola-anchor&quot; href=&quot;#交换分区还是交换文件&quot; aria-label=&quot;Anchor link for: 交换分区还是交换文件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;交换空间用硬盘上的一块区域作为虚拟内存，这块区域既可以是一个文件，也可以是一个完整的分区。&lt;&#x2F;p&gt;
&lt;p&gt;以前 Linux 安装会建议为交换空间创建一个单独的分区，以确保交换空间的最佳性能。这种做法是因为在当时大多数电脑还是机械硬盘，机械硬盘起始扇区的速度可能会更快，完整的分区还可以避免碎片等问题。但是缺点也很明显，一旦建立分区，调整大小会非常麻烦，自由度较低。&lt;&#x2F;p&gt;
&lt;p&gt;现在的电脑大多数都使用固态硬盘，没有了机械硬盘的一些限制，所以更推荐使用交换文件，可以使交换空间更加灵活。&lt;&#x2F;p&gt;
&lt;p&gt;推荐使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Nefelim4ag&#x2F;systemd-swap&quot;&gt;systemd-swap&lt;&#x2F;a&gt; 来管理交换空间、Zswap 或 ZRAM，它可以根据当前内存和交换空间的使用情况自动创建新的交换空间，同时也可以比较方便的管理 Zswap 和 ZRAM。不过由它创建的交换文件并不能用于系统休眠，如果你有系统休眠需求，建议手动创建。&lt;&#x2F;p&gt;
&lt;p&gt;更多关于交换空间请参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Swap&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Swap&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;更改显示管理器（SSDM）本地化环境（可选）&quot;&gt;更改显示管理器（SSDM）本地化环境（可选）&lt;a class=&quot;zola-anchor&quot; href=&quot;#更改显示管理器（SSDM）本地化环境（可选）&quot; aria-label=&quot;Anchor link for: 更改显示管理器（SSDM）本地化环境（可选）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果要让 SDDM 的本地化环境为非英文，可以执行以下更改。&lt;&#x2F;p&gt;
&lt;p&gt;PS：本地化环境除了影响语言显示，还有时间格式。&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;sudo SYSTEMD_EDITOR=nano systemctl edit sddm&lt;&#x2F;code&gt; 编辑 SDDM 服务单元，在文件第 3 行添加：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[Service]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Environment=LANG=zh_CN.UTF-8&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果是其他语言用户，可以把zh_CN替换为你需要的本地化。&lt;&#x2F;p&gt;
&lt;p&gt;启用 SDDM：&lt;code&gt;sudo systemctl enable sddm&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;执行 &lt;code&gt;sudo reboot&lt;&#x2F;code&gt; 重启系统，重启后应该会看到如下图所示的界面，输入密码登陆桌面环境。如果没有看到如下图所示的界面，可能是显卡驱动的安装有问题。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;archlinux-installation-guide-simple&#x2F;.&#x2F;4.webp&quot; alt=&quot;SDDM 登录界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;Plasma_桌面环境配置&quot;&gt;Plasma 桌面环境配置&lt;a class=&quot;zola-anchor&quot; href=&quot;#Plasma_桌面环境配置&quot; aria-label=&quot;Anchor link for: Plasma_桌面环境配置&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;点击屏幕左下角的按钮打开应用启动器，点击「System Settings」打开系统设置。&lt;&#x2F;p&gt;
&lt;p&gt;点击「Regional Setting」，点击系统设置界面右下角的「Add languages...」添加简体中文和繁体中文，并把英文排到最后，简繁排第一和第二，然后点击右下角的「Apply」。点击左侧的「Formats」，选择「Regional」为「中国 - 简体中文 (zh_CN)」，或者选择你所在的区域，然后点击右下角的「Apply」。&lt;&#x2F;p&gt;
&lt;p&gt;按下 &lt;kbd&gt;Ctrl + Alt + Delete&lt;&#x2F;kbd&gt;，选择「Log Out」注销会话并重新登录使其生效。&lt;&#x2F;p&gt;
&lt;p&gt;在应用启动器里找到「Konsole」，也可以通过快捷键 &lt;kbd&gt;Ctrl + Alt + T&lt;&#x2F;kbd&gt; 打开，这是 Plasma 桌面下的终端。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;安装输入法、浏览器和其他实用软件&quot;&gt;安装输入法、浏览器和其他实用软件&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装输入法、浏览器和其他实用软件&quot; aria-label=&quot;Anchor link for: 安装输入法、浏览器和其他实用软件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;你也可以完全按照偏好去选择其他软件，或者不安装，下面有每个软件包的介绍。&lt;&#x2F;p&gt;
&lt;p&gt;安装：&lt;code&gt;sudo pacman -S --noconfirm dolphin ark kwrite gwenview fcitx5-im fcitx5-chinese-addons fcitx5-pinyin-zhwiki firefox firefox-i18n-zh-cn firefox-i18n-zh-tw&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装 dolphin 可选依赖（视频缩略图支持）：&lt;code&gt;sudo pacman -S --asdeps ffmpegthumbs&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装 ark 可选依赖（更多压缩包格式支持）：&lt;code&gt;sudo pacman -S --asdeps lrzip lzop p7zip unrar&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;安装 gwenview 可选依赖（更多图片格式支持）：&lt;code&gt;sudo pacman -S --asdeps kimageformats qt5-imageformats&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;上述软件包介绍：&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dolphin = 文件管理; ark = 压缩工具; kwrite = 文本编辑器; gwenview = 图片浏览器，这些软件都属于 KDE 家族，搭配 KDE Plasma 桌面使用更佳。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fcitx5-im # Fcitx5 输入法框架的软件包组（或许你喜欢 IBus？）&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fcitx5-chinese-addons # Fcitx5 中文插件集合，包含拼音输入法等插件。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fcitx5-pinyin-zhwiki # 来自 zh.wikipedia.org 的 Fcitx5 拼音输入法字典&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;更多基于 Fcitx5 的中文输入法：https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Fcitx5#Chinese&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;firefox # FireFox 浏览器&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;firefox-i18n-zh-cn firefox-i18n-zh-tw # FireFox 的简繁中文语言包，你也可以只安装需要的语言包。&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果你更偏爱使用 Chromium &#x2F; Google Chrome 浏览器，可以安装 chromium 软件包。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Chromium&quot;&gt;Chromium&lt;&#x2F;a&gt; 是开源版的 Google Chrome，它们的区别参见 https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Chromium_(web_browser)#Differences_from_Google_Chrome。Google Chrome 可以通过 AUR 或 ArchLinuxCN 安装。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注意：2021年3月15日起 Chromium 不再支持与 Google API 相关的功能，包括 Google 账户登陆和同步等。如果你需要使用这些功能，最佳方法是安装 Google Chrome，还有一种方法可以使 Chromium 恢复这些功能支持，你可以前往 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Chromium&quot;&gt;ArchWiki&lt;&#x2F;a&gt; 了解或加入 QQ 群向我询问。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Discover 可以用于安装&#x2F;更新&#x2F;卸载系统软件包和 Plasma 插件&#x2F;主题，还有来自 LVFS 的固件更新。&lt;&#x2F;p&gt;
&lt;p&gt;更多 KDE 家族应用：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;apps.kde.org&#x2F;&quot;&gt;apps.kde.org&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;执行 ·nano ~&#x2F;.bash_profile` 配置输入法环境变量，配置后需要重启或注销后重新登录才可以生效，添加以下行：&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export GTK_IM_MODULE=fcitx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export QT_IM_MODULE=fcitx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export XMODIFIERS=@im=fcitx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;export SDL_IM_MODULE=fcitx&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;输入法默认激活快捷键：&lt;kbd&gt;Ctrl + Space&lt;&#x2F;kbd&gt;&lt;&#x2F;p&gt;
&lt;p&gt;输入法的设置可以在 「系统设置」-&amp;gt;「区域设置」-&amp;gt;「输入法」修改，你可以点击「添加输入法」来添加拼音或其他输入法。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;Plasma_设置优化&quot;&gt;Plasma 设置优化&lt;a class=&quot;zola-anchor&quot; href=&quot;#Plasma_设置优化&quot; aria-label=&quot;Anchor link for: Plasma_设置优化&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;外观 -&amp;gt; 字体&lt;&#x2F;strong&gt;：除了等宽字体，其余字体修改为 [Sans Serif]（无衬线）。如果你觉得字体看起来不正常（对比下图），可以加入 QQ 群与我交流。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;开机和关机 -&amp;gt; 登陆屏幕 (SDDM)&lt;&#x2F;strong&gt;： 主题更改为「微风」&lt;&#x2F;p&gt;
&lt;p&gt;一切完成后重启系统开启你的 ArchLinux 之旅！&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;archlinux-installation-guide-simple&#x2F;.&#x2F;5.webp&quot; alt=&quot;运行 KDE Plasma 桌面的 ArchLinux&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装_AUR_软件包管理器（可选）&quot;&gt;安装 AUR 软件包管理器（可选）&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装_AUR_软件包管理器（可选）&quot; aria-label=&quot;Anchor link for: 安装_AUR_软件包管理器（可选）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;什么是 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;&quot;&gt;AUR？&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;AUR 全称是 Arch User Repository（Arch 用户软件仓库），AUR 软件包由来自社区的用户进行维护，他们上传编写好的软件包构建脚本，其他用户可以使用这些构建脚本自动生成软件包并安装。&lt;&#x2F;p&gt;
&lt;p&gt;官方仓库没有的软件包，或者是官方仓库软件包的开发或过时版本，基本上都可以在 AUR 找到，所以 ArchLinux 安装第三方软件包非常方便。&lt;&#x2F;p&gt;
&lt;p&gt;ArchWiki 的 AUR 页面：https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Arch_User_Repository&lt;&#x2F;p&gt;
&lt;p&gt;AUR 软件包的安装和更新默认需要手动操作，并不能像使用 pacman 那样方便的安装和更新，不过一些优秀的 AUR 包管理工具可以让你像使用 pacman 安装存储库包那样安装 AUR 包。&lt;&#x2F;p&gt;
&lt;p&gt;我推荐使用 &lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jguer&#x2F;yay&quot;&gt;yay&lt;&#x2F;a&gt; 作为 AUR 包的管理工具，因为它的使用方法和 pacman 基本一致，可以大幅度降低学习成本。&lt;&#x2F;p&gt;
&lt;p&gt;不过还是推荐大家学习如何手动安装 AUR 软件包，以备不时之需，下面安装 yay 的操作就是安装大多数 AUR 软件包的步骤。&lt;&#x2F;p&gt;
&lt;p&gt;如果是第一次安装 AUR 软件包，需要安装所需依赖：&lt;code&gt;sudo pacman -S --noconfirm --needed base-devel git&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yay_安装步骤&quot;&gt;yay 安装步骤&lt;a class=&quot;zola-anchor&quot; href=&quot;#yay_安装步骤&quot; aria-label=&quot;Anchor link for: yay_安装步骤&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;前往 AUR 的 yay 页面（&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;packages&#x2F;yay&quot;&gt;https:&#x2F;&#x2F;aur.archlinux.org&#x2F;packages&#x2F;yay&lt;&#x2F;a&gt;）查看「Git Clone URL」。&lt;&#x2F;p&gt;
&lt;p&gt;使用 git 克隆存储库：&lt;code&gt;git clone $git_clone_url ~&#x2F;aur-yay-repo&lt;&#x2F;code&gt;，将 &lt;code&gt;$git_clone_url&lt;&#x2F;code&gt; 替换为上方页面的「Git Clone URL」。&lt;&#x2F;p&gt;
&lt;p&gt;转到存储库目录：&lt;code&gt;cd ~&#x2F;aur-yay-repo&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;构建软件包并安装：&lt;code&gt;makepkg -i -r -s&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;清理工作：&lt;code&gt;cd ~ &amp;amp;&amp;amp; rm -rf ~&#x2F;aur-yay-repo&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;现在可以使用 yay 来管理存储库软件包和 AUR 软件包了，如果已添加的存储库不存在对应的包，yay 会自动在 AUR 中搜索，如果找到的话就开始安装操作。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;yay_使用方法&quot;&gt;yay 使用方法&lt;a class=&quot;zola-anchor&quot; href=&quot;#yay_使用方法&quot; aria-label=&quot;Anchor link for: yay_使用方法&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;如果不加任何参数执行 yay，它默认执行更新所有软件包操作。&lt;&#x2F;p&gt;
&lt;p&gt;安装软件包：&lt;code&gt;yay -S &amp;lt;package_name&amp;gt;&lt;&#x2F;code&gt; or &lt;code&gt;yay -S --aur &amp;lt;package_name&amp;gt; # 只从 AUR 获取包&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;更新所有软件包：&lt;code&gt;yay -Syu&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;只更新 AUR 软件包：&lt;code&gt;yay -Su --aur&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;只更新存储库软件包：&lt;code&gt;yay -Syu --repo&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;yay 更多用法参考：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Jguer&#x2F;yay#readme&quot;&gt;https:&#x2F;&#x2F;github.com&#x2F;Jguer&#x2F;yay#readme&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果你添加了 ArchLinuxCN 软件存储库，因为它包含了一些 AUR 软件包，所以你可以使用 pacman 安装某些 AUR 软件包。或者，你也可以使用 &lt;code&gt;--aur&lt;&#x2F;code&gt; 参数让 yay 只从 AUR 获取包，相反你也可以使用 &lt;code&gt;--repo&lt;&#x2F;code&gt; 参数让 yay 只从存储库获取包。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注意：不要使用 root 权限执行 yay 或任何 AUR 相关的命令，它们会在需要 root 权限时使用 sudo。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;关于多系统启动&quot;&gt;关于多系统启动&lt;a class=&quot;zola-anchor&quot; href=&quot;#关于多系统启动&quot; aria-label=&quot;Anchor link for: 关于多系统启动&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果你的系统分别安装在不同的硬盘，那么只需要在电脑启动的时候引导不同的硬盘就可以了。&lt;&#x2F;p&gt;
&lt;p&gt;你也可以通过安装 &lt;code&gt;os-prober&lt;&#x2F;code&gt; 让 GRUB 自动检测已安装的其他系统，并将其添加到 GRUB 启动菜单。安装完成后，添加 &lt;code&gt;GRUB_DISABLE_OS_PROBER=false&lt;&#x2F;code&gt; 到 &lt;code&gt;&#x2F;etc&#x2F;default&#x2F;grub&lt;&#x2F;code&gt;，重新生成 GRUB 配置文件：&lt;code&gt;grub-mkconfig -o &#x2F;boot&#x2F;grub&#x2F;grub.cfg&lt;&#x2F;code&gt;。如果你又安装了其他系统，则需要再次重新生成 GRUB 配置文件。&lt;&#x2F;p&gt;
&lt;p&gt;关于 os-prober 更多用法以及注意事项：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;GRUB#Detecting_other_operating_systems&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;GRUB#Detecting_other_operating_systems&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;建议阅读&quot;&gt;建议阅读&lt;a class=&quot;zola-anchor&quot; href=&quot;#建议阅读&quot; aria-label=&quot;Anchor link for: 建议阅读&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;建议阅读以下 Wiki 以便更好的使用 ArchLinux：&lt;&#x2F;p&gt;
&lt;p&gt;应用程序列表：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;List_of_applications&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;List_of_applications&lt;&#x2F;a&gt;，你可以在这里按照用途类型找到可用软件。&lt;&#x2F;p&gt;
&lt;p&gt;一般建议：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;General_recommendations&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;General_recommendations&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;系统维护：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;System_maintenance&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;System_maintenance&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;systemctl 基本用法：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Systemd#Basic_systemctl_usage&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Systemd#Basic_systemctl_usage&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;pacman 软件包管理器：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Pacman&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Pacman&lt;&#x2F;a&gt;，安装&#x2F;卸载&#x2F;更新软件全靠它。&lt;&#x2F;p&gt;
&lt;p&gt;CPU 调频：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;CPU_frequency_scaling&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;CPU_frequency_scaling&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;蓝牙：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Bluetooth&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Bluetooth&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Synaptics 触摸板：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Touchpad_Synaptics&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Touchpad_Synaptics&lt;&#x2F;a&gt;，建议 Synaptics 触摸板的笔记本用户阅读。&lt;&#x2F;p&gt;
&lt;p&gt;Bash：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Bash&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Bash&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;腾讯 QQ：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Tencent_QQ&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;Tencent_QQ&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;中国大陆用户的推荐解决方案：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;General_recommendations#%E4%B8%AD%E5%9B%BD%E5%A4%A7%E9%99%86%E7%94%A8%E6%88%B7%E7%9A%84%E6%8E%A8%E8%8D%90%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88&quot;&gt;https:&#x2F;&#x2F;wiki.archlinux.org&#x2F;title&#x2F;General_recommendations#中国大陆用户的推荐解决方案&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;建议阅读时选择英文，看不懂的地方可以使用浏览器翻译。&lt;&#x2F;p&gt;
&lt;p&gt;如果阅读中文版本的 Wiki，建议阅读之前注意下页面顶部提示的最后翻译更新时间，如果时间超过几个月，那么翻译可能没有更新到最新的原文。&lt;&#x2F;p&gt;
&lt;p&gt;如果你有能力，可以把对你有帮助的 Wiki 翻译成中文，以帮助更多的中文用户。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>使用 SoftEther VPN 搭建虚拟局域网</title>
        <published>2019-06-09T00:00:00+00:00</published>
        <updated>2019-06-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/softether-vpn-lan/"/>
        <id>https://www.mivm.cn/softether-vpn-lan/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/softether-vpn-lan/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;我们日常使用网络的过程中，局域网是非常有用的一个技术，它可以让一个范围内的多个设备互相访问、发现，共享一个广域网等。&lt;&#x2F;p&gt;
&lt;p&gt;由于局域网的特性，可以用来做很多事，常见的比如：局域网传输文件、游戏联机。&lt;&#x2F;p&gt;
&lt;p&gt;说起游戏联机，如果想和小伙伴一起玩局域网联机的游戏，小伙伴又没跟我在同一个局域网，这就是件很难解决的事情？这时候就可以用虚拟局域网来解决问题。&lt;&#x2F;p&gt;
&lt;p&gt;最常见的虚拟局域网技术就是 VPN，也就是虚拟私有网络。有了虚拟局域网，就可以非常方便的访问处于同一个虚拟局域网的其他设备，甚至是其他设备所在屋里局域网的其他设备。&lt;&#x2F;p&gt;
&lt;p&gt;因为最近小山跟朋友局域网联机玩游戏，所以找了很多解决方案，最后我选择了 SoftEther VPN，它安装和管理起来相当方便，而且运行稳定，下面就教大家如何使用它来搭建虚拟局域网。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;准备工作&quot;&gt;准备工作&lt;a class=&quot;zola-anchor&quot; href=&quot;#准备工作&quot; aria-label=&quot;Anchor link for: 准备工作&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;需要一台具有可访问公网 IP 的设备，用来作为虚拟局域网的服务器。服务器的性能不需要太高。1G 内存就差不多，但是带宽很重要，带宽的大小、网络的延迟取决于你用虚拟局域网做什么。&lt;&#x2F;p&gt;
&lt;p&gt;如果要玩游戏，网络延迟就很重要了，最好在 50ms 以下，不能超过 100ms。我推荐使用国内的共享 IP 服务器，端口开放也不需要太多，3 个就够了。如果是做其他用途，比如访问远程的文件，就很随意了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装_SoftEther_VPN_服务端&quot;&gt;安装 SoftEther VPN 服务端&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装_SoftEther_VPN_服务端&quot; aria-label=&quot;Anchor link for: 安装_SoftEther_VPN_服务端&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;下面的教程以服务器是 Linux 系统为例，如果服务器是 Windows，那安装过程就更简单了。&lt;&#x2F;p&gt;
&lt;p&gt;访问 SoftEther 下载中心：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&lt;&#x2F;a&gt;，然后选择组件：SoftEther VPN Server，接下来选择服务器对应的系统和 CPU 架构，最后下载安装包并上传到服务器，如果是 Linux 系统的安装包，安装前需要解压。&lt;&#x2F;p&gt;
&lt;p&gt;Linux 的安装包解压之后会得到一个名为 &lt;code&gt;vpnserver&lt;&#x2F;code&gt; 的文件夹，里面是待链接的预编译文件，使用前需要先执行 &lt;code&gt;make&lt;&#x2F;code&gt; 命令进行处理。&lt;&#x2F;p&gt;
&lt;p&gt;进入 &lt;code&gt;vpnserver&lt;&#x2F;code&gt; 目录，然后执行 &lt;code&gt;make&lt;&#x2F;code&gt; 命令，如果有询问，输入 &lt;code&gt;1&lt;&#x2F;code&gt; 并按回车即可。处理完成后便可以得到二进制文件，一次执行下列命令将文件复制到一个新的目录。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; mkdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;local&#x2F;vpnserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; hamcore.se2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;local&#x2F;vpnserver&#x2F;hamcore.se2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vpncmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;local&#x2F;vpnserver&#x2F;vpncmd&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#6F42C1, #B392F0);&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; cp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#005CC5, #79B8FF);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; vpnserver&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#032F62, #9ECBFF);&quot;&gt; &#x2F;usr&#x2F;local&#x2F;vpnserver&#x2F;vpnserver&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;启动 VPN 服务器：sudo &#x2F;usr&#x2F;local&#x2F;vpnserver&#x2F;vpnserver start&lt;&#x2F;p&gt;
&lt;p&gt;停止 VPN 服务器：sudo &#x2F;usr&#x2F;local&#x2F;vpnserver&#x2F;vpnserver stop&lt;&#x2F;p&gt;
&lt;p&gt;如果需要开机启动 VPN 服务器，可以将启动命令加入到开机执行脚本，或编写 systemd 单元文件进行管理。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装_SoftEther_VPN_Server_管理程序&quot;&gt;安装 SoftEther VPN Server 管理程序&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装_SoftEther_VPN_Server_管理程序&quot; aria-label=&quot;Anchor link for: 安装_SoftEther_VPN_Server_管理程序&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;为了更方便的管理 VPN 服务端，我们可以在电脑上安装管理程序来远程管理 VPN 服务器，以下以 Windows 系统为例。&lt;&#x2F;p&gt;
&lt;p&gt;访问 SoftEther 下载中心：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&lt;&#x2F;a&gt;，然后选择组件：SoftEther VPN Server Manager for Windows，接下来选择电脑对应的 CPU 架构，最后下载安装包并安装即可，安装需要选择组件，选择「SoftEther VPN Server 管理工具（仅限管理工具）」即可。&lt;&#x2F;p&gt;
&lt;p&gt;安装完成后启动管理工具，点击管理工具窗口的「新设置」按钮添加服务器。&lt;&#x2F;p&gt;
&lt;p&gt;「设置名」随意填写，「主机名」填写服务器的 IP 地址，「端口号」可以填写 443、992、1194、5555，这些都是服务器的默认端口号，请确保这些端口没有被其他程序占用且可以访问，管理模式选择「服务端管理模式」，默认没有密码，不需要输入。&lt;&#x2F;p&gt;
&lt;p&gt;首次连接成功后需要设置新密码，然后会弹出「SoftEther VPN Server 简单安装」的窗口，关闭它。接下来可能会询问是否需要设置「IPsec&#x2F;L2TP」，不需要。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;基础设置_SoftEther_VPN_Server&quot;&gt;基础设置 SoftEther VPN Server&lt;a class=&quot;zola-anchor&quot; href=&quot;#基础设置_SoftEther_VPN_Server&quot; aria-label=&quot;Anchor link for: 基础设置_SoftEther_VPN_Server&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;使用管理工具连接服务器后，点击管理工具主窗口的「OpenVPN &#x2F; MS-SSTP 设置」，取消选中「启用 OpenVPN 克隆 Server 功能」和「开启 MS-SSTP VPN 克隆 Server 功能」。&lt;&#x2F;p&gt;
&lt;p&gt;点击管理工具主窗口的「加密与网络」，取消选中「使用并保持互联网的连接」。&lt;&#x2F;p&gt;
&lt;p&gt;删除管理工具主窗口左下角的「监听器列表」的多余端口，只保留一个就行，如果想更改端口，先新建一个端口，然后使用新端口连接到服务器，再把旧端口删除。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;关闭_SoftEther_VPN_Server_的_DDNS_功能&quot;&gt;关闭 SoftEther VPN Server 的 DDNS 功能&lt;a class=&quot;zola-anchor&quot; href=&quot;#关闭_SoftEther_VPN_Server_的_DDNS_功能&quot; aria-label=&quot;Anchor link for: 关闭_SoftEther_VPN_Server_的_DDNS_功能&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;SoftEther VPN Server 自带 DDNS 功能，这个功能一般来说没啥用，推荐关闭，关闭此功能需要编辑配置文件，按照下面的步骤操作。&lt;&#x2F;p&gt;
&lt;p&gt;点击管理工具主窗口右下角的「编辑设置」，点击「保存到文件」保存到本地，使用文本编辑器打开保存的文件。&lt;&#x2F;p&gt;
&lt;p&gt;在文件开头前几行找到 &lt;code&gt;declare DDnsClient&lt;&#x2F;code&gt;，然后把它下面的 &lt;code&gt;bool Disabled false&lt;&#x2F;code&gt; 改成 &lt;code&gt;bool Disabled true&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;点击管理工具主窗口右下角的「编辑设置」，点击「导入文件并应用」选择并导入修改后的文件。&lt;&#x2F;p&gt;
&lt;p&gt;SoftEther VPN Server 会自动重启，管理程序也会自动关闭，等待数秒后重新连接服务器即可。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;创建虚拟局域网&quot;&gt;创建虚拟局域网&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建虚拟局域网&quot; aria-label=&quot;Anchor link for: 创建虚拟局域网&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;在 SoftEther VPN 中，每个虚拟局域网对应一个虚拟 HUB，同一个 HUB 内的所有设备可以互相访问，不同的 HUB 之间不可以互相访问。&lt;&#x2F;p&gt;
&lt;p&gt;SoftEther VPN Server 默认有一个名为「DEFAULT」的虚拟 HUB，将其删除，创建一个全新的。&lt;&#x2F;p&gt;
&lt;p&gt;点击「创建虚拟 HUB」-&amp;gt; 为其起一个名字并填写到「虚拟 HUB 名」输入框 -&amp;gt; 密码视需要决定是否填写，如果有密码，可以使用这个密码单独管理 HUB 而不是整个服务器 -&amp;gt; 选中「不要向匿名用户枚举」-&amp;gt; 点击「确定」。&lt;&#x2F;p&gt;
&lt;p&gt;创建好以后，选中创建好的虚拟 HUB，然后点击「管理虚拟 HUB」。&lt;&#x2F;p&gt;
&lt;p&gt;首先把 DHCP 服务器打开，这样客户端连接之后会自动分配 IP 地址，点击「虚拟 NAT 和虚拟 DHCP 服务器」-&amp;gt; 点击「启用 SecureNAT」-&amp;gt; 点击「SecureNAT 配置」-&amp;gt; 取消选中 [使用虚拟 NAT 功能]。&lt;&#x2F;p&gt;
&lt;p&gt;最后，清空「默认网关地址」和「DNS 服务器地址」输入框 -&amp;gt; 点击「确定」-&amp;gt; 关闭「虚拟 NAT 和虚拟 DHCP 服务器」窗口。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;如果不清空默认网关地址，当客户端连接 SoftEther VPN 之后，可能所有网络流量都会经过 SoftEther VPN Server。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;softether-vpn-lan&#x2F;.&#x2F;1.webp&quot; alt=&quot;虚拟 HUB 设置窗口&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;创建用户&quot;&gt;创建用户&lt;a class=&quot;zola-anchor&quot; href=&quot;#创建用户&quot; aria-label=&quot;Anchor link for: 创建用户&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;点击管理虚拟 HUB 窗口的「管理用户」按钮 -&amp;gt; 点击「新建」-&amp;gt; 填写用户名和密码 -&amp;gt; 完成创建。如果只有自己一个人用，创建一个用户就可以了，如果是多个人用，推荐一人一个用户。最后关闭「管理用户」和「管理虚拟 HUB」的窗口&lt;&#x2F;p&gt;
&lt;h2 id=&quot;设置_L2TP_功能（可选）&quot;&gt;设置 L2TP 功能（可选）&lt;a class=&quot;zola-anchor&quot; href=&quot;#设置_L2TP_功能（可选）&quot; aria-label=&quot;Anchor link for: 设置_L2TP_功能（可选）&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;由于 SoftEther VPN 没有官方手机客户端，为了可以在手机上使用，需要启用 L2TP 功能，以便在手机上进行连接。&lt;&#x2F;p&gt;
&lt;p&gt;点击主窗口的「IPsec &#x2F; L2TP 设置」按钮 -&amp;gt; 选中「启用 L2TP 服务器功能（L2TP over IPsec）」-&amp;gt; 在下方的「IPsec 预共享密钥」填写 8 个字符，最好是随机的 -&amp;gt; 点击「确定」。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;注意：L2TP 不支持自定义端口，服务器必须开启 500 和 4500 端口，对于共享 IP 的服务器来说，L2TP 就无法使用了。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;如何在_Windows_上连接到服务器&quot;&gt;如何在 Windows 上连接到服务器&lt;a class=&quot;zola-anchor&quot; href=&quot;#如何在_Windows_上连接到服务器&quot; aria-label=&quot;Anchor link for: 如何在_Windows_上连接到服务器&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Windows 使用 SoftEther VPN 非常的方便，因为有官方客户端。&lt;&#x2F;p&gt;
&lt;p&gt;访问 SoftEther 下载中心：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&quot;&gt;https:&#x2F;&#x2F;www.softether-download.com&#x2F;&lt;&#x2F;a&gt;，然后选择组件：SoftEther VPN Client，接下来选择 Windows 系统和电脑对应的 CPU 架构，最后下载安装包并安装即可。&lt;&#x2F;p&gt;
&lt;p&gt;安装完成后打开客户端，点击客户端主窗口的「添加新的 VPN 连接」，首次添加时需要创建 VPN 网卡，耐心等待创建完成即可。&lt;&#x2F;p&gt;
&lt;p&gt;为连接取一个名字并填写到「连接设置名」输入框，填写服务器 IP 地址到「主机名」输入框，填写服务器的监听端口到「端口号」输入框，填写刚才创建的虚拟 HUB 的名字到「虚拟 HUB 名」输入框，在右侧的「用户名」和「密码」输入框填写刚刚创建的用户信息，推荐取消选中「断开后自动重连」。&lt;&#x2F;p&gt;
&lt;p&gt;连接创建完成后，鼠标右键单击创建好的连接并点击「连接」，如果提示已连接并出现 IP 分配的提示则表示成功。&lt;&#x2F;p&gt;
&lt;p&gt;Windows 使用时需要注意，VPN 默认属于公用网络，如果需要让 VPN 访问程序的服务，Windows 防火墙弹出提示时，记得勾选公用网络，再点击允许访问。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;如何在_Android_上连接服务器&quot;&gt;如何在 Android 上连接服务器&lt;a class=&quot;zola-anchor&quot; href=&quot;#如何在_Android_上连接服务器&quot; aria-label=&quot;Anchor link for: 如何在_Android_上连接服务器&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;由于 Android 没有官方客户端，只能使用系统的 VPN 功能来创建 L2TP 连接，以下操作以 Android Pie 为例。&lt;&#x2F;p&gt;
&lt;p&gt;找到手机的 VPN 设置，新建一个 VPN 连接。协议选择「L2TP&#x2F;IPsec PSK」，然后分别填写「服务器地址」和「IPsec 预共享密钥」。用户名填写格式为「用户名@虚拟 HUB 名」，例如刚才创建的虚拟 HUB 名为「GameLAN」，创建的用户名为「test」，那么 L2TP 用户名就是「test@GameLAN」，密码依旧是对应用户的密码。&lt;&#x2F;p&gt;
&lt;p&gt;选择「显示高级选项」，然后填写虚拟 HUB 的 IP 段到「转发路线」输入框，虚拟 HUB 的 IP 段就是 DHCP 服务器设置的 IP 段，默认为 192.168.30.0&#x2F;24，务必要设置「转发路线」，否则所有流量都会经过 VPN。&lt;&#x2F;p&gt;
&lt;p&gt;设置完成之后，就可以连接并测试是否正常工作。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;softether-vpn-lan&#x2F;.&#x2F;2.webp&quot; alt=&quot;Android 设置 L2TP 界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Voicemeeter 指南：给播放器加特效</title>
        <published>2019-05-21T00:00:00+00:00</published>
        <updated>2019-05-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/voicemeeter-add-special-effects/"/>
        <id>https://www.mivm.cn/voicemeeter-add-special-effects/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/voicemeeter-add-special-effects/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;不知道小伙伴喜不喜欢听一些特别带感的音乐，比如DJ、电音之类的，听这些音乐的时候，那种动次打次给人的感觉特别的爽快。有些小伙伴可能会觉得这种感觉还不是很过瘾，就会把低音调的更猛烈些，或者加一些混响，&lt;&#x2F;p&gt;
&lt;p&gt;有些辣鸡音响也会打着所谓的“4D 重低音”的口号，虽然小山没买过这种音响，不过小山觉得这种音响也只不过就是增强了低音，可能还会加一些混响。&lt;&#x2F;p&gt;
&lt;p&gt;一般调节这些都是利用播放器的均衡器或者是音响的高低音调节，但并不是所有播放器都有均衡器，也不是所有音响都支持调节高低音。&lt;&#x2F;p&gt;
&lt;p&gt;这时候我们就可以用 Voicemeeter 对声音进行调节，而且不仅仅是调节高低音这么简单。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;调节高低音&quot;&gt;调节高低音&lt;a class=&quot;zola-anchor&quot; href=&quot;#调节高低音&quot; aria-label=&quot;Anchor link for: 调节高低音&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;单纯的调节高低音的话，是非常简单的。&lt;&#x2F;p&gt;
&lt;p&gt;虚拟音频通道上方有三个旋钮，分别代表高中低音，最上面的是高低音，最下面的是低音，上下拖动即可调节，双击复位。只有当你调节的虚拟音频通道有声音传入才有效果。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;均衡器调节&quot;&gt;均衡器调节&lt;a class=&quot;zola-anchor&quot; href=&quot;#均衡器调节&quot; aria-label=&quot;Anchor link for: 均衡器调节&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Voicemeeter 自带了两个均衡器，如果你相对声音进行更加细致的调节，可以使用这两个均衡器。&lt;&#x2F;p&gt;
&lt;p&gt;第一个均衡器是 Voicemeeter 界面右下角哪里的音频输出总览，每个通道上方会有个 EQ 的按钮，点亮它即可激活均衡器，右键单击打开均衡器面板，你可以修改需要调节的频率，增幅，Q 值等，非常的全面。&lt;&#x2F;p&gt;
&lt;p&gt;如果你觉得上面哪个均衡器太复杂了，那么第二个均衡器就相对来说简单一些。&lt;&#x2F;p&gt;
&lt;p&gt;点击 Voicemeeter 右上方的「Menu」-&amp;gt;「Run 15 Bands Graphic EQ A.P.A...」&lt;&#x2F;p&gt;
&lt;p&gt;这是一个可以调节 15 频率的均衡器，使用方法很简单，你只需要推推子就行了。上面的 BUS 代表的是音频输出通道，一般调节的话，最好调节 A1 这样的物理输出通道。点击均衡器界面右下角的「Bypass」，可以开启旁路功能，让均衡器暂时不起作用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;加更多的特效&quot;&gt;加更多的特效&lt;a class=&quot;zola-anchor&quot; href=&quot;#加更多的特效&quot; aria-label=&quot;Anchor link for: 加更多的特效&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果你觉得调节高低音和均衡器还不能满足你的话，你可以根据上一篇教程&lt;a href=&quot;..&#x2F;voicemeeter-host&quot;&gt;《Voicemeeter 指南：与宿主软件连接》&lt;&#x2F;a&gt;，将系统的声音传给宿主软件，然后在宿主软件里疯狂的加插件，来修改声音，这是一般的播放器做不到的。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Voicemeeter 指南：与宿主软件连接</title>
        <published>2019-05-15T00:00:00+00:00</published>
        <updated>2019-05-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/voicemeeter-host/"/>
        <id>https://www.mivm.cn/voicemeeter-host/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/voicemeeter-host/">&lt;p&gt;如果你是做音乐的或者主播，或许听说过宿主软件或机架之类的东西，这类软件多半是为制作音乐而生的，因为可以安装插件，所以对音乐的处理更加的全面。&lt;&#x2F;p&gt;
&lt;p&gt;主播一般也会使用宿主软件对声音进行处理，特别是音乐主播，比如修正人声，做下闪避什么的。&lt;&#x2F;p&gt;
&lt;p&gt;但是这类宿主软件通常都是只支持 ASIO 驱动的声卡，如果是普通声卡要使用这些软件，就需要让它支持 ASIO 驱动。&lt;&#x2F;p&gt;
&lt;p&gt;Voicemeeter 的一大特色就是虚拟 ASIO 驱动，不管你的是什么声卡，它都可以作为中间件，使宿主软件与声卡连接。·&lt;&#x2F;p&gt;
&lt;p&gt;这意味着，如果你是主播，你想对声音做一些处理，又没有专业的声卡，你就可以使用 Voicemeeter 搭配宿主软件对声音进行处理。&lt;&#x2F;p&gt;
&lt;p&gt;这篇文章就教大家如何让 Voicemeeter 与宿主软件连接，宿主软件我选用的是 Studio One 4 ，至于如何处理声音和宿主软件如何使用，这里一概不讨论。&lt;&#x2F;p&gt;
&lt;p&gt;打开宿主软件，选择音频设备，根据你安装的版本不同，可用的音频设备数量也会不同，可用的音频设备取决于你有多少个虚拟音频通道，也就是 B1 B2 B3 这类的通道。&lt;&#x2F;p&gt;
&lt;p&gt;如果是 Potato 版，你会看到如下的四个设备，如果是 Banana 版，会少一个 VAIO 3。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter-host&#x2F;.&#x2F;1.webp&quot; alt=&quot;Studio One 4 音频设备设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;除了「Insert Virtual」可以输入和输出，剩下的音频设备，原理都是一样的，一个音频设备对应一个虚拟音频通道，只支持输出。&lt;&#x2F;p&gt;
&lt;p&gt;先说一下普通的音频设备，再说「Insert Virtual」，这里我拿「AUX Virtual」举例。&lt;&#x2F;p&gt;
&lt;p&gt;创建好工程之后，你会发现每个设备最多支持四组双声道，一般情况下只需要第一组就行了，如果你选择别的声道，可能没声音。&lt;&#x2F;p&gt;
&lt;p&gt;将输出设置为第一组之后，随便加载个乐器什么的，你就可以听到声音，如果没有声音，检查你对应的虚拟通道是否有物理输出。&lt;&#x2F;p&gt;
&lt;p&gt;这是最简单的使用方法，比如你只要编辑音乐什么的，就可以使用这个方法。&lt;&#x2F;p&gt;
&lt;p&gt;如果想直播，对很多声音进行处理，那么就需要用到「Insert Virtual」，在用这个音频设备之前，先对 Voicemeeter 进行一些设置。&lt;&#x2F;p&gt;
&lt;p&gt;点击 Voicemeeter 右上角的「Menu」→「System Settings &#x2F; Opinions ...」&lt;&#x2F;p&gt;
&lt;p&gt;设置窗口的最下面会有一排虚拟端口，这就是给「Insert Virtual」用的，表示「Insert Virtual」可以独占的端口，可用的端口数量根据你安装的版本不同也会有不同。前几组只有双声道的端口对应的是你的物理输入设备，后几组对应的是虚拟音频通道。你需要用到哪个音频设备就点亮哪个端口，比如我想让麦克风的声音输入到宿主软件处理，然后输出到 B1，那么我就点了第一组物理输入的端口和 B1 的前两个声道就行了。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter-host&#x2F;.&#x2F;2.webp&quot; alt=&quot;Voicemeeter 设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后把宿主软件的音频设备设置为「Insert Virtual」，创建工程。&lt;&#x2F;p&gt;
&lt;p&gt;然后你会看到音频设备的声道好多，其实宿主软件里的声道对应的就是上面的端口，而且只有你点亮的才可以用。&lt;&#x2F;p&gt;
&lt;p&gt;比如我只选了麦克风和 B1，那么我的「音频 I&#x2F;O」设置如下。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter-host&#x2F;.&#x2F;3.webp&quot; alt=&quot;Studio One 4 音频 I&#x2F;O 设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后创建一个立体声轨，输入设置为「麦克风」，开启监听功能，输出设置为 B1，不出意外的话，你应该可以听到麦克风输入的声音，如果没有声音，检查对应虚拟通道是否有物理输出。&lt;&#x2F;p&gt;
&lt;p&gt;如果你需要更多的输入或输出，就点亮更多的端口，一组端口可以用于输出也可以用于输入，比如完全可以不点亮 B1 的端口，只点亮麦克风的端口，让声音从麦克风输入再从麦克风输出，这样只需要在 Voicemeeter 给麦克风设置好物理输出就可以了。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Voicemeeter 指南：整合麦克风和播放器</title>
        <published>2019-03-22T00:00:00+00:00</published>
        <updated>2019-03-22T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/voicemeeter-mic-and-player/"/>
        <id>https://www.mivm.cn/voicemeeter-mic-and-player/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/voicemeeter-mic-and-player/">&lt;p&gt;之前小山给大家带来了几篇关于音频的教程，给大家介绍了两款软件：&lt;a href=&quot;..&#x2F;virtual-audio-cable&#x2F;&quot;&gt;虚拟音频线&lt;&#x2F;a&gt;和 &lt;a href=&quot;..&#x2F;voicemeeter&#x2F;&quot;&gt;Voicemeeter&lt;&#x2F;a&gt;，这两款软件可以帮助让你在直播和语音的时候更加方便。&lt;&#x2F;p&gt;
&lt;p&gt;我们日常语音的时候，不管是 QQ 还是其他软件的语音，都只能捕获麦克风的声音，而无法捕获系统发出的声音。这时候比如你想唱首歌，就很麻烦，因为播放器的伴奏对方并不能听见。&lt;&#x2F;p&gt;
&lt;p&gt;Voicemeeter 就可以很好的解决这个问题，它可以将多路音频输出或输入整合到一个输出或输入，这样目标软件就可以捕获所有声音了。&lt;&#x2F;p&gt;
&lt;p&gt;这篇教程教大家如何利用 Voicemeeter，实现麦克风和播放器的声音整合。依然以 Voicemeeter Potato 来进行演示，同样适用于 Banana 版本。&lt;&#x2F;p&gt;
&lt;p&gt;首先打开 Voicemeeter ，将任意一个物理音频输入通道设置为你的麦克风设备。如果你不知道什么是物理音频输入通道，可以去看下之前的 Voicemeeter 的介绍文章。&lt;&#x2F;p&gt;
&lt;p&gt;设置完成后，点亮下方的物理音频输出（A1 - A5），对麦克风说话，试下能否听到自己的声音，麦克风请勿和输出设备靠的太近，否则可能会造成啸叫。如果可以听到声音，就可以把物理音频输出给点灭掉了。前提是你已经设置好了物理输出通道，如果你不知道什么是物理音频输出通道，可以去看下之前的 Voicemeeter 的介绍文章。&lt;&#x2F;p&gt;
&lt;p&gt;现在，将系统的默认录音设备设置为任意虚拟音频输入通道，注意，如果你设置了系统的默认播放设备为虚拟音频通道的话，默认录音设备不要和默认播放设备设置为同一通道。比如默认播放设备设置为 B1，那么默认录音设备务必设置为 B2 或 B3。如果你不知道什么是虚拟音频输入通道，可以去看下之前的 Voicemeeter 的介绍文章。&lt;&#x2F;p&gt;
&lt;p&gt;然后，打开你的播放器，将播放器的播放设备设置为刚刚设置的默认录音设备对应的虚拟播放设备。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter-mic-and-player&#x2F;.&#x2F;1.webp&quot; alt=&quot;播放器和 Voicemeeter&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;然后在 Voicemeeter 里点亮刚刚设置的默认录音设备下的物理输出，播放器播放音乐，试下能不能听到播放器的声音，如果可以听到，你离成功只差一步之遥了。&lt;&#x2F;p&gt;
&lt;p&gt;最后分别将麦克风和播放器的声音发送给刚刚设置的默认录音设备虚拟通道，比如默认录音设备是 B1，那么点亮麦克风下方的 B1 和播放器的播放设备下的 B1。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter-mic-and-player&#x2F;.&#x2F;2.webp&quot; alt=&quot;Voicemeeter 设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;现在，使用 QQ 等软件测试对方是否可以听到你的声音和麦克风的声音。由于 QQ 在语音通话过程中极大的压缩率，对方可能会听到非常糟糕的声音，所以如果你想唱歌给对方听，可以选择其他语音通话软件，&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Voicemeeter - 强大的虚拟声卡和混音器</title>
        <published>2019-02-26T00:00:00+00:00</published>
        <updated>2019-02-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/voicemeeter/"/>
        <id>https://www.mivm.cn/voicemeeter/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/voicemeeter/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;之前小山给大家介绍过一个&lt;a href=&quot;..&#x2F;virtual-audio-cable&#x2F;&quot;&gt;虚拟音频线&lt;&#x2F;a&gt;软件，可以利用虚拟音频线实现把一个程序的声音发送到另一个程序。不过哪个虚拟音频线如果作为虚拟声卡来使用的话，功能有那么一些欠缺，只能作为最基础的虚拟声卡使用。如果想让虚拟声卡实现更多、更好用的功能，比如说要直播K歌，或者一些其他用途，就需要更强大的软件。&lt;&#x2F;p&gt;
&lt;p&gt;今天小山就给大家分享一款无意中发现的，炒鸡好用的虚拟声卡&#x2F;混音器软件，它有着丰富的功能，且支持 ASIO，还能提升系统的音频质量。&lt;&#x2F;p&gt;
&lt;p&gt;这款软件叫做：Voicemeeter，具体它有那些强大的功能，接着往下看。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;什么是_Voicemeeter？&quot;&gt;什么是 Voicemeeter？&lt;a class=&quot;zola-anchor&quot; href=&quot;#什么是_Voicemeeter？&quot; aria-label=&quot;Anchor link for: 什么是_Voicemeeter？&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Voicemeeter 官方称之是虚拟音频混音器，但是它的功能远不止一个混音器那么简单。&lt;&#x2F;p&gt;
&lt;p&gt;可以把它单纯的当作虚拟声卡来使用，它可以为你创建 3 个虚拟音频通道，跟之前的虚拟音频线一样，不过要是只把它当作虚拟音频线来用，就有点浪费了。&lt;&#x2F;p&gt;
&lt;p&gt;它最最厉害的功能是可以同时接受多个设备的输入信号，然后将它们发送给虚拟音频通道或者其他音频设备&#x2F;声卡，而且支持同时发送给多个目标。举个栗子：当前同时有创新的录音声卡和阿波罗声卡，这时候就可以用它将创新输入的声音发送给阿波罗和虚拟音频通道，还可以再发送给耳机作为监听。这样一路输入信号就同时发送给了三个设备。就可以将 QQ 的麦克风设置为虚拟音频通道，这样别人就可以听到你说话，还可以再把系统或播放器的声音发送给这三个设备，这样别人和你都可以听到系统和播放器的声音，是不是很强大。&lt;&#x2F;p&gt;
&lt;p&gt;它还支持 ASIO，不管声卡支不支持 ASIO，它都可以把声卡变成支持 ASIO 的声卡，类似 ASIO4ALL + ASIO Link Pro 的解决方案，不过我个人更推荐这个软件，ASIO Link Pro 已经停止维护，而且界面极其丑陋还不好用。&lt;&#x2F;p&gt;
&lt;p&gt;ASIO 是什么，有什么用呢？这就要牵扯到系统的音频 API，想了解的小伙伴可以看下这篇文章：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;qiaodahai.com&#x2F;audio-apis.html&quot;&gt;https:&#x2F;&#x2F;qiaodahai.com&#x2F;audio-apis.html&lt;&#x2F;a&gt;，如果你想做一些音频处理，比如在直播的时候，对声音进行实时处理，必须有一个支持 ASIO 的声卡，多数的专业声卡都支持 ASIO，但也有少数声卡和集成声卡是不支持的，有了这个软件，就可以用集成声卡来直播K歌，至于如何使用，我之后会单独出教程。&lt;&#x2F;p&gt;
&lt;p&gt;Voicemeeter 可以使用 WASAPI 来独占声卡，从而让系统的音频质量更加优秀，至于有没有效果，反正官方是这样说的。&lt;&#x2F;p&gt;
&lt;p&gt;以上就是它的几个主要的功能，它还有一些其他的附加功能：增益或衰减声音信号，调节EQ、混响、延迟、压缩等，通过网络在不同的设备传递声音，内录功能等，之后我会出几篇关于这些功能的教程。&lt;&#x2F;p&gt;
&lt;p&gt;官方介绍：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;forum.vb-audio.com&#x2F;viewtopic.php?f=6&amp;amp;t=87&amp;amp;sid=fa9df8c727f32bc757abffb7bbc2a948&quot;&gt;https:&#x2F;&#x2F;forum.vb-audio.com&#x2F;viewtopic.php?f=6&amp;amp;t=87&amp;amp;sid=fa9df8c727f32bc757abffb7bbc2a948&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;说了这么多，下面教大家如何安装这个软件以及基础的设置和使用方法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装&quot;&gt;安装&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装&quot; aria-label=&quot;Anchor link for: 安装&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;Voicemeeter 一共有三个版本：普通版、Banana（香蕉版）、Potato（土豆版），土豆版是功能最强大的，普通版和香蕉版可以免费使用，土豆版虽然也可以免费使用，不过有可选注册，如果觉得好用，还是支持一下吧。我推荐最起码也要使用香蕉版。&lt;&#x2F;p&gt;
&lt;p&gt;下载地址：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.vb-audio.com&#x2F;Voicemeeter&#x2F;index.htm&quot;&gt;普通版&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.vb-audio.com&#x2F;Voicemeeter&#x2F;banana.htm&quot;&gt;香蕉版&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.vb-audio.com&#x2F;Voicemeeter&#x2F;potato.htm&quot;&gt;土豆版&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;安装后重启下系统，然后在开始菜单找到 Voicemeeter 对应的版本，如果安装的是土豆版，开始菜单则会有 Voicemeeter 的全部版本。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;设置&quot;&gt;设置&lt;a class=&quot;zola-anchor&quot; href=&quot;#设置&quot; aria-label=&quot;Anchor link for: 设置&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;打开 Voicemeeter 之前，需要先对系统进行一些设置，打开 Windows 的音频控制面板，将 Voicemeeter 的播放和录制设备采样率设置为和你的声卡相同，然后将所有播放设备的独占模式启用：双击播放设备 -&amp;gt; 高级 -&amp;gt; 把独占模式的两个选项勾上，然后点击「通信」选项卡，选择「不执行任何操作」，最后将 Voicemeeter 的任意虚拟通道设置为你的默认播放设备和录制设备，推荐将「VoiceMeeter VAIO3 Input」设置为默认播放设备，如果用的不是土豆版，是没有这个通道的，可以用「VoiceMeeter Input」代替，「VoiceMeeter Aux Output」设置为默认录制设备。&lt;&#x2F;p&gt;
&lt;p&gt;此时是听不到系统的声音的，别慌，打开 VoiceMeeter，我这里用土豆版作为演示。界面虽然看着很复杂，其实很简单。&lt;&#x2F;p&gt;
&lt;p&gt;把所有绿色的 A1 和 B1 全部点灭，再点击右上角的 A1，选择你的声卡。声卡优先选择 WDM 模式，如果 WDM 模式有杂音，再选择 MME 模式，如果声卡支持 ASIO，优先选择 ASIO。最后将刚刚设置为默认播放设备的虚拟通道的 A1 点亮，这样就可以听到系统发出的声音了。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter&#x2F;.&#x2F;1.webp&quot; alt=&quot;Voicemeeter 土豆版界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A1 - A5 是输出通道，中间的 B1 - B3 是 Voicemeeter  虚拟音频输入通道，左侧的五个是输入通道。&lt;&#x2F;p&gt;
&lt;p&gt;如果想让音响和耳机同时听到声音，就把 A2 设置为耳机，然后把声音再发送给 A2。&lt;&#x2F;p&gt;
&lt;p&gt;如何将麦克风的声音发送给 Voicemeeter 呢？点击左侧输入通道上方的「Select input Device」，选择麦克风设备，然后将麦克风的声音发送给刚刚设置的默认录制设备 (VoiceMeeter Aux Onput) 的虚拟音频通道，也就是 B2，这样别人就可以听到你的声音了。如果想让别人听到你的系统声音，也可以将系统声音发送给 B2，如果想听到自己的声音，点亮麦克风下的 A1 即可，最好将麦克风的声音发送给耳机，否则可能会造成啸叫。&lt;&#x2F;p&gt;
&lt;p&gt;如果想单独把播放器的声音给别人听到，可以使用 Windows 的音频设置，将播放器的播放设备设置为默认录制设备对应的播放设备，也就是 「VoiceMeeter Aux Input」，这样麦克风和播放器的声音，都会传递给默认录制设备 [VoiceMeeter Aux Onput]，你可能听不到播放器的声音，没关系，只需点亮「VoiceMeeter Aux」下的 A1 即可。不知道你现在有没有搞懂 Voicemeeter 的发送机制，没有搞懂的话欢迎加入 QQ 群与我探讨。&lt;&#x2F;p&gt;
&lt;p&gt;说完 Voicemeeter 的发送机制后，我们来对 Voicemeeter 进行一些优化，让它工作的更好。点击右上角的「Menu」，打开菜单。&lt;&#x2F;p&gt;
&lt;p&gt;点击「System Tray」设置 Voicemeeter 的开机启动和关闭后最小化到托盘，否则如果将 Voicemeeter 设置为默认播放设备，不打开 Voicemeeter 的话是没有声音的，当然，你也可以继续用声卡作为默认播放设备，只在需要的时候再打开 Voicemeeter。&lt;&#x2F;p&gt;
&lt;p&gt;点击「System Settings &#x2F; Opinions ...」，设置不同 API 的延迟和采样率。「Buffering xxx」 是对应音频 API 的延迟设定，这个设定根据你电脑的配置自行设置，我推荐 MME 没异常的话设置为 480；WDM 设置为 256 或者 320；KS 和 ASIO 默认就好，如果播放时声音有杂音，把延迟调高点。「ASIO SR」设置为「Use Preferred Samplerate」。下面的「Preferred Main SampleRate」是个很关键的设置，它决定了 WDM  和 ASIO 播放设备采样率（MME 请无视），因为 WDM 和 ASIO 是声卡独占模式，采样率是由程序设置的，所以系统哪里设置的播放设备采样率就无效了，比如想让 A1 - A5 以 48000 Hz 播放声音，就把这个选项设置为 48000 Hz，正常情况下设置为 44100 Hz 即可。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;voicemeeter&#x2F;.&#x2F;2.webp&quot; alt=&quot;Voicemeeter 系统设置界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果大家想对 Voicemeeter 有更深的了解，可以看下七线阁的系列教程视频：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;space.bilibili.com&#x2F;27811617&#x2F;video?keyword=Voicemeeter&quot;&gt;https:&#x2F;&#x2F;space.bilibili.com&#x2F;27811617&#x2F;video?keyword=Voicemeeter&lt;&#x2F;a&gt;，我之后也会基于 Voicemeeter 出几个好玩的教程。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>Virtual Audio Cable - 虚拟音频线</title>
        <published>2019-02-17T00:00:00+00:00</published>
        <updated>2019-02-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/virtual-audio-cable/"/>
        <id>https://www.mivm.cn/virtual-audio-cable/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/virtual-audio-cable/">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果大家经常使用 QQ 或者 YY 等通讯软件进行语音聊天的话，可能会发现一个问题，就是电脑内部的声音并不能让对方听到，这个问题可能会导致我们想唱歌的时候，电脑的伴奏对方听不到，只能听到你的干声，就很尴尬。&lt;&#x2F;p&gt;
&lt;p&gt;这个问题有没有解决方法呢？当然有，常见的有使用支持跳线功能的声卡驱动，比如创新的Kx驱动等。但并不是所有声卡驱动都支持跳线，那么怎么让不支持跳线的声卡驱动实现类似的功能呢？答案就是虚拟音频线，当然，仅仅依靠虚拟音频线有些简陋，我们这篇教程主要讲一下虚拟音频线怎么设置，为后面的教程做铺垫。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;什么是虚拟音频线？&quot;&gt;什么是虚拟音频线？&lt;a class=&quot;zola-anchor&quot; href=&quot;#什么是虚拟音频线？&quot; aria-label=&quot;Anchor link for: 什么是虚拟音频线？&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;虚拟音频线可以在你的系统上创建多个虚拟的播放设备和录音设备，播放和录音设备之间形成监听，声音输出到播放设备，然后会回传到录音设备，这样就可以轻松实现将一个程序的声音发送到另一个程序了。&lt;&#x2F;p&gt;
&lt;p&gt;然后可以让每个程序的声音占用一条虚拟音频线，将这些音频线的声音统一发送给一个程序，让这个程序控制这些声音的发送，实现类似 Kx 驱动那样的效果，某些声音给别人听，某些声音给自己听，这个以后会讲到。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;安装&quot;&gt;安装&lt;a class=&quot;zola-anchor&quot; href=&quot;#安装&quot; aria-label=&quot;Anchor link for: 安装&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;首先要安装 Virtual Audio Cable 这个软件，这个软件是收费的，也有试用版，不过试用版只能创建3个虚拟音频通道，还会有一个女声一直提示你。&lt;&#x2F;p&gt;
&lt;p&gt;不过我从某个地方搞到了完整版，下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;share.weiyun.com&#x2F;64XtDv9E&quot;&gt;https:&#x2F;&#x2F;share.weiyun.com&#x2F;64XtDv9E&lt;&#x2F;a&gt; (密码：mivmcn)&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;如果你要用于商业用途，请务必去&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;vac.muzychenko.net&quot;&gt;官网&lt;&#x2F;a&gt;购买正版！&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下载完成后，根据你的系统位数，选择 &lt;code&gt;setup&lt;&#x2F;code&gt; 或 &lt;code&gt;setup64.exe&lt;&#x2F;code&gt; 进行安装。安装完成后，系统的默认音频设备可能会被更改，手动更改回之前的设备即可。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;基础设置&quot;&gt;基础设置&lt;a class=&quot;zola-anchor&quot; href=&quot;#基础设置&quot; aria-label=&quot;Anchor link for: 基础设置&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;虚拟音频线控制面板打开方法：在开始菜单里找到「Virtual Audio Cable」文件夹 -&amp;gt; 以管理员身份运行「VAC Control panel」。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;virtual-audio-cable&#x2F;.&#x2F;1.webp&quot; alt=&quot;虚拟音频线控制面板界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;控制面板看起来好像很复杂的样子，但其实要改的东西并不多，我们一个个来。&lt;&#x2F;p&gt;
&lt;p&gt;虚拟音频线数量：左上角的「Driver」的「Cables」输入框内输入你要设置虚拟音频线数量，然后点击旁边的「Set」按钮。（如果点击「Set」后出现错误，检查虚拟音频线是否被占用。）&lt;&#x2F;p&gt;
&lt;p&gt;虚拟音频线数量多少够用呢？这个就需要看自身情况了，通常来说5个就够用了，当然，完整版最高支持256个虚拟音频线，所以无论你有多么“变态”的需求都能满足。&lt;&#x2F;p&gt;
&lt;p&gt;虚拟音频线采样率、位数和通道数：只需要更改「Cables」的「Format range」里对应的选项就行了，设置这些参数的时候，最好是选中所有的虚拟音频线，这样就可以把参数更改应用到所有虚拟音频线了。SR 是可用的采样率范围、BPS 是可用的位数、NC 是可用的通道数。&lt;&#x2F;p&gt;
&lt;p&gt;这些参数设置多少合适呢？通常情况下 SR 设置 22050 到 48000、BPS 设置 16 到 24、NC 设置 2 到 2，点击右下角的「Set」保存并应用参数。&lt;&#x2F;p&gt;
&lt;p&gt;上述选项设置完成后，点击「Driver」下面的「Restart」，重启一下虚拟音频线。&lt;&#x2F;p&gt;
&lt;p&gt;然后还需要设置 Windows 系统的一些音频参数，点击虚拟音频线控制面板下方的的「Audio properties」打开系统播放设置面板，如下图：&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;virtual-audio-cable&#x2F;.&#x2F;2.webp&quot; alt=&quot;Windows 音频控制面板界面&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;双击所有虚拟音频线（灰色字体显示为 Virtual Audio Cable 的设备），切换到「级别」选项卡，将所有音量调到 100，然后切换到「高级」选项卡，将默认格式设置为和你的真实声卡一样的格式，如果你想节省一些系统资源可以设置为 16 位，但是采样率必须一样。设置完播放设备，别忘了设置录制设备，操作步骤一样。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;基础玩法&quot;&gt;基础玩法&lt;a class=&quot;zola-anchor&quot; href=&quot;#基础玩法&quot; aria-label=&quot;Anchor link for: 基础玩法&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;最简单的玩法是将一个程序的声音发送到另一个程序，但是这个声音还得让自己听到，当然，也可以不让自己听到。这个玩法我们不需要借助任何第三方软件，只需要使用 Windows 自带的监听功能即可实现。&lt;&#x2F;p&gt;
&lt;p&gt;将网易云的声音发送到 QQ 语音为例&lt;&#x2F;p&gt;
&lt;p&gt;首先将网易云的音频输出更改为任意一条虚拟音频线，这时候是听不到声音的，如果想听到声音，打开录制设备控制面板，双击对应的虚拟音频线，切换到「侦听」，点击「侦听此设备」，这样就可以听到声音了。&lt;&#x2F;p&gt;
&lt;p&gt;然后设置 QQ，打开 QQ 的设置，一直下拉到「音视频通话」，将麦克风更改为对应的虚拟音频线即可，这样对方就可以听到我们网易云发出的声音了。&lt;&#x2F;p&gt;
&lt;p&gt;不过由于 QQ 的渣渣传输音质，对方听到的声音是很杂的。这里只是用 QQ 作为示例，大家也可以将这个方法用于 YY 等其他程序。&lt;&#x2F;p&gt;
&lt;p&gt;不过这样别人就听不到你说话了，当然，也有方法，大家可以自行摸索，或者期待一下进阶玩法。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;进阶玩法&quot;&gt;进阶玩法&lt;a class=&quot;zola-anchor&quot; href=&quot;#进阶玩法&quot; aria-label=&quot;Anchor link for: 进阶玩法&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;进阶玩法我并不打算单纯用虚拟音频线来实现，因为单纯用这个来实现的话，也不是不行，但是逻辑上比较绕，我准备搭配另一款软件来实现更多的玩法，敬请期待。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="zh">
        <title>斐讯N1折腾记：降级及刷入官改</title>
        <published>2018-06-22T00:00:00+00:00</published>
        <updated>2019-08-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Hill-98
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://www.mivm.cn/phicomm-n1-unofficial/"/>
        <id>https://www.mivm.cn/phicomm-n1-unofficial/</id>
        
        <content type="html" xml:base="https://www.mivm.cn/phicomm-n1-unofficial/">
&lt;link rel=&quot;stylesheet&quot; href=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;admonition.css?h=98c1477488c4b2c9d71a&quot; type=&quot;text&#x2F;css&quot;&gt;

&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-tip);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;tip.svg);&quot;
    &gt;
      tip
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;提示&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;此教程同样适用于 &lt;strong&gt;斐讯 P1&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;h2 id=&quot;前言&quot;&gt;前言&lt;a class=&quot;zola-anchor&quot; href=&quot;#前言&quot; aria-label=&quot;Anchor link for: 前言&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;上个月，斐讯 K2T 首发那天，小山一不小心抢了两台 K2T，这就尴尬了。退了吧，好不容易抢到的，不退吧，我只能激活一台。所以，两台 K2T 我自己用了一台，另一台我准备卖出去。然而一个月过去了，眼看K码就要到期了，还是没有人要。咋办呢，只能再注册个账号来激活这台 K2T，但是首次激活的机会不能浪费啊，所以我又买了 N1 + H1 。&lt;&#x2F;p&gt;
&lt;p&gt;本来我根本不打算买 N1，因为我觉得这货没啥用，也没怎么关注过它。但是买来之后才发现，这货居然还能刷固件，刷完固件之后就是个电视盒子了，而且还能运行完整的 Linux。&lt;&#x2F;p&gt;
&lt;p&gt;这就非常耐斯了，我的折腾之心按耐不住了，所以就开始一步步的折腾。&lt;&#x2F;p&gt;
&lt;p&gt;这篇教程就先教大家给 斐讯 N1 降级以及刷入官改固件（电视盒子），这也是以后折腾的基础。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;降级&quot;&gt;降级&lt;a class=&quot;zola-anchor&quot; href=&quot;#降级&quot; aria-label=&quot;Anchor link for: 降级&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;如果你的斐讯 N1 系统坂本是 2.19，那么可以直接跳过降级过程，如果是其他坂本，请按照下面的方法降级关键分区。&lt;&#x2F;p&gt;
&lt;p&gt;降级准备：你需要有一根双公头的 USB 数据线，如果你的电脑支持 USB Type-C，USB Type-C 数据线也可以。&lt;strong&gt;线材质量一定要好，最好别太长，越短越好。&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;开启 ADB 调试&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;非常简单，只需要用鼠标点击斐讯 N1 官方固件的那个版本号 4 次，出现 【ADB调试开启】的字样即可。&lt;&#x2F;p&gt;
&lt;p&gt;斐讯 P1 开启的方法略有不同：进入「设置」-&amp;gt; 高级设置 -&amp;gt; 远程调试 -&amp;gt; 打开 「远程调试」&lt;&#x2F;p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;重启至 fastboot 模式&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;如果经常给手机刷机的小伙伴，对这个模式肯定不陌生，也就是我们平常所说的线刷模式。&lt;&#x2F;p&gt;
&lt;p&gt;这一步需要用到 ADB 调试工具，下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;dl.google.com&#x2F;android&#x2F;repository&#x2F;platform-tools-latest-windows.zip&quot;&gt;https:&#x2F;&#x2F;dl.google.com&#x2F;android&#x2F;repository&#x2F;platform-tools-latest-windows.zip&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;下载完成后解压，然后打开解压后的文件夹。按住 Shift，鼠标右键点击空白处，点击 「在此处打开 Powershell 窗口」 或 「在此处打开 命令提示符 窗口」。&lt;&#x2F;p&gt;
&lt;p&gt;输入命令 &lt;code&gt;.\adb.exe connect %IP%:5555&lt;&#x2F;code&gt;，将 &lt;code&gt;%IP%&lt;&#x2F;code&gt; 替换为 N1 的 IP，也就是官方固件页面显示的那个 IP。&lt;&#x2F;p&gt;
&lt;p&gt;示例：&lt;code&gt;.\adb.exe connect 192.168.1.222:5555&lt;&#x2F;code&gt;&lt;&#x2F;p&gt;
&lt;p&gt;如果有类似 &lt;code&gt;connected to 192.168.1.222:5555&lt;&#x2F;code&gt; 这样的提示，表示连接成功。成功后输入 &lt;code&gt;.\adb.exe shell reboot fastboot&lt;&#x2F;code&gt;，重启至 fastboot 模式。&lt;&#x2F;p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;刷入降级关键分区&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;如果进入 fastboot 后，电脑无法识别，可以尝试使用 webpack 提供的降级脚本：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;www.right.com.cn&#x2F;forum&#x2F;thread-340279-1-1.html&quot;&gt;https:&#x2F;&#x2F;www.right.com.cn&#x2F;forum&#x2F;thread-340279-1-1.html&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;将 N1 用双公头 USB 数据线与电脑连接，务必连接至靠近 HDMI 接口的那个 USB 接口，连接后查看设备管理器是否识别出新的硬件，如果新硬件驱动异常，右键新硬件点击 「更新驱动程序」。&lt;&#x2F;p&gt;
&lt;p&gt;驱动正常后，输入 &lt;code&gt;.\fastboot.exe devices&lt;&#x2F;code&gt; 查看 fastboot 工具是否已识别设备。&lt;&#x2F;p&gt;
&lt;p&gt;如果有 &lt;code&gt;XXXXXXXXXXXX fastboot&lt;&#x2F;code&gt; 这样的提示，表示成功识别。&lt;code&gt;XXXXXXXXXXXX&lt;&#x2F;code&gt; 为设备的序列号。&lt;&#x2F;p&gt;
&lt;p&gt;然后就可以刷入降级分区了，分区文件下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;share.weiyun.com&#x2F;5xIarC0&quot;&gt;https:&#x2F;&#x2F;share.weiyun.com&#x2F;5xIarC0&lt;&#x2F;a&gt; (密码: mivmcn)。下载后将压缩包内的分区文件解压至 ADB 工具包文件夹，最后依次输入下列命令刷入各个分区。&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.\fastboot.exe flash boot boot.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.\fastboot.exe flash bootloader bootloader.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.\fastboot.exe flash recovery recovery.img&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果上列命令没有返回任何错误信息，表示降级成功，最后输入 &lt;code&gt;.\fastboot.exe reboot&lt;&#x2F;code&gt; 重启设备。至此，降级步骤就完成了，可以放心的刷官改固件了。&lt;&#x2F;p&gt;
&lt;p&gt;可能有些小伙伴会说，系统版本哪里显示的不是 2.19 啊。这个降级并不是降级系统，而是降级引导等关键分区，所以系统版本哪里不会变的。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;刷入固件前的准备工作&quot;&gt;刷入固件前的准备工作&lt;a class=&quot;zola-anchor&quot; href=&quot;#刷入固件前的准备工作&quot; aria-label=&quot;Anchor link for: 刷入固件前的准备工作&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;首先下载 USB 烧录工具，下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;share.weiyun.com&#x2F;lIrPhxN9&quot;&gt;https:&#x2F;&#x2F;share.weiyun.com&#x2F;lIrPhxN9&lt;&#x2F;a&gt; (密码：mivmcn)，安装的时候记得创建桌面快捷方式，&lt;strong&gt;安装最后的驱动安装一定不要跳过&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;USB 烧录工具安装完成后，需要打开 Windows 设备管理器做一些设置。打开设备管理器 -&amp;gt; 点击任意硬件 -&amp;gt; 点击「操作」菜单 -&amp;gt;「添加过时硬件」-&amp;gt; 下一步 -&amp;gt; 选择「安装我手动从列表选择的硬件」-&amp;gt; 下一步 -&amp;gt; 选择「libusb-win32 Usb Devices」-&amp;gt; 下一步 -&amp;gt;  选择「WorldCup Device」-&amp;gt; 下一步 -&amp;gt; 下一步 -&amp;gt; 完成。这个设置可以确保 USB 烧录工具正常工作。&lt;&#x2F;p&gt;
&lt;p&gt;选择一个你喜欢的官改固件，我推荐两种选择：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;webpad 的官改固件，集成度高，也很好用，自带 Google 服务、Root、Xposed 框架、离线下载等常用软件。下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.right.com.cn&#x2F;forum&#x2F;thread-338759-1-1.html&quot;&gt;http:&#x2F;&#x2F;www.right.com.cn&#x2F;forum&#x2F;thread-338759-1-1.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;如果只是想当一个电视盒子用的，也可以刷 YYFROM 的无语音实用版固件，下载地址：&lt;a rel=&quot;noopener nofollow noreferrer external&quot; target=&quot;_blank&quot; href=&quot;http:&#x2F;&#x2F;www.yyfrom.com&#x2F;cms&#x2F;yyfrom&#x2F;product&#x2F;2018-9-4&#x2F;159.html&quot;&gt;http:&#x2F;&#x2F;www.yyfrom.com&#x2F;cms&#x2F;yyfrom&#x2F;product&#x2F;2018-9-4&#x2F;159.html&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;下载固件压缩包后，解压得到 img 文件以便后续使用。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;刷入官改固件&quot;&gt;刷入官改固件&lt;a class=&quot;zola-anchor&quot; href=&quot;#刷入官改固件&quot; aria-label=&quot;Anchor link for: 刷入官改固件&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;


&lt;div
  class=&quot;my-4 flex flex-col rounded-lg bg-(--admonition-bg)&quot;
  style=&quot;--admonition-bg: var(--admonition-warning);&quot;
&gt;
  &lt;div class=&quot;flex items-center rounded-t-lg bg-(--admonition-bg) p-1&quot;&gt;
    &lt;div
      class=&quot;mx-2 h-4 w-4 text-[0px] [background:var(--url)_center_center_no-repeat] dark:invert&quot;
      style=&quot;--url: url(icons&#x2F;warning.svg);&quot;
    &gt;
      warning
    &lt;&#x2F;div&gt;
    &lt;span&gt;&lt;strong&gt;警告&lt;&#x2F;strong&gt;&lt;&#x2F;span&gt;
  &lt;&#x2F;div&gt;
  &lt;div class=&quot;pl-4&quot;&gt;&lt;p&gt;以下步骤操作时务必谨慎，操作不当可能会导致设备变砖或损坏。&lt;&#x2F;p&gt;
&lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;ol&gt;
&lt;li&gt;打开刚才安装好的 USB 烧录工具 -&amp;gt; 点击「文件」菜单 -&amp;gt; 导入烧录包 -&amp;gt; 选择官改固件的 img 文件 -&amp;gt; 等待校验完成。&lt;&#x2F;li&gt;
&lt;li&gt;固件校验完成后，&lt;strong&gt;一定不要勾选窗口右边烧录配置的「擦除flash」和「擦除bootloader」选项&lt;&#x2F;strong&gt;，否则刷入时会报错。&lt;&#x2F;li&gt;
&lt;li&gt;点击烧录工具的 【开始】，此时烧录工具就进入了待命状态。&lt;&#x2F;li&gt;
&lt;li&gt;然后让 N1 进入刷机模式，务必按照下列顺序操作，否则可能无法成功进入刷机模式。
&lt;ol&gt;
&lt;li&gt;首先将 N1 彻底断电，任何接口都不要插线。&lt;&#x2F;li&gt;
&lt;li&gt;然后用数据线连接电脑，务必连接至靠近 HDMI 接口的那个 USB 接口。&lt;&#x2F;li&gt;
&lt;li&gt;最后接通 N1 的电源。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;如果没有意外，烧录工具应该已经识别出 N1 并开始刷入固件了，如果烧录工具没有任何反应，请尝试下面的操作。&lt;&#x2F;p&gt;
&lt;p&gt;使用 ADB 连接 N1，和刚刚降级时使用的方法一样。连接成功后输入 &lt;code&gt;.\adb.exe shell reboot update&lt;&#x2F;code&gt; 重启将 N1 至刷机模式，命令执行后立马点击烧录工具的「开始」，然后不停的点击刷新，应该就可以正常识别了。（没成功的话，多试几次，但是每次失败之后必须彻底将 N1 断电一次。）&lt;&#x2F;p&gt;
&lt;p&gt;如果上述方法也没有用，检查你是否正确执行了&lt;a href=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;phicomm-n1-unofficial&#x2F;#%E5%88%B7%E5%85%A5%E5%9B%BA%E4%BB%B6%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C&quot;&gt;准备工作&lt;&#x2F;a&gt;的步骤，USB 线材质量是否过关，如果是台式电脑，USB 务必插到主板后面的接口，拔掉你电脑除鼠标键盘以外的 USB 设备，上面的重启方法可以多试几次，还有就是可能这个工具与你的电脑不兼容（小概率事件）。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;www.mivm.cn&#x2F;phicomm-n1-unofficial&#x2F;.&#x2F;1.webp&quot; alt=&quot;烧录工具刷入固件时的界面截图&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;耐心等待烧录工具的进度条变为绿色，提示烧录成功。此时不要着急断开 N1 与电脑的连接，点击烧录工具的「停止」按钮并关闭烧录工具，然后拔掉数据线，将 N1 断电并再次通电开机。&lt;&#x2F;p&gt;
&lt;p&gt;首次启动大约需要 3-4 分钟，请耐心等待。系统启动后，会提示遥控器配对，因为用了 T1 的一些东西，直接跳过即可。然后便可以联网，安装一些直播、点播视频应用，就可以完完整整的当一个电视盒子来用了。推荐购买蓝牙遥控器以便更加方便的操控系统。&lt;&#x2F;p&gt;
&lt;p&gt;如果你刷了 webpad 的固件，在浏览器输入 IP:8081，既可管理离线下载、samba等软件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;后话&quot;&gt;后话&lt;a class=&quot;zola-anchor&quot; href=&quot;#后话&quot; aria-label=&quot;Anchor link for: 后话&quot;&gt;🔗&lt;&#x2F;a&gt;&lt;&#x2F;h2&gt;
&lt;p&gt;斐讯 N1 现在二手平台仅卖 70 元，但 N1 的配置是跟那些两三百的电视盒子不相上下的，可谓是非常的有性价比。&lt;&#x2F;p&gt;
&lt;p&gt;如果你想入手一个电视盒子，或者是想买一个类似树莓派的玩具（不搞硬件开发）。那么可以考虑下 N1，做电视盒子绰绰有余，运行 Linux 后，就是一个没有硬件扩展性的树莓派，当然，我相信大多数人买树莓派是搞软件开发的。&lt;&#x2F;p&gt;
&lt;p&gt;这是我目前觉得斐讯最有性价比的产品之一！&lt;&#x2F;p&gt;
&lt;p&gt;再次感谢 &lt;strong&gt;webpad&lt;&#x2F;strong&gt; 为 N1 可玩性做出的贡献。&lt;&#x2F;p&gt;
&lt;p&gt;还是那句话，教程中有什么不懂的地方，可以加入 QQ 群与我交流。&lt;&#x2F;p&gt;
</content>
        
    </entry>
</feed>
