Linux 安装 Clash 内核:mihomo 命令行部署与 systemd 后台运行

覆盖桌面发行版图形客户端与无界面服务器两种场景,给出 mihomo 安装、配置目录、systemd 服务与终端代理变量设置。

先选部署方式:桌面客户端或独立内核

有桌面环境,优先用图形客户端管理订阅、策略组和连接记录;只有 SSH 终端,使用 mihomo 命令行与 systemd。mihomo 是常称为 Clash Meta 的内核项目,负责读取配置、监听代理端口和执行分流。图形客户端在内核外提供操作界面,两者不是同一层。

运行环境建议方式主要管理入口
Ubuntu、Fedora 等桌面环境支持 Linux 的图形客户端配置、代理、连接等客户端页面
Debian、Ubuntu 等服务器mihomo 与 systemd 系统服务配置文件、systemctl、journalctl
OpenRC 或精简容器环境按现有进程管理方式运行不直接套用本文 systemd 单元

桌面端可在客户端下载页选择 Linux 安装包。Debian、Ubuntu 一般使用 DEB,Fedora 一般使用 RPM,还要核对处理器架构。导入配置后启用客户端提供的系统代理,再用浏览器验证。桌面系统代理不保证覆盖终端工具、游戏或所有后台服务,终端部分仍需按下文单独设置。

确认架构并安装 mihomo 可执行文件

先检查系统架构和初始化进程。以下命令适用于常见 GNU/Linux 发行版;如果 PID 1 不是 systemd,后面的服务管理命令不能直接使用。

uname -m
ps -p 1 -o comm=
getconf GNU_LIBC_VERSION
  • x86_64 对应 amd64。旧款处理器优先选项目发布页标明的兼容构建,不确定指令集时不要直接选更高等级的优化构建。
  • aarch64 通常对应 arm64。32 位 ARM 要进一步核对 CPU 与系统位数,不能只根据设备外观选择。
  • Alpine 通常使用 musl,且默认不是 systemd 环境。需要另选适配构建与服务管理方法,不能照搬 glibc 系统的安装假设。

从 mihomo 项目的官方发布渠道取得与系统对应的压缩包,解压后把可执行文件放到当前目录,命名为 mihomo。下面的命令从这个已解压文件开始,不依赖随发布版本变化的压缩包文件名。

file ./mihomo
chmod 0755 ./mihomo
./mihomo -v
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
/usr/local/bin/mihomo -v

file 用来确认文件的处理器类型,-v 用来确认内核能在当前机器启动。记录实际输出,便于排错时对应配置字段。出现 Exec format error,先检查架构或是否误把压缩包当作程序;出现 Illegal instruction,优先检查构建所需的 CPU 指令集。

分开保存配置与运行数据

把配置放在 /etc/mihomo/config.yaml,把可写运行数据放在 /var/lib/mihomo。用专用用户运行服务,不必为了监听 7890 这样的高位端口授予 root 权限。以下账户创建命令面向提供 useradd 的 Debian、Ubuntu、Fedora 等系统。

getent group mihomo >/dev/null || sudo groupadd --system mihomo
id mihomo >/dev/null 2>&1 || sudo useradd \
  --system --gid mihomo --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

已有名为 mihomo 的账户时,先确认它属于对应组。某些发行版的 nologin 路径不同,可通过 command -v nologin 检查后调整。专用账户只用于运行服务,不用于交互登录。

先用最小配置检查启动链路

下面是一份完整的本机代理入口配置,所有请求都直连。它用于验证文件权限、端口监听与服务启动,不包含代理节点,也不会改变公网出口。首次部署可以先用它排除安装问题,再换入实际订阅配置。

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

-f 指定配置文件,-d 指定内核的数据目录;两者可以不同。规则集、代理集合和地理数据涉及本地文件时,要核对其路径与专用用户的访问权限。不要把路径写进普通用户的私人主目录,再期待系统服务自动读取。

替换成实际订阅配置

取得完整 Clash YAML 后再替换文件。只有节点列表的 Base64 文本或单条 URI 不是完整运行配置,不能直接保存为 config.yaml。完整配置还需要对应的策略组和规则;规则引用的策略名称必须确实存在。

  1. 保留一份可用配置,避免修改失败后无法恢复。
  2. 将实际配置保存到 /etc/mihomo/config.yaml,继续保持 root:mihomo 和 0640 权限。
  3. 确认混合端口仍为 7890,并关闭局域网访问;如果改变端口,下文所有测试命令也要一起修改。
  4. 再次执行上面的 -t 命令。配置使用 GEOIP、GEOSITE 或远程集合时,按配置准备相应资源,并检查首次获取资源所需的网络。

创建 systemd 服务并设置开机启动

新建 /etc/systemd/system/mihomo.service。这个服务按普通用户运行,仅提供显式 HTTP/SOCKS 代理,不负责创建 TUN 网卡。单元中的绝对路径与前面的安装位置一致。

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

[Service]
Type=simple
User=mihomo
Group=mihomo
StateDirectory=mihomo
StateDirectoryMode=0750
WorkingDirectory=/var/lib/mihomo
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

[Install]
WantedBy=multi-user.target
UNIT

sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl is-active mihomo
sudo systemctl status mihomo --no-pager

StateDirectory 为运行数据目录提供可写空间,ProtectSystem=strict 则限制其他文件系统位置的写入。配置由 root 管理,内核只读;远程规则集等需要写入的内容应放入数据目录。network-online.target 只表示系统的网络就绪流程,不保证任意订阅服务器已经可达。

