Fedora系统编译Linux内核

简介: 编译内核时,内存至少需要,或者内存 交换内存(/)。本文以为例说明,操作如下:① (此步骤亦可省略)进入某一特定目录,以目录为例,创建交换文件()文件夹,操作如下:② 使用命令创建交换文件()。表示输出到某个文件; 表示是1兆,即块大小为1兆; 表示写入个;③ 初始化交换空间给予相应权限,操作如下:把文件转换为文件,在相应目录执行,操作如下:若在本目录下执行,亦可直接输入文件名,操作如下:启用交换空间,操作如下:若需要开机启动后自动挂载,可将其添加到文件中。开机自动挂载分区,编辑 ,末

Fedora系统编译Linux内核

前情提要

检查内存

编译内核时,内存至少需要4G,或者2G内存 +2G交换内存(Swap/Swapfile)。

增加交换内存(Swap)

本文以Swapfile为例说明,操作如下:

  • ① (此步骤亦可省略)进入某一特定目录,以var目录为例,创建交换文件(Swapfile)文件夹,操作如下:
cd /var
sudo mkdir swap
  • ② 使用dd命令创建交换文件(Swapfile)。
sudo dd if=/dev/zero of=/mountpoint/path/to/swapfile bs=1M count=2000

说明:

使用dd命令创建一个空文件;

if代表从某个文件读;

/dev/zerolinux下特有的一个0生成器;

of表示输出到某个文件;

/mountpoint 表示某个分区的挂载点;

/path/to/ 表示某个目录;

swapfile 表示要创建的文件的名称,可以随意;

of后亦可直接填写swapfile,即输出到当前文件夹的swapfile文件;

若根据本步骤,即表示在/var/swap目录下创建了一个可表示交换内存的swapfile文件;

bs=1M 表示block size是1兆,即块大小为1兆;

单位亦可以是BBytes)、KKB)、MMB);

若忽略,即默认512字节,若忽略单位,即默认单位为字节;

count=2000 表示写入8000block

即约为2GB的文件大小。

  • ③ 初始化swap交换空间
    给予Swapfile相应权限,操作如下:
sudo chmod 600 /mountpoint/path/to/swapfile
  • 把文件转换为swap文件,在相应目录执行,操作如下:
sudo mkswap /mountpoint/path/to/swapfile
  • 若在本目录下执行,亦可直接输入文件名,操作如下:
sudo mkswap swapfile
  • 启用交换空间,操作如下:
sudo swapon /mountpoint/path/to/swapfile
  • 若需要开机启动后自动挂载,可将其添加到/etc/fstab文件中。
    开机自动挂载SWAP分区,编辑 /etc/fstab,末行添加如下内容:
/path/to/swapfile    swap    swap    defaults    0    0
  • 添加如下内容亦可:
/path/to/swapfile    none    swap    sw      0    0

说明:

第一项:/path/to/swapfile,指定swap文件路径;

第二项:none,表示swap空间没有挂载点;

第三项:swap,表示一个交换空间类型;

第四项:sw,表示交换空间启用,还有一个不常用的选项noauto

第五、六项:00,表示不需要开机检查。

删除交换内存(Swap)

若删除swapfile,则必须先执行以下命令:

sudo swapoff swapfile

再执行删除文件的操作,命令如下:

sudo rm swapfile

注意

若未执行swapoff操作,而去执行执行删除文件的操作,系统则会报错,无法执行删除指令。

swapoff命令相当于是卸载了swap分区。

安装必要依赖

使用yumdnf安装编译内核所需软件,操作如下:

sudo yum install git fakeroot ncurses-devel xz zstd dracut openssl-devel bc flex bison elfutils-devel audit-libs-devel slang-devel binutils-devel zlib-static libbabeltrace-devel java-1.8.0-openjdk-devel dwarves
sudo yum groupinstall "Development Tools"

或者

sudo dnf install git fakeroot ncurses-devel xz zstd dracut openssl-devel bc flex bison elfutils-devel audit-libs-devel slang-devel binutils-devel zlib-static libbabeltrace-devel java-1.8.0-openjdk-devel dwarves## 添加用户组
sudo dnf groupinstall "Development Tools"

添加用户组并添加一个编译内核的用户,操作如下:

groupadd mockbuild
useradd -g mockbuild mockbuild

获取内核源码

  • ① 官网下载:

官网直接下载所需编译的指定版本linux内核源码压缩包,官网网址如下所示:

官网:The Linux Kernel Archives

解压缩刚刚下载好的内核压缩包,操作如下:

tar -zxf linux-<version>.tar.xz
  • git命令获取:

通过使用git命令获取linux内核源码,操作如下:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

