Fedora系统编译Linux内核

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

非原创,勿转载

猜你喜欢

转载自blog.csdn.net/GaaraZ/article/details/127219550