Linux 运行 mihomo 内核:命令行部署、配置目录与 systemd 开机自启

从下载对应架构的 mihomo 二进制开始,讲清配置目录、config.yaml 放置、systemd 服务文件编写与桌面环境系统代理设置。

1. 部署范围:先运行本机代理,再考虑 TUN

本文采用 Debian、Ubuntu 一类使用 systemd 的 Linux 环境。需要具备 sudo 权限,并安装 gzip、curl、iproute2 和 CA 证书。先执行下面的检查,确认 PID 1 是 systemd;容器、部分 WSL 环境和其他初始化系统不能直接照用服务管理步骤。

ps -p 1 -o comm=
uname -m
sudo apt update
sudo apt install gzip curl iproute2 ca-certificates

mihomo 是由 Clash Meta 演进而来的代理内核,不是带窗口的桌面客户端。内核负责读取 YAML、建立代理连接与匹配规则;桌面菜单、订阅管理界面和系统代理开关不由这个二进制自动提供。

  • 本机应用入口:本文使用 127.0.0.1:7890,同一 mixed 端口接收 HTTP 代理和 SOCKS5 请求。
  • 服务权限:使用专用的非登录用户,不为普通代理端口授予 root 权限。
  • 接管范围:先验证显式代理;本文不配置透明代理、防火墙转发或 TUN 虚拟网卡。

2. 二进制选择:核对架构、解压并安装

先查看 uname -m 的输出,再到下载页选择对应的 Linux 内核文件。不要把客户端的 DEB、RPM 安装包当作独立内核压缩包使用,也不要仅凭设备品牌判断处理器架构。

命令输出文件架构方向安装前检查
x86_64Linux amd64若有 CPU 指令集分档,按发布说明选择兼容档位。
aarch64Linux arm64确认运行的是 64 位用户空间。
armv7l对应的 Linux ARM 构建核对 ARM 版本及浮点 ABI,不能直接使用 arm64 文件。

以下操作约定:已把下载的 .gz 内核压缩包保存在当前用户的 Downloads 目录,并在本地重命名为 mihomo.gz。这是操作用的本地文件名,不代表发布包的原始命名。若下载的是未压缩二进制,跳过 gzip 解压步骤。

gzip -dc "$HOME/Downloads/mihomo.gz" > "$HOME/Downloads/mihomo"
chmod 0755 "$HOME/Downloads/mihomo"
"$HOME/Downloads/mihomo" -v
sudo install -m 0755 "$HOME/Downloads/mihomo" /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

版本命令应输出该文件自身的版本信息。出现 Exec format error 时,优先检查 CPU 架构与压缩状态;出现 Illegal instruction 时,检查是否误选了要求更高指令集的构建。不要通过反复添加 sudo 来处理这两类错误。

3. 目录分工:配置放 /etc,运行数据放 /var/lib

固定目录可以避免终端手动启动与 systemd 启动读取不同文件。本文明确使用 -f 指定配置文件,使用 -d 指定数据目录,不依赖当前登录用户的默认配置路径。

路径用途权限原则
/usr/local/bin/mihomo内核可执行文件由 root 安装,服务用户只需执行。
/etc/mihomo/config.yaml主配置文件由 root 修改,mihomo 组读取。
/var/lib/mihomo缓存、规则资源与提供者文件服务用户可写。
/etc/systemd/system/mihomo.servicesystemd 服务单元由 root 管理。

首次部署时创建服务账号和目录。如果系统已经存在同名账号,先检查 id mihomo 的结果,再确认是否复用;不要重复执行创建命令并忽略报错。

sudo useradd --system --user-group --home-dir /var/lib/mihomo --shell /usr/sbin/nologin mihomo
sudo install -d -o root -g mihomo -m 0750 /etc/mihomo
sudo install -d -o mihomo -g mihomo -m 0750 /var/lib/mihomo

订阅文件可能包含服务器地址、密码和访问令牌。不要把它存入公共网站目录,也不要原样贴到工单。规则提供者或代理提供者的相对路径通常围绕数据目录解析,建议使用 ./rules/、./providers/ 这类数据目录内路径,并检查服务账号的写入权限。

4. config.yaml:先验证监听,再导入真实配置