配置内核

进入到linux内核源码文件夹,操作如下:

cd linux-<version>

正式编译内核之前,首先必须配置需要包含的模块,若对内核配置不了解,亦可复制当前内核的配置文件,操作如下:

sudo cp -v /boot/config-$(uname -r) /path/to/.config

若当前内核配置文件没有在/boot文件夹内或者/boot文件夹内未找到内核配置文件,可使用如下命令:

sudo zcat /proc/config.gz > /path/to/.config

说明:

其中的/path/to/为下载的内核源码所在的文件夹;

若已进入下载的内核源码所在的文件夹仅输入.config即可,即:

sudo cp /boot/config-$(uname -r) .config
sudo zcat /proc/config.gz > .config

使用makeconfig配置内核参数,操作如下:

sudo make menuconfig

说明:

上述命令是基于文本的菜单配置,适用性强,也可用于远程编译内核;

当然如果系统带有桌面,可以选择如下的图形界面菜单配置内核;

①如果系统是基于KDE桌面或者最新的QT,可以使用如下命令:

sudo make xconfig

②如果系统基于gtk的库,如Gnome或者xfce桌面,可以使用如下命令:

sudo make gconfig

亦可执行make allyesconfig或者make allnoconfig简单的将内核所有可配置的配置都启用或者禁用。

注意

  • 虚拟机下可能提示会因为屏幕太小而无法显示menuconfig而执行失败。
    因此,要确保虚拟机下显示面积足够。
  • 配置内核参数时可以选择启用或者禁用一些模块。
    若不了解如何选择,则默认退出即可。

若编译内核源码时由于出错或者其它原因需重新编译,则需清理之前编译结果,操作如下:

sudo make mrproper

注意

  • 如果使用LLVM/clang工具构建内核的话,可能会有如下报错:
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available
   Failed to generate BTF for vmlinux
   Try to disable CONFIG_DEBUG_INFO_BTF
   make: *** [Makefile:1170: vmlinux] Error 1
  • 解决方案如下:
  • ① 安装包含pahole的软件包
  • ② 禁用掉CONFIG_DEBUG_INFO_BTF功能,可以在make menuconfig菜单中找到,按空格键取消:
Main menu
        -> Kernel hacking
                ->Compile-time checks and compiler options
                        -> Compile the kernel with debug info(DEBUG_INFO [=y])

退出menuconfig后,命令行中输入如下命令,即可开始编译:

sudo make -jX

若使用LLVM工具链编译,则需输入如下命令:

sudo make LLVM=1 -jX

若使用clang工具链编译,则需输入如下命令:

sudo make CC=clang LD=ld.bfd -jX

注:此时可以干的别的,这个过程比较慢,普通机器一般会在小时级别。

-jX即并发执行;

X即设置的CPU核数,根据CPU核数适量而定,切记不要大于CPU核数;

该命令可提高速度,且执行会耗费很长时间。

通常情况下,编译没报错,即可安装新内核。

但还需检查arch/x86/boot/bzImage文件是否已经生成,操作如下:

ls arch/x86/boot/bzImage -lh

若未生成,还需执行如下命令,以生成内核压缩镜像文件:

sudo make bzImage

注意

若此文件未生成,则make install会报错。

安装内核模块,操作如下:

sudo make modules_install

安装内核,操作如下:

sudo make install

生成initramfs文件系统

使用dracut生成initramfs文件系统,操作如下:

sudo dracut --force

更新grub配置

使用grub2命令更新grub配置,操作如下:

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo grubby --set-default /boot/vmlinuz-5.6.9

查看是否修改成功:

sudo grubby --default-kernel
sudo grubby --default-index
sudo grubby --info=ALL

重启系统生效

执行如下命令,重启系统,以生效所编译的内核:

sudo reboot

或者使用如下命令重启系统:

sudo init 6

重启系统时,若看到开机界面,则内核启动项里已可看到新编译的内核。

启动后,使用如下命令查看当前内核版本:

uname -a
相关文章
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
19 5
linux系统服务二!
|
4天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
21 3
linux系统服务!!!
|
1天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
1天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
3天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
24 4
|
4天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
16 2
|
4天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
5天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
7天前
|
缓存 运维 Linux
深入探索Linux内核:CPU拓扑结构探测
【10月更文挑战第18天】在现代计算机系统中,CPU的拓扑结构对性能优化和资源管理至关重要。了解CPU的核心、线程、NUMA节点等信息,可以帮助开发者和系统管理员更好地调优应用程序和系统配置。本文将深入探讨如何在Linux内核中探测CPU拓扑结构,介绍相关工具和方法。
9 0
|
4天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
11 0