前言
在某群里看到有机油苦苦寻求给他手机内核添加上KVM支持, 正好触景生情, 想起当年熬夜搞机的日子, 便答应尝试帮帮他.
KVM
即 Kernel-based Virtual Machine
是一种内建于 Linux
中的开源虚拟化技术.
具体而言, KVM 可帮助您将 Linux 转变为虚拟机监控程序, 使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机 (VM).
过程
获取内核源码
得知她目前的手机型号为 Samsung Galaxy S8 (Exynos8895)
和内核版本后, 便找到了他目前使用的内核源码 BatKernel
配置编译环境
系统平台
官方推荐在 Ubuntu 18.04
上进行编译, 你可以使用 物理机
或 docker
等虚拟机进行环境搭建, 这里我使用 WSL (Windows Sub Linux)
下的 Ubuntu 20.04
交叉编译链
创建一个工作目录
1 | $ mkdir -p ~/Projects/Kernel |
克隆一下交叉编译链
这里使用三星内核文档里推荐的版本
1 | $ mkdir -p PLATFORM/prebuilts/gcc/linux-x86/aarch64 |
编译内核
内核源码
这里以你的方式去获取你的设备的内核源码
提示: git 加上 –depth 参数可以制定深度 (避免巨量
commit
导致占用太多存储)
1 | $ git clone https://github.com/GrifoDev/BatKernel --depth=1 |
接下来进行一下简单分析, 可以看到第三方内核作者的编译脚本, 例如我这里的 build.sh
打开修改一下编译链路径
1 | export BUILD_CROSS_COMPILE=../Toolchain/aarch64-cortex_a53-linux-gnueabi-6.4.0/bin/aarch64-cortex_a53-linux-gnueabi- |
发现大意了, 这个作者使用的交叉编译链工具是 aarch64-cortex_a53-linux-gnueabi-6.4.0
于是我们由着他来
1 | $ git clone https://github.com/djb77/aarch64-cortex_a53-linux-gnueabi ../Toolchain/aarch64-cortex_a53-linux-gnueabi-6.4.0 |
尝试运行
1 | $ cd BatKernel |
出现报错, 于是我们便将依赖安装上, 反复过后便可以获得一个正常编译的环境
修改配置
由他的设备型号和代号可知它的内核配置在 arch/arm64/configs/exynos8895-dreamlte_defconfig
修改添加如下配置开启 KVM
支持
1 | CONFIG_VIRTUALIZATION=y |
修改添加如下配置自定义内核版本 (可选)
1 | CONFIG_LOCALVERSION="-BatKernel_SM-G950F_Modified_By_icepie" |
在 boot.img
中的 ramdisk/init.rc
的 on boot
下添加
1 | on boot: |
编译测试
1 | $ ./build.sh |
最后
打包
当然是打包为 boot.img
啦, 在这个第三方内核作者的脚本里已经自带此操作
再按照该设备的分区打包一个 zip
格式的包就好啦~
成果链接:
BatKernel_SM-G950F_Modified_By_icepie(KVM)
测试
打开一个安卓终端输入
1 | $ ls /dev/kvm |
即此目录存在便是成功添加了 KVM
支持