CentOS下编译Linux内核

2023-05-16

前言

编译内核是一项很简单的事情,但却是进入Linux内核世界的第一步,想要开发内核代码,想要了解内核的运行机制,第一步就是编译Linux内核,以下是在centos7.5环境下编译内核的具体流程。

1、下载内核

内核的源码的官方网站为The Linux Kernel Archives,在此网站下载最新内核源码。

2、解压内核源码

[root@rt7_node03 src]# tar xvf linux-5.16.14.tar.xz -C /usr/src/
[root@rt7_node03 src]# ln -sv linux-5.16.14 linux
'linux' -> 'linux-5.16.14'
[root@rt7_node03 tmp]# cd /usr/src/
[root@rt7_node03 src]# ls
debug  kernels  linux  linux-5.16.14

3、配置依赖的环境

  • 确保根分区可用空间在15G以上(扩容根分区可参考Linux “/“ 分区扩容_巭犇的博客-CSDN博客)
  • 确保gcc版本在5.0以上(升级gcc可参考CentOS下快速升级gcc版本_巭犇的博客-CSDN博客)
  • 安装依赖的软件包。
[root@rt7_node03 linux]# yum groupinstall Development Tools
[root@rt7_node03 linux]# yum install ncurses-devel
[root@rt7_node03 linux]# yum install elfutils-libelf-devel-0.176-5.el7.x86_64
[root@rt7_node03 linux]# yum install openssl-devel
[root@rt7_node03 linux]# yum install bc-1.06.95-13.el7.x86_64

 在进行编译的时候提供依赖的文件,我当前的环境是系统版本为CentOS7.5,为最小化安装,实际情况根据编译的时候提示缺少了哪些文件,安装相应的软件包即可。

4、进入源码目录,使用make menuconfig开启菜单选项,手动选择内核功能

[root@rt7_node03 linux]# make menuconfig
  UPD     scripts/kconfig/mconf-cfg
  HOSTCC  scripts/kconfig/mconf.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/mconf

配置完成后会生成.config的隐藏文件,如果不知道该开启哪些功能也可以直接选用当前系统的配置文件,这里直接使用当前系统的配置文件。

[root@rt7_node03 linux]# cp /boot/config-3.10.0-514.el7.x86_64 ./.config

5、编译内核

[root@rt7_node03 linux]# make -j 8   # "-j 8" 代表使用8颗cpu同事编译,这里可根据实际情况而定
/usr/src/linux-5.16.14/Makefile:661: include/config/auto.conf: No such file or directory
/usr/src/linux-5.16.14/Makefile:709: include/config/auto.conf.cmd: No such file or directory
  SYNC    include/config/auto.conf.cmd
  HOSTCC  scripts/kconfig/conf.o
  HOSTLD  scripts/kconfig/conf
...

 此步骤会对.config文件中的每一个选项再次确认,全部确认即可(我这里是8颗cpu同时在编译大概需要二十多分钟,如果cpu少的话,时间会更久一些)

6、安装模块

[root@rt7_node03 linux]# make modules_install
...
  SIGN    /lib/modules/5.16.14/kernel/sound/usb/misc/snd-ua101.ko
  INSTALL /lib/modules/5.16.14/kernel/sound/usb/snd-usb-audio.ko
  SIGN    /lib/modules/5.16.14/kernel/sound/usb/snd-usb-audio.ko
  INSTALL /lib/modules/5.16.14/kernel/sound/usb/snd-usbmidi-lib.ko
  SIGN    /lib/modules/5.16.14/kernel/sound/usb/snd-usbmidi-lib.ko
  INSTALL /lib/modules/5.16.14/kernel/sound/usb/usx2y/snd-usb-us122l.ko
  SIGN    /lib/modules/5.16.14/kernel/sound/usb/usx2y/snd-usb-us122l.ko
  INSTALL /lib/modules/5.16.14/kernel/sound/usb/usx2y/snd-usb-usx2y.ko
  SIGN    /lib/modules/5.16.14/kernel/sound/usb/usx2y/snd-usb-usx2y.ko
  INSTALL /lib/modules/5.16.14/kernel/virt/lib/irqbypass.ko
  SIGN    /lib/modules/5.16.14/kernel/virt/lib/irqbypass.ko
  DEPMOD  /lib/modules/5.16.14

 安装完成后在/lib/modules/目录下会生成一个同内核版本号的目录,目录下便是新内核的模块。

