使用docker简单编译k20pro内核

简介#

本文将介绍一下如何使用docker编译红米k20pro的内核。作者当时尝试构建内核的原因是为了将3年前(好像是吧)购买的k20pro至尊版(已退役,12GB内存,512GB硬盘)制作成一个小的服务器。而如果只有安卓系统,实在是过于简陋,因此作者想在该机器上安装docker以扩展到更加完整的功能。

本人参考的教程有以下两个:CGCL-codes/Android-ContainerDocker on Android。这两个都是比较优秀的教程,前者的作者好像是国人,而且使用的也是k20pro(不愧是一代神机),但是使用的是安卓10的手机,并且指定了ROM。后者教程相对通用一些,建议可以两个教程结合一起看,求同存异。

本文的主要目的是为了记录一下自己编译内核时的过程和一些坑,避免大家重蹈覆辙。

本文编译使用的机器是centos 7,8核2.6GHz的AMD,16GB内存。k20pro使用基于安卓11的MIUI12.5稳定版。

Clone内核源码#

内核源码的来源有很多,可以去小米的开源仓库中寻找,也可以去找其他大神的定制内核源码。我这里使用的是在XDA论坛找到的Marisa内核源码,这个内核支持各种超频,虽然我对于超频并没有什么兴趣。

首先我们将源码clone下来:

git clone https://github.com/Laulan56/android_kernel_xiaomi_sm8150.git --depth=1 -b miui

 

为了节省时间,作者指定了depth深度为1,并选择miui分支。这里也为后来的编译埋下了一个小坑,如果想避免这个坑,可以选择深度为2。

然后接下来可以在源码目录中执行

git submodule update --init

 

克隆所有的子仓库,主要是因为这个内核中使用了exfat,并引入了对应的子仓库,所以需要如此。

修改内核源码#

实际上这个源码是可以直接编译成功的,但是因为我们有一些骚操作并且需要修改内核的编译配置,所以需要修改一定量的源码。

首先是由于clone深度只有1导致的一个问题。在drivers/staging/qcacld-3.0/Kbuild:3356和第3363行。

CLD_IDS = $(shell cd "$(WLAN_ROOT)" && \
	git log -50 $(CLD_CHECKOUT)~..HEAD | \
		sed -nE 's/^\s*Change-Id: (I[0-f]{10})[0-f]{30}\s*$$/\1/p' | \
		paste -sd "," -)

CMN_CHECKOUT = $(shell cd "$(WLAN_COMMON_INC)" && \
	git reflog | grep -vm1 "}: cherry-pick: " | grep -oE ^[0-f]+)
CMN_IDS = $(shell cd "$(WLAN_COMMON_INC)" && \
	git log -50 $(CMN_CHECKOUT)~..HEAD | \
		sed -nE 's/^\s*Change-Id: (I[0-f]{10})[0-f]{30}\s*$$/\1/p' | \
		paste -sd "," -)

 

$(CLD_CHECKOUT)$(CMN_CHECKOUT)后有一个波浪号,这个是指代上一个commit,但是我们因为只clone了一个commit,所以历史记录上没有的。为了保证不报错,直接将波浪号去掉就好(如果clone的层级较深,可以不考虑这个)。

然后是在kernel/Makefile:124和128行。

ifneq ($(CONFIG_MACH_XIAOMI_CEPHEUS),y)
$(obj)/config_data.gz: arch/arm64/configs/cepheus_stock_defconfig FORCE
endif

ifneq ($(CONFIG_MACH_XIAOMI_RAPHAEL),y)
$(obj)/config_data.gz: arch/arm64/configs/raphael_stock_defconfig FORCE
endif

 这里会使用默认的配置覆盖我们使用的配置,为了解决这个问题,我们可以这两行(实际上应该修改一行就OK了)修改为

ifneq ($(CONFIG_MACH_XIAOMI_CEPHEUS),y)
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
endif

