diff --git a/playground/openEuler-Exp/openEuler-KMPE/openEuler-KMPE.md b/playground/openEuler-Exp/openEuler-KMPE/openEuler-KMPE.md index 2cf2de8521146049f6b5d78a8a90f6b3ef0cf24c..a9f59cf3c85dc1d264fc2156d826e3db0a8400df 100644 --- a/playground/openEuler-Exp/openEuler-KMPE/openEuler-KMPE.md +++ b/playground/openEuler-Exp/openEuler-KMPE/openEuler-KMPE.md @@ -18,7 +18,9 @@ ## I. 内核的编译与安装 -##### 1. 准备好编译内核的环境 +#### 1. 准备环境 + +准备好编译内核的环境: ```shell yum group install -y "Development Tools" @@ -26,14 +28,18 @@ yum install -y bc yum install -y openssl-devel ``` -##### 2. 备份boot目录以防后续步骤更新内核失败 +#### 2. 备份 + +备份boot目录以防后续步骤更新内核失败: ```shell tar czvf boot.origin.tgz /boot/ uname -r > uname_r.log # 保存当前内核版本信息 ``` -##### 3. 获取内核源代码并解压 +#### 3. 获取源代码 + +获取内核源代码并解压: ```shell wget https://gitee.com/openeuler/kernel/repository/archive/openEuler-20.03-LTS-SP3.zip @@ -44,17 +50,17 @@ cd kernel 🔔 *注意* -您可能需要在openEuler代码仓(https://gitee.com/openeuler/kernel)获取到正确的内核代码URL地址并更新其源代码包的具体文件名称。 +您需要在openEuler代码仓(https://gitee.com/openeuler/kernel)获取到正确的内核代码URL地址并更新其源代码包的具体文件名称。 解压后的内核源码文件夹名称可能和“*kernel-openEuler-20.03-LTS-SP3*”不一样,我们仅以此为例。 -##### 4. 编译内核 +#### 4. 编译内核 ```shell make openeuler_defconfig ``` -在这里,我们按源代码文件`kernel/arch/arm64/configs/openeuler_defconfig`的配置配置内核。 +在这里,我们按源代码文件`kernel/arch/arm64/configs/openeuler_defconfig`配置内核。 ```shell make help | grep Image @@ -74,27 +80,31 @@ echo $(nproc) # For instance: 4 make -j$(nproc) Image modules dtbs ``` -上面的命令是以多线程编译内核的Image、modules和dtbs。 +上面的命令是以多线程编译内核的Image、modules和dtbs。为简单起见,我们将线程数设置成了核数。 + +#### 5. 安装内核 -##### 5. 安装内核 +安装内核模块: ```shell make modules_install ``` -输出可能是这样的: +会有类似以下的输出: ``` - ...... - INSTALL sound/soundcore.ko - DEPMOD 4.19.154 +...... +INSTALL sound/soundcore.ko +DEPMOD 4.19.154 ``` +安装内核: + ```shell make install ``` -输出可能是这样的: +最后的输出类似这样: ``` /bin/sh ./arch/arm64/boot/install.sh 4.19.154 \ @@ -103,48 +113,46 @@ dracut-install: Failed to find module 'xen-blkfront' dracut: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.tlIdPu/initramfs --kerneldir /lib/modules/4.19.154/ -m virtio_gpu xen-blkfront xen-netfront virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio ``` -🔔 *注意* - -在这里最后一步`make install`时出现的错误在这里可以忽略。 +注意:这里出现的“dracut: FAILED”错误可以忽略之。 -##### 6. 以新的内核重启系统 +#### 6. 重启系统 ```shell reboot ``` -在这里我们需要借助VNC窗口显示系统输出并在适当的时机(即GRUB菜单显示时)选用新编译出来的内核来启动系统。 +然后我们需要借助VNC窗口在GRUB菜单显示时用上下光标键选择新编译出来的内核来启动系统。 我们以新的内核引导系统后,可以继续在VNC窗口中登录系统,也可以以ssh终端登录,然后在并在shell中输入如下命令查看内核版本: ```shell -uname -r +uname -r # For instance: 4.19.154 ``` -一个可能的输出是:`4.19.154`,可以看出内核版本已更新。 +可以看出内核版本已更新。 🔔 *注意* -您编译出来的新内核版本通常与此不同。 +您编译出来的新内核版本通常会与此不同。 ## II. Hello, world! -##### 1. 准备源代码 +#### 1. 准备源代码 正确编写满足功能的源文件,包括.c源文件和Makefile文件。在这里请参照示例源文件hello_world.c及其Makefile(您可以用scp命令将它们上传到ECS。)假设您的源文件在`hello-world`目录下: ```shell cd hello-world ``` -##### 2. 编译源文件 +#### 2. 编译源文件 ```shell make ``` -##### 3. 加载内核模块 +#### 3. 加载内核模块 加载编译完成的内核模块,并查看加载结果: @@ -155,7 +163,7 @@ lsmod | grep hello_world # hello_world 262144 0 ``` -##### 4. 卸载内核模块 +#### 4. 卸载内核模块 卸载内核模块,并查看结果: ```shell @@ -177,22 +185,28 @@ dmesg | tail -n5 🔔 *注意* -第一次装在hello_world模块时,请忽略掉最开始安装模块时出现的两行错误提示信息。 +- 第一次装在hello_world模块时,请忽略掉最开始安装模块时出现的两行错误提示信息。 + +- 以上步骤输出的进程号以及时间戳可能和您实际的情况不一致。 -##### 5. 清理 +#### 5. 清理 ```shell make clean ``` -##### 6. 关机 +#### 6. 关机 -实验做完后可以关闭虚拟机(如果是按需购买的ECS,更要这么做以节约云资源): +实验做完后可以关闭虚拟机: ```shell poweroff ``` +🔔 *注意* + +如果是按需购买的ECS,实验做完后更要关机以节约云资源(这时仍有扣费,除非完全删除云资源)。 + ♾ *从具体到一般* 我们可以从这个例子中窥探到Linux内核模块的基本结构。 @@ -235,3 +249,170 @@ module_exit(my_module_exit); //指定卸载函数 - GRUB - Grand Unified Boot Loader,大一统引导装载程序 + + +# IV. 附:在x64平台上编译内核 + +除了鲲鹏平台,openEuler操作系统也支持x86_64、RISC-V等架构。兹列出在x86_64平台上的openEuler编译内核的步骤以供参考。 + +#### 1. 查看系统信息 + +先查看当前的系统信息: + +```shell +uname -m # Desire x86_64 +uname -r # For instance: 4.19.90-2003.4.0.0036.oe1.x86_64 +``` + +注意此例当前所用内核版本为4.19.XX-XXXX.X.X.XXXX.XXX.x86_64。 + +```shell +cat /etc/os-release +``` + +会有类似以下的输出信息: + +``` +NAME="openEuler" +VERSION="20.03 (LTS)" +ID="openEuler" +VERSION_ID="20.03" +PRETTY_NAME="openEuler 20.03 (LTS)" +ANSI_COLOR="0;31" +``` + +这表明当前是公元2020年3月发布的长期支持版openEuler操作系统。 + +🔔 *注意* + +您的系统的版本号可能与此不同。 + +```shell +lscpu | grep '^CPU(s):' +``` + +输出如下表示本例所用CPU为4核(您的系统可能与此不同): + +``` +CPU(s): 4 +``` + +也可以用以下命令查看CPU核数: + +```shell +cat /proc/cpuinfo | grep "processor" | wc -l +grep processor /proc/cpuinfo | wc -l +echo $(nproc) # For instance: 4 +``` + +#### 2. 准备环境 + +准备编译内核的软件环境: + +```shell +yum group install -y "Development Tools" +yum install -y bc +yum install -y openssl-devel +yum install -y elfutils-libelf-devel +``` + +#### 3. 获取源码 + +获取内核源代码(假设把它放在Home目录下): + +```shell +cd ~ +wget https://gitee.com/openeuler/kernel/repository/archive/kernel-4.19.zip +unzip kernel-4.19.zip +ls # For instance: kernel-4.19.zip kernel-kernel-4.19 +mv kernel-kernel-4.19/ kernel/ +``` + +#### 4. 编译、安装内核 + +先进入内核目录查看内核可以编译成为何种类型的文件: + +```shell +cd kernel +make help | grep Image +``` + +如果显示如下则表示内核可编译为bzImage类型的文件: + +``` +* bzImage - Compressed kernel image (arch/x86/boot/bzImage) +``` + +产生配置文件: + +```shell +make openeuler_defconfig +``` + +以下是一些可能的输出信息示例: + +``` +arch/x86/configs/openeuler_defconfig:2534:warning: override: reassigning to symbol HINIC +# +# configuration written to .config +# +``` + +编译内核: + +```shell +make -j$(nproc) bzImage +``` + +这里以多线程编译内核,我们简单地将线程数设置成核数。编译完成通常会输出: + +``` +Kernel: arch/x86/boot/bzImage is ready (#1) +``` + +编译内核模块: + +```shell +make -j$(nproc) modules +``` + +安装内核模块: + +```shell +make modules_install # For instance: DEPMOD 4.19.208 +``` + +安装内核: + +```shell +make install +``` + +在本例中有以下输出: + +``` +sh ./arch/x86/boot/install.sh 4.19.208 arch/x86/boot/bzImage \ + System.map "/boot" +dracut-install: ERROR: installing 'virtio_pci' +dracut: FAILED: /usr/lib/dracut/dracut-install -D /var/tmp/dracut.R4CHaO/initramfs --kerneldir /lib/modules/4.19.208/ -m virtio_gpu xen-blkfront xen-netfront virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio +``` + +注意:这里的“dracut: FAILED”错误请忽略。 + +#### 5. 重启系统 + +```shell +reboot +``` + +重启并在GRUB菜单中选择以新的内核来引导操作系统,登录系统的shell然后检查内核版本: + +```shell +uname -r # For instance: 4.19.208 +``` + +这和原来的内核版本号不同,表明确实以新版本的内核启动了系统。 + +🔔 *注意* + +您编译出来的新内核版本通常会与此不同。