<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>软件 on 欧式fifty 嘅 blog</title><link>https://blog.ous50.moe/yue-cn/categories/%E8%BD%AF%E4%BB%B6/</link><description>Recent content in 软件 on 欧式fifty 嘅 blog</description><generator>Hugo -- gohugo.io</generator><language>yue-cn</language><copyright>欧式fifty 2020-</copyright><lastBuildDate>Sat, 20 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.ous50.moe/yue-cn/categories/%E8%BD%AF%E4%BB%B6/index.xml" rel="self" type="application/rss+xml"/><item><title>eUICC 管理详解</title><link>https://blog.ous50.moe/yue-cn/p/euicc-management-explained/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>https://blog.ous50.moe/yue-cn/p/euicc-management-explained/</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;正如我喺&lt;a class="link" href="../eUICC-Explained" &gt;之前篇关于 UICC 历史嘅文章&lt;/a&gt;入面讲过，&lt;strong&gt;eUICC&lt;/strong&gt; 系一个可编程平台。Android™ 提供咗多种方法畀用户管理 eUICC（下文称为 eSIM），包括但唔限于透过 &lt;a class="link" href="https://euicc-manual.osmocom.org/docs/android/open-mobile-api/" target="_blank" rel="noopener"
 &gt;OMAPI&lt;/a&gt;（Open Mobile API，需要 Android 9 / API 28 或更高版本）或者 &lt;a class="link" href="https://developer.android.com/reference/android/telephony/euicc/EuiccManager" target="_blank" rel="noopener"
 &gt;Android Telephony API&lt;/a&gt;（需要 root 权限同 Android 11 或更高版本；你可以用 Magisk 取代手机上预设嘅 eSIM 管理入口）去使用 &lt;a class="link" href="https://source.android.com/docs/core/connect/esim-overview#make-lpa-app" target="_blank" rel="noopener"
 &gt;LPA（本地设定档助手）&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;本文主要示范点样用 OpenEUICC 同 EasyEUICC 呢两个 app 嚟区分 OMAPI 同 Android Telephony API。呢两个 app 由 &lt;a class="link" href="https://gitea.angry.im/PeterCxy" target="_blank" rel="noopener"
 &gt;Peter Cai&lt;/a&gt; 开发，而且&lt;a class="link" href="https://gitea.angry.im/PeterCxy/OpenEUICC" target="_blank" rel="noopener"
 &gt;共享同一份代码库&lt;/a&gt;。佢哋唯一嘅区别系所用嘅管理 API（EasyEUICC 畀非特权用户，OpenEUICC 畀特权用户）。佢哋嘅分别如下表所示：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style="text-align: left"&gt;&lt;/th&gt;
					&lt;th style="text-align: center"&gt;OpenEUICC&lt;/th&gt;
					&lt;th style="text-align: center"&gt;EasyEUICC&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;需要特权&lt;/td&gt;
					&lt;td style="text-align: center"&gt;必须作为系统应用安装&lt;/td&gt;
					&lt;td style="text-align: center"&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;内部 eSIM&lt;/td&gt;
					&lt;td style="text-align: center"&gt;支援&lt;/td&gt;
					&lt;td style="text-align: center"&gt;唔支援&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;外部 eSIM &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;支援&lt;/td&gt;
					&lt;td style="text-align: center"&gt;支援&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;USB 读卡器&lt;/td&gt;
					&lt;td style="text-align: center"&gt;支援&lt;/td&gt;
					&lt;td style="text-align: center"&gt;支援&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;需要 eSIM 白名单&lt;/td&gt;
					&lt;td style="text-align: center"&gt;否&lt;/td&gt;
					&lt;td style="text-align: center"&gt;系 — USB 除外&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;系统整合&lt;/td&gt;
					&lt;td style="text-align: center"&gt;部分 &lt;sup id="fnref:2"&gt;&lt;a href="#fn:2" class="footnote-ref" role="doc-noteref"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
					&lt;td style="text-align: center"&gt;否&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style="text-align: left"&gt;最低 Android 版本&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Android 11 或更高&lt;/td&gt;
					&lt;td style="text-align: center"&gt;Android 9 或更高&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="如果你有兴趣购买兼容嘅可移动-esim-卡"&gt;&lt;a href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e6%9c%89%e5%85%b4%e8%b6%a3%e8%b4%ad%e4%b9%b0%e5%85%bc%e5%ae%b9%e5%98%85%e5%8f%af%e7%a7%bb%e5%8a%a8-esim-%e5%8d%a1" class="header-anchor"&gt;&lt;/a&gt;如果你有兴趣购买兼容嘅可移动 eSIM 卡
