1、下载内核
Linux内核官网: http://www.kernel.org
这里我选择的内核版本为:5.10.x
内核下载地址:
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.248.tar.xz
2、升级前准备
(1)查看当前系统内核版本
使用uname -r 命令查看当前系统内核版本,当前内核版本:3.10.0
(2)安装必要的软件包
确认是否安装gcc,ncurses-devel, bc, openssl-devel, elfutils-libelf-devel, bison, flex, perl 这几个软件包,如未安装则需要提前安装一下。
服务器无法联网的情况下,需要挂载ISO镜像后,再使用YUM命令进行安装。
yum install gcc gcc-c++ ncurses-devel bc openssl-devel elfutils-libelf-devel bison flex perl wget -y
3、升级gcc
升级5.10.x及以上版本时,需要高版本的gcc。
# 1. 安装编译依赖
yum install gcc gcc-c++ ncurses-devel bc openssl-devel elfutils-libelf-devel bison flex perl wget lbzip2 -y
# 2. 下载 GCC 8.5.0
cd /usr/srcwget https://ftp.gnu.org/gnu/gcc/gcc-8.5.0/gcc-8.5.0.tar.gztar xf gcc-8.5.0.tar.gzcd gcc-8.5.0
# 3. 下载依赖
./contrib/download_prerequisites
# 4. 配置和编译
mkdir buildcd build../configure --prefix=/usr/local/gcc-8.5.0 --enable-languages=c,c++ --disable-multilib --disable-bootstrapmake -j$(nproc)
# 5. 安装
# 6. 设置环境变量
echo 'export PATH=/usr/local/gcc-8.5.0/bin:$PATH' >> /etc/profileecho 'export LD_LIBRARY_PATH=/usr/local/gcc-8.5.0/lib64:$LD_LIBRARY_PATH' >> /etc/profilesource /etc/profile
# 7. 创建符号链接
rm -rf /usr/bin/gcc-9rm -rf /usr/bin/g++-9ln -sf /usr/local/gcc-8.5.0/bin/gcc /usr/bin/gcc-8ln -sf /usr/local/gcc-8.5.0/bin/g++ /usr/bin/g++-8
# 8. 查看版本:
4、开始安装
4.1 解压内核
tar -xf linux-5.10.248.tar.xz -C /usr/src
4.2 进入解压后的内核目录
cd /usr/src/linux-5.10.248/
4.3 清除变量
make mrproper #执行该命令清除环境变量,即清除配置文件
4.4 选择需要编译的内核模块
make menuconfig #执行该命令在菜单模式下选择需要编译的内核模块,如果没有特殊要求,则不用进行配置,保持默认配置即可,这里直接Save了
更新配置:
4.5 编译安装内核
这里等待编译完成即可,需要时间比较长,主要看服务器配置,如果服务器配置太低,可能需要花费几个小时才完成,所以最好不要使用SSH远程执行该命令,远程终端可能不稳定导致中断。
使用make时添加-j参数,指定用来编译的CPU核数:
编译正常通过:
编译完成后,会自动在/boot目录下生成相应的文件:
如果没有自动生成,可以执行下面命令:
cp /usr/src/linux-5.10.248/arch/x86/boot/bzImage /boot/vmlinuz-5.10.248cp /usr/src/linux-5.10.248/System.map /boot/System.map-5.10.248mkinitrd /boot/initramfs-5.10.248.img 5.10.248 #根据内核版本和指定参数生成映像文件
5、修改启动文件
修改启动文件,将新内核加入启动列表。
查看/boot/grub2/grub.cfg文件会发现新内核已在其中,以下为部分截图:
menuentry 'CentOS Linux (5.10.248) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-833ce548-7b73-442f-8135-b88017fc4527' { 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-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 4ac17cac-fb1d-4441-9e9b-dbdab3d63a81 else search --no-floppy --fs-uuid --set=root 4ac17cac-fb1d-4441-9e9b-dbdab3d63a81 fi linux16 /vmlinuz-5.10.248 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8 initrd16 /initramfs-5.10.248.img}
修改默认启动文件
vi /etc/default/grub
将:GRUB_DEFAULT=saved改为:GRUB_DEFAULT=0
使其配置文件生效
grub2-mkconfig -o /boot/grub2/grub.cfg
配置文件生效后,grub文件会有所变化:
执行命令前:
执行命令后:
6、重启服务器验证
重启服务器以新内核启动并验证内核是否升级成功。
启动时,可以看到新版本内核了:
登录到系统验证:
7、问题
/lib/modules/5.10.248/kernel 目录占用空间特别大。
因为我们在编译内核的时候,使用的是默认编译,其中像gpu、media、bluetooth等驱动根本不需要安装。