内核编译

莫孟林 莫孟林     2022-10-21     196

关键词:

当特定环境需要,为了提升服务器性能或支持特定的硬件设备,我看可以选择裁剪内核和特定模块的编译。而编译内核则需要以下几个步骤

一、环境配置

1、最基本的gcc编译器
2、openssle-devel包
3、 ncurses包(处理图形界面配置)
4、kernel源码文件(www.kernel.org获得最新稳定版本,但不建议编译夸多个大版本的内核,因为有可能编译完成并使用之后,很有可能会出现问题。而先已知的redhat6使用的是2.6版本,redhat7使用的是3.10版本,最新的kernel版本是4.14)

我们直接yum install 这些工具
yum install -y openssl-devel ncurses gcc libelf-dev libelf-devel

二、编译安装的指令

.config:准备文本配置文件(当时用meke menuconfig之后会在kernel的源码文件目录生成这个文件,期内就是保存的你预编译的内核的选项信息)
make menuconfig:配置内核选项
make [-j #]    有几个cpu j后就跟几,指用几个cpu进行编译,可以提升编译速度
make modules_install:安装模块
make install :安装bzImage为/boot/vmlinuz-VERSION-RELEASE
make gconfig:基于GTK (GNOME)环境窗口界面
make xconfig:基于QT(KDE)环境的窗口界面支持“全新配置”模式进行配置
make defconfig:基于内核为目标平台提供的“默认”配置进行配置
make allyesconfig: 所有选项均回答为“yes“
make allnoconfig: 所有选项均回答为”no“
编译内核的一部分功能:

只编译某子目录中的相关代码
cd /usr/src/linux
make dir/
只编译一个特定的模块
make dir/file.ko
例如:只为e1000编译驱动:
make drivers/net/ethernet/intel/e1000/e1000.ko

如何交叉编译内核:
编译的目标平台与当前平台不相同
make ARCH=arch_name
要获取特定目标平台的使用帮助
make ARCH=arch_name help
make ARCH=arm help
make clean:清理大多数编译生成的文件,但会保留config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:mrproper、patches以及编辑器备份文件

三、编译安装内核步骤

  1. tar xf linux-4.14.10.tar.xz -C /usr/src #解压新的内核到/usr/src下
  2. cd /usr/src #cd 到内核的目录
  3. ln -sv linux-4.14.10 linux #创建内核目录的软连接
  4. cd /usr/src/linux #进入内核目录
  5. cp /boot/config-$(uname -r) ./.config #拷贝boot下的config-version 文件到当前目录,并重命名为.config (我们使用的centos系统在安装好之后,在boot目录下都有一份内核预编译的配置文件,我们可以基于这个文件来进行增减)
  6. #make help #make命令的帮助
  7. make menuconfig #使用图形界面来预配置内核选项
  8. make -j 2 #使用 2个cpu来编译(这个根据实际的cpu数量来定,影响编译时间)
  9. make modules_install #安装内核的外部模块到/lib/modules的指定路径
  10. make install #安装编译好的内核文件到/boot目录下

下面我们详细说一下make menuconfig环节,内核必选的几个功能,否则机器无法启动。更详细的内核参数需要自行去查阅资料了。

四、配置编译内核的环境

我们将kernel源码文件下载并解压到root的家目录

  1. [[email protected] ~]# tar -xf linux-4.14.10.tar.xz
  2. [[email protected] ~]# cd linux-4.14.10/

现在配置预编译环境,我们使用make menuconfig

  1. [[email protected] ~]# make menuconfig

技术分享图片

输入命令行会出现一个图形化的字符配置。

我们要实现内核的裁剪,来缩减内核第体积,剔除无用的功能,达到优化系统的目的, 但是需要考虑到核心的功能,如果没有核心的功能,系统将无法启动,那么目的也就实现不了了。以下的这些内核功能必须存在,否则内核将无法启动:

确保引导系统的每一个至关重要的驱动(比如SCSI控制器,等等)是编译进内核而不是作为一个模块,否则系统将无法完全引导。

  1. #KERNEL 启用devtmpfs支持
  2. Device Drivers --->
  3. Generic Driver Options --->
  4. [*] Maintain a devtmpfs filesystem to mount at /dev
  5. [ ] Automount devtmpfs at /dev, after the kernel mounted the rootfs
  1. #KERNEL Enabling SCSI disk support
  2. Device Drivers --->
  3. SCSI device support --->
  4. <*> SCSI disk support
  1. KERNEL 选择必须的文件系统
  2. File systems --->
  3. <*> Second extended fs support
  4. <*> The Extended 3 (ext3) filesystem
  5. <*> The Extended 4 (ext4) filesystem
  6. <*> Reiserfs support
  7. <*> JFS filesystem support
  8. <*> XFS filesystem support
  9. <*> Btrfs filesystem support
  10. DOS/FAT/NT Filesystems --->
  11. <*> MSDOS fs support
  12. <*> VFAT (Windows-95) fs support
  13. Pseudo Filesystems --->
  14. [*] /proc file system support
  15. [*] Tmpfs virtual memory file system support (former shm fs)

如果使用PPPoE连接到互联网,或者是拨号调制解调器,则启用下面的选项

  1. KERNEL 选择PPPoE所需要的驱动
  2. Device Drivers --->
  3. Network device support --->
  4. <*> PPP (point-to-point protocol) support
  5. <*> PPP support for async serial ports
  6. <*> PPP support for sync tty ports

这两个压缩选项将是无害的,但是它们并不是核心的选项,包括基于以太网的PPP选项也是一样,只有在配置内核模式PPPoE时才会需要不要忘记选择内核中的网卡。

大多数系统会有多核心处理,所以激活“Symmetric multi-processing support”是重要的

  1. KERNEL 激活SMP支持
  2. Processor type and features --->
  3. [*] Symmetric multi-processing support

在多核心系统中,每一个核心计作一个处理器。

如果使用USB输入设备(比如键盘和鼠标)或其他USB设备,不要忘记启用那些

  1. HID support --->
  2. -*- HID bus support
  3. <*> Generic HID driver
  4. [*] Battery level reporting for HID devices
  5. USB HID support --->
  6. <*> USB HID transport layer
  7. [*] USB support --->
  8. <*> xHCI HCD (USB 3.0) support
  9. <*> EHCI HCD (USB 2.0) support
  10. <*> OHCI HCD (USB 1.1) support

如果应该需要支持32位程序(CONFIG_IA32_EMULATION),请确保选择IA32仿真该选项,在现在来看,这个选项在大多数系统内是必要的。

  1. KERNEL Selecting processor types and features
  2. Processor type and features --->
  3. [ ] Machine Check / overheating reporting
  4. [ ] Intel MCE Features
  5. [ ] AMD MCE Features
  6. Processor family (AMD-Opteron/Athlon64) --->
  7. ( ) Opteron/Athlon64/Hammer/K8
  8. ( ) Intel P4 / older Netburst based Xeon
  9. ( ) Core 2/newer Xeon
  10. ( ) Intel Atom
  11. ( ) Generic-x86-64
  12. Executable file formats / Emulations --->
  13. [*] IA32 Emulation

如果以前在分区磁盘时使用GPT分区标签支持,请启用GPT分区标签支持

  1. -*- Enable the block layer --->
  2. Partition Types --->
  3. [*] Advanced partition selection
  4. [*] EFI GUID Partition support

如果使用UEFI引导系统,请在Linux内核中启用 Enable EFI stub support

  1. KERNEL Enable support for UEFI
  2. Processor type and features --->
  3. [*] EFI runtime service support
  4. [*] EFI stub support
  5. [*] EFI mixed-mode support
  6. Firmware Drivers --->
  7. EFI (Extensible Firmware Interface) Support --->
  8. <*> EFI Variable Support via sysfs

以上的参考文献:

https://wiki.gentoo.org/wiki/Kernel/Configuration
https://wiki.gentoo.org/wiki/Handbook:X86/Installation/Kernel

五、卸载内核

除/lib/modules/目录下不需要的内核库文件
删除/usr/src/linux/目录下不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表

































内核编译安装

以下讲的是内核基础、内核管理、安装编译内核、安装程序anaconda、kickstart。1、内核基础 对于内核,现在有单内核和微内核设计,现在的内核多采用单内核和高度模块化设计,对于模块化设计,可以进行动态装卸载。 内... 查看详情

linux内核编译

内核中的功能除了核心功能之外,在编译时,大多功能都有三种选择:1、不使用此功能;2、编译成内核模块;3、编译进内核;如何手动编译内核:makegconfig:Gnome桌面环境使用,需要安装图形开发库组:GNOMESoftwareDevelopmentmakekconfi... 查看详情

linux内核配置编译以及模块开发(代码片段)

文章目录Linux内核简介Linux体系结构Linux内核架构虚拟文件系统内核源码结构Linux内核配置与编译为什么要配置内核?内核配置方法编译内核过程Linux内核模块开发什么是内核模块内核模块设计安装与卸载模块可选信息模块申明... 查看详情

linux内核配置编译以及模块开发(代码片段)

文章目录Linux内核简介Linux体系结构Linux内核架构虚拟文件系统内核源码结构Linux内核配置与编译为什么要配置内核?内核配置方法编译内核过程Linux内核模块开发什么是内核模块内核模块设计安装与卸载模块可选信息模块申明... 查看详情

1-18编译安装内核支持ntfs文件系统

大纲:源码编译Linux内核使用Linux内核模块实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能===================================================================一、源码编译Linux内核通常我们想对内核进行升级时,可通过下... 查看详情

内核编译

...升服务器性能或支持特定的硬件设备,我看可以选择裁剪内核和特定模块的编译。而编译内核则需要以下几个步骤一、环境配置1、最基本的gcc编译器2、openssle-devel包3、 ncurses包(处理图形界面配置)4、kernel源码文件(www.kern... 查看详情

教你如何快速编译安装新内核

随着内核版本的更新换代,你是否有觉得自己的内核版本有些低了呢?如果有的话,没关系,今天小编就来教大家如何编译安装新的内核。在编译安装内核之前先检查我们的虚拟机所在的磁盘空间,预留空间10G以上,不然编译安... 查看详情

如何编译linux版本

参考技术A编译安装内核下载并解压内核解压内核:tarxflinux-2.6.XX.tar.xz定制内核:makemenuconfig参见makefilemenuconfig过程讲解编译内核和模块:make生成内核模块和vmlinuz,initrd.img,Symtem.map文件安装内核和模块:sudomakemodules_installinstall... 查看详情

第五周内核编译与系统调用

内核编译与系统调用任务详情参考“实践2.2编译内核及系统调用”完成相实践出问题参考“编译内核之扩大硬盘空间.docx”附件提交新加系统调用测试结果截图实验截图感受此次试验老是出问题,下载好了内核之后,解压一直出... 查看详情

linux驱动模块编译进内核中

Linux驱动模块编译进内核中BQ27501驱动编译进内核一、       驱动程序编译进内核的步骤在linux内核中增加程序需要完成以下三项工作:1.将编写的源代码复制到Linux内核源代码的相应目录;2.在目录的Kconfig文件中增加新... 查看详情

linux系统移植:内核获取和编译(代码片段)

文章目录Linux系统移植:内核获取和编译一、获取Linux内核二、Linux内核编译Linux系统移植:内核获取和编译一、获取Linux内核Linux由Linux基金会管理与发布,Linux官网为https://www.kernel.org,选取合适的版本来使用就行... 查看详情

内核编译

核心:/boot/vmlinuz-version模块:.ko/lib/modules/version/内核设计: 1、单内核:linux      模块化设计 2、微内核装载模块: insmod modprobewww.kernel.org用户空间访问,监控内核的方式:/proc/sys伪文件系统/ 查看详情

编写Linux内核模块是不是需要编译自己的内核?

】编写Linux内核模块是不是需要编译自己的内核?【英文标题】:DoesWritingLinuxKernelModuleRequireCompilingOwnKernel?编写Linux内核模块是否需要编译自己的内核?【发布时间】:2021-08-0309:23:45【问题描述】:我在Ubuntux86_64上有一个简单的he... 查看详情

linux内核编译linux内核⑦(安装内核模块|安装内核|重启系统|查看当前内核版本)(代码片段)

文章目录一、安装内核模块二、安装内核三、重启系统四、查看当前内核版本一、安装内核模块确保Linux内核编译完成,没有任何报错之后;参考【Linux内核】编译Linux内核⑥(安装OpenSSL|安装其它依赖库|内核编译完成)博客;进入Linux... 查看详情

redhat5.8编译内核驱动

...************************************************************RedHat5.8编译内核驱动*说明:*需要编译RedHat5.8的内核驱动,找了一下资料,并操作一下,并编译*一下IO驱动,能够正常运作。**2017-3-1深圳南山平山村曾剑锋************************************... 查看详情

linux为啥要编译内核

...下是几个问题。1:平时在linux下c编程,也没有用到编译内核什么的,经常看到“内核源码树”这个词汇,就不懂的。难道我正在使用的这个linux系统不是编译出来的一个系统吗?为什么还要再编译一次?2:下载源码后编译出来... 查看详情

centos7编译4.7.2内核

由于想要编译kvm-kmod,编译的时候提示内核版本太低,所以就不得不升级下linux内核,目前最新版内核是4.7.2,编译内核并不是一件很难的事,但是这么久没编译过,还是有必要记录下这一过程。首先下载linux内核最新版4.7.2 ht... 查看详情

如何为树莓派编译内核模块?

】如何为树莓派编译内核模块?【英文标题】:HowtocompileakernelmoduleforRaspberrypi?【发布时间】:2013-12-0815:56:44【问题描述】:我在为树莓派编译内核模块时遇到问题。我想用树莓派本身编译一个“helloworld”内核模块。我正在使用r... 查看详情