Vyline DOCS

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 namespaceruncがnamespace作成で失敗、network namespaceを作れないunshare、kernel config
cgroup / memory / pidsdockerd警告、resource controller作成失敗/proc/cgroups、cgroup mount
seccompdefault seccomp profileを使えない、runtimeが警告CONFIG_SECCOMP*
OverlayFSoverlay2初期化失敗CONFIG_OVERLAY_FS、実mount
veth / bridgedocker0やcontainer vethを作れないip link、kernel config
netfilter / NAT / conntrackInternetやpublished portが通らないiptablesnft、config
ext4 / loopF2FS回避用のDocker data-rootを作れないlosetupmount -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 infoCgroup DriverCgroup Versionを確認します。controllerが見えない場合、daemon設定だけを変えるのではなくAndroid側のmount/controller公開状態を先に確認します。

Storage系

Vyline固有ではなくDockerのstorage driver要件です。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

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化は原因切り分けの最後の手段として扱います。

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が必要とする場合の要件です。

ページ名・設定名・コマンドで検索