Linux 运行 mihomo 内核:桌面客户端与 systemd 命令行部署流程

对比 Linux 桌面图形客户端与纯命令行两条路线,讲清二进制放置、配置目录、systemd 服务文件与终端代理环境变量。

先选路线:桌面客户端或独立服务

有桌面环境、需要经常切换策略组时,优先使用带图形界面的 Clash 客户端;通过 SSH 管理服务器,或需要退出登录后持续运行时,选择 mihomo 配合 systemd。mihomo 是 Clash Meta 路线的代理内核,不自带完整的桌面操作界面,下载内核可执行文件并不等于安装了图形客户端。

检查项桌面客户端systemd 独立服务
日常操作界面导入订阅、选择策略维护 YAML,查看服务日志
配置来源客户端管理的配置与覆写明确指定的 config.yaml
启动时机通常跟随桌面登录,取决于客户端设置启用系统服务后随系统启动
适用环境个人 Linux 桌面服务器、长期运行的主机

桌面路线:安装、导入与验证

确认架构与安装格式

先运行 uname -m。常见的 x86_64 对应 amd64 架构,aarch64 对应 arm64;这两个名称不能只凭“64 位”互换。Debian、Ubuntu 通常选择客户端提供的 DEB 包,Fedora 等系统通常选择 RPM 包。AppImage 是否需要额外运行依赖,以该客户端说明为准。

在客户端下载页选择 Linux 平台,再核对架构和安装格式。以已经保存到当前目录的 DEB 安装包为例,可在文件管理器中打开,也可用 sudo apt install ./ 后接实际文件名安装。不要把独立内核压缩包当作 DEB 包交给包管理器。

按功能检查界面

  1. 配置页:导入订阅链接或本地 YAML,完成后将目标配置设为当前配置。链接可能包含访问凭据,不要贴到公开日志中。
  2. 代理页:将模式设为规则模式,再检查规则引用的策略组是否选中了可用代理。导入成功不代表策略组已经选对。
  3. 设置页:查看实际混合端口,记录是否为 7890,然后按需开启系统代理。客户端界面名称可能是“设置”或“网络设置”,以当前版本显示为准。
  4. 日志页:发起一次请求,观察是否出现配置解析、端口绑定或上游连接错误。不要仅凭托盘图标判断流量走向。

桌面系统代理只影响愿意读取该设置的程序。终端中的 curl、部分开发工具及后台服务未必跟随,因此后文还会单独设置终端环境变量。若已选择桌面路线,可以阅读验证与排障部分;独立服务安装步骤不需要重复执行。

命令行路线:固定程序和配置目录

以下命令面向使用 systemd 的 Debian、Ubuntu 类系统,并假定当前账户具有 sudo 权限。容器、精简发行版或 WSL 环境不一定以 systemd 为初始化系统,先运行 ps -p 1 -o comm=;输出不是 systemd 时,不能直接照搬服务管理命令。

安装可执行文件

从项目发布渠道取得匹配架构与 CPU 要求的 Linux 内核包,解压后把可执行文件命名为 mihomo,放到当前目录。以下命令不会下载文件;安装前确认当前目录中的文件就是准备使用的内核。

uname -m
ps -p 1 -o comm=
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

-v 显示的是实际安装版本。建议将该输出与部署记录一起保存,后续排查配置字段兼容性时使用,不根据客户端窗口的版本号推测内核版本。

创建专用账户与目录

sudo useradd --system --user-group \
  --home-dir /var/lib/mihomo \
  --shell /usr/sbin/nologin mihomo

sudo install -d -m 0750 -o root -g mihomo /etc/mihomo
sudo install -d -m 0750 -o mihomo -g mihomo /var/lib/mihomo
  • /usr/local/bin/mihomo:程序文件,由 root 管理,服务账户不能覆盖。
  • /etc/mihomo/config.yaml:主配置,由管理员编辑,服务账户只需读取。
  • /var/lib/mihomo:运行数据目录,用于缓存及按配置需要保存的资源。

账户创建只执行一次;提示用户已存在时,先检查现有账户用途,不要删除后重建。配置中的 provider、规则集或数据库若使用相对路径,应结合 -d 指定的数据目录核对实际位置,不要假设路径总是相对于主配置文件。

先用最小配置确认服务可运行

初次部署先验证“程序能启动、配置能读取、端口能监听”,再接入实际订阅。下面是用于启动检查的直连配置,不含远端代理,因此即使请求成功,也只能证明本机代理入口工作,不能证明已通过代理节点访问。

sudo tee /etc/mihomo/config.yaml > /dev/null <<'YAML'
mixed-port: 7890
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
ipv6: false

rules:
  - MATCH,DIRECT
YAML

sudo chown root:mihomo /etc/mihomo/config.yaml
sudo chmod 0640 /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml

mixed-port 在同一个端口接受 HTTP 与 SOCKS 代理连接;allow-lan: false 将服务限制为本机使用。mode: rule 按规则顺序处理连接,末尾的 MATCH,DIRECT 在本例中让全部请求直连。-t 用于检查配置,不会把服务常驻在后台。

替换为真实代理配置时检查三处

  1. 订阅格式:内核的 -f 读取配置文件,不直接接收订阅 URL。单纯的节点列表也不等于含通用字段、策略组和规则的完整配置。
  2. 引用名称:rules 中引用的策略组必须存在,策略组引用的节点或 provider 也必须能够解析。
  3. 资源权限:需要下载或更新的 provider、规则集应写入服务账户可写的数据目录,而不是只读的 /etc/mihomo。

