Compare commits

...
8 Commits
Author SHA1 Message Date
im0o b43a2f0a64 feat: 加 Patchbay 安装入口
Patchbay 是网页编辑 mihomo 配置的工具,独立仓库、独立发布链路。这里只做
入口:拉它的 install.sh 下来执行,装、更新、卸载的逻辑都在那边,不复制过来。

- 菜单 p 项和 patchbay 子命令,二级菜单为安装/更新、检查更新、服务控制、卸载
- 不直接 bash <(curl ...):先下到临时文件过一遍 bash -n 再以 root 执行。
  上游推坏了、或者中间设备塞回来一个门户登录页,那条写法会直接跑掉
- MIHOMO_MIRROR / MIHOMO_BIN / MIHOMO_CONF_DIR 原样透传(名字本来就相同),
  -y 跟 ASSUME_YES 走,--purge 跟 PURGE 走,check 的退出码按 0/10/1 解读
- 状态显示只读 version.txt 和 systemd 单元状态,版本和服务定义归它自己管
- 卸载 mihomo 不连带删除它,和 Sub-Store 同样处理

顺手把 Sub-Store 的服务控制菜单抽成通用的 unit_ctl_menu,两边共用,行为没变。
2026-08-12 16:14:36 +08:00
im0o a576846946 docs: 补上多开入站端口的配置片段
砍掉入站端口菜单时留了一句「请用手动编辑配置」,但没说该写什么,
等于一个悬空指引。补上 listeners 的最小可用片段和 IN-NAME 的用法。
2026-08-09 23:14:22 +08:00
im0o c9b410c65e refactor: 砍掉非刚需功能,修若干静默失败,新增 Sub-Store 模块
订阅的聚合、改名、筛选交给 Sub-Store 承担,脚本收窄为「管内核 + 管服务 +
生成一份最小可用配置」。1579 → 1542 行,但配置相关的多行 YAML 手术全部消失。

砍掉:
- 入站端口 listeners 全套、多订阅与订阅管理菜单、GEO 菜单、地区分组、
  局域网开关、备份还原菜单、URL 导入;管理接口那项改成只读显示密钥
- 配置菜单从 11 项减到 5 项,剩下的 YAML 改写只有顶层单键

修:
- ERR trap 在写操作里其实是失效的: `func || true` 会关掉整个函数体的
  errexit 且无法在内部恢复。所以改为逐条显式检查,并给所有写操作补
  require_root —— die 的 exit 是当前唯一还能可靠中止的机制
- cfg_set 用 sed 替换会损坏数据: 替换文本里 & 代表整条匹配,值含 & 时
  旧行会被塞进新值;| 和 \ 还会被改写成 &。改用 awk 整行重建,值走
  环境变量传入(-v 会解释转义序列,吃掉反斜杠)
- 订阅地址含 # 时会被正则截断,导致列表与改写的计数口径不一致、改错行、
  静默丢订阅。改用 awk 取最后一个标记位置来切
- cfg_backup 的 cp 失败仍返回 0 并吐出不存在的路径,让「改坏了就还原」
  整条链路空转
- do_update 里 install 失败被吞掉,然后拿旧二进制启动并报升级成功
- svc_state 的 list-unit-files|grep -q 撞 SIGPIPE + pipefail,装了也判为未装
- svc_enabled 对 disabled 单元输出两行
- latest_version 缺 --max-time,网络被挂住时菜单无限等
- 向导端口输错直接 die 掉整个菜单;重启失败没有任何提示

新增 Sub-Store(可选,不进一键安装):
- 原生 Node + systemd,装到 /opt/sub-store;不替你装 Node,只检测并给命令
- 更新走和内核升级同款闸门: node --check 验后端、unzip -t 验前端,
  备份 → 换上 → 起服务,起不来自动回滚
- 后端 API 无鉴权,随机路径就是唯一凭据,故默认绑 127.0.0.1 并打印 SSH 隧道命令
- 卸载 mihomo 不连带删除它,订阅数据在里面

