diff --git "a/sig/Cloud_Kernel_Sig/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\343\200\2203-4\343\200\221\345\215\225\347\213\254\347\274\226\350\257\221intree\346\250\241\345\235\227\346\214\207\345\215\227.md" "b/sig/Cloud_Kernel_Sig/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\343\200\2203-4\343\200\221\345\215\225\347\213\254\347\274\226\350\257\221intree\346\250\241\345\235\227\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..f1ccace51e6c579ed13f7d7d5292d1d54f648d28 --- /dev/null +++ "b/sig/Cloud_Kernel_Sig/content/\345\274\200\345\217\221\350\200\205\346\214\207\345\215\227/\343\200\2203-4\343\200\221\345\215\225\347\213\254\347\274\226\350\257\221intree\346\250\241\345\235\227\346\214\207\345\215\227.md" @@ -0,0 +1,140 @@ +# 背景 +在生产环境适配anolis的时候,可能遇到以下问题: + +1. 由于ANCK的config并不是将所有的module配置都打开,所以可能出现某些需要的驱动未被编译,找不到的情况,比如wireguard模块、gfs2模块。 +2. 出于debug的需要,可能需要在某个版本的源码基础上,打上一些patch并单独编译驱动,对该patch验证进行验证,比如对bnxt模块、ixgbe模块等的debug。 + +本文提供一个单独编译此类模块的方法,供大家在遇到此类问题时参考解决。 +# 解决方法 +## 1. 上报bugzilla +遇到此类问题时,您可以先上报bugzilla告诉我们,我们会对此问题进行评估,以确定是否在下个版本打开对应config,或者修复相关bug。 +具体上报方法,请点击[此链接](https://openanolis.cn/sig/Cloud-Kernel/doc/607601736106142822)。 +此外,您也可以通过[钉钉群](https://openanolis.cn/sig/Cloud-Kernel)与我们取得联系。 +## 2. 准备编译环境 +### 2.1 拉取docker镜像 +首先,您需要拉取anolis的docker镜像:[https://hub.docker.com/r/openanolis/anolisos/tags](https://hub.docker.com/r/openanolis/anolisos/tags) + +1. 根据tag拉取相应的系统版本(这里以8.6-x86_64为例) + +`docker pull openanolis/anolisos:8.6-x86_64` + +2. 查看下载的镜像 + +`docker images` +示例结果如下: +> REPOSITORY TAG IMAGE ID CREATED SIZE + +> docker.io/openanolis/anolisos 8.6-x86_64 6b03ceb18d9c 9 days ago 211 MB + +3. 运行镜像 + +`docker run -it openanolis/anolisos:8.6-x86_64 /bin/bash` +### 2.2 安装依赖库 +安装开发工具包组 +`yum groupinstall "development tools"` +安装依赖组件 +`yum install ncurses-devel openssl-devel elfutils-libelf-devel dwarves wget git bc python3` +## 3. 准备内核源码 +您可以从源码包或者gitee仓库获取源码,**任选一种**即可。 +### 3.1 从源码仓库获取源码(推荐) +源码仓库参考该链接: [https://gitee.com/anolis/cloud-kernel](https://gitee.com/anolis/cloud-kernel) +直接clone该源码仓库会比较大,可以通过以下方法轻量clone: +`git clone https://gitee.com/anolis/cloud-kernel.git -b --depth=1` +以5.10.134-12.1版本为例: +`git clone https://gitee.com/anolis/cloud-kernel.git -b 5.10.134-12.1 --depth=1` +### 3.1 从src.rpm包获取源码 +#### 3.1.1 下载内核源码包 +不同版本内核,由于其发布时搭载到不同的Anolis版本,所以这些源码包也会存放在不同的目录下,需要您执行检索以下列表中的链接,找到对应的版本并下载。 + +Anolis7-4.19 + +- [https://mirrors.openanolis.cn/anolis/7.7/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/7.7/Plus/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/7.9/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/7.9/Plus/source/Packages/) + +Anolis8-4.19 +- [https://mirrors.openanolis.cn/anolis/8/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/8/Plus/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.2/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/8.2/Plus/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.4/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/8.4/Plus/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.6/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/8.6/Plus/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.8/Plus/source/Packages/](https://mirrors.openanolis.cn/anolis/8.8/Plus/source/Packages/) + +Anolis8-5.10 +- [https://mirrors.openanolis.cn/anolis/8/Experimental/source/Packages/](https://mirrors.openanolis.cn/anolis/8/Experimental/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.4/Experimental/source/Packages/](https://mirrors.openanolis.cn/anolis/8.4/Experimental/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.6/Experimental/source/Packages/](https://mirrors.openanolis.cn/anolis/8.6/Experimental/source/Packages/) +- [https://mirrors.openanolis.cn/anolis/8.8/kernel-5.10/source/Packages/](https://mirrors.openanolis.cn/anolis/8.8/kernel-5.10/source/Packages/) + + + +以anolis8 5.10.134-12.1版本为例,使用wget下载它: +`wget https://mirrors.openanolis.cn/anolis/8.6/Experimental/source/Packages/kernel-5.10.134-12.1.an8.src.rpm` +#### 3.1.2 从源码包中获取源码 + +1. 安装rpmbuild工具 + +`yum install -y rpm-build yum-utils` + +2. 安装src.rpm包 + +`rpm -ivh kernel-5.10.134-12.1.an8.src.rpm` + +3. 源码被安装在 `~/rpmbuild`目录下。 + +`ls ~/rpmbuild/` + +4. 安装内核的其他依赖包 + +`yum-builddep ~/rpmbuild/SPECS/kernel.spec` + +5. 解压内核源码,并打上相关patch + +`rpmbuild -bp ~/rpmbuild/SPECS/kernel.spec` + +6. 接下来,内核源码会出现在`~/rpmbuild/BUILD`目录下 +```shell +# ls ~/rpmbuild/BUILD +kernel-5.10.134-12.1.an8 +``` + +7. 切换到内核源码目录下 + +`cd ~/rpmbuild/BUILD/kernel-5.10.134-12.1.an8/linux-5.10.134-12.1.an8.x86_64/` +## 4. 对代码进行修改(非必要) +在进行下一步之前,你可以选择对代码做出一些修改,比如打上某个bugfix的补丁。修改完毕后,请继续参考下面的步骤进行操作。 +## 5. 编译驱动代码 +以5.10.134-12.1内核版本,编译gfs2模块为例。 + +1. 配置内核config + +`make anolis_defconfig` + +2. 确保gfs2的config是打开的 + +执行`make menuconfig`,打开`CONFIG_GFS2_FS`并保存文件。 + +3. 执行模块编译前的一些准备工作 + +`make modules_prepare` + +4. 编译驱动模块 + +gfs2模块的目录为`fs/gfs2/`,我们执行该命令来单独编译此模块: +`make M=fs/gfs2` + +5. 执行成功后,该模块会出现在对应目录下面 + +`ls fs/gfs2/gfs2.ko` + +6. 使用`docker cp`命令,将对应的模块拷贝至host +## 6. 加载模块 +### 6.1 直接加载 +如果是缺失内核模块造成的,或者是该模块之前未被加载到内核(即`lsmod`没有该模块的信息)。 +这种情况下,可以直接执行`modprobe xxx.ko`命令直接将其加载到内核中。 +### 6.2 替换已有模块 +内核中已经加载过一个同名模块,需要将新的进去,比如对网卡驱动(bnxt、mellanox、ixgbe)之类的进行debug。 +这种情况下一般不太好卸载掉原有的内核模块,推荐的做法是替换掉原有的模块。具体方法如下: + +- 找到原模块位置,模块路径为`/lib/modules/$(uname -r)/kernel/` +- 备份原有模块,并替换新模块 +- 执行`dracut -f`刷新`initramfs` +- reboot重启