&lt;/h3&gt;&lt;p&gt;我哋同多家优秀嘅制造商合作，为你提供一啲折扣选择。揿下面连结以更抵价购买，如果你钟意呢篇文章，都可以支持我。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://store.estk.me/products?code=ous50" target="_blank" rel="noopener"
 &gt;eSTK.me&lt;/a&gt; - 省心嘅选择。支援任意 LPA app，甚至可以用任何 Android 或 iPhone 管理设定档。结账时用优惠码 &lt;code&gt;OUS50&lt;/code&gt; 可享 &lt;strong&gt;9 折&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.9esim.com/shop/" target="_blank" rel="noopener"
 &gt;9eSIM&lt;/a&gt; - 经济实惠嘅选择。结账时用 &lt;code&gt;OUS50&lt;/code&gt; 可享 &lt;strong&gt;9 折&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="easyeuicc---omapi"&gt;&lt;a href="#easyeuicc---omapi" class="header-anchor"&gt;&lt;/a&gt;EasyEUICC - OMAPI
&lt;/h2&gt;

&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;

 除非你自己编译 EasyEUICC，否则&lt;strong&gt;你必须确保你嘅外部 eSIM 设备同 &lt;code&gt;EasyEUICC&lt;/code&gt; 兼容&lt;/strong&gt;，即系话设备必须符合 GSMA SGP.22 规范，而且&lt;strong&gt;必须支援&lt;/strong&gt;呢个特定嘅 ARA-M SHA-1 值：&lt;code&gt;2A2FA878BC7C3354C2CF82935A5945A3EDAE4AFA&lt;/code&gt;，跟住先可以继续操作。
 &lt;/blockquote&gt;


&lt;h3 id="下载"&gt;&lt;a href="#%e4%b8%8b%e8%bd%bd" class="header-anchor"&gt;&lt;/a&gt;下载
&lt;/h3&gt;&lt;p&gt;你可以直接喺 &lt;a class="link" href="https://easyeuicc.org/zh-hans/" target="_blank" rel="noopener"
 &gt;EasyEUICC 官方页面&lt;/a&gt; 下载 app。&lt;/p&gt;
&lt;h3 id="首次使用"&gt;&lt;a href="#%e9%a6%96%e6%ac%a1%e4%bd%bf%e7%94%a8" class="header-anchor"&gt;&lt;/a&gt;首次使用
&lt;/h3&gt;&lt;p&gt;首次启动时，EasyEUICC app 会检查你部 Android 手机对 OMAPI 嘅兼容性，并显示你可以用嚟管理&lt;a class="link" href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e6%9c%89%e5%85%b4%e8%b6%a3%e8%b4%ad%e4%b9%b0%e5%85%bc%e5%ae%b9%e5%98%85%e5%8f%af%e7%a7%bb%e5%8a%a8-esim-%e5%8d%a1" &gt;兼容外部 eSIM 设备&lt;/a&gt;嘅 SIM 卡槽。&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/allow-notification.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/first-start-check.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;p&gt;揿 &lt;code&gt;Continue&lt;/code&gt; 按钮继续，你就会进入主介面：&lt;/p&gt;
&lt;p&gt;&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/main-page.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;


&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;

 如果你只想新增/管理你嘅 eSIM 设定档，直接跳到&lt;a class="link" href="#%e6%96%b0%e5%a2%9e-esim-%e8%ae%be%e5%ae%9a%e6%a1%a3" &gt;呢度&lt;/a&gt;。
 &lt;/blockquote&gt;

&lt;/p&gt;
&lt;h3 id="设定页面"&gt;&lt;a href="#%e8%ae%be%e5%ae%9a%e9%a1%b5%e9%9d%a2" class="header-anchor"&gt;&lt;/a&gt;设定页面
&lt;/h3&gt;&lt;p&gt;揿右上角嘅 &lt;code&gt;⋮&lt;/code&gt; 按钮可以睇设定：&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/settings.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h3 id="新增-esim-设定档"&gt;&lt;a href="#%e6%96%b0%e5%a2%9e-esim-%e8%ae%be%e5%ae%9a%e6%a1%a3" class="header-anchor"&gt;&lt;/a&gt;新增 eSIM 设定档
&lt;/h3&gt;&lt;p&gt;揿右下角嘅 &lt;code&gt;+&lt;/code&gt; 按钮，然后&lt;strong&gt;拣你想下载设定档去边个 eSIM 设备&lt;/strong&gt;：&lt;/p&gt;


&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;code&gt;eID&lt;/code&gt; 而唔系 &lt;code&gt;ICCID&lt;/code&gt; 嚟确认你嘅 eSIM。&lt;code&gt;eID&lt;/code&gt; 系你嘅 **eSIM 设备（插入手机嘅卡）**识别号码，而 &lt;code&gt;ICCID&lt;/code&gt; 系你嘅 eSIM 设定档识别号码。
 &lt;/blockquote&gt;


