Vyline DOCS

Android 内核

在 Android 上运行 Docker Engine、containerd 和 runc 前需要确认的内核能力。不同设备的 vendor kernel 差异很大,因此不能只看 CONFIG 名称就断定是否支持。

Docker 使用的内核功能

Docker Engine、containerd 和 runc 会直接使用 namespace、cgroup、mount、veth、netfilter 等内核机制。仅在 Android userland 中加入 Docker CLI 并不够。

重要类别

1. namespaces
2. cgroups
3. seccomp
4. OverlayFS
5. bridge / veth
6. netfilter / conntrack / NAT
7. ext4
8. loop device
9. proc / sysfs / tmpfs / devpts
10. mount propagation
类别缺失时常见症状确认方式
PID/NET/UTS/IPC namespacerunc 创建 namespace 失败,无法创建 network namespaceunshare、kernel config
cgroup / memory / pidsdockerd 警告、resource controller 创建失败/proc/cgroups、cgroup mount
seccomp无法使用默认 seccomp profile,runtime 报警CONFIG_SECCOMP*
OverlayFSoverlay2 初始化失败CONFIG_OVERLAY_FS、实际 mount
veth / bridge无法创建 docker0 或 container vethip link、kernel config
netfilter / NAT / conntrack无法访问 Internet 或 published portiptablesnft、config
ext4 / loop无法为规避 F2FS 问题创建 Docker data-rootlosetupmount -t ext4

CONFIG 检查示例

下面列出在已验证参考环境中重点检查的项目。所需组合会随内核版本和 Docker 功能配置变化。

CONFIG_NAMESPACES=y
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
CONFIG_USER_NS=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_SCHED=y
CONFIG_CPUSETS=y
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
CONFIG_CGROUP_PIDS=y
CONFIG_CGROUP_BPF=y
CONFIG_SECCOMP=y
CONFIG_SECCOMP_FILTER=y
CONFIG_OVERLAY_FS=y
CONFIG_VETH=y
CONFIG_BRIDGE=y
CONFIG_BRIDGE_NETFILTER=y
CONFIG_NETFILTER=y
CONFIG_NF_CONNTRACK=y
CONFIG_NETFILTER_XTABLES=y
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y
CONFIG_NETFILTER_XT_MATCH_ADDRTYPE=y
CONFIG_IP_NF_IPTABLES=y
CONFIG_IP_NF_FILTER=y
CONFIG_IP_NF_NAT=y
CONFIG_IP_NF_TARGET_MASQUERADE=y
CONFIG_EXT4_FS=y
CONFIG_BLK_DEV_LOOP=y
CONFIG_PROC_FS=y
CONFIG_SYSFS=y
CONFIG_TMPFS=y
CONFIG_DEVPTS_FS=y

=m 也可以使用,但 Android 的 boot/module 构成还必须确认模块实际上能够 load。config 中存在并不等于 runtime 一定可用。

实机检查

zcat /proc/config.gz | grep -E 'CONFIG_(NAMESPACES|UTS_NS|IPC_NS|PID_NS|NET_NS|USER_NS|CGROUPS|MEMCG|CGROUP_PIDS|SECCOMP|SECCOMP_FILTER|OVERLAY_FS|VETH|BRIDGE|NETFILTER|NF_CONNTRACK|IP_NF_NAT|EXT4_FS|BLK_DEV_LOOP)='
cat /proc/cgroups
findmnt -t cgroup,cgroup2

如果没有 /proc/config.gz,请检查设备内核的 build config 或 kernel image 中的 IKCONFIG。自己编译内核时,启用 CONFIG_IKCONFIG=y / CONFIG_IKCONFIG_PROC=y 会明显方便后续诊断。

不要只看 config,也要测试 runtime

unshare -m true
unshare -p --fork true
unshare -n true
ip link add veth-test type veth peer name veth-peer && ip link del veth-test
mkdir -p /data/local/tmp/ovl/{lower,upper,work,merged}
mount -t overlay overlay -o lowerdir=/data/local/tmp/ovl/lower,upperdir=/data/local/tmp/ovl/upper,workdir=/data/local/tmp/ovl/work /data/local/tmp/ovl/merged
umount /data/local/tmp/ovl/merged

这些诊断在 root shell 中执行。overlay 测试还会受到 underlying filesystem 限制,因此失败时要区分是内核能力不足还是文件系统不兼容。

cgroup driver

Android 的 PID 1 不是 systemd,而且部分设备混合使用 Android 特有的 cgroup v1 hierarchy 与 cgroup v2。因此不要默认使用 systemd driver,应先检查实际 mount;很多环境下 cgroupfs 更容易处理。

cat /proc/cgroups
cat /proc/self/cgroup
findmnt -t cgroup,cgroup2
find /sys/fs/cgroup -maxdepth 2 -type d | head -n 80

Docker 启动后检查 docker info 中的 Cgroup DriverCgroup Version。如果 controller 不可见,先查 Android 侧的 mount/controller 暴露状态,而不是只改 daemon 设置。

存储相关能力

这是 Docker storage driver 的要求,不是 Vyline 特有要求。Android userdata 为 F2FS/casefold 等并且与 overlay2 不兼容时,如果要使用 ext4 loop image 作为 data-root,需要 EXT4_FSBLK_DEV_LOOPOVERLAY_FS

stat -f -c '%T' /data
ls -l /dev/block/loop* 2>/dev/null
losetup -f 2>/dev/null || true
grep -w overlay /proc/filesystems
grep -w ext4 /proc/filesystems

网络相关能力

即使能创建 Docker bridge,缺少 NAT/conntrack 仍然无法出网。至少确认 NET namespace、veth、bridge、netfilter、conntrack、IPv4 filter/NAT/MASQUERADE。

grep -E 'veth|bridge' /proc/modules 2>/dev/null || true
ip link show type bridge
cat /proc/sys/net/ipv4/ip_forward
iptables -t nat -S 2>/dev/null | head
nft list ruleset 2>/dev/null | head

不同 Docker/iptables 配置可能还需要 BRIDGE_NETFILTER 和 xtables match。Android 的 legacy/nft 差异请在 网络 页面按 packet path 排查。

SELinux

Android vendor policy 可能拒绝 loop mount、mount namespace、dockerd 或 iptables 操作。如果 enforcing 下能正常运行,就不要改。怀疑 SELinux 时先看 getenforce 和 audit/AVC log;permissive 只作为最后的诊断手段。

Permissive 会降低防护

不应在日常使用手机上无条件开启。更合理的做法是补充必要的 sepolicy;permissive 应仅作为专用服务器设备上的实验性规避方案。

修改 vendor kernel 时

不要把“普通 Linux 的 Docker config”整套复制进 Android vendor kernel。Qualcomm 等 vendor kernel 可能有 vendor scheduler、power management、GKI/QGKI 与 cgroup 实现;无关的 config 修改可能导致无法启动或性能问题。

只添加实际确认缺失的 container 功能,并按 boot → root → namespace → Docker 的顺序小步验证。尤其不要仅仅因为“Docker 教程里常见”就修改 scheduler 相关 CONFIG。

Vyline 本身不需要的功能

仅把 Vyline 作为 Docker container 运行时不会使用 KVM 或 /dev/kvm。TUN 也不是 Vyline 本体必需,只有 Tailscale/WireGuard 等 VPN 或其他 container 需要时才成为要求。

按页面、设置或命令搜索