编写 systemd 服务并启用自启动

将下面内容保存为 /etc/systemd/system/mihomo.service。服务使用普通专用账户,适用于本文的本机显式代理方案。StateDirectory 管理运行数据目录,ProtectSystem=strict 限制文件系统写入范围。

[Unit]
Description=mihomo local proxy service
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=mihomo
Group=mihomo
StateDirectory=mihomo
StateDirectoryMode=0750
WorkingDirectory=/var/lib/mihomo
ExecStartPre=/usr/local/bin/mihomo -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
ExecStart=/usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5s
UMask=0027
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/mihomo

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo.service
systemctl is-enabled mihomo.service
systemctl is-active mihomo.service
sudo systemctl status mihomo.service --no-pager -l
sudo journalctl -u mihomo.service -b -n 80 --no-pager

enable 设置随系统启动,--now 同时立即启动。network-online.target 的实际等待行为取决于系统网络管理服务,并不保证所有远端地址已经可达。网络资源下载失败时,应结合日志判断是解析、连接还是权限问题。

修改服务文件后要先执行 daemon-reload 再重启;只修改 YAML 时,先执行前面的 -t 检查,成功后运行 sudo systemctl restart mihomo.service 即可。本服务没有定义 ExecReload,不要把 systemctl reload 当作已经配置好的热重载操作。

终端代理:先显式测试,再设置变量

确认本机入口确实在监听

sudo ss -lntp 'sport = :7890'
curl --noproxy "" --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 \
  -I https://clash03.com/

第一条命令检查 TCP 监听,预期本机地址为 127.0.0.1:7890,而不是向所有网卡开放的 0.0.0.0:7890。第二条显式指定代理,避免先前设置的环境变量干扰测试;它不提供延迟或出口位置的保证。使用最小直连配置时,流量仍然直接访问目标站点。

为当前 shell 设置代理

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5h://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1

curl --connect-timeout 10 --max-time 30 -I https://clash03.com/

https_proxy 的值仍是 http://,表示通过本机 HTTP 代理建立 HTTPS 连接,并不要求本机代理入口使用 TLS。对于支持该写法的程序,socks5h:// 表示将目标主机名交给 SOCKS 代理端处理;如果程序优先读取 http_proxy 或 https_proxy,则不一定使用 all_proxy。

这些变量只影响当前 shell 及其之后启动的子进程,不会自动应用到已运行的浏览器、其他登录会话或系统级服务。需要持久化时,可按所用 shell 写入 ~/.bashrc 或 ~/.zshrc;不要为了单个程序就把代理变量写进所有系统服务的环境。

unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

清除变量后,新启动的命令不再从这些变量读取代理。sudo 默认可能过滤环境变量,Git、包管理器等工具也可能有自己的代理配置,遇到“curl 能用、其他命令不能用”时,应分别检查工具配置,而不是立即更换节点。

常见故障:按进程、配置、连接分层检查

现象优先检查处理方向
Exec format erroruname -m 与二进制架构换用匹配架构的构建
Illegal instruction构建要求的 CPU 指令集选择项目提供的兼容构建
address already in usess -lntp 中的占用进程停止重复内核,或统一修改端口
permission denied配置读取权限及数据目录写权限修正属主、路径或安全策略
配置检查通过但请求失败策略组选择、上游可达性、资源加载日志区分语法有效与连接可用

服务反复重启

先运行 sudo systemctl stop mihomo.service,避免日志持续刷屏;使用同一服务账户执行 -t 检查,再查看本次启动日志。若失败次数触发 systemd 启动限制,修正原因后运行 sudo systemctl reset-failed mihomo.service,然后重新启动。不要仅增加重试次数来掩盖 YAML 错误。

服务正常,但终端无法连接

先核对 curl 指向的地址与 mixed-port 是否一致。把端口从 7890 改为 7891 后,系统代理、终端变量及应用自己的代理设置都要同步更新。若在另一台机器上连接,127.0.0.1 指的是那台机器本身,不是运行 mihomo 的主机。

TUN 不在本服务的权限范围内

TUN 通过虚拟网络设备与路由接管流量,和设置 HTTP 代理变量不是同一机制。它涉及 /dev/net/tun、网络管理能力、路由和 DNS 配置;本文服务有意不授予这些权限。直接把 tun.enable 改为 true 不能保证工作。需要 TUN 时应按对应客户端或内核文档单独设计权限与路由,并确认不会与其他 VPN 冲突。

更新与回退:保留可运行配置

  1. 更新前记录 mihomo -v 的输出,并备份主配置及当前程序文件。备份含订阅信息时保持受限权限。
  2. 将新程序先放到临时位置,用它对现有配置执行 -t。检查通过只代表配置可解析,仍需观察实际启动。
  3. 停止服务后替换程序,维持程序文件的 root 属主和执行权限,再启动服务。
  4. 检查 systemctl is-active、最近日志及一次显式代理请求;如果异常,恢复旧程序和原配置后重启。

完成部署的判断标准应同时包含三项:服务状态正常、本机端口符合预期、实际请求命中预期策略。桌面客户端适合交互式管理,systemd 适合固定路径和长期运行;无论采用哪条路线,都应让配置位置、代理入口和更新方式保持清楚,避免出现多个内核同时运行却无法辨认流量归属的情况。字段细节可继续查阅配置大全,首次导入配置可参考快速上手。

Clash 下载按平台选择客户端