<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Linux on 欧式fifty 嘅 blog</title><link>https://blog.ous50.moe/yue-cn/categories/linux/</link><description>Recent content in Linux on 欧式fifty 嘅 blog</description><generator>Hugo -- gohugo.io</generator><language>yue-cn</language><copyright>欧式fifty 2020-</copyright><lastBuildDate>Thu, 29 Jan 2026 00:58:18 +0800</lastBuildDate><atom:link href="https://blog.ous50.moe/yue-cn/categories/linux/index.xml" rel="self" type="application/rss+xml"/><item><title>我係点样喺 RouterOS 用 OSPF 同 PVE 上嘅 ShellCrash 搞个无感网络</title><link>https://blog.ous50.moe/yue-cn/p/%E6%88%91%E4%BF%82%E7%82%B9%E6%A0%B7%E5%96%BA-routeros-%E7%94%A8-ospf-%E5%90%8C-pve-%E4%B8%8A%E5%98%85-shellcrash-%E6%90%9E%E4%B8%AA%E6%97%A0%E6%84%9F%E7%BD%91%E7%BB%9C/</link><pubDate>Thu, 29 Jan 2026 00:58:18 +0800</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E6%88%91%E4%BF%82%E7%82%B9%E6%A0%B7%E5%96%BA-routeros-%E7%94%A8-ospf-%E5%90%8C-pve-%E4%B8%8A%E5%98%85-shellcrash-%E6%90%9E%E4%B8%AA%E6%97%A0%E6%84%9F%E7%BD%91%E7%BB%9C/</guid><description>

&lt;style&gt;
 .light-quote { font-weight: 300; }
 .bold-quote { font-weight: 700; }
 .extrabold-quote { font-weight: 900}
&lt;/style&gt;


 &lt;blockquote class="gh-blockquote gh-note"&gt;
 &lt;span class="extrabold-quote"&gt;Note&lt;/span&gt;
 &lt;br&gt;

 呢篇文章係基于 &lt;strong&gt;2026年1月29日&lt;/strong&gt; 嘅环境写嘅，RouterOS 版本係 &lt;code&gt;7.20.1&lt;/code&gt;，ShellCrash 版本係 &lt;code&gt;1.9.4beta6&lt;/code&gt;，两个都係喺 PVE 上面跑嘅 KVM。如果你用紧唔同版本嘅 RouterOS 或者 ShellCrash，内容可能会有啲出入，大家自己执生啦。
 &lt;/blockquote&gt;


&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介
&lt;/h2&gt;&lt;p&gt;之前我係用 DHCP 指定 Gateway 嘅方法令网络入面嘅机用 Proxy。虽然呢招都可以做到无感 Proxy，但我无办法将呢种体验扩展到全部机度，因为 ShellCrash 有时真係会“Crash（瓜柴）”，咁就会直接搞到正常上网都受影响。我对 OSPF 呢个功能听咗好耐，所以最近跟住 &lt;a class="link" href="https://deeprouter.org/article/routeros-ospf-intelligent-traffic-split" target="_blank" rel="noopener"
 &gt;DeepRouter 篇文章&lt;/a&gt; 喺 RouterOS 上面 Set 咗 OSPF。呢篇文主要係用来记低我嘅折腾经验，同埋分享下我点样令成个係统稳阵啲 (Robustness)。&lt;/p&gt;
&lt;h2 id="shellcrash-同-bird-嘅配置"&gt;&lt;a href="#shellcrash-%e5%90%8c-bird-%e5%98%85%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;ShellCrash 同 Bird 嘅配置
&lt;/h2&gt;&lt;p&gt;虽然将 ShellCrash 同 BIRD 放喺唔同 Instance 跑都得，但我 &lt;strong&gt;极度建议&lt;/strong&gt; 放喺同一个 Instance 入面。&lt;/p&gt;
&lt;p&gt;ShellCrash 安装过程就唔讲啦，记得喺 DNS 配置度用 MIX 模式（按 &lt;code&gt;2&lt;/code&gt; (功能设置) - &lt;code&gt;2&lt;/code&gt; (DNS 设置)）。&lt;/p&gt;
&lt;h3 id="check-下-ipv4-同-ipv6-forward-配置"&gt;&lt;a href="#check-%e4%b8%8b-ipv4-%e5%90%8c-ipv6-forward-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;Check 下 IPv4 同 IPv6 Forward 配置
&lt;/h3&gt;&lt;p&gt;Run 下 &lt;code&gt;sudo sysctl -p&lt;/code&gt; 睇下下面几行係咪 Set 好咗：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv4.ip_forward=1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;net.ipv6.conf.all.forwarding=1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果未，就改下 &lt;code&gt;/etc/sysctl.conf&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id="bird"&gt;&lt;a href="#bird" class="header-anchor"&gt;&lt;/a&gt;BIRD
&lt;/h3&gt;&lt;p&gt;我哋会用 &lt;a class="link" href="https://github.com/ous50/nchnroutes" target="_blank" rel="noopener"
 &gt;!chnroutes&lt;/a&gt; 来分返开国内 IP。&lt;/p&gt;