7、安装内核

[root@rt7_node03 linux]# make install
sh ./arch/x86/boot/install.sh 5.16.14 \
	arch/x86/boot/bzImage System.map "/boot"
[root@rt7_node03 linux]# 

安装完后会在/boot目录下生成新的内核文件。

[root@rt7_node03 linux]# ll /boot/
total 187028
lrwxrwxrwx  1 root root       24 Mar 23 16:32 System.map -> /boot/System.map-5.16.14
-rw-------. 1 root root  3113253 Nov 23  2016 System.map-3.10.0-514.el7.x86_64
-rw-r--r--  1 root root  4659281 Mar 23 16:32 System.map-5.16.14
-rw-r--r--  1 root root  4659281 Mar 23 16:25 System.map-5.16.14.old
-rw-r--r--. 1 root root   137696 Nov 23  2016 config-3.10.0-514.el7.x86_64
drwxr-xr-x. 2 root root       27 Nov  7  2018 grub
drwx------. 6 root root      111 Mar 23 16:34 grub2
-rw-------. 1 root root 48321021 Nov  7  2018 initramfs-0-rescue-33c42a62363749ea9b8fa6116acbeb3e.img
-rw-------. 1 root root 20732112 Nov  7  2018 initramfs-3.10.0-514.el7.x86_64.img
-rw-------. 1 root root 18546695 Nov  7  2018 initramfs-3.10.0-514.el7.x86_64kdump.img
-rw-------  1 root root 62203659 Mar 23 16:34 initramfs-5.16.14.img
-rw-r--r--. 1 root root   613751 Nov  7  2018 initrd-plymouth.img
-rw-r--r--. 1 root root   277953 Nov 23  2016 symvers-3.10.0-514.el7.x86_64.gz
lrwxrwxrwx  1 root root       21 Mar 23 16:32 vmlinuz -> /boot/vmlinuz-5.16.14
-rwxr-xr-x. 1 root root  5392080 Nov  7  2018 vmlinuz-0-rescue-33c42a62363749ea9b8fa6116acbeb3e
-rwxr-xr-x. 1 root root  5392080 Nov 23  2016 vmlinuz-3.10.0-514.el7.x86_64
-rw-r--r--  1 root root  8720224 Mar 23 16:32 vmlinuz-5.16.14
-rw-r--r--  1 root root  8720224 Mar 23 16:25 vmlinuz-5.16.14.old

新内核会自动写入到引导文件中,直接重启系统,在选择内核的界面选中新的内核即可。

[root@rt7_node03 linux]# cat /boot/grub2/grub.cfg 
...
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (5.16.14) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.el7.x86_64-advanced-bc95c848-a340-412c-92f1-09f6a8ed94ec' {
	load_video
	set gfxpayload=keep
	insmod gzio
	insmod part_msdos
	insmod xfs
	set root='hd0,msdos1'
	if [ x$feature_platform_search_hint = xy ]; then
	  search --no-floppy --fs-uuid --set=root --hint='hd0,msdos1'  f0b3417a-c9b1-4d04-9c2a-77ea4a0abb96
	else
	  search --no-floppy --fs-uuid --set=root f0b3417a-c9b1-4d04-9c2a-77ea4a0abb96
	fi
	linux16 /vmlinuz-5.16.14 root=/dev/mapper/cl-root ro biosdevname=0 net.ifnames=0 console=ttyS0,115200n8 LANG=en_US.UTF-8
	initrd16 /initramfs-5.16.14.img
}

...

 

 7、验证新内核版本。

[root@rt7_node03 linux]# uname -a
Linux rt7_node03 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@rt7_node03 linux]# uname -a
Linux rt7_node03 5.16.14 #1 SMP PREEMPT Wed Mar 23 15:56:47 CST 2022 x86_64 x86_64 x86_64 GNU/Linux

内核已升到5.16.14

总结

