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/zero
是linux
下特有的一个0
生成器;
of
表示输出到某个文件;
/mountpoint
表示某个分区的挂载点;
/path/to/
表示某个目录;
swapfile
表示要创建的文件的名称,可以随意;
of
后亦可直接填写swapfile
,即输出到当前文件夹的swapfile
文件;若根据本步骤,即表示在
/var/swap
目录下创建了一个可表示交换内存的swapfile
文件;
bs=1M
表示block size
是1兆,即块大小为1兆;单位亦可以是
B
(Bytes
)、K
(KB
)、M
(MB
);若忽略,即默认
512
字节,若忽略单位,即默认单位为字节;
count=2000
表示写入8000
个block
;即约为
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
;第五、六项:
0
和0
,表示不需要开机检查。
删除交换内存(Swap)
若删除swapfile
,则必须先执行以下命令:
sudo swapoff swapfile
再执行删除文件的操作,命令如下:
sudo rm swapfile
注意:
若未执行
swapoff
操作,而去执行执行删除文件的操作,系统则会报错,无法执行删除指令。
swapoff
命令相当于是卸载了swap
分区。
安装必要依赖
使用yum
或dnf
安装编译内核所需软件,操作如下:
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
内核源码压缩包,官网网址如下所示:
解压缩刚刚下载好的内核压缩包,操作如下:
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