ifneq ($(CONFIG_MACH_XIAOMI_RAPHAEL),y)
$(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
endif

 

编译环境(构建docker)#

作者是不建议在自己电脑上直接构造编译环境的,作者比较推荐使用docker进行编译环境的构造,docker可以尽可能的减少各个方面对编译的影响。实际上,Marisa内核源码中也有对于自己的编译镜像的构建,在.drone.yml中,有兴趣的可以参考这个进行镜像的构建,但是我当时因为时间原因,没有尝试。

作者使用的编译dockerfile,由于本人使用docker的时间也很短(实际上,就是为了编译内核特意学的),所以有很多不太合理的地方,大家可以自行修改。

FROM ubuntu:bionic

RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list
RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb http://mirrors.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb http://mirrors.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic-security main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.tencent.com/ubuntu/ bionic-updates main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb-src http://mirrors.tencent.com/ubuntu/ bionic-proposed main restricted universe multiverse" >> /etc/apt/sources.list
RUN echo "#deb-src http://mirrors.tencent.com/ubuntu/ bionic-backports main restricted universe multiverse" >> /etc/apt/sources.list

RUN apt clean all
RUN apt update

RUN apt install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev unzip openjdk-8-jdk language-pack-zh-hans python cpio

COPY dtc /usr/bin/
RUN chmod +x /usr/bin/dtc

# 编译链
RUN mkdir -p /compile/src

ADD clang-4691093.tar.gz /compile/clang
ADD pie-release.tar.gz /compile/gcc

COPY build.sh /compile/src/
WORKDIR /compile/src
CMD bash build.sh

 

首先是对应的编译器下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于使用Docker Desktop编译OpenWrt,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Docker Desktop,并且它正在运行。 2. 打开终端或命令提示符,然后使用以下命令拉取OpenWrt源代码的Docker镜像: ``` docker pull openwrtorg/sdk:latest ``` 3. 接下来,创建一个新的工作目录,用于存储OpenWrt的配置和输出文件。可以使用以下命令创建一个名为"openwrt"的目录: ``` mkdir openwrt ``` 4. 进入"openwrt"目录并创建一个名为"config"的子目录: ``` cd openwrt mkdir config ``` 5. 在"config"目录中创建一个名为"seed.config"的文件,并将您的OpenWrt配置选项添加到该文件中。例如,您可以使用文本编辑器打开该文件并添加以下内容: ``` CONFIG_TARGET_x86=y CONFIG_TARGET_x86_64=y CONFIG_TARGET_x86_64_Generic=y ``` 这些配置选项示例适用于x86_64架构的通用OpenWrt编译。 6. 回到"openwrt"目录,并使用以下命令运行Docker容器: ``` docker run --rm -it -v $(pwd)/config:/home/user/openwrt/config openwrtorg/sdk:latest /bin/bash ``` 此命令将运行一个新的Docker容器,并将"config"目录映射到容器内的"/home/user/openwrt/config"目录。 7. 在Docker容器中,使用以下命令进入OpenWrt的源代码目录: ``` cd /home/user/openwrt/sdk ``` 8. 运行以下命令以安装OpenWrt的构建工具和依赖项: ``` ./scripts/feeds update -a ./scripts/feeds install -a ``` 9. 配置OpenWrt编译选项,运行以下命令: ``` make menuconfig ``` 在菜单界面中,您可以根据需要进行选择和配置。完成后,保存并退出菜单。 10. 开始编译OpenWrt固件,运行以下命令: ``` make -j$(nproc) ``` 这将使用所有可用的CPU核心进行编译编译过程可能需要一些时间,具体取决于您的系统性能和OpenWrt配置的复杂程度。 11. 编译完成后,在Docker容器中可以找到生成的固件文件。您可以退出容器并在本地系统上访问它们。运行以下命令退出容器: ``` exit ``` 12. 现在,您可以在"openwrt"目录中找到生成的固件文件,可以根据需要使用它们。 请注意,这只是一个基本的说明,您可能需要根据自己的需求和环境进行适当的调整。确保您已经熟悉Docker和OpenWrt的基本概念,并参考OpenWrt官方文档以获取更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值