这个实验只是体验了内核编译的过程,并未修改内核的源码,后续将对内核源码进行解读,并插入自己的内核代码,将自己的内核代码运行在操作系统中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CentOS下编译Linux内核 的相关文章

  • 无法在 Linux 的 NetBeans 中编译 C++ 和 OpenGL (GLFW) 的简单源代码

    我开始学习 OpenGL glfw 我从教程中复制源代码并尝试编译它 但出现了错误 我想我已经正确安装了所有头文件 glm glfw 等 这是我的来源 我没有在头文件中使用这些字符 include iostream include stdi
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • 如何从脚本编辑 /etc/sudoers?

    我需要编辑 etc sudoers从脚本中添加 删除白名单中的内容 假设我有一个可以处理普通文件的命令 我如何将其应用到 etc sudoers 我可以复制并修改它 然后有visudo用修改后的副本替换原始版本 通过提供我自己的脚本 EDI
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 我们如何在使用循环时调用 ansible playbook 中的变量

    我有两个文件 其中这些文件包含server names and server IP s 我想更改 替换一些特定的server names and IP addressees根据要求在两个文件中 这与这篇文章 因为它被要求开设一个新职位 ht
  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • Pthreads - 高内存使用率

    我正在用 C 编写一些东西 在 256Mb 系统上的 Linux 中创建大量 Pthread 我通常有 200Mb 的免费空间 当我使用少量线程运行该程序时 它可以工作 但是一旦我让它创建大约 100 个线程 它就会出现错误 因为系统内存不
  • 如何在 Vim 中突出显示 Bash 脚本?

    我的 Vim 编辑器自动突出显示 PHP 文件 vim file php HTML 文件 vim file html 等等 但是当我输入 vim file在里面写一个Bash脚本 它不会突出显示它 我如何告诉 Vim 将其突出显示为 Bas
  • PIL 的 Image.show() 带来*两个*不同的查看器

    在 python shell 中处理图像时 我使用 image show 其中 image 是 Image 的实例 很久以前什么也没发生 但在定义了一个名为 xv 的 Mirage 符号链接后 我很高兴 最近几天 show 将显示 Imag
  • 选择fasta文件中氨基酸超过300个且“C”出现至少4次的序列

    我有一个包含蛋白质序列的 fasta 文件 我想选择超过 300 个氨基酸且半胱氨酸 C 氨基酸出现超过 4 次的序列 我使用此命令来选择具有超过 300 个 aa 的序列 cat 72hDOWN fasta fasta bioawk c
  • Linux 内核使用的设备树文件 (dtb) 可视化工具? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以图形化表示Linux内核中使用的硬件设备树的工具 我正在尝试了解特定 Arm 芯片组
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • Python 3.4.3 subprocess.Popen 在没有管道的情况下获取命令的输出?

    我试图将命令的输出分配给变量 而不让命令认为它正在通过管道传输 原因是 如果正在通过管道传输 则相关命令会给出未格式化的文本作为输出 但如果从终端运行 则会给出颜色格式化的文本 我需要获取这种颜色格式的文本 到目前为止我已经尝试了一些事情
  • 如何在不使用 IDE 的情况下在 Linux 上运行 Java 项目

    我是 Java 新手 基本上 我开发了一个java项目 其中包含Eclipse中的多个Java包 该项目在我安装了 redhat Linux 的桌面上运行正常 然而 我需要在一个更强大的没有安装X11的Linux服务器 redhat ent
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 为什么 Linux 原始套接字的 RX 环大小限制为 4GB?

    背景 我试图mmap 我的原始套接字的 RX 环形缓冲区64 bitLinux 应用程序 我的环由 4096 个块组成 每个块大小为 1MB 总共 4GB 请注意 每个 1MB 块中可以有许多帧 如果您好奇 请参阅此文档了解背景信息 htt
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记

