三条路对应三种机器。有桌面、每天要点来点去的,走图形界面。一台跑在机房的 VPS,装桌面没有意义,纯内核就够。要它开机自己起来、崩了自己拉回来,那就在纯内核上再套一层 systemd——后两条其实是同一条路的两段,先手动跑通,再交给系统托管。
路线一 · 图形界面
- 在项目发布页上挑包格式:Debian、Ubuntu 系拿
deb,Fedora、openSUSE 系拿rpm,其余发行版拿AppImage。同一版本下面各架构的包并排挂着,别在 x86 机器上下 arm64 的。 - deb 用
sudo apt install ./文件名,rpm 用sudo dnf install ./文件名。前面那个./不能省,否则包管理器会去仓库里找同名软件。用 dpkg 或 rpm 直接装也行,但它们不替你解依赖。 - AppImage 下完先给执行权限,
chmod +x之后双击或者在终端里运行。它不写进系统目录,删掉那个文件就等于卸载了。 - 第一次务必在终端里启动,别从应用菜单点。启动失败时窗口一闪就没,只有终端里留得下报错。
最常见的失败是缺运行库。AppImage 只打包了应用自己那部分,底下的 GTK、WebKit 之类还是用系统的,缺哪个,终端里那行报错会直接点名某个 .so 文件。拿这个文件名去包管理器里搜,一般能对上;各发行版给这些包起的名字不统一,Debian 系带 webkit2gtk 字样,Fedora 和 Arch 上又各是另一套写法,按搜索结果装就行。托盘图标是另一类问题:GNOME 默认不画托盘区,要装 AppIndicator 那个扩展才看得见;Wayland 会话下图标缺失的情况更多,如果扩展装了还是没有,切回 X11 会话试一次,能很快确认是不是会话类型的锅。
路线二 · 只跑 mihomo 内核
uname -m
chmod +x ./mihomo
sudo install -m 755 ./mihomo /usr/local/bin/mihomo
mkdir -p ~/.config/mihomo
mihomo -d ~/.config/mihomo
uname -m 回 x86_64 就取 amd64 的包,回 aarch64 就取 arm64 的。这一步下错,运行时报的是「无法执行二进制文件」这类话,跟你的配置一点关系都没有。发布页上给的通常是压缩过的单文件,解开之后名字里带架构和版本,改名成 mihomo 后面引用方便。-d 指的是配置目录,里面至少得有一份 config.yaml。第一次别急着丢后台,让它在前台刷日志,看订阅有没有读进去、端口有没有真的监听上。想要个界面管它,就打开 external-controller 配个网页面板,那是另一篇的事。
路线三 · 交给 systemd 常驻
[Unit]
Description=mihomo daemon
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
ExecStart 里那两个路径必须按你实际放的位置改,前一个是二进制,后一个是配置目录,照抄大概率起不来。User 写 root 是为了让 TUN 和低号端口能用;不开 TUN 的话换成普通用户更稳妥。Restart=on-failure 只在异常退出时拉起,想让它无论如何都活着就改成 always。unit 文件该放哪个目录,各发行版有细微差别,用 sudo systemctl edit --force --full mihomo.service 让 systemd 自己建那个文件,省得记路径。写完 sudo systemctl daemon-reload,再 sudo systemctl enable --now mihomo。之后 systemctl status mihomo 看它活没活着,journalctl -u mihomo -f 跟日志——内核自己打的那几行会写清是配置解析失败还是端口被占。
TUN 在 Linux 要多走一步
同样一个 TUN 开关,Windows 上点一下装个服务就完事,Linux 这边不是。建虚拟网卡、改路由表属于网络管理权限,普通用户身份跑起来的进程没有这个权限。症状很一致:开关按下去自己弹回来,或者日志里 TUN 相关那几行写明是权限不够还是设备打不开。两条路——用 deb/rpm 装的客户端一般自带一个服务模式,打开它,让以高权限运行的那部分去建网卡;或者不走服务,直接给二进制单独授予这项能力:
sudo setcap cap_net_admin,cap_net_bind_service=+ep $(which mihomo)
getcap $(which mihomo)
还有几件小事会绊你一下
- 在 AppImage 上做 setcap 基本白费力气。AppImage 运行时会把内容挂载到临时目录再执行里面的程序,你加在外层那个文件上的能力,传不到真正跑起来的进程上。要 TUN 就用 deb/rpm 版走服务模式,别在这儿耗。
- 换一次二进制,能力就掉一次。setcap 是标在文件上的,内核升级、文件被替换之后要重新执行一遍,
getcap能确认还在不在。 - 终端里的程序不理会系统代理设置。curl、git、包管理器认的是
https_proxy这类环境变量,临时用export https_proxy=http://127.0.0.1:7890顶一下,怎么配得长久另有一篇。 - 下载完先核对哈希再运行。发布页一般同时挂着校验文件,对哈希的具体做法有专门一篇。
sudo systemctl disable --now mihomo 关掉。