[{"content":"简介 正如我喺之前篇关于 UICC 历史嘅文章入面讲过，eUICC 系一个可编程平台。Android™ 提供咗多种方法畀用户管理 eUICC（下文称为 eSIM），包括但唔限于透过 OMAPI（Open Mobile API，需要 Android 9 / API 28 或更高版本）或者 Android Telephony API（需要 root 权限同 Android 11 或更高版本；你可以用 Magisk 取代手机上预设嘅 eSIM 管理入口）去使用 LPA（本地设定档助手）。\n本文主要示范点样用 OpenEUICC 同 EasyEUICC 呢两个 app 嚟区分 OMAPI 同 Android Telephony API。呢两个 app 由 Peter Cai 开发，而且共享同一份代码库。佢哋唯一嘅区别系所用嘅管理 API（EasyEUICC 畀非特权用户，OpenEUICC 畀特权用户）。佢哋嘅分别如下表所示：\nOpenEUICC EasyEUICC 需要特权 必须作为系统应用安装 否 内部 eSIM 支援 唔支援 外部 eSIM 1 支援 支援 USB 读卡器 支援 支援 需要 eSIM 白名单 否 系 — USB 除外 系统整合 部分 2 否 最低 Android 版本 Android 11 或更高 Android 9 或更高 如果你有兴趣购买兼容嘅可移动 eSIM 卡 我哋同多家优秀嘅制造商合作，为你提供一啲折扣选择。揿下面连结以更抵价购买，如果你钟意呢篇文章，都可以支持我。\neSTK.me - 省心嘅选择。支援任意 LPA app，甚至可以用任何 Android 或 iPhone 管理设定档。结账时用优惠码 OUS50 可享 9 折。 9eSIM - 经济实惠嘅选择。结账时用 OUS50 可享 9 折。 EasyEUICC - OMAPI Note 除非你自己编译 EasyEUICC，否则你必须确保你嘅外部 eSIM 设备同 EasyEUICC 兼容，即系话设备必须符合 GSMA SGP.22 规范，而且必须支援呢个特定嘅 ARA-M SHA-1 值：2A2FA878BC7C3354C2CF82935A5945A3EDAE4AFA，跟住先可以继续操作。 下载 你可以直接喺 EasyEUICC 官方页面 下载 app。\n首次使用 首次启动时，EasyEUICC app 会检查你部 Android 手机对 OMAPI 嘅兼容性，并显示你可以用嚟管理兼容外部 eSIM 设备嘅 SIM 卡槽。\n揿 Continue 按钮继续，你就会进入主介面：\nNote 如果你只想新增/管理你嘅 eSIM 设定档，直接跳到呢度。 设定页面 揿右上角嘅 ⋮ 按钮可以睇设定：\n新增 eSIM 设定档 揿右下角嘅 + 按钮，然后拣你想下载设定档去边个 eSIM 设备：\nNote 你应该用 eID 而唔系 ICCID 嚟确认你嘅 eSIM。eID 系你嘅 **eSIM 设备（插入手机嘅卡）**识别号码，而 ICCID 系你嘅 eSIM 设定档识别号码。 拣你想用嘅方式（通常系用相机扫描二维码或者从相簿载入二维码）。同目标伺服器核对后，设定档下载就会开始：\nWarning 下载设定档𠮶阵，请确保你有稳定可达嘅网络连接。否则你可能会永久遗失个设定档，因为设定档派发伺服器已经将你嘅设定档标记为已下载。 如果你需要用原始数据下载设定档，或者二维码用唔到 就拣最后一个选项 Enter manually。输入你嘅供应商畀你嘅对应字串：\n设定档下载完成后 设定档下载完成后，你可以喺主页面查看、切换同修名个设定档：\nNote 我每日都用紧 esim.gg，几年嚟喺全球旅行时佢一直都非常可靠稳定。而家数据-only eSIM 冇折扣，但如果你结账时用 ous50 买个新嘅爱沙尼亚号码，可以减 0.3 欧元。 故障排除 OMAPI 检测失败 呢种情况下，你部手机或者系统唔支援透过 OMAPI 用 EasyEUICC。考虑喺取得 root 权限后用 OpenEUICC，或者换部新啲嘅设备。\n设定档下载失败 检查错误代码，试吓重新扫描二维码，或者手动下载设定档。\nWarning 下载设定档𠮶阵，请确保你有稳定可达嘅网络连接。否则你可能会永久遗失个设定档，因为设定档派发伺服器已经将你嘅设定档标记为已下载。 如果你已经用晒下载次数，请联络你嘅 eSIM 设定档供应商寻求进一步协助。\n揾唔到 eSIM 卡/设备 你嘅 eSIM 卡/设备可能同 EasyEUICC 唔兼容。揿呢度睇更多资讯。\n常见问题 用呢个 app 会唔会被电讯商封号？ 一般嚟讲唔会。但电讯商有自己嘅黑名单，某啲 eSIM 卡制造商/型号可能会被拉黑。 推荐你购买上文列出嘅优质 eSIM 卡，并遵循你嘅供应商嘅指示。\n我可以用呢啲卡喺其他手机上面用吗？ 可以，喺你正确设定好 eSIM 卡/设备，并切换、配置好想要嘅设定档之后，你可以好似用普通实体 SIM 卡咁用呢啲卡。\n你可以喺任何支援 OMAPI 嘅 Android 手机上面用 EasyEUICC app 嚟管理兼容卡上面嘅设定档。\n对于 eSTK 卡，你甚至可以喺 iPhone 上面透过 STK 应用嚟管理设定档。\n脚注 亦称为「可移动 eSIM」\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n电讯商合作伙伴 API 尚未实现\u0026#160;\u0026#x21a9;\u0026#xfe0e;\n","date":"2026-06-20T00:00:00Z","permalink":"/yue-cn/p/euicc-management-explained/","title":"eUICC 管理详解"},{"content":" Note 呢篇文章係基于 2026年1月29日 嘅环境写嘅，RouterOS 版本係 7.20.1，ShellCrash 版本係 1.9.4beta6，两个都係喺 PVE 上面跑嘅 KVM。如果你用紧唔同版本嘅 RouterOS 或者 ShellCrash，内容可能会有啲出入，大家自己执生啦。 简介 之前我係用 DHCP 指定 Gateway 嘅方法令网络入面嘅机用 Proxy。虽然呢招都可以做到无感 Proxy，但我无办法将呢种体验扩展到全部机度，因为 ShellCrash 有时真係会“Crash（瓜柴）”，咁就会直接搞到正常上网都受影响。我对 OSPF 呢个功能听咗好耐，所以最近跟住 DeepRouter 篇文章 喺 RouterOS 上面 Set 咗 OSPF。呢篇文主要係用来记低我嘅折腾经验，同埋分享下我点样令成个係统稳阵啲 (Robustness)。\nShellCrash 同 Bird 嘅配置 虽然将 ShellCrash 同 BIRD 放喺唔同 Instance 跑都得，但我 极度建议 放喺同一个 Instance 入面。\nShellCrash 安装过程就唔讲啦，记得喺 DNS 配置度用 MIX 模式（按 2 (功能设置) - 2 (DNS 设置)）。\nCheck 下 IPv4 同 IPv6 Forward 配置 Run 下 sudo sysctl -p 睇下下面几行係咪 Set 好咗：\nnet.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1 如果未，就改下 /etc/sysctl.conf。\nBIRD 我哋会用 !chnroutes 来分返开国内 IP。\n装完 bird 之后，记住千祈唔好即刻着咗佢 (start service)。我哋要搞掂啲配置先。\nDebian 嘅话：\nsudo apt update sudo apt install bird2 make bird.conf Edit 下 /etc/bird/bird.conf 跟住下面咁改。\n记得 Check 清楚：\nrouter id 係你 ShellCrash/BIRD 嗰个 Instance 嘅 IP。 ospf v2 同 v3 入面嘅 interface 都要 Set 做连去 Gateway（LAN口）嗰张网卡。 你可以用 ip a 或者 ip link 来睇，揾嗰个 唔係 lo 嘅 interface 就係啦。 log syslog all; router id 192.168.114.51; # 这里改做你 Instance 嘅 IP protocol device { scan time 60; } protocol kernel { ipv4 { import none; export none; }; } protocol kernel { ipv6 { import none; export none; }; } protocol static { ipv4; include \u0026#34;/etc/bird/routes4.conf\u0026#34;; } protocol static { ipv6; include \u0026#34;/etc/bird/routes6.conf\u0026#34;; } protocol ospf v2 { ipv4 { export all; }; area 0.0.0.0 { interface \u0026#34;ens18\u0026#34; { # 改做你张网卡个名 type pointopoint; }; }; } protocol ospf v3 { ipv6 { export all; }; area 0.0.0.0 { interface \u0026#34;ens18\u0026#34; { # 改做你张网卡个名 type pointopoint; }; }; } Generate 啲 Route 出来 git clone https://github.com/ous50/nchnroutes.git cd nchnroutes make 如果你连 github.com 有困难，可以用 Mirror：\ngit clone https://hk.gh-proxy.org/https://github.com/ous50/nchnroutes.git cd nchnroutes make 见到下面呢啲 Output 就即係搞掂，可以继续：\npython3 produce.py sudo mv routes4.conf /etc/bird/routes4.conf sudo mv routes6.conf /etc/bird/routes6.conf sudo birdc configure BIRD 2.0.12 ready. Reading configuration from /etc/bird/bird.conf Reconfigured RouterOS 配置 你需要先 Set 好个旁路路由表，防止 OSPF 邻居一建立就好易 Loop 死 (infinite loop)。\nBypass ShellCrash 防止 Loop 同埋 Set 例外 我哋会整多张 Routing Table 来 Bypass 来自 ShellCrash 嘅流量，费事佢 Loop。\n/routing table add disabled=no fib name=bypass-shellcrash /routing rule add action=lookup-only-in-table comment=\u0026#34;Bypass Shellcrash Gateway using Routing Mark\u0026#34; disabled=no routing-mark=bypass-shellcrash table=bypass-shellcrash 将你 Default Route 从 main 表搬去 bypass-shellcrash 表：\n/ip route add disabled=no distance=1 dst-address=\u0026lt;你个 LAN 网段带 CIDR\u0026gt; gateway=lan routing-table=bypass-shellcrash scope=30 suppress-hw-offload=no target-scope=10 add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=\u0026lt;你个 Internet Gateway\u0026gt; routing-table=bypass-shellcrash scope=30 suppress-hw-offload=no target-scope=10 Firewall Tagging (Mangle) 记得留意：\n将 dst-address 改做你嘅 LAN 网段，前面的感叹号 ! 要留返喺度。 将 src-mac-address 改做 ShellCrash 嗰张网卡嘅 MAC Address（可以喺 ShellCrash 入面打 ip link 睇，或者直接喺 PVE 界面睇都得）。 /ip firewall mangle 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 OSPF Config 默认来讲，呢段 Script 你咩都唔使改。\n/routing ospf instance add disabled=no name=shellcrash add disabled=no name=shellcrash-v6 version=3 /routing ospf area add disabled=no instance=shellcrash name=ospf-area-v4 add disabled=no instance=shellcrash-v6 name=ospf-area-v6 /routing ospf interface-template add area=ospf-area-v4 cost=10 disabled=no priority=32 type=ptp add area=ospf-area-v6 cost=10 disabled=no priority=32 type=ptp 醒目 Tips (Tricks) 稳阵嘅 DNS Setting 因为 ShellCrash 用咗 fake-ip 模式，你应该将 ShellCrash 嘅 DNS Set 做上游。\n喺呢个 Case 入面，我哋假设将 RouterOS 嘅 DNS 派俾 Client，跟住用下面呢段 RouterOS Script 动态 Update 上游 DNS，咁样稳阵啲，万一 ShellCrash 瓜咗都唔会搞到全屋断网。\n:global ospfInstance \u0026#34;shellsrash\u0026#34; :global ospfDNS \u0026#34;1.1.4.5\u0026#34; # 你个 ShellCrash Instance IP :global publicDNS \u0026#34;223.5.5.5\u0026#34; # 这里改做你用来直接上网个 Public DNS # (true / false), Test 完记得关咗 Debug 佢，如果唔係个 Log 会好鬼烦。 :local DEBUG false # Mark 低个最终状态，Default 係 false (down) :local isOspfActive false # 尝试揾邻居 :local neighborIds [/routing ospf neighbor find instance=$ospfInstance] # Check 下揾唔揾到 :if ([:len $neighborIds] \u0026gt; 0) do={ # Note: 呢度我哋假设只用一个 Instance。 # 如果你有几个 Instance，可能要 Loop 下去揾。 :local neighborState [/routing ospf neighbor get ($neighborIds-\u0026gt;0) state] :if ($DEBUG) do={:log info \u0026#34;[DEBUG] Neighbor found! State: $neighborState\u0026#34;} # 只有当状态係 \u0026#34;Full\u0026#34; 先当 OSPF Active。记住係 \u0026#34;Full\u0026#34; 唔係 \u0026#34;full\u0026#34;。呢个状态名喺唔同 RouterOS 版本可能有分别。 :if ($neighborState = \u0026#34;Full\u0026#34;) do={ :set isOspfActive true } } else={ # 如果长度係 0，即係揾唔到邻居。Check 下 bird 配置/状态啦。 :if ($DEBUG) do={:log info \u0026#34;[DEBUG] No OSPF neighbor found. Logic assumes DOWN.\u0026#34;} :set isOspfActive false } # 根据 isOspfActive 呢个变量来改 DNS :local currentDNS [/ip dns get servers] :if ($isOspfActive) do={ # OSPF Up 咗 :if ($DEBUG) do={:log info \u0026#34;[DEBUG] Decision: OSPF is UP.\u0026#34;} :if ($currentDNS != $ospfDNS) do={ :log warning \u0026#34;OSPF Shellcrash Up: Switching to OSPF DNS ($ospfDNS).\u0026#34; /ip dns set servers=$ospfDNS /ip dns cache flush } else={ :if ($DEBUG) do={:log info \u0026#34;[DEBUG] DNS is already correct (OSPF).\u0026#34;} } } else={ # OSPF Down 咗 (或者揾唔到邻居) :if ($DEBUG) do={:log info \u0026#34;[DEBUG] Decision: OSPF is DOWN/MISSING.\u0026#34;} :if ($currentDNS != $publicDNS) do={ :log warning \u0026#34;OSPF Shellcrash Down: Switching to Public DNS ($publicDNS).\u0026#34; /ip dns set servers=$publicDNS /ip dns cache flush } else={ :if ($DEBUG) do={:log info \u0026#34;[DEBUG] DNS is already correct (Public).\u0026#34;} } } ShellCrash 瓜咗嗰阵自动熄 Bird 我哋会用个 bash script 主动 check 住 ShellCrash 仲係咪生勾勾 (alive)。如果 API 连唔到，佢就会停咗个 Bird Service 嚟收返啲 OSPF Route。\nCopy 下面段 Code 再 Paste 入你 PVE 个 Shell 度（用 clash user 登录，或者用有 sudo 权限嘅 user）：\n# 1. 整返个 Watchdog script # Note: 我哋用 \u0026#39;EOF\u0026#39; (带引号) 来防止 Create 嗰阵啲变量被 Expand 咗。 sudo tee /home/clash/check_clash.sh \u0026gt; /dev/null \u0026lt;\u0026lt; \u0026#39;EOF\u0026#39; #!/bin/bash # Configuration API_URL=\u0026#34;http://127.0.0.1:9999/\u0026#34; LOG_FILE=\u0026#34;/home/clash/clash_watchdog.log\u0026#34; DEBUG=false INTERVAL=3 # Init 状态 (0=唔知, 1=正常, 2=瓜咗) LAST_STATE=0 while true; do # Check ShellCrash API HTTP_CODE=$(curl -s -m 1 -o /dev/null -w \u0026#34;%{http_code}\u0026#34; \u0026#34;$API_URL\u0026#34;) if [ \u0026#34;$DEBUG\u0026#34; = \u0026#34;true\u0026#34; ]; then echo \u0026#34;[DEBUG] Dashboard code: $HTTP_CODE\u0026#34; fi if [ \u0026#34;$HTTP_CODE\u0026#34; == \u0026#34;200\u0026#34; ]; then # ShellCrash 生存 if [ \u0026#34;$LAST_STATE\u0026#34; != \u0026#34;1\u0026#34; ]; then DATE=$(date \u0026#34;+%Y-%m-%d %H:%M:%S\u0026#34;) # 用 systemctl 个 return code 睇下 Bird 有无跑紧 (稳阵啲) sudo systemctl is-active --quiet bird BIRD_EXIT_CODE=$? if [ $BIRD_EXIT_CODE -ne 0 ]; then if [ \u0026#34;$DEBUG\u0026#34; = \u0026#34;true\u0026#34; ]; then echo \u0026#34;ShellCrash detected. Starting Bird...\u0026#34; fi echo \u0026#34;[$DATE] ShellCrash recovered/detected. Starting Bird...\u0026#34; \u0026gt;\u0026gt; $LOG_FILE sudo systemctl start bird fi LAST_STATE=1 fi else # ShellCrash 瓜咗 if [ \u0026#34;$LAST_STATE\u0026#34; != \u0026#34;2\u0026#34; ]; then DATE=$(date \u0026#34;+%Y-%m-%d %H:%M:%S\u0026#34;) if [ \u0026#34;$DEBUG\u0026#34; = \u0026#34;true\u0026#34; ]; then echo \u0026#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!\u0026#34; fi echo \u0026#34;[$DATE] Alert! ShellCrash died (Code: $HTTP_CODE). Stopping Bird!\u0026#34; \u0026gt;\u0026gt; $LOG_FILE sudo systemctl stop bird LAST_STATE=2 fi fi sleep $INTERVAL done EOF # 2. 俾个 Execute 权限佢 sudo chmod +x /home/clash/check_clash.sh # 3. 整返个 Systemd Service sudo tee /etc/systemd/system/clash-watchdog.service \u0026gt; /dev/null \u0026lt;\u0026lt; EOF [Unit] Description=ShellCrash Watchdog for Bird OSPF After=network.target [Service] User=clash Group=clash ExecStart=/home/clash/check_clash.sh Restart=always RestartSec=3 [Install] WantedBy=multi-user.target EOF # 4. Enable 同 Start 佢 sudo systemctl daemon-reload sudo systemctl enable --now clash-watchdog.service sudo systemctl status clash-watchdog.service ","date":"2026-01-29T00:58:18+08:00","permalink":"/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/","title":"我係点样喺 RouterOS 用 OSPF 同 PVE 上嘅 ShellCrash 搞个无感网络"},{"content":"安装 EasyTier 如果你嘅网络提供商干扰咗 GitHub，你可以用以下命令嚟安装 EasyTier：\napt update -y sudo unzip openssl wget -O /tmp/easytier.sh \u0026#34;https://ghfast.top/https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh\u0026#34; \u0026amp;\u0026amp; sudo bash /tmp/easytier.sh install --gh-proxy https://ghfast.top/ systemctl disable --now easytier@default.service 你可以喺呢度检查最新嘅代理。\n否则，只需用默认嘅 GitHub URL。\napt update -y sudo unzip openssl wget -O /tmp/easytier.sh \u0026#34;https://raw.githubusercontent.com/EasyTier/EasyTier/main/script/install.sh\u0026#34; \u0026amp;\u0026amp; sudo bash /tmp/easytier.sh install systemctl disable --now easytier@default.service 启用 EasyTier 服务 用 easytier 仪表板进行管理 如果你希望用 easytier 仪表板进行管理，可以用以下命令启用该服务：\nexport USER=\u0026lt;你嘅用户名\u0026gt; echo \u0026#34;[Unit] Description=EasyTier Service After=network.target syslog.target Wants=network.target [Service] Type=simple ExecStart=/usr/sbin/easytier-core -w $USER [Install] WantedBy=multi-user.target \u0026#34; | sudo tee /etc/systemd/system/easytier.service systemctl enable --now easytier.service 然后你就可以喺 https://easytier.cn/web 访问 EasyTier 仪表板啦。\n请注意：你需要先喺 EasyTier 仪表板度注册账号再启用该功能。\n手动配置 直接跟住官方文档进行配置就得。\n","date":"2025-08-26T10:30:16+08:00","permalink":"/yue-cn/p/%E5%96%BA-pve-%E4%B8%8A%E5%AE%89%E8%A3%85-easytier/","title":"喺 PVE 上安装 EasyTier"},{"content":"本文专注于飞牛OS使用时嘅优化。如果想知点样喺 PVE 或者实体机度装飞牛OS，可以睇返上一篇文章。\n网络优化 下面呢啲步骤可以提高网络吞吐量同保障私隐。\n行呢个 script 嚟开 BBR 拥塞控制算法:\ncat \u0026gt; /etc/sysctl.d/99-enable-bbr.conf \u0026lt;\u0026lt;EOF net.core.default_qdisc=fq net.ipv4.tcp_congestion_control=bbr EOF 唔使重启就可以应用BBR配置：\nsysctl -p /etc/sysctl.d/99-enable-bbr.conf 行呢个脚本嚟开最新嘅 IPv6 私隐地址标准（RFC 7217 同 RFC 4941）：\ncat \u0026gt; /etc/sysctl.d/99-enable-private-ipv6.conf \u0026lt;\u0026lt;EOF net.ipv6.conf.all.use_tempaddr = 2 net.ipv6.conf.default.use_tempaddr = 2 net.ipv6.conf.all.addr_gen_mode=1 net.ipv6.conf.default.addr_gen_mode=1 EOF 应用sysctl配置：\nsysctl -p /etc/sysctl.d/99-enable-private-ipv6.conf 🚨 警告：唔好喺 FnOS Web 介面用“EUI-64”呢个选项。咁做会喺 IPv6 地址度暴露设备嘅 MAC 地址，搞到啲私隐增强功能冇晒用。\n应用网络变更\n要启用新嘅 IPv6 地址设定，就要重置个网络接口。用 nmcli 就搞得掂，唔使成个系统重启。\n🚨 重要提示：喺 PVE Web 控制台 (Xterm.js) 度行呢啲命令，因为如果用 SSH 行，IPv6 地址一变就会断线，而且可能连唔返。\n步骤 1：搵出连接个名 列晒所有连紧嘅连接，搵主接口个名。\nnmcli connection show 输出会列出可以用嘅连接。记低你个以太网连接嘅名，通常系 Wired connection 1。\n步骤 2：重置连接 用啱啱搵到嘅名嚟重启网络接口：\nnmcli connection down \u0026#34;Wired connection 1\u0026#34; \u0026amp;\u0026amp; nmcli connection up \u0026#34;Wired connection 1\u0026#34; 网络接口会重启。你可以用 ip a 或者喺 PVE Web 控制台嘅虚拟机 Summary 页面度确认新嘅 IPv6 地址配置。\n为咗俾虚拟机用，要开 IPv6 路由通告（RA）\n要俾佢入面啲虚拟机都可以透过 SLAAC 攞到 IPv6，就要改佢个 RA 设定：\ncat \u0026gt; /etc/sysctl.d/99-virtual-machine.conf \u0026lt;\u0026lt;EOF net.ipv6.conf.all.accept_ra = 2 net.ipv6.conf.default.accept_ra = 2 EOF sysctl -p /etc/sysctl.d/99-virtual-machine.conf 做 PVE/QEMU 客户机嗰阵点样开内存同CPU热插拔 改 /etc/default/grub 嚟开内存热插拔:\n- GRUB_CMDLINE_LINUX=\u0026#34;modprobe.blacklist=pcspkr\u0026#34; + GRUB_CMDLINE_LINUX=\u0026#34;modprobe.blacklist=pcspkr memhp_default_state=online\u0026#34; 整个 UDEV 规则嚟开 CPU 热插拔：\ncat \u0026gt; /lib/udev/rules.d/80-hotplug-cpu.rules \u0026lt;\u0026lt;EOF SUBSYSTEM==\u0026#34;cpu\u0026#34;, ACTION==\u0026#34;add\u0026#34;, TEST==\u0026#34;online\u0026#34;, ATTR{online}==\u0026#34;0\u0026#34;, ATTR{online}=\u0026#34;1\u0026#34; EOF 熄咗部虚拟机。\n喺 PVE 网页控制台嘅处理器页面度拣 “启用 NUMA”。\n喺 PVE 网页控制台嘅选项页面，“热插拔”选项列表度拣内存同CPU。\n","date":"2025-08-08T11:26:29+08:00","permalink":"/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/","title":"我嘅 FnOS 私家配置同贴士"},{"content":"简介 呢份文件解决咗喺 PVE 环境装完 FnOS 之后成日撞到嘅问题，例如系统锁咗同 PVE Web 控制台冇反应。跟住呢啲步骤做，你就会有一个可以完全访问、安全又优化好嘅 FnOS 虚拟机。\n如果你已经装好，想睇多啲优化技巧，可以睇呢一篇文章。\n安装准备 FnOS ISO：去 https://www.fnnas.com/ 透过“直接下载”攞到。\n建议 PVE 起码要有 3GB RAM 同 2 个核心。\n跟住官方指南嚟装系统。\n安装后配置 第一次开机嗰阵，有两个大问题会搞到你入唔到新嘅 FnOS 实例：\n禁止登入：喺搞掂 Web 初始设定之前，系统控制台唔食任何密码（包括 root）。呢个对于可能得 IPv6 访问嘅远程机器嚟讲系个问题。 PVE 控制台冇反应：PVE Web UI 入面个 Xterm.js 串行控制台預設係用唔到嘅。 下面呢几部分提供咗呢啲问题嘅解决方案。\n获取初始 root 访问权限 首先，我哋要兜过标准嘅启动程序嚟设定 root 密码。\n喺 PVE 控制台度，重啟部虚拟机。喺 GRUB 启动菜单，㩒 e 嚟编辑启动参数。 搵到用 linux 开头嗰行。佢睇落会系咁样： linux /boot/vmlinuz-6.12.18-trim root=UUID=... ro quiet 喺呢行嘅最尾加 single init=/bin/bash。呢个参数会直接将系统带到 root shell。 㩒 Ctrl+X 或者 F10 启动。 喺 root shell 度，行 passwd 命令帮 root 用户整个新密码。 搞掂之后，重啟部虚拟机。头先改嘅启动参数系临时嘅，唔会保存。 启用永久控制台访问和功能 搞掂 root 访问权限之后，就永久修改 GRUB 配置嚟开 PVE 串行控制台同其他功能。\n用新设嘅密码以 root 身份登入。\n编辑 GRUB 配置文件：nano /etc/default/grub。\n修改 GRUB_CMDLINE_LINUX_DEFAULT 呢行，加返串行控制台同埋可选嘅嵌套虚拟化 IOMMU 支持。\n如果系 Intel CPU：\n- GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet\u0026#34; + GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet console=tty0 console=ttyS0,115200 intel_iommu=on iommu=pt\u0026#34; 如果系 AMD CPU：\n- GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet\u0026#34; + GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;quiet console=tty0 console=ttyS0,115200 amd_iommu=on iommu=pt\u0026#34; 注意： console=ttyS0,115200 系 PVE Xterm.js 功能嘅关键参数。\n保存修改然后退出编辑器。\n行下面呢个命令嚟应用新配置：\nupdate-grub 重啟部虚拟机。而家 PVE Web 控制台应该就完全正常啦。\n安装 QEMU 客户机代理 为咗更好咁同 PVE 整合，例如喺虚拟机摘要度显示网络信息，我哋要装qemu-guest-agent。\n```shell apt update \u0026amp;\u0026amp; apt -y install qemu-guest-agent systemctl enable --now qemu-guest-agent ``` 结语 咁样你就已经成功喺 Proxmox VE 上面配置好 FnOS 实例。个系统而家可以完全访问，并且同 PVE 主机正确整合。之后嘅配置同优化我会喺新嘅一篇文章度讲。\n","date":"2025-08-03T10:12:00+08:00","permalink":"/yue-cn/p/%E5%96%BA-proxmox-ve-pve-%E4%B8%8A%E9%9D%A2%E8%A3%85-fnos/","title":"喺 Proxmox VE (PVE) 上面装 FnOS"},{"content":"安装 WSL Linux 同编译需要嘅嘢 预设会安装 Ubuntu：\n# 唔显示进度条，下载快啲： $ProgressPreference = \u0026#39;SilentlyContinue\u0026#39; # 用头先搵到嘅 URL，下载 appx 安装包： Invoke-WebRequest -Uri https://aka.ms/wslubuntu -OutFile Linux.appx -UseBasicParsing # 整返个备份同解压缩： Copy-Item .\\Linux.appx .\\Linux.zip Expand-Archive .\\Linux.zip # 搵安装程式： Get-Childitem -Filter *.exe # 帮 Ubuntu 装编译需要嘅嘢 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 如果系 Debian Bookworm 系统： 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 安装编译工具包： Repo curl https://storage.googleapis.com/git-repo-downloads/repo |sudo tee /usr/bin/repo sudo chmod a+x /usr/bin/repo 平台工具 如果你之前未装过 adb 同 fastboot，可以喺 Google 下载原版然后解压缩：\nwget https://dl.google.com/android/repository/platform-tools-latest-linux.zip wget https://dl.google.cn/android/repository/platform-tools-latest-linux.zip # 俾中国大陆嘅读者用 unzip platform-tools-latest-linux.zip -d ~/.local/bin 而家你要将 adb 同 fastboot 加到你嘅 PATH 环境变量。打开 ~/.profile 然后加下面啲嘢：\n# 将 Android SDK 平台工具加到 PATH if [ -d \u0026#34;$HOME/.local/bin/platform-tools\u0026#34; ] ; then PATH=\u0026#34;$HOME/.local/bin/platform-tools:$PATH\u0026#34; fi 行 source ~/.profile 嚟更新你嘅环境，或者直接重开个 shell。\nPython LineageOS 18+ 打后，编译需要 python3。\n设定 Git 你要设定你嘅名同 email 嚟同步 Android 源码。\ngit config --global user.email \u0026#34;you@example.com\u0026#34; git config --global user.name \u0026#34;Your Name\u0026#34; 同步源码嗰阵可能要下载啲大文件，所以要装 git-lfs：\ngit lfs install 整个新资料夹嚟拉源码 mkdir lineage-21.0 \u0026amp;\u0026amp; cd lineage-21.0 初始化 repo repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 # 同步成个 repo，包晒所有 commit 记录，会用好多位。 repo init -u https://github.com/LineageOS/android.git -b lineage-21.0 --depth=1 # 净系拉最新嘅 commit，冇 commit 记录，用位少好多。 开始同步 repo repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags 跟住就跟 LineageOS 编译指南继续做……\n","date":"2024-01-25T03:46:22Z","permalink":"/yue-cn/p/%E5%96%BA-wsl2-%E4%B8%8A%E9%9D%A2%E7%BC%96%E8%AF%91-lineageos/","title":"喺 WSL2 上面编译 LineageOS"},{"content":"安装前 首先创建一部虚拟机，跟住根据你嘅需要调整相关配置（UEFI 固件部分除外）：\n!虚拟机配置概览 1\n!固件配置 2\n为咗唔俾 VMware 创建用嚟加速嘅 vmem 文件，请将下边呢几行加到你嘅 .vmx 配置文件度：\nprefvmx.minVmMemPct = \u0026#34;100\u0026#34; MemTrimRate = \u0026#34;0\u0026#34; mainMem.useNamedFile = \u0026#34;FALSE\u0026#34; sched.mem.pshare.enable = \u0026#34;FALSE\u0026#34; prefvmx.useRecommendedLockedMemSize = \u0026#34;TRUE\u0026#34; 启动虚拟机，然后检查下固件係咪 UEFI 模式：\nls /sys/firmware/efi/efivars 如果用嘅係传统 BIOS（Legacy BIOS），呢个命令会返回 No such file or directory.（揾唔到个文件或目录）。\n硬盘分区 用 cgdisk 或者任何你钟意嘅分区工具，创建一个新嘅 GPT 分区表，再分一个唔细过 300MiB 嘅 EFI 分区同一个 Linux 分区：\ncgdisk /dev/sda 格式化分区 EFI 分区 mkfs.fat -F32 /dev/sda1 根系统分区 mkfs.btrfs -f -L Arch /dev/sda2 创建 BTRFS 子卷 @：对应 / (根目录) @home：对应 /home @cache：对应 /var/cache @docker：对应 /var/lib/docker @log：对应 /var/log @cache 同 @log 子卷唔需要启用写时复制（Copy-on-Write, COW）。\n将根分区挂载到 /mnt：\nmount -t btrfs -o compress=lzo /dev/sda2 /mnt 一般嚟讲，lzo 压缩算法已经够用。有报告话，就算用 Zstd:1 压缩级别，btrfs 嘅速度都慢好多，而 lzo 同唔压缩相比几乎冇性能差别。\n创建子卷：\nbtrfs subvol create /mnt/@ btrfs subvol create /mnt/@home btrfs subvol create /mnt/@cache btrfs subvol create /mnt/@docker btrfs subvol create /mnt/@log btrfs subvol create /mnt/@tmp btrfs subvol create /mnt/@swap # 用 chattr 命令禁用写时复制（COW） chattr +C /mnt/@cache chattr +C /mnt/@log chattr +C /mnt/@swap # 卸载分区 umount /mnt 挂载分区同子卷 mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@ /dev/sda2 /mnt mkdir -p /mnt/{boot/efi,home,var/{log,lib/docker,cache},tmp,swap} mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@home /dev/sda2 /mnt/home mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@log /dev/sda2 /mnt/var/log mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@docker /dev/sda2 /mnt/var/lib/docker mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@cache /dev/sda2 /mnt/var/cache mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@tmp /dev/sda2 /mnt/tmp mount -o noatime,nodiratime,ssd,compress=lzo,subvol=@swap /dev/sda2 /mnt/swap 挂载 EFI 分区： mount /dev/sda1 /mnt/boot/EFI 安装系统 pacstrap /mnt base base-devel linux linux-firmware btrfs-progs networkmanager dhcpcd iwd vim sudo zsh zsh-completions {intel,amd}-ucode net-tools linux-headers curl git wget 生成 fstab genfstab -U /mnt \u0026gt; /mnt/etc/fstab 生成之后请小心检查一次，然后继续搞安装后嘅配置。\n安装后配置 arch-chroot /mnt\t帮 pacman 设置镜像源 用 reflector 或者直接改 /etc/pacman.d/mirrorlist 文件，然后行 pacman -Syy 嚟应用变更。\n安装引导程序 呢篇文章用 grub 做引导程序，因为它係少数可以好好咁支持 btrfs 嘅引导程序之一。\npacman -S grub efibootmgr os-prober grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=Arch 成功安装会显示下边嘅结果。\n!grub 安装成功结果 3\n跟住做啲优化。提高日志级别兼加个 nowatchdog 参数，嚟加快开机同关机嘅速度：\nnano /etc/default/grub 然后改成咁：\n- GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;loglevel=5\u0026#34; + GRUB_CMDLINE_LINUX_DEFAULT=\u0026#34;loglevel=5 nowatchdog\u0026#34; 保存佢，然后生成新嘅 grub 配置文件嚟应用变更。\n[root@archiso /] # grub-mkconfig -o /boot/grub/grub.cfg 正在生成 grub 配置文件 ... 揾到 Linux 镜像：/boot/vmlinuz-linux 揾到 initrd 镜像：/boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs-linux.img 喺 /boot 度揾到备用嘅 initrd 镜像： intel-ucode.img amd-ucode.img initramfs-linux-fallback.img 警告：os-prober 唔会执行去探测其他可引导嘅分区。 嗰啲系统上嘅分区将唔会被加到 GRUB 启动菜单度。 请查阅相关文档。 为 UEFI 固件设置添加启动菜单项 ... 搞掂 设置主机名同 hosts 文件 newHostname=\u0026#34;你嘅新主机名\u0026#34; echo $newHostname \u0026gt; /etc/hostname echo -e \u0026#34;127.0.0.1 localhost\\n::1 localhost\\n127.0.1.1 $newHostname.localdomain $newHostname\u0026#34; \u0026gt;\u0026gt; /etc/hosts 设置时区 ln -sf /usr/share/zoneinfo/Asia/Hong_Kong /etc/localtime 设置地区同语言 nano /etc/locale.gen 取消注释 en-US.UTF-8 UTF-8 同埋任何你想用嘅地区语言，然后生成 locale 文件再设置默认语言做美式英文：\nlocale-gen \u0026amp;\u0026amp; echo \u0026#39;LANG=en_US.UTF-8\u0026#39; \u0026gt; /etc/locale.conf 设置用户账户 首先设置 root 账户嘅密码：\npasswd root\tyourName=\u0026#34;example\u0026#34; useradd -m $yourName \u0026amp;\u0026amp; echo \u0026#34;为用户 $yourName 设置新密码\u0026#34; \u0026amp;\u0026amp; passwd $yourName 桌面环境 呢篇文章我哋安装 KDE 4：\npacman -S plasma plasma-wayland-session egl-wayland kde-{accessibility,graphics,multimedia,network,pim,sdk,system,utilities}-meta VMware Tools 官方嘅 VMware Tools 唔支持 Arch Linux。通常会用 OpenVMTools。\n用 Open VM Tools 可能冇办法正常调整屏幕大小。呢度有个根据 reddit 帖子 嘅解决方案：\nsudo pacman -Syu sudo pacman -S open-vm-tools sudo pacman -Su xf86-input-vmmouse xf86-video-vmware mesa gtk2 gtkmm echo needs_root_rights=yes | sudo tee /etc/X11/Xwrapper.config sudo systemctl enable --now vmtoolsd 咁就搞掂啦。\n参考资料： https://blog.zrlab.org/posts/arch-btrfs\nhttps://wiki.archwiki.org\nhttps://ericclose.github.io/Installing-Arch-as-a-guest-with-UEFI-and-GPT.html\nhttps://arch.icekylin.online/rookie/basic-install.html\nhttps://www.reddit.com/r/archlinux/comments/b0ona0/vmtools_on_arch_linux_full_screen_or_resizing/\n","date":"2023-01-13T23:07:11+08:00","permalink":"/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/","title":"喺 VMware 度安装用 Btrfs 嘅 Arch Linux"},{"content":"简介 联想 Legion 系列笔电用嘅系 IdeaPad ACPI 驱动，喺普通配置下，除咗 F9（我的最爱键）、F11（切换分页键）同 F12（计数机键）之外，差唔多所有功能键都用到，因为呢几个键嘅 ACPI 功能冇定义到：\nsudo acpi_listen 8FC0DE0C-B4E4- 000000d0 00000000 #F9 ^[^[[27;5;9~ #F11 8FC0DE0C-B4E4- 000000d0 00000000 #F12 但系如果喺 BIOS 度开咗“独显直连”选项，F5（光啲）同 F6（暗啲）功能键就会冇反应，就算行 acpi_listen 显示一切正常都系咁：\nsudo acpi_listen video/brightnessup BRTUP 00000086 00000000 #F6 video/brightnessdown BRTDN 00000087 00000000 #F5 原因系而家控制背光嘅设备转咗做 nvidia_0，同定义好嘅 acpi 动作对唔上。Arch Linux 用户可以装 xbacklight 喺命令行调校背光。但系个体验好差：次次想调光暗都要开个终端，再用 root 权限行 xbacklight。呢篇文章就系为咗整返好个功能键。\n记住：你依然唔可以喺“电池同亮度”设定度调校光暗。\n解决方案 就咁创建呢啲文件出嚟再重开机就得。\n/etc/acpi/events/FnF6-brightnessup #FnF6 video/brightnessup BRTUP 00000086 00000000 event=video/brightnessup action=/etc/acpi/actions/FnF6-brightnessup.sh /etc/acpi/actions/FnF6-brightnessup.sh #!/bin/bash # 设定静态增加嘅数值。记住，呢个动作会执行两次。 # 呢个数值取决于你个桌面环境实际嘅变化量（KDE 入面系 6） IncVal=6 # 攞最大光暗度。 read -r MaxVal \u0026lt; \u0026#34;/sys/class/backlight/nvidia_0/max_brightness\u0026#34; # 攞而家嘅光暗度。 read -r CurrVal \u0026lt; \u0026#34;/sys/class/backlight/nvidia_0/brightness\u0026#34; # 将新数值设为当前数值加增量。 NewVal=$(($CurrVal + $IncVal)); echo $NewVal # 将佢设定喺唔超过最大值嘅阈值。 ThresholdVal=$(($NewVal\u0026lt;$MaxVal?$NewVal:$MaxVal)) echo $ThresholdVal # 直接设定新数值。 echo -n $ThresholdVal \u0026gt; /sys/class/backlight/nvidia_0/brightness logger \u0026#34;[ACPI] brightnessup |$CurrVal| |$NewVal| |$ThresholdVal|\u0026#34; /etc/acpi/events/FnF5-brightnessdown #FnF5 video/brightnessdown BRTDN 00000087 00000000 event=video/brightnessdown action=/etc/acpi/actions/FnF5-brightnessdown.sh /etc/acpi/actions/FnF5-brightnessdown.sh #!/bin/bash # 设定静态减少嘅数值。记住，呢个动作会执行两次。 # 呢个数值取决于你个桌面环境实际嘅变化量（KDE 入面系 6） DecVal=6 # 设定我哋接受嘅最细值。 MinVal=0 # 攞而家嘅光暗度。 read -r CurrVal \u0026lt; \u0026#34;/sys/class/backlight/nvidia_0/brightness\u0026#34; # 将新数值设为当前数值减去减量。 NewVal=$(($CurrVal - $DecVal)); echo $NewVal # 将佢设定喺唔低于最细值嘅阈值。 ThresholdVal=$(($NewVal\u0026gt;$MinVal?$NewVal:$MinVal)) echo $ThresholdVal # 直接设定新数值。 echo -n $ThresholdVal \u0026gt; /sys/class/backlight/nvidia_0/brightness logger \u0026#34;[ACPI] brightnessdown |$CurrVal| |$NewVal| |$ThresholdVal|\u0026#34; ","date":"2022-11-08T02:06:00Z","permalink":"/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/","title":"修复联想 Legion（拯救者） 笔电开咗独显直连之后光暗调节功能键冇反应嘅问题"},{"content":"数学 行内数学（LaTeX?）表达式 喺你嘅编辑器度开“行内数学公式”呢个选项。喺我嘅编辑器 Typora 度，你可以喺 档案\u0026gt;\u0026gt;偏好设定\u0026gt;\u0026gt;Markdown\u0026gt;\u0026gt;语法支援\u0026gt;\u0026gt;行内公式 度开。跟住好似下面咁写就得（条式啱定错就唔好理啦，横掂都系示范下啫）：\n$inline \\ math \\ example: \\ f(x)=x^2+y_2$ 佢睇起上嚟会系咁: $inline \\ math \\ example: \\ f(x)=x^2+y_2$\n写笔记 改文字同背景颜色 Markdown 预设系改唔到文字颜色嘅。但系通过写 HTML code，就可以改到文字同背景嘅颜色。\n呢度有个例子\n\u0026lt;span style=\u0026#34;color:\u0026#39;颜色名或者html颜色code\u0026#39;\u0026#34;\u0026gt;文字\u0026lt;/span\u0026gt; //文字颜色 \u0026lt;span style=\u0026#34;background-color:\u0026#39;颜色名或者html颜色code\u0026#39;\u0026#34;\u0026gt;文字\u0026lt;/span\u0026gt; //背景颜色 蓝色\n黄色背景\n再得意啲嘅系，你仲可以喺 HTML 渲染入面继续用 Markdown 格式：\n\u0026lt;span style=\u0026#34;background-color:#00ffff\u0026#34;\u0026gt;\u0026lt;span style=\u0026#34;color:red\u0026#34;\u0026gt;红色字\u0026lt;/span\u0026gt;喺青色背景度\u0026lt;/span\u0026gt; \u0026lt;span style=\u0026#34;background-color:#00ffff\u0026#34;\u0026gt;\u0026lt;span style=\u0026#34;color:red\u0026#34;\u0026gt;**粗体红字**\u0026lt;/span\u0026gt;喺青色背景度\u0026lt;/span\u0026gt; \u0026lt;span style=\u0026#34;background-color:#00ffff\u0026#34;\u0026gt;\u0026lt;span style=\u0026#34;color:red\u0026#34;\u0026gt;**粗体红色 $LaTeX$ 表达式**\u0026lt;/span\u0026gt;喺青色背景度\u0026lt;/span\u0026gt; 红色字喺青色背景度\n粗体红字喺青色背景度\n粗体红色 $LaTeX$ 表达式喺青色背景度\n","date":"2022-09-16T16:00:00Z","permalink":"/yue-cn/p/%E4%B8%80%E5%95%B2%E6%9C%89%E7%94%A8%E5%98%85-markdown-%E7%AC%94%E8%AE%B0-code/","title":"一啲有用嘅 Markdown 笔记 code"}]