&lt;p&gt;装完 bird 之后，记住千祈唔好即刻着咗佢 (start service)。我哋要搞掂啲配置先。&lt;/p&gt;
&lt;p&gt;Debian 嘅话：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bird2 make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="birdconf"&gt;&lt;a href="#birdconf" class="header-anchor"&gt;&lt;/a&gt;bird.conf
&lt;/h4&gt;&lt;p&gt;Edit 下 &lt;code&gt;/etc/bird/bird.conf&lt;/code&gt; 跟住下面咁改。&lt;/p&gt;
&lt;p&gt;记得 Check 清楚：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;router id&lt;/code&gt; 係你 ShellCrash/BIRD 嗰个 Instance 嘅 IP。&lt;/li&gt;
&lt;li&gt;ospf v2 同 v3 入面嘅 &lt;code&gt;interface&lt;/code&gt; 都要 Set 做连去 Gateway（LAN口）嗰张网卡。
你可以用 &lt;code&gt;ip a&lt;/code&gt; 或者 &lt;code&gt;ip link&lt;/code&gt; 来睇，揾嗰个 &lt;strong&gt;唔係&lt;/strong&gt; &lt;code&gt;lo&lt;/code&gt; 嘅 interface 就係啦。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;log&lt;/span&gt; &lt;span class="n"&gt;syslog&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="mf"&gt;192.168&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;114.51&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;# 这里改做你 Instance 嘅 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scan&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;kernel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;import&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes4.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/etc/bird/routes6.conf&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv4&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# 改做你张网卡个名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="n"&gt;ospf&lt;/span&gt; &lt;span class="n"&gt;v3&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ipv6&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ens18&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;# 改做你张网卡个名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pointopoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="generate-啲-route-出来"&gt;&lt;a href="#generate-%e5%95%b2-route-%e5%87%ba%e6%9d%a5" class="header-anchor"&gt;&lt;/a&gt;Generate 啲 Route 出来
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果你连 github.com 有困难，可以用 Mirror：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://hk.gh-proxy.org/https://github.com/ous50/nchnroutes.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; nchnroutes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;见到下面呢啲 Output 就即係搞掂，可以继续：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;python3 produce.py
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes4.conf /etc/bird/routes4.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv routes6.conf /etc/bird/routes6.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo birdc configure
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BIRD 2.0.12 ready.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reading configuration from /etc/bird/bird.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reconfigured
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="routeros-配置"&gt;&lt;a href="#routeros-%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;RouterOS 配置
&lt;/h2&gt;&lt;p&gt;你需要先 Set 好个旁路路由表，防止 OSPF 邻居一建立就好易 Loop 死 (infinite loop)。&lt;/p&gt;
&lt;h3 id="bypass-shellcrash-防止-loop-同埋-set-例外"&gt;&lt;a href="#bypass-shellcrash-%e9%98%b2%e6%ad%a2-loop-%e5%90%8c%e5%9f%8b-set-%e4%be%8b%e5%a4%96" class="header-anchor"&gt;&lt;/a&gt;Bypass ShellCrash 防止 Loop 同埋 Set 例外
&lt;/h3&gt;&lt;p&gt;我哋会整多张 Routing Table 来 Bypass 来自 ShellCrash 嘅流量，费事佢 Loop。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no fib name=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing rule
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=lookup-only-in-table comment=&amp;#34;Bypass Shellcrash Gateway using Routing Mark&amp;#34; disabled=no routing-mark=bypass-shellcrash table=bypass-shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将你 Default Route 从 &lt;code&gt;main&lt;/code&gt; 表搬去 &lt;code&gt;bypass-shellcrash&lt;/code&gt; 表：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gdscript3" data-lang="gdscript3"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="n"&gt;route&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;你个&lt;/span&gt; &lt;span class="n"&gt;LAN&lt;/span&gt; &lt;span class="err"&gt;网段带&lt;/span&gt; &lt;span class="n"&gt;CIDR&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;lan&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add&lt;/span&gt; &lt;span class="n"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;gateway&lt;/span&gt;&lt;span class="o"&gt;=&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;你个&lt;/span&gt; &lt;span class="n"&gt;Internet&lt;/span&gt; &lt;span class="n"&gt;Gateway&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;bypass&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;shellcrash&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="n"&gt;suppress&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;hw&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;offload&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="firewall-tagging-mangle"&gt;&lt;a href="#firewall-tagging-mangle" class="header-anchor"&gt;&lt;/a&gt;Firewall Tagging (Mangle)
&lt;/h4&gt;&lt;p&gt;记得留意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;将 dst-address 改做你嘅 LAN 网段，前面的感叹号 &lt;code&gt;!&lt;/code&gt; 要留返喺度。&lt;/li&gt;
&lt;li&gt;将 src-mac-address 改做 ShellCrash 嗰张网卡嘅 MAC Address（可以喺 ShellCrash 入面打 &lt;code&gt;ip link&lt;/code&gt; 睇，或者直接喺 PVE 界面睇都得）。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/ip firewall mangle
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add action=mark-routing chain=prerouting comment=bypass-shellcrash-gateway dst-address=!192.168.0.0/23 new-routing-mark=bypass-shellcrash src-mac-address=11:45:14:19:19:81
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ospf-config"&gt;&lt;a href="#ospf-config" class="header-anchor"&gt;&lt;/a&gt;OSPF Config
&lt;/h3&gt;&lt;p&gt;默认来讲，呢段 Script 你咩都唔使改。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf instance
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no name=shellcrash-v6 version=3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf area
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash name=ospf-area-v4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add disabled=no instance=shellcrash-v6 name=ospf-area-v6
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/routing ospf interface-template
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v4 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;add area=ospf-area-v6 cost=10 disabled=no priority=32 type=ptp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="醒目-tips-tricks"&gt;&lt;a href="#%e9%86%92%e7%9b%ae-tips-tricks" class="header-anchor"&gt;&lt;/a&gt;醒目 Tips (Tricks)
&lt;/h2&gt;&lt;h3 id="稳阵嘅-dns-setting"&gt;&lt;a href="#%e7%a8%b3%e9%98%b5%e5%98%85-dns-setting" class="header-anchor"&gt;&lt;/a&gt;稳阵嘅 DNS Setting
&lt;/h3&gt;&lt;p&gt;因为 ShellCrash 用咗 &lt;code&gt;fake-ip&lt;/code&gt; 模式，你应该将 ShellCrash 嘅 DNS Set 做上游。&lt;/p&gt;
&lt;p&gt;喺呢个 Case 入面，我哋假设将 RouterOS 嘅 DNS 派俾 Client，跟住用下面呢段 RouterOS Script 动态 Update 上游 DNS，咁样稳阵啲，万一 ShellCrash 瓜咗都唔会搞到全屋断网。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global ospfInstance &amp;#34;shellsrash&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global ospfDNS &amp;#34;1.1.4.5&amp;#34; # 你个 ShellCrash Instance IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:global publicDNS &amp;#34;223.5.5.5&amp;#34; # 这里改做你用来直接上网个 Public DNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# (true / false), Test 完记得关咗 Debug 佢，如果唔係个 Log 会好鬼烦。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local DEBUG false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Mark 低个最终状态，Default 係 false (down)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local isOspfActive false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 尝试揾邻居
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local neighborIds [/routing ospf neighbor find instance=$ospfInstance]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# Check 下揾唔揾到
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:if ([:len $neighborIds] &amp;gt; 0) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # Note: 呢度我哋假设只用一个 Instance。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果你有几个 Instance，可能要 Loop 下去揾。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :local neighborState [/routing ospf neighbor get ($neighborIds-&amp;gt;0) state]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Neighbor found! State: $neighborState&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 只有当状态係 &amp;#34;Full&amp;#34; 先当 OSPF Active。记住係 &amp;#34;Full&amp;#34; 唔係 &amp;#34;full&amp;#34;。呢个状态名喺唔同 RouterOS 版本可能有分别。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($neighborState = &amp;#34;Full&amp;#34;) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :set isOspfActive true
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;} else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # 如果长度係 0，即係揾唔到邻居。Check 下 bird 配置/状态啦。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] No OSPF neighbor found. Logic assumes DOWN.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :set isOspfActive false
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 根据 isOspfActive 呢个变量来改 DNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:local currentDNS [/ip dns get servers]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;:if ($isOspfActive) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # OSPF Up 咗
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Decision: OSPF is UP.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($currentDNS != $ospfDNS) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :log warning &amp;#34;OSPF Shellcrash Up: Switching to OSPF DNS ($ospfDNS).&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns set servers=$ospfDNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns cache flush
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] DNS is already correct (OSPF).&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;} else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; # OSPF Down 咗 (或者揾唔到邻居)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] Decision: OSPF is DOWN/MISSING.&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($currentDNS != $publicDNS) do={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :log warning &amp;#34;OSPF Shellcrash Down: Switching to Public DNS ($publicDNS).&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns set servers=$publicDNS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /ip dns cache flush
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; } else={
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; :if ($DEBUG) do={:log info &amp;#34;[DEBUG] DNS is already correct (Public).&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="shellcrash-瓜咗嗰阵自动熄-bird"&gt;&lt;a href="#shellcrash-%e7%93%9c%e5%92%97%e5%97%b0%e9%98%b5%e8%87%aa%e5%8a%a8%e7%86%84-bird" class="header-anchor"&gt;&lt;/a&gt;ShellCrash 瓜咗嗰阵自动熄 Bird
&lt;/h3&gt;&lt;p&gt;我哋会用个 bash script 主动 check 住 ShellCrash 仲係咪生勾勾 (alive)。如果 API 连唔到，佢就会停咗个 Bird Service 嚟收返啲 OSPF Route。&lt;/p&gt;
&lt;p&gt;Copy 下面段 Code 再 Paste 入你 PVE 个 Shell 度（用 &lt;code&gt;clash&lt;/code&gt; user 登录，或者用有 sudo 权限嘅 user）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 整返个 Watchdog script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Note: 我哋用 &amp;#39;EOF&amp;#39; (带引号) 来防止 Create 嗰阵啲变量被 Expand 咗。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /home/clash/check_clash.sh &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;API_URL=&amp;#34;http://127.0.0.1:9999/&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LOG_FILE=&amp;#34;/home/clash/clash_watchdog.log&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;DEBUG=false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;INTERVAL=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Init 状态 (0=唔知, 1=正常, 2=瓜咗)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;LAST_STATE=0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;while true; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # Check ShellCrash API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; HTTP_CODE=$(curl -s -m 1 -o /dev/null -w &amp;#34;%{http_code}&amp;#34; &amp;#34;$API_URL&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[DEBUG] Dashboard code: $HTTP_CODE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$HTTP_CODE&amp;#34; == &amp;#34;200&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash 生存
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;1&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # 用 systemctl 个 return code 睇下 Bird 有无跑紧 (稳阵啲)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl is-active --quiet bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; BIRD_EXIT_CODE=$?
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ $BIRD_EXIT_CODE -ne 0 ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;ShellCrash detected. Starting Bird...&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] ShellCrash recovered/detected. Starting Bird...&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl start bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # ShellCrash 瓜咗
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$LAST_STATE&amp;#34; != &amp;#34;2&amp;#34; ]; then
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; DATE=$(date &amp;#34;+%Y-%m-%d %H:%M:%S&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; if [ &amp;#34;$DEBUG&amp;#34; = &amp;#34;true&amp;#34; ]; then 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!&amp;#34; &amp;gt;&amp;gt; $LOG_FILE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sudo systemctl stop bird
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; LAST_STATE=2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; fi
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sleep $INTERVAL
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 俾个 Execute 权限佢&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod +x /home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 整返个 Systemd Service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo tee /etc/systemd/system/clash-watchdog.service &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Description=ShellCrash Watchdog for Bird OSPF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;After=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;User=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Group=clash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ExecStart=/home/clash/check_clash.sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RestartSec=3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4. Enable 同 Start 佢&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl status clash-watchdog.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>喺 PVE 上安装 EasyTier</title><link>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-easytier/</link><pubDate>Tue, 26 Aug 2025 10:30:16 +0800</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-easytier/</guid><description>&lt;h2 id="安装-easytier"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-easytier" class="header-anchor"&gt;&lt;/a&gt;安装 EasyTier
&lt;/h2&gt;&lt;p&gt;如果你嘅网络提供商干扰咗 GitHub，你可以用以下命令嚟安装 EasyTier：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://ghfast.top/https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install --gh-proxy https://ghfast.top/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你可以喺&lt;a class="link" href="https://ghproxy.link" target="_blank" rel="noopener"
 &gt;呢度&lt;/a&gt;检查最新嘅代理。&lt;/p&gt;
&lt;p&gt;否则，只需用默认嘅 GitHub URL。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt update -y sudo unzip openssl 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O /tmp/easytier.sh &lt;span class="s2"&gt;&amp;#34;https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo bash /tmp/easytier.sh install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl disable --now easytier@default.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="启用-easytier-服务"&gt;&lt;a href="#%e5%90%af%e7%94%a8-easytier-%e6%9c%8d%e5%8a%a1" class="header-anchor"&gt;&lt;/a&gt;启用 EasyTier 服务
&lt;/h2&gt;&lt;h3 id="用-easytier-仪表板进行管理"&gt;&lt;a href="#%e7%94%a8-easytier-%e4%bb%aa%e8%a1%a8%e6%9d%bf%e8%bf%9b%e8%a1%8c%e7%ae%a1%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;用 easytier 仪表板进行管理
&lt;/h3&gt;&lt;p&gt;如果你希望用 easytier 仪表板进行管理，可以用以下命令启用该服务：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;你嘅用户名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Description=EasyTier Service
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;After=network.target syslog.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Wants=network.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Type=simple
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ExecStart=/usr/sbin/easytier-core -w &lt;/span&gt;&lt;span class="nv"&gt;$USER&lt;/span&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/systemd/system/easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now easytier.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后你就可以喺 &lt;a class="link" href="https://easytier.cn/web" target="_blank" rel="noopener"
 &gt;https://easytier.cn/web&lt;/a&gt; 访问 EasyTier 仪表板啦。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;请注意：你需要先喺 EasyTier 仪表板度注册账号再启用该功能。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h3 id="手动配置"&gt;&lt;a href="#%e6%89%8b%e5%8a%a8%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;手动配置
&lt;/h3&gt;&lt;p&gt;直接跟住&lt;a class="link" href="https://easytier.cn/guide/network/install-as-a-systemd-service.html" target="_blank" rel="noopener"
 &gt;官方文档&lt;/a&gt;进行配置就得。&lt;/p&gt;</description></item><item><title>我嘅 FnOS 私家配置同贴士</title><link>https://blog.ous50.moe/yue-cn/p/%E6%88%91%E5%98%85-fnos-%E7%A7%81%E5%AE%B6%E9%85%8D%E7%BD%AE%E5%90%8C%E8%B4%B4%E5%A3%AB/</link><pubDate>Fri, 08 Aug 2025 11:26:29 +0800</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E6%88%91%E5%98%85-fnos-%E7%A7%81%E5%AE%B6%E9%85%8D%E7%BD%AE%E5%90%8C%E8%B4%B4%E5%A3%AB/</guid><description>&lt;p&gt;本文专注于&lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;飞牛OS&lt;/a&gt;使用时嘅优化。如果想知点样喺 PVE 或者实体机度装飞牛OS，可以睇返&lt;a class="link" href="../%e5%96%ba-proxmox-ve-pve-%e4%b8%8a%e9%9d%a2%e8%a3%85-fnos" &gt;上一篇文章&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="网络优化"&gt;&lt;a href="#%e7%bd%91%e7%bb%9c%e4%bc%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;网络优化
&lt;/h2&gt;&lt;p&gt;下面呢啲步骤可以提高网络吞吐量同保障私隐。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;行呢个 script 嚟开 BBR 拥塞控制算法:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-bbr.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.core.default_qdisc=fq
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv4.tcp_congestion_control=bbr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;唔使重启就可以应用BBR配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-bbr.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行呢个脚本嚟开最新嘅 IPv6 私隐地址标准（RFC 7217 同 RFC 4941）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-enable-private-ipv6.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.use_tempaddr = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.addr_gen_mode=1
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;应用sysctl配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-enable-private-ipv6.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;🚨 &lt;strong&gt;警告&lt;/strong&gt;：唔好喺 FnOS Web 介面用“EUI-64”呢个选项。咁做会喺 IPv6 地址度&lt;strong&gt;暴露设备嘅 MAC 地址，搞到啲私隐增强功能冇晒用&lt;/strong&gt;。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用网络变更&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要启用新嘅 IPv6 地址设定，就要重置个网络接口。用 &lt;code&gt;nmcli&lt;/code&gt; 就搞得掂，唔使成个系统重启。&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;🚨 重要提示&lt;/strong&gt;：喺 PVE Web 控制台 (&lt;code&gt;Xterm.js&lt;/code&gt;) 度行呢啲命令，因为如果用 SSH 行，&lt;strong&gt;IPv6 地址一变就会断线&lt;/strong&gt;，而且可能连唔返。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;步骤 1：搵出连接个名&lt;/strong&gt;
列晒所有连紧嘅连接，搵主接口个名。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection show
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输出会列出可以用嘅连接。记低你个以太网连接嘅名，通常系 &lt;code&gt;Wired connection 1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;步骤 2：重置连接&lt;/strong&gt;
用啱啱搵到嘅名嚟重启网络接口：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nmcli connection down &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; nmcli connection up &lt;span class="s2"&gt;&amp;#34;Wired connection 1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;网络接口会重启。你可以用 &lt;code&gt;ip a&lt;/code&gt; 或者喺 PVE Web 控制台嘅虚拟机 &lt;code&gt;Summary&lt;/code&gt; 页面度确认新嘅 IPv6 地址配置。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;为咗俾虚拟机用，要开 IPv6 路由通告（RA）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;要俾佢入面啲虚拟机都可以透过 SLAAC 攞到 IPv6，就要改佢个 RA 设定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /etc/sysctl.d/99-virtual-machine.conf &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.all.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;net.ipv6.conf.default.accept_ra = 2
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sysctl -p /etc/sysctl.d/99-virtual-machine.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="做-pveqemu-客户机嗰阵点样开内存同cpu热插拔"&gt;&lt;a href="#%e5%81%9a-pveqemu-%e5%ae%a2%e6%88%b7%e6%9c%ba%e5%97%b0%e9%98%b5%e7%82%b9%e6%a0%b7%e5%bc%80%e5%86%85%e5%ad%98%e5%90%8ccpu%e7%83%ad%e6%8f%92%e6%8b%94" class="header-anchor"&gt;&lt;/a&gt;做 PVE/QEMU 客户机嗰阵点样开内存同CPU热插拔
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;改 &lt;code&gt;/etc/default/grub&lt;/code&gt; 嚟开内存热插拔:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX=&amp;#34;modprobe.blacklist=pcspkr memhp_default_state=online&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;整个 UDEV 规则嚟开 CPU 热插拔：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &amp;gt; /lib/udev/rules.d/80-hotplug-cpu.rules &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;SUBSYSTEM==&amp;#34;cpu&amp;#34;, ACTION==&amp;#34;add&amp;#34;, TEST==&amp;#34;online&amp;#34;, ATTR{online}==&amp;#34;0&amp;#34;, ATTR{online}=&amp;#34;1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;熄咗部虚拟机。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;喺 PVE 网页控制台嘅处理器页面度拣 “启用 NUMA”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;喺 PVE 网页控制台嘅选项页面，“热插拔”选项列表度拣&lt;code&gt;内存&lt;/code&gt;同&lt;code&gt;CPU&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>喺 Proxmox VE (PVE) 上面装 FnOS</title><link>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-proxmox-ve-pve-%E4%B8%8A%E9%9D%A2%E8%A3%85-fnos/</link><pubDate>Sun, 03 Aug 2025 10:12:00 +0800</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-proxmox-ve-pve-%E4%B8%8A%E9%9D%A2%E8%A3%85-fnos/</guid><description>&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介
&lt;/h2&gt;&lt;p&gt;呢份文件解决咗喺 PVE 环境装完 FnOS 之后成日撞到嘅问题，例如系统锁咗同 PVE Web 控制台冇反应。跟住呢啲步骤做，你就会有一个可以完全访问、安全又优化好嘅 FnOS 虚拟机。&lt;/p&gt;
&lt;p&gt;如果你已经装好，想睇多啲优化技巧，可以睇&lt;a class="link" href="../%e6%88%91%e5%98%85-fnos-%e7%a7%81%e5%ae%b6%e9%85%8d%e7%bd%ae%e5%90%8c%e8%b4%b4%e5%a3%ab" &gt;呢一篇文章&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="安装准备"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%87%86%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;安装准备
&lt;/h2&gt;&lt;p&gt;FnOS ISO：去 &lt;a class="link" href="https://www.fnnas.com/" target="_blank" rel="noopener"
 &gt;https://www.fnnas.com/&lt;/a&gt; 透过“直接下载”攞到。&lt;/p&gt;
&lt;p&gt;建议 PVE 起码要有 3GB RAM 同 2 个核心。&lt;/p&gt;
&lt;p&gt;跟住&lt;a class="link" href="https://help.fnnas.com/articles/fnosV1/start/install-os.md" target="_blank" rel="noopener"
 &gt;官方指南&lt;/a&gt;嚟装系统。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="安装后配置"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%90%8e%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;安装后配置
&lt;/h2&gt;&lt;p&gt;第一次开机嗰阵，有两个大问题会搞到你入唔到新嘅 FnOS 实例：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;禁止登入&lt;/strong&gt;：喺搞掂 Web 初始设定之前，系统控制台唔食任何密码（包括 &lt;code&gt;root&lt;/code&gt;）。呢个对于可能得 IPv6 访问嘅远程机器嚟讲系个问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PVE 控制台冇反应&lt;/strong&gt;：PVE Web UI 入面个 &lt;code&gt;Xterm.js&lt;/code&gt; 串行控制台預設係用唔到嘅。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面呢几部分提供咗呢啲问题嘅解决方案。&lt;/p&gt;
&lt;h3 id="获取初始-root-访问权限"&gt;&lt;a href="#%e8%8e%b7%e5%8f%96%e5%88%9d%e5%a7%8b-root-%e8%ae%bf%e9%97%ae%e6%9d%83%e9%99%90" class="header-anchor"&gt;&lt;/a&gt;获取初始 root 访问权限
&lt;/h3&gt;&lt;p&gt;首先，我哋要兜过标准嘅启动程序嚟设定 root 密码。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;喺 PVE 控制台度，重啟部虚拟机。喺 GRUB 启动菜单，㩒 &lt;code&gt;e&lt;/code&gt; 嚟编辑启动参数。&lt;/li&gt;
&lt;li&gt;搵到用 &lt;code&gt;linux&lt;/code&gt; 开头嗰行。佢睇落会系咁样：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;linux /boot/vmlinuz-6.12.18-trim root=UUID=... ro quiet
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;喺呢行嘅最尾加 &lt;code&gt;single init=/bin/bash&lt;/code&gt;。呢个参数会直接将系统带到 root shell。&lt;/li&gt;
&lt;li&gt;㩒 &lt;code&gt;Ctrl+X&lt;/code&gt; 或者 &lt;code&gt;F10&lt;/code&gt; 启动。&lt;/li&gt;
&lt;li&gt;喺 root shell 度，行 &lt;code&gt;passwd&lt;/code&gt; 命令帮 &lt;code&gt;root&lt;/code&gt; 用户整个新密码。&lt;/li&gt;
&lt;li&gt;搞掂之后，重啟部虚拟机。头先改嘅启动参数系临时嘅，唔会保存。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="启用永久控制台访问和功能"&gt;&lt;a href="#%e5%90%af%e7%94%a8%e6%b0%b8%e4%b9%85%e6%8e%a7%e5%88%b6%e5%8f%b0%e8%ae%bf%e9%97%ae%e5%92%8c%e5%8a%9f%e8%83%bd" class="header-anchor"&gt;&lt;/a&gt;启用永久控制台访问和功能
&lt;/h3&gt;&lt;p&gt;搞掂 root 访问权限之后，就永久修改 GRUB 配置嚟开 PVE 串行控制台同其他功能。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;用新设嘅密码以 &lt;code&gt;root&lt;/code&gt; 身份登入。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编辑 GRUB 配置文件：&lt;code&gt;nano /etc/default/grub&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; 呢行，加返串行控制台同埋可选嘅嵌套虚拟化 IOMMU 支持。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果系 Intel CPU：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 intel_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;如果系 AMD CPU：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;quiet console=tty0 console=ttyS0,115200 amd_iommu=on iommu=pt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;code&gt;console=ttyS0,115200&lt;/code&gt; 系 PVE &lt;code&gt;Xterm.js&lt;/code&gt; 功能嘅关键参数。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存修改然后退出编辑器。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;行下面呢个命令嚟应用新配置：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;update-grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重啟部虚拟机。而家 PVE Web 控制台应该就完全正常啦。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="安装-qemu-客户机代理"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-qemu-%e5%ae%a2%e6%88%b7%e6%9c%ba%e4%bb%a3%e7%90%86" class="header-anchor"&gt;&lt;/a&gt;安装 QEMU 客户机代理
&lt;/h3&gt;&lt;p&gt;为咗更好咁同 PVE 整合，例如喺虚拟机摘要度显示网络信息，我哋要装&lt;code&gt;qemu-guest-agent&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;```shell
apt update &amp;amp;&amp;amp; apt -y install qemu-guest-agent
systemctl enable --now qemu-guest-agent
```
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="结语"&gt;&lt;a href="#%e7%bb%93%e8%af%ad" class="header-anchor"&gt;&lt;/a&gt;结语
&lt;/h2&gt;&lt;p&gt;咁样你就已经成功喺 Proxmox VE 上面配置好 FnOS 实例。个系统而家可以完全访问，并且同 PVE 主机正确整合。之后嘅配置同优化我会喺&lt;a class="link" href="../%e6%88%91%e5%98%85-fnos-%e7%a7%81%e5%ae%b6%e9%85%8d%e7%bd%ae%e5%90%8c%e8%b4%b4%e5%a3%ab" &gt;新嘅一篇文章&lt;/a&gt;度讲。&lt;/p&gt;</description></item><item><title>喺 WSL2 上面编译 LineageOS</title><link>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-wsl2-%E4%B8%8A%E9%9D%A2%E7%BC%96%E8%AF%91-lineageos/</link><pubDate>Thu, 25 Jan 2024 03:46:22 +0000</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-wsl2-%E4%B8%8A%E9%9D%A2%E7%BC%96%E8%AF%91-lineageos/</guid><description>&lt;h1 id="安装-wsl-linux-同编译需要嘅嘢"&gt;&lt;a href="#%e5%ae%89%e8%a3%85-wsl-linux-%e5%90%8c%e7%bc%96%e8%af%91%e9%9c%80%e8%a6%81%e5%98%85%e5%98%a2" class="header-anchor"&gt;&lt;/a&gt;安装 WSL Linux 同编译需要嘅嘢
&lt;/h1&gt;&lt;p&gt;预设会安装 Ubuntu：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-powershell" data-lang="powershell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 唔显示进度条，下载快啲：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$ProgressPreference&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;SilentlyContinue&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 用头先搵到嘅 URL，下载 appx 安装包：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Invoke-WebRequest&lt;/span&gt; &lt;span class="n"&gt;-Uri&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="p"&gt;//&lt;/span&gt;&lt;span class="n"&gt;aka&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wslubuntu&lt;/span&gt; &lt;span class="n"&gt;-OutFile&lt;/span&gt; &lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;appx&lt;/span&gt; &lt;span class="n"&gt;-UseBasicParsing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 整返个备份同解压缩：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Copy-Item&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;appx&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Expand-Archive&lt;/span&gt; &lt;span class="p"&gt;.\&lt;/span&gt;&lt;span class="n"&gt;Linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="py"&gt;zip&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# 搵安装程式：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;Get-Childitem&lt;/span&gt; &lt;span class="n"&gt;-Filter&lt;/span&gt; &lt;span class="p"&gt;*.&lt;/span&gt;&lt;span class="n"&gt;exe&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 帮 Ubuntu 装编译需要嘅嘢&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="如果系-debian-bookworm-系统"&gt;&lt;a href="#%e5%a6%82%e6%9e%9c%e7%b3%bb-debian-bookworm-%e7%b3%bb%e7%bb%9f" class="header-anchor"&gt;&lt;/a&gt;如果系 Debian Bookworm 系统：
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev libncurses5 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="安装编译工具包"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e7%bc%96%e8%af%91%e5%b7%a5%e5%85%b7%e5%8c%85" class="header-anchor"&gt;&lt;/a&gt;安装编译工具包：
&lt;/h1&gt;&lt;h2 id="repo"&gt;&lt;a href="#repo" class="header-anchor"&gt;&lt;/a&gt;Repo
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl https://storage.googleapis.com/git-repo-downloads/repo &lt;span class="p"&gt;|&lt;/span&gt;sudo tee /usr/bin/repo
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod a+x /usr/bin/repo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="平台工具"&gt;&lt;a href="#%e5%b9%b3%e5%8f%b0%e5%b7%a5%e5%85%b7" class="header-anchor"&gt;&lt;/a&gt;平台工具
&lt;/h2&gt;&lt;p&gt;如果你之前未装过 &lt;code&gt;adb&lt;/code&gt; 同 &lt;code&gt;fastboot&lt;/code&gt;，可以&lt;a class="link" href="https://dl.google.com/android/repository/platform-tools-latest-linux.zip" target="_blank" rel="noopener"
 &gt;喺 Google 下载原版&lt;/a&gt;然后解压缩：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://dl.google.cn/android/repository/platform-tools-latest-linux.zip &lt;span class="c1"&gt;# 俾中国大陆嘅读者用&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip platform-tools-latest-linux.zip -d ~/.local/bin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而家你要将 &lt;code&gt;adb&lt;/code&gt; 同 &lt;code&gt;fastboot&lt;/code&gt; 加到你嘅 PATH 环境变量。打开 &lt;code&gt;~/.profile&lt;/code&gt; 然后加下面啲嘢：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 将 Android SDK 平台工具加到 PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;if [ -d &amp;#34;$HOME/.local/bin/platform-tools&amp;#34; ] ; then
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PATH=&amp;#34;$HOME/.local/bin/platform-tools:$PATH&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;行 &lt;code&gt;source ~/.profile&lt;/code&gt; 嚟更新你嘅环境，或者直接重开个 shell。&lt;/p&gt;
&lt;h2 id="python"&gt;&lt;a href="#python" class="header-anchor"&gt;&lt;/a&gt;Python
&lt;/h2&gt;&lt;p&gt;LineageOS 18+ 打后，编译需要 &lt;code&gt;python3&lt;/code&gt;。&lt;/p&gt;
&lt;h1 id="设定-git"&gt;&lt;a href="#%e8%ae%be%e5%ae%9a-git" class="header-anchor"&gt;&lt;/a&gt;设定 Git
&lt;/h1&gt;&lt;p&gt;你要设定你嘅名同 email 嚟同步 Android 源码。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;you@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;Your Name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同步源码嗰阵可能要下载啲大文件，所以要装 &lt;code&gt;git-lfs&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git lfs install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="整个新资料夹嚟拉源码"&gt;&lt;a href="#%e6%95%b4%e4%b8%aa%e6%96%b0%e8%b5%84%e6%96%99%e5%a4%b9%e5%9a%9f%e6%8b%89%e6%ba%90%e7%a0%81" class="header-anchor"&gt;&lt;/a&gt;整个新资料夹嚟拉源码
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir lineage-21.0 &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; lineage-21.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="初始化-repo"&gt;&lt;a href="#%e5%88%9d%e5%a7%8b%e5%8c%96-repo" class="header-anchor"&gt;&lt;/a&gt;初始化 repo
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 &lt;span class="c1"&gt;# 同步成个 repo，包晒所有 commit 记录，会用好多位。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --depth&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# 净系拉最新嘅 commit，冇 commit 记录，用位少好多。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="开始同步-repo"&gt;&lt;a href="#%e5%bc%80%e5%a7%8b%e5%90%8c%e6%ad%a5-repo" class="header-anchor"&gt;&lt;/a&gt;开始同步 repo
&lt;/h1&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;repo sync -c -j&lt;span class="k"&gt;$(&lt;/span&gt;nproc --all&lt;span class="k"&gt;)&lt;/span&gt; --force-sync --no-clone-bundle --no-tags
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;跟住就跟 &lt;a class="link" href="https://wiki.lineageos.org/devices/rtwo/build/variant2/#download-the-source-code" target="_blank" rel="noopener"
 &gt;LineageOS 编译指南&lt;/a&gt;继续做……&lt;/p&gt;</description></item><item><title>喺 VMware 度安装用 Btrfs 嘅 Arch Linux</title><link>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-vmware-%E5%BA%A6%E5%AE%89%E8%A3%85%E7%94%A8-btrfs-%E5%98%85-arch-linux/</link><pubDate>Fri, 13 Jan 2023 23:07:11 +0800</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E5%96%BA-vmware-%E5%BA%A6%E5%AE%89%E8%A3%85%E7%94%A8-btrfs-%E5%98%85-arch-linux/</guid><description>&lt;h2 id="安装前"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%89%8d" class="header-anchor"&gt;&lt;/a&gt;安装前
&lt;/h2&gt;&lt;p&gt;首先创建一部虚拟机，跟住根据你嘅需要调整相关配置（UEFI 固件部分除外）：&lt;/p&gt;
&lt;p&gt;!虚拟机配置概览 &lt;a class="link" href="overview.png" &gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;!固件配置 &lt;a class="link" href="firmwareConfig.png" &gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;为咗唔俾 VMware 创建用嚟加速嘅 vmem 文件，&lt;a class="link" href="https://gist.github.com/extremecoders-re/cf8d829c108d58bfbb2e3c1f4121d7e1" title="禁用 vmem 文件创建。"
 target="_blank" rel="noopener"
 &gt;请将下边呢几行加到你嘅 .vmx 配置文件度&lt;/a&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefvmx.minVmMemPct = &amp;#34;100&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MemTrimRate = &amp;#34;0&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mainMem.useNamedFile = &amp;#34;FALSE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sched.mem.pshare.enable = &amp;#34;FALSE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prefvmx.useRecommendedLockedMemSize = &amp;#34;TRUE&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;启动虚拟机，然后检查下固件係咪 UEFI 模式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /sys/firmware/efi/efivars
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果用嘅係传统 BIOS（Legacy BIOS），呢个命令会返回 &lt;code&gt;No such file or directory.&lt;/code&gt;（揾唔到个文件或目录）。&lt;/p&gt;
&lt;h2 id="硬盘分区"&gt;&lt;a href="#%e7%a1%ac%e7%9b%98%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;硬盘分区
&lt;/h2&gt;&lt;p&gt;用 &lt;code&gt;cgdisk&lt;/code&gt; 或者任何你钟意嘅分区工具，&lt;a class="link" href="https://wiki.archlinux.org/title/Installation_guide#Example_layouts" title="分区布局"
 target="_blank" rel="noopener"
 &gt;创建一个新嘅 GPT 分区表，再分一个唔细过 300MiB 嘅 EFI 分区&lt;/a&gt;同一个 Linux 分区：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cgdisk /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="格式化分区"&gt;&lt;a href="#%e6%a0%bc%e5%bc%8f%e5%8c%96%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;格式化分区
&lt;/h3&gt;&lt;h4 id="efi-分区"&gt;&lt;a href="#efi-%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;EFI 分区
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.fat -F32 /dev/sda1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="根系统分区"&gt;&lt;a href="#%e6%a0%b9%e7%b3%bb%e7%bb%9f%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;根系统分区
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkfs.btrfs -f -L Arch /dev/sda2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="创建-btrfs-子卷"&gt;&lt;a href="#%e5%88%9b%e5%bb%ba-btrfs-%e5%ad%90%e5%8d%b7" class="header-anchor"&gt;&lt;/a&gt;创建 BTRFS 子卷
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@&lt;/code&gt;：对应 &lt;code&gt;/&lt;/code&gt; (根目录)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@home&lt;/code&gt;：对应 &lt;code&gt;/home&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@cache&lt;/code&gt;：对应 &lt;code&gt;/var/cache&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@docker&lt;/code&gt;：对应 &lt;code&gt;/var/lib/docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@log&lt;/code&gt;：对应 &lt;code&gt;/var/log&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;@cache&lt;/code&gt; 同 &lt;code&gt;@log&lt;/code&gt; 子卷唔需要启用写时复制（Copy-on-Write, COW）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;将根分区挂载到 &lt;code&gt;/mnt&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -t btrfs -o &lt;span class="nv"&gt;compress&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;lzo /dev/sda2 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;blockquote&gt;
 &lt;p&gt;一般嚟讲，lzo 压缩算法已经够用。有报告话，就算用 Zstd:1 压缩级别，btrfs 嘅速度都慢好多，而 lzo 同唔压缩相比几乎冇性能差别。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建子卷：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;btrfs subvol create /mnt/@swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 用 chattr 命令禁用写时复制（COW）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chattr +C /mnt/@swap
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 卸载分区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;umount /mnt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id="挂载分区同子卷"&gt;&lt;a href="#%e6%8c%82%e8%bd%bd%e5%88%86%e5%8c%ba%e5%90%8c%e5%ad%90%e5%8d%b7" class="header-anchor"&gt;&lt;/a&gt;挂载分区同子卷
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@ /dev/sda2 /mnt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p /mnt/&lt;span class="o"&gt;{&lt;/span&gt;boot/efi,home,var/&lt;span class="o"&gt;{&lt;/span&gt;log,lib/docker,cache&lt;span class="o"&gt;}&lt;/span&gt;,tmp,swap&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@home /dev/sda2 /mnt/home
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@log /dev/sda2 /mnt/var/log
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@docker /dev/sda2 /mnt/var/lib/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@cache /dev/sda2 /mnt/var/cache
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@tmp /dev/sda2 /mnt/tmp
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount -o noatime,nodiratime,ssd,compress&lt;span class="o"&gt;=&lt;/span&gt;lzo,subvol&lt;span class="o"&gt;=&lt;/span&gt;@swap /dev/sda2 /mnt/swap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="挂载-efi-分区"&gt;&lt;a href="#%e6%8c%82%e8%bd%bd-efi-%e5%88%86%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;挂载 EFI 分区：
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mount /dev/sda1 /mnt/boot/EFI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="安装系统"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e7%b3%bb%e7%bb%9f" class="header-anchor"&gt;&lt;/a&gt;安装系统
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacstrap /mnt base base-devel linux linux-firmware btrfs-progs networkmanager dhcpcd iwd vim sudo zsh zsh-completions &lt;span class="o"&gt;{&lt;/span&gt;intel,amd&lt;span class="o"&gt;}&lt;/span&gt;-ucode net-tools linux-headers curl git wget 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="生成-fstab"&gt;&lt;a href="#%e7%94%9f%e6%88%90-fstab" class="header-anchor"&gt;&lt;/a&gt;生成 fstab
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genfstab -U /mnt &amp;gt; /mnt/etc/fstab
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成之后请小心检查一次，然后继续搞安装后嘅配置。&lt;/p&gt;
&lt;h2 id="安装后配置"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%90%8e%e9%85%8d%e7%bd%ae" class="header-anchor"&gt;&lt;/a&gt;安装后配置
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arch-chroot /mnt	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="帮-pacman-设置镜像源"&gt;&lt;a href="#%e5%b8%ae-pacman-%e8%ae%be%e7%bd%ae%e9%95%9c%e5%83%8f%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;帮 pacman 设置镜像源
&lt;/h3&gt;&lt;p&gt;用 reflector 或者直接改 &lt;code&gt;/etc/pacman.d/mirrorlist&lt;/code&gt; 文件，然后行 &lt;code&gt;pacman -Syy&lt;/code&gt; 嚟应用变更。&lt;/p&gt;
&lt;h3 id="安装引导程序"&gt;&lt;a href="#%e5%ae%89%e8%a3%85%e5%bc%95%e5%af%bc%e7%a8%8b%e5%ba%8f" class="header-anchor"&gt;&lt;/a&gt;安装引导程序
&lt;/h3&gt;&lt;p&gt;呢篇文章用 grub 做引导程序，因为它係少数可以好好咁支持 btrfs 嘅引导程序之一。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -S grub efibootmgr os-prober
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grub-install --target&lt;span class="o"&gt;=&lt;/span&gt;x86_64-efi --efi-directory&lt;span class="o"&gt;=&lt;/span&gt;/boot/efi --bootloader-id&lt;span class="o"&gt;=&lt;/span&gt;Arch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;成功安装会显示下边嘅结果。&lt;/p&gt;
&lt;p&gt;!grub 安装成功结果 &lt;a class="link" href="./grubInstallSuccessfulResult.png" &gt;&lt;sup&gt;3&lt;/sup&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;跟住做啲优化。提高日志级别兼加个 &lt;code&gt;nowatchdog&lt;/code&gt; 参数，嚟加快开机同关机嘅速度：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano /etc/default/grub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后改成咁：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;loglevel=5&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ GRUB_CMDLINE_LINUX_DEFAULT=&amp;#34;loglevel=5 nowatchdog&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;保存佢，然后生成新嘅 grub 配置文件嚟应用变更。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@archiso /&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# grub-mkconfig -o /boot/grub/grub.cfg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;正在生成 grub 配置文件 ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;揾到 Linux 镜像：/boot/vmlinuz-linux
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;揾到 initrd 镜像：/boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;喺 /boot 度揾到备用嘅 initrd 镜像：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;intel-ucode.img amd-ucode.img initramfs-linux-fallback.img
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;警告：os-prober 唔会执行去探测其他可引导嘅分区。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;嗰啲系统上嘅分区将唔会被加到 GRUB 启动菜单度。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;请查阅相关文档。
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;为 UEFI 固件设置添加启动菜单项 ...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;搞掂
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置主机名同-hosts-文件"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae%e4%b8%bb%e6%9c%ba%e5%90%8d%e5%90%8c-hosts-%e6%96%87%e4%bb%b6" class="header-anchor"&gt;&lt;/a&gt;设置主机名同 hosts 文件
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;newHostname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;你嘅新主机名&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$newHostname&lt;/span&gt; &amp;gt; /etc/hostname
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;127.0.0.1 localhost\n::1 localhost\n127.0.1.1 &lt;/span&gt;&lt;span class="nv"&gt;$newHostname&lt;/span&gt;&lt;span class="s2"&gt;.localdomain &lt;/span&gt;&lt;span class="nv"&gt;$newHostname&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /etc/hosts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置时区"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae%e6%97%b6%e5%8c%ba" class="header-anchor"&gt;&lt;/a&gt;设置时区
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置地区同语言"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae%e5%9c%b0%e5%8c%ba%e5%90%8c%e8%af%ad%e8%a8%80" class="header-anchor"&gt;&lt;/a&gt;设置地区同语言
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nano /etc/locale.gen
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;取消注释 &lt;code&gt;en-US.UTF-8 UTF-8&lt;/code&gt; 同埋任何你想用嘅地区语言，然后生成 locale 文件再设置默认语言做美式英文：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;locale-gen &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;LANG=en_US.UTF-8&amp;#39;&lt;/span&gt; &amp;gt; /etc/locale.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="设置用户账户"&gt;&lt;a href="#%e8%ae%be%e7%bd%ae%e7%94%a8%e6%88%b7%e8%b4%a6%e6%88%b7" class="header-anchor"&gt;&lt;/a&gt;设置用户账户
&lt;/h3&gt;&lt;p&gt;首先设置 root 账户嘅密码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd root	
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;yourName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd -m &lt;span class="nv"&gt;$yourName&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;为用户 &lt;/span&gt;&lt;span class="nv"&gt;$yourName&lt;/span&gt;&lt;span class="s2"&gt; 设置新密码&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; passwd &lt;span class="nv"&gt;$yourName&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="桌面环境"&gt;&lt;a href="#%e6%a1%8c%e9%9d%a2%e7%8e%af%e5%a2%83" class="header-anchor"&gt;&lt;/a&gt;桌面环境
&lt;/h3&gt;&lt;p&gt;呢篇文章我哋安装 KDE &lt;a class="link" href="https://wiki.archlinux.org/title/KDE" target="_blank" rel="noopener"
 &gt;&lt;sup&gt;4&lt;/sup&gt;&lt;/a&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -S plasma plasma-wayland-session egl-wayland kde-&lt;span class="o"&gt;{&lt;/span&gt;accessibility,graphics,multimedia,network,pim,sdk,system,utilities&lt;span class="o"&gt;}&lt;/span&gt;-meta
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="vmware-tools"&gt;&lt;a href="#vmware-tools" class="header-anchor"&gt;&lt;/a&gt;VMware Tools
&lt;/h3&gt;&lt;p&gt;官方嘅 VMware Tools 唔支持 Arch Linux。通常会用 OpenVMTools。&lt;/p&gt;
&lt;p&gt;用 Open VM Tools 可能冇办法正常调整屏幕大小。呢度有个根据 &lt;a class="link" href="https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/" title="vmware tools 指南"
 target="_blank" rel="noopener"
 &gt;reddit 帖子&lt;/a&gt; 嘅解决方案：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Syu
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -S open-vm-tools
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo pacman -Su xf86-input-vmmouse xf86-video-vmware mesa gtk2 gtkmm
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;needs_root_rights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yes &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/X11/Xwrapper.config
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; --now vmtoolsd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;咁就搞掂啦。&lt;/p&gt;
&lt;h3 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料：
&lt;/h3&gt;&lt;p&gt;&lt;a class="link" href="https://blog.zrlab.org/posts/arch-btrfs" target="_blank" rel="noopener"
 &gt;https://blog.zrlab.org/posts/arch-btrfs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://wiki.archwiki.org" target="_blank" rel="noopener"
 &gt;https://wiki.archwiki.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ericclose.github.io/Installing-Arch-as-a-guest-with-UEFI-and-GPT.html" target="_blank" rel="noopener"
 &gt;https://ericclose.github.io/Installing-Arch-as-a-guest-with-UEFI-and-GPT.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://arch.icekylin.online/rookie/basic-install.html" target="_blank" rel="noopener"
 &gt;https://arch.icekylin.online/rookie/basic-install.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/" target="_blank" rel="noopener"
 &gt;https://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>修复联想 Legion（拯救者） 笔电开咗独显直连之后光暗调节功能键冇反应嘅问题</title><link>https://blog.ous50.moe/yue-cn/p/%E4%BF%AE%E5%A4%8D%E8%81%94%E6%83%B3-legion%E6%8B%AF%E6%95%91%E8%80%85-%E7%AC%94%E7%94%B5%E5%BC%80%E5%92%97%E7%8B%AC%E6%98%BE%E7%9B%B4%E8%BF%9E%E4%B9%8B%E5%90%8E%E5%85%89%E6%9A%97%E8%B0%83%E8%8A%82%E5%8A%9F%E8%83%BD%E9%94%AE%E5%86%87%E5%8F%8D%E5%BA%94%E5%98%85%E9%97%AE%E9%A2%98/</link><pubDate>Tue, 08 Nov 2022 02:06:00 +0000</pubDate><guid>https://blog.ous50.moe/yue-cn/p/%E4%BF%AE%E5%A4%8D%E8%81%94%E6%83%B3-legion%E6%8B%AF%E6%95%91%E8%80%85-%E7%AC%94%E7%94%B5%E5%BC%80%E5%92%97%E7%8B%AC%E6%98%BE%E7%9B%B4%E8%BF%9E%E4%B9%8B%E5%90%8E%E5%85%89%E6%9A%97%E8%B0%83%E8%8A%82%E5%8A%9F%E8%83%BD%E9%94%AE%E5%86%87%E5%8F%8D%E5%BA%94%E5%98%85%E9%97%AE%E9%A2%98/</guid><description>&lt;h2 id="简介"&gt;&lt;a href="#%e7%ae%80%e4%bb%8b" class="header-anchor"&gt;&lt;/a&gt;简介
&lt;/h2&gt;&lt;p&gt;联想 Legion 系列笔电用嘅系 IdeaPad ACPI 驱动，喺普通配置下，除咗 F9（我的最爱键）、F11（切换分页键）同 F12（计数机键）之外，差唔多所有功能键都用到，因为呢几个键嘅 ACPI 功能冇定义到：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo acpi_listen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8FC0DE0C-B4E4- 000000d0 &lt;span class="m"&gt;00000000&lt;/span&gt; &lt;span class="c1"&gt;#F9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;^&lt;span class="o"&gt;[&lt;/span&gt;^&lt;span class="o"&gt;[[&lt;/span&gt;27&lt;span class="p"&gt;;&lt;/span&gt;5&lt;span class="p"&gt;;&lt;/span&gt;9~ &lt;span class="c1"&gt;#F11 &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8FC0DE0C-B4E4- 000000d0 &lt;span class="m"&gt;00000000&lt;/span&gt; &lt;span class="c1"&gt;#F12&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但系如果喺 BIOS 度开咗“独显直连”选项，F5（光啲）同 F6（暗啲）功能键就会冇反应，就算行 &lt;code&gt;acpi_listen&lt;/code&gt; 显示一切正常都系咁：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-zsh" data-lang="zsh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo acpi_listen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;video/brightnessup BRTUP &lt;span class="m"&gt;00000086&lt;/span&gt; &lt;span class="m"&gt;00000000&lt;/span&gt; &lt;span class="c1"&gt;#F6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;video/brightnessdown BRTDN &lt;span class="m"&gt;00000087&lt;/span&gt; &lt;span class="m"&gt;00000000&lt;/span&gt; &lt;span class="c1"&gt;#F5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因系而家控制背光嘅设备转咗做 &lt;code&gt;nvidia_0&lt;/code&gt;，同定义好嘅 acpi 动作对唔上。Arch Linux 用户可以装 &lt;a class="link" href="https://wiki.archlinux.org/title/Backlight#xbacklight" target="_blank" rel="noopener"
 &gt;xbacklight&lt;/a&gt; 喺命令行调校背光。但系个体验好差：次次想调光暗都要开个终端，再用 root 权限行 xbacklight。呢篇文章就系为咗整返好个功能键。&lt;/p&gt;
&lt;p&gt;记住：你依然唔可以喺“电池同亮度”设定度调校光暗。&lt;/p&gt;
&lt;h2 id="解决方案"&gt;&lt;a href="#%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;解决方案
&lt;/h2&gt;&lt;p&gt;就咁创建呢啲文件出嚟再重开机就得。&lt;/p&gt;
&lt;h3 id="etcacpieventsfnf6-brightnessup"&gt;&lt;a href="#etcacpieventsfnf6-brightnessup" class="header-anchor"&gt;&lt;/a&gt;/etc/acpi/events/FnF6-brightnessup
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#FnF6 video/brightnessup BRTUP 00000086 00000000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;event=video/brightnessup
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;action=https://blog.ous50.moe/etc/acpi/actions/FnF6-brightnessup.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="etcacpiactionsfnf6-brightnessupsh"&gt;&lt;a href="#etcacpiactionsfnf6-brightnessupsh" class="header-anchor"&gt;&lt;/a&gt;/etc/acpi/actions/FnF6-brightnessup.sh
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 设定静态增加嘅数值。记住，呢个动作会执行两次。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 呢个数值取决于你个桌面环境实际嘅变化量（KDE 入面系 6）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;IncVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 攞最大光暗度。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;read&lt;/span&gt; -r MaxVal &amp;lt; &lt;span class="s2"&gt;&amp;#34;/sys/class/backlight/nvidia_0/max_brightness&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 攞而家嘅光暗度。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;read&lt;/span&gt; -r CurrVal &amp;lt; &lt;span class="s2"&gt;&amp;#34;/sys/class/backlight/nvidia_0/brightness&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将新数值设为当前数值加增量。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NewVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$CurrVal&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$IncVal&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$NewVal&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将佢设定喺唔超过最大值嘅阈值。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ThresholdVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$NewVal&lt;/span&gt;&amp;lt;&lt;span class="nv"&gt;$MaxVal&lt;/span&gt;?&lt;span class="nv"&gt;$NewVal&lt;/span&gt;:&lt;span class="nv"&gt;$MaxVal&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 直接设定新数值。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt; &amp;gt; /sys/class/backlight/nvidia_0/brightness 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;logger &lt;span class="s2"&gt;&amp;#34;[ACPI] brightnessup |&lt;/span&gt;&lt;span class="nv"&gt;$CurrVal&lt;/span&gt;&lt;span class="s2"&gt;| |&lt;/span&gt;&lt;span class="nv"&gt;$NewVal&lt;/span&gt;&lt;span class="s2"&gt;| |&lt;/span&gt;&lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt;&lt;span class="s2"&gt;|&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="etcacpieventsfnf5-brightnessdown"&gt;&lt;a href="#etcacpieventsfnf5-brightnessdown" class="header-anchor"&gt;&lt;/a&gt;/etc/acpi/events/FnF5-brightnessdown
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;#FnF5 video/brightnessdown BRTDN 00000087 00000000 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;event=video/brightnessdown 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;action=https://blog.ous50.moe/etc/acpi/actions/FnF5-brightnessdown.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="etcacpiactionsfnf5-brightnessdownsh"&gt;&lt;a href="#etcacpiactionsfnf5-brightnessdownsh" class="header-anchor"&gt;&lt;/a&gt;/etc/acpi/actions/FnF5-brightnessdown.sh
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 设定静态减少嘅数值。记住，呢个动作会执行两次。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 呢个数值取决于你个桌面环境实际嘅变化量（KDE 入面系 6）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;DecVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 设定我哋接受嘅最细值。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MinVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 攞而家嘅光暗度。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;read&lt;/span&gt; -r CurrVal &amp;lt; &lt;span class="s2"&gt;&amp;#34;/sys/class/backlight/nvidia_0/brightness&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将新数值设为当前数值减去减量。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NewVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$CurrVal&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nv"&gt;$DecVal&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$NewVal&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 将佢设定喺唔低于最细值嘅阈值。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ThresholdVal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$NewVal&lt;/span&gt;&amp;gt;&lt;span class="nv"&gt;$MinVal&lt;/span&gt;?&lt;span class="nv"&gt;$NewVal&lt;/span&gt;:&lt;span class="nv"&gt;$MinVal&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 直接设定新数值。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt; &amp;gt; /sys/class/backlight/nvidia_0/brightness 
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;logger &lt;span class="s2"&gt;&amp;#34;[ACPI] brightnessdown |&lt;/span&gt;&lt;span class="nv"&gt;$CurrVal&lt;/span&gt;&lt;span class="s2"&gt;| |&lt;/span&gt;&lt;span class="nv"&gt;$NewVal&lt;/span&gt;&lt;span class="s2"&gt;| |&lt;/span&gt;&lt;span class="nv"&gt;$ThresholdVal&lt;/span&gt;&lt;span class="s2"&gt;|&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>