最小配置只用于验证启动链路

下面的 YAML 不包含代理节点,所有请求最终走 DIRECT。它只能验证内核、文件权限和本地端口是否正常,不能证明远端代理已经可用。先建立这一基线,再导入完整配置,能把部署问题与订阅问题分开。

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

proxies: []
proxy-groups: []
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

-t 用于检查配置。检查成功后,再以前台方式运行一次。另开终端执行后文的 curl 测试;测试完成按 Ctrl+C 退出,避免前台进程与 systemd 服务争用端口。

sudo -u mihomo /usr/local/bin/mihomo \
  -d /var/lib/mihomo -f /etc/mihomo/config.yaml

完整订阅需要包含节点与策略定义

通过服务方提供的 mihomo 或 Clash Meta 配置入口取得完整 YAML,并在本地另存为 Downloads/config.yaml。仅有一组节点 URI、Base64 文本或网页内容,不能直接作为主配置运行。一个只含 proxies 的节点集合,也不等于包含规则与策略组的完整主配置。

sudo cp -a /etc/mihomo/config.yaml /etc/mihomo/config.yaml.bak
sudo install -o root -g mihomo -m 0640 \
  "$HOME/Downloads/config.yaml" /etc/mihomo/config.yaml

sudoedit /etc/mihomo/config.yaml

sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
  • 在编辑器里确认顶层 mixed-port: 7890、allow-lan: false 与 bind-address: 127.0.0.1,已有同名键时修改原值,不要重复追加。
  • 初次部署先关闭配置里的 tun.enable。若启用了监听 53 端口的 DNS 服务,也应先停用或另作权限规划;本文服务单元不提供这些权限。
  • 检查 rules 引用的策略名称是否确实存在于 proxy-groups 或节点列表。YAML 缩进使用空格,不使用 Tab。
  • 初次运行可先移除非必需的控制接口配置。需要外部控制器时,绑定回环地址并设置访问密钥,不要直接暴露到公网。

5. systemd 服务:固定用户、路径与启动参数

确认前台进程已经退出,然后创建服务文件。这里使用绝对路径,避免 systemd 的环境变量和交互式终端不同导致找不到程序。network-online.target 只表示系统网络就绪流程,不保证订阅地址或远端节点已经可达。

sudo tee /etc/systemd/system/mihomo.service > /dev/null <<'UNIT'
[Unit]
Description=mihomo local proxy service
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=mihomo
Group=mihomo
WorkingDirectory=/var/lib/mihomo
ExecStart=/usr/local/bin/mihomo -d /var/lib/mihomo -f /etc/mihomo/config.yaml
Restart=on-failure
RestartSec=5s
UMask=0077
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
UNIT

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
sudo journalctl -u mihomo.service -b -n 80 --no-pager

enable --now 同时配置开机启动并立即启动服务。is-enabled 应显示 enabled,is-active 应显示 active。这些结果只确认进程状态,代理能否访问目标仍要通过下一节验证。

配置修改与服务文件修改分开处理

  • 只修改 YAML:先运行 mihomo -t 的完整检查命令,通过后执行 sudo systemctl restart mihomo。
  • 修改 service:先执行 sudo systemctl daemon-reload,再重启服务。
  • 临时停止:执行 sudo systemctl stop mihomo,不会取消下次开机启动。
  • 取消自启并停止:执行 sudo systemctl disable --now mihomo。

此服务未定义 ExecReload,不要假设 systemctl reload mihomo 可用。采用配置检查后重启的方式更明确;重启会中断现有连接,应避开正在进行的下载与远程会话。

6. 连接验证:监听、HTTP 与 SOCKS5 分层检查

先查端口,再测试请求。使用 -q 避免用户的 curl 配置文件影响结果,使用 --noproxy "" 避免已有的绕过代理列表跳过本次测试。以下地址只用于示范请求流程,不作为节点测速基准。

sudo ss -lntp | grep ':7890'

curl -q --noproxy "" --proxy http://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 -I https://example.com/

curl -q --noproxy "" --proxy socks5h://127.0.0.1:7890 \
  --connect-timeout 10 --max-time 30 -I https://example.com/

