三條路對應三種機器。有桌面、每天要點來點去的,走圖形介面。一台放在機房的 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 關掉。