验证: 三场景 × 9 项严格回归(保留 set -Eeuo pipefail 和 ERR trap)全过;
三种规则模式生成的配置用 PyYAML 解析通过;含 # 的订阅地址往返无损;
cfg_set 对 & | \ 五种输入均原样写入;两个 Sub-Store 资产地址经 API 确认存在。
2026-08-09 22:22:18 +08:00
im0o ce8623ccb9 fix: 没有入站端口时不该报「第 N 行出错」
进「配置管理 → 入站端口」而配置里一条入站都没有时,脚本会连报两次
错误然后退出。

cfg_listener_list 末尾是 grep 管道,grep 无匹配时退出码为 1,配上
pipefail 就把整个函数判为失败,触发 ERR trap。"没有入站"是正常状态,
不是错误,末尾补 || true。

两次报错是同一根因的两次现身:第一次在 $() 子 shell 里,只杀掉子 shell;
第二次是外层赋值继承了非零码,才真正终止脚本。
2026-08-09 18:57:26 +08:00
im0o c756a92ba3 feat: 多订阅、地区分组、回国模式、多入站、GEO 管理
回国模式生成 .mrs 规则集而不是用 GEOIP:国内站挂在境外 CDN 时解析出的
IP 不在本国段,只靠 GEOIP 会整片漏掉,所以域名维度打头、IP 维度兜底。

GEO 菜单列出数据文件的大小和更新时间,因为下载失败是静默的 —— 规则
一条都匹配不上,流量全落到 MATCH,看起来像「配置没生效」。

入站每条写成一行带标记的 YAML 流式映射,增删就是加一行删一行。
2026-08-09 18:36:59 +08:00
im0o 0704a27bac docs: 把削成单字的动词补回完整词语
装→安装、验→校验、起→启动、跑→运行 之类,脚本提示和 README 一起改。
2026-08-09 18:36:59 +08:00
im0o ab0476bd84 feat: 快捷命令 mihomo-up
装一个启动器到 PATH,每次执行都拉取最新脚本再运行,仓库更新后机器上
无需手动更新。

它同时落一份缓存,并在拉取失败、或拉到的内容 bash -n 不过时回落到缓存。
这个脚本管的是代理,最需要它的时候往往正是网络不正常的时候。

顺带按 think-twice 过了一遍提示文案,并让子命令失败时干净退出,
不再在人话提示后面追加一句「第 N 行出错」。
2026-08-09 18:36:59 +08:00
im0o 88ebdb990d feat: 一键安装、配置向导、卸载
原本只换内核二进制。现在补上从零到能用的完整链路:装内核 →
写 systemd 服务 → 向导生成 config.yaml → 启动,以及反过来的卸载清理。

