我想应该是可以的。原来文章太长,我把编译的部分去掉了。现在把这部分摘抄到下面。还是针对三星手机的,对于RK3399,按照类似方法应该也是可以的。但是编译链的准备,其他一些细节部分等,相应用厂家提供的调整即可。
~~~~~~ 一、检查内核配置,编译自己的新内核
这个部分比较费事,如果你想简单点,可以跳过这个步骤,直接从“网盘/4.内核编译“下载我编译好的img,名字为Image.gz-dtb。如果你继续编译,我就假定你有一定的Linux知识等,步骤说明简单一些。 这个部分有两步,首先我们要知道内核缺少了哪些docker要运行的必要的特征,有个脚本可以帮助我们。接下来就是准备源代码、编译工具链和环境等,配置好项目参数,修改掉已知的bug,交叉编译生成img了。 1) 检查内核缺少的特征 把“网盘/4.内核编译“目录下的check-config.sh下载到本地Windows上,在终端上用下面的adb命令推送到手机中,比如/sdcard目录 adb push check-config.sh /sdcard/ 然后执行 adb shell /bin/sh /sdcard/check-config.sh 你应该能得到下面这样的输出,其中missing的,就是当前内核缺少的运行docker的特征,有必须的,也有可选的,在后面的配置中尽量开启。 info: reading kernel config from /proc/config.gz ... Generally Necessary: --cgroup hierarchy: properly mounted [/dev] --CONFIG_NAMESPACES: enabled --CONFIG_NET_NS: enabled --CONFIG_PID_NS: enabled --CONFIG_IPC_NS: enabled --CONFIG_UTS_NS: enabled --CONFIG_CGROUPS: enabled --CONFIG_CGROUP_CPUACCT: enabled --CONFIG_CGROUP_DEVICE: enabled --CONFIG_CGROUP_FREEZER: enabled --CONFIG_CGROUP_SCHED: enabled --CONFIG_CPUSETS: enabled --CONFIG_MEMCG: enabled --CONFIG_KEYS: enabled --CONFIG_VETH: enabled --CONFIG_BRIDGE: enabled --CONFIG_BRIDGE_NETFILTER: enabled (as module) --CONFIG_IP_NF_FILTER: enabled --CONFIG_IP_NF_MANGLE: enabled --CONFIG_IP_NF_TARGET_MASQUERADE: enabled --CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: missing --CONFIG_NETFILTER_XT_MATCH_CONNTRACK: enabled --CONFIG_NETFILTER_XT_MATCH_IPVS: missing --CONFIG_NETFILTER_XT_MARK: enabled --CONFIG_IP_NF_NAT: enabled --CONFIG_NF_NAT: enabled --CONFIG_POSIX_MQUEUE: enabled --CONFIG_NF_NAT_IPV4: enabled --CONFIG_NF_NAT_NEEDED: enabled Optional Features: --CONFIG_USER_NS: enabled --CONFIG_SECCOMP: enabled --CONFIG_SECCOMP_FILTER: enabled --CONFIG_CGROUP_PIDS: enabled --CONFIG_MEMCG_SWAP: enabled --CONFIG_MEMCG_SWAP_ENABLED: enabled --CONFIG_IOSCHED_C购物: enabled --CONFIG_C购物_GROUP_IOSCHED: missing --CONFIG_BLK_CGROUP: missing --CONFIG_BLK_DEV_THROTTLING: missing --CONFIG_CGROUP_PERF: missing --CONFIG_CGROUP_HUGETLB: missing --CONFIG_NET_CLS_CGROUP: enabled --CONFIG_CGROUP_NET_PRIO: missing --CONFIG_CFS_BANDWIDTH: enabled --CONFIG_FAIR_GROUP_SCHED: enabled --CONFIG_IP_NF_TARGET_REDIRECT: enabled --CONFIG_IP_VS: missing --CONFIG_IP_VS_NFCT: missing --CONFIG_IP_VS_PROTO_TCP: missing --CONFIG_IP_VS_PROTO_UDP: missing --CONFIG_IP_VS_RR: missing --CONFIG_SECURITY_SELINUX: enabled --CONFIG_SECURITY_APPARMOR: missing --CONFIG_EXT3_FS: enabled --CONFIG_EXT3_FS_XATTR: missing --CONFIG_EXT3_FS_POSIX_ACL: missing --CONFIG_EXT3_FS_SECURITY: missing (enable these ext3 configs if you are using ext3 as backing filesystem) --CONFIG_EXT4_FS: enabled --CONFIG_EXT4_FS_POSIX_ACL: enabled --CONFIG_EXT4_FS_SECURITY: enabled - Network Drivers: - "overlay": --CONFIG_VXLAN: missing --CONFIG_BRIDGE_VLAN_FILTERING: missing Optional (for encrypted networks): --CONFIG_CRYPTO: enabled --CONFIG_CRYPTO_AEAD: enabled --CONFIG_CRYPTO_GCM: enabled --CONFIG_CRYPTO_SEQIV: enabled --CONFIG_CRYPTO_GHASH: enabled --CONFIG_XFRM: enabled --CONFIG_XFRM_USER: enabled --CONFIG_XFRM_ALGO: enabled --CONFIG_INET_ESP: enabled --CONFIG_NETFILTER_XT_MATCH_BPF: enabled --CONFIG_INET_XFRM_MODE_TRANSPORT: enabled - "ipvlan": --CONFIG_IPVLAN: missing - "macvlan": --CONFIG_MACVLAN: missing --CONFIG_DUMMY: enabled - "ftp,tftp client in container": --CONFIG_NF_NAT_FTP: enabled --CONFIG_NF_CONNTRACK_FTP: enabled --CONFIG_NF_NAT_TFTP: enabled --CONFIG_NF_CONNTRACK_TFTP: enabled - Storage Drivers: - "btrfs": --CONFIG_BTRFS_FS: missing --CONFIG_BTRFS_FS_POSIX_ACL: missing - "overlay": --CONFIG_OVERLAY_FS: missing - "zfs": - /dev/zfs: missing - zfs command: missing - zpool command: missing Limits: - /proc/sys/kernel/keys/root_maxkeys: 1000000 2) 代码编译 编译安卓内核需要有a)稳定且合适的内核源码;b)合适的gcc工具链。 三星官方代码:SM-G9650_CHN_QQ_Opensource.zip klabit87代码:android_kernel_samsung_sdm845-6.5.zip 工具链也可以使用源代码中自带的prebuilt版本。 本文继续以klabit87的代码为基准继续进行。 我们要在Linux环境工作一段时间了。把klabit87的代码上传到你的Linux(下面以Ubuntu为例)环境中,解压到合适的路径中备用。 我们需要安装编译所需要的依赖包 sudo apt install libssl-dev sudo apt install libncurses5-dev sudo apt install build-essential 如果你安装中碰到了版本不匹配报错,可以 sudo apt install aptitude aptitude install libssl-dev 按照提示先选n,再选y,纠正依赖。 环境基本准备好了。开始配置内核。 约定解压后源代码根目录为当前目录,则先把./arch/arm64/configs/star2qlte_chn_open_defconfig这个config文件备份,然后cp到当前目录下并改名为.config 然后执行make menuconfig 以开启CONFIG_NETFILTER_XT_MATCH_ADDRTYPE为例。在这个图形界面下,输入/进行搜索,输入上面的关键字后回车,得到下面的画面 其中1是表示找到的特征以及当前的状态(Yes/No),你可以按照3这个路径,找到2这样的提示词,表示的就是1这个特征。然后就可以用空格键来切换状态了。如果你在3路径下找不到,则就要检查下4这个前提条件了,如果4中有某个特征不满足条件,则3路径下并不显示出2这个提示词,表示它是不可用的不能被修改的状态的。你需要把4中的所有依赖的特征首先调整为Yes的状态,才可以修改1这个特征。 根据check-config.sh的输出结果逐个开启支持docker缺少的(missing)的特征,依赖于其它特征的,需要先开启被依赖的特征,然后再开启本特征,直到全部完成。这也是我们为什么不直接用vi编辑config文件的原因,确保依赖关系都是正确的。 最终因为编译不过或者找不到等原因,保留了以下missing的未修改 --CONFIG_CGROUP_HUGETLB: missing (这个通过图形界面找不到,强行vi修改config文件实现了支持) --CONFIG_EXT3_FS_XATTR: missing --CONFIG_BTRFS_FS: missing --CONFIG_BTRFS_FS_POSIX_ACL: missing - Storage Drivers: - "zfs": - /dev/zfs: missing - zfs command: missing - zpool command: missing 除了以上为了docker的config文件的修改,还建议修改以下2项内容 CONFIG_FRAME_WARN=4096 (路径:kernel hacking->Comlipe-time checks and complier options -> warn for stack frames larger than 的数值,将其修改为4096,解决编译错误) CONFIG_LOCALVERSION=“-GogoLiuV0.1” 这个可以改成你的名字和版本号,这样在你替换完手机的内核后,可以通过这个本地版本号来确认是否替换成功。另外,看到自己名字的内核在运行也有点小骄傲。 把改好的.config拷贝回原来的地方原来的名字,理论上再运行./build_kernel.sh进行编译就可以了。你可以从“网盘/4.内核编译”下载我修改好的config文件star2qlte_chn_open_defconfig。 但是,build_kernel.sh文件还需要修改,增加环境变量 export PLATFORM_VERSION=10 这样可以保证编译出来的内核WIFI工作正常。 另外,build_kernel.sh中的PATH的值,要改为你的源代码中的./tools/prebuilts/gcc-cfp-single/aarch64-linux-android-4.9/bin,使用绝对路径更好。第一个make的最后一个参数也修改为你编辑好的defconfig文件,即star2qlte_chn_open_defconfig。 编译中还会报错,做以下代码级别修改 scripts/dtc/dtc-parser.tab.c_shipped 1199行的yylloc定义前添加extern 给net/netfilter/xt_qtaguid.c,函数iface_stat_fmt_proc_show,打一个补丁 @@ -737,7 +737,7 @@ { struct proc_iface_stat_fmt_info *p = m->private; struct iface_stat *iface_entry; - struct rtnl_link_stats64 dev_stats, *stats; + struct rtnl_link_stats64 *stats; struct rtnl_link_stats64 no_dev_stats = {0}; @@ -745,13 +745,8 @@ current->pid, current->tgid, from_kuid(&init_user_ns, current_fsuid())); iface_entry = list_entry(v, struct iface_stat, list); + stats = &no_dev_stats; - if (iface_entry->active) { - stats = dev_get_stats(iface_entry->net_dev, - &dev_stats); - } else { - stats = &no_dev_stats; - } /* * If the meaning of the data changes, then update the fmtX * string. 现在可以编译了,如果以前编译过,或者修改了config文件,则需要使用 make mrproper 彻底清除后重新再编译。 我不太喜欢一次性执行build_kernel.sh文件,而是设置好以下环境变量, export PLATFORM_VERSION=10 export ARCH=arm64 export PATH=/home/lewis/shared/android_kernel_samsung_sdm845-6.5/tools/prebuilts/gcc-cfp-single/aarch64-linux-android-4.9/bin PATH 在kernel目录下执行一次 mkdir out
然后执行一步以下命令,确保out/.config被成功生成 make -C $(pwd) O=$(pwd)/out CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android star2qlte_chn_open_defconfig 然后再执行下面的语句编译, make -j8 -C $(pwd) O=$(pwd)/out CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android 如果出现代码级编译错误,修改后只是重新执行最后一个命令即可。 编译成功后,生成的image位置在kernel/out/arch/arm64/boot/Image.gz-dtb。 二、烧入新内核 我们先在手机上安装termux,使用“网盘/5.安装的apk”下的com.termux_118.apk安装即可。安装好后进行配置。以下命令在手机上的termux环境中输入: termux-setup-storage 会有弹出框,点击同意,获得访问本地权限 termux-change-repo 换源,可以换到北大的BFSU。向下移动到BFSU,空格键选择,然后OK。 apt update apt upgrade 需要选择时一直选择y,并回车。 pkg install openssh sshd -p 8022 开启ssh whoami 获得用户账号,一般是u0_axxx格式, passwd 设置当前用户的密码 有了用户名/密码,就可以在PC下用FinalShell,PuTTY或者在shell下登陆ssh了。 以下命令在ssh环境中执行 pkg install vim 顺便编辑下.bashrc,把sshd -p 8022加入,自动开启ssh pkg install tsu 安装超级用户的包 tsu(或者su) 手机上有magisk的弹窗,点击允许给予root权限 ls -al /dev/block/bootdevice/by-name 得到如下输出,即可知boot分区的实际位置 lrwxrwxrwx 1 root root 16 2018-01-09 00:26 boot -> /dev/block/sda20 dd if=/dev/block/sda20 of=/sdcard/boot.img 这样就获得手机当前的boot区img 把这个img传回到PC上,可以使用scp命令 scp username@ip_address:/sdcard/boot.img . 或者adb命令 adb pull /sdcard/boot.img . 如果你想简单点,可以跳过下面这个AIK步骤,直接从“网盘/4.内核编译“下载我生成好的image-new.img。 AIK有Windows版本和Linux版本,我使用了Linux版本AIK-Linux-v3.8-ALL.tar.gz(可以从“网盘/4.内核编译”获得),它需要python3的支持。 解压到合适的位置,然后把boot.img也放到同目录下,执行 ./unpackimg.sh boot.img 会有类似的输出, Splitting image to "split_img/"... ANDROID! magic found at: 0 …… 进入split_img目录,将boot.img-kernel文件删掉,然后将自己生成的Image.gz-dtb文件拷贝到./split_img目录下,并重命名为boot.img-kernel。 执行./repackimg.sh,生成image-new.img文件,即我们可以刷入的boot.img文件。 把image-new.img用adb push传入手机/sdcard,在手机上用termux的或者ssh连接手机,输入tsu获得root权限,然后使用dd命令烧入新的img dd if=/sdcard/image-new.img of=/dev/block/sda20 现在重启手机,时间稍长,启动后可发现kernel已被更换,在设置-关于手机-软件信息-内核版本处可看到你自己打的CONFIG_LOCALVERSION的标记。 如果你现在在adb shell下再次检查docker所需特征, /bin/sh /sdcard/check-config.sh 你会发现基本上都支持了。 因为内核更换,所以magisk打的补丁没有了,在TWRP中再次安装magisk的zip包。重启后系统中再次运行magisk的apk,按提示选择直接安装并重启后,恢复了magisk的权限。 你可以进入TWRP,再次备份一个当前的boot区到SD卡上,折腾时出现任何意外就可以救砖了。 ~~~~~~~~~~~~~
到此和文章原来的位置就可以链接上了。如果有点乱的话,可以去B站搜索“安卓手机直接运行Docker,可行?可行!!”,找到我另外发的完整的版本。 希望对你有些帮助 |