安卓内核缺了啥?补上命名空间,Docker就能跑
前言
想在魅蓝Note5上用Docker跑服务?想法很美好,现实很骨感------安卓内核默认阉割了命名空间(Namespaces)功能,而Docker依赖的就是这个。
本文记录如何在魅蓝Note5上Root、修改内核配置、重新编译内核,激活命名空间功能,最终让Docker跑起来。全程尽量精简,直接上干货。
一、为什么安卓不能直接跑Docker?
Docker依赖Linux内核的命名空间(Namespaces) 实现隔离,包括:
-
UTS:主机名隔离 -
PID:进程ID隔离 -
NET:网络隔离 -
USER:用户隔离 -
MOUNT:文件系统挂载隔离
问题来了 :安卓内核在编译时,默认关闭了这些命名空间选项 。谷歌的Microdroid内核配置明确将CONFIG_NAMESPACES相关选项移除了,只保留了MOUNT命名空间。这就导致Docker根本跑不起来。
所以,我们的目标就是------重新编译内核,把这些开关打开。
二、准备工作
硬件与软件
| 项目 | 说明 |
|---|---|
| 手机 | 魅蓝Note5(已解锁BL) |
| 电脑 | Ubuntu 20.04+(编译内核用) |
| 内核源码 | 对应魅蓝Note5的Linux内核源码(3.18.x) |
| 工具链 | ARM64交叉编译工具链 |
| Docker静态二进制 | 从官方下载arm64版本 |
前置步骤
-
解锁BL(参考上一篇强解BL教程)
-
Root手机(刷入Magisk)
-
备份内核 (用
dd备份/dev/block/by-name/boot)
三、修改内核配置,开启命名空间
3.1 获取内核源码
魅蓝Note5用的是MT6755(Helio P10),内核版本Linux 3.18.x。源码可以从官方开源页面或第三方GitHub仓库获取。
3.2 修改内核配置
找到内核源码目录下的arch/arm64/configs/,找到对应手机的defconfig文件。
关键修改 :在配置文件中添加或改为y:
bash
# 开启命名空间支持(核心开关)
CONFIG_NAMESPACES=y
# 开启各类命名空间
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
# 开启CGroup支持(Docker需要)
CONFIG_CGROUPS=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_SCHED=y
CONFIG_CPUSETS=y
CONFIG_MEMCG=y
# 开启OverlayFS(Docker镜像分层需要)
CONFIG_OVERLAY_FS=y
3.3 关于CONFIG_EXPERT
CONFIG_EXPERT=y
注意:CONFIG_NAMESPACES这类选项通常被CONFIG_EXPERT保护,需要先把CONFIG_EXPERT=y打开,命名空间选项才会出现。
bash
3.4 编译内核
bash
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
make your_device_defconfig
make -j$(nproc)
编译完成后,得到arch/arm64/boot/Image.gz-dtb内核文件。
四、打包并刷入内核
4.1 用AnyKernel3打包
-
下载AnyKernel3模板
-
替换内核文件为编译好的
Image.gz-dtb -
修改
anykernel.sh中的设备名 -
打包成ZIP
4.2 刷入
-
进入TWRP Recovery
-
刷入打包好的内核ZIP
-
重启手机
五、安装Docker并验证
5.1 安装Docker静态二进制
由于安卓没有systemd,不能直接安装Docker包,推荐用静态二进制:
bash
# 下载arm64版docker二进制
wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.0.tgz
tar -xzf docker-24.0.0.tgz
cp docker/* /system/bin/
5.2 启动Docker守护进程
bash
dockerd --iptables=false --bridge=none &
5.3 验证命名空间
bash
# 查看内核是否支持命名空间
ls /proc/self/ns/
# 应该看到: ipc mnt net pid user uts
# 运行测试容器
docker run hello-world
如果能看到hello-world输出,说明命名空间已激活,Docker正常工作。
六、常见问题
Q1:刷入内核后无法开机?
-
检查内核编译配置是否正确
-
尝试用原厂内核的defconfig基础上增量修改
-
保留原厂内核的驱动配置
Q2:Docker启动报"namespace not supported"?
-
确认内核配置中
CONFIG_NAMESPACES已开启 -
检查
/proc/config.gz确认当前运行内核的配置
Q3:性能怎么样?
MT6755跑Docker,跑点轻量服务(alpine、nginx)没问题,别指望跑大型镜像。
总结
魅蓝Note5跑Docker的核心难点就是安卓内核默认阉割了命名空间 。通过重新编译内核开启CONFIG_NAMESPACES等选项,就能让Docker正常运行。
整个流程:
-
Root手机
-
修改内核配置(开启命名空间+CGroup+OverlayFS)
-
编译并刷入内核
-
安装Docker静态二进制
老手机发挥余热,跑点小服务还是可以的。