socks5h 表示把目标域名交给代理端处理;它与由 curl 本地解析目标域名的 socks5 不同。使用 mihomo 时,实际解析路径还受内核 DNS 配置影响,不能仅凭这个参数推断所有 DNS 流量的出口。

  • 连接被拒绝:检查内核是否运行、端口是否一致,以及是否只监听在其他地址。
  • 代理连接成功但目标超时:检查实际命中的规则、所选策略和节点,而不是继续修改本地监听端口。
  • 使用最小配置时请求成功:只能说明显式代理入口可用,流量仍是直连。
  • 验证真实节点:在完整配置下观察 journalctl -u mihomo -f,核对该请求命中的规则及出站策略。不要把 HTTP CONNECT 的建立提示当作目标站点已成功响应。

7. 桌面与终端:分别设置代理入口

GNOME 桌面设置

GNOME 可进入「设置」→「网络」→「网络代理」,选择「手动」。HTTP 与 HTTPS 代理均填主机 127.0.0.1、端口 7890;SOCKS 主机也可使用相同地址与端口。HTTPS 这一栏表示为 HTTPS 目标指定代理,不要求本地端口本身提供 TLS。

在当前桌面用户的终端中,也可用下列命令设置 GNOME。不要加 sudo,否则可能改到 root 用户的配置,或无法访问当前用户的会话总线。

gsettings set org.gnome.system.proxy.http host '127.0.0.1'
gsettings set org.gnome.system.proxy.http port 7890
gsettings set org.gnome.system.proxy.https host '127.0.0.1'
gsettings set org.gnome.system.proxy.https port 7890
gsettings set org.gnome.system.proxy.socks host '127.0.0.1'
gsettings set org.gnome.system.proxy.socks port 7890
gsettings set org.gnome.system.proxy ignore-hosts "['localhost', '127.0.0.0/8', '::1']"
gsettings set org.gnome.system.proxy mode 'manual'

当前终端的环境变量

桌面代理不保证终端程序自动采用相同设置。对支持代理环境变量的命令行工具,可在当前 shell 设置以下值。变量只影响之后启动的程序;不同工具对大小写变量、SOCKS 和绕过列表的支持可能不同。

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

浏览器如果手动指定了其他代理,应改为使用系统代理,或直接设置到上述端口。容器和虚拟机里的 127.0.0.1 指向它们自身,不是宿主机;本文的回环监听方案不会直接为这些环境提供入口。

8. 常见报错与回退步骤

现象优先检查处理动作
status=203/EXEC可执行路径、执行权限、文件架构手动运行 /usr/local/bin/mihomo -v,核对服务中的绝对路径。
permission denied主配置读权限、目录访问权限、数据目录写权限使用 sudo -u mihomo 执行配置检查,不以 root 运行来掩盖权限问题。
address already in use7890 或配置中其他监听端口用 sudo ss -lntup 找到占用者,停止重复内核或更改端口。
资源下载失败配置是否引用 Geo 数据、规则提供者或代理提供者核对资源 URL、目录权限及启动阶段的直连可达性,不反复重装二进制。
桌面退出后终端仍不能联网shell 中残留代理变量撤销变量,并检查命令自身是否另有代理配置。

更新配置后无法启动时,先查看日志中的首条有效错误。若确实由本次 YAML 修改引起,可以恢复前面保留的副本,再检查并重启。本文最初的副本为直连基线配置,恢复它不会恢复真实代理节点。

sudo cp -a /etc/mihomo/config.yaml.bak /etc/mihomo/config.yaml
sudo -u mihomo /usr/local/bin/mihomo \
  -t -d /var/lib/mihomo -f /etc/mihomo/config.yaml
sudo systemctl restart mihomo

停用服务前,先把应用从本地代理切回直连。GNOME 与当前终端可分别按下面的方式撤销设置。如果之前已把变量写进 shell 启动文件,还要删除对应行,并重新打开终端。

gsettings set org.gnome.system.proxy mode 'none'
unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY
sudo systemctl disable --now mihomo

最终验收顺序保持不变:二进制可执行、服务账号能读取配置、配置检查通过、7890 正常监听、指定代理请求成功、日志显示预期策略、重启系统后服务恢复。每一层单独确认,才能区分部署、配置、应用入口与远端连接问题。

下载Clash