Android Kernel
Android上でDocker Engine、containerd、runcを動かすために確認するkernel機能です。端末ごとの差が大きいため、CONFIG名だけで対応可否を断定しません。
Dockerが使うkernel機能
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 namespace | runcがnamespace作成で失敗、network namespaceを作れない | unshare、kernel config |
| cgroup / memory / pids | dockerd警告、resource controller作成失敗 | /proc/cgroups、cgroup mount |
| seccomp | default seccomp profileを使えない、runtimeが警告 | CONFIG_SECCOMP* |
| OverlayFS | overlay2初期化失敗 | CONFIG_OVERLAY_FS、実mount |
| veth / bridge | docker0やcontainer vethを作れない | ip link、kernel config |
| netfilter / NAT / conntrack | Internetやpublished portが通らない | iptables、nft、config |
| ext4 / loop | F2FS回避用のDocker data-rootを作れない | losetup、mount -t ext4 |
CONFIGの確認例
以下は実証構成で確認対象にした主な項目です。kernel versionや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構成では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が無い場合は、端末kernelのビルドconfigまたはkernel imageのIKCONFIGを確認します。自分でkernelをbuildする場合は診断性のため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 testはunderlying filesystemの制約にも左右されるため、失敗時はkernel機能不足とfilesystem非互換を分けて調べます。
cgroup driver
AndroidではsystemdがPID 1ではなく、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 DriverとCgroup Versionを確認します。controllerが見えない場合、daemon設定だけを変えるのではなくAndroid側のmount/controller公開状態を先に確認します。
Storage系
Vyline固有ではなくDockerのstorage driver要件です。Android userdataがF2FS/casefold等でoverlay2と合わない端末では、ext4 loop imageをdata-rootに使えるようEXT4_FS、BLK_DEV_LOOP、OVERLAY_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
Network系
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
BRIDGE_NETFILTERやxtables matchはDocker/iptables構成によって必要になります。Android側のlegacy/nft差は Networking でpacket pathごとに確認します。
SELinux
Android vendor policyがloop mount、mount namespace、dockerd、iptables操作を拒否する場合があります。enforcingのまま動くなら変更しません。拒否が疑われるときはgetenforceとaudit/avc logで確認し、permissive化は原因切り分けの最後の手段として扱います。
常用スマホで無条件に使う設定ではありません。本来は必要なsepolicyを追加する方が望ましく、サーバー専用端末での実験的運用として扱ってください。
Vendor kernelを改変する場合
「一般LinuxのDocker向けconfig」をAndroid vendor kernelへ丸ごと入れるのは避けます。Qualcomm等のvendor scheduler、power management、GKI/QGKI構成ではscheduler/cgroup周辺にvendor実装があり、無関係なconfig変更がboot不能や性能問題につながることがあります。
不足が確認できたcontainer機能だけを追加し、boot→root→namespace→Dockerの順に小さく検証します。特にscheduler系configは「Dockerでよく見るから」という理由だけで変更しません。
Vyline自体には不要な機能
VylineをDocker containerとして動かすだけならKVMや/dev/kvmは使用しません。TUNもVyline本体には必須ではなく、Tailscale/WireGuard等のVPN方式や別containerが必要とする場合の要件です。