&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-select-eSIM.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-install-method.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;p&gt;拣你想用嘅方式（通常系用相机扫描二维码或者从相簿载入二维码）。同目标伺服器核对后，设定档下载就会开始：&lt;/p&gt;


&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-warning"&gt;
 &lt;span class="extrabold-quote"&gt;Warning&lt;/span&gt;
 &lt;br&gt;

 下载设定档𠮶阵，请确保你&lt;strong&gt;有稳定可达嘅网络连接&lt;/strong&gt;。否则&lt;strong&gt;你可能会永久遗失个设定档&lt;/strong&gt;，因为设定档派发伺服器已经将你嘅设定档标记为已下载。
 &lt;/blockquote&gt;


&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/download-profile-progress.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h4 id="如果你需要用原始数据下载设定档或者二维码用唔到"&gt;&lt;a href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e9%9c%80%e8%a6%81%e7%94%a8%e5%8e%9f%e5%a7%8b%e6%95%b0%e6%8d%ae%e4%b8%8b%e8%bd%bd%e8%ae%be%e5%ae%9a%e6%a1%a3%e6%88%96%e8%80%85%e4%ba%8c%e7%bb%b4%e7%a0%81%e7%94%a8%e5%94%94%e5%88%b0" class="header-anchor"&gt;&lt;/a&gt;如果你需要用原始数据下载设定档，或者二维码用唔到
&lt;/h4&gt;&lt;p&gt;就拣最后一个选项 &lt;code&gt;Enter manually&lt;/code&gt;。输入你嘅供应商畀你嘅对应字串：&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.en/download-profile-manual.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;
&lt;h3 id="设定档下载完成后"&gt;&lt;a href="#%e8%ae%be%e5%ae%9a%e6%a1%a3%e4%b8%8b%e8%bd%bd%e5%ae%8c%e6%88%90%e5%90%8e" class="header-anchor"&gt;&lt;/a&gt;设定档下载完成后
&lt;/h3&gt;&lt;p&gt;设定档下载完成后，你可以喺主页面查看、切换同修名个设定档：&lt;/p&gt;
&lt;div class="content-gallery"&gt;
 
 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-toggle-profile.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-config-profile-name.png" class="content-gallery-image"&gt;
 

 
 
 
 
 
 
 
 
 &lt;img src="https://blog.ous50.moe/images/easyeuicc-explained/assets.common/main-page-after-profile-name-changed.png" class="content-gallery-image"&gt;
 


&lt;/div&gt;


&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;code&gt;esim.gg&lt;/code&gt;，几年嚟喺全球旅行时佢一直都非常可靠稳定。而家数据-only eSIM 冇折扣，但如果你结账时用 &lt;code&gt;ous50&lt;/code&gt; 买个新嘅爱沙尼亚号码，可以减 0.3 欧元。
 &lt;/blockquote&gt;


&lt;h2 id="故障排除"&gt;&lt;a href="#%e6%95%85%e9%9a%9c%e6%8e%92%e9%99%a4" class="header-anchor"&gt;&lt;/a&gt;故障排除
&lt;/h2&gt;&lt;h3 id="omapi-检测失败"&gt;&lt;a href="#omapi-%e6%a3%80%e6%b5%8b%e5%a4%b1%e8%b4%a5" class="header-anchor"&gt;&lt;/a&gt;OMAPI 检测失败
&lt;/h3&gt;&lt;p&gt;呢种情况下，你部手机或者系统唔支援透过 OMAPI 用 EasyEUICC。考虑喺取得 root 权限后用 OpenEUICC，或者换部新啲嘅设备。&lt;/p&gt;
&lt;h3 id="设定档下载失败"&gt;&lt;a href="#%e8%ae%be%e5%ae%9a%e6%a1%a3%e4%b8%8b%e8%bd%bd%e5%a4%b1%e8%b4%a5" class="header-anchor"&gt;&lt;/a&gt;设定档下载失败
&lt;/h3&gt;&lt;p&gt;检查错误代码，试吓重新扫描二维码，或者&lt;a class="link" href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e9%9c%80%e8%a6%81%e7%94%a8%e5%8e%9f%e5%a7%8b%e6%95%b0%e6%8d%ae%e4%b8%8b%e8%bd%bd%e8%ae%be%e5%ae%9a%e6%a1%a3%e6%88%96%e8%80%85%e4%ba%8c%e7%bb%b4%e7%a0%81%e7%94%a8%e5%94%94%e5%88%b0" &gt;手动下载设定档&lt;/a&gt;。&lt;/p&gt;