区分修改配置与修改服务单元

  • 只修改 YAML:先运行配置测试,再执行 sudo systemctl restart mihomo。
  • 修改服务单元:先执行 sudo systemctl daemon-reload,再重启服务。
  • 暂停运行:执行 sudo systemctl stop mihomo。
  • 取消开机启动并立即停止:执行 sudo systemctl disable --now mihomo。

本文没有定义 ExecReload,因此不把 systemctl reload mihomo 当作通用重载方法。重启会中断现有连接,应避开长时间下载或远程任务正在传输的时段。

设置终端代理并验证实际请求

服务显示 active,只能说明进程仍在运行。先确认 7890 正在监听,再让一个具体请求通过该入口。混合端口可以接受 HTTP 代理和 SOCKS5 连接,下面分别测试。

sudo ss -lntp 'sport = :7890'

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

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

socks5h 表示把目标域名交给代理端解析;socks5 通常由客户端先做域名解析。HTTP 代理访问 HTTPS 网站时,一般通过 CONNECT 建立隧道,所以代理地址写成 http://127.0.0.1:7890 是正常用法,不代表目标网站使用明文 HTTP。

先对当前终端生效

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 20 -I https://example.com/

这些变量只影响当前 shell 及其后启动、且支持相应变量的程序。确认需要长期使用后,Bash 可写入 ~/.bashrc,Zsh 可写入 ~/.zshrc,然后重新打开终端。不同工具对变量大小写的支持存在差异,curl 的 HTTP 代理变量尤其应使用小写 http_proxy。

sudo 经常清理环境变量,systemd 服务也不会自动读取交互式 shell 的配置。因此“终端 curl 可用”不等于包管理器和后台任务都已走代理。为这些工具单独配置前,先确认实际需要,避免给所有系统服务统一注入代理环境。

撤销环境变量

unset http_proxy https_proxy all_proxy no_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY NO_PROXY

若已写入 shell 配置文件,也要删除对应行。使用前面的最小直连配置时,测试成功仅证明本机代理入口可用;换入实际配置后,还应在日志中确认命中的规则和出口策略,不能只靠 HTTP 响应判断节点是否被使用。

按日志、端口和权限排查故障

先保留错误上下文,再改一个变量。不要同时修改 DNS、规则与权限,否则即使恢复连接也难以确认原因。下面两条命令分别查看最近日志与持续日志,后者用 Ctrl+C 退出。

sudo journalctl -u mihomo -b -n 100 --no-pager
sudo journalctl -u mihomo -f
现象或日志优先检查处理动作
status=203/EXEC程序路径、执行权限、架构核对 ExecStart,并重新运行 mihomo -v
address already in use7890 是否被其他客户端占用用 ss 查进程,停止重复内核或统一修改端口
permission denied配置目录与运行目录权限以 mihomo 用户执行配置测试,检查文件的每一级父目录
解析 YAML 或策略不存在缩进、配置格式、策略名称使用空格缩进,核对 rules 与 proxy-groups 中的引用
服务运行但请求超时目标解析、策略出口、远程资源先测最小直连配置,再测实际节点与规则
Start request repeated too quickly之前反复启动失败的根因修复后执行 reset-failed,再启动服务

需要检查路径权限时,可运行 namei -l /etc/mihomo/config.yaml。修复连续启动失败后,执行 sudo systemctl reset-failed mihomo 和 sudo systemctl start mihomo。不要用放宽成所有用户可写的方式绕过权限问题。

明确 TUN 边界并保留升级回退路径

需要接管不支持显式代理的程序时,再评估 TUN。TUN 会涉及虚拟网卡、路由、DNS 和权限,不是把 allow-lan 改为 true 就能开启。本文服务使用普通用户,并设置了 NoNewPrivileges=true,不能直接当作 TUN 服务使用。

Linux TUN 通常涉及 /dev/net/tun 和 CAP_NET_ADMIN 等权限;自动路由、DNS 劫持和不同网络栈还可能有额外要求。远程主机变更路由前,保留第二个 SSH 会话与控制台恢复入口。容器中还要检查宿主机是否允许设备访问和网络能力,不能只在容器里改 YAML。

按可回退顺序升级内核

  1. 记录当前 mihomo -v 输出,并保留配置备份。
  2. 在临时位置运行新内核的 -v,再以服务用户测试现有配置。
  3. 停止服务,备份旧程序后替换,再启动服务。
  4. 检查日志与 7890 端口,重复执行 HTTP、SOCKS5 请求测试。
sudo systemctl stop mihomo
sudo cp -p /usr/local/bin/mihomo /usr/local/bin/mihomo.previous
sudo install -m 0755 ./mihomo /usr/local/bin/mihomo
sudo systemctl start mihomo
sudo journalctl -u mihomo -b -n 50 --no-pager

这里的 ./mihomo 是已完成测试的新程序。需要回退时,停止服务,将 /usr/local/bin/mihomo.previous 重新安装为 /usr/local/bin/mihomo,再启动。内核和配置语法可能一起变化,因此程序备份与配置备份都应保留。

完成部署后,用三项结果验收:服务在重启后自动运行、7890 只监听预期地址、指定应用的请求命中预期策略。这样可以区分“程序已安装”“代理入口可用”和“实际流量已按规则转发”,也便于后续定位问题。

Clash最新版下载