所有配置改动统一走「先备份 → 改 → 用内核 -t 校验 → 不过就问是否还原」。
2026-08-09 18:36:58 +08:00
2 changed files with 1630 additions and 151 deletions
+237 -36
View File
@@ -1,101 +1,302 @@
# mihomo-up
一个 bash 脚本,用来在 Linux 服务器上**检查、安装、升级、回滚 [mihomo](https://github.com/MetaCubeX/mihomo) 内核**(Clash.Meta 的继任者,MetaCubeX 维护的代理核心)。可以直接跑交互菜单,也可以用子命令接进 cron / CI。
一个 bash 脚本,在 Linux 服务器上安装好、配置好、管起来 [mihomo](https://github.com/MetaCubeX/mihomo) 内核(Clash.Meta 的继任者,MetaCubeX 维护的代理内核)。
脚本只管内核二进制本身:它**不会**替你创建 systemd 服务、生成配置文件或设置订阅,这些需要你自己先准备好。
一条命令从零到能用:下载内核 → 写入 systemd 服务 → 用向导生成 `config.yaml` → 启动。之后修改订阅、更换端口、升级、回滚、卸载也都在同一个菜单里。
## 特性
安装完成后,这台机器上会多出这几样东西——**卸载时它们全都能一键清掉**:
- **双模式**:终端下无参数运行进入交互菜单;被管道/cron 调用时自动退化为安静的 `check`
- **两道安全闸门**:替换前先验证新二进制能运行且版本号对得上,再用新二进制 `-t` 校验你现有的配置,任一失败就中止、不动任何文件
- **自动备份与回滚**:替换前把旧版备份到 `/var/backups/mihomo/`(保留最近 3 份);升级后服务起不来会自动回滚并重启旧版
- **curl 一键运行友好**:交互输入读 `/dev/tty`,`bash <(curl ...)` 管道方式运行菜单照样能按键
- 支持 amd64 / arm64 / armv7,amd64 可指定微架构变体(v1/v2/v3/compatible)
| | 默认位置 |
|---|---|
| 内核二进制 | `/usr/local/bin/mihomo` |
| 配置文件 | `/etc/mihomo/config.yaml` |
| systemd 服务 | `/etc/systemd/system/mihomo.service` |
| 快捷命令 | `/usr/local/bin/mihomo-up` |
| 脚本缓存 | `/var/lib/mihomo-up/` |
| 内核备份 | `/var/backups/mihomo/` |
(可选装的 Sub-Store 在 `/opt/sub-store`、Patchbay 在 `/opt/patchbay`,卸载 mihomo 都不会动它们)
除此之外它不碰你系统里的任何东西。
## 环境要求
- Linux + bash
- 依赖命令:`curl`、`gzip`、`install`、`awk`(一般发行版自带)
- 升级操作需要 **root**(要写 `/usr/local/bin` 并重启服务)
- 服务的启停依赖 systemd 中名为 `mihomo` 的 service;没有的话脚本只替换二进制、跳过重启
- Linux + bash 4 以上
- 依赖命令:`curl`、`gzip`、`install`、`awk`、`sed`(一般发行版自带)
- 只有选装 Sub-Store 时才额外需要 `node` 和 `unzip`;脚本会检测并给出安装命令,不替你装
- 选装 Patchbay 需要 `tar` 和 `unzip`;它的运行时(bun)由它自己的安装脚本装一份私有副本,不碰系统
- 安装、升级、修改配置、卸载都需要 **root**。非 root 也能进菜单,会先提醒一句
- 没有 systemd 的机器(容器等)也能用:脚本跳过服务相关步骤,只管内核和配置,你自己 `mihomo -d /etc/mihomo` 启动起来
交互输入读的是 `/dev/tty` 而不是标准输入,所以 `bash <(curl ...)` 这种 stdin 已被占用的运行方式,菜单照样能按键。
## 快速开始
**交互菜单**:
**交互菜单**(推荐,首次安装和日常维护都用它):
```bash
bash <(curl -fsSL https://git.im0o.top/im0o/mihomo-up/raw/branch/main/mihomo-up.sh)
```
菜单第 1 项就是一键安装。运行完你会拿到:本机的 HTTP/SOCKS5 代理端口、一个 Web 面板地址和它的访问密钥、一个开机自启的 systemd 服务。
还会拿到一个 `mihomo-up` 命令——**以后直接输入它就能进菜单**,不用再翻上面这条 URL。
**命令行**:
```bash
chmod +x mihomo-up.sh
./mihomo-up.sh check # 只查不改:当前版本 vs 最新版本
sudo ./mihomo-up.sh update # 升级到最新版
sudo ./mihomo-up.sh update --version v1.19.28 # 装指定版本
sudo ./mihomo-up.sh rollback # 回滚到上一个备份
./mihomo-up.sh list # 查看本地备份
sudo ./mihomo-up.sh install # 一键安装:内核 + systemd + 配置向导 + 启动
./mihomo-up.sh check # 只查询不改动:当前版本 vs 最新版本
sudo ./mihomo-up.sh update # 只更换内核二进制,配置和服务定义不动
sudo ./mihomo-up.sh config # 重新运行配置向导
sudo ./mihomo-up.sh rollback # 内核回滚到上一个备份
sudo ./mihomo-up.sh uninstall # 卸载,会逐项问你配置和备份要不要删除
sudo ./mihomo-up.sh shortcut # 只安装 / 刷新 mihomo-up 快捷命令
sudo ./mihomo-up.sh substore # 安装 / 更新 Sub-Store(订阅聚合,可选)
sudo ./mihomo-up.sh patchbay # 安装 / 更新 Patchbay(网页编辑配置,可选)
```
菜单里另有:校验配置文件、服务控制(启停/状态/最近日志)等入口。
## 菜单里有什么
```
1. 一键安装 内核 + systemd + 配置,缺哪步补哪步
2. 检查更新 3. 升级内核 4. 装指定版本内核
5. 回滚内核 6. 查看内核备份
7. 配置管理 生成配置 / 改端口 / 看面板密钥 / 校验 / 手动编辑
8. 服务控制 启动 / 停止 / 重启 / 状态 / 日志 / 开机自启
9. Sub-Store 订阅聚合,可选,见下
p. Patchbay 网页编辑配置,可选,见下
u. 卸载 mihomo
```
## 一键安装做了什么
1. **下载内核**:按机器架构从 GitHub Releases 取对应的 `.gz` 并解压
2. **校验内核**:新二进制必须能执行,且 `-v` 自报的版本号和目标一致,否则不写入磁盘
3. **准备配置**:没有 `config.yaml` 就运行配置向导;已经有了就保持不动,只问一句要不要重做
4. **写入服务**:按 [MetaCubeX 官方文档](https://wiki.metacubex.one/startup/service/)的推荐写 `mihomo.service`。已存在且内容不同的话,旧文件先备份成 `.bak-<时间戳>`
5. **安装快捷命令**:问一句,可以拒绝。它是什么见「快捷命令 `mihomo-up`」一节
6. **启动服务**:`daemon-reload` → `enable`(开机自启)→ `restart`,启动不了就提示你看 `journalctl`
每一步都是「缺什么补什么」:已经安装过的机器再运行一遍,不会覆盖你现有的配置。
安装完成后会打印一段总结:代理端口怎么用、面板地址和密钥是什么、日志怎么看。
## 快捷命令 `mihomo-up`
一键安装会往 `/usr/local/bin/mihomo-up` 放一个启动器。它**不是脚本本体,而是每次执行都去拉取最新脚本再运行**——你更新了仓库,机器上下次输入 `mihomo-up` 就自动用上新版,不需要谁去手动更新。
```bash
mihomo-up # 进菜单,参数原样透传
mihomo-up check --json # 子命令照样能用,退出码也透传
```
和纯粹的"每次重新下载"不同的是,它会把拉到的脚本落一份缓存到 `/var/lib/mihomo-up/`,并在这两种情况下回落到缓存:
- **拉取失败**(网络断了、仓库挂了)。这条对代理管理脚本尤其要紧:你最需要它的时候,往往正是代理挂了、网络不正常的时候,那时候还得能进菜单重启服务、看日志。
- **拉到的东西没通过 `bash -n` 语法检查**(上游推了个坏版本,或者中间设备塞回来一个门户登录页)。宁可用旧的,也不以 root 执行来路不明的半个脚本。
抓取带 5 秒连接 / 20 秒总超时,网络卡住不会让菜单一直转着等。
fork 之后想让快捷命令指向你自己那份,安装的时候加 `--script-url <你的 raw 地址>`,或者设环境变量 `MIHOMO_UP_URL`。
> **cron 里别用它**:每次执行都联网拉取脚本,等于给定时任务多加一个失败点。定时任务直接指向缓存那份 `/var/lib/mihomo-up/mihomo-up.sh`,或者你自己固定的副本。
## 配置向导问什么
向导生成的是一份**最小可用配置**,够用,不臃肿。它只认**一条**订阅地址——多个机场的聚合、节点改名、筛选去重,交给 Sub-Store 那类工具做(见下一节),脚本这边不重复造。
| 问题 | 说明 |
|---|---|
| 订阅地址 | 机场给的,或 Sub-Store 输出的那条。写成 `proxy-providers`,每 24 小时自动更新 |
| 本地代理端口 | `mixed-port`,HTTP 和 SOCKS5 共用同一个端口,默认 7890 |
| 局域网共享 | `allow-lan`,开了同网段其它设备也能连(还要放行防火墙) |
| 管理接口 | 只允许本机 / 局域网公网可访问 / 不开启。面板和 API 都连这里 |
| 访问密钥 | 回车即自动生成随机串;管理接口开在 `0.0.0.0` 时务必设 |
| Web 面板 | 选是就写 `external-ui-url`,内核首次启动自己去下载 metacubexd |
| 分流规则 | 三选一,见下面的表 |
生成的分组是 `PROXY`(总开关,手动选,默认跟着 AUTO)和 `AUTO`(全部节点里自动挑延迟最低的)。
**分流规则**三选一,内网地址在哪种模式下都直连:
| 模式 | 生成的规则 | 用途 |
|---|---|---|
| 1 全部走代理 | `MATCH,PROXY` | 默认 |
| 2 指定地区直连、其余走代理 | `GEOIP,<CC>,DIRECT` + `MATCH,PROXY` | 常见的翻墙用法 |
| 3 指定地区走代理、其余直连 | `RULE-SET,...` + `MATCH,DIRECT` | 回国 / 分区代理 |
地区填两位 ISO 代码(`CN`、`US`、`JP`、`DE`…),小写自动转大写。
**模式 3(回国)**不用 `GEOIP`,而是生成两条 `.mrs` 规则集:域名维度打头,IP 维度兜底。原因是很多国内站挂着境外 CDN,域名解析出来的 IP 不在国内段,只靠 `GEOIP` 会整片漏掉。只有 `CN` 有成体系的域名列表,填别的国家代码时脚本会当场告诉你只能按 IP 匹配、会漏掉什么。
**改配置的安全网**:每次改动之前自动备份成 `config.yaml.bak-<时间戳>`(只留最近 10 份),改完立刻用内核 `-t` 校验。**校验不过会问你要不要还原**,服务正在运行的话再问一句要不要重启生效。配置文件权限是 `0640`,因为密钥就明文存在里面。
复杂配置(DNS、TUN、自定义规则、多开入站端口)请用「手动编辑配置」,它同样有备份、校验、还原兜底。
其中**多开入站端口**是最常被问到的一个,配置长这样:
```yaml
listeners:
- { name: in-7801, type: mixed, listen: 0.0.0.0, port: 7801, proxy: PROXY }
- { name: in-7802, type: mixed, listen: 0.0.0.0, port: 7802 }
```
`type` 可以是 `mixed`(HTTP + SOCKS5 同口)、`http`、`socks`。写了 `proxy:` 就**完全跳过 rules**,这个端口的流量一律走那个策略组或节点;不写就照常按 `rules` 分流。
想按端口区分又保留分流,用入站规则代替 `proxy:`:
```yaml
rules:
- GEOIP,CN,DIRECT # 顺序重要,先放该直连的
- IN-NAME,in-7801,PROXY
- MATCH,DIRECT
```
## Sub-Store(可选)
[Sub-Store](https://github.com/sub-store-org/Sub-Store) 是订阅聚合器:把多个机场和自建节点合成一条订阅地址,带 Web 界面,**能看到筛选后实际剩下哪些节点**。菜单第 9 项安装,它是独立服务,**不进一键安装,也不是用 mihomo 的前提**。
装完的用法是:在它的界面里加各个机场的订阅和自建节点 → 做一条「组合订阅」→ 复制它的 mihomo 格式输出地址 → 回本脚本「配置管理 → 生成配置」填进去。
**装法**:原生 Node + systemd,装到 `/opt/sub-store`。脚本**不替你装 Node**——装语言运行时是最容易搞坏服务器的操作,检测不到时它会打印你这个发行版的安装命令,你执行完再回来。另外需要 `unzip`。
**更新**(菜单第 2 项)和内核升级用同一套闸门:下载到临时目录 → `node --check` 验后端、`unzip -t` 验前端 → 备份旧的 → 换上 → 起服务 → **起不来自动回滚**。任一步不过都不动现有版本。
**安全上要知道的一件事**:Sub-Store 的后端 API **没有鉴权**,访问地址里那串随机路径就是唯一凭据,谁知道谁就能读走你所有订阅(里面带着机场账号)。所以脚本默认绑 `127.0.0.1`,装完打印现成的 SSH 隧道命令:
```bash
ssh -L 3001:127.0.0.1:3001 用户名@你的服务器
# 然后本机浏览器打开脚本给你的那条 http://127.0.0.1:3001/?api=... 地址
```
要公网直连也可以,但要你明确选,脚本会警告一次。另外注意:把 Sub-Store 生成的订阅链接发给别人时,链接里就含着后端地址。
卸载 mihomo **不会**连带删除 Sub-Store——你的订阅数据在里面。要删就走菜单第 9 项里的卸载。
## Patchbay(可选)
[Patchbay](https://git.im0o.top/im0o/mihomo-patchbay) 是编辑 mihomo 配置的网页工具:在浏览器里改配置、校验、直接重载内核,省得 SSH 上去用 vi。菜单 `p` 项安装,它同样是独立服务,**不进一键安装**。
**这里只是个入口**:装、更新、卸载全由 Patchbay 自己的 `install.sh` 完成,本脚本只负责把它拉下来执行(先过一遍 `bash -n`,语法不过就不以 root 运行),并把 `--mirror`、`-y` 和 `MIHOMO_BIN` / `MIHOMO_CONF_DIR` 原样传过去。所以 Patchbay 的版本、服务定义、环境变量都归它自己管,出问题去它的仓库反馈。
**前提**是 mihomo 已经装好、且配置里开了管理接口(`external-controller`)——Patchbay 靠管理接口读线路和触发重载。没开的话它会拒绝安装并告诉你先跑一遍配置向导。
装完只监听 `127.0.0.1:7580`,访问方式和访问令牌在安装结束时打印出来,用法和 Sub-Store 一样是 SSH 隧道:
```bash
ssh -N -L 7580:127.0.0.1:7580 用户名@你的服务器
# 然后本机浏览器打开 http://127.0.0.1:7580,填脚本给你的访问令牌
```
卸载 mihomo 同样**不会**连带删除 Patchbay,要删走菜单 `p` → 卸载。
## 升级和回滚
`update` 只更换内核二进制,不动你的配置和服务定义。替换前有两道闸门,任一不过就中止:
1. 新二进制能运行起来,且 `-v` 自报的版本号和目标一致
2. 用**新版本**去 `-t` 校验你**现有的**配置
第二道是为了挡住「新内核不认旧配置」这种升完才发现的问题。配置本来就有毛病、但你只想更换内核时,加 `--skip-conf-check` 跳过它。
替换前旧内核备份到 `/var/backups/mihomo/`(保留最近 3 份)。升级后服务启动不了会**自动回滚**到旧版并重启,然后提示你看 `journalctl -u mihomo -n 50`。
任何一步失败都不会留下半个系统:要么没动,要么已回滚。
## 卸载会删什么
```bash
sudo ./mihomo-up.sh uninstall # 逐项确认
sudo ./mihomo-up.sh uninstall --purge # 全部删除,不询问
```
直接删掉:内核二进制、`mihomo.service` 及其备份、`mihomo.service.d/` drop-in 目录、快捷命令和它的缓存。systemd 那边会先 stop 再 disable,然后 `daemon-reload` + `reset-failed` 把状态清干净。
会单独问你的两项:配置目录 `/etc/mihomo`(订阅、节点选择记录、面板文件都在里面)、内核备份目录 `/var/backups/mihomo`。留着的话下次重新安装能直接接上。
## 在 cron / CI 里用
无参数运行时,脚本会看 stdin 是不是终端:是就进菜单,被管道或 cron 调用就安静地运行 `check`。
`check` 的退出码专为脚本化设计:
| 退出码 | 含义 |
|---|---|
| 0 | 已是最新 |
| 10 | 有新版(或未安装) |
| 10 | 有新版(或还没安装) |
| 1 | 出错 |
例子——有新版时自动升级:
例子——有新版就自动升级:
```bash
mihomo-up.sh check && exit 0
[ $? -eq 10 ] && mihomo-up.sh update -y
```
加 `--json` 会额外输出一行机器可读的 JSON,方便接入监控:
加 `--json` 会额外输出一行机器可读的 JSON:
```json
{"current":"v1.19.27","latest":"v1.19.28","outdated":true}
```
## GitHub 直连不通时
内核、版本号、Web 面板都从 GitHub 下载。机器直连 GitHub 失败或太慢时,用 `--mirror` 指定一个反代前缀,脚本会把它拼在所有 GitHub 地址前面:
```bash
sudo ./mihomo-up.sh install --mirror https://ghfast.top/
```
带 `--mirror` 运行配置向导时,生成的配置里会额外写上走同一个镜像的 `geox-url`,免得内核首次启动下载 GeoIP 数据库时卡住。
## 选项一览
| 选项 | 作用 |
|---|---|
| `-y, --yes` | 非交互确认,全部默认同意 |
| `-n, --dry-run` | 只打印会做什么,不实际执行 |
| `--force` | 即使版本相同也重装(`install` 子命令等价于 `update --force`) |
| `--version <v>` | 指定版本,如 `v1.19.28` |
| `--no-restart` | 装完不启动服务 |
| `-y, --yes` | 非交互确认,所有询问都当作同意 |
| `-n, --dry-run` | 只打印会做什么,不实际改动 |
| `--force` | 版本相同也重新安装 |
| `--version <v>` | 指定内核版本,如 `v1.19.28` |
| `--no-restart` | 安装完成后不启动服务 |
| `--purge` | `uninstall` 时连配置目录和备份一起删除 |
| `--skip-conf-check` | 升级时不用新版本预校验现有配置 |
| `--json` | `check` 时额外输出一行 JSON |
| `--arch <a>` | 覆盖自动识别的架构:`amd64` / `arm64` / `armv7` |
| `--variant <v>` | amd64 微架构变体:`v1` / `v2` / `v3` / `compatible` |
| `--bin <path>` | 二进制路径,默认 `/usr/local/bin/mihomo` |
| `--mirror <url>` | GitHub 反代前缀,用法见上一节 |
| `--script-url <u>` | 快捷命令每次去拉的脚本地址(fork 后指到你自己那份) |
| `--bin <path>` | 内核路径,默认 `/usr/local/bin/mihomo` |
| `--conf-dir <dir>` | 配置目录,默认 `/etc/mihomo` |
| `--service <name>` | systemd 服务名,默认 `mihomo` |
| `-v` | 打印脚本自身版本 |
## 默认值与环境变量
命令行选项优先级最高,其次是环境变量,最后是下面这些默认值:
| 默认值 | 环境变量 |
|---|---|
| `/usr/local/bin/mihomo` | `MIHOMO_BIN` |
| `/etc/mihomo` | `MIHOMO_CONF_DIR` |
| `mihomo`(systemd 服务名) | `MIHOMO_SERVICE` |
| `/var/backups/mihomo` | `MIHOMO_BACKUP_DIR` |
| 空(不用镜像) | `MIHOMO_MIRROR` |
| `/usr/local/bin/mihomo-up`(快捷命令) | `MIHOMO_UP_LAUNCHER` |
| `/var/lib/mihomo-up`(脚本缓存) | `MIHOMO_UP_CACHE` |
| 仓库 raw 地址(快捷命令拉取源) | `MIHOMO_UP_URL` |
| `/opt/sub-store`(Sub-Store 目录) | `SUBSTORE_DIR` |
| `sub-store`(Sub-Store 服务名) | `SUBSTORE_SERVICE` |
| `/opt/patchbay`(Patchbay 目录) | `PATCHBAY_PREFIX` |
| `patchbay`(Patchbay 服务名) | `PATCHBAY_SERVICE` |
| Patchbay 仓库 raw 地址(安装脚本拉取源) | `PATCHBAY_INSTALL_URL` |
备份最多保留 3 份(脚本内常量 `KEEP=3`)。
内核备份最多保留 3 份(脚本内常量 `KEEP=3`)。配置备份不自动清理,积累多了自己删除 `config.yaml.bak-*`。
## 升级时发生了什么
## 参考
1. 从 GitHub Releases 下载对应架构的 `.gz` 包并解压
2. **闸门 1**:新二进制必须能执行,且 `-v` 报告的版本号与目标一致
3. **闸门 2**:若存在 `config.yaml`,用新二进制 `-t` 校验现有配置,失败即中止
4. 备份旧二进制 → 停服务 → 安装新版 → 启动服务
5. 启动失败则**自动回滚**到刚才的备份并重启,最后提示你查 `journalctl -u mihomo -n 50`
systemd 服务写法来自 [MetaCubeX 官方文档](https://wiki.metacubex.one/startup/service/)。
任何一步失败都不会留下半个新系统:要么没动,要么已回滚。
一键安装和卸载的思路参考了 [ForLoveIcu/mihomo-for-linux-install](https://github.com/ForLoveIcu/mihomo-for-linux-install) 和 [nelvko/clash-for-linux-install](https://github.com/nelvko/clash-for-linux-install)。
+1390 -112
View File
File diff suppressed because it is too large Load Diff