<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>VConet</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://blog.vconet.top/</id>
  <link href="https://blog.vconet.top/" rel="alternate"/>
  <link href="https://blog.vconet.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, VConet</rights>
  <subtitle>探索，永不停息</subtitle>
  <title>VConet的杂物间</title>
  <updated>2026-03-11T14:58:48.000Z</updated>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="NetworkManager" scheme="https://blog.vconet.top/tags/NetworkManager/"/>
    <category term="wpa_supplicant" scheme="https://blog.vconet.top/tags/wpa-supplicant/"/>
    <category term="OpenSSL" scheme="https://blog.vconet.top/tags/OpenSSL/"/>
    <category term="802.1x" scheme="https://blog.vconet.top/tags/802-1x/"/>
    <category term="WPA2-EAP" scheme="https://blog.vconet.top/tags/WPA2-EAP/"/>
    <content>
      <![CDATA[<p>记录 Linux 下无法连接 WPA2-EAP WiFi 的问题排查过程。</p><h2 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h2><p>添加好 WiFi 配置后点击连接，KDE 的 NetworkManager 会在“正在配置端口”后小概率获取 IP，随后又弹出重新输入密码的窗口。反复尝试后仍然连接失败。</p><h2 id="排查"><a href="#排查" class="headerlink" title="排查"></a>排查</h2><p>查看 NetworkManager 的 journal 并未发现有用信息：</p><details class="tag-plugin colorful folding" ><summary><p>journalctl&nbsp;-xeu&nbsp;NetworkManager</p></summary><div class="body"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8622] Config: added &#x27;ssid&#x27; value &#x27;S&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8622] Config: added &#x27;scan_ssid&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8622] Config: added &#x27;bgscan&#x27; value &#x27;simple:30:-65:300&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8622] Config: added &#x27;key_mgmt&#x27; value &#x27;WPA-EAP FT-EAP FT-EAP-SHA384 WPA-EAP-SHA256&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8622] Config: added &#x27;auth_alg&#x27; value &#x27;OPEN&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;password&#x27; value &#x27;&lt;hidden&gt;&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;eap&#x27; value &#x27;PEAP&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;fragment_size&#x27; value &#x27;1266&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;phase2&#x27; value &#x27;auth=MSCHAPV2&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;identity&#x27; value &#x27;28&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.8623] Config: added &#x27;proactive_key_caching&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.9515] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700308.9515] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.8392] device (wlp9s0): supplicant interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.8392] device (p2p-dev-wlp9s0): supplicant management interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.8454] device (wlp9s0): supplicant interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.8454] device (p2p-dev-wlp9s0): supplicant management interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.9626] device (wlp9s0): supplicant interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700312.9627] device (p2p-dev-wlp9s0): supplicant management interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700314.0445] device (wlp9s0): supplicant interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700314.0445] device (p2p-dev-wlp9s0): supplicant management interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700314.2286] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700314.2286] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.7202] device (wlp9s0): supplicant interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.7203] device (p2p-dev-wlp9s0): supplicant management interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.7253] device (wlp9s0): supplicant interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.7253] device (p2p-dev-wlp9s0): supplicant management interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.8425] device (wlp9s0): supplicant interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700328.8426] device (p2p-dev-wlp9s0): supplicant management interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700329.9175] device (wlp9s0): supplicant interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700329.9176] device (p2p-dev-wlp9s0): supplicant management interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700330.1012] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700330.1012] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;warn&gt;  [1772700333.9965] device (wlp9s0): Activation: (wifi) association took too long</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700333.9965] device (wlp9s0): state change: config -&gt; need-auth (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;warn&gt;  [1772700333.9970] device (wlp9s0): Activation: (wifi) asking for new secrets</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9915] device (wlp9s0): state change: need-auth -&gt; prepare (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9918] device (wlp9s0): state change: prepare -&gt; config (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] device (wlp9s0): Activation: (wifi) connection &#x27;1X&#x27; has security, and secrets exist.  No new secrets needed.</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;ssid&#x27; value &#x27;X&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;scan_ssid&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;bgscan&#x27; value &#x27;simple:30:-65:300&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;key_mgmt&#x27; value &#x27;WPA-EAP FT-EAP FT-EAP-SHA384 WPA-EAP-SHA256&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;auth_alg&#x27; value &#x27;OPEN&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;password&#x27; value &#x27;&lt;hidden&gt;&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;eap&#x27; value &#x27;PEAP&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9920] Config: added &#x27;fragment_size&#x27; value &#x27;1266&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9921] Config: added &#x27;phase2&#x27; value &#x27;auth=MSCHAPV2&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9921] Config: added &#x27;identity&#x27; value &#x27;8&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700343.9921] Config: added &#x27;proactive_key_caching&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700347.9052] device (wlp9s0): supplicant interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700347.9053] device (p2p-dev-wlp9s0): supplicant management interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700347.9128] device (wlp9s0): supplicant interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700347.9129] device (p2p-dev-wlp9s0): supplicant management interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700348.0264] device (wlp9s0): supplicant interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700348.0265] device (p2p-dev-wlp9s0): supplicant management interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700349.1053] device (wlp9s0): supplicant interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700349.1054] device (p2p-dev-wlp9s0): supplicant management interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700349.2907] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:45NetworkManager&lt;info&gt;  [1772700349.2908] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.7809] device (wlp9s0): supplicant interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.7810] device (p2p-dev-wlp9s0): supplicant management interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.7891] device (wlp9s0): supplicant interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.7891] device (p2p-dev-wlp9s0): supplicant management interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.8986] device (wlp9s0): supplicant interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700363.8987] device (p2p-dev-wlp9s0): supplicant management interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700364.9656] device (wlp9s0): supplicant interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700364.9657] device (p2p-dev-wlp9s0): supplicant management interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700365.1507] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700365.1508] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;warn&gt;  [1772700368.9965] device (wlp9s0): Activation: (wifi) association took too long</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700368.9965] device (wlp9s0): state change: config -&gt; need-auth (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;warn&gt;  [1772700368.9970] device (wlp9s0): Activation: (wifi) asking for new secrets</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8897] device (wlp9s0): state change: need-auth -&gt; prepare (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8903] device (wlp9s0): state change: prepare -&gt; config (reason &#x27;none&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8907] device (wlp9s0): Activation: (wifi) connection &#x27;1X&#x27; has security, and secrets exist.  No new secrets needed.</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8908] Config: added &#x27;ssid&#x27; value &#x27;&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8908] Config: added &#x27;scan_ssid&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8908] Config: added &#x27;bgscan&#x27; value &#x27;simple:30:-65:300&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8908] Config: added &#x27;key_mgmt&#x27; value &#x27;WPA-EAP FT-EAP FT-EAP-SHA384 WPA-EAP-SHA256&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8908] Config: added &#x27;auth_alg&#x27; value &#x27;OPEN&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8909] Config: added &#x27;password&#x27; value &#x27;&lt;hidden&gt;&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8909] Config: added &#x27;eap&#x27; value &#x27;PEAP&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8909] Config: added &#x27;fragment_size&#x27; value &#x27;1266&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8909] Config: added &#x27;phase2&#x27; value &#x27;auth=MSCHAPV2&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8909] Config: added &#x27;identity&#x27; value &#x27;208&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700372.8910] Config: added &#x27;proactive_key_caching&#x27; value &#x27;1&#x27;</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.8107] device (wlp9s0): supplicant interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.8108] device (p2p-dev-wlp9s0): supplicant management interface state: scanning -&gt; authenticating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.8185] device (wlp9s0): supplicant interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.8186] device (p2p-dev-wlp9s0): supplicant management interface state: authenticating -&gt; associating</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.9304] device (wlp9s0): supplicant interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700376.9304] device (p2p-dev-wlp9s0): supplicant management interface state: associating -&gt; associated</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700378.0091] device (wlp9s0): supplicant interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700378.0091] device (p2p-dev-wlp9s0): supplicant management interface state: associated -&gt; disconnected</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700378.1930] device (wlp9s0): supplicant interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700378.1930] device (p2p-dev-wlp9s0): supplicant management interface state: disconnected -&gt; scanning</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;warn&gt;  [1772700397.9964] device (wlp9s0): Activation: (wifi) association took too long</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700397.9965] device (wlp9s0): state change: config -&gt; failed (reason &#x27;no-secrets&#x27;, managed-type: &#x27;full&#x27;)</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700397.9969] manager: NetworkManager state is now CONNECTED_LOCAL</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;info&gt;  [1772700398.0133] device (wlp9s0): set-hw-addr: set MAC address to AAAA (scanning)</span><br><span class="line">2026/3/5 16:46NetworkManager&lt;warn&gt;  [1772700398.0976] device (wlp9s0): Activation: failed for connection &#x27;X&#x27;</span><br></pre></td></tr></table></figure></div></details><p>日志与前述症状一致，依然没有关键线索。<br>继续排查 NetworkManager 的无线后端 wpa_supplicant 的日志 <code>journalctl -xeu wpa_supplicant</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">2026/3/11 08:00wpa_supplicantnl80211: send_event_marker failed: Source based routing not supported</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-DISCONNECTED bssid=AAAA reason=3 locally_generated=1</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-DSCP-POLICY clear_all</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-REGDOM-CHANGE init=CORE type=WORLD</span><br><span class="line">2026/3/11 08:00NetworkManager&lt;info&gt;  [1773187200.7302] Config: added &#x27;key_mgmt&#x27; value &#x27;WPA-EAP FT-EAP FT-EAP-SHA384 WPA-EAP-SHA256&#x27;</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: SME: Trying to authenticate with AAAA (SSID=&#x27;X&#x27; freq=5745 MHz)</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: Trying to associate with AAAA (SSID=&#x27;X&#x27; freq=5745 MHz)</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-REGDOM-CHANGE init=BEACON_HINT type=UNKNOWN</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-REGDOM-BEACON-HINT before freq=5745 max_tx_power=2000 no_ir=1</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-REGDOM-BEACON-HINT after freq=5745 max_tx_power=2000</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: Associated with AAAA</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-EAP-STARTED EAP authentication started</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected</span><br><span class="line">2026/3/11 08:00wpa_supplicantSSL: SSL3 alert: write (local SSL3 detected an error):fatal:protocol version</span><br><span class="line">2026/3/11 08:00wpa_supplicantOpenSSL: openssl_handshake - SSL_connect error:0A000102:SSL routines::unsupported protocol</span><br><span class="line">2026/3/11 08:00wpa_supplicantwlp9s0: CTRL-EVENT-EAP-FAILURE EAP authentication failed</span><br></pre></td></tr></table></figure><p>最后发现 OpenSSL 的加密策略过于严格，而我要连的 WiFi 设备较旧，用的还是较旧的加密方式，导致认证失败。</p><h2 id="解决"><a href="#解决" class="headerlink" title="解决"></a>解决</h2><p>既然问题在 OpenSSL，且为了不修改全局配置，可以单独为 wpa_supplicant 指定配置文件，编辑 <code>/etc/wpa_supplicant/openssl.cnf</code>：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[openssl_init]</span></span><br><span class="line"><span class="attr">ssl_conf</span> = ssl_sect</span><br><span class="line"></span><br><span class="line"><span class="section">[ssl_sect]</span></span><br><span class="line"><span class="attr">system_default</span> = system_default_sect</span><br><span class="line"></span><br><span class="line"><span class="section">[system_default_sect]</span></span><br><span class="line"><span class="attr">CipherString</span> = DEFAULT:@SECLEVEL=<span class="number">1</span></span><br></pre></td></tr></table></figure><p>编辑 wpa_supplicant 的 service 文件：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_6" value="systemctl edit wpa_supplicant.service"><button class="copy-btn" onclick="util.copy(&quot;copy_6&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">### Editing /etc/systemd/system/wpa_supplicant.service.d/override.conf</span><br><span class="line">### Anything between here and the comment below will become the contents of the drop-in file</span><br><span class="line"></span><br><span class="line"><span class="addition">+Environment=&quot;OPENSSL_CONF=/etc/wpa_supplicant/openssl.cnf&quot;</span></span><br><span class="line"></span><br><span class="line">### Edits below this comment will be discarded</span><br></pre></td></tr></table></figure><p>重启 wpa_supplicant 即可。</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/linux-wpa-eap-issue/</id>
    <link href="https://blog.vconet.top/archives/linux-wpa-eap-issue/"/>
    <published>2026-03-11T14:58:48.000Z</published>
    <summary>
      <![CDATA[<p>记录 Linux 下无法连接 WPA2-EAP WiFi 的问题排查过程。</p>
<h2 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h2><p>添加好 WiFi 配置后点击连接，KDE 的 Ne]]>
    </summary>
    <title>wpa_supplicant 后端无法连接 802.1x WiFi</title>
    <updated>2026-03-11T14:58:48.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="DN42" scheme="https://blog.vconet.top/categories/DN42/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="DN42" scheme="https://blog.vconet.top/tags/DN42/"/>
    <category term="Bird" scheme="https://blog.vconet.top/tags/Bird/"/>
    <category term="Docker" scheme="https://blog.vconet.top/tags/Docker/"/>
    <category term="异地组网" scheme="https://blog.vconet.top/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    <category term="NAT" scheme="https://blog.vconet.top/tags/NAT/"/>
    <category term="iBGP" scheme="https://blog.vconet.top/tags/iBGP/"/>
    <category term="eBGP" scheme="https://blog.vconet.top/tags/eBGP/"/>
    <category term="iptables" scheme="https://blog.vconet.top/tags/iptables/"/>
    <category term="WireGuard" scheme="https://blog.vconet.top/tags/WireGuard/"/>
    <category term="Zerotier" scheme="https://blog.vconet.top/tags/Zerotier/"/>
    <category term="FlapAlerted" scheme="https://blog.vconet.top/tags/FlapAlerted/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文用以记录自己加入 DN42 网络的历程，本人是初入 BGP 的小白，对于文章中出现的各种不严谨内容和各种低级错误，请大佬们手下留情，可在评论区指出。</p><p>欢迎和我 Peer：<a href="https://blog.vconet.top/dn42/">VCNET DN42</a></p><span id="more"></span><h2 id="注册"><a href="#注册" class="headerlink" title="注册"></a>注册</h2><p>iYoRoy 的博客有详细的过程，我就不再重复了：<a href="https://www.iyoroy.cn/archives/84/">DN42探究日记 - Ep.1 加入DN42网络</a>。</p><h2 id="选择-BGP-Daemon"><a href="#选择-BGP-Daemon" class="headerlink" title="选择 BGP Daemon"></a>选择 BGP Daemon</h2><p>参考各位大佬的教程，我决定使用 Bird v3 为我的 BGP Daemon，以 Debian 13 为例：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">apt update</span><br><span class="line">apt -y install apt-transport-https ca-certificates wget</span><br><span class="line">wget -O /usr/share/keyrings/cznic-labs-pkg.gpg https://pkg.labs.nic.cz/gpg</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb [signed-by=/usr/share/keyrings/cznic-labs-pkg.gpg] https://pkg.labs.nic.cz/bird3 trixie main&quot;</span> &gt; /etc/apt/sources.list.d/cznic-labs-bird3.list</span><br><span class="line">apt update &amp;&amp; apt -y install bird3 wireguard wireguard-tools</span><br></pre></td></tr></table></figure><p>Debian 软件源中的 Bird 版本比较旧，需要安装上面的最新版</p><p>其他系统及 Bird v2 软件源可查看：<a href="https://pkg.labs.nic.cz/doc/?project=bird">CZ.NIC Labs 📦 Repos Setup Docs</a> </p><h3 id="bird-conf"><a href="#bird-conf" class="headerlink" title="bird.conf"></a>bird.conf</h3><p>修改 <code>/etc/bird/bird.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">define</span> OWNAS =  <span class="number">4242423322</span>;</span><br><span class="line"><span class="keyword">define</span> OWNIP =  <span class="number">172.23.100.180</span>;</span><br><span class="line"><span class="keyword">define</span> OWNIPv6 = <span class="number">fd48:8669:9f9f::8</span>;</span><br><span class="line"><span class="keyword">define</span> OWNNET = <span class="number">172.23.100.160/27</span>;</span><br><span class="line"><span class="keyword">define</span> OWNNETv6 = <span class="number">fd48:8669:9f9f::/48</span>;</span><br><span class="line"><span class="keyword">define</span> OWNNETSET = [<span class="number">172.23.100.160/27+</span>];</span><br><span class="line"><span class="keyword">define</span> OWNNETSETv6 = [<span class="number">fd48:8669:9f9f::/48+</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">router</span> <span class="keyword">id</span> OWNIP;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">device</span> &#123;</span><br><span class="line">  <span class="keyword">scan</span> <span class="keyword">time</span> <span class="number">10</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">is_self_net</span>() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">net</span> ~ OWNNETSET;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">is_self_net_v6</span>() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">net</span> ~ OWNNETSETv6;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">is_valid_network</span>() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">net</span> ~ [</span><br><span class="line">  <span class="number">172.20.0.0/14&#123;21,29&#125;</span>, <span class="comment"># dn42</span></span><br><span class="line">  <span class="number">172.20.0.0/24&#123;28,32&#125;</span>, <span class="comment"># dn42 Anycast</span></span><br><span class="line">  <span class="number">172.21.0.0/24&#123;28,32&#125;</span>, <span class="comment"># dn42 Anycast</span></span><br><span class="line">  <span class="number">172.22.0.0/24&#123;28,32&#125;</span>, <span class="comment"># dn42 Anycast</span></span><br><span class="line">  <span class="number">172.23.0.0/24&#123;28,32&#125;</span>, <span class="comment"># dn42 Anycast</span></span><br><span class="line">  <span class="number">172.31.0.0/16+</span>,       <span class="comment"># ChaosVPN</span></span><br><span class="line">  <span class="number">10.100.0.0/14+</span>,       <span class="comment"># ChaosVPN</span></span><br><span class="line">  <span class="number">10.127.0.0/16&#123;16,32&#125;</span>, <span class="comment"># neonetwork</span></span><br><span class="line">  <span class="number">10.0.0.0/8&#123;15,24&#125;</span>     <span class="comment"># Freifunk.net</span></span><br><span class="line">  ];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">is_valid_network_v6</span>() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">net</span> ~ [</span><br><span class="line">  <span class="number">fd00::/8&#123;44,64&#125;</span> <span class="comment"># ULA address space as per RFC 4193</span></span><br><span class="line">  ];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">kernel</span> &#123;</span><br><span class="line">  <span class="keyword">scan</span> <span class="keyword">time</span> <span class="number">20</span>;</span><br><span class="line">  <span class="type">ipv6</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">none</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="built_in">source</span> = <span class="literal">RTS_STATIC</span> <span class="keyword">then</span> <span class="keyword">reject</span>;</span><br><span class="line">      <span class="built_in">krt_prefsrc</span> = OWNIPv6;</span><br><span class="line">      <span class="keyword">accept</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">kernel</span> &#123;</span><br><span class="line">  <span class="keyword">scan</span> <span class="keyword">time</span> <span class="number">20</span>;</span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">none</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="built_in">source</span> = <span class="literal">RTS_STATIC</span> <span class="keyword">then</span> <span class="keyword">reject</span>;</span><br><span class="line">      <span class="built_in">krt_prefsrc</span> = OWNIP;</span><br><span class="line">      <span class="keyword">accept</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">static</span> &#123;</span><br><span class="line">  <span class="keyword">route</span> OWNNET <span class="keyword">reject</span>;</span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">all</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="literal">none</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">static</span> &#123;</span><br><span class="line">  <span class="keyword">route</span> OWNNETv6 <span class="keyword">reject</span>;</span><br><span class="line">  <span class="type">ipv6</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">all</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="literal">none</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;rpki.conf&quot;</span>;</span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;ospf.conf&quot;</span>;</span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;ibgp.conf&quot;</span>;</span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;ebgp.conf&quot;</span>;</span><br></pre></td></tr></table></figure><p>首先修改自己的网络信息：</p><ul><li>OWNAS 修改为你的 ASN，如：4242423322</li><li>OWNIP 修改为此节点所分配的 IPv4 地址，如：172.23.100.180</li><li>OWNIPv6 修改为此节点所分配的 IPv6 地址，如：fd48:8669:9f9f::8</li><li>OWNNET 修改为你所拥有的 IPv4 网段，如：172.23.100.160&#x2F;27</li><li>OWNNETv6 修改为你所拥有的 IPv6 网段，如：fd48:8669:9f9f::&#x2F;48</li><li>OWNNETSET 和 OWNNETSETv6 同 上两个，但不要忘记末尾的 <code>+</code></li></ul><h3 id="rpki-conf"><a href="#rpki-conf" class="headerlink" title="rpki.conf"></a>rpki.conf</h3><p>修改 <code>/etc/bird/rpki.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">roa4</span> <span class="keyword">table</span> dn42_roa;</span><br><span class="line"><span class="type">roa6</span> <span class="keyword">table</span> dn42_roa_v6;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">rpki</span> dn42_rpki &#123;</span><br><span class="line">  <span class="type">roa4</span> &#123; <span class="keyword">table</span> dn42_roa; &#125;;</span><br><span class="line">  <span class="type">roa6</span> &#123; <span class="keyword">table</span> dn42_roa_v6; &#125;;</span><br><span class="line">  remote <span class="string">&quot;rpki.akae.re&quot;</span> port <span class="number">8082</span>;</span><br><span class="line">  refresh <span class="number">30</span>;</span><br><span class="line">  retry <span class="number">5</span>;</span><br><span class="line">  expire <span class="number">600</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><div class="tag-plugin colorful note" color="cyan"><div class="title">什么是&nbsp;ROA</div><div class="body"><p>ROA是数字签名对象，将地址绑定到AS号码，并由地址持有者签名。ROA提供了一种验证IP地址块持有者是否已授权特定AS在域间路由环境中为该地址块发起路由的方法。[RFC6482]中描述了ROA。ROA旨在满足为域间路由添加安全性的要求。</p></div></div><p>为 DN42 启用 ROA 检查，能有效防止 BGP 劫持和错误配置导致的路由泄露，而使用 RPKI，为我们省去了手动配置 ROA 表和更新的麻烦.</p><h3 id="ebgp-conf"><a href="#ebgp-conf" class="headerlink" title="ebgp.conf"></a>ebgp.conf</h3><p>修改 <code>/etc/bird/ebgp.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span> <span class="type">bgp</span> dn42_peers &#123;</span><br><span class="line">  <span class="keyword">local</span> <span class="keyword">as</span> OWNAS;</span><br><span class="line">  <span class="built_in">path</span> <span class="built_in">metric</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="built_in">extended</span> <span class="built_in">next</span> <span class="built_in">hop</span>;</span><br><span class="line">    <span class="comment">#import limit 1000 action block; #限制从他人哪里导入路由的数量</span></span><br><span class="line">    <span class="keyword">import</span> <span class="built_in">keep</span> <span class="built_in">filtered</span>;</span><br><span class="line">    <span class="keyword">import</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="title function_">is_valid_network</span>() &amp;&amp; !<span class="title function_">is_self_net</span>() <span class="keyword">then</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title function_">roa_check</span>(dn42_roa, <span class="built_in">net</span>, <span class="built_in">bgp_path</span>.last) != <span class="literal">ROA_VALID</span>) <span class="keyword">then</span> &#123;</span><br><span class="line">          <span class="keyword">print</span> <span class="string">&quot;[dn42] ROA check failed for &quot;</span>, <span class="built_in">net</span>, <span class="string">&quot; ASN &quot;</span>, <span class="built_in">bgp_path</span>.last;</span><br><span class="line">          <span class="keyword">reject</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">accept</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">reject</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="title function_">is_valid_network</span>() &amp;&amp; <span class="built_in">source</span> ~ [<span class="literal">RTS_STATIC</span>, <span class="literal">RTS_BGP</span>] <span class="keyword">then</span> <span class="keyword">accept</span>;</span><br><span class="line">      <span class="keyword">reject</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="type">ipv6</span> &#123;</span><br><span class="line">    <span class="comment">#import limit 1000 action block;</span></span><br><span class="line">    <span class="keyword">import</span> <span class="built_in">keep</span> <span class="built_in">filtered</span>;</span><br><span class="line">    <span class="keyword">import</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="title function_">is_valid_network_v6</span>() &amp;&amp; !<span class="title function_">is_self_net_v6</span>() <span class="keyword">then</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title function_">roa_check</span>(dn42_roa_v6, <span class="built_in">net</span>, <span class="built_in">bgp_path</span>.last) != <span class="literal">ROA_VALID</span>) <span class="keyword">then</span> &#123;</span><br><span class="line">          <span class="keyword">print</span> <span class="string">&quot;[dn42] ROA check failed for &quot;</span>, <span class="built_in">net</span>, <span class="string">&quot; ASN &quot;</span>, <span class="built_in">bgp_path</span>.last;</span><br><span class="line">          <span class="keyword">reject</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">accept</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      <span class="keyword">reject</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">if</span> <span class="title function_">is_valid_network_v6</span>() &amp;&amp; <span class="built_in">source</span> ~ [<span class="literal">RTS_STATIC</span>, <span class="literal">RTS_BGP</span>] <span class="keyword">then</span> <span class="keyword">accept</span>;</span><br><span class="line">      <span class="keyword">reject</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;dn42_peers/*&quot;</span>;</span><br></pre></td></tr></table></figure><p>此文件定义了和他人互 Peer 的模板并启用了 ROA 过滤，和他人互 Peer 的配置保存在 <code>/etc/bird/dn42_peers</code> 内。</p><h2 id="系统配置"><a href="#系统配置" class="headerlink" title="系统配置"></a>系统配置</h2><h3 id="sysctl"><a href="#sysctl" class="headerlink" title="sysctl"></a>sysctl</h3><div class="tag-plugin colorful note" color="red"><div class="body"><p><strong>请千万、千万、千万，一定要确保&nbsp;rp_filter&nbsp;关闭</strong></p></div></div><p>在 DN42 内，每个节点几乎都是其他人的路由器，而系统默认并不允许数据包转发并且有严格的数据包过滤，因此需要如下设置：</p><p>Debian 13 放弃了 <code>/etc/sysctl.conf</code>，改为 <code>/etc/sysctl.d/</code> 目录下的配置文件，因此我们需要在 <code>/etc/sysctl.d/</code> 下新建 <code>99-dn42.conf</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv4.ip_forward=1&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv6.conf.default.forwarding=1&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv6.conf.all.forwarding=1&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv4.conf.default.rp_filter=0&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv4.conf.all.rp_filter=0&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;net.ipv4.conf.*.rp_filter=0&quot;</span> &gt;&gt; /etc/sysctl.d/99-dn42.conf</span><br><span class="line">sysctl --system</span><br></pre></td></tr></table></figure><p>尤其需要注意 <del>人品过滤器</del> <psw>rp_filter</psw>，有时 ping 不通他人很可能就是它导致的。</p><p>如果你不放心，可使用下面的 bash 脚本一键将 <code>dn42</code> 开头的网卡的 rp_filter 关闭：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">for</span> net_dev <span class="keyword">in</span> /proc/sys/net/ipv4/conf/dn42*/rp_filter; <span class="keyword">do</span></span><br><span class="line">    <span class="built_in">echo</span> 0 &gt; <span class="string">&quot;<span class="variable">$net_dev</span>&quot;</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="Dummy-网卡"><a href="#Dummy-网卡" class="headerlink" title="Dummy 网卡"></a>Dummy 网卡</h3><p>我们需要一个 Dummy 网卡绑定本机的 DN42 网络信息，在此，我选择使用 <code>ifupdown</code> 来统一配置我的所有节点。</p><p>编辑 <code>/etc/network/interfaces</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">auto dn42</span><br><span class="line">iface dn42 inet static</span><br><span class="line">    address 172.23.100.180</span><br><span class="line">    netmask 255.255.255.255</span><br><span class="line">    pre-up ip link add dn42 type dummy || true</span><br><span class="line">    up ip link set dn42 up</span><br><span class="line">iface dn42 inet6 static</span><br><span class="line">    address fd48:8669:9f9f::8/128</span><br></pre></td></tr></table></figure><p>请记得修改为自己的 IP。</p><p>使用 <code>ifup dn42</code> 与 <code>ifdown dn42</code> 启用 &amp; 禁用网卡。</p><h3 id="容器"><a href="#容器" class="headerlink" title="容器"></a>容器</h3><p>根据我自己的经验，我更推荐 Podman 而非 Docker。我曾花了两天时间解决无法对外 ping 的问题，最后发现是 Docker 的 iptables 规则引起的。如果你一定要用 Docker 且遇到类似问题，可尝试添加下面的 iptables 规则：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">iptables -I DOCKER-USER 1 -i dn42+ -o zt+ -j ACCEPT</span><br><span class="line">iptables -I DOCKER-USER 1 -i zt+ -o dn42+ -j ACCEPT</span><br><span class="line"></span><br><span class="line">ip6tables -I DOCKER-USER 1 -i dn42+ -o zt+ -j ACCEPT</span><br><span class="line">ip6tables -I DOCKER-USER 1 -i zt+ -o dn42+ -j ACCEPT</span><br></pre></td></tr></table></figure><h2 id="与他人互-Peer"><a href="#与他人互-Peer" class="headerlink" title="与他人互 Peer"></a>与他人互 Peer</h2><h3 id="WireGuard"><a href="#WireGuard" class="headerlink" title="WireGuard"></a>WireGuard</h3><p>与他人互 Peer 之前，通常需要双方建立 P2P 隧道，其原因可以借用蓝天的原话：</p><blockquote><p>DN42 中几乎每个 Peering 都是建立在隧道软件（即 VPN）之上的，原因如下：</p><ul><li>DN42 各个用户的节点分布在世界各地，隧道软件可以对数据进行基本的加密和保护；</li><li>DN42 使用的是私有地址，如果直接在互联网上传输，会被防火墙直接丢弃，甚至可能会被主机商认为你在 <code>IP Spoofing</code>（伪造来源 IP 地址），违反服务条款，造成严重后果。</li></ul></blockquote><p>而 DN42 的参与者们用的最多的就是 WireGuard 和 GRE&#x2F;IPSec，而前者配置较为简单，也有一定的加密能力。</p><h4 id="生成密钥对"><a href="#生成密钥对" class="headerlink" title="生成密钥对"></a>生成密钥对</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wg genkey | <span class="built_in">tee</span> privatekey | wg pubkey &gt; publickey</span><br></pre></td></tr></table></figure><p>请保存好自己的公私钥。</p><h3 id="互-Peer"><a href="#互-Peer" class="headerlink" title="互 Peer"></a>互 Peer</h3><p>对于新人，可以通过 potat0 的 Telegram 机器人自动 Peer：<a href="https://t.me/Potat0_DN42_Bot">@Potat0_DN42_Bot</a>，亦或是 iEdon 的网自动 Peer：<a href="https://iedon.net/nodes">iEdon Net</a>，还有 Kioubit 的网页自动 Peer：<a href="https://dn42.g-load.eu/">Kioubit Network</a>.</p><h4 id="互-Peer-信息"><a href="#互-Peer-信息" class="headerlink" title="互 Peer 信息"></a>互 Peer 信息</h4><p>通过自动机器人或网页，亦或是他人的主页，我们既需要获得对方如下信息，也需要给对方提供自己的如下信息：</p><ul><li>公钥</li><li>公网地址（Endpoint）</li><li>DN42 的 ASN</li><li>IPv6 LLA</li><li>是否支持ENH(Extended Next Hop)，注意：若使用v6交换路由而不启用ENH则无法交换v4路由</li></ul><p>在获得了对方上述信息后，我们需要在 <code>/etc/wireguard</code> 下创建一个文件，我的命名习惯为：<code>dn42-424242XXXX.conf</code>，填入如下内容：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 424242XXX - @YYY   # 对方的 ASN 及联系方式，方便后期查找</span></span><br><span class="line"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">ListenPort</span> = &lt;开放给对方的端口 UDP&gt;</span><br><span class="line"><span class="attr">Table</span> = <span class="literal">off</span></span><br><span class="line"><span class="attr">MTU</span> = <span class="number">1420</span> <span class="comment"># MTU，一般不需要修改</span></span><br><span class="line"><span class="comment">#将私钥存放到 /etc/wireguard/dn42-privatekey 不需要每次都复制一遍</span></span><br><span class="line"><span class="attr">PostUp</span> = wg set %i private-key /etc/wireguard/dn42-privatekey</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add &lt;你的 LLA 地址&gt;/<span class="number">64</span> peer &lt;对方的 LLA 地址&gt;/<span class="number">64</span> dev %i</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add &lt;你的 ULA 地址&gt;/<span class="number">128</span> dev %i</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add &lt;你的 IPv4 地址&gt;/<span class="number">32</span> dev %i</span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = &lt;对方的公钥&gt;</span><br><span class="line"><span class="attr">Endpoint</span> =  &lt;对方提供给你的 Endpoint&gt;</span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">172.20</span>.<span class="number">0.0</span>/<span class="number">14</span>, <span class="number">10.0</span>.<span class="number">0.0</span>/<span class="number">8</span>, <span class="number">172.31</span>.<span class="number">0.0</span>/<span class="number">16</span>, fd00::/<span class="number">8</span>, fe80::/<span class="number">64</span></span><br></pre></td></tr></table></figure><p><em>关于端口，有一个通常做法：20000 + 对方 ASN 后四位</em></p><details class="tag-plugin colorful folding" ><summary><p>完整示例</p></summary><div class="body"><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 4242422547 - @lantian1998</span></span><br><span class="line"><span class="section">[Interface]</span></span><br><span class="line"><span class="attr">ListenPort</span> = <span class="number">22547</span></span><br><span class="line"><span class="attr">Table</span> = <span class="literal">off</span></span><br><span class="line"><span class="attr">MTU</span> = <span class="number">1420</span></span><br><span class="line"><span class="attr">PostUp</span> = wg set %i private-key /etc/wireguard/dn42-privatekey</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add fe80::<span class="number">3322</span>/<span class="number">64</span> peer fe80::<span class="number">2547</span>/<span class="number">64</span> dev %i</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add fd48:<span class="number">8669</span>:<span class="number">9</span>f9f::<span class="number">8</span>/<span class="number">128</span> dev %i</span><br><span class="line"><span class="attr">PostUp</span> = ip addr add <span class="number">172.23</span>.<span class="number">100.180</span>/<span class="number">32</span> dev %i</span><br><span class="line"><span class="section">[Peer]</span></span><br><span class="line"><span class="attr">PublicKey</span> = xelzwt1j0aoKjsQnnq8jMjZNLbLucBPwPTvHgFH/czs=</span><br><span class="line"><span class="attr">Endpoint</span> =  alice.lantian.pub:<span class="number">23322</span></span><br><span class="line"><span class="attr">AllowedIPs</span> = <span class="number">172.20</span>.<span class="number">0.0</span>/<span class="number">14</span>, <span class="number">10.0</span>.<span class="number">0.0</span>/<span class="number">8</span>, <span class="number">172.31</span>.<span class="number">0.0</span>/<span class="number">16</span>, fd00::/<span class="number">8</span>, fe80::/<span class="number">64</span></span><br></pre></td></tr></table></figure> </div></details><p>保存并运行：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_1" value="wg-quick up <文件名（不需要 .conf 后缀）>"><button class="copy-btn" onclick="util.copy(&quot;copy_1&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>通过 <code>wg show &lt;文件名（不需要 .conf 后缀）&gt;</code> 即可查看隧道连接状况：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">root@hkg ~ <span class="comment"># wg show dn42-4242422547</span></span><br><span class="line">interface: dn42-4242422547</span><br><span class="line">  public key: AHEJ0dXDDxJF0EapR7Ssx2eQV9ReB/OvkWPu7ypWbkA=</span><br><span class="line">  private key: (hidden)</span><br><span class="line">  listening port: 22547</span><br><span class="line"></span><br><span class="line">peer: xelzwt1j0aoKjsQnnq8jMjZNLbLucBPwPTvHgFH/czs=</span><br><span class="line">  endpoint: 5.102.125.26:23322</span><br><span class="line">  allowed ips: 172.20.0.0/14, 10.0.0.0/8, 172.31.0.0/16, fd00::/8, fe80::/64</span><br><span class="line">  latest handshake: 25 seconds ago</span><br><span class="line">  transfer: 96.59 MiB received, 532.45 MiB sent</span><br></pre></td></tr></table></figure><p>开机自启动：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_2" value="systemctl enable wg-quick@<文件名（不需要 .conf 后缀）>"><button class="copy-btn" onclick="util.copy(&quot;copy_2&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><h4 id="配置-eBGP"><a href="#配置-eBGP" class="headerlink" title="配置 eBGP"></a>配置 eBGP</h4><p>在 <code>/etc/bird/dn42_peers</code> 下新建 <code>&lt;ASN&gt;.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> &lt;<span class="type">BGP</span> 会话名&gt; <span class="keyword">from</span> dn42_peers &#123;</span><br><span class="line">    <span class="keyword">neighbor</span> &lt;对方的 LLA 地址&gt; % <span class="string">&#x27;&lt;WireGuard 隧道名&gt;&#x27;</span> external;</span><br><span class="line">    description <span class="string">&quot;&lt;对方联系信息 非必需&gt;&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>需要注意的是：之前的 eBGP 模板内已经默认启用了 Extended next hop（因为绝大部分 Peer 都是默认启用的），不再需要如下配置：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> &lt;<span class="type">BGP</span> 会话名&gt; <span class="keyword">from</span> dn42_peers &#123;</span><br><span class="line">    <span class="keyword">neighbor</span> &lt;对方的 LLA 地址&gt; % <span class="string">&#x27;&lt;WireGuard 隧道名&gt;&#x27;</span> external;</span><br><span class="line">    description <span class="string">&quot;&lt;对方联系信息 非必需&gt;&quot;</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="type">ipv4</span>&#123;</span><br><span class="line">        <span class="built_in">extended</span> <span class="built_in">next</span> <span class="built_in">hop</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><details class="tag-plugin colorful folding" ><summary><p>完整示例</p></summary><div class="body"><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> DN42_4242422547_v6 <span class="keyword">from</span> dn42_peers &#123;</span><br><span class="line">    <span class="keyword">neighbor</span> <span class="number">fe80::2547</span> % <span class="string">&#x27;dn42-4242422547&#x27;</span> external;</span><br><span class="line">    description <span class="string">&quot;@lantian1998&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure> </div></details><p>测试 LLA 是否可连通，可使用：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_3" value="ping6 <对方 LLA 地址>%<WireGuard 隧道名>"><button class="copy-btn" onclick="util.copy(&quot;copy_3&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>如：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">root@hkg ~# ping6 fe80::2547%dn42-4242422547</span><br><span class="line">PING fe80::2547%dn42-4242422547 (fe80::2547%dn42-4242422547) 56 data bytes</span><br><span class="line">64 bytes from fe80::2547%dn42-4242422547: icmp_seq=1 ttl=64 time=1.80 ms</span><br><span class="line">64 bytes from fe80::2547%dn42-4242422547: icmp_seq=2 ttl=64 time=1.70 ms</span><br><span class="line">64 bytes from fe80::2547%dn42-4242422547: icmp_seq=3 ttl=64 time=1.79 ms</span><br><span class="line">64 bytes from fe80::2547%dn42-4242422547: icmp_seq=4 ttl=64 time=1.81 ms</span><br><span class="line">^C</span><br><span class="line">--- fe80::2547%dn42-4242422547 ping statistics ---</span><br><span class="line">4 packets transmitted, 4 received, 0% packet loss, time 3005ms</span><br><span class="line">rtt min/avg/max/mdev = 1.701/1.775/1.806/0.043 ms</span><br></pre></td></tr></table></figure><p>当一切处理妥当后运行 <code>birdc c</code> 重载配置，使用 <code>birdc s p</code> 查看当前 BGP 会话：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">root@hkg ~# birdc s p</span><br><span class="line">BIRD 3.2.0 ready.</span><br><span class="line">Name       Proto      Table      State  Since         Info</span><br><span class="line">DN42_4242422547_v6 BGP        ---        up     2026-03-03    Established   </span><br><span class="line">dn42_rpki  RPKI       ---        up     2026-03-03    Established</span><br><span class="line">device1    Device     ---        up     2026-03-03    </span><br><span class="line">kernel1    Kernel     master6    up     2026-03-03    </span><br><span class="line">kernel2    Kernel     master4    up     2026-03-03    </span><br><span class="line">static1    Static     master4    up     2026-03-03    </span><br><span class="line">static2    Static     master6    up     2026-03-03   </span><br><span class="line">...</span><br></pre></td></tr></table></figure><h5 id="不使用-MP-BGP"><a href="#不使用-MP-BGP" class="headerlink" title="不使用 MP-BGP"></a>不使用 MP-BGP</h5><p>如果只想交互其中一种路由，则不需要对方的 LLA，而是需要对方的 IPv4 或 IPv6（取决于你要传播哪种路由）</p><p>并使用如下 eBGP 配置：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> &lt;<span class="type">BGP</span> 会话名&gt; <span class="keyword">from</span> dn42_peers &#123;</span><br><span class="line">    <span class="keyword">neighbor</span> &lt;对方的 <span class="type">IPv4</span>/v6 地址&gt; <span class="keyword">as</span> &lt;对方ASN&gt;;</span><br><span class="line">    description <span class="string">&quot;&lt;对方联系信息 非必需&gt;&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>至此，已完成一台节点的互 Peer。</p><h2 id="内网互联"><a href="#内网互联" class="headerlink" title="内网互联"></a>内网互联</h2><p>目前，还只是单个节点和他人 Peer，而当我们有多个节点之后，就需要让节点内部相互联通，我目前的网络架构如下：</p><pre class="mermaid">graph TDsubgraph zt[ZeroTier Underlay]us[LAX, US]hk[HKG, CN]de[DEU, DE]cn1[CNVO, CN]cn2[Homelab, CN]us <--> hkus <--> deus <--> cn1us <--> cn2hk <--> dehk <--> cn1hk <--> cn2de <--> cn1de <--> cn2cn1 <--> cn2end</pre><p>我将 ZeroTier 作为 L2 使用并组成 Fullmesh <psw>单纯是我懒得维护 n(n-1)/2 条 wg 隧道</psw></p><p>内网 BGP 的办法有两种：OSPF 和 Babel <psw>但我在 ZeroTier 下使用 Babel 发生了一些问题，遂用回了 OSPF</psw></p><p>基于上面的信息，我决定暂时使用 OSPF Broadcast 的配置。</p><h3 id="IGP"><a href="#IGP" class="headerlink" title="IGP"></a>IGP</h3><div class="tag-plugin colorful note" color="cyan"><div class="title">什么是&nbsp;IGP</div><div class="body"><p>内部网关协议（英语：Interior Gateway Protocol，缩写为 IGP）是指在一个自治系统（AS）内部所使用的一种路由协议。<br/>与此相对，外部网关协议用来在自治系统之间确定网络可达性、并通过内部网关协议来解析某个自治系统内部的路由。</p></div></div><h4 id="ospf-conf"><a href="#ospf-conf" class="headerlink" title="ospf.conf"></a>ospf.conf</h4><p>修改 <code>/etc/bird/ospf.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">ospf</span> v3 dn42_vcnet_ospf &#123;</span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="keyword">where</span> <span class="title function_">is_self_net</span>() &amp;&amp; <span class="built_in">source</span> != <span class="literal">RTS_BGP</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">where</span> <span class="title function_">is_self_net</span>() &amp;&amp; <span class="built_in">source</span> != <span class="literal">RTS_BGP</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">include</span> <span class="string">&quot;ospf-area.conf&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">ospf</span> v3 dn42_vcnet_ospf6 &#123;</span><br><span class="line">  <span class="type">ipv6</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="keyword">where</span> <span class="title function_">is_self_net_v6</span>() &amp;&amp; <span class="built_in">source</span> != <span class="literal">RTS_BGP</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="keyword">where</span> <span class="title function_">is_self_net_v6</span>() &amp;&amp; <span class="built_in">source</span> != <span class="literal">RTS_BGP</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">  <span class="keyword">include</span> <span class="string">&quot;ospf-area.conf&quot;</span>;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h4 id="ospf-area-conf"><a href="#ospf-area-conf" class="headerlink" title="ospf-area.conf"></a>ospf-area.conf</h4><p>修改 <code>/etc/bird/ospf-area.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">area <span class="number">0.0.0.0</span> &#123;</span><br><span class="line">  <span class="comment"># Dummy 网卡名称</span></span><br><span class="line">  <span class="keyword">interface</span> <span class="string">&quot;dn42&quot;</span> &#123; stub; &#125;;</span><br><span class="line">  <span class="comment"># ZeroTier 网卡名称</span></span><br><span class="line">  <span class="keyword">interface</span> <span class="string">&quot;ztugawjlkq&quot;</span> &#123;</span><br><span class="line">    cost <span class="number">160</span>;</span><br><span class="line">    type broadcast;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>由于 ZeroTier 同一个网络的网卡名是不变的，这里 interface 的类型只能是  <code>broadcast</code>.</p><p>如果你使用 WireGuard 来组成 Fullmesh，应该使用 <code>ptp</code>，可以精细控制 cost.</p><p>使用 <code>birdc c</code> 重载配置后，可通过 <code>birdc show ospf neighbors</code> 查看 OSPF 邻居信息：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">root@hkg ~ # birdc show ospf neighbors</span><br><span class="line">BIRD 3.2.0 ready.</span><br><span class="line">dn42_vcnet_ospf:</span><br><span class="line">Router ID   Pri    State     DTimeInterface  Router IP</span><br><span class="line">172.23.100.165 1Full/Other35.257ztugawjlkq fe80::3c49:e1ff:fe5a:792d</span><br><span class="line">172.23.100.170 1Full/BDR  38.259ztugawjlkq fe80::3c29:c0ff:fefc:66f7</span><br><span class="line">172.23.100.167 1Full/Other31.441ztugawjlkq fe80::3ce2:48ff:febb:b986</span><br><span class="line">172.23.100.166 1Full/Other24.565ztugawjlkq fe80::3cf1:97ff:fee8:b68f</span><br><span class="line"></span><br><span class="line">dn42_vcnet_ospf6:</span><br><span class="line">Router ID   Pri    State     DTimeInterface  Router IP</span><br><span class="line">172.23.100.165 1Full/Other35.257ztugawjlkq fe80::3c49:e1ff:fe5a:792d</span><br><span class="line">172.23.100.170 1Full/BDR  38.263ztugawjlkq fe80::3c29:c0ff:fefc:66f7</span><br><span class="line">172.23.100.167 1Full/Other31.441ztugawjlkq fe80::3ce2:48ff:febb:b986</span><br><span class="line">172.23.100.166 1Full/Other34.562ztugawjlkq fe80::3cf1:97ff:fee8:b68f</span><br></pre></td></tr></table></figure><h3 id="iBGP"><a href="#iBGP" class="headerlink" title="iBGP"></a>iBGP</h3><p>通常情况下，建立 iBGP 需要各个节点组成 Fullmesh，修改 <code>/etc/bird/ibgp.conf</code>：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span> <span class="type">bgp</span> ibgpeers &#123;</span><br><span class="line">  <span class="keyword">local</span> <span class="keyword">as</span> OWNAS;</span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="keyword">import</span> <span class="keyword">filter</span> &#123;</span><br><span class="line">      <span class="keyword">import</span> <span class="keyword">where</span> <span class="built_in">source</span> = <span class="literal">RTS_BGP</span> &amp;&amp; <span class="title function_">is_valid_network</span>() &amp;&amp; !<span class="title function_">is_self_net</span>();</span><br><span class="line">      <span class="keyword">export</span> <span class="keyword">where</span> <span class="built_in">source</span> = <span class="literal">RTS_BGP</span> &amp;&amp; <span class="title function_">is_valid_network</span>() &amp;&amp; !<span class="title function_">is_self_net</span>();</span><br><span class="line">      <span class="built_in">next</span> <span class="built_in">hop</span> self;</span><br><span class="line">      <span class="built_in">extended</span> <span class="built_in">next</span> <span class="built_in">hop</span>;</span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="type">ipv6</span> &#123;</span><br><span class="line">      <span class="keyword">import</span> <span class="keyword">where</span> <span class="built_in">source</span> = <span class="literal">RTS_BGP</span> &amp;&amp; <span class="title function_">is_valid_network_v6</span>() &amp;&amp; !<span class="title function_">is_self_net_v6</span>();</span><br><span class="line">      <span class="keyword">export</span> <span class="keyword">where</span> <span class="built_in">source</span> = <span class="literal">RTS_BGP</span> &amp;&amp; <span class="title function_">is_valid_network_v6</span>() &amp;&amp; !<span class="title function_">is_self_net_v6</span>();</span><br><span class="line">      <span class="built_in">next</span> <span class="built_in">hop</span> self;</span><br><span class="line">    &#125;;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">include</span> <span class="string">&quot;ibgp/*&quot;</span>;</span><br></pre></td></tr></table></figure><p>详细解释来自 iYoRoy：</p><blockquote><p>导入和导出规则确保iBGP仅处理BGP协议学到的路由，并且过滤掉IGP的路由防止环回</p><p><code>next hop self</code><strong>是必须的</strong>，指示 BIRD 在向 iBGP  邻居导出路由时，将下一跳重写为边界路由器自身的IP地址（而非原始的外部下一跳）。因为内部路由器无法直接访问外部邻居地址，若不重写则会被认定为地址不可达。重写后，内部路由器只需通过 IGP 路由将流量送至边界路由器，由边界路由器完成最终的外部转发。</p><p>因为我希望使用IPv6地址建立MP-BGP，通过IPv6路由IPv4，因此在IPv4中启用了<code>extended next hop</code></p></blockquote><p>接下来，需要给每台节点设置一个 iBGP Peer 配置，在 <code>/etc/bird/ibgp/</code> 下创建文件：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> <span class="string">&#x27;&lt;BGP 会话名&gt;&#x27;</span> <span class="keyword">from</span> ibgpeers &#123;</span><br><span class="line">  <span class="keyword">neighbor</span> &lt;其他节点的 <span class="type">IPv6</span> ULA 地址&gt; <span class="keyword">as</span> OWNAS;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><details class="tag-plugin colorful folding" ><summary><p>完整示例</p></summary><div class="body"><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> <span class="string">&#x27;dn42_ibgp_us&#x27;</span> <span class="keyword">from</span> ibgpeers&#123;</span><br><span class="line">    <span class="keyword">neighbor</span> <span class="number">fd48:8669:9f9f::5</span> <span class="keyword">as</span> OWNAS;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure> </div></details><p>运行 <code>birdc c</code> 重载配置即可。</p><h2 id="优化路由"><a href="#优化路由" class="headerlink" title="优化路由"></a>优化路由</h2><p>在完成上面的基础配置后，我们已经可以连上 DN42 的网络了，但此时的选路并非最优，尤其是当你的节点和非本地节点互 Peer 的时候。</p><h3 id="BGP-Community"><a href="#BGP-Community" class="headerlink" title="BGP Community"></a>BGP Community</h3><div class="tag-plugin colorful note" color="cyan"><div class="title">Community属性介绍</div><div class="body"><p>团体属性是一组有相同特征的目的地址的集合。团体属性用来简化路由策略的应用和降低维护管理的难度，利用团体可以使多个AS中的一组BGP设备共享相同的策略。团体是一个路由属性，在BGP对等体之间传播，且不受AS的限制。BGP设备在将带有团体属性的路由发布给其它对等体之前，可以先改变此路由原有的团体属性。</p></div></div><p>简单来说，BGP Community 就是给路由打标签，不同的标签有助于我们对路由进行区分和管理。</p><p>来自 iYoRoy 的介绍：</p><blockquote><p>…（本文）仅针对地理位置信息添加BGP Communities并进行优选。一般来说这样就足够了。<del>（还有个原因是其他的我还没太搞明白）</del><br>注意: 我们应该<strong>只对自己的AS添加地理位置信息相关的BGP Communities</strong>，不应当对邻居传递来的路由添加相关条目。若对邻居的路由加上自己的地区Communities则会造成<strong>伪造路由起源</strong>，引发<strong>路由劫持</strong>。下游可能会误判流量路径，将本应直连的流量绕道至你的网络，增加延迟的同时大量消耗你的网络的流量。（Large Communities除外，Large Community有一套验证机制可以防止此类事情发生，但是不在本文讨论范围内）</p></blockquote><p>我们需要首先找到自己节点所在的国家、地区，按照 <a href="https://dn42.dev/howto/BGP-communities">BGP-communities #Route Origin 小节</a>所列出的代码，在 <code>/etc/bird/bird.conf</code> 里面添加下面两行：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">define</span> DN42_REGION = <span class="number">52</span>;   <span class="comment"># 52代表亚洲东部地区</span></span><br><span class="line"><span class="keyword">define</span> DN42_COUNTRY= <span class="number">1344</span>; <span class="comment"># 1344代表香港</span></span><br></pre></td></tr></table></figure><p>之后，修改 <code>/etc/bird/ebgp.conf</code> 的 <code>dn42_peer</code> 模板：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">         export filter &#123;</span><br><span class="line"><span class="deletion">-            if is_valid_network() &amp;&amp; source ~ [RTS_STATIC, RTS_BGP] then accept;</span></span><br><span class="line"><span class="addition">+            if is_valid_network() &amp;&amp; source ~ [RTS_STATIC, RTS_BGP] then&#123;</span></span><br><span class="line"><span class="addition">+                if (is_self_net()) then &#123;      # 检查是否是自己的路由</span></span><br><span class="line"><span class="addition">+                    bgp_community.add((64511, DN42_REGION));  # 打上大洲级别的区域信息</span></span><br><span class="line"><span class="addition">+                    bgp_community.add((64511, DN42_COUNTRY)); # 打上国家/地区信息</span></span><br><span class="line"><span class="addition">+                &#125;</span></span><br><span class="line"><span class="addition">+                accept;</span></span><br><span class="line"><span class="addition">+            &#125;</span></span><br><span class="line">             reject;</span><br><span class="line">         &#125;;</span><br></pre></td></tr></table></figure><p>上面是 IPv4 块里面的，修改 IPv6 块的 export filter 时，记得将 <code>is_valid_network()</code> 和 <code>is_self_net()</code> 修改为 <code>is_valid_network_v6()</code> 和 <code>is_self_net_v6()</code>.</p><p>至此，我们成功给自己的路由打上了标签。</p><h3 id="local-pref"><a href="#local-pref" class="headerlink" title="local_pref"></a>local_pref</h3><div class="tag-plugin colorful note" color="cyan"><div class="title">local_pref</div><div class="body"><p>当一条BGP路由器中存在多条去往同一目标网络的 BGP 路由时，BGP 协议会对这些 BGP 路由属性进行比较，从而筛选出最佳到达目标网络的通达路径；本地优先属性，只在IBGP对等体之间进行交换，即：同一AS内进行，不会通告给AS 域外；用于判断流量离开AS时选择的最佳路由；</p></div></div><p>现在，我们要利用他人的 Communities 标签进行路由优选。</p><p>下面是我暂时使用的规则：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">ebgp_calculate_pref</span>() &#123;</span><br><span class="line">    <span class="comment"># 基础优先级</span></span><br><span class="line">    <span class="type">int</span> pref = <span class="number">1000</span>; </span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 同区域 +100</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">bgp_community</span> ~ [(<span class="number">64511</span>, DN42_REGION)] <span class="keyword">then</span> </span><br><span class="line">        pref = pref + <span class="number">100</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 同国家 +50</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">bgp_community</span> ~ [(<span class="number">64511</span>, DN42_COUNTRY)] <span class="keyword">then</span> </span><br><span class="line">        pref = pref + <span class="number">50</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># eBGP邻居 +200</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">bgp_path</span>.len = <span class="number">1</span> <span class="keyword">then</span> </span><br><span class="line">        pref = pref + <span class="number">200</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> pref;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可保存在 <code>/etc/bird/ebgp.conf</code> 的开头，同时修改 eBGP 的 Peer 模板：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">ipv4 &#123;</span><br><span class="line">  extended next hop;</span><br><span class="line">  import keep filtered;</span><br><span class="line">  import filter &#123;</span><br><span class="line">    if is_valid_network() &amp;&amp; !is_self_net() then &#123;</span><br><span class="line">      if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then &#123;</span><br><span class="line">        print &quot;[dn42] ROA check failed for &quot;, net, &quot; ASN &quot;, bgp_path.last;</span><br><span class="line">        reject;</span><br><span class="line">      &#125;</span><br><span class="line"><span class="addition">+  bgp_local_pref = ebgp_calculate_pref();</span></span><br><span class="line">      accept;</span><br><span class="line">    &#125;</span><br><span class="line">    reject;</span><br><span class="line">  &#125;;</span><br></pre></td></tr></table></figure><p>IPv6 同样，只需要在相同位置添加即可。</p><h3 id="iBGP-的-local-pref"><a href="#iBGP-的-local-pref" class="headerlink" title="iBGP 的 local_pref"></a>iBGP 的 local_pref</h3><p>这部分是我在配置好 IGP 与 iBGP 后出现的一个问题：内部的某个节点（Node 1）有一条最优路由，而其他节点（Node 2,3）会绕道前面的节点（Node 1），即使其他节点有更合适的路由可选。</p><p>下面的配置有待观察。</p><p>修改 <code>/etc/bird/ibgp.conf</code>：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">template bgp ibgpeers &#123;</span><br><span class="line">  local as OWNAS;</span><br><span class="line">  ipv4 &#123;</span><br><span class="line"><span class="deletion">-import where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();</span></span><br><span class="line"><span class="addition">+   import filter &#123;</span></span><br><span class="line"><span class="addition">+     if source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net() then &#123;</span></span><br><span class="line"><span class="addition">+       bgp_local_pref = 200;</span></span><br><span class="line"><span class="addition">+       accept;</span></span><br><span class="line"><span class="addition">+     &#125;</span></span><br><span class="line"><span class="addition">+   &#125;;</span></span><br><span class="line">    export where source = RTS_BGP &amp;&amp; is_valid_network() &amp;&amp; !is_self_net();</span><br><span class="line">    next hop self;</span><br><span class="line">    extended next hop;</span><br><span class="line">  &#125;;</span><br><span class="line">  ipv6 &#123;</span><br><span class="line"><span class="deletion">-import where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();</span></span><br><span class="line"><span class="addition">+   import filter &#123;</span></span><br><span class="line"><span class="addition">+     if source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6() then &#123;</span></span><br><span class="line"><span class="addition">+       bgp_local_pref = 200;</span></span><br><span class="line"><span class="addition">+       accept;</span></span><br><span class="line"><span class="addition">+     &#125;</span></span><br><span class="line"><span class="addition">+   &#125;;</span></span><br><span class="line">    export where source = RTS_BGP &amp;&amp; is_valid_network_v6() &amp;&amp; !is_self_net_v6();</span><br><span class="line">    next hop self;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>上面的配置是将来自 iBGP 的外部路由降低优先级，让本地节点优先使用 eBGP 的路由。</p><h2 id="BGP-Dampening"><a href="#BGP-Dampening" class="headerlink" title="BGP Dampening"></a>BGP Dampening</h2><div class="tag-plugin colorful note" color="cyan"><div class="title">什么是&nbsp;BGP&nbsp;Flapping</div><div class="body"><p>BGP Flapping 指的是同一条路由的路径在短时间内发生大量变化，一般源于一个网络反复广播、撤销广播这一条路由。每次广播或撤销路由时，这个网络会把这条路由传递给所有与它相连的 Peer，这些 Peer 会根据这条路由计算出新的最佳路径，然后把新路径传递给它们的 Peer，与此类推。</p></div></div><p>你能想象吗：</p><table><thead><tr><th align="center">Prefix</th><th align="center">Duration</th><th align="center">Changes</th><th align="center">Rate</th></tr></thead><tbody><tr><td align="center">fd75:7775::&#x2F;48</td><td align="center">7d 20:13:20</td><td align="center">18.314 million</td><td align="center">52&#x2F;s</td></tr></tbody></table><p>最近这个由网段引发的路由更改竟然高达 1800 万！</p><p>为了抑制这种现象，我们会用上 Kioubit 开发的 <a href="https://github.com/Kioubit/FlapAlerted">FlapAlerted</a>.</p><h3 id="docker-compose-yml"><a href="#docker-compose-yml" class="headerlink" title="docker-compose.yml"></a>docker-compose.yml</h3><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">flapalerted:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ghcr.io/kioubit/flapalerted</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">host</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--asn&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;4242422547&quot;</span>  <span class="comment"># 修改成你自己的 ASN</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--bgpListenAddress&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;127.0.0.1:1790&quot;</span> <span class="comment"># BGP 会话监听端口，稍后你的 BGP 软件需要连接到这个端口</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--httpAPIListenAddress&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;127.0.0.1:8080&quot;</span>  <span class="comment"># HTTP API 监听端口，稍后 StayRTR 需要连接到这个端口</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;-routeChangeCounter&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;120&quot;</span>  <span class="comment"># 路由路径在一分钟内需要变更的次数才会被列入前缀列表。默认值 600</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;-overThresholdTarget&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;5&quot;</span>  <span class="comment"># 连续多少分钟速率达到或超过 routeChangeCounter 才会触发事件。默认 10</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;-underThresholdTarget&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;30&quot;</span>  <span class="comment"># 连续多少分钟速率低于 routeChangeCounter 才会移除事件。默认 15</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line"></span><br><span class="line">  <span class="attr">stayrtr:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">rpki/stayrtr</span></span><br><span class="line">    <span class="attr">network_mode:</span> <span class="string">host</span></span><br><span class="line">    <span class="attr">command:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--bind&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;127.0.0.1:8083&quot;</span>  <span class="comment"># RPKI-to-Router 协议的监听地址</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--metrics.addr&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;127.0.0.1:8084&quot;</span>  <span class="comment"># Prometheus 格式统计信息 API 的监听地址</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--cache&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;http://127.0.0.1:8080/flaps/active/roa&quot;</span>  <span class="comment"># 修改成你的 FlapAlerted 服务器地址</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--rtr.expire&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;3600&quot;</span>  <span class="comment"># 如果 FlapAlerted 服务器离线，保留现有的信息多长时间</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--rtr.refresh&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;300&quot;</span>  <span class="comment"># 多长时间从 FlapAlerted 服务器刷新一次信息</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;--rtr.retry&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;300&quot;</span>  <span class="comment"># 如果 FlapAlerted 服务器离线，多长时间后重试</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">flapalerted</span></span><br></pre></td></tr></table></figure><p>启动 FlapAlerted 和 StayRTR 后，新建 <code>/etc/bird/flap.conf</code> 将路由信息传给 FlapAlerted：</p><figure class="highlight bird"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">protocol</span> <span class="type">bgp</span> dn42_flapalerted &#123;</span><br><span class="line">  <span class="keyword">local</span> <span class="keyword">as</span> OWNAS; </span><br><span class="line"></span><br><span class="line">  <span class="comment"># 修改成 FlapAlerted 设置的 ASN 和 BGP IP/端口。</span></span><br><span class="line">  <span class="comment"># 这里我们使用和自己网络相同的 ASN，是为了利用 BGP 协议不会把来自 iBGP 的路由（即自己其它节点的路由）转发给 iBGP Peer 的特点。</span></span><br><span class="line">  <span class="comment"># 除非你开启了 add paths 选项，否则来自自己其它节点的路由只会包含最优的路由，如果 Flapping 发生在次优路由就会被隐藏。</span></span><br><span class="line">  <span class="comment"># 因此建议有多个节点的用户在每个节点上都单独和 FlapAlerted 建立连接。</span></span><br><span class="line">  </span><br><span class="line">  <span class="keyword">neighbor</span> &lt;FlapAlerted 的地址&gt; <span class="keyword">as</span> OWNAS port <span class="number">1790</span>;</span><br><span class="line"></span><br><span class="line">  <span class="type">ipv4</span> &#123;</span><br><span class="line">    <span class="comment"># 开启 add paths 选项，把非最优路由也发给 FlapAlerted，让次优路由 Flapping 也可见。</span></span><br><span class="line">    add paths <span class="literal">on</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="literal">all</span>;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">none</span>; <span class="comment"># 不需要从 FlapAlerted 接收任何路由</span></span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="type">ipv6</span> &#123;</span><br><span class="line">    add paths <span class="literal">on</span>;</span><br><span class="line">    <span class="keyword">export</span> <span class="literal">all</span>;</span><br><span class="line">    <span class="keyword">import</span> <span class="literal">none</span>;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 新建专用于 FlapAlerted 的 ROA 表</span></span><br><span class="line"><span class="type">roa4</span> <span class="keyword">table</span> roa_flap_v4;</span><br><span class="line"><span class="type">roa6</span> <span class="keyword">table</span> roa_flap_v6;</span><br><span class="line"></span><br><span class="line"><span class="keyword">protocol</span> <span class="type">rpki</span> dn42_rpki_flapalerted &#123;</span><br><span class="line">  <span class="type">roa4</span> &#123; <span class="keyword">table</span> roa_flap_v4; &#125;;</span><br><span class="line">  <span class="type">roa6</span> &#123; <span class="keyword">table</span> roa_flap_v6; &#125;;</span><br><span class="line">  remote <span class="number">10.22.44.5</span> port <span class="number">8083</span>; <span class="comment"># 修改成 StayRTR 监听的端口</span></span><br><span class="line">  max version <span class="number">1</span>;</span><br><span class="line">  retry <span class="built_in">keep</span> <span class="number">15</span>; <span class="comment"># 如果连接中断，每 10 秒重连一次</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>在前文，我们已经配置了 ROA 过滤，因此需要新建一个新 ROA 表，记得在 <code>/etc/bird/bird.conf</code> 里引入此配置文件。</p><p>现在，我们需要修改 eBGP 中模板的导入过滤规则：</p><figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">  ipv4 &#123;</span><br><span class="line">    extended next hop;</span><br><span class="line">    import keep filtered;</span><br><span class="line">    import filter &#123;</span><br><span class="line">      if is_valid_network() &amp;&amp; !is_self_net() then &#123;</span><br><span class="line">        if (roa_check(dn42_roa, net, bgp_path.last) != ROA_VALID) then &#123;</span><br><span class="line">          print &quot;[dn42] ROA check failed for &quot;, net, &quot; ASN &quot;, bgp_path.last;</span><br><span class="line">          reject;</span><br><span class="line">        &#125;</span><br><span class="line"><span class="addition">+       if (roa_check(roa_flap_v4, net, bgp_path.last) = ROA_INVALID) then &#123;</span></span><br><span class="line"><span class="addition">+         # 路由频繁变更，被 FlapAlerted 劫持去了 AS0，Bird 认为路由来自错误的 ASN</span></span><br><span class="line"><span class="addition">+         reject;</span></span><br><span class="line"><span class="addition">+       &#125;</span></span><br><span class="line">        bgp_local_pref = ebgp_calculate_pref();</span><br><span class="line">        accept;</span><br><span class="line">      &#125;</span><br><span class="line">      reject;</span><br><span class="line">    &#125;;</span><br></pre></td></tr></table></figure><p>IPv6 类似，只需要将 <code>roa_flap_v4</code> 修改为 <code>roa_flap_v6</code> 即可。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>最后，加入 DN42 的过程还是挺有乐趣的.</p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><h3 id="Thanks"><a href="#Thanks" class="headerlink" title="Thanks:"></a>Thanks:</h3><p>感谢 <a href="https://aluy.net/">Aluy</a> 的提供的 AMS, NL 节点。<br>感谢 DN42 群友的帮助和指导。</p><h3 id="推荐："><a href="#推荐：" class="headerlink" title="推荐："></a>推荐：</h3><p>在这里介绍一下 Bird 中文社区的作品（转发自 Telegram）：</p><blockquote><p>BIRD-LSP 是一个专为 BIRD2 配置文件打造的现代化工具链项目，提供 Language Server Protocol (LSP) 支持、代码格式化 (Formatter &amp; Parser) 与静态分析 (Linter) 能力。</p><p><a href="https://marketplace.visualstudio.com/items?itemName=birdcc.bird2-lsp">VSCode 安装</a> | <a href="https://open-vsx.org/extension/birdcc/bird2-lsp">OpenVSX 安装</a></p><p>目前支持的特性 (v0.3.0):</p><ul><li><p>🎨 语法高亮 | 基于 Tree-sitter 的高精度语法解析</p></li><li><p>🔍 实时诊断 | 内置 32+ 条 Lint 规则 + 跨文件分析</p></li><li><p>📝 代码格式化 | 基于 🦀 Rust + dprint 插件实现的高性能格式化库</p></li><li><p>🔎 悬停提示 | 对 conf 关键词提供 用法示例&#x2F;类型提示&#x2F;文档说明</p></li><li><p>🏗 符号导航 | 跳转到定义、查找引用（支持跨文件）</p></li></ul><p>*目前 BIRD LSP 还处于 Beta 阶段，部署在生产环节之前请谨慎评估</p><p>👩‍💻 GitHub 开源地址, 欢迎 Star: <a href="https://github.com/bird-chinese-community/BIRD-LSP">https://github.com/bird-chinese-community/BIRD-LSP</a></p></blockquote>]]>
    </content>
    <id>https://blog.vconet.top/archives/dn42-intro/</id>
    <link href="https://blog.vconet.top/archives/dn42-intro/"/>
    <published>2026-03-06T04:04:21.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文用以记录自己加入 DN42 网络的历程，本人是初入 BGP 的小白，对于文章中出现的各种不严谨内容和各种低级错误，请大佬们手下留情，可在评论区指出。</p>
<p>欢迎和我 Peer：<a href="https://blog.vconet.top/dn42/">VCNET DN42</a></p>]]>
    </summary>
    <title>DN42 之旅：搭建多节点 BGP 网络</title>
    <updated>2026-03-06T04:04:21.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="Genshin" scheme="https://blog.vconet.top/tags/Genshin/"/>
    <content>
      <![CDATA[<blockquote><p>此文会持续更新，旧内容仅供参考，请以最新内容为准。</p></blockquote><h2 id="版本"><a href="#版本" class="headerlink" title="版本"></a>版本</h2><h3 id="6-4"><a href="#6-4" class="headerlink" title="6.4"></a>6.4</h3><blockquote><p>26.03.14 更新</p></blockquote><p>目前，绝大部分版本的 wine 都可以某种方式启动游戏，但大都会出现 <code>MHYBase.dll</code> 引起的崩溃。</p><p>请使用 AAGL 和 <code>spritz-wine-tkg-staging-wow64-10.15-7</code> 的方案，高于此版本的 wine 脚本无效。</p><p>通过下面的脚本启动 AAGL 并启动游戏：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># AAGL Race Condition Workaround Script</span></span><br><span class="line"><span class="comment"># Description: A robust workaround for game crashes caused by a race condition during initialization.</span></span><br><span class="line"><span class="comment"># Usage: ./aagl-fix.sh</span></span><br><span class="line"><span class="comment"># Author: Harmiel715</span></span><br><span class="line"><span class="comment"># Version: 1.1</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- Configuration ---</span></span><br><span class="line">STRACE_CMD=<span class="string">&quot;strace -f -e trace=process -o /dev/null an-anime-game-launcher&quot;</span></span><br><span class="line">ESCORT_DURATION=60</span><br><span class="line">GAME_PROCESS_NAME=<span class="string">&quot;YuanShen.exe&quot;</span></span><br><span class="line">LAUNCHER_PROCESS_NAME=<span class="string">&quot;an-anime-game-launcher&quot;</span></span><br><span class="line">POLLING_INTERVAL=5 <span class="comment"># Polling interval in seconds</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- Variables ---</span></span><br><span class="line">STRACE_PID=<span class="string">&quot;&quot;</span></span><br><span class="line">KILLER_PID=<span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># --- Cleanup Function ---</span></span><br><span class="line"><span class="function"><span class="title">cleanup</span></span>() &#123;</span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Exit signal received, cleaning up...&quot;</span></span><br><span class="line">  <span class="keyword">if</span> [ ! -z <span class="string">&quot;<span class="variable">$KILLER_PID</span>&quot;</span> ] &amp;&amp; ps -p <span class="variable">$KILLER_PID</span> &gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">kill</span> -9 <span class="variable">$KILLER_PID</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line">  <span class="keyword">if</span> [ ! -z <span class="string">&quot;<span class="variable">$STRACE_PID</span>&quot;</span> ] &amp;&amp; ps -p <span class="variable">$STRACE_PID</span> &gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">    <span class="built_in">kill</span> -9 <span class="variable">$STRACE_PID</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line">  pkill -9 -f <span class="string">&quot;<span class="variable">$LAUNCHER_PROCESS_NAME</span>&quot;</span></span><br><span class="line">  <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Cleanup complete.&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">trap</span> cleanup EXIT SIGINT SIGTERM</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1. Start the escort and the launcher</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Escort enabled...&quot;</span></span><br><span class="line"><span class="variable">$STRACE_CMD</span> &amp;</span><br><span class="line">STRACE_PID=$!</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Escort process PID: <span class="variable">$STRACE_PID</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. Main monitoring loop</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Waiting for you to start the game from the launcher...&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> ps -p <span class="variable">$STRACE_PID</span> &gt;/dev/null; <span class="keyword">do</span></span><br><span class="line">  <span class="keyword">if</span> pgrep -f <span class="variable">$GAME_PROCESS_NAME</span> &gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">    <span class="comment"># State: In-Game</span></span><br><span class="line">    <span class="keyword">if</span> [ -z <span class="string">&quot;<span class="variable">$KILLER_PID</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Game process detected! Starting <span class="variable">$ESCORT_DURATION</span>-second separation countdown...&quot;</span></span><br><span class="line">      <span class="comment"># Start a &quot;timed killer&quot; in the background, its only job is to kill strace</span></span><br><span class="line">      (<span class="built_in">sleep</span> <span class="variable">$ESCORT_DURATION</span> &amp;&amp; <span class="built_in">kill</span> -9 <span class="variable">$STRACE_PID</span>) &amp;</span><br><span class="line">      KILLER_PID=$!</span><br><span class="line">      <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Detach program deployed, PID: <span class="variable">$KILLER_PID</span>&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">    <span class="comment"># State: In-Launcher (or game not started)</span></span><br><span class="line">    <span class="keyword">if</span> [ ! -z <span class="string">&quot;<span class="variable">$KILLER_PID</span>&quot;</span> ]; <span class="keyword">then</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Game has been exited. Revoking detach program...&quot;</span></span><br><span class="line">      <span class="keyword">if</span> ps -p <span class="variable">$KILLER_PID</span> &gt;/dev/null; <span class="keyword">then</span></span><br><span class="line">        <span class="built_in">kill</span> -9 <span class="variable">$KILLER_PID</span></span><br><span class="line">      <span class="keyword">fi</span></span><br><span class="line">      KILLER_PID=<span class="string">&quot;&quot;</span></span><br><span class="line">      <span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Reset. Ready to relaunch the game.&quot;</span></span><br><span class="line">    <span class="keyword">fi</span></span><br><span class="line">  <span class="keyword">fi</span></span><br><span class="line">  <span class="built_in">sleep</span> <span class="variable">$POLLING_INTERVAL</span></span><br><span class="line"><span class="keyword">done</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># When the strace process ends (either killed or the user closed the launcher), the script will arrive here.</span></span><br><span class="line"><span class="comment"># We perform a final, failsafe cleanup here.</span></span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;[Fix Script] Escort task finished. Performing final cleanup.&quot;</span></span><br><span class="line">pkill -9 -f <span class="string">&quot;<span class="variable">$LAUNCHER_PROCESS_NAME</span>&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></table></figure><p>相关 <a href="https://github.com/an-anime-team/an-anime-game-launcher/issues/572">issue</a></p><blockquote><p>26.02.19 更新</p></blockquote><p>AAGL 会一直触发异常，无法游玩</p><p><strong>当前版本不需要，也不应该使用 Hosts 屏蔽原神的域名</strong></p><p>使用 <code>Bottles</code> + <code>Proton GE</code> + <a href="https://github.com/Augmeneco/HoyoNetFix/releases">libhoyonetfix</a>：</p><div class="tag-plugin colorful note" color="red"><div class="body"><p>若使用&nbsp;yay&nbsp;或&nbsp;paru&nbsp;安装，请确保安装非&nbsp;brwap&nbsp;版本！</p></div></div><p>Bwrap 版本可能导致无法启动游戏</p><p>打开 <code>Bottles</code> $\rightarrow$ <code>┇</code> $\rightarrow$ <code>首选项</code> $\rightarrow$ <code>运行器</code> 选择最新的 Proton GE：</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1200/939;"><img class="lazy" src="https://static.vconet.top/2026/468be1a01dfd654916d73ced0ec812fd.png" data-src="https://static.vconet.top/2026/468be1a01dfd654916d73ced0ec812fd.png" alt="runners" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">runners</span></div></div><p>创建容器后，选择<code>添加快捷方式</code>，选择 <code>YuanShen.exe</code>，添加后 点击旁边的 <code>┇</code> $\rightarrow$ <code>更改启动选项</code></p><p>请修改成：<code>LD_PRELOAD=/PATH_TO/libhoyonetfix.so %command%</code>，请使用绝对路径，不要包含 <code>~</code></p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:819/1335;"><img class="lazy" src="https://static.vconet.top/2026/e8316f4df3243632f20c224da846e3f2.png" data-src="https://static.vconet.top/2026/e8316f4df3243632f20c224da846e3f2.png" alt="更改启动选项" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">更改启动选项</span></div></div><p>启动游戏后不久后会弹出 <code>数据异常，请重新登陆游戏 错误码：10010-4001</code>，点击确认，重新进门之后即可正常游玩</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2560/1599;"><img class="lazy" src="https://static.vconet.top/2026/dcd3ddcc4ff8b95da0659a4f8c1abdca.png" data-src="https://static.vconet.top/2026/dcd3ddcc4ff8b95da0659a4f8c1abdca.png" alt="10010-4001" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">10010-4001</span></div></div>]]>
    </content>
    <id>https://blog.vconet.top/archives/genshin-in-linux/</id>
    <link href="https://blog.vconet.top/archives/genshin-in-linux/"/>
    <published>2026-02-19T10:18:56.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>此文会持续更新，旧内容仅供参考，请以最新内容为准。</p>
</blockquote>
<h2 id="版本"><a href="#版本" class="headerlink" title="版本"></a>版本</h2><h3 id="6-4">]]>
    </summary>
    <title>如何在 Linux 下玩原神？</title>
    <updated>2026-02-19T10:18:56.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="iBasso" scheme="https://blog.vconet.top/tags/iBasso/"/>
    <category term="DC04U" scheme="https://blog.vconet.top/tags/DC04U/"/>
    <category term="HiFi" scheme="https://blog.vconet.top/tags/HiFi/"/>
    <category term="PipeWire" scheme="https://blog.vconet.top/tags/PipeWire/"/>
    <category term="ALSA" scheme="https://blog.vconet.top/tags/ALSA/"/>
    <category term="Music" scheme="https://blog.vconet.top/tags/Music/"/>
    <category term="Kernel" scheme="https://blog.vconet.top/tags/Kernel/"/>
    <content>
      <![CDATA[<blockquote><p>26.2.13 更新：更新信息与配置</p></blockquote><h2 id="起源"><a href="#起源" class="headerlink" title="起源"></a>起源</h2><p>今年年初我入手了飞傲 JT7 和 iBasso DC04U。在安卓下两者配合使用没有问题，但把 DC04U 接到 Linux 上时，却发现无法直出 DSD。</p><p>最后发现设备太新，没有收录到 Linux 内核中，但在 7.0 版本之后就不再需要下面的 patch 了，仅做记录</p><details class="tag-plugin colorful folding" ><summary><p>为设备添加&nbsp;patch</p></summary><div class="body"><p>我尝试过多款播放器：mpd、Strawberry、DeaDBeeF、HQPlayer，但都未能实现 DSD 直出。折腾下来，最高只能输出 PCM 768 kHz。</p> <div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2026/70fa1724ab7af6e9da7c5981d7f11741.jpg" data-src="https://static.vconet.top/2026/70fa1724ab7af6e9da7c5981d7f11741.jpg" alt="PCM768" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">PCM768</span></div></div>  <p>查看 ALSA 报告后发现：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br></pre></td><td class="code"><pre><span class="line">iBasso DC04U at usb-0000:00:14.0-2, high speed : USB Audio</span><br><span class="line"></span><br><span class="line">Playback:</span><br><span class="line">  Status: Stop</span><br><span class="line">  Interface 2</span><br><span class="line">    Altset 1</span><br><span class="line">    Format: S16_LE</span><br><span class="line">    Channels: 2</span><br><span class="line">    Endpoint: 0x07 (7 OUT) (ASYNC)</span><br><span class="line">    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000</span><br><span class="line">    Data packet interval: 125 us</span><br><span class="line">    Bits: 16</span><br><span class="line">    Channel map: FL FR</span><br><span class="line">    Sync Endpoint: 0x83 (3 IN)</span><br><span class="line">    Sync EP Interface: 2</span><br><span class="line">    Sync EP Altset: 1</span><br><span class="line">    Implicit Feedback Mode: No</span><br><span class="line">  Interface 2</span><br><span class="line">    Altset 2</span><br><span class="line">    Format: S24_3LE</span><br><span class="line">    Channels: 2</span><br><span class="line">    Endpoint: 0x07 (7 OUT) (ASYNC)</span><br><span class="line">    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000</span><br><span class="line">    Data packet interval: 125 us</span><br><span class="line">    Bits: 24</span><br><span class="line">    Channel map: FL FR</span><br><span class="line">    Sync Endpoint: 0x83 (3 IN)</span><br><span class="line">    Sync EP Interface: 2</span><br><span class="line">    Sync EP Altset: 2</span><br><span class="line">    Implicit Feedback Mode: No</span><br><span class="line">  Interface 2</span><br><span class="line">    Altset 3</span><br><span class="line">    Format: S32_LE</span><br><span class="line">    Channels: 2</span><br><span class="line">    Endpoint: 0x07 (7 OUT) (ASYNC)</span><br><span class="line">    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000</span><br><span class="line">    Data packet interval: 125 us</span><br><span class="line">    Bits: 32</span><br><span class="line">    Channel map: FL FR</span><br><span class="line">    Sync Endpoint: 0x83 (3 IN)</span><br><span class="line">    Sync EP Interface: 2</span><br><span class="line">    Sync EP Altset: 3</span><br><span class="line">    Implicit Feedback Mode: No</span><br><span class="line">  Interface 2</span><br><span class="line">    Altset 4</span><br><span class="line">    Format: SPECIAL</span><br><span class="line">    Channels: 2</span><br><span class="line">    Endpoint: 0x07 (7 OUT) (ASYNC)</span><br><span class="line">    Rates: 44100, 48000, 88200, 96000, 176400, 192000, 352800, 384000, 705600, 768000</span><br><span class="line">    Data packet interval: 125 us</span><br><span class="line">    Bits: 32</span><br><span class="line">    DSD raw: DOP=0, bitrev=0</span><br><span class="line">    Channel map: FL FR</span><br><span class="line">    Sync Endpoint: 0x83 (3 IN)</span><br><span class="line">    Sync EP Interface: 2</span><br><span class="line">    Sync EP Altset: 4</span><br><span class="line">    Implicit Feedback Mode: No</span><br></pre></td></tr></table></figure>  <p>直出 DSD 需要的 DSD_U32_BE（或 DSD_U32_LE），在 Linux 上 ALSA 并未显示该格式。用 aplay 排查，同样不支持：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">aplay -D hw:1,0 --dump-hw-params /dev/zero</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line">Available formats:</span><br><span class="line">- S16_LE</span><br><span class="line">- S32_LE</span><br><span class="line">- SPECIAL</span><br><span class="line">- S24_3LE</span><br></pre></td></tr></table></figure>  <p>照理说 iBasso 支持 UAC 2.0，应具备完整能力，但当前 ALSA 并未识别到 DSD_U32_BE。</p> <h2 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h2><p>幸运的是，我找到了仓库 <a href="https://github.com/lintweaker/xmos-native-dsd">xmos-native-dsd</a>。通过修改内核的 <code>sound/usb/quirks.c</code>，为该设备添加一个 quirk 即可识别 DSD_U32_BE。</p> <figure class="highlight diff"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c</span></span><br><span class="line"><span class="comment">index 2d9f28558..d550c84e7 100644</span></span><br><span class="line"><span class="comment">--- a/sound/usb/quirks.c</span></span><br><span class="line"><span class="comment">+++ b/sound/usb/quirks.c</span></span><br><span class="line"><span class="meta">@@ -2236,6 +2236,8 @@</span> static const struct usb_audio_quirk_flags_table quirk_flags_table[] = &#123;</span><br><span class="line"> DEVICE_FLG(0x0644, 0x806c, /* Esoteric XD */</span><br><span class="line">   QUIRK_FLAG_ITF_USB_DSD_DAC | QUIRK_FLAG_CTL_MSG_DELAY |</span><br><span class="line">   QUIRK_FLAG_IFACE_DELAY | QUIRK_FLAG_FORCE_IFACE_RESET),</span><br><span class="line"><span class="addition">+DEVICE_FLG(0x0661, 0x0883, /* iBasso DC04U */</span></span><br><span class="line"><span class="addition">+  QUIRK_FLAG_DSD_RAW),</span></span><br><span class="line"> DEVICE_FLG(0x06f8, 0xb000, /* Hercules DJ Console (Windows Edition) */</span><br><span class="line">   QUIRK_FLAG_IGNORE_CTL_ERROR),</span><br><span class="line"> DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */</span><br></pre></td></tr></table></figure>  <p>应用补丁并重编译内核后，再次运行 aplay 检查：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">Available formats:</span><br><span class="line">- S16_LE</span><br><span class="line">- S32_LE</span><br><span class="line">- SPECIAL</span><br><span class="line">- S24_3LE</span><br><span class="line">- DSD_U32_BE</span><br></pre></td></tr></table></figure>   <h3 id="For-Arch-User"><a href="#For-Arch-User" class="headerlink" title="For Arch User"></a>For Arch User</h3><p>我选择基于 <code>linux-cachyos</code> 的 PKGBUILD 修改来构建 ArchLinux 包。</p> <p>只需要下载 <code>linux-cachyos</code> 的<a href="https://aur.archlinux.org/cgit/aur.git/snapshot/linux-cachyos.tar.gz">快照</a></p> <p>编辑 <code>PKGBUILD</code>，在 <code>source</code> 段添加 patch 文件，同时修改 <code>pkgrel</code>：</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">pkgrel=3 # 请高于原本的值</span><br><span class="line">...</span><br><span class="line">source=(</span><br><span class="line">    &quot;https://cdn.kernel.org/pub/linux/kernel/v$&#123;pkgver%%.*&#125;.x/$&#123;_srcname&#125;.tar.xz&quot;</span><br><span class="line">    &quot;config&quot;</span><br><span class="line">    &quot;$&#123;_patchsource&#125;/all/0001-cachyos-base-all.patch&quot;</span><br><span class="line">    &quot;quirks.patch&quot; # patch 文件名</span><br><span class="line">    )</span><br><span class="line">...</span><br></pre></td></tr></table></figure>  <p>构建：</p> <div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_4" value="makepkg -s -f --skippgpcheck --skipchecksums"><button class="copy-btn" onclick="util.copy(&quot;copy_4&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div> </div></details><p>在此之前，请先确认您的 DAC 能在 Linux 下识别到 DSD 支持：</p><p>使用 <code>aplay -D hw:1,0 --dump-hw-params /dev/zero</code> 查看</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line">Available formats:</span><br><span class="line">- S16_LE</span><br><span class="line">- S32_LE</span><br><span class="line">- SPECIAL</span><br><span class="line">- S24_3LE</span><br><span class="line">- DSD_U32_BE</span><br></pre></td></tr></table></figure><p>如果没有 <code>DSD_xx</code> 可能是您的 DAC 没有被 Linux 收录，需要手动 Patch，参见上面折叠部分</p><p>因为我在使用 PipeWire，可通过 <code>pw-cat</code> 测试原生 DSD 输出：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pw-cat -p -d sample.dsf</span><br></pre></td></tr></table></figure><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2026/2f7a8a880e6ad70ad9c665340b454d46.jpg" data-src="https://static.vconet.top/2026/2f7a8a880e6ad70ad9c665340b454d46.jpg" alt="DSD512" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">DSD512</span></div></div><div class="tag-plugin colorful note" color="orange"><div class="body"><p>免费的DSD<em>64</em>测试音源：<a href="https://www.nativedsd.com/free-dsd-download/">FreeDSD&nbsp;Download&nbsp;NativeDSD&nbsp;Music</a></p></div></div><h2 id="音乐播放器"><a href="#音乐播放器" class="headerlink" title="音乐播放器"></a>音乐播放器</h2><p>能够输出 DSD 只是完成了第一步，选择一个合适的播放器同样重要。</p><h3 id="MPD"><a href="#MPD" class="headerlink" title="MPD"></a>MPD</h3><p>我曾尝试过 hqplayer-client hqplayer-embedded rygel deadbeef 等一系列播放器。</p><p>但考虑到可扩展性，我决定使用 MPD + <a href="https://github.com/htkhiem/euphonica">Euphonica</a>。</p><p>MPD 是 C&#x2F;S 架构的音乐播放器，除了 Euphonica，还有很多 TUI&#x2F;GUI 可选，详见 <a href="https://wiki.archlinuxcn.org/wiki/MPD#%E5%AE%A2%E6%88%B7%E7%AB%AF">MPD 客户端</a>。</p><div class="tag-plugin tabs" align="center"id="tab_1"><div class="nav-tabs"><div class="tab active"><a href="#tab_1-1">PipeWire</a></div><div class="tab"><a href="#tab_1-2">PipeWire+ALSA</a></div></div><div class="tab-content"><div class="tab-pane active" id="tab_1-1"><p>PipeWire 可以直出 DSD，其 MPD 配置如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">audio_output &#123;</span><br><span class="line">        type            &quot;pipewire&quot;</span><br><span class="line">        name            &quot;DC04U&quot;</span><br><span class="line"></span><br><span class="line">        dsd             &quot;yes&quot;     # 启用 DSD 直出</span><br><span class="line"></span><br><span class="line">        # dsd_usb      &quot;yes&quot;      # 请不要启用</span><br><span class="line">        # mixer_type   &quot;none&quot;     # 禁用软件音量控制</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">music_directory         &quot;/run/media/vconet/DATA/Musics/&quot;</span><br><span class="line"></span><br><span class="line">bind_to_address         &quot;~/.config/mpd/socket&quot;</span><br><span class="line"></span><br><span class="line">playlist_directory      &quot;~/.config/mpd/playlists&quot;</span><br><span class="line"></span><br><span class="line">db_file                 &quot;~/.config/mpd/database&quot;</span><br><span class="line"></span><br><span class="line">sticker_file            &quot;~/.config/mpd/sticker.sql&quot;</span><br><span class="line"></span><br><span class="line">audio_output &#123;</span><br><span class="line">    type            &quot;fifo&quot;</span><br><span class="line">    name            &quot;Visualizer&quot;</span><br><span class="line">    path            &quot;/tmp/mpd.fifo&quot;</span><br><span class="line">    format          &quot;44100:16:2&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div><div class="tab-pane" id="tab_1-2"><p>在 PipeWire 下，你仍然可以通过 ALSA 独占，但这会导致 MPD 播放音乐时，会导致其他应用尝试播放音频时，可能会卡死应用。</p><p>MPD 配置如下：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">audio_output &#123;</span><br><span class="line">        type            &quot;alsa&quot;</span><br><span class="line">        name            &quot;DC04U&quot;</span><br><span class="line">        device          &quot;hw:DC04U,0&quot;</span><br><span class="line">        </span><br><span class="line">        dop             &quot;no&quot;      # 强制优先 DSD Native</span><br><span class="line">        # 禁用 MPD 的内置转换</span><br><span class="line">        auto_resample   &quot;no&quot;</span><br><span class="line">        auto_format     &quot;no&quot;</span><br><span class="line">        auto_channels   &quot;no&quot;</span><br><span class="line"></span><br><span class="line">        # dsd_usb      &quot;yes&quot;      # 请不要启用</span><br><span class="line">        # mixer_type   &quot;none&quot;     # 禁用软件音量控制</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">music_directory         &quot;/run/media/vconet/DATA/Musics/&quot;</span><br><span class="line"></span><br><span class="line">bind_to_address         &quot;~/.config/mpd/socket&quot;</span><br><span class="line"></span><br><span class="line">playlist_directory      &quot;~/.config/mpd/playlists&quot;</span><br><span class="line"></span><br><span class="line">db_file                 &quot;~/.config/mpd/database&quot;</span><br><span class="line"></span><br><span class="line">sticker_file            &quot;~/.config/mpd/sticker.sql&quot;</span><br><span class="line"></span><br><span class="line">audio_output &#123;</span><br><span class="line">    type            &quot;fifo&quot;</span><br><span class="line">    name            &quot;Visualizer&quot;</span><br><span class="line">    path            &quot;/tmp/mpd.fifo&quot;</span><br><span class="line">    format          &quot;44100:16:2&quot;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>ALSA 设备名可通过 <code>aplay -L</code> 查看</p></div></div></div><p>无论是 PipeWire 还是 PipeWire + ALSA，<strong>都不能</strong>在直出 DSD 的同时播放其他音频。</p><p>仅在 PipeWire 下直出 DSD 时，其他应用尝试播放音频时，不会卡死。</p><div class="tag-plugin colorful note" color="cyan"><div class="body"><p>应用不再播放音频时，仍可能占用设备，需自行重启&nbsp;PipeWire&nbsp;或拔插设备。占用情况可通过&nbsp;<code>pw-top</code>&nbsp;查看</p></div></div><p>不依赖 Systemd 的 MPD 配置，请自行查看 <a href="https://wiki.archlinuxcn.org/wiki/MPD#%E9%85%8D%E7%BD%AE">MPD 配置</a></p><h4 id="Euphonica"><a href="#Euphonica" class="headerlink" title="Euphonica"></a>Euphonica</h4><p>Euphonica 就很简单了：在设置里指定 socket 地址，在 <code>Visualizer data source</code> 下将 <code>Data Source</code> 设为 MPD FIFO，修改 <code>FIFO file</code> 后点击 Apply 即可。</p><div class="tag-plugin swiper fancybox" id="swiper-api" effect="cards"><div class="swiper-wrapper"><div class="swiper-slide"><img no-lazy src="https://static.vconet.top/2026/7b6fb6ddfff2ddbb1767784006ca8d1d.png"></div><div class="swiper-slide"><img no-lazy src="https://static.vconet.top/2026/f80dd5c5561dbed68dc6f8e5d96cc89c.png"></div><div class="swiper-slide"><img no-lazy src="https://static.vconet.top/2026/db203339c3f5bfa28776102068aaa41c.png"></div></div><div class="swiper-pagination"></div><div class="swiper-button-prev blur"></div><div class="swiper-button-next blur"></div></div><p>至此，iBasso DC04U 在 Linux 下可以实现 DSD 直出与常规播放。</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/hires-in-linux/</id>
    <link href="https://blog.vconet.top/archives/hires-in-linux/"/>
    <published>2026-02-08T08:32:34.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>26.2.13 更新：更新信息与配置</p>
</blockquote>
<h2 id="起源"><a href="#起源" class="headerlink" title="起源"></a>起源</h2><p>今年年初我入手了飞傲 JT7 和]]>
    </summary>
    <title>Linux 上 iBasso DC04U 原生 DSD 直出指南</title>
    <updated>2026-02-08T08:32:34.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="Zerotier" scheme="https://blog.vconet.top/tags/Zerotier/"/>
    <category term="Alpine" scheme="https://blog.vconet.top/tags/Alpine/"/>
    <category term="cargo" scheme="https://blog.vconet.top/tags/cargo/"/>
    <content>
      <![CDATA[<h2 id="Background"><a href="#Background" class="headerlink" title="Background"></a>Background</h2><p>ZeroTier One 的包在 v3.17 之后就因软件包 License 问题就从 <code>community</code> 仓库删除了，而且官方也没有提供 Alpine Linux 的软件包</p><p>又双叒叕因为 Alpine Linux 是基于 <code>musl</code> 而非 <code>libc</code>，所以需要我们自己手动编译</p><h2 id="太长不看版"><a href="#太长不看版" class="headerlink" title="太长不看版"></a>太长不看版</h2><p>为了节省时间，我自建了一个 ZeroTier for Alpine Linux 的源，复制粘贴下面三条指令即可通过软件包管理器安装：</p><ol><li><p>添加公钥（自建仓库）：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_22" value="wget https://mirror.vconet.top/admin@vconet.top-69785d11.rsa.pub -O /etc/apk/keys/admin@vconet.top-69785d11.rsa.pub"><button class="copy-btn" onclick="util.copy(&quot;copy_22&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>添加源：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_23" value="echo https://mirror.vconet.top/edge/ | tee -a /etc/apk/repositories"><button class="copy-btn" onclick="util.copy(&quot;copy_23&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>更新 &amp; 安装：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_24" value="apk update && apk add zerotier-one zerotier-one-openrc"><button class="copy-btn" onclick="util.copy(&quot;copy_24&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li></ol><p>其他信息请到 <a href="https://mirror.vconet.top/">https://mirror.vconet.top</a> 查看</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2756/1757;"><img class="lazy" src="https://static.vconet.top/2026/29653cce40f23292d658a84ddd1f2039.png" data-src="https://static.vconet.top/2026/29653cce40f23292d658a84ddd1f2039.png" alt="自建源" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">自建源</span></div></div><h2 id="手动编译"><a href="#手动编译" class="headerlink" title="手动编译"></a>手动编译</h2><h3 id="准备环境"><a href="#准备环境" class="headerlink" title="准备环境"></a>准备环境</h3><div class="tag-plugin colorful note" color="cyan"><div class="title">如果你的&nbsp;Alpine</div><div class="body"><p>Linux&nbsp;实例性能不够，请使用虚拟机或&nbsp;Docker&#x2F;Podman&nbsp;先创建一个&nbsp;Alpine Linux&nbsp;环境</p></div></div><h3 id="准备源码"><a href="#准备源码" class="headerlink" title="准备源码"></a>准备源码</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/zerotier/ZeroTierOne/archive/refs/tags/1.16.0.tar.gz</span><br><span class="line"></span><br><span class="line">tar xvf 1.16.0.tar.gz</span><br><span class="line"></span><br><span class="line">cd ZeroTierOne-1.16.0</span><br></pre></td></tr></table></figure><h3 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h3><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_25" value="apk add util-linux build-base linux-headers cargo openssl-dev gcc make"><button class="copy-btn" onclick="util.copy(&quot;copy_25&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><h3 id="编译"><a href="#编译" class="headerlink" title="编译"></a>编译</h3><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_26" value="make -j$(nproc)"><button class="copy-btn" onclick="util.copy(&quot;copy_26&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><h3 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h3><p>在 Alpine Linux 实例上安装必要的依赖：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_27" value="apk add openssl libstdc++ libgcc"><button class="copy-btn" onclick="util.copy(&quot;copy_27&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>建议把编译好的 <code>zerotier-one</code>、<code>zerotier-cli</code>、<code>zerotier-idtool</code> 上传到 Alpine Linux 的 <code>/usr/sbin</code> 下，搭配下面的 OpenRC 脚本使用：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/sbin/openrc-run</span></span><br><span class="line"></span><br><span class="line">depend() &#123;</span><br><span class="line">    need net</span><br><span class="line">    after firewall</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">command=&quot;/usr/sbin/zerotier-one&quot;</span><br><span class="line">command_background=&quot;yes&quot;</span><br><span class="line">pidfile=&quot;/run/$RC_SVCNAME.pid&quot;</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.vconet.top/archives/zerotier-for-alpine/</id>
    <link href="https://blog.vconet.top/archives/zerotier-for-alpine/"/>
    <published>2026-02-01T14:36:47.000Z</published>
    <summary>
      <![CDATA[<h2 id="Background"><a href="#Background" class="headerlink" title="Background"></a>Background</h2><p>ZeroTier One 的包在 v3.17 之后就因软件包 License]]>
    </summary>
    <title>为 Alpine 提供 ZeroTier</title>
    <updated>2026-02-01T14:36:47.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Windows" scheme="https://blog.vconet.top/categories/Windows/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="NAT" scheme="https://blog.vconet.top/tags/NAT/"/>
    <category term="路由" scheme="https://blog.vconet.top/tags/%E8%B7%AF%E7%94%B1/"/>
    <category term="Radmin LAN" scheme="https://blog.vconet.top/tags/Radmin-LAN/"/>
    <category term="Minecraft" scheme="https://blog.vconet.top/tags/Minecraft/"/>
    <category term="联机" scheme="https://blog.vconet.top/tags/%E8%81%94%E6%9C%BA/"/>
    <content>
      <![CDATA[<p>众所周知，Radmin LAN 并没有 Linux 版本，而有时仍需要<strong>访问</strong>对方的 Radmin LAN 网络，本文提供一种可行方案：</p><p>让 Linux 通过一台 Windows Server 主机做 NAT 转发，借此访问整个 Radmin LAN 网段。</p><p>这个办法也适用于类似的虚拟组网应用</p><h2 id="先决条件"><a href="#先决条件" class="headerlink" title="先决条件"></a>先决条件</h2><p>你需要有一个 Server 版 Windows<br>普通版本 Windows 可尝试对 Radmin VPN 网卡<code>网络共享</code></p><details class="tag-plugin colorful folding" color="blue"><summary><p>具体方法</p></summary><div class="body"><p>共享后，修改另一个被 Windows 修改了 IP 的网卡（被修改成了 192.168.137.1），改成之前的 IP、网关，保存弹出一个“多个网关”之类的警告，此时在 Linux 添加路由可以访问 Radmin LAN 网络，但重启 Windows&#x2F;网卡就会失效</p> </div></details><p>如果你不在意速度，那么上古时代的 NAT32 也可以拿来用（实测网速只有5Mbps，但可以通过双网卡解决）</p><h3 id="安装-Windows-Server"><a href="#安装-Windows-Server" class="headerlink" title="安装 Windows Server"></a>安装 Windows Server</h3><p>我有一台跑 PVE 的 NEC 8 主机，遂选择安装原版 Windows Server 2022</p><p>虚拟机不需要特殊设置，正常安装即可</p><div class="tag-plugin colorful note" color="red"><div class="title">注意：网卡的桥接需要设置为&nbsp;vmbr0&nbsp;，不能用&nbsp;SNAT&nbsp;的网卡</div><div class="body"><p>Linux 必须能直接 ARP 到 <em>目的IP*</em> 才能作为网关。</br>*：如果该目的 IP 和虚拟机不在同一个网段，即虚拟机在 PVE 的 SNAT 后面，那就不能将该 IP作为网关</p></div></div><h3 id="添加-NAT-功能"><a href="#添加-NAT-功能" class="headerlink" title="添加 NAT 功能"></a>添加 NAT 功能</h3><p>系统安装完后，打开<code>服务器管理器</code>，点击<code>管理</code> $\rightarrow$ <code>添加角色和功能</code> </p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1066/720;"><img class="lazy" src="https://static.vconet.top/2025/d49afbed0de5a187d693c357221bb967.png" data-src="https://static.vconet.top/2025/d49afbed0de5a187d693c357221bb967.png" alt="服务器管理器"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">服务器管理器</span></div></div><p>在<code>服务器角色</code>选项卡中，勾选<code>远程访问</code> ，在侧边栏新出现的<code>远程访问</code>内，勾选<code>路由</code> ，在弹出的页面点击 <code>添加功能</code>，之后一路下一步安装即可</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2025/929bc58686ba96ea9fa207314760752c.png" data-src="https://static.vconet.top/2025/929bc58686ba96ea9fa207314760752c.png" alt="启用路由功能"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">启用路由功能</span></div></div><h3 id="配置-NAT"><a href="#配置-NAT" class="headerlink" title="配置 NAT"></a>配置 NAT</h3><p>在继续配置 NAT 前，你需要先安装好 Radmin LAN，后面的步骤需要用到由 Radmin LAN 创建的虚拟网卡 <code>Radmin VPN</code></p><ol><li>打开<code>服务器管理器</code> $ \rightarrow$ <code>工具</code> $\rightarrow$ <code>路由和远程访问</code></li><li>右键 <code>XXXX (本机)</code>，选择<code>配置并启用路由和远程访问</code></li><li>选择自定义，勾选<code>NAT (A)</code>和<code>LAN 路由 (L)</code></li></ol><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2025/26f1b205cd70f0d1bd4039f4a0257683.png" data-src="https://static.vconet.top/2025/26f1b205cd70f0d1bd4039f4a0257683.png" alt="路由和远程访问"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">路由和远程访问</span></div></div><p>添加 Radmin LAN 作为公共接口</p><ol><li>在 <code>IPv4</code> $\rightarrow$ <code>NAT</code> 空白处右键 $\rightarrow$ <code>新建接口</code> </li><li>选择 <code>Radmin VPN</code></li><li>勾选<code>公共接口到 Internet</code> 和 <code>在此接口上启用 NAT</code></li></ol><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2025/3393a8ab1c982255c698870d422b56d5.png" data-src="https://static.vconet.top/2025/3393a8ab1c982255c698870d422b56d5.png" alt="新建NAT"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">新建NAT</span></div></div><p>再次新建接口，把<em>物理</em>网卡添加为<code>专用接口到专用网络</code> </p><h3 id="Linux-设置路由"><a href="#Linux-设置路由" class="headerlink" title="Linux 设置路由"></a>Linux 设置路由</h3><p>Linux 下面需要手动添加一条路由，让<code>26.0.0.0/8</code>流量走 Windows Server：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_5" value="ip route add 26.0.0.0/8 via 虚拟机IP"><button class="copy-btn" onclick="util.copy(&quot;copy_5&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>也可以在 NetworkManager 里添加</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1282/935;"><img class="lazy" src="https://static.vconet.top/2025/ae932a70df539179c32facb51b717e6f.png" data-src="https://static.vconet.top/2025/ae932a70df539179c32facb51b717e6f.png" alt="NetworkManager"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">NetworkManager</span></div></div> <h2 id="Enjoy"><a href="#Enjoy" class="headerlink" title="Enjoy"></a>Enjoy</h2><p>完成以上设置后，Linux 即可访问整个 Radmin LAN 网络</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1457/983;"><img class="lazy" src="https://static.vconet.top/2025/55fc2a9aa18ac043083c15eb3abb369f.png" data-src="https://static.vconet.top/2025/55fc2a9aa18ac043083c15eb3abb369f.png" alt="Konsole"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">Konsole</span></div></div>]]>
    </content>
    <id>https://blog.vconet.top/archives/linux-access-radminlan/</id>
    <link href="https://blog.vconet.top/archives/linux-access-radminlan/"/>
    <published>2025-11-19T09:38:13.000Z</published>
    <summary>众所周知，Radmin LAN 并没有 Linux 版本，而有时仍需要访问对方的 Radmin LAN 网络，本文提供一种可行方案：让 Linux 通过一台 Windows Server 主机做 NAT 转发，借此访问整个 Radmin LAN 网段。</summary>
    <title>在 Linux 下访问 Radmin LAN 网络</title>
    <updated>2025-11-19T09:38:13.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="KVM" scheme="https://blog.vconet.top/categories/Linux/KVM/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="Windows" scheme="https://blog.vconet.top/tags/Windows/"/>
    <category term="ArchLinux" scheme="https://blog.vconet.top/tags/ArchLinux/"/>
    <category term="NVIDIA" scheme="https://blog.vconet.top/tags/NVIDIA/"/>
    <category term="KVM" scheme="https://blog.vconet.top/tags/KVM/"/>
    <category term="libvirt" scheme="https://blog.vconet.top/tags/libvirt/"/>
    <category term="qemu" scheme="https://blog.vconet.top/tags/qemu/"/>
    <category term="直通" scheme="https://blog.vconet.top/tags/%E7%9B%B4%E9%80%9A/"/>
    <category term="双系统" scheme="https://blog.vconet.top/tags/%E5%8F%8C%E7%B3%BB%E7%BB%9F/"/>
    <category term="显卡" scheme="https://blog.vconet.top/tags/%E6%98%BE%E5%8D%A1/"/>
    <content>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>自前年全面从 Windows 转到 ArchLinux 之后，我的的大部分时间都在 Linux 下，但为了运行 CAD、打游戏，我不得不选择双系统方案</p><p>双系统虽然能解决软件兼容性的问题，但每次切换都需要重的体验很割裂，那么虚拟机呢？</p><span id="more"></span><p>行，也不行。虚拟机虽然能跑上面的应用，但那羸弱的 3D 性能，也就只能跑一些 wine 运行不了的软件</p><p>这么一来，显卡直通就成了唯一可行的方案</p><p>网上显卡直通的教程有很多，其中 <a href="https://lantian.pub/article/modify-computer/laptop-muxed-nvidia-passthrough.lantian/">Lan Tian</a> 的教程就很不错，但这些教程都有一个共性：<strong>显卡在开机时就已经屏蔽了 NVIDIA 驱动，并将其交给了 <code>vfio-pci</code></strong></p><p>这就意味着，每次开机后，如果不先手动卸载 <code>vfio-pci</code> 并重新加载 NVIDIA 驱动，我就无法在 Linux 下使用独显</p><p>然而，我并不是每次开机都要运行虚拟机。毕竟当下 Linux 的软件生态已经相当完善，许多游戏也能借助 Wine 与 Proton 顺畅运行。对我而言，更迫切的需求是：<strong>找到一种办法，让 NVIDIA 显卡能够在无需重启的情况下自由切换</strong></p><p>下文方案的前部分教程和网上的许多教程大体上一致</p><h2 id="先决条件"><a href="#先决条件" class="headerlink" title="先决条件"></a>先决条件</h2><p>本文是基于 <code>Optimus MUXed</code> 架构的笔记本（型号 Lenovo Legion y7000p 2024，仅供参考）</p><p>安装好 <code>libvirt</code>，需要新建一台正常的 UEFI 启动的 Windows 虚拟机</p><div class="tag-plugin colorful note" color="cyan"><div class="body"><p>如果你在后续直通和安装驱动时有问题，可尝试关闭虚拟机的安全启动</p></div></div><h2 id="配置宿主机"><a href="#配置宿主机" class="headerlink" title="配置宿主机"></a>配置宿主机</h2><p>为了让虚拟机可以使用宿主机的 PCIe 设备，需要用到 <code>IOMMU</code>和<code>vfio-pci</code> 模块</p><h3 id="启用IOMMU"><a href="#启用IOMMU" class="headerlink" title="启用IOMMU"></a>启用IOMMU</h3><div class="tag-plugin colorful note" color="orange"><div class="title">为什么要用IOMMU</div><div class="body"><p>当操作系统在虚拟机内运行时（包括使用半虚拟化的系统，例如Xen），其通常不知道它要访问的内存的主机物理地址。这使其难以直接访问计算机硬件，因为如果客户机系统尝试用客户机的物理地址进行直接存储器访问（DMA）来吩咐硬件，其可能损坏内存数据，因为硬件不知道给定虚拟机客户机物理地址与主机物理地址之间的映射关系。而由管理程序或主机操作系统介入I&#x2F;O操作来应用翻译则可以避免损坏，但会增加此I&#x2F;O操作的延迟。</br> IOMMU可以依靠将客户机物理地址映射到主机物理地址的相同或兼容转换表重映射硬件访问地址，从而解决延迟问题。</p></div></div><p>首先，要确保你的 BIOS 已经开启了 VT-x 或者 AMD-v 虚拟化</p><p>对于 Intel CPU，需要向内核参数中添加 <code>intel_iommu=on</code> 和 <code>iommu=pt</code></p><p>对于 AMD CPU，则需要添加 <code>amd_iommu=on</code> 和 <code>iommu=pt</code></p><h4 id="Grub"><a href="#Grub" class="headerlink" title="Grub"></a>Grub</h4><p>使用 Grub 的用户，在 <code>/etc/default/grub</code> 中添加：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># Intel CPU</span><br><span class="line">GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet intel_iommu=on iommu=pt ...&quot;</span><br><span class="line"></span><br><span class="line"># AMD CPU</span><br><span class="line">GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet amd_iommu=on iommu=pt ...&quot;</span><br></pre></td></tr></table></figure><h4 id="UKI"><a href="#UKI" class="headerlink" title="UKI"></a>UKI</h4><p>使用 UKI 的用户，在 <code>/etc/kernel/cmdline</code> 中添加：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root=UUID=... rw splash loglevel=3... intel_iommu=on iommu=pt</span><br></pre></td></tr></table></figure><h3 id="设置-VFIO"><a href="#设置-VFIO" class="headerlink" title="设置 VFIO"></a>设置 VFIO</h3><h4 id="修改-mkinitcpio"><a href="#修改-mkinitcpio" class="headerlink" title="修改 mkinitcpio"></a>修改 mkinitcpio</h4><p>为了使用 VFIO，我们需要调整 VFIO 和 NVIDIA 驱动的顺序，修改 <code>/etc/mkinitcpio.conf</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">MODULES=(vfio_pci vfio vfio_iommu_type1 nvidia nvidia_modeset nvidia_uvm nvidia_drm)</span><br><span class="line"># 如果你的内核版本小于 6.2, 那你可你需要添加 vfio_virqfd 这个模块</span><br><span class="line"># 为了在有需要的时候才直通显卡，需要保留此处的 nvidia 驱动</span><br></pre></td></tr></table></figure><p>重新生成 <code>Initramfs</code>：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_10" value="mkinitcpio -P"><button class="copy-btn" onclick="util.copy(&quot;copy_10&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>至此，宿主机的配置就算完成了</p><h2 id="配置虚拟机"><a href="#配置虚拟机" class="headerlink" title="配置虚拟机"></a>配置虚拟机</h2><p>这部分我会略去一些特殊情况和问题，如果有没办法解决的问题，可以去看看 <code>Lan Tian</code>  的两篇教程</p><h3 id="反虚拟化"><a href="#反虚拟化" class="headerlink" title="反虚拟化"></a>反虚拟化</h3><p>为了避免某些应用的虚拟机检测，需要编辑虚拟机的XML，在 <code>&lt;features&gt;</code> 段内添加以下内容：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">features</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">acpi</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">apic</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">hyperv</span> <span class="attr">mode</span>=<span class="string">&quot;custom&quot;</span>&gt;</span></span><br><span class="line">        ...</span><br><span class="line">    <span class="tag">&lt;/<span class="name">hyperv</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--新增--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">kvm</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">hidden</span> <span class="attr">state</span>=<span class="string">&quot;on&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">kvm</span>&gt;</span></span><br><span class="line">    </span><br><span class="line">    <span class="tag">&lt;<span class="name">vmport</span> <span class="attr">state</span>=<span class="string">&quot;off&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">features</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="添加假电池"><a href="#添加假电池" class="headerlink" title="添加假电池"></a>添加假电池</h3><p>在直通后，虚拟机并不能直接使用 NVIDIA 显卡，可能是由于笔记本的限制，显卡只有在有假电池的情况使用</p><p>在 <code>&lt;domain&gt;</code>段添加自定义的 qemu 指令：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!--请不要忘了添加 xmlns:qemu=&quot;http://libvirt.org/schemas/domain/qemu/1.0&quot; 否则无法保存！--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">domain</span> <span class="attr">xmlns:qemu</span>=<span class="string">&quot;http://libvirt.org/schemas/domain/qemu/1.0&quot;</span> <span class="attr">type</span>=<span class="string">&quot;kvm&quot;</span>&gt;</span></span><br><span class="line">  ...</span><br><span class="line">  <span class="tag">&lt;<span class="name">qemu:commandline</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;-acpitable&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;file=/opt/UserItems/ssdt.dat&quot;</span>/&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">qemu:commandline</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">domain</span>&gt;</span></span><br></pre></td></tr></table></figure><p>上面 <code>/opt/UserItems/ssdt.dat</code> 为修改后的ACPI表，来自 <a href="https://lantian.pub/usr/uploads/202007/ssdt1.dat">Lan Tian</a> 的教程</p><h3 id="添加-PCIe"><a href="#添加-PCIe" class="headerlink" title="添加 PCIe"></a>添加 PCIe</h3><p>依旧是在 <code>&lt;domain&gt;</code> 段内添加：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">domain</span> <span class="attr">xmlns:qemu</span>=<span class="string">&quot;http://libvirt.org/schemas/domain/qemu/1.0&quot;</span> <span class="attr">type</span>=<span class="string">&quot;kvm&quot;</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line">    <span class="tag">&lt;<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">&#x27;subsystem&#x27;</span> <span class="attr">type</span>=<span class="string">&#x27;pci&#x27;</span> <span class="attr">managed</span>=<span class="string">&#x27;yes&#x27;</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">source</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">address</span> <span class="attr">domain</span>=<span class="string">&#x27;0x0000&#x27;</span> <span class="attr">bus</span>=<span class="string">&#x27;0x01&#x27;</span> <span class="attr">slot</span>=<span class="string">&#x27;0x00&#x27;</span> <span class="attr">function</span>=<span class="string">&#x27;0x0&#x27;</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">rom</span> <span class="attr">bar</span>=<span class="string">&#x27;off&#x27;</span>/&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">address</span> <span class="attr">type</span>=<span class="string">&#x27;pci&#x27;</span> <span class="attr">domain</span>=<span class="string">&#x27;0x0000&#x27;</span> <span class="attr">bus</span>=<span class="string">&#x27;0x01&#x27;</span> <span class="attr">slot</span>=<span class="string">&#x27;0x00&#x27;</span> <span class="attr">function</span>=<span class="string">&#x27;0x0&#x27;</span> <span class="attr">multifunction</span>=<span class="string">&#x27;on&#x27;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">hostdev</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--禁用内存动态伸缩，影响性能--&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">memballoon</span> <span class="attr">model</span>=<span class="string">&quot;none&quot;</span>/&gt;</span></span><br><span class="line">    ...</span><br><span class="line"><span class="tag">&lt;/<span class="name">domain</span>&gt;</span></span><br></pre></td></tr></table></figure><p>请确保显卡的总线只能是上面的，如果提示冲突，请删掉占用这个地址的那个设备的 <code>&lt;address .../&gt;</code>段，让其重新分配一个新的地址</p><h2 id="启动直通！"><a href="#启动直通！" class="headerlink" title="启动直通！"></a>启动直通！</h2><p>目前，配置好的虚拟机还不能启动，现在需要我们先手动卸载 NVIDIA 驱动，将 NVIDIA 交给 VFIO</p><h3 id="手动切换显卡"><a href="#手动切换显卡" class="headerlink" title="手动切换显卡"></a>手动切换显卡</h3><ol><li><p>手动关闭所有占用 NVIDIA 显卡的进程，进程可通过 lsof 查看：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_11" value="lsof /dev/nvidia*"><button class="copy-btn" onclick="util.copy(&quot;copy_11&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>暂停 nvidia 服务：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_12" value="sudo systemctl stop nvidia-persistenced"><button class="copy-btn" onclick="util.copy(&quot;copy_12&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>卸载 NVIDIA 驱动：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_13" value="sudo modprobe -r nvidia_drm nvidia_modeset nvidia_uvm nvidia ght"><button class="copy-btn" onclick="util.copy(&quot;copy_13&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>绑定 VFIO：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_14" value="sudo modprobe vfio-pci ids=10de:28e0"><button class="copy-btn" onclick="util.copy(&quot;copy_14&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>此处的 <code>ids=xxx</code> 需要所有的 NVIDIA 设备都交给 VFIO，通过 <code>lspci -nn | grep NVIDIA</code> 查看，多个设备使用 <code>,</code> 分隔</p><p><em>我的设备在 Linux 下只有 VGA，并没有出现 Audio 设备</em></p></li></ol><p>完成上面的步骤后，通过下面的指令查看显卡是否成果交给 VFIO：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_15" value="sudo dmesg | grep -i vfio"><button class="copy-btn" onclick="util.copy(&quot;copy_15&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>如果出现类似下面的信息，即为成功：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[  170.607580] vfio-pci 0000:01:00.0: vgaarb: VGA decodes changed: olddecodes=none,decodes=io+mem:owns=none</span><br><span class="line">[  170.607741] vfio_pci: add [10de:28e0[ffffffff:ffffffff]] class 0x000000/00000000</span><br></pre></td></tr></table></figure><p>此时，可以开启虚拟机了</p><h3 id="画面显示"><a href="#画面显示" class="headerlink" title="画面显示"></a>画面显示</h3><p>为了把虚拟机的画面传输到宿主机，大体上有两种方法：</p><ul><li>使用 Sunshine、Parsec 串流</li><li>Looking Glass 直出画面</li></ul><p>无论上面那种方法，都需要先安装一个虚拟显示器软件比如 <a href="https://github.com/VirtualDrivers/Virtual-Display-Driver">VDD</a>，串流方案比较简单，不需要再配置虚拟机</p><h3 id="Looking-Glass"><a href="#Looking-Glass" class="headerlink" title="Looking Glass"></a>Looking Glass</h3><p>我在这里介绍一下 Looking Glass 方案，虚拟机上只需要安装 <a href="https://looking-glass.io/artifact/bleeding/host">Looking Glass Host 版</a>，宿主机上的配置有下面两种办法</p><h4 id="KVMFR"><a href="#KVMFR" class="headerlink" title="KVMFR"></a>KVMFR</h4><p>这是官方推荐的方案，通过 DMA 传输数据，能提供更好的画面和更好的帧率</p><h5 id="安装模块"><a href="#安装模块" class="headerlink" title="安装模块"></a>安装模块</h5><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_16" value="paru -S looking-glass-rc-module-dkms"><button class="copy-btn" onclick="util.copy(&quot;copy_16&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><ol><li><p>设置开机加载 kvmfr 模块，创建 <code>/etc/modules-load.d/looking-glass.conf</code>：</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">kvmfr</span><br></pre></td></tr></table></figure></li><li><p>创建 <code>/etc/modprobe.d/looking-glass.conf</code> 内容如下：</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">options kvmfr static_size_mb=计算出的数值</span><br></pre></td></tr></table></figure><p> 数值的计算方法：${\frac{分辨率宽\times 分辨率高\times4\times2}{1024\times1024}}$，将计算出的结果以 ${2^n}$ 向上取整的整数</p><p> 如分显示器辨率为 2560x1600，其结果为：<br> $${\frac{2560\times1600\times4\times2}{  1024 \times 1024 } &#x3D;31.25}$$<br> 最接近 31.25 的是 ${2^6&#x3D; 64}$，因此上面的值为 64</p></li><li><p>给 <code>/dev/kvmfr0</code> 赋予访问权，创建 udev 规则 <code>/etc/udev/rules.d/99-kvmfr.rules</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">SUBSYSTEM==&quot;kvmfr&quot;, OWNER=&quot;qemu&quot;, GROUP=&quot;kvm&quot;, MODE=&quot;0660&quot;</span><br></pre></td></tr></table></figure><p><strong>其中的 <code>OWNER</code> 不要写任何 uid &gt; 1000 的用户，不然该 udev 规则不会生效</strong>，请确保当前用户在 <code>kvm</code> 组内，重启后生效</p></li></ol><h5 id="设置虚拟机"><a href="#设置虚拟机" class="headerlink" title="设置虚拟机"></a>设置虚拟机</h5><p>编辑虚拟机的 XML，在 <code>&lt;domain&gt;</code> 段内添加以下内容：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">  ...</span><br><span class="line">  <span class="tag">&lt;<span class="name">qemu:commandline</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;-acpitable&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;file=/opt/UserItems/ssdt1.dat&quot;</span>/&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--添加下面的内容--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;-device&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;&#123;&#x27;driver&#x27;:&#x27;ivshmem-plain&#x27;,&#x27;id&#x27;:&#x27;shmem0&#x27;,&#x27;memdev&#x27;:&#x27;looking-glass&#x27;&#125;&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;-object&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">qemu:arg</span> <span class="attr">value</span>=<span class="string">&quot;&#123;&#x27;qom-type&#x27;:&#x27;memory-backend-file&#x27;,&#x27;id&#x27;:&#x27;looking-glass&#x27;,&#x27;mem-path&#x27;:&#x27;/dev/kvmfr0&#x27;,&#x27;size&#x27;:67108864,&#x27;share&#x27;:true&#125;&quot;</span>/&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--这里的 size 和上面的一样--&gt;</span></span><br><span class="line">  <span class="tag">&lt;/<span class="name">qemu:commandline</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">domain</span>&gt;</span></span><br></pre></td></tr></table></figure><h5 id="修改客户端"><a href="#修改客户端" class="headerlink" title="修改客户端"></a>修改客户端</h5><p>修改全局设置 <code>/etc/looking-glass-client.ini</code>：</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[app]</span></span><br><span class="line"><span class="attr">shmFile</span>=/dev/kvmfr0</span><br></pre></td></tr></table></figure><div class="tag-plugin colorful note" color="red"><div class="body"><p>如果使用该方案，就不能使用&nbsp;virtiofs&nbsp;共享文件，只能选择&nbsp;SMB、NFS&nbsp;或者硬盘直通，如果就是想用&nbsp;virtiofs，那需要使用下面的方案</p></div></div><h4 id="shmem"><a href="#shmem" class="headerlink" title="shmem"></a>shmem</h4><ol><li><p>编译虚拟机的 XML，在 <code>&lt;device&gt;</code> 段内添加：</p> <figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">        ...</span><br><span class="line">        <span class="tag">&lt;<span class="name">shmem</span> <span class="attr">name</span>=<span class="string">&#x27;looking-glass&#x27;</span>&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">model</span> <span class="attr">type</span>=<span class="string">&#x27;ivshmem-plain&#x27;</span>/&gt;</span></span><br><span class="line">          <span class="tag">&lt;<span class="name">size</span> <span class="attr">unit</span>=<span class="string">&#x27;M&#x27;</span>&gt;</span>64<span class="tag">&lt;/<span class="name">size</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">shmem</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">device</span>&gt;</span></span><br><span class="line">    ...</span><br><span class="line"><span class="tag">&lt;/<span class="name">domain</span>&gt;</span></span><br></pre></td></tr></table></figure></li><li><p>修改权限，创建 <code>/etc/tmpfiles.d/looking-glass.conf</code>：</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">f /dev/shm/looking-glass 0660 vconet kvm -</span><br></pre></td></tr></table></figure><p> 请把 <code>vconet</code> 改为自己的用户名，运行 <code>sudo systemd-tmpfiles /etc/tmpfiles.d/looking-glass.conf --create</code> 生效</p></li></ol><p>之后你可以添加 virtiofs 了，大概… （我没有测试）</p><h3 id="键鼠"><a href="#键鼠" class="headerlink" title="键鼠"></a>键鼠</h3><p>这一部分是为了解决 Looking Glass 糟糕的键鼠性能：丢包，根本没法玩游戏</p><p>解决办法比较粗暴，我有一套单独的键鼠，直通后不影响笔记本的键盘和触控板</p><p>为了保证随时可以切换连接状态，不应在 virt-manager 里直接添加 <code>USB 主机设备</code>，而是用 <code>virsh</code> 这个 CLI 工具</p><p>连接：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_17" value="virsh attach-device VMID XML_FILE"><button class="copy-btn" onclick="util.copy(&quot;copy_17&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>断开：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_18" value="virsh detach-device VMID XML_FILE"><button class="copy-btn" onclick="util.copy(&quot;copy_18&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>定义键鼠的 XML 格式如下：</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">hostdev</span> <span class="attr">mode</span>=<span class="string">&quot;subsystem&quot;</span> <span class="attr">type</span>=<span class="string">&quot;usb&quot;</span> <span class="attr">managed</span>=<span class="string">&quot;yes&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">source</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">vendor</span> <span class="attr">id</span>=<span class="string">&quot;0x3554&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">product</span> <span class="attr">id</span>=<span class="string">&quot;0xfa09&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">source</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">hostdev</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="重新启用-NVIDIA-显卡"><a href="#重新启用-NVIDIA-显卡" class="headerlink" title="重新启用 NVIDIA 显卡"></a>重新启用 NVIDIA 显卡</h2><p>至此，虚拟机已经用上 NVIDIA 显卡了，但如何把显卡重连回 Linux？</p><p>步骤和上面的差不多</p><ol><li><p>卸载 <code>vfio-pic</code> 驱动：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_19" value="sudo modprobe -r vfio-pci"><button class="copy-btn" onclick="util.copy(&quot;copy_19&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>重新加载 NVIDIA 驱动：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_20" value="sudo modprobe nvidia_drm nvidia_modeset nvidia_uvm nvidia"><button class="copy-btn" onclick="util.copy(&quot;copy_20&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li><li><p>重启 nvidia 服务：</p><div class="tag-plugin copy"><span>$</span><input class="copy-area" id="copy_21" value="sudo systemctl restart nvidia-persistenced"><button class="copy-btn" onclick="util.copy(&quot;copy_21&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div></li></ol><h2 id="GUI"><a href="#GUI" class="headerlink" title="GUI"></a>GUI</h2><p>虽然上面的方法实现了自由切换，但我不想每次都手动完成</p><p>于是，我用 PySide6 写了一个简单的 GUI 用来简化流程，毕竟点点点总比一个个输方便</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1098/1129;"><img class="lazy" src="https://static.vconet.top/20250923_214950.png" data-src="https://static.vconet.top/20250923_214950.png" alt="toolbox"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">toolbox</span></div></div><p>我把它放在 <a href="https://github.com/V-Conet/nvidia_kvm_passthrough">Github</a> 上了，有需要的可以自行下载使用</p><h2 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h2><p>文章到这里就暂时结束了，如果我后期有什么新的需求，会在继续这里更新<br>后续可能更新 Apparmor 和 Samba 相关的部分…</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/nvidia-kvm-passthrough/</id>
    <link href="https://blog.vconet.top/archives/nvidia-kvm-passthrough/"/>
    <published>2025-09-23T11:06:11.000Z</published>
    <summary>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>自前年全面从 Windows 转到 ArchLinux 之后，我的的大部分时间都在 Linux 下，但为了运行 CAD、打游戏，我不得不选择双系统方案</p>
<p>双系统虽然能解决软件兼容性的问题，但每次切换都需要重的体验很割裂，那么虚拟机呢？</p>]]>
    </summary>
    <title>告别重启：Linux 下的 NVIDIA 显卡直通</title>
    <updated>2025-09-23T11:06:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="PVE" scheme="https://blog.vconet.top/categories/Linux/PVE/"/>
    <category term="Linux" scheme="https://blog.vconet.top/tags/Linux/"/>
    <category term="Docker" scheme="https://blog.vconet.top/tags/Docker/"/>
    <category term="异地组网" scheme="https://blog.vconet.top/tags/%E5%BC%82%E5%9C%B0%E7%BB%84%E7%BD%91/"/>
    <category term="NAT" scheme="https://blog.vconet.top/tags/NAT/"/>
    <category term="PVE" scheme="https://blog.vconet.top/tags/PVE/"/>
    <category term="DNS" scheme="https://blog.vconet.top/tags/DNS/"/>
    <category term="DHCP" scheme="https://blog.vconet.top/tags/DHCP/"/>
    <category term="Cloudflare" scheme="https://blog.vconet.top/tags/Cloudflare/"/>
    <category term="Nginx" scheme="https://blog.vconet.top/tags/Nginx/"/>
    <category term="Homelab" scheme="https://blog.vconet.top/tags/Homelab/"/>
    <content>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文记录了我在 NEC 8代小主机上折腾 PVE 的过程，也希望能为想搭建类似内外网环境的朋友提供一些思路</p><span id="more"></span><h2 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h2><p>使用 <code>vconet.top</code> 这个我拥有的域名，给本地服务都用上 SSL、同时异地组网 实现在外访问本地服务，还需要把一些服务公布到互联网上</p><p>与此同时，还要保证在各个网络环境下都能保持一致的 URL</p><h2 id="配置-PVE"><a href="#配置-PVE" class="headerlink" title="配置 PVE"></a>配置 PVE</h2><blockquote><p>PVE 的安装和基本配置教程网上有很多，不再复述</p></blockquote><h3 id="NAT！"><a href="#NAT！" class="headerlink" title="NAT！"></a>NAT！</h3><p>出于种种原因，我在 PVE 上额外划分了一个 <code>10.22.33.0/24</code> 网段，用于虚拟机和 LXC 容器</p><h4 id="配置-SDN"><a href="#配置-SDN" class="headerlink" title="配置 SDN"></a>配置 SDN</h4><h5 id="创建-Simple-区域"><a href="#创建-Simple-区域" class="headerlink" title="创建 Simple 区域"></a>创建 Simple 区域</h5><p>转到 <code>数据中心</code> ➡️ <code>SDN</code> ➡️ <code>区域</code> ➡️ <code>添加</code> ➡️ <code>Simple</code></p><p>填一个名称，勾选<code>高级</code>并启用<code>自动 DHCP</code></p>  <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1914/1071;"><img class="lazy" src="https://static.vconet.top/20250914_221451.png" data-src="https://static.vconet.top/20250914_221451.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h5 id="创建-VNets"><a href="#创建-VNets" class="headerlink" title="创建 VNets"></a>创建 VNets</h5><p>转到 <code>数据中心</code> ➡️ <code>SDN</code> ➡️ <code>VNets</code>  ➡️ <code>创建</code></p><p>填写<code>名称</code>和<code>区</code>（刚才创建的 Simple 名称）</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1899/1077;"><img class="lazy" src="https://static.vconet.top/20250914_221633.png" data-src="https://static.vconet.top/20250914_221633.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h5 id="创建子网"><a href="#创建子网" class="headerlink" title="创建子网"></a>创建子网</h5><p>在 <code>VNets</code> 右边的<code>子网</code>创建新子网，填写子网网段和网关，在 <code>DHCP 范围</code>选项卡内填写 DHCP 的 IP 范围</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1905/1066;"><img class="lazy" src="https://static.vconet.top/20250914_222016.png" data-src="https://static.vconet.top/20250914_222016.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:621/403;"><img class="lazy" src="https://static.vconet.top/20250914_222032.png" data-src="https://static.vconet.top/20250914_222032.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h5 id="应用更改"><a href="#应用更改" class="headerlink" title="应用更改"></a>应用更改</h5><p>转到 <code>数据中心</code> ➡️ <code>SDN</code>，点击左上角的<code>应用</code></p><h4 id="启用-DHCP"><a href="#启用-DHCP" class="headerlink" title="启用 DHCP"></a>启用 DHCP</h4><p>要使 PVE 能真正的提供 DHCP 服务，需要在 PVE 上安装 <code>dnsmasq</code> 并禁用自带的服务</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">apt install dnsmasq</span><br><span class="line">systemctl <span class="built_in">disable</span> --now dnsmasq</span><br></pre></td></tr></table></figure><h5 id="自定义-DNS"><a href="#自定义-DNS" class="headerlink" title="自定义 DNS"></a>自定义 DNS</h5><blockquote><p>因为内外网的 DNS 记录不一样，需要给<code>10.22.33.0/24</code>网段内的虚拟机和 LXC 提供自定义的 DNS 服务器，我将会在下文给出的 Co re + Powerdns 方案</p></blockquote><p>为了让 <code>dnsmasq</code> 能在提供 DHCP 的同时，提供 自定义 DNS，需要编辑 <code>/etc/pve/sdn/subnets.cfg</code> 文件，添加 <code>dhcp-dns-server</code> 选项</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">subnet: pvenet-10.22.33.0-24</span><br><span class="line">        vnet vnet</span><br><span class="line">        dhcp-range start-address=10.22.33.2,end-address=10.22.33.253</span><br><span class="line">        gateway 10.22.33.1</span><br><span class="line">        snat 1</span><br><span class="line">        dhcp-dns-server 10.22.33.200 #你所需的 DNS 服务器 IP</span><br></pre></td></tr></table></figure><h5 id="防火墙"><a href="#防火墙" class="headerlink" title="防火墙"></a>防火墙</h5><p>目前我并没有防火墙的需求，暂时跳过</p><h3 id="内网域名解析"><a href="#内网域名解析" class="headerlink" title="内网域名解析"></a>内网域名解析</h3><p>为了提供 <code>vconet.top</code> 等 TLD 域名的内部解析，需要一个自己的 DNS 服务器，同时还要方便维护</p><p>可以实现上面需求的，可选方案有很多：CoreDNS（两种方案）、Powerdns、TechnitiumDNS，甚至 小米路由器自带的 <code>自定义 Hosts</code> 功能也能满足需求</p><h4 id="自定义-DNS-怎么选？"><a href="#自定义-DNS-怎么选？" class="headerlink" title="自定义 DNS 怎么选？"></a>自定义 DNS 怎么选？</h4><h5 id="简单记录"><a href="#简单记录" class="headerlink" title="简单记录"></a>简单记录</h5><p>如果你只需要简单的 <code>xx.vconet.top</code>对应 <code>ip</code>，那么大可选择小米路由器自带的 <code>自定义 Hosts</code> 功能，亦或是 CoreDNS（方案一）</p><p>该方案用到 CoreDNS的 <code>hosts</code>功能：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">.:53 &#123;</span><br><span class="line">    # lan.hosts为你需要的解析，格式和 hosts 文件一致</span><br><span class="line">    hosts /etc/CoreDNS/lan.hosts &#123;</span><br><span class="line">       fallthrough</span><br><span class="line">    &#125;</span><br><span class="line">    forward . 223.5.5.5 119.29.29.29</span><br><span class="line">    log</span><br><span class="line">    cache</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="复杂记录"><a href="#复杂记录" class="headerlink" title="复杂记录"></a>复杂记录</h5><p>如果不仅仅需要 A 记录，还需要 PTR、MX 等，就需要 CoreDNS（方案二）、Powerdns、Technitiumdns 这些权威 DNS 了</p><p>CoreDNS（方案二）需要用到 CoreDNS 的 <code>file</code>功能： </p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">. &#123;</span><br><span class="line">    forward . 223.5.5.5</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br><span class="line">vconet.top &#123;</span><br><span class="line">    file /etc/CoreDNS/DOMAIN.zone #域名的Zone文件</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Powerdns、Technitiumdns 有对应的 Web 管理页面，直接添加就可</p><blockquote><p>如果选择权威 DNS 给 <code>vconet.top</code> 做解析，<strong>且</strong>如果本地 DNS 的记录不全，解析时会返回 NXDOMAIN</p></blockquote><p>权威 DNS 在查询到不存在的记录时，会直接返回 <code>NXDOMAIN</code>，而不会继续向上递归查询，这可能导致内外网记录解析失败：</p><pre class="mermaid">graph LR    ldns --本地IP--> id1[Client]    id1 --"local.vconet.top(存在于本地DNS)"-->ldns["本地 DNS"]        ldns--NXDOMAIN-->id2[Client]    id2 --"blog.vconet.top(不存在于本地)"--> ldns    ldns x--"向上查找blog.xx"--x rdns["公共 DNS"]</pre><h6 id="解决-NXDOMAIN"><a href="#解决-NXDOMAIN" class="headerlink" title="解决 NXDOMAIN"></a>解决 NXDOMAIN</h6><ul><li><p>对于  Technitiumdns，你可以在创建新域名的时候，选择 <code>条件转发</code></p></li><li><p>对于 CoreDNS（方案二），需要自己编译含有 <code>alternate</code> 插件的 CoreDNS：</p>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vconet.top &#123;</span><br><span class="line">    file /etc/CoreDNS/DOMAIN.zone #域名的Zone文件</span><br><span class="line">    alternate NXDOMAIN . 223.5.5.5 119.29.29.29</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><h5 id="我的方案"><a href="#我的方案" class="headerlink" title="我的方案"></a>我的方案</h5><p>因需要给 PVE 提供 DNS 相关服务，只能选择 Powerdns 解析内网记录，而 Powerdns 本身只用能作权威 DNS，还需要搭配 powerdns-recurosr 之类的前置</p><p><em>但</em> recursor 并不能非常方便的解决上面 NXDOMAIN 的问题，因此我选择 CoreDNS 而非 powerdns-recursor</p><p>CoreDNS 配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">####################</span><br><span class="line"># 修改 /etc/coredns/Corefile 文件</span><br><span class="line"># 127.0.0.1:54 为 Powerdns</span><br><span class="line">####################</span><br><span class="line"></span><br><span class="line">vconet.top &#123;</span><br><span class="line">    forward . 127.0.0.1:54 &#123;</span><br><span class="line">        policy sequential</span><br><span class="line">    &#125;</span><br><span class="line">    alternate NXDOMAIN . 223.5.5.5 119.29.29.29</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">####################</span><br><span class="line"># 这两部分是用于 PVE 实例的反向查询和内网域名解析</span><br><span class="line">33.22.10.in-addr.arpa &#123;</span><br><span class="line">    forward . 127.0.0.1:54</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br><span class="line">pve.lan &#123;</span><br><span class="line">    forward . 127.0.0.1:54</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br><span class="line">####################</span><br><span class="line"></span><br><span class="line"># 其他请求</span><br><span class="line">.:53 &#123;</span><br><span class="line">    #bind 10.22.33.200</span><br><span class="line">    forward . 223.5.5.5 119.29.29.29</span><br><span class="line">    cache</span><br><span class="line">    log</span><br><span class="line">    errors</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Powerdns 配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"># 在 /etc/powerdns/pdns.conf 下追加下面这一段</span><br><span class="line"></span><br><span class="line"># AXFR</span><br><span class="line">allow-axfr-ips=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16</span><br><span class="line"># DNS UPDATE</span><br><span class="line">allow-dnsupdate-from=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16</span><br><span class="line"># DNS Notify</span><br><span class="line">allow-notify-from=10.0.0.0/8,172.16.0.0/12,192.168.0.0/16</span><br><span class="line"># 是否允许未签名 Notify</span><br><span class="line">allow-unsigned-notify=no</span><br><span class="line"># 额外通知服务器</span><br><span class="line">#also-notify=10.0.0.10,192.168.31.10,[fc00::1]</span><br><span class="line"></span><br><span class="line">#daemon 启动</span><br><span class="line">daemon=yes</span><br><span class="line">disable-axfr=no</span><br><span class="line">guardian=no</span><br><span class="line">#是否master</span><br><span class="line">master=yes</span><br><span class="line">#是否slave</span><br><span class="line">slave=no</span><br><span class="line">#启动权限</span><br><span class="line">setgid=pdns</span><br><span class="line">setuid=pdns</span><br><span class="line">#打印日志</span><br><span class="line">log-dns-details=yes</span><br><span class="line">log-dns-queries=no</span><br><span class="line">loglevel=6</span><br><span class="line">log-timestamp=yes</span><br><span class="line">logging-facility=0</span><br><span class="line">#开启api</span><br><span class="line">api=yes</span><br><span class="line">api-key=非常长的随机字符串</span><br><span class="line">#启动webserver 监控</span><br><span class="line">webserver=yes</span><br><span class="line">webserver-address=0.0.0.0</span><br><span class="line">webserver-allow-from=0.0.0.0/0</span><br><span class="line">webserver-port=9190</span><br><span class="line">#监听的地址端口</span><br><span class="line">local-address=0.0.0.0</span><br><span class="line">local-port=54</span><br><span class="line">#记录query 日志</span><br><span class="line">query-logging=yes</span><br></pre></td></tr></table></figure><p>请把<code>api-key</code>、<code>local-port</code>、<code>webserver-port</code>修改为自己所需的值</p><h3 id="打通内外网"><a href="#打通内外网" class="headerlink" title="打通内外网"></a>打通内外网</h3><p>在这一部分开始之前，我需要介绍一下我的网络拓展：</p><pre class="mermaid">graph TD    %% ISP 到家庭网络    ISP((ISP))    WIFI[小米路由器<br/>192.168.31.0/24]    %% 局域网    NB[笔记本 <br/>192.168.31.10]    PVE[PVE 宿主机</br>192.168.31.210]    %% PVE 内部网络    SUBNET1[[内部网络<br/>10.22.33.0/24]]    VM1["虚拟机1(核心)<br/>10.22.33.200"]    VM2["虚拟机2(Docker服务)"]    LXC1["LXC 1"]    LXC2["LXC 2"]    %% ZeroTier 网络    ZT[[ZeroTier 网络<br/>192.168.192.0/24]]    %% 拓扑关系    ISP --> WIFI    WIFI --> NB    WIFI --> PVE    PVE --> SUBNET1    SUBNET1 --> VM1    SUBNET1 --> VM2    SUBNET1 --> LXC1    SUBNET1 --> LXC2    VM1 <--> ZT</pre><h4 id="本地访问"><a href="#本地访问" class="headerlink" title="本地访问"></a>本地访问</h4><p>在前面配置中，我们已经在 NAT 环境下新增了一层虚拟网络</p><p>接下来要解决的问题是：如何让 <code>192.168.31.0/24</code> 网段内的设备能够访问 <code>10.22.33.0/24</code> 网段的虚拟机和 LXC 容器？</p><h5 id="静态路由"><a href="#静态路由" class="headerlink" title="静态路由"></a>静态路由</h5><div class="tag-plugin blockquote" indent="undefined"><p>什么是路由？</p><p>网络路由是选择一个或多个网络上的路径的过程。路由原理可以应用于从电话网络到公共交通的任何类型的网络。在诸如互联网等数据包交换网络中，路由选择互联网协议 (IP) 数据包从其起点到目的地的路径。这些互联网路由决定由称为路由器的专用网络硬件做出。</p></div><p>为了实现这个需求，需要在自己的路由器里添加一条静态路由：</p><p>其<code>目标地址</code>为  <code>10.22.33.0</code>，<code>网关</code>为 PVE 的 IP <code>192.168.31.210</code>，<code>掩码</code>为 <code>255.255.255.0</code></p><p>小米 AX3000T 在开启 ssh 服务后，编辑 <code>/etc/config/network</code>和防火墙 <code>/etc/config/firewall</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"># /etc/config/network</span><br><span class="line"># 添加新的静态路由，格式如下</span><br><span class="line">config route</span><br><span class="line">        option interface &#x27;lan&#x27;</span><br><span class="line">        option target &#x27;10.22.33.0&#x27;</span><br><span class="line">        option netmask &#x27;255.255.255.0&#x27;</span><br><span class="line">        option gateway &#x27;192.168.31.210&#x27;</span><br><span class="line">        </span><br><span class="line"># /etc/config/network</span><br><span class="line"># 请看准是否为 defaults 部分的防火墙配置！</span><br><span class="line"># 将 forward 改为 ACCEPT</span><br><span class="line">config defaults</span><br><span class="line">        option syn_flood &#x27;0&#x27;</span><br><span class="line">        option input &#x27;ACCEPT&#x27;</span><br><span class="line">        option output &#x27;ACCEPT&#x27;</span><br><span class="line">        option forward &#x27;ACCEPT&#x27;</span><br><span class="line">        ...</span><br></pre></td></tr></table></figure><blockquote><p>请自行查找其他路由器添加静态路由的方法</p></blockquote><p>生效后，Linux 效果如下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">user@archlinux$ </span><span class="language-bash">route -n</span></span><br><span class="line">Destination     Gateway         Genmask         Flags Metric Ref    Use Iface</span><br><span class="line">10.22.33.0      192.168.31.210  255.255.255.0   UG    5000   0        0 wlp9s0</span><br></pre></td></tr></table></figure><p>这样我们就实现了 <code>192.168.31.0/24</code> 网段访问 <code>10.22.33.0/24</code> 网段</p><pre class="mermaid">graph LR    id1["笔记本 192.168.31.10"] --"ping 10.22.33.200"---> id2["路由器 192.168.31.1"] --"下一跳192.168.31.210"-->id3["PVE .31.210和.33.1"]    id3 --获得请求--> id4["虚拟机1（核心）10.22.33.200"] ---> id1</pre><h4 id="异地组网"><a href="#异地组网" class="headerlink" title="异地组网"></a>异地组网</h4><p>异地组网可选的方案有很多，常用的有 <code>Tailscale</code> 和 <code>ZeroTier</code>，在此我选择功能更少的 ZeroTier</p><!--？或许qoute更好？--><p><em>Tailscale 有很多独特的功能，其中就有内网 HTTPS，但这个功能不够强大，而且和下面配置的 Nginx 反代服务重复了</em></p><p>上面提到，我的 ZeroTier 是安装在 <code>虚拟机1（核心）</code>里的，这就意味着 当我的手机连接到 ZeroTier 后，只能访问 <code>192.168.192.31</code>这个 由 ZT 提供的 IP，并不能访问 <code>10.22.33.0/24</code> 网段</p><p>解决问题的办法其实很简单，在 ZT 的后台添加一条新的静态路由，但这次的网关是 ZT 提供给<code>虚拟机1（核心）</code>的 IP</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1387/478;"><img class="lazy" src="https://static.vconet.top/20250915_180513.png" data-src="https://static.vconet.top/20250915_180513.png" alt="ZT添加路由" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">ZT添加路由</span></div></div><p>但此时，我们还并不能 ping 通，因为从 ZT 发来的请求，PVE 接收到后并不知道返回的路由</p><p>因此需要在 PVE 宿主机上添加一条路由：</p><p>目标地址为 <code>192.168.192.0/24</code> （ZeroTier 的网段），网关为 <code>10.22.33.200</code>（虚拟机 1 的  IP）</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_7" value="ip route add 192.168.192.0/24 via 10.22.33.200"><button class="copy-btn" onclick="util.copy(&quot;copy_7&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><details class="tag-plugin colorful folding" color="cyan" child="codeblock"><summary><p>添加为系统服务，自动添加和删除</p></summary><div class="body"><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">[Unit]</span><br><span class="line">Description=Static route for Zerotier</span><br><span class="line">After=network-online.target</span><br><span class="line">Wants=network-online.target</span><br><span class="line"></span><br><span class="line">[Service]</span><br><span class="line">Type=oneshot</span><br><span class="line">ExecStart=/sbin/ip route add 192.168.192.0/24 via 10.22.33.200</span><br><span class="line">ExecStop=/sbin/ip route del 192.168.192.0/24 via 10.22.33.200</span><br><span class="line">RemainAfterExit=yes</span><br><span class="line"></span><br><span class="line">[Install]</span><br><span class="line">WantedBy=multi-user.target</span><br></pre></td></tr></table></figure></div></details><p>最后，启用 <code>虚拟机1（核心）</code>的转发功能：</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_8" value="sysctl -w net.ipv4.ip_forward=1"><button class="copy-btn" onclick="util.copy(&quot;copy_8&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>至此，在本地或使用 ZeroTier 时，都可以访问 <code>10.22.33.0/24</code> 网段的设备了</p><p>这么做也避免了给同一个域名添加两个不同网段 IP 的麻烦，方便维护</p><h4 id="外网访问"><a href="#外网访问" class="headerlink" title="外网访问"></a>外网访问</h4><p>当下，直接开放端口非 80&#x2F;443 端口虽可以实现，但这么做容易暴露自己的 IP</p><p>一个解决办法是使用 CDN 回源，但免费版 Cloudflre 的 Origin Rule 只能有三条回源规则，数量有限还需要手动维护 IP 记录</p><p>那还有没有什么别的办法呢？</p><p>有的。那就是赛博活佛 Cloudflare 的 <code>Zero Trust</code>，Zero Trust 中的<code>隧道</code> 功能可以把内网服务公布到互联网上：</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1809/753;"><img class="lazy" src="https://static.vconet.top/20250915_185440.png" data-src="https://static.vconet.top/20250915_185440.png" alt="CF隧道" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div><div class="image-meta"><span class="image-caption center">CF隧道</span></div></div><p>cloudflared 的安装和设置 在创建完隧道后有详细的介绍，不再赘述</p><h2 id="各种服务"><a href="#各种服务" class="headerlink" title="各种服务"></a>各种服务</h2><p>以下是我在内外网打通后部署的一些服务，属于扩展内容，可按需参考</p><p>略去了很多设置过程</p><h3 id="基础服务"><a href="#基础服务" class="headerlink" title="基础服务"></a>基础服务</h3><p>上文曾多次提到<code>虚拟机1（核心）</code>，这台虚拟机承担了我内网环境的 Nginx 反代、DNS 服务器和 ZeroTier 组网</p><h4 id="Nginx-反代"><a href="#Nginx-反代" class="headerlink" title="Nginx 反代"></a>Nginx 反代</h4><p>我尝试过 Nginx Proxy Manager 的网页管理，但决定手动管理，因其可选项比较少，不能灵活配置</p><p>Debian 系统可以直接安装 <code>nginx</code> 包和 <code>nginx-full</code>包</p><div class="tag-plugin copy"><span>#</span><input class="copy-area" id="copy_9" value="apt install nginx nginx-full"><button class="copy-btn" onclick="util.copy(&quot;copy_9&quot;,&quot;复制成功&quot;)"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>在安装完后，按照下面的反代模板添加配置文件即可：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">8443</span> ssl;</span><br><span class="line">    <span class="attribute">server_name</span> pve.vconet.top;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_certificate</span> /root/.acme.sh/<span class="regexp">*.vconet.top</span>_ecc/fullchain.cer;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /root/.acme.sh/<span class="regexp">*.vconet.top</span>_ecc/<span class="regexp">*.vconet.top.key</span>;</span><br><span class="line">    <span class="attribute">add_header</span> Strict-Transport-Security <span class="string">&quot;max-age=31536000;&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">proxy_redirect</span> <span class="literal">off</span>;</span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Upgrade <span class="variable">$http_upgrade</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;upgrade&quot;</span>;</span><br><span class="line">        <span class="attribute">proxy_pass</span> https://10.22.33.1:8006;</span><br><span class="line">        <span class="attribute">proxy_buffering</span> <span class="literal">off</span>;</span><br><span class="line">        <span class="attribute">client_max_body_size</span> <span class="number">0</span>;</span><br><span class="line">        <span class="attribute">proxy_connect_timeout</span>  <span class="number">3600s</span>;</span><br><span class="line">        <span class="attribute">proxy_read_timeout</span>  <span class="number">3600s</span>;</span><br><span class="line">        <span class="attribute">proxy_send_timeout</span>  <span class="number">3600s</span>;</span><br><span class="line">        <span class="attribute">send_timeout</span>  <span class="number">3600s</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>我在这里使用<code>8443</code>而非443端口的原因在下面 Forgejo 部分有解释</p><h4 id="DNS-服务器与-PVE-整合"><a href="#DNS-服务器与-PVE-整合" class="headerlink" title="DNS 服务器与 PVE 整合"></a>DNS 服务器与 PVE 整合</h4><p>在前面，我配置好了 Powerdns，下面是 PVE 启用 DNS 插件，实现自动添加虚拟机解析记录和 PTR 记录的方法</p><h6 id="添加-DNS-插件"><a href="#添加-DNS-插件" class="headerlink" title="添加 DNS 插件"></a>添加 DNS 插件</h6><p>转到 <code>数据中心</code> ➡️ <code>SDN</code> ➡️ <code>选项</code> ➡️ <code>添加</code></p><p>填写对应的 Powerdns API 地址和 API 密钥</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1697/1054;"><img class="lazy" src="https://static.vconet.top/20250915_211605.png" data-src="https://static.vconet.top/20250915_211605.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h5 id="补全-Simple-的信息"><a href="#补全-Simple-的信息" class="headerlink" title="补全 Simple 的信息"></a>补全 Simple 的信息</h5><p>转到 <code>数据中心</code> ➡️ <code>SDN</code> ➡️ <code>区域</code> ➡️ <code>添加</code> ➡️ <code>Simple</code><br>勾选<code>高级</code>，补全下面的信息</p><blockquote><p>在填写DNS 域之前，请在 powerdns 内创建此域</p></blockquote><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:704/525;"><img class="lazy" src="https://static.vconet.top/20250915_212357.png" data-src="https://static.vconet.top/20250915_212357.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h3 id="Docker-服务"><a href="#Docker-服务" class="headerlink" title="Docker 服务"></a>Docker 服务</h3><p>使用 Docker 是因为方便更新和管理</p><h4 id="自动追番"><a href="#自动追番" class="headerlink" title="自动追番"></a>自动追番</h4><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:2560/1555;"><img class="lazy" src="https://static.vconet.top/20250915_220249.png" data-src="https://static.vconet.top/20250915_220249.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h5 id="Emby"><a href="#Emby" class="headerlink" title="Emby"></a>Emby</h5><p>Emby 的 docker-compose 如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">emby:</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">emby</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">emby/embyserver</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="attr">devices:</span></span><br><span class="line">     <span class="bullet">-</span> <span class="string">/dev/dri:/dev/dri</span> <span class="comment"># 挂载显卡用于转码</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">8096</span><span class="string">:8096</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">1900</span><span class="string">:1900/udp</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./emby:/config</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/mnt/emby:/mnt/emby</span></span><br><span class="line">  <span class="attr">fontinass:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">riderlty/fontinass:noproxy</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">fontinass</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">PUID=100000</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">PGID=100000</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">EMBY_SERVER_URL=http://emby:8096</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">8011</span><span class="string">:8011</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./fonts:/fonts</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./fiadata:/data</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">emby</span></span><br></pre></td></tr></table></figure><p>为了实现 Emby 观看番剧时，自动加载 <code>ass</code> 字幕所需的字体，避免本地安装  需要用到 <a href="https://github.com/RiderLty/fontInAss">fontInAss</a> 并使用下面的 Nginx 反代</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;</span><br><span class="line">    <span class="attribute">listen</span> <span class="number">8012</span>; <span class="comment">#新的Emby访问端口</span></span><br><span class="line">    <span class="attribute">gzip</span> <span class="literal">on</span>;</span><br><span class="line">    <span class="attribute">gzip_http_version</span> <span class="number">1</span>.<span class="number">0</span>;</span><br><span class="line">    <span class="attribute">gzip_comp_level</span> <span class="number">1</span>;</span><br><span class="line">    <span class="attribute">gzip_types</span> text/x-ssa;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~ /(socket|embywebsocket)</span> &#123;</span><br><span class="line">        <span class="attribute">proxy_pass</span> <span class="variable">$EMBY_SERVER_URL</span>;</span><br><span class="line">        <span class="attribute">proxy_http_version</span> <span class="number">1</span>.<span class="number">1</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Upgrade <span class="variable">$http_upgrade</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Connection <span class="string">&quot;upgrade&quot;</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> Host <span class="variable">$host</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Real-IP <span class="variable">$remote_addr</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Proto <span class="variable">$scheme</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Protocol <span class="variable">$scheme</span>;</span><br><span class="line">        <span class="attribute">proxy_set_header</span> X-Forwarded-Host <span class="variable">$http_host</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* /videos/(.*)/Subtitles/(.*)/Stream.vtt</span>  &#123;</span><br><span class="line">        <span class="comment">#适配emby网页播放SRT字幕，302直链时避免冲突</span></span><br><span class="line">        <span class="attribute">proxy_pass</span> <span class="variable">$EMBY_SERVER_URL</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* /videos/(.*)/Subtitles/(.*)/(Stream.ass|Stream.srt|Stream)</span> &#123;</span><br><span class="line">        <span class="comment">#仅匹配ass与srt字幕文件，Stream适配infuse</span></span><br><span class="line">        <span class="comment">#修改为你的fontinass服务器地址</span></span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:8011;</span><br><span class="line">    &#125;</span><br><span class="line">     </span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* /web/bower_components/(.*)/subtitles-octopus.js</span> &#123;</span><br><span class="line">        <span class="comment">#修改为你的fontinass服务器地址</span></span><br><span class="line">        <span class="comment">#如不需要修改web端渲染，可删除此location</span></span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:8011;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> <span class="regexp">~* /web/modules/htmlvideoplayer/plugin.js</span> &#123;</span><br><span class="line">        <span class="comment">#修改为你的fontinass服务器地址</span></span><br><span class="line">        <span class="comment">#仅当需要web渲染，且通过https访问时，才需启用此location，否则可删除</span></span><br><span class="line">        <span class="comment">#见 https://github.com/RiderLty/fontInAss/issues/43</span></span><br><span class="line">        <span class="attribute">proxy_pass</span> http://127.0.0.1:8011;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="section">location</span> / &#123;</span><br><span class="line">        <span class="comment">#修改为你的Emby/Jellyfin服务器地址</span></span><br><span class="line">        <span class="attribute">proxy_pass</span> <span class="variable">$EMBY_SERVER_URL</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h5 id="下载器"><a href="#下载器" class="headerlink" title="下载器"></a>下载器</h5><p>使用 <a href="https://github.com/c0re100/qBittorrent-Enhanced-Edition">qBittorrentEE</a> 和 <a href="https://github.com/PBH-BTN/PeerBanHelper">PeerBanHelper</a></p><p>PeerBanHelper 用于阻止迅雷等吸血客户端</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">services:</span></span><br><span class="line">  <span class="attr">qbittorrentee:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">superng6/qbittorrentee:latest</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">qbittorrentee</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shanghai</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">WEBUIPORT=8080</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">ENABLE_DOWNLOADS_PERM_FIX=true</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./qbitcnf:/config</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">/mnt/emby:/downloads/</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">6881</span><span class="string">:6881</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">6881</span><span class="string">:6881/udp</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">8080</span><span class="string">:8080</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">  <span class="attr">peerbanhelper:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ghostchu/peerbanhelper:latest</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">unless-stopped</span></span><br><span class="line">    <span class="attr">container_name:</span> <span class="string">pbh</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">./pbhcnf:/app/data</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">9898</span><span class="string">:9898</span></span><br><span class="line">    <span class="attr">environment:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">TZ=Asia/Shanghai</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">qbittorrentee</span></span><br></pre></td></tr></table></figure><h5 id="ASS自动追番"><a href="#ASS自动追番" class="headerlink" title="ASS自动追番"></a>ASS自动追番</h5><p>AniRSS 的使用，请阅读<a href="https://docs.wushuo.top/">官方文档</a></p><h4 id="Forgejo-反代下同域名-ssh"><a href="#Forgejo-反代下同域名-ssh" class="headerlink" title="Forgejo 反代下同域名 ssh"></a>Forgejo 反代下同域名 ssh</h4><blockquote><p>Git 服务器我选择使用 Gitea 的 fork：Forgejo<br>Forgejo 的安装 Gitea&#x2F;Forgejo 都有详细的文档，可自行搜索</p></blockquote><p>在这一节中，我需要解决一个问题：由于 Nginx 反代服务器和 Forgejo 并不在同一台虚拟机上，默认情况下我必须为 SSH 使用不同的域名。</p><p>经过探索，我发现可以通过 Nginx 的 stream 模块，在同一域名下根据流量类型分别提供 HTTP 反代和 SSH 反代。</p><p>在 <code>nginx.conf</code>的 <code>http</code> 段前添加这样一段：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">stream</span> &#123;</span><br><span class="line">    <span class="section">upstream</span> https_backend &#123;</span><br><span class="line">        <span class="attribute">server</span> <span class="number">127.0.0.1:8443</span>;  <span class="comment"># 所有HTTPS流量转发到8443</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="section">upstream</span> ssh_backend &#123;</span><br><span class="line">        <span class="attribute">server</span> <span class="number">10.22.33.203:22</span>;  <span class="comment"># SSH流量转发到目标服务器</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="comment"># 基于协议检测进行流量分发</span></span><br><span class="line">    <span class="comment"># SSL握手包会被检测为HTTPS，非SSL流量被认为是SSH</span></span><br><span class="line">    <span class="attribute">map</span> <span class="variable">$ssl_preread_protocol</span> <span class="variable">$upstream</span> &#123;</span><br><span class="line">        &quot;&quot; ssh_backend;         <span class="comment"># 非SSL流量 -&gt; SSH</span></span><br><span class="line">        ~. https_backend; <span class="comment"># SSL流量 -&gt; HTTPS</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="section">server</span> &#123;</span><br><span class="line">        <span class="attribute">listen</span> <span class="number">443</span>;</span><br><span class="line">        <span class="attribute">ssl_preread</span> <span class="literal">on</span>;</span><br><span class="line">        <span class="attribute">proxy_pass</span> <span class="variable">$upstream</span>;</span><br><span class="line">        <span class="comment">#proxy_timeout 10s;</span></span><br><span class="line">        <span class="comment">#proxy_responses 1;</span></span><br><span class="line">        <span class="attribute">error_log</span> /var/log/nginx/stream.log;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><em>这也是我在前面选择使用 8443 端口的原因</em></p><p>虽然和使用单独的域名比，这个方法略显麻烦，但在此记录这个解决办法</p><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1450/832;"><img class="lazy" src="https://static.vconet.top/20250915_221635.png" data-src="https://static.vconet.top/20250915_221635.png" data-fancybox="true"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h3 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h3><p>至此，我的 NEC8 小主机在 PVE 上的内外网打通和基础服务搭建就告一段落了。希望本文能为有类似需求的朋友提供一些参考</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/nec-8-pve/</id>
    <link href="https://blog.vconet.top/archives/nec-8-pve/"/>
    <published>2025-09-14T11:41:53.000Z</published>
    <summary>
      <![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本文记录了我在 NEC 8代小主机上折腾 PVE 的过程，也希望能为想搭建类似内外网环境的朋友提供一些思路</p>]]>
    </summary>
    <title>NEC 8小主机：打通 PVE 内外网</title>
    <updated>2025-09-14T11:41:53.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Goodix" scheme="https://blog.vconet.top/categories/Linux/Goodix/"/>
    <category term="Archlinux" scheme="https://blog.vconet.top/tags/Archlinux/"/>
    <category term="fprint" scheme="https://blog.vconet.top/tags/fprint/"/>
    <category term="C" scheme="https://blog.vconet.top/tags/C/"/>
    <content>
      <![CDATA[<h2 id="安装驱动"><a href="#安装驱动" class="headerlink" title="安装驱动"></a>安装驱动</h2><p>上游 <a href="https://gitlab.freedesktop.org/libfprint/libfprint">freedesktop</a> 和 <a href="https://launchpad.net/ubuntu/+source/libfprint">ubuntu</a> 的 <code>libfprint</code> 都不支持我手上这个<code>27C6:5584</code> 指纹识别器，不过万幸 Github 上有一个名为 <a href="https://github.com/goodix-fp-linux-dev/">“Goodix Fingerprint Linux Development ”</a> 的组织，致力于为 Linux 提供汇顶指纹芯片方案的驱动支持</p><h3 id="汇顶-Linux-支持情况"><a href="#汇顶-Linux-支持情况" class="headerlink" title="汇顶 Linux 支持情况"></a>汇顶 Linux 支持情况</h3><details class="tag-plugin colorful folding" color="yellow"><summary><p>下表是支持情况，来自该组织的 Discord</p></summary><div class="body"><table> <thead> <tr> <th align="center">PID</th> <th align="center">支持状态</th> </tr> </thead> <tbody><tr> <td align="center">⁠5042</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠5110</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5117</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠5120</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5130</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5201</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠521d</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5301</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠530c</td> <td align="center">❎</td> </tr> <tr> <td align="center">⁠532d</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠5335</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠533c</td> <td align="center">❎</td> </tr> <tr> <td align="center">⁠5381</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠5385</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠538c</td> <td align="center">❎</td> </tr> <tr> <td align="center">⁠538d</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5395</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠550a</td> <td align="center">❎</td> </tr> <tr> <td align="center">⁠5503</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠5584</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠55a2</td> <td align="center">🔄</td> </tr> <tr> <td align="center">⁠55a4</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠55b4</td> <td align="center">✅</td> </tr> <tr> <td align="center">⁠5740</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">⁠581a</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">3200</td> <td align="center">🆘</td> </tr> <tr> <td align="center">3288</td> <td align="center">🆘</td> </tr> <tr> <td align="center">5120</td> <td align="center">🔄</td> </tr> <tr> <td align="center">5187</td> <td align="center">🅾️</td> </tr> <tr> <td align="center">51a0</td> <td align="center">🔄</td> </tr> <tr> <td align="center">51b7</td> <td align="center">🅾️</td> </tr> </tbody></table> <p><strong>🅾️：闭源驱动 &#x2F; ✅：社区驱动（unstable）&#x2F; 🔄：目前可获取指纹图像，待进一步支持 libfprint &#x2F; 🆘：不支持</strong></p> </div></details><p><strong>在此，仅讨论PID为 <code>55x4</code> 的三个指纹识别器：<code>55b4</code>、<code>55a4</code>和我的<code>5584</code></strong></p><blockquote><p><em>太长不看版：</em><br>Debian&#x2F;ArchLinux 用户可以使用我重新打包的 <a href="https://www.123684.com/s/WaF9jv-yQwgv?pwd=apWm">libfprint</a><br>Debian 用户还需要安装 <code>libopencv-features2d406</code> 软件包，Ubuntu 需要 <code>libopencv-features2d406t64</code><br><em>我将 Debian 包的版本号改为了 <code>1.99.9</code>，我对 ArchLinux 的包进行了 GPG 签名，请自行导入公钥</em>  </p></blockquote><p>对于前两者，ArchLinux 用户可以直接安装 <a href="https://aur.archlinux.org/packages/libfprint-goodixtls-55x4">libfprint-goodixtls-55x4</a> 包，无需更改代码，而对于 <code>5584</code> 则需要修改<a href="https://github.com/TheWeirdDev/libfprint.git">该仓库</a>里的<code>libfprint/drivers/goodixtls/goodix55x4.h</code>头文件，添加 <code>5584</code> 的 PID 和 VID：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">const</span> FpIdEntry id_table[] = &#123;</span><br><span class="line">    &#123;.vid = <span class="number">0x27c6</span>, .pid = <span class="number">0x55b4</span>&#125;,</span><br><span class="line">    &#123;.vid = <span class="number">0x27c6</span>, .pid = <span class="number">0x55a4</span>&#125;,</span><br><span class="line">    &#123;.vid = <span class="number">0x27c6</span>, .pid = <span class="number">0x5584</span>&#125;,</span><br><span class="line">    &#123;.vid = <span class="number">0</span>, .pid = <span class="number">0</span>, .driver_data = <span class="number">0</span>&#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><blockquote><p>注意：目前并不支持同时在 Windows 和 Linux 下同时使用，因为 Windows 会更改指纹识别器的 PSK，详细请看 <a href="https://wiki.archlinux.org/title/Lenovo_Yoga_7i#Fingerprint_reader">ArchWiki</a> 的注释</p></blockquote><h2 id="刷写固件"><a href="#刷写固件" class="headerlink" title="刷写固件"></a>刷写固件</h2><p><strong>三个型号的指纹识别器在使用前，都需要刷写固件：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 切换root用户，因为后续刷写固件需要root权限</span></span><br><span class="line">su</span><br><span class="line"><span class="comment"># 克隆仓库</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/goodix-fp-linux-dev/goodix-fp-dump</span><br><span class="line"><span class="comment"># 创建venv，避免污染系统python库</span></span><br><span class="line"><span class="built_in">cd</span> goodix-fp-dump</span><br><span class="line">python -m venv venv</span><br><span class="line"><span class="built_in">source</span> venv/bin/activate</span><br><span class="line"><span class="comment"># 安装依赖</span></span><br><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure><h3 id="55b4、55a4"><a href="#55b4、55a4" class="headerlink" title="55b4、55a4"></a>55b4、55a4</h3><p>对于 <code>55b4</code> 和 <code>55a4</code>，请直接运行对应的 <code>run_55XX.py</code>；</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python3 run_55XX.py</span><br></pre></td></tr></table></figure><h3 id="5584"><a href="#5584" class="headerlink" title="5584"></a>5584</h3><p>对于 <code>5584</code>，自行创建一个 <code>.py</code> 文件并运行，其内容如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> driver_55x4</span><br><span class="line">driver_55x4.main(<span class="number">0x5584</span>)</span><br></pre></td></tr></table></figure><p>当输出 <code>mcu_switch_to_fdt_down(XXX, True)</code> 的时候，此时按下指纹识别器，如一切正常则会输出</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mcu_get_image()</span><br><span class="line">image: 88 x 108, length: 9504</span><br></pre></td></tr></table></figure><p>并在当前目录下生成 <code>fingerprint.pgm</code> 文件，该文件即刚才采集到的指纹，图片样式如下：</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3814860347.png" data-src="https://static.vconet.top/3814860347.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>至此，指纹已基本可用。而 <code>fprint</code> 的使用方法及如何在系统内使用指纹，请查看 <a href="https://wiki.archlinuxcn.org/wiki/Fprint">ArchWiki - fprint</a>，里面有详细介绍</p><h2 id="Bitwarden"><a href="#Bitwarden" class="headerlink" title="Bitwarden"></a>Bitwarden</h2><p>Bitwarden 桌面版在合并了 <a href="https://github.com/bitwarden/clients/pull/4586">#4586 Unix biometrics unlock via Polkit</a> 之后，可以通过 <code>polkit</code> 使用系统身份验证，由 <code>polkit</code> 发起的身份验证，则可以通过配置 <code>pam</code> 实现指纹解锁</p><h3 id="pam-规则"><a href="#pam-规则" class="headerlink" title="pam 规则"></a>pam 规则</h3><p>默认情况下，Archlinux 下的 polkit 并不会将启用自己的 pam 规则，需要自己手动启用：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> <span class="built_in">cp</span> /usr/lib/pam.d/polkit-1 /etc/pam.d/</span><br></pre></td></tr></table></figure><p>并修改：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># 在顶端添加如下内容</span><br><span class="line">authsufficient  pam_fprintd.so</span><br></pre></td></tr></table></figure><p>如果你想同时使用指纹或密码，请从 AUR 安装 <a href="https://aur.archlinux.org/packages/pam-fprint-grosshack">pam-fprint-grosshack </a> 包</p><p>对于一些不支持输入空密码的身份验证，如 Gnome 的 polkit 代理，也请安装该软件包并使用下面的规则</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"># auth            sufficient      pam_fprintd_grosshack.so</span><br><span class="line"># auth            sufficient      pam_unix.so try_first_pass nullok</span><br></pre></td></tr></table></figure><h3 id="polkit-规则"><a href="#polkit-规则" class="headerlink" title="polkit 规则"></a>polkit 规则</h3><p>目前，Bitwarden 并不会自动添加所需的 polkt 规则，需要手动将下面的内容添加到 <code>/usr/share/polkit-1/actions/com.bitwarden.Bitwarden.policy</code></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?xml version=<span class="string">&quot;1.0&quot;</span> encoding=<span class="string">&quot;UTF-8&quot;</span>?&gt;</span></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">policyconfig</span> <span class="keyword">PUBLIC</span></span></span><br><span class="line"><span class="meta"> <span class="string">&quot;-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN&quot;</span></span></span><br><span class="line"><span class="meta"> <span class="string">&quot;http://www.freedesktop.org/standards/PolicyKit/1.0/policyconfig.dtd&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">policyconfig</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">action</span> <span class="attr">id</span>=<span class="string">&quot;com.bitwarden.Bitwarden.unlock&quot;</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">description</span>&gt;</span>Unlock Bitwarden<span class="tag">&lt;/<span class="name">description</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">message</span>&gt;</span>Authenticate to unlock Bitwarden<span class="tag">&lt;/<span class="name">message</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">defaults</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">allow_any</span>&gt;</span>no<span class="tag">&lt;/<span class="name">allow_any</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">allow_inactive</span>&gt;</span>no<span class="tag">&lt;/<span class="name">allow_inactive</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">allow_active</span>&gt;</span>auth_self<span class="tag">&lt;/<span class="name">allow_active</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;/<span class="name">defaults</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">action</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">policyconfig</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="Bitwarden-设置"><a href="#Bitwarden-设置" class="headerlink" title="Bitwarden 设置"></a>Bitwarden 设置</h3><blockquote><p>仅讨论 KDE&#x2F;Gnome </p></blockquote><p>在使用 Bitwarden 提供的 <code>使用系统身份验证解锁</code> 功能前，请确保你的桌面环境已经为你启用了自己的 <code>密码库</code>，否则 <strong>Bitwarden 的设置里不会有 <code>使用系统身份验证解锁</code> 选项</strong></p><p>KDE 和 Gnome 下分别为 <a href="https://wiki.archlinuxcn.org/wiki/KDE_Wallet">Kwallet</a> &amp; <a href="https://wiki.archlinuxcn.org/wiki/GNOME/Keyring">Gnome&#x2F;keyring</a></p><blockquote><p>KDE 的 Kwallet 有可能不会激活自己的 D-Bus 服务，需要<a href="https://wiki.archlinuxcn.org/wiki/KDE_Wallet#Automatic_D-Bus_activation">手动干预</a>  </p></blockquote><p>在启用 kwallet&#x2F;gnome-keyring 之后，便可打开 Bitwarden，勾选 <code>使用系统身份验证解锁</code></p><p>下次解锁密码库时，便可使用指纹解锁</p><h4 id="“使用系统身份验证解锁”-不见了？"><a href="#“使用系统身份验证解锁”-不见了？" class="headerlink" title="“使用系统身份验证解锁” 不见了？"></a>“使用系统身份验证解锁” 不见了？</h4><p>如果使用 KDE + kwallet ，且在终端启动 Bitwarden时，报错中提到了 <code>Credential Storage Listener</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">› [Credential Storage Listener] setPassword failed Error: File backend error Portal communication failed Portal request failed: org.freedesktop.zbus.Error: Portal operation not allowed: Unable to open /proc/125191/root</span><br><span class="line">falling back to get legacy Bitwarden XXXX_accessTokenKey</span><br><span class="line">› SetAccessToken: storing encrypted access token in secure storage failed. Falling back to disk storage. Error: New Access token key unable to be retrieved from secure storage.</span><br><span class="line">› [Credential Storage Listener] setPassword failed Error: File backend error Portal communication failed Portal request failed: org.freedesktop.zbus.Error: Portal operation not allowed: Unable to open /proc/125191/root</span><br><span class="line">falling back to get legacy Bitwarden XXXX_refreshToken</span><br><span class="line">› SetRefreshToken: storing refresh token in secure storage failed. Falling back to disk storage. Error: Refresh token failed to save to secure storage.</span><br></pre></td></tr></table></figure><p>此问题是由 <code>xdg-desktop-portal</code> 和<code>kwallet</code> 引起的，貌似当前 KDE 的 xdg portal 支持有问题，请在启动 Bitwarden 时，自行添加环境变量，绕过 xdg，使 Bitwarden 直接访问 Kwallet：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GTK_USE_PORTAL=0</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.vconet.top/archives/goodix-fp-reader/</id>
    <link href="https://blog.vconet.top/archives/goodix-fp-reader/"/>
    <published>2025-08-22T12:18:00.000Z</published>
    <summary>记录Linux下使用咸鱼铝合金指纹识别器</summary>
    <title>Linux下使用咸鱼铝合金指纹识别器</title>
    <updated>2025-08-22T12:18:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Archlinux" scheme="https://blog.vconet.top/tags/Archlinux/"/>
    <category term="Secure Boot" scheme="https://blog.vconet.top/tags/Secure-Boot/"/>
    <category term="UKI" scheme="https://blog.vconet.top/tags/UKI/"/>
    <category term="sbctl" scheme="https://blog.vconet.top/tags/sbctl/"/>
    <content>
      <![CDATA[<h2 id="前情提要"><a href="#前情提要" class="headerlink" title="前情提要"></a>前情提要</h2><p>上一篇 Archboot 实现 Secure Boot 自动配置的办法，觉得还是不够简单，而且我现在也不需要通过 Grub 引导 Windows 和其他系统，遂有本文。</p><span id="more"></span><h2 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h2><p>在现有系统上抛弃Grub，拥抱统一内核映像（UKI）并启用 Secure Boot</p><blockquote><p>我所使用的内核为 <code>linux-zen</code>，下面的配置请注意修改</p></blockquote><h3 id="修改内核命令行参数"><a href="#修改内核命令行参数" class="headerlink" title="修改内核命令行参数"></a>修改内核命令行参数</h3><p>创建<code>/etc/kernel/cmdline</code>如下：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root=UUID=系统的分区UUID rw splash loglevel=3</span><br></pre></td></tr></table></figure><p><em>注：Btrfs分区可能需要添加 rootflags&#x3D;subvol&#x3D;XXX 的挂载参数，可以在grub生成的文件中寻找</em></p><h3 id="修改-mkinitcpio-预设"><a href="#修改-mkinitcpio-预设" class="headerlink" title="修改 mkinitcpio 预设"></a>修改 mkinitcpio 预设</h3><p>编辑<code>/etc/mkinitcpio.d/linux-zen.preset</code>，取消 “<em>PRESET</em>_image&#x3D;XXX” “<em>PRESET</em>_uki&#x3D;XXX”的注释，并且修改存储位置，保存到 <code>EFI</code> 分区内</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">mkinitcpio preset file <span class="keyword">for</span> the <span class="string">&#x27;linux-zen&#x27;</span> package</span></span><br><span class="line"></span><br><span class="line">ALL_config=&quot;/etc/mkinitcpio.conf&quot;</span><br><span class="line">ALL_kver=&quot;/boot/vmlinuz-linux-zen&quot;</span><br><span class="line"></span><br><span class="line">PRESETS=(&#x27;default&#x27; &#x27;fallback&#x27;)</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash"><span class="comment">##我的EFI分区挂载在/boot下，故作此修改###</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">default_config=<span class="string">&quot;/etc/mkinitcpio.conf&quot;</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">default_image=<span class="string">&quot;/boot/initramfs-linux-zen.img&quot;</span></span></span><br><span class="line">default_uki=&quot;/boot/EFI/Linux/arch-linux-zen.efi&quot;</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">default_options=<span class="string">&quot;--splash /usr/share/systemd/bootctl/splash-arch.bmp&quot;</span></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">fallback_config=<span class="string">&quot;/etc/mkinitcpio.conf&quot;</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">fallback_image=<span class="string">&quot;/boot/initramfs-linux-zen-fallback.img&quot;</span></span></span><br><span class="line">fallback_uki=&quot;/boot/EFI/Linux/arch-linux-zen-fallback.efi&quot;</span><br><span class="line">fallback_options=&quot;-S autodetect&quot;</span><br></pre></td></tr></table></figure><h3 id="构建-UKI"><a href="#构建-UKI" class="headerlink" title="构建 UKI"></a>构建 UKI</h3><p>确保 <code>EFI</code> 目录已挂载，运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p EFI_MOUNT_POINT/EFI/Linux</span><br><span class="line">mkinitcpio -p linux-zen</span><br></pre></td></tr></table></figure><h3 id="添加引导"><a href="#添加引导" class="headerlink" title="添加引导"></a>添加引导</h3><p>遵循一切从简的理念，使用 <code>efibootmgr</code> 添加引导</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">efibootmgr --create \</span><br><span class="line">    -d /dev/nvmeXXX -p 1 \</span><br><span class="line">    --label <span class="string">&quot;Arch Linux&quot;</span> \</span><br><span class="line">    --loader <span class="string">&quot;EFI/Linux/arch-linux-zen.efi&quot;</span></span><br><span class="line"><span class="comment">#nvmeXXX EFI分区</span></span><br></pre></td></tr></table></figure><h3 id="签名-UKI"><a href="#签名-UKI" class="headerlink" title="签名 UKI"></a>签名 UKI</h3><blockquote><p>如果此时已经配置好 <code>sbctl</code> 和 Secure Boot，可直接通过 <code>sbctl sign -s /EFI_MOUNT_POINT/EFI/Linux/arch-linux-zen.efi</code> 结束本文</p><p>至此，您可以抛弃 Grub 了，享受快人一步的开机😏</p></blockquote><p>通过以下命令删除不再使用的自动签名</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sbctl remove-file /boot/grub/x86_64-efi/grub.efi</span><br></pre></td></tr></table></figure><blockquote><p>如果还没有安装 <code>sbctl</code>，请继续阅读</p></blockquote><h4 id="设置-Secure-Boot"><a href="#设置-Secure-Boot" class="headerlink" title="设置 Secure Boot"></a>设置 Secure Boot</h4><p>进入设备 BIOS，将 <code>Secure Boot</code> 进入设置模式 <code>Setup Mode</code></p><p>进入Archlinux，安装 <code>sbctl</code> 包，运行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sbctl enroll-keys -m</span><br><span class="line">sbctl sign -s /EFI_MOUNT_POINT/EFI/Linux/arch-linux-zen.efi</span><br><span class="line"><span class="comment"># 你也许还需要签名这个（Windows）</span></span><br><span class="line">sbctl sign -s /EFI_MOUNT_POINT/EFI/Boot/bootx64.efi</span><br></pre></td></tr></table></figure><p>重启至 BIOS 开启 Secure Boot </p><p>至此，UKI + sbctl 最简单 Secure Boot 设置就大功告成了</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/uki-sbctl-secureboot/</id>
    <link href="https://blog.vconet.top/archives/uki-sbctl-secureboot/"/>
    <published>2025-02-04T14:38:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="前情提要"><a href="#前情提要" class="headerlink" title="前情提要"></a>前情提要</h2><p>上一篇 Archboot 实现 Secure Boot 自动配置的办法，觉得还是不够简单，而且我现在也不需要通过 Grub 引导 Windows 和其他系统，遂有本文。</p>]]>
    </summary>
    <title>UKI+sbctl：启用 Secure Boot 最简单的方法</title>
    <updated>2025-02-04T14:38:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Mailu" scheme="https://blog.vconet.top/tags/Mailu/"/>
    <category term="Caddy" scheme="https://blog.vconet.top/tags/Caddy/"/>
    <content>
      <![CDATA[<h2 id="网络要求"><a href="#网络要求" class="headerlink" title="网络要求"></a>网络要求</h2><p>首先安装docker，并确保服务器的25端口开放，可使用<code>telnet</code>检查</p><span id="more"></span><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">telnet smtp.163.com 25</span><br></pre></td></tr></table></figure><p>若出现以下信息，证明25端口可用</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Trying 111.124.203.45...</span><br><span class="line">Connected to smtp163.mail.ntes53.netease.com.</span><br><span class="line">Escape character is &#x27;^]&#x27;.</span><br><span class="line">220 163.com Anti-spam GT for Coremail System (163com[20141201])</span><br></pre></td></tr></table></figure><!--more--><h2 id="添加DNS记录"><a href="#添加DNS记录" class="headerlink" title="添加DNS记录"></a>添加DNS记录</h2><ul><li>添加A&#x2F;AAAA记录，解析<code>mail.example.com</code></li></ul><h2 id="安装docker"><a href="#安装docker" class="headerlink" title="安装docker"></a>安装docker</h2><p>详细教程请参考<a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">Docker CE 软件仓库</a></p><h2 id="生成Mailu配置文件"><a href="#生成Mailu配置文件" class="headerlink" title="生成Mailu配置文件"></a>生成Mailu配置文件</h2><p>前往<a href="https://setup.mailu.io/">Mailu Setup</a>，根据需求更改</p><h3 id="注意："><a href="#注意：" class="headerlink" title="注意："></a>注意：</h3><ul><li>因为我们要用到Caddy的反代，所以不需要Mailu自动获取<code>Let&#39;s Encrypt</code>的证书，需要手动配置，因此<code>Choose how you wish to handle security</code>只能选择<code>mail</code></li><li><code>Enable Web email client</code>选择一个顺眼的，默认不使用，其他功能按需启用</li><li>在<code>Setp 3</code>内，<code>IPv4 listen address</code>请填入本机真实IP，可以是内网IP（一般服务器都有）</li></ul><h2 id="修改配置文件"><a href="#修改配置文件" class="headerlink" title="修改配置文件"></a>修改配置文件</h2><h3 id="修改Mailu配置"><a href="#修改Mailu配置" class="headerlink" title="修改Mailu配置"></a>修改Mailu配置</h3><p>配置完成后点击<code>Setup Mailu</code>，将<code>docker-compose.yml</code>和<code>mailu.env</code>下载到本地进行修改</p><p>对于<code>docker-compose.yml</code></p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># This file is auto-generated by the Mailu configuration wizard.</span></span><br><span class="line"><span class="comment"># Please read the documentation before attempting any change.</span></span><br><span class="line"><span class="comment"># Generated for compose flavor</span></span><br><span class="line"></span><br><span class="line"><span class="attr">services:</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># External dependencies</span></span><br><span class="line">  <span class="attr">redis:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">redis:alpine</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/mailu/redis:/data&quot;</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">resolver</span></span><br><span class="line">    <span class="attr">dns:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">192.168</span><span class="number">.203</span><span class="number">.254</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Core services</span></span><br><span class="line">  <span class="attr">front:</span></span><br><span class="line">    <span class="attr">image:</span> <span class="string">ghcr.nju.edu.cn/mailu/$&#123;DOCKER_PREFIX:-&#125;nginx:$&#123;MAILU_VERSION:-2024.06&#125;</span></span><br><span class="line">    <span class="attr">restart:</span> <span class="string">always</span></span><br><span class="line">    <span class="attr">env_file:</span> <span class="string">mailu.env</span></span><br><span class="line">    <span class="attr">logging:</span></span><br><span class="line">      <span class="attr">driver:</span> <span class="string">journald</span></span><br><span class="line">      <span class="attr">options:</span></span><br><span class="line">        <span class="attr">tag:</span> <span class="string">mailu-front</span></span><br><span class="line">    <span class="attr">ports:</span></span><br><span class="line">    </span><br><span class="line">     <span class="comment">#只要不占用Caddy的80/443端口即可！  </span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:8080:80&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:4433:443&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:25:25&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:465:465&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:587:587&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:110:110&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:995:995&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:143:143&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:993:993&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;172..10.0.1:4190:4190&quot;</span></span><br><span class="line">    <span class="attr">networks:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">default</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">webmail</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">radicale</span></span><br><span class="line">    <span class="attr">volumes:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/mailu/certs:/certs&quot;</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">&quot;/mailu/overrides/nginx:/overrides:ro&quot;</span></span><br><span class="line">    <span class="attr">depends_on:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">resolver</span></span><br><span class="line">    <span class="attr">dns:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="number">192.168</span><span class="number">.203</span><span class="number">.254</span></span><br><span class="line"><span class="string">......</span></span><br><span class="line"></span><br><span class="line"><span class="attr">networks:</span></span><br><span class="line">  <span class="attr">default:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br><span class="line">    <span class="attr">ipam:</span></span><br><span class="line">      <span class="attr">driver:</span> <span class="string">default</span></span><br><span class="line">      <span class="attr">config:</span></span><br><span class="line">        <span class="bullet">-</span> <span class="attr">subnet:</span> <span class="number">192.168</span><span class="number">.203</span><span class="number">.0</span><span class="string">/24</span></span><br><span class="line">  <span class="attr">radicale:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br><span class="line">  <span class="attr">webmail:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br><span class="line">  <span class="attr">oletools:</span></span><br><span class="line">    <span class="attr">driver:</span> <span class="string">bridge</span></span><br><span class="line">    <span class="attr">internal:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>只需要在<code>front:</code>里修改80和443的端口即可</p><p>对于<code>mailu.env</code>，修改以下内容，防止Caddy反代出现<code>502</code>错误 **！很重要！**折腾了一晚上才搞明白</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">REAL_IP_HEADER=X-Real-IP</span><br><span class="line">REAL_IP_FROM=172.10.0.1#你的IP地址</span><br><span class="line">TLS_FLAVOR=mail</span><br></pre></td></tr></table></figure><h3 id="Caddy反代配置"><a href="#Caddy反代配置" class="headerlink" title="Caddy反代配置"></a>Caddy反代配置</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">mail.example.com &#123;</span><br><span class="line">        encode gzip zstd</span><br><span class="line">        tls &#123;</span><br><span class="line">                protocols tls1.3</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        header &#123;</span><br><span class="line">                Strict-Transport-Security &quot;max-age=63072000; includeSubDomains; preload&quot; # HSTS</span><br><span class="line">                Referrer-Policy strict-origin-when-cross-origin</span><br><span class="line">                X-Permitted-Cross-Domain-Policies &quot;none&quot;</span><br><span class="line">                X-Frame-Options SAMEORIGIN</span><br><span class="line">                X-Content-Type-Options nosniff</span><br><span class="line">                X-XSS-Protection &quot;1; mode=block&quot;</span><br><span class="line">                -Server</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        reverse_proxy 172.16.0.3:8080 #请自行修改</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接下来，重启Caddy，让Caddy自动获取证书</p><p>Caddy 的默认证书目录为 <code>/var/lib/caddy/.local/share/caddy/certificates/</code></p><ul><li><code>mail.exmaple.com.crt</code>对应<code>/mailu/certs/cert.pem</code></li><li><code>mail.exmaple.com.key</code>对应<code>/mailu/certs/key.pem</code></li></ul><h2 id="运行Mailu"><a href="#运行Mailu" class="headerlink" title="运行Mailu"></a>运行Mailu</h2><p>上传配置，启动docker</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose -p mailu up -d</span><br></pre></td></tr></table></figure><p>创建管理员账户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">docker-compose -p mailu <span class="built_in">exec</span> admin flask mailu admin hi MAIL.EXAMPLE.COM <span class="string">&#x27;PASSWORD&#x27;</span></span><br></pre></td></tr></table></figure><p>请修改域名和密码后再运行</p><h2 id="配置记录…"><a href="#配置记录…" class="headerlink" title="配置记录…"></a>配置记录…</h2><p>下面是更为详细、完整的配置：</p><p><a href="https://blog.sanae.im/posts/mail-hosting-with-mailu/">Mailu 搭建邮局的不完全指南 - Sanae</a></p><p><a href="https://www.ctmh.top/p/%E5%AE%89%E8%A3%85%E5%92%8C%E9%85%8D%E7%BD%AE%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6-mailu/">安装和配置电子邮件服务端软件 Mailu - CTmH</a></p>]]>
    </content>
    <id>https://blog.vconet.top/archives/mailu-with-caddy/</id>
    <link href="https://blog.vconet.top/archives/mailu-with-caddy/"/>
    <published>2024-08-14T03:24:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="网络要求"><a href="#网络要求" class="headerlink" title="网络要求"></a>网络要求</h2><p>首先安装docker，并确保服务器的25端口开放，可使用<code>telnet</code>检查</p>]]>
    </summary>
    <title>Caddy反向代理搭建Mailu邮局踩坑记录</title>
    <updated>2024-08-14T03:24:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Archlinux" scheme="https://blog.vconet.top/tags/Archlinux/"/>
    <category term="Secure Boot" scheme="https://blog.vconet.top/tags/Secure-Boot/"/>
    <content>
      <![CDATA[<div class="tag-plugin blockquote" indent="undefined"><p>已有更简单的方法，此文仅作参考</p></div><h2 id="Archboot的启动"><a href="#Archboot的启动" class="headerlink" title="Archboot的启动"></a>Archboot的启动</h2><h3 id="MOK导入hash"><a href="#MOK导入hash" class="headerlink" title="MOK导入hash"></a>MOK导入hash</h3><p>正常情况下，会遇到下面的错误：</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1353782601.png" data-src="https://static.vconet.top/1353782601.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>按下回车，进入如图界面：</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1266056781.png" data-src="https://static.vconet.top/1266056781.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>选择<code>Enroll hash from disk</code></p><p>选择以下文件：</p><ul><li><code>ARCHBOOT/EFI/BOOT/</code>内的所有64位efi</li><li><code>ARCHBOOT/boot/vmlinuz-x86_64</code> <strong>！请一定导入导入此文件！</strong></li></ul><span id="more"></span><h2 id="安装前配置"><a href="#安装前配置" class="headerlink" title="安装前配置"></a>安装前配置</h2><h3 id="1-系统时间-硬盘分区"><a href="#1-系统时间-硬盘分区" class="headerlink" title="1. 系统时间&amp;硬盘分区"></a>1. 系统时间&amp;硬盘分区</h3><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">reg add &quot;HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TimeZoneInformation&quot; /v RealTimeIsUniversal /d <span class="number">1</span> /t REG_DWORD /f</span><br></pre></td></tr></table></figure><p>使用WinPE提前预留空间并随意创建一个任何格式的分区，方便之后使用。</p><p><em>这一步请在win系统下完成</em></p><h3 id="2-重启至Archboot"><a href="#2-重启至Archboot" class="headerlink" title="2. 重启至Archboot"></a>2. 重启至Archboot</h3><p>出现下图界面时，按下<code>CTRL-C</code>进入bash</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1611553153.png" data-src="https://static.vconet.top/1611553153.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h3 id="3-更新时间"><a href="#3-更新时间" class="headerlink" title="3. 更新时间"></a>3. 更新时间</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">timedatectl set-ntp <span class="literal">true</span></span><br><span class="line">timedatectl status</span><br></pre></td></tr></table></figure><h3 id="4-更改镜像源"><a href="#4-更改镜像源" class="headerlink" title="4. 更改镜像源"></a>4. 更改镜像源</h3><p>编辑<code>/etc/pacman.d/mirrorlist</code>，保留一个国内镜像即可。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch</span><br><span class="line">#Server = https://mirrors.ustc.edu.cn/archlinux/$repo/os/$arch</span><br><span class="line">#Server = https://repo.huaweicloud.com/archlinux/$repo/os/$arch </span><br><span class="line">... </span><br></pre></td></tr></table></figure><h3 id="5-分区（Btrfs）"><a href="#5-分区（Btrfs）" class="headerlink" title="5. 分区（Btrfs）"></a>5. 分区（Btrfs）</h3><h4 id="5-1-格式化分区"><a href="#5-1-格式化分区" class="headerlink" title="5.1 格式化分区"></a>5.1 格式化分区</h4><p><em><code>nvmeYYY</code>为Arch分区，<code>nvmeXXX</code>为EFI分区。</em></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkfs.btrfs -L Arch /dev/nvmeYYY</span><br><span class="line">mkfs.vfat -F32 /dev/nvmeXXX</span><br></pre></td></tr></table></figure><h4 id="5-2-挂载并创建子卷"><a href="#5-2-挂载并创建子卷" class="headerlink" title="5.2 挂载并创建子卷"></a>5.2 挂载并创建子卷</h4><p><strong>注：Archboot的安装程序识别的挂载点是<code>/mnt/install</code></strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mount -t btrfs -o compress=zstd /dev/nvmeYYY /mnt/install</span><br><span class="line">btrfs subvolume create /mnt/install/@</span><br><span class="line">btrfs subvolume create /mnt/install/@home</span><br><span class="line">btrfs subvolume create /mnt/install/@swap</span><br></pre></td></tr></table></figure><h4 id="5-3-创建挂载点"><a href="#5-3-创建挂载点" class="headerlink" title="5.3 创建挂载点"></a>5.3 创建挂载点</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">umount -R /mnt/install</span><br><span class="line">mount -t btrfs -o subvol=/@ /mnt/install</span><br><span class="line"><span class="built_in">mkdir</span> -p /mnt/install/&#123;boot,swap,home&#125;</span><br><span class="line">umount -R /mnt/install</span><br></pre></td></tr></table></figure><p>请务必卸载分区，稍后使用Archboot的安装程序进行挂载，避免出现grub相关错误！</p><h4 id="5-4-使用Archboot的安装程序挂载分区"><a href="#5-4-使用Archboot的安装程序挂载分区" class="headerlink" title="5.4 使用Archboot的安装程序挂载分区"></a>5.4 使用Archboot的安装程序挂载分区</h4><p>输入<code>setup</code>进入安装程序，选择<code>1. Prepare Storage Device</code></p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1376243170.png"" data-src="https://static.vconet.top/1376243170.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>选择`4. Set Filesystem Mountpoints`<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2836003180.png"" data-src="https://static.vconet.top/2836003180.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>挂载分区，但先不挂载swap分区</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/787811656.png"" data-src="https://static.vconet.top/787811656.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>选择`Root Partition`<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/395864332.png"" data-src="https://static.vconet.top/395864332.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>是否格式化，选择<code>No</code></p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3486442930.png"" data-src="https://static.vconet.top/3486442930.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>选择`@`子卷<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2686367224.png"" data-src="https://static.vconet.top/2686367224.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>选择你需要的压缩算法。</p><p>选择ESP分区</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/4022970064.png"" data-src="https://static.vconet.top/4022970064.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>选择`/boot`<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3429775861.png"" data-src="https://static.vconet.top/3429775861.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>挂载额外分区，过程参考挂载root分区，最后选择<code>DONE</code>，完成挂载</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1338199738.png"" data-src="https://static.vconet.top/1338199738.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/509369114.png"" data-src="https://static.vconet.top/509369114.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p><strong>生成fstab：</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">genfstab -U /mnt/install &gt;&gt; /mnt/install/etc/fstab</span><br></pre></td></tr></table></figure><h3 id="6-安装系统"><a href="#6-安装系统" class="headerlink" title="6. 安装系统"></a>6. 安装系统</h3><h4 id="6-1-安装基本包"><a href="#6-1-安装基本包" class="headerlink" title="6.1 安装基本包"></a>6.1 安装基本包</h4><p>你既可以使用Archboot的安装程序<code>2. Install Packages</code>，也可以在新的tty窗口自行安装</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">pacstrap -K /mnt/install base base-devel linux-zen linux-zen-headers btrfs-progs neovim networkmanager terminus-font intel-ucode polkit</span><br><span class="line"><span class="comment">#AMD请用amd-ucode</span></span><br><span class="line"><span class="comment">#Archboot默认安装以下包 base linux polkit btrfs-progs dosfstools terminus-font linux-firmware</span></span><br><span class="line"><span class="comment">#这里我自行安装（因为我要用linux-zen）</span></span><br></pre></td></tr></table></figure><h4 id="6-2-配置"><a href="#6-2-配置" class="headerlink" title="6.2 配置"></a>6.2 配置</h4><p>可通过Archboot的安装程序进行，也可通过<code>arch-chroot /mnt/install</code>进行</p><p>自行配置和各文件样例请移步 <a href="https://arch.icekylin.online/guide/rookie/basic-install#_11-change-root">archlinux基础安装</a></p><p><em>MKINITCPIO EARLY USERSPACE安装程序提供<code>Busybox</code>和<code>Systemd</code>，建议选择<code>Systemd</code></em></p><h2 id="安装引导"><a href="#安装引导" class="headerlink" title="安装引导"></a>安装引导</h2><p>借助Archboot的安装程序，选择<code>4. Install BootLoader</code></p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1376243170.png"" data-src="https://static.vconet.top/1376243170.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>**注：当你使用linux-zen时，你需要在下面的grub配置中添加`-zen`后缀，否则无法正常引导**他们分别是：`/vmlinuz-linux`和`/initramfs-linux`，修改为`/vmlinuz-linux-zen`和`/initramfs-linux-zen`<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/1703369685.png"" data-src="https://static.vconet.top/1703369685.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>确认秘钥保存位置</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3884907924.png"" data-src="https://static.vconet.top/3884907924.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>自定义CN名<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3704478207.png"" data-src="https://static.vconet.top/3704478207.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><p>输入MOK导入时需要的密码（简单即可），重复输入两遍</p><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2718746299.png"" data-src="https://static.vconet.top/2718746299.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>**最后一步：**进入新tty，编辑`/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook`更改`Target = linux`为你所用的内核，如`Target = linux-zen`，并重新安装：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pacman -S linux-zen</span><br></pre></td></tr></table></figure>完成kernel签名，重启，进入MOK，导入秘钥：<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/341545030.png"" data-src="https://static.vconet.top/341545030.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/2592697574.png"" data-src="https://static.vconet.top/2592697574.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>大功告成：<div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/3707769520.png"" data-src="https://static.vconet.top/3707769520.png""onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><h2 id="后续"><a href="#后续" class="headerlink" title="后续"></a>后续</h2><p>请自行参阅<a href="https://arch.icekylin.online/guide/rookie/desktop-env-and-app.html">桌面环境与常用应用安装</a>和我的文章<a href="https://blog.vconet.top/archives/linux-advise">Linux实用建议</a></p>]]>
    </content>
    <id>https://blog.vconet.top/archives/arch-secure-boot-by-archboot/</id>
    <link href="https://blog.vconet.top/archives/arch-secure-boot-by-archboot/"/>
    <published>2024-07-23T02:26:00.000Z</published>
    <summary>借助Archboot安装Archlinux并开启安全启动</summary>
    <title>借助Archboot安装Archlinux并开启安全启动</title>
    <updated>2024-07-23T02:26:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="Archlinux" scheme="https://blog.vconet.top/tags/Archlinux/"/>
    <category term="gaoman" scheme="https://blog.vconet.top/tags/gaoman/"/>
    <content>
      <![CDATA[<p>这是一篇水文~ 记录一下 Linux 下使用手绘板的自定义按键和滚轮</p><span id="more"></span><h2 id="步骤如下"><a href="#步骤如下" class="headerlink" title="步骤如下"></a>步骤如下</h2><ol><li>前往 <a href="https://download.gaomon.net/">GAOMON Global</a>, 在<code>-- System --</code>中选择<code>linux</code></li><li>找到最近更新的版本, 选择<code>tar.xz</code>包</li></ol>  <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1170/509;"><img class="lazy" src="https://static.vconet.top/1581599333.png" data-src="https://static.vconet.top/1581599333.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><ol start="3"><li>解压, 并安装<br> <code>sudo sh ./install.sh</code></li></ol>  <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1203/838;"><img class="lazy" src="https://static.vconet.top/1593736443.png" data-src="https://static.vconet.top/1593736443.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><ol start="4"><li>重启</li></ol>  <div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1157/694;"><img class="lazy" src="https://static.vconet.top/54814282.png" data-src="https://static.vconet.top/54814282.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div><ol start="5"><li>卸载<br>  <code>sudo sh ./uninstall.sh</code></li></ol>  <div class="tag-plugin image"><div class="image-bg"><img class="lazy" src="https://static.vconet.top/4041421958.png" data-src="https://static.vconet.top/4041421958.png"onerror="this.src=&quot;data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2rem' height='2rem' viewBox='0 0 24 24'%3E%3C!-- Icon from Solar by 480 Design - https://creativecommons.org/licenses/by/4.0/ --%3E%3Cpath fill='%23F44336' d='M22 12.698c-.002 1.47-.013 2.718-.096 3.743c-.097 1.19-.296 2.184-.74 3.009a4.2 4.2 0 0 1-.73.983c-.833.833-1.893 1.21-3.237 1.39C15.884 22 14.2 22 12.053 22h-.106c-2.148 0-3.83 0-5.144-.177c-1.343-.18-2.404-.557-3.236-1.39c-.738-.738-1.12-1.656-1.322-2.795c-.2-1.12-.236-2.512-.243-4.241Q1.999 12.737 2 12v-.054c0-2.148 0-3.83.177-5.144c.18-1.343.557-2.404 1.39-3.236s1.893-1.21 3.236-1.39c1.168-.157 2.67-.175 4.499-.177a.697.697 0 1 1 0 1.396c-1.855.002-3.234.018-4.313.163c-1.189.16-1.906.464-2.436.994S3.72 5.8 3.56 6.99C3.397 8.2 3.395 9.788 3.395 12v.784l.932-.814a2.14 2.14 0 0 1 2.922.097l3.99 3.99a1.86 1.86 0 0 0 2.385.207l.278-.195a2.79 2.79 0 0 1 3.471.209l2.633 2.37c.265-.557.423-1.288.507-2.32c.079-.972.09-2.152.091-3.63a.698.698 0 0 1 1.396 0' opacity='.5'/%3E%3Cpath fill='%23F44336' fill-rule='evenodd' d='M17.5 11c-2.121 0-3.182 0-3.841-.659S13 8.621 13 6.5s0-3.182.659-3.841S15.379 2 17.5 2s3.182 0 3.841.659S22 4.379 22 6.5s0 3.182-.659 3.841S19.621 11 17.5 11m-1.47-7.03a.75.75 0 1 0-1.06 1.06l1.47 1.47l-1.47 1.47a.75.75 0 0 0 1.06 1.06l1.47-1.47l1.47 1.47a.75.75 0 1 0 1.06-1.06L18.56 6.5l1.47-1.47a.75.75 0 0 0-1.06-1.06L17.5 5.44z' clip-rule='evenodd'/%3E%3C/svg%3E&quot;"/><div class="lazy-icon" style="background-image:url(https://api.iconify.design/eos-icons:three-dots-loading.svg?color=%231cd0fd);"></div></div></div>]]>
    </content>
    <id>https://blog.vconet.top/archives/gaomon-linux-tablet/</id>
    <link href="https://blog.vconet.top/archives/gaomon-linux-tablet/"/>
    <published>2024-06-26T03:07:00.000Z</published>
    <summary>
      <![CDATA[<p>这是一篇水文~ 记录一下 Linux 下使用手绘板的自定义按键和滚轮</p>]]>
    </summary>
    <title>高漫M6的Linux版GaomonTablet</title>
    <updated>2024-06-26T03:07:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Windows" scheme="https://blog.vconet.top/categories/Windows/"/>
    <category term="Git" scheme="https://blog.vconet.top/tags/Git/"/>
    <category term="Windows" scheme="https://blog.vconet.top/tags/Windows/"/>
    <content>
      <![CDATA[<h2 id="MinGit安装的排错记录"><a href="#MinGit安装的排错记录" class="headerlink" title="MinGit安装的排错记录"></a>MinGit安装的排错记录</h2><ul><li>安装后运行报错</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">fatal: exceeded maximum include depth (10) while including</span><br><span class="line">        C:/Program Files/Git/etc/gitconfig</span><br><span class="line">from</span><br><span class="line">        C:/Program Files/Git/etc/gitconfig</span><br><span class="line">This might be due to circular includes.</span><br></pre></td></tr></table></figure><span id="more"></span><p>编辑<code>C:/Program Files/Git/etc/gitconfig</code>删除<code>[include]</code>段</p><ul><li>git push报错</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">schannel: next InitializeSecurityContext failed: CRYPT_E_NO_REVOCATION_CHECK (0x80092012)</span><br></pre></td></tr></table></figure><p>编辑<code>C:/Program Files/Git/etc/gitconfig</code>, 添加:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[http]</span><br><span class="line">  sslbackend = openssl</span><br></pre></td></tr></table></figure><ul><li>本地https证书<br>报错<code>SSL certificate problem: unable to get local issuer certificate</code>, 解决办法:</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global http.sslCAInfo <span class="string">&quot;/path/to/certificate.crt&quot;</span></span><br></pre></td></tr></table></figure><ul><li>git安全警告<br>报错<code>detected dubious ownership in repository...</code></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global --add safe.directory /path/to/your/project</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://blog.vconet.top/archives/mingit-ins-problem/</id>
    <link href="https://blog.vconet.top/archives/mingit-ins-problem/"/>
    <published>2024-06-22T12:20:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="MinGit安装的排错记录"><a href="#MinGit安装的排错记录" class="headerlink" title="MinGit安装的排错记录"></a>MinGit安装的排错记录</h2><ul>
<li>安装后运行报错</li>
</ul>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">fatal: exceeded maximum include depth (10) while including</span><br><span class="line">        C:/Program Files/Git/etc/gitconfig</span><br><span class="line">from</span><br><span class="line">        C:/Program Files/Git/etc/gitconfig</span><br><span class="line">This might be due to circular includes.</span><br></pre></td></tr></table></figure>]]>
    </summary>
    <title>MinGit安装</title>
    <updated>2024-06-22T12:20:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>VConet</name>
    </author>
    <category term="Linux" scheme="https://blog.vconet.top/categories/Linux/"/>
    <category term="git" scheme="https://blog.vconet.top/tags/git/"/>
    <category term="系统美化" scheme="https://blog.vconet.top/tags/%E7%B3%BB%E7%BB%9F%E7%BE%8E%E5%8C%96/"/>
    <category term="KDE" scheme="https://blog.vconet.top/tags/KDE/"/>
    <category term="Fontconfig" scheme="https://blog.vconet.top/tags/Fontconfig/"/>
    <content>
      <![CDATA[<h2 id="Git配置"><a href="#Git配置" class="headerlink" title="Git配置"></a>Git配置</h2><p>由于国内GFW的存在，在不用魔法的情况下，很难流畅访问Github</p><p>同时，在进行<code>git clone</code>时经常失败，所以需要给<code>git</code>做一点小配置，走<code>ssh</code>而不是默认的<code>http</code></p><span id="more"></span><ol><li>编辑<code>~/.gitconfig</code></li></ol>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[url <span class="string">&quot;git@github.com:&quot;</span>]</span><br><span class="line">    insteadOf = https://github.com/</span><br><span class="line">    insteadOf = https://www.github.com/</span><br><span class="line">    insteadOf = http://github.com/</span><br><span class="line">    insteadOf = git@github.com:</span><br><span class="line">[user]</span><br><span class="line">    name = <span class="comment">#你的用户名#</span></span><br><span class="line">    email = <span class="comment">#你的邮箱#</span></span><br></pre></td></tr></table></figure><p>  添加以上配置</p><ol start="2"><li><p>配置<code>ssh key</code></p></li><li><p>终端里输入<code>ssh-keygen -t ed25519 -C &quot;#你的邮箱#&quot;</code>一路默认回车即可[^1]</p></li><li><p>打开<code>~/.ssh/id_ed25519.pub</code>，打开<a href="https://github.com/settings/keys">Github SSH GPG keys配置</a>添加刚刚复制的key[^2]</p></li></ol><p>  测试：在终端里输入<code>ssh -T git@github.com</code>，得到以下输出即为成功：</p>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Hi #你的用户名#! You&#x27;ve successfully authenticated, but GitHub does not provide shell access.</span><br></pre></td></tr></table></figure><h2 id="软件"><a href="#软件" class="headerlink" title="软件"></a>软件</h2><h3 id="音视频"><a href="#音视频" class="headerlink" title="音视频"></a>音视频</h3><ul><li>VLC&#x2F;mpv</li><li>QQ&#x2F;网易云音乐&#x2F;Yes  Play Music&#x2F;Spotify</li></ul><h3 id="文档"><a href="#文档" class="headerlink" title="文档"></a>文档</h3><ul><li>pdf&#x2F;epub等：<code>Okular</code></li><li>Office：<code>WPS</code>或<code>Libreoffice</code><blockquote><p>对于WPS中设置为粗体的字体糊成一团的问题，请下载旧版freetype，如2.13.0[^3]<br>Archlinux用户可安装<a href="https://aur.archlinux.org/packages/freetype2-wps">freetype2-wps</a></p></blockquote></li><li>P图：<code>GIMP</code>或是<code>Photoshop</code></li><li>看图：<code>Gwenview</code></li><li>截图：<code>flameshot</code></li></ul><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><h3 id="更好的终端-4"><a href="#更好的终端-4" class="headerlink" title="更好的终端[^4]"></a>更好的终端[^4]</h3><ol><li><p>安装<code>zsh</code>，通过<code>chsh</code>更改默认shell为<code>/usr/bin/zsh</code></p><blockquote><p>Konsole需要手动设置更改shell</p></blockquote></li><li><p>安装<code>zim</code></p><p><code>curl -fsSL https://raw.githubusercontent.com/zimfw/install/master/install.zsh | zsh</code></p><p>编辑<code>~/.zimrc</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">#添加下面的插件</span><br><span class="line">zmodule romkatv/powerlevel10k</span><br></pre></td></tr></table></figure></li><li><p>输入<code>zimfw install</code></p></li></ol><h3 id="KDE-半中半英-5"><a href="#KDE-半中半英-5" class="headerlink" title="KDE 半中半英[^5]"></a>KDE 半中半英[^5]</h3><p>编辑<code>~/.config/plasma-localerc</code>并修改下面两项</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">[Formats]</span><br><span class="line">LANG=zh_CN.UTF-8</span><br><span class="line"></span><br><span class="line">[Translations]</span><br><span class="line">LANGUAGE=zh_CN:en_US</span><br></pre></td></tr></table></figure><h3 id="系统字体小修小补"><a href="#系统字体小修小补" class="headerlink" title="系统字体小修小补"></a>系统字体小修小补</h3><p>你会发现上面的<code>powerlevel10k</code>安装后，字体显示很怪，需要我们配置一下字体</p><p>请参考：</p><ul><li><a href="https://catcat.cc/post/2021-03-07/">用 fontconfig 治理 Linux 中的字体</a></li><li><a href="https://szclsya.me/zh-cn/posts/fonts/linux-config-guide/">Linux 下的字体调校指南</a></li></ul><hr><p>NVdia驱动安装，版本不一，自行搜索</p><p>有困难可以看看Arch Wiki</p>]]>
    </content>
    <id>https://blog.vconet.top/archives/linux-advise/</id>
    <link href="https://blog.vconet.top/archives/linux-advise/"/>
    <published>2024-06-21T01:49:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="Git配置"><a href="#Git配置" class="headerlink" title="Git配置"></a>Git配置</h2><p>由于国内GFW的存在，在不用魔法的情况下，很难流畅访问Github</p>
<p>同时，在进行<code>git clone</code>时经常失败，所以需要给<code>git</code>做一点小配置，走<code>ssh</code>而不是默认的<code>http</code></p>]]>
    </summary>
    <title>Linux 实用建议</title>
    <updated>2024-06-21T01:49:00.000Z</updated>
  </entry>
</feed>
