把舊 Android 手機變成 Docker 伺服器:刷機、內核編譯到容器部署完整指南
把舊 Android 手機變成 Docker 伺服器:刷機、內核編譯到容器部署完整指南 將閒置的 Android 手機(Snapdragon 高通 SoC)刷成 LineageOS,自編譯支援 Docker 的 Linux 內核,最終跑起容器服務。適合有基礎 Linux 經驗、想用舊手機當 homelab 的開發者。
把舊 Android 手機變成 Docker 伺服器:刷機、內核編譯到容器部署完整指南
適用技術棧 :Android(Qualcomm SoC)、LineageOS、Linux Kernel 4.19+、Magisk、Docker、Termux
前陣子翻出一台閒置的 OnePlus 8 Pro,想說與其放著積灰,不如讓它跑點服務。實際做下來發現,從刷機到讓 Docker 跑起來,中間要過的關卡比預期多不少(內核缺配置、macOS 編譯踩坑、Android cgroup 相容性),但最後確實可以穩定跑容器服務。這篇把整個過程整理成可復刻的 PRD,你可以拿任何支援 bootloader 解鎖的 Qualcomm 手機來照著做。
1. 這個系統做什麼
概覽
把一台閒置的 Android 手機改造成 24/7 運行的 Docker 伺服器,能跑容器化服務(n8n、Uptime Kuma、PostgreSQL 等),透過 SSH 和 Web 介面管理。
解決什麼問題
舊手機閒置浪費,但硬體規格(8 核心 CPU、8GB RAM、128GB 儲存、WiFi 6)其實不差
比樹莓派便宜(你已經有了)、比雲端 VPS 省月費
適合跑低流量的個人服務、自動化工作流、監控等
功能邊界(Scope)
包含 :刷機、內核編譯(啟用 Docker 支援)、root 取得、Docker 安裝與運行、網路設定(SSH、Tailscale)、容器部署
不包含 :高可用架構、Kubernetes 叢集、x86 平台相容(如 Zeabur)、大規模生產環境部署
適用條件
GEEKAZ Design engineering from Taipei. Building courses, tools, and resources for designers who code.
手機 SoC Qualcomm Snapdragon(本文範例為 865 / SM8250,其他高通 SoC 流程類似) Bootloader 可解鎖(OnePlus、Xiaomi、Google Pixel 等品牌通常支援) LineageOS 支援 手機有官方或非官方 LineageOS build 編譯環境 一台有 Docker 的電腦(macOS 或 Linux 皆可)
2. 整體架構與資料流
系統架構 ┌────────────────────────────────────────────┐
│ Android 手機 │
│ LineageOS + 自編譯 Docker 內核 + Magisk │
│ │
│ ┌──────────────────────────────────────┐ │
│ │ Termux (root) │ │
│ │ │ │
│ │ ┌──────────┐ ┌─────────────────┐ │ │
│ │ │ Docker │ │ SSH Server │ │ │
│ │ │ daemon │ │ (:8022) │ │ │
│ │ │ │ └─────────────────┘ │ │
│ │ │ ┌──────┐ │ │ │
│ │ │ │ 容器 │ │ ┌─────────────────┐ │ │
│ │ │ │ 服務 │ │ │ Tailscale │ │ │
│ │ │ └──────┘ │ │ (Android app) │ │ │
│ │ └──────────┘ └─────────────────┘ │ │
│ └──────────────────────────────────────┘ │
└─────────────────┬──────────────────────────┘
│
WiFi + Tailscale VPN + SSH Tunnel
▼
┌──────────────────────────┐
│ 管理端 │
│ - SSH 終端 │
│ - Portainer Web UI │
│ - 服務 Web 介面 │
└──────────────────────────┘
實作流程 解鎖 Bootloader
↓
刷入 LineageOS + Recovery
↓
提取 boot.img → Magisk Patch → 刷入(取得 root)
↓
提取內核配置 → 確認缺少哪些 Docker 配置
↓
Clone 內核原始碼 → 修改 defconfig → 用 clang 編譯
↓
打包新 boot.img → Magisk Patch → 測試啟動 → 永久刷入
↓
安裝 Termux + Docker → 掛載 cgroups → 啟動 dockerd
↓
部署容器服務(Portainer、n8n 等)
來源檔案參考(僅供對照,非必要)
以下路徑僅標記原始實作的檔案出處,閱讀此 PRD 不需要存取這些檔案。
原始檔案路徑 角色 說明 kernel/arch/arm64/configs/vendor/kona-perf_defconfig內核配置 SM8250 主 defconfig,需修改 kernel/arch/arm64/configs/vendor/oplus.config內核配置 OnePlus 覆蓋配置 kernel/arch/arm64/configs/vendor/docker.config內核配置 自建的 Docker 配置 overlay ~/.termux/boot/start-server.sh自動啟動 開機自啟 SSH + Docker
外部依賴 依賴 類型 用途 LineageOS ROM 替代 stock Android,更接近原生 Linux Magisk Root 工具 取得 root 權限(kernel 4.19 不支援 KernelSU) Termux Android app 手機上的終端模擬器,Docker 跑在裡面 Termux:Boot Android app 開機自動啟動腳本 Docker (Termux) 套件 容器運行環境 clang / lld 編譯器 編譯 Linux 內核(不能用 GCC) mkbootimg AOSP 工具 打包 boot.img Tailscale VPN 遠端 SSH 存取 Portainer Docker 管理 Web UI 管理容器
3. 資料結構與型別定義
Docker 所需的內核配置 這是整個專案最核心的「資料結構」。Android 手機的 LineageOS 內核預設停用了很多 Docker 需要的配置。
# === Namespaces(Docker 核心需求)===
CONFIG_PID_NS=y # Process ID 命名空間(通常被明確停用)
CONFIG_NET_NS=y # Network 命名空間
CONFIG_IPC_NS=y # IPC 命名空間
CONFIG_UTS_NS=y # UTS 命名空間
CONFIG_USER_NS=y # User 命名空間
# === Cgroups(資源管理)===
CONFIG_CGROUP_DEVICE=y # Device cgroup
CONFIG_CGROUP_PIDS=y # PID cgroup
CONFIG_CGROUP_PERF=y # Perf cgroup
CONFIG_CGROUP_NET_PRIO=y # Network priority
CONFIG_CFS_BANDWIDTH=y # CPU bandwidth
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_BLK_DEV_THROTTLING=y
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_MEMCG_SWAP_ENABLED=y
# === 檔案系統 ===
CONFIG_FHANDLE=y # open_by_handle_at()(overlay2 需要,通常被明確停用)
CONFIG_POSIX_MQUEUE=y # POSIX message queue
# === 安全 ===
CONFIG_KEYS=y
CONFIG_SECCOMP_FILTER=y
# === Netfilter ===
CONFIG_NF_NAT=y
CONFIG_NF_NAT_IPV4=y # kernel 4.19 需要(5.0+ 已移除)
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_IPVS=y
CONFIG_NETFILTER_XT_MARK=y
CONFIG_NF_NAT_FTP=y
CONFIG_NF_NAT_TFTP=y
CONFIG_IP6_NF_NAT=y
CONFIG_IP6_NF_TARGET_MASQUERADE=y
# === IPVS(Docker 網路)===
CONFIG_IP_VS=y
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_RR=y
# === 網路驅動 ===
CONFIG_VXLAN=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_MACVLAN=y
CONFIG_IPVLAN=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
# === Crypto ===
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_GHASH=y
通常已啟用的配置(不需要改) CONFIG_NAMESPACES=y
CONFIG_CGROUPS=y
CONFIG_MEMCG=y
CONFIG_VETH=y
CONFIG_BRIDGE=y
CONFIG_OVERLAY_FS=y
CONFIG_SECCOMP=y
CONFIG_EXT4_FS=y
boot.img 參數(從原始 boot.img 提取) 打包新的 boot.img 時需要這些參數,每台手機不同,從原始 boot.img 解包取得:
header_version: 2
os_version: [從原始 boot.img 取得]
os_patch_level: [從原始 boot.img 取得]
pagesize: 4096
base: 0x00000000
kernel_offset: 0x00008000
ramdisk_offset: 0x01000000
tags_offset: 0x00000100
dtb_offset: 0x01f00000
cmdline: [從原始 boot.img 取得,每台手機不同]
4. 一步步實作 坦白說這整個流程最容易卡住的地方不是刷機,而是內核編譯。刷機的步驟各品牌大同小異,但讓 Docker 跑起來需要的內核配置修改和編譯環境設定,踩坑機率很高。
Step 1:刷入 LineageOS + 取得 Root 目的 :替換 stock Android,取得完整的 Linux 環境和 root 權限。
# 1. 解鎖 Bootloader(會清除所有資料)
adb reboot bootloader
fastboot oem unlock
# 手機上選 "Unlock the bootloader"
# 2. 刷入 LineageOS Recovery + ROM
fastboot flash dtbo dtbo.img
fastboot flash vbmeta vbmeta.img
fastboot flash recovery recovery.img
fastboot reboot recovery
# Recovery 中:Factory Reset → Apply update → Apply from ADB
adb sideload lineage-*.zip
# 3. 提取 boot.img 給 Magisk patch
pip3 install payload_dumper
unzip lineage-*.zip payload.bin -d extracted/
cd extracted && payload_dumper --partitions boot payload.bin
adb install Magisk.apk
adb push extracted/output/boot.img /sdcard/Download/boot.img
# 手機上:Magisk → Install → Select and Patch a File → boot.img
# 4. 刷入 patched boot.img
adb pull /sdcard/Download/magisk_patched-*.img ./
adb reboot bootloader
fastboot flash boot magisk_patched-*.img
fastboot reboot
# 5. 驗證 root
adb shell "su -c 'id'"
# uid=0(root) gid=0(root)
payload_dumper 不能直接讀 ROM zip,需要先 unzip 出 payload.bin
ADB sideload 可能在約 47% 時中斷問是否重啟 recovery,第一次選 Yes,重啟後再 sideload 一次,第二次選 No
Kernel 4.19 不支援 KernelSU(需 5.10+),必須用 Magisk
A/B 分區的手機,boot 分區名稱是 boot_a / boot_b,用 getprop ro.boot.slot_suffix 確認 active slot
Step 2:檢查內核配置缺了什麼 目的 :確認哪些 Docker 必要的內核配置需要啟用。
# 提取內核配置
adb shell "su -c 'cat /proc/config.gz'" > config.gz
gunzip config.gz
# 檢查關鍵配置
grep -E "CONFIG_PID_NS|CONFIG_IPC_NS|CONFIG_BRIDGE_NETFILTER|\
CONFIG_CGROUP_DEVICE|CONFIG_POSIX_MQUEUE|CONFIG_FHANDLE|\
CONFIG_NAMESPACES|CONFIG_CGROUPS|CONFIG_OVERLAY_FS" config
# CONFIG_PID_NS is not set → 必須改成 CONFIG_PID_NS=y(Docker 沒這個完全跑不了)
# CONFIG_FHANDLE is not set → 必須改成 CONFIG_FHANDLE=y(overlay2 storage driver 需要)
其他未出現的配置代表 kernel 沒有啟用,需要在 defconfig 中新增
Step 3:設定編譯環境 目的 :準備一個可以交叉編譯 ARM64 Linux 內核的環境。
# Dockerfile
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
bc bison build-essential flex git git-lfs \
libelf-dev libssl-dev libncurses-dev \
python3 python3-pip wget curl zip unzip \
gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu \
crossbuild-essential-arm64 \
clang lld llvm \
lz4 cpio \
&& rm -rf /var/lib/apt/lists/*
# mkbootimg 用來打包 boot.img
RUN git clone --depth=1 \
https://android.googlesource.com/platform/system/tools/mkbootimg \
/tools/mkbootimg
WORKDIR /build
docker build -t kernel-builder .
必須安裝 clang lld llvm,不能只用 GCC(下一步會解釋原因)
如果你的電腦是 Apple Silicon(ARM64),Docker 容器也是 ARM64,編譯速度會比 x86 模擬快很多
Step 4:Clone 內核原始碼 目的 :取得 LineageOS 的 kernel source,準備修改 defconfig。
# 重要:必須用 Docker volume,不能用 macOS bind mount
docker volume create kernel-src
docker run --rm -v kernel-src:/src kernel-builder bash -c "
git clone --depth=1 -b <lineage-branch> \
https://github.com/LineageOS/android_kernel_<vendor>_<platform>.git \
/src/kernel
"
以 OnePlus 8 Pro(SM8250)為例:
git clone --depth=1 -b lineage-23.2 \
https://github.com/LineageOS/android_kernel_oneplus_sm8250.git /src/kernel
macOS 的檔案系統預設是 case-insensitive。Linux kernel 有些檔案靠大小寫區分(xt_DSCP.c vs xt_dscp.c),clone 到 Mac 上會衝突,編譯時報 No rule to make target 'net/netfilter/xt_DSCP.o'。Docker volume 使用 ext4(case-sensitive),這個問題就消失了。
如果你在 Linux 上編譯,可以直接 clone 到本機,不需要 Docker volume。
Step 5:修改 Defconfig 啟用 Docker 配置 目的 :在內核配置中啟用 Docker 所需的約 40 項配置。
# 進入 Docker container
docker run --rm -it -v kernel-src:/src kernel-builder bash
cd /src/kernel
# 1. 找到你的手機的 defconfig
ls arch/arm64/configs/vendor/
# 例如:kona-perf_defconfig(SM8250)
# sm8150-perf_defconfig(SM8150)
# lahaina-perf_defconfig(SM8350)
# 2. 修改主 defconfig:把明確停用的配置改成啟用
sed -i 's/# CONFIG_PID_NS is not set/CONFIG_PID_NS=y/' \
arch/arm64/configs/vendor/<your>_defconfig
sed -i 's/# CONFIG_FHANDLE is not set/CONFIG_FHANDLE=y/' \
arch/arm64/configs/vendor/<your>_defconfig
# 3. 建立 docker.config overlay
cat > arch/arm64/configs/vendor/docker.config << 'EOF'
# CONFIG_CC_WERROR is not set
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_IPC_NS=y
CONFIG_UTS_NS=y
CONFIG_USER_NS=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_PERF=y
CONFIG_CGROUP_NET_PRIO=y
CONFIG_CFS_BANDWIDTH=y
CONFIG_FAIR_GROUP_SCHED=y
CONFIG_BLK_DEV_THROTTLING=y
CONFIG_NET_CLS_CGROUP=y
CONFIG_CGROUP_HUGETLB=y
CONFIG_MEMCG_SWAP_ENABLED=y
CONFIG_FHANDLE=y
CONFIG_POSIX_MQUEUE=y
CONFIG_KEYS=y
CONFIG_SECCOMP_FILTER=y
CONFIG_NF_NAT=y
CONFIG_NF_NAT_IPV4=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_NETFILTER_XT_MATCH_IPVS=y
CONFIG_NETFILTER_XT_MARK=y
CONFIG_NF_NAT_FTP=y
CONFIG_NF_NAT_TFTP=y
CONFIG_IP6_NF_NAT=y
CONFIG_IP6_NF_TARGET_MASQUERADE=y
CONFIG_IP_VS=y
CONFIG_IP_VS_NFCT=y
CONFIG_IP_VS_PROTO_TCP=y
CONFIG_IP_VS_PROTO_UDP=y
CONFIG_IP_VS_RR=y
CONFIG_VXLAN=y
CONFIG_BRIDGE_VLAN_FILTERING=y
CONFIG_MACVLAN=y
CONFIG_IPVLAN=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_CRYPTO_AEAD=y
CONFIG_CRYPTO_SEQIV=y
CONFIG_CRYPTO_GHASH=y
EOF
# CONFIG_CC_WERROR is not set 很重要,停用 -Werror 避免 warning 變 error
CONFIG_NF_NAT_IPV4 只在 kernel 4.x 需要,5.0+ 已整合到 CONFIG_NF_NAT
CONFIG_MEMCG_SWAP_ENABLED 在 kernel 5.8+ 已移除
你手機的 defconfig 名稱取決於 SoC,不是手機型號。查 device/<vendor>/<device>/BoardConfig*.mk 中的 TARGET_KERNEL_CONFIG
Step 6:編譯內核 目的 :用 clang 交叉編譯出支援 Docker 的 ARM64 kernel Image。
docker run --rm -v kernel-src:/src -v "$(pwd):/build" kernel-builder bash -c "
cd /src/kernel
export ARCH=arm64 SUBARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
# 生成 .config(合併 defconfig + overlay)
make O=/src/out CC=clang CLANG_TRIPLE=aarch64-linux-gnu- \
CROSS_COMPILE=aarch64-linux-gnu- \
vendor/<your>_defconfig vendor/<vendor>.config vendor/docker.config
# 驗證關鍵配置
grep -E 'CONFIG_PID_NS=|CONFIG_FHANDLE=|CONFIG_CC_WERROR' /src/out/.config
# 編譯
make O=/src/out CC=clang CLANG_TRIPLE=aarch64-linux-gnu- \
CROSS_COMPILE=aarch64-linux-gnu- LD=ld.lld \
-j\$(nproc) Image dtbs
# 複製產出
cp /src/out/arch/arm64/boot/Image /build/Image
"
LineageOS 的 kernel source 是針對 clang 寫的。用 GCC 交叉編譯會遇到兩類錯誤:
inline 函數錯誤 :header 宣告 inline 但 body 在 .c 檔,GCC 報 inlining failed in call to 'always_inline',clang 不會
格式化字串型別不匹配 :%llu 對上 unsigned int,GCC 的 -Werror=format 報錯,clang 的型別處理不同所以不報
Step 7:打包 boot.img 並刷入 目的 :把編譯好的 kernel Image 打包成可刷入的 boot.img。
# 1. 從手機提取原始 boot.img(取得 ramdisk 和參數)
adb shell "su -c 'getprop ro.boot.slot_suffix'" # 確認 active slot
adb shell "su -c 'dd if=/dev/block/by-name/boot_<slot> of=/sdcard/boot.img bs=4096'"
adb pull /sdcard/boot.img current_boot.img
# 2. 解包
docker run --rm -v "$(pwd):/build" kernel-builder \
python3 /tools/mkbootimg/unpack_bootimg.py \
--boot_img /build/current_boot.img \
--out /build/boot_unpacked \
--format=mkbootimg
# 輸出會顯示所有參數(cmdline、offset、version 等),記下來
# 3. 打包新的 boot.img(用解包時取得的參數)
docker run --rm -v kernel-src:/src -v "$(pwd):/build" kernel-builder bash -c "
# 合併 DTB(路徑依手機不同)
find /src/out/arch/arm64/boot/dts -name '*.dtb' | head -5
cat /src/out/arch/arm64/boot/dts/<path>/*.dtb > /build/dtb.img
python3 /tools/mkbootimg/mkbootimg.py \
--header_version <從解包取得> \
--os_version <從解包取得> \
--os_patch_level <從解包取得> \
--kernel /build/Image \
--ramdisk /build/boot_unpacked/ramdisk \
--dtb /build/dtb.img \
--pagesize 4096 \
--base 0x00000000 \
--kernel_offset 0x00008000 \
--ramdisk_offset 0x01000000 \
--tags_offset 0x00000100 \
--dtb_offset 0x01f00000 \
--cmdline '<從解包取得的完整 cmdline>' \
--output /build/docker_boot.img
"
# 4. Magisk patch(保留 root)
adb push docker_boot.img /sdcard/Download/
# 手機:Magisk → Install → Select and Patch a File → docker_boot.img
adb pull /sdcard/Download/magisk_patched-*.img ./
# 5. 測試啟動(不永久寫入)
adb reboot bootloader
fastboot boot magisk_patched-*.img
# 確認正常開機、Docker 配置都啟用後...
# 6. 永久刷入
adb reboot bootloader
fastboot flash boot magisk_patched-*.img
fastboot reboot
Step 8:安裝 Docker 並跑起來 目的 :在 Termux 內安裝 Docker 並讓容器正常運行。
# 1. 安裝 Termux(從 F-Droid)和 Termux:Boot
# 在 Termux 內執行:
pkg install root-repo -y
pkg install docker -y
# 2. 掛載 cgroups(每次開機需要)
sudo mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
for s in blkio cpu cpuacct cpuset devices freezer pids \
net_cls net_prio perf_event; do
sudo mkdir -p /sys/fs/cgroup/$s
sudo mount -t cgroup -o $s cgroup /sys/fs/cgroup/$s
done
sudo mkdir -p /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
# 3. 啟動 Docker
sudo dockerd --iptables=false &
# 4. 驗證
sudo docker run --rm hello-world
--iptables=false 是必要的,Android 的 iptables 環境和標準 Linux 不同
但這代表 Docker bridge 的 port mapping 不自動生效,容器需要用 --net=host
不要在 /sys/fs/cgroup/ 下建立 cpuctl 或 schedtune 目錄,這些是 Android 專有的 cgroup subsystem,Docker 看到會嘗試掛載然後報錯 no such file or directory
Docker socket 路徑在 /data/data/com.termux/files/usr/var/run/docker.sock(不是標準的 /var/run/docker.sock)
Step 9:部署服務 # Portainer(Docker Web 管理介面)
docker run -d --name portainer --net=host --restart=always \
-v /data/data/com.termux/files/usr/var/run/docker.sock:/var/run/docker.sock \
portainer/portainer-ce
# 透過 SSH tunnel 存取:ssh -L 19443:localhost:9443 <phone> -N -f
# 瀏覽器:https://localhost:19443
# n8n(工作流自動化)
docker run -d --name n8n --net=host \
-e N8N_PORT=5678 -e DB_TYPE=sqlite -e N8N_SECURE_COOKIE=false \
-v n8n_data:/home/node/.n8n \
n8nio/n8n
# Uptime Kuma(監控)
docker run -d --name uptime-kuma --net=host \
-v uptime-kuma:/app/data \
louislam/uptime-kuma
所有服務都用 --net=host,透過 SSH tunnel 存取對應 port。
5. 快速開始
前提條件
實作步驟
解鎖 bootloader + 刷 LineageOS (Step 1)
用 Magisk 取得 root (Step 1)
檢查內核缺少哪些 Docker 配置 (Step 2)
建立編譯環境 Docker image (Step 3)
Clone 內核原始碼到 Docker volume (Step 4)
修改 defconfig + 建立 docker.config (Step 5)
用 clang 編譯內核 (Step 6)
打包 boot.img + Magisk patch + 刷入 (Step 7)
安裝 Termux + Docker + 掛載 cgroups (Step 8)
部署服務 (Step 9)
驗證清單
6. 不同手機 / 環境的調整方式 如果你的手機和環境跟上面的範例不完全一樣,這邊整理了需要調整的部分。
高度通用的部分(直接用)
docker.config 的內容(Docker 所需的內核配置)適用於所有 kernel 4.19+ 的 ARM64 手機
Termux + Docker 的安裝和 cgroup 掛載流程
--iptables=false 和 --net=host 的 Docker 運行方式
SSH tunnel 存取容器服務的模式
需要客製化的部分 部分 範例值(OnePlus 8 Pro) 你需要查的 LineageOS ROM instantnoodlep你手機的 codename,查 LineageOS wiki Kernel repo android_kernel_oneplus_sm8250LineageOS GitHub 搜你手機的 kernel repo Kernel branch lineage-23.2對應你的 LineageOS 版本 Defconfig vendor/kona-perf_defconfig查 BoardConfig*.mk 中的 TARGET_KERNEL_CONFIG DTB 路徑 dts/vendor/oplus/kona*.dtb編譯後在 out/arch/arm64/boot/dts/ 下找 boot.img 參數 header_version 2, cmdline ...從你手機的原始 boot.img 解包取得 Termux user u0_a175每次刷機後可能不同,用 whoami 查
技術棧替換建議
如果你在 Linux 上編譯而非 macOS :不需要 Docker volume,直接 clone 到本機即可(Linux 檔案系統是 case-sensitive)
如果你的 kernel 是 5.10+ :可以用 KernelSU 取代 Magisk,CONFIG_NF_NAT_IPV4 不需要加
如果你的手機不是 Qualcomm :MediaTek 手機的 bootloader 解鎖和刷機流程不同,需要用 SP Flash Tool,但內核編譯和 Docker 設定的邏輯相同
如果你不需要 Web UI :可以跳過 Portainer,直接用 CLI 管理 Docker
適合跑的服務 服務 用途 RAM 需求 n8n 工作流自動化 ~200MB Uptime Kuma 網站監控 ~100MB PostgreSQL 資料庫 ~200MB Gitea 輕量 Git 服務 ~200MB Nginx 反向代理 ~50MB Redis 快取 ~50MB
不建議 服務 原因 大型資料庫(>10GB) flash 儲存壽命考量 CI/CD Runner 計算密集,手機散熱有限 高流量 Web 服務 家用網路上傳頻寬有限
整體來說,這套方案跑了一段時間後比預期穩定。手機 24/7 插電跑 Docker 容器,功耗大概只有傳統伺服器的十分之一。如果你手邊剛好有閒置的高通手機,這個方案應該能幫你省下一台 VPS 的月費,同時多一個可以隨意折騰的 homelab。
© 2026 GEEKAZ. All Rights Reserved.