&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-warning"&gt;
 &lt;span class="extrabold-quote"&gt;Warning&lt;/span&gt;
 &lt;br&gt;

 下载设定档𠮶阵，请确保你&lt;strong&gt;有稳定可达嘅网络连接&lt;/strong&gt;。否则&lt;strong&gt;你可能会永久遗失个设定档&lt;/strong&gt;，因为设定档派发伺服器已经将你嘅设定档标记为已下载。
 &lt;/blockquote&gt;


&lt;p&gt;如果你已经用晒下载次数，请联络你嘅 eSIM 设定档供应商寻求进一步协助。&lt;/p&gt;
&lt;h3 id="揾唔到-esim-卡设备"&gt;&lt;a href="#%e6%8f%be%e5%94%94%e5%88%b0-esim-%e5%8d%a1%e8%ae%be%e5%a4%87" class="header-anchor"&gt;&lt;/a&gt;揾唔到 eSIM 卡/设备
&lt;/h3&gt;&lt;p&gt;你嘅 eSIM 卡/设备可能同 EasyEUICC 唔兼容。揿&lt;a class="link" href="#easyeuicc---omapi" &gt;呢度&lt;/a&gt;睇更多资讯。&lt;/p&gt;
&lt;h2 id="常见问题"&gt;&lt;a href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98" class="header-anchor"&gt;&lt;/a&gt;常见问题
&lt;/h2&gt;&lt;h3 id="用呢个-app-会唔会被电讯商封号"&gt;&lt;a href="#%e7%94%a8%e5%91%a2%e4%b8%aa-app-%e4%bc%9a%e5%94%94%e4%bc%9a%e8%a2%ab%e7%94%b5%e8%ae%af%e5%95%86%e5%b0%81%e5%8f%b7" class="header-anchor"&gt;&lt;/a&gt;用呢个 app 会唔会被电讯商封号？
&lt;/h3&gt;&lt;p&gt;一般嚟讲唔会。但电讯商有自己嘅黑名单，某啲 eSIM 卡制造商/型号可能会被拉黑。
推荐你购买&lt;a class="link" href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e6%9c%89%e5%85%b4%e8%b6%a3%e8%b4%ad%e4%b9%b0%e5%85%bc%e5%ae%b9%e5%98%85%e5%8f%af%e7%a7%bb%e5%8a%a8-esim-%e5%8d%a1" &gt;上文列出&lt;/a&gt;嘅优质 eSIM 卡，并遵循你嘅供应商嘅指示。&lt;/p&gt;
&lt;h3 id="我可以用呢啲卡喺其他手机上面用吗"&gt;&lt;a href="#%e6%88%91%e5%8f%af%e4%bb%a5%e7%94%a8%e5%91%a2%e5%95%b2%e5%8d%a1%e5%96%ba%e5%85%b6%e4%bb%96%e6%89%8b%e6%9c%ba%e4%b8%8a%e9%9d%a2%e7%94%a8%e5%90%97" class="header-anchor"&gt;&lt;/a&gt;我可以用呢啲卡喺其他手机上面用吗？
&lt;/h3&gt;&lt;p&gt;可以，喺你正确设定好 eSIM 卡/设备，并切换、配置好想要嘅设定档之后，&lt;strong&gt;你可以好似用普通实体 SIM 卡咁用呢啲卡&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;你可以喺任何支援 OMAPI 嘅 Android 手机上面用 EasyEUICC app 嚟管理&lt;a class="link" href="#%e5%a6%82%e6%9e%9c%e4%bd%a0%e6%9c%89%e5%85%b4%e8%b6%a3%e8%b4%ad%e4%b9%b0%e5%85%bc%e5%ae%b9%e5%98%85%e5%8f%af%e7%a7%bb%e5%8a%a8-esim-%e5%8d%a1" &gt;兼容卡&lt;/a&gt;上面嘅设定档。&lt;/p&gt;
&lt;p&gt;对于 eSTK 卡，你甚至可以喺 iPhone 上面透过 STK 应用嚟管理设定档。&lt;/p&gt;
&lt;h2 id="脚注"&gt;&lt;a href="#%e8%84%9a%e6%b3%a8" class="header-anchor"&gt;&lt;/a&gt;脚注
&lt;/h2&gt;&lt;div class="footnotes" role="doc-endnotes"&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id="fn:1"&gt;
&lt;p&gt;亦称为「可移动 eSIM」&amp;#160;&lt;a href="#fnref:1" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id="fn:2"&gt;
&lt;p&gt;电讯商合作伙伴 API 尚未实现&amp;#160;&lt;a href="#fnref:2" class="footnote-backref" role="doc-backlink"&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;</description></item><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>喺 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></channel></rss>