安装: - 新增 install 子命令和菜单第 1 项「一键安装」: 装内核 → 写 systemd → 跑配置向导 → enable + start,装完打印代理端口 / 面板地址 / 密钥 / 日志命令 - systemd unit 按 MetaCubeX 官方文档写入,旧 unit 内容不同时先备份 配置: - 新增配置向导,问 7 个问题生成最小可用配置 (订阅 provider、mixed-port、 allow-lan、external-controller、secret、Web 面板、分流规则) - 新增「配置管理」菜单: 换订阅 / 改端口 / 局域网共享 / 面板密钥 / URL 导入 / 校验 / 手动编辑 / 备份还原。每次改动前自动备份,改完 -t 校验, 不过则询问还原,服务在跑再询问重启 卸载: - 新增 uninstall 子命令和菜单项: stop + disable + 删 unit 和 drop-in + daemon-reload + reset-failed + 删二进制,配置目录和内核备份单独询问 - --purge 全删不问 其它: - --mirror 支持 GitHub 反代前缀,带 mirror 时生成的配置一并写走镜像的 geox-url - --service 自定义服务名、--skip-conf-check 跳过升级前的配置预校验 - 服务菜单新增开机自启开关和重写服务文件 - 修复 ask_default 与 ask 的局部变量重名: bash 动态作用域下 printf -v 写进了 ask 自己的变量,导致向导除默认值外的输入全部丢失 - 修复输入流 EOF 时向导在「订阅不能空」处死循环 - 修复无配置时改端口直接 die 退出菜单、查版本失败 die 掉整个会话、 --dry-run 被 root 检查提前挡掉等问题 - 生成的 find-process-mode 加引号,避免被解析成布尔值 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XpjLPV4JvAsuq9ACb3u6B4
mihomo-up
一个 bash 脚本,在 Linux 服务器上装好、配好、管住 mihomo 内核(Clash.Meta 的继任者,MetaCubeX 维护的代理内核)。
一条命令从零到能用:下载内核 → 写 systemd 服务 → 用向导生成 config.yaml → 启动。之后改订阅、换端口、升级、回滚、卸载也都在同一个菜单里。
它管这三样东西,别的不碰:
| 默认位置 | |
|---|---|
| 内核二进制 | /usr/local/bin/mihomo |
| systemd 服务 | /etc/systemd/system/mihomo.service |
| 配置文件 | /etc/mihomo/config.yaml |
快速开始
交互菜单(推荐,装机和日常维护都用它):
bash <(curl -fsSL https://git.im0o.top/im0o/mihomo-up/raw/branch/main/mihomo-up.sh)
菜单第 1 项就是一键安装。跑完你会拿到:本机的 HTTP/SOCKS5 代理端口、一个 Web 面板地址和它的访问密钥,以及一个开机自启的 systemd 服务。
命令行:
chmod +x mihomo-up.sh
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 # 卸载,会逐项问你配置和备份删不删
菜单里有什么
1. 一键安装 内核 + systemd + 配置,缺哪步补哪步
2. 检查更新 3. 升级内核 4. 装指定版本内核
5. 回滚内核 6. 查看内核备份
7. 配置管理 换订阅 / 改端口 / 局域网共享 / 面板密钥 / 导入配置 / 校验 / 编辑 / 备份还原
8. 服务控制 启停 / 重启 / 状态 / 最近日志 / 开机自启 / 重写服务文件
9. 卸载
一键安装做了什么
- 下内核:按机器架构从 GitHub Releases 取对应的
.gz并解压 - 验内核:新二进制必须能执行,且
-v自报的版本号和目标一致,否则不落盘 - 配文件:没有
config.yaml就跑配置向导(下面详述);已经有了就保持不动,只问一句要不要重做 - 写服务:按 MetaCubeX 官方文档的推荐写
mihomo.service;已存在且内容不同的话,旧文件先备份成.bak-<时间戳> - 起服务:
daemon-reload→enable(开机自启)→restart,起不来就提示你看journalctl
装完会打印一段总结:代理端口怎么用、面板地址和密钥是什么、日志怎么看。
配置向导问什么
向导生成的是一份最小可用配置,够跑,不臃肿:
| 问题 | 说明 |
|---|---|
| 订阅链接 | 机场给的 http(s) 地址,写成 proxy-providers,每 24 小时自动更新一次 |
| 本地代理端口 | mixed-port,HTTP 和 SOCKS5 共用,默认 7890 |
| 局域网共享 | allow-lan,开了同网段其它设备也能连(记得放行防火墙) |
| 管理接口 | 只允许本机 / 局域网公网可访问 / 不开。面板和 API 都连这里 |
| 访问密钥 | 回车即自动生成随机串;管理接口开在 0.0.0.0 时务必设 |
| Web 面板 | 选是就写 external-ui-url,内核首次启动自己去下载 metacubexd |
| 分流规则 | 国内直连、其余走代理(默认),或者全部走代理 |
生成的分组是 PROXY(手动选,默认跟着 AUTO)和 AUTO(自动挑延迟最低的),规则里内网地址一律直连。
改配置不用手写 YAML:菜单「配置管理」能直接换订阅、改端口、开关局域网共享、改面板密钥。每次改动之前自动备份成 config.yaml.bak-<时间戳>,改完立刻用内核 -t 校验,校验不过会问你要不要还原,服务在跑的话再问一句要不要重启生效。
需要手写的复杂配置(DNS、TUN、自定义规则)请用菜单里的「手动编辑配置」,或者用「从 URL 导入完整配置」整份换掉——这两条路同样有备份、校验、还原兜底。
升级和回滚
update 只换内核二进制,不动你的配置和服务定义。两道闸门:
- 新二进制能跑起来,且版本号对得上
- 用新版本去
-t校验你现有的配置,通不过就中止,一个文件都不动 (配置本来就有问题、但你只想换内核时,加--skip-conf-check跳过这道)
替换前旧内核备份到 /var/backups/mihomo/(保留最近 3 份)。升级后服务起不来会自动回滚到旧版并重启,然后提示你看 journalctl -u mihomo -n 50。
任何一步失败都不会留下半个系统:要么没动,要么已回滚。
卸载会删什么
sudo ./mihomo-up.sh uninstall # 逐项确认
sudo ./mihomo-up.sh uninstall --purge # 全删,不问
直接删掉:内核二进制、mihomo.service 及其备份、mihomo.service.d/ drop-in 目录,并 daemon-reload + reset-failed 清干净 systemd 状态(服务会先 stop 再 disable)。
单独问你:配置目录 /etc/mihomo(订阅、节点选择记录、面板文件都在里面)、内核备份目录 /var/backups/mihomo。留着的话下次重装能直接接上。
在 cron / CI 里用
无参数运行时,脚本会看 stdin 是不是终端:是就进菜单,被管道或 cron 调用就安静地跑 check。
check 的退出码专为脚本化设计:
| 退出码 | 含义 |
|---|---|
| 0 | 已是最新 |
| 10 | 有新版(或还没安装) |
| 1 | 出错 |
例子——有新版就自动升级:
mihomo-up.sh check && exit 0
[ $? -eq 10 ] && mihomo-up.sh update -y
加 --json 会额外输出一行机器可读的 JSON:
{"current":"v1.19.27","latest":"v1.19.28","outdated":true}
选项一览
| 选项 | 作用 |
|---|---|
-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 |
--mirror <url> |
GitHub 下载前缀,见下 |
--bin <path> |
内核路径,默认 /usr/local/bin/mihomo |
--conf-dir <dir> |
配置目录,默认 /etc/mihomo |
--service <name> |
systemd 服务名,默认 mihomo |
-v |
打印脚本自身版本 |
GitHub 不通的机器
内核、版本号、Web 面板都从 GitHub 下载。国内机器直连失败时,用 --mirror 指定一个反代前缀,脚本会把它拼在所有 GitHub 地址前面:
sudo ./mihomo-up.sh install --mirror https://ghfast.top/
带 --mirror 跑配置向导时,生成的配置里会额外写上走同一个镜像的 geox-url,免得内核首次启动下载 GeoIP 数据库时卡住。
默认值与环境变量
命令行选项优先级最高,其次是环境变量,最后是下面这些默认值:
| 默认值 | 环境变量 |
|---|---|
/usr/local/bin/mihomo |
MIHOMO_BIN |
/etc/mihomo |
MIHOMO_CONF_DIR |
mihomo(systemd 服务名) |
MIHOMO_SERVICE |
/var/backups/mihomo |
MIHOMO_BACKUP_DIR |
| 空(不用镜像) | MIHOMO_MIRROR |
内核备份最多保留 3 份(脚本内常量 KEEP=3)。配置备份不自动清理,攒多了自己删 config.yaml.bak-*。
环境要求
- Linux + bash 4 以上
- 依赖命令:
curl、gzip、install、awk、sed(一般发行版自带) - 安装、升级、改配置、卸载都需要 root,非 root 进菜单会先提醒一句
- 没有 systemd 的机器(容器等)也能用:脚本会跳过服务相关步骤,只管内核和配置,你自己
mihomo -d /etc/mihomo拉起来 - 交互输入读
/dev/tty,所以bash <(curl ...)这种 stdin 被占用的跑法照样能按键
参考
systemd 服务写法来自 MetaCubeX 官方文档。一键安装和卸载的思路参考了 ForLoveIcu/mihomo-for-linux-install 和 nelvko/clash-for-linux-install。