随机推荐

  • MySQL 判断某个值是纯数字(正则判断)

    判断某个值是纯数字 这个sql 判断在字符串只有1个非数字的情况 判断不出来 span class token keyword select span span class token operator span span class to
  • mysql 取反操作

    span class token keyword update span span class token keyword table span span class token keyword set span filed span cl
  • error RC1015: cannot open include file ‘afxres.h‘. 的解决办法

    转载 参考 引用请注明出处 文章地址 xff1a https blog csdn net duiwangxiaomi article details 88822702 spm 61 1001 2014 3001 5501 编译工程时出现如下
  • 程序包com.sun.xml.internal.bind.v2不存在解决

    程序包com sun xml internal bind v2不存在 导入com sun xml internal 下的包并且没使用时打包也会报这个错误 全局搜索 com sun xml internal bind v2 删除掉import
  • fastjson byte[]转json字符串

    直接JSON toJSONString 会转为 base64字符串 可以使用JSON toJSON param toString 进行转换
  • SVN文件夹红色感叹号

    SVN文件夹红色感叹号 文件夹更新无最新文件 也没提交 解决方案 1右键 svn清理 2 提交 原因 有可能是svn上面有你之前提交的文件 而在你的本地目录里面删除了
  • jetson nano ubuntu 备份系统至u盘/移动硬盘

    jetson nano ubuntu备份系统至u盘 移动硬盘 1 df h 查看 信息2 挂载u盘2 1 fat322 2 ntfs2 3 挂载被占用 3 刷系统4 解除挂载 1 df h 查看 信息 一般都是 dev sda dev sd
  • 安装 cuda 从装系统开始

    勾选这个选项后就可以跳过安装驱动的环节了 设置root密码 sudo passwd root 安装openssh server 开xshell sudo apt get update sudo apt get install openssh
  • mac用完移动硬盘后 windows识别不出 解决方案

    cmd 运行 chkdsk F f
  • Cannot find reference ‘imread‘ in ‘__init__.py‘

    Cannot find reference imread in init py 前言 本人java开发 只是用python解决部分问题 可能解决方案不专业或者有问题 请自己判断 毕竟我只是简单处理下图片 解决方案 方案一 pip insta
  • RobotMaster资料汇总

    1 软件 xff1a 软件可以去网上下载 xff0c 或者去淘宝购买 xff0c 还包安装 不过基本上都是在虚拟机上操作 xff0c 只有在XP系统下可以直接安装 若是正版软件 xff0c 则会包含正确的安装教程 其中包括 xff1a MA
  • 代码改变生活-使用You-Get下载bilibili的视频【三】

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 112167893 我自己都想不到 xff0c 这个分享做到了第三篇 xff0c
  • Python脚本之ZIP文件压缩、解压

    本文为博主原创 xff0c 未经许可严禁转载 本文链接 xff1a https blog csdn net zyooooxie article details 114632112 最近在翻看Python的官方文档 xff0c https d
  • 对文本和数据进行处理之awk编程

    转载地址 xff1a 点击打开链接 awk 是一种编程语言 xff0c 用于在Linux unix下对文本和数据进行处理 数据可以来自标准输入 stdin 一个或多个文件 xff0c 或其它命令的输出 它支持用户自定义函数和动态正则表达式等
  • Ubuntu20.04在vsCode配置opencv

    一 下载opencv xff1a https opencv org releases 我下载的为opencv4 5 4版本 xff0c 可以直接下载 zip文件 xff0c 可以选择其他版本 Sources版本即为 zip版本 xff1a
  • UISearchController使用中的几个坑和一个知识点

    坑1 点击搜索框后 xff0c 搜索框上移到屏幕之外了 不多说了 xff0c 都是坑 因为我之前设置了 UINavigationBar appearance 61 false 把这个去掉好了 坑2 搜索时搜索框和UITableview中间有
  • 深度学习环境搭建(四)之 CUDNN安装

    安装完CUDA Driver和CUDA后 xff0c 还需要安装CUDNN xff0c NVIDIA用于深度学习GPU加速的库 1 下载CUDNN 访问官网链接 xff0c 根据CUDA版本和Ubuntu版本选择CUDNN的版本 前面使用的
  • NMAP 六种端口状态解读

    NMAP 简介 nmap 是一款功能非常强大的扫描工具 xff0c 不仅能对端口扫描 xff0c 还可以在扫描中指定自定义的标志位 xff0c 对自己的 IP 地址进行隐藏伪装为别的 IP 地址 xff0c 还可以根据 nmap 数据库 x
  • IP ID idle 扫描

    IP ID idle 扫描简单介绍 在1998年的时候 xff0c 一个名叫 Antirez 的工程师 xff0c 发现了这种扫描技术 xff0c 攻击者可以通过不直接向目标主机发送报文的形式 xff0c 进行端口扫描 xff0c 而是通过
  • CentOS下编译Linux内核

    前言 编译内核是一项很简单的事情 xff0c 但却是进入Linux内核世界的第一步 xff0c 想要开发内核代码 xff0c 想要了解内核的运行机制 xff0c 第一步就是编译Linux内核 xff0c 以下是在centos7 5环境下编译