20221106-Linux内核升级
升级系统内核方式
方式一:kernel.org下载并编译安装升级
方式二:Linux发行版自行维护的内核升级(yum或rpm包管理升级)
方式三:使用内核热升级工具进行热升级
kernel.org下载并编译安装升级
2020年6月4日Linus Torvalds 宣布了 Linux Kernel 5.7 的发布。
Linux Kernel 首页:https://www.kernel.org/
Linux Kernel releases:https://www.kernel.org/category/releases.html
环境:
OS:CentOS Linux release 7.4.1708 (Core)
CPU:2核心(WorkStation虚拟机)
Memory:2G
Linux Kernel3.10.0---->>5.7.1
1).准备:
1.Linux Kernel确认
# uname -a
Linux chefserver 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Jan 4 01:06:37 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
2.快照
3.获取Linux Kernel最新5.7
# cd /usr/src/kernels/
# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.7.1.tar.xz
# ll linux-5.7.1.tar.xz
# tar -xJvf linux-5.7.1.tar.xz
4.相关必要安装包
# yum -y install gcc ncurses-devel
# yum install make openssl-devel libelf libelf-devel elfutils-libelf-devel elfutils-devel -y
2).安装
# make menuconfig
# make
↑时间真的有点长
# make modules_install
# make install
sh ./arch/x86/boot/install.sh 5.7.1 arch/x86/boot/bzImage \
System.map "/boot"
3).重启、确认版本
# uname -a
Linux chefserver 5.7.1 #2 SMP Mon Jun 8 05:40:46 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
Linux发行版自行维护的内核升级
OS:CentOS Linux release 7.4.1708 (Core)
CPU:2核心(WorkStation虚拟机)
Memory:4G
Linux Kernel3.10.0---->>6.0.7
1).准备:
1.Linux Kernel确认
# uname -a
Linux chefserver 3.10.0-1160.59.1.el7.x86_64 #1 SMP Wed Feb 23 16:47:03 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
2.快照
3.启用 ELRepo
# dnf -y install elrepo-release
ELRepo rpm包在线安装方法
# Import the public key:
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# To install ELRepo for RHEL-**8** or CentOS-**8**:
yum install https://www.elrepo.org/elrepo-release-8.el8.elrepo.noarch.rpm
# To install ELRepo for RHEL-**7**, SL-**7** or CentOS-**7**:
yum install https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
# To make use of our mirror system, **please also install yum-plugin-fastestmirror**.
2).升级内核
1.查询ELRepo中的kernel版本
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
Loaded plugins: changelog, fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrors.elrepo.org/mirrors-elrepo-kernel.el7 error was
14: curl#7 - "Failed connect to mirrors.elrepo.org:80; Connection refused"
* elrepo-kernel: elrepo.org
elrepo-kernel | 3.0 kB 00:00:00
elrepo-kernel/primary_db | 2.1 MB 00:00:06
Available Packages
elrepo-release.noarch 7.0-6.el7.elrepo elrepo-kernel
kernel-lt.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
perf.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
python-perf.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available --showduplicates
Loaded plugins: changelog, fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Could not retrieve mirrorlist http://mirrors.elrepo.org/mirrors-elrepo-kernel.el7 error was
14: curl#7 - "Failed connect to mirrors.elrepo.org:80; Connection refused"
* elrepo-kernel: linux-mirrors.fnal.gov
Available Packages
elrepo-release.noarch 7.0-5.el7.elrepo elrepo-kernel
elrepo-release.noarch 7.0-6.el7.elrepo elrepo-kernel
kernel-lt.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-devel.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-doc.noarch 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-headers.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-tools.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
kernel-lt-tools-libs-devel.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-devel.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-doc.noarch 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-headers.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 6.0.6-1.el7.elrepo elrepo-kernel
kernel-ml-tools-libs-devel.x86_64 6.0.7-1.el7.elrepo elrepo-kernel
perf.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
perf.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
python-perf.x86_64 5.4.222-1.el7.elrepo elrepo-kernel
python-perf.x86_64 5.4.223-1.el7.elrepo elrepo-kernel
术语解释
kernel-ml
kernel-ml中的ml是英文 “mainline stable” 的缩写,elrepo-kernel中列出来的是最新的稳定主线版本。
kernel-lt
kernel-lt中的lt是英文 “long term support” 的缩写,elrepo-kernel 中列出来的长期支持版本。
2.安装kernel
安装新内核(kernel-core、kernel-modules 与 kernel 依赖自动更新)
# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml.x86_64
安装新内核相关软件(--skip-broken必须)
# yum --disablerepo=\* --enablerepo=elrepo-kernel install -y kernel-ml-devel kernel-ml-tools kernel-ml-tools-libs kernel-ml-tools-libs-devel kernel-ml-headers --skip-broken
3.确认默认启动内核(般更新的内核为默认启动内核)
# grubby --default-kernel
/boot/vmlinuz-6.0.7-1.el7.elrepo.x86_64
如果不是的话,先看查看系统安装的全部内核
# grubby --default-kernel
/boot/vmlinuz-6.0.7-1.el7.elrepo.x86_64
You have mail in /var/spool/mail/root
[root@chefserver ~]# grubby --info=ALL
index=0
kernel=/boot/vmlinuz-6.0.7-1.el7.elrepo.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-6.0.7-1.el7.elrepo.x86_64.img
title=CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)
index=1
kernel=/boot/vmlinuz-3.10.0-1160.59.1.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-3.10.0-1160.59.1.el7.x86_64.img
title=CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)
index=2
kernel=/boot/vmlinuz-3.10.0-1160.45.1.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-3.10.0-1160.45.1.el7.x86_64.img
title=CentOS Linux (3.10.0-1160.45.1.el7.x86_64) 7 (Core)
index=3
kernel=/boot/vmlinuz-3.10.0-693.11.6.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-3.10.0-693.11.6.el7.x86_64.img
title=CentOS Linux (3.10.0-693.11.6.el7.x86_64) 7 (Core)
index=4
kernel=/boot/vmlinuz-3.10.0-693.el7.x86_64
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet LANG=en_US.UTF-8"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-3.10.0-693.el7.x86_64.img
title=CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
index=5
kernel=/boot/vmlinuz-0-rescue-31b07c65c1f94e3e83a0ec35a56922bb
args="ro crashkernel=auto rd.lvm.lv=centos_chefserver/root rd.lvm.lv=centos_chefserver/swap rhgb quiet"
root=/dev/mapper/centos_chefserver-root
initrd=/boot/initramfs-0-rescue-31b07c65c1f94e3e83a0ec35a56922bb.img
title=CentOS Linux (0-rescue-31b07c65c1f94e3e83a0ec35a56922bb) 7 (Core)
index=6
non linux entry
设置新的默认启动内核
# grubby --set-default=/boot/vmlinuz-6.0.7-1.el7.elrepo.x86_64
或者
# grubby --set-default-index=0
3).重启、确认版本
# uname -a
Linux chefserver 6.0.7-1.el7.elrepo.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Nov 2 19:17:10 EDT 2022 x86_64 x86_64 x86_64 GNU/Linux
验证透明大页功能
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
使用内核热升级工具进行热升级
kpatch:函数级的热替换技术
kpatch是RedHat主导开发的“内核在线升级”工具,可在不重启系统、不中断业务的情况下实现内核在线升级。实现函数级别的执行流程替换。
基本原理为:基于ftrace,类似于ftrace的动态探测点,利用mcount机制,在内核编译时,在每个函数入口保留数个字节,然后在打补丁时,将“被替换函数”入口保留的字节替换为跳转指令,跳转到kpatch的相关流程中,然后进入“新函数”的执行流程,实现函数级别的执行流程在线替换,最终实现“内核在线升级”的功能。
参考URL:
https://blog.csdn.net/u012343297/article/details/79286156
https://blog.csdn.net/u012343297/article/details/79147781
https://blog.csdn.net/hjkfcz/article/details/115705116
https://blog.csdn.net/DKH63671763/article/details/122410488?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-122410488-blog-79147781.pc_relevant_3mothn_strategy_recovery&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-122410488-blog-79147781.pc_relevant_3mothn_strategy_recovery&utm_relevant_index=10
https://blog.51cto.com/lilinji/964625#:~:text=%E4%BD%BF%E7%94%A8%20ftrace%20%E5%8F%AF%E4%BB%A5%E5%AF%B9%E5%86%85%E6%A0%B8%E4%B8%AD%E5%8F%91%E7%94%9F%E7%9A%84%E4%BA%8B%E6%83%85%E8%BF%9B%E8%A1%8C%E8%B7%9F%E8%B8%AA%EF%BC%8C%E5%8F%AF%E4%BB%A5%E8%B0%83%E8%AF%95%20bug%20%E6%88%96%E8%80%85%E5%88%86%E6%9E%90%E5%86%85%E6%A0%B8%EF%BC%8C%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%B8%AE%E5%8A%A9%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E4%BA%86%E8%A7%A3%20Linux,%E5%86%85%E6%A0%B8%E7%9A%84%E8%BF%90%E8%A1%8C%E6%97%B6%E8%A1%8C%E4%B8%BA%EF%BC%8C%E4%BB%A5%E4%BE%BF%E8%BF%9B%E8%A1%8C%E6%95%85%E9%9A%9C%E8%B0%83%E8%AF%95%E6%88%96%E6%80%A7%E8%83%BD%E5%88%86%E6%9E%90%E3%80%82%20%E6%9C%80%E6%97%A9%20ftrace%20%E6%98%AF%E4%B8%80%E4%B8%AA%20function%20tracer%EF%BC%8C%E4%BB%85%E8%83%BD%E5%A4%9F%E8%AE%B0%E5%BD%95%E5%86%85%E6%A0%B8%E7%9A%84%E5%87%BD%E6%95%B0%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B%E3%80%82
Ftrace Hook
参考URL:
https://blog.csdn.net/pwl999/article/details/107426138
Plugsched
参考URL:
https://ost.51cto.com/posts/12373
nvwa
参考URL:
https://docs.openeuler.org/zh/docs/22.03_LTS/docs/KernelLiveUpgrade/%E5%AE%89%E8%A3%85%E4%B8%8E%E9%83%A8%E7%BD%B2.html#%E4%BD%BF%E8%83%BD%E5%86%85%E6%A0%B8%E7%83%AD%E5%8D%87%E7%BA%A7%E5%B7%A5%E5%85%B7
其他
https://blog.csdn.net/MEIYOUDAO_JIUSHIDAO/article/details/126591597
https://blog.csdn.net/weixin_42245942/article/details/116619417
Linux内核升级相关
查看Linux内核版本命令
方法一:
# cat /proc/version
Linux version 3.10.0-957.21.3.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Tue Jun 18 16:35:19 UTC 2019
方法二:
# uname -a
Linux ebs-36006 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
# uname -r
3.10.0-957.21.3.el7.x86_64
第一个组数字:3, 主版本号
第二个组数字:10, 次版本号,当前为稳定版本,一般这个数字为偶数表示稳定,奇数表示在开发版本,通常这样的不做生产使用。
第三个组数字:0, 修订版本号
第四个组数字:957.21.3,表示发型版本的补丁版本
el7:表示正在使用的内核是RedHat/CentOS系列发行版专用内核,centos7
x86_64:表示采用的是适用64位的CPU的操作系统
查看Linux系统版本的命令
方法一:适用于所有的Linux发行版,包括Redhat、SuSE、Debian…等发行版。
# lsb_release -a
LSB Version: :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description: CentOS Linux release 7.6.1810 (Core)
Release: 7.6.1810
Codename: Core
方法二:仅适合包括Redhat系的Linux发行版
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
Linux 内核版本管理
Linux kernel官网:https://kernel.org/
Active kernel releases(查看EOL信息):https://kernel.org/category/releases.html
Linux kernel版本状态说明:
mainline
mainline指由Linus Torvalds亲自制作的内核发布版,是官方当前最新版本的kernel source。在Torvalds对所有其他程序员所做出的重大变化进行整合,并且对先前版本的bug进行几轮修复之后,大约每十周正式发布一个新版本。mainline事实上代表着一个linux kernel分支,这个分支有另一个名称,叫做vanilla。
longterm
longterm,是Long Term Support的缩写,长期维护的意思。
stable
stable顾名思义,稳定版。
说明:稳定版本不一定都提供长期支持,而提供长期支持的一定是稳定版本。
linux-next
linux-next,是代码提交周期结束之前生成的快照,用于给Linux代码贡献者们做测试。
Prepatch
Prepatch 或 “RC” 内核是主要的内核预发行版本,主要针对内核开发人员和 Linux 爱好者。必须从源代码进行编译,并且通常包含必须在可以放入稳定版本之前进行测试的新功能。Prepatch 内核由 Linus Torvalds 维护和发布。
ELRepo 简介
URL:http://elrepo.org
ELRepo 支持 Red Hat Enterprise Linux (RHEL) 及其衍生产品,如 Scientific Linux、CentOS Linux、Alma Linux 和 Rocky Linux。
ELRepo 项目专注于与硬件相关的软件包,以增强您对 Enterprise Linux 的体验。这包括文件系统驱动程序、图形驱动程序、网络驱动程序、声音驱动程序、网络摄像头和视频驱动程序。
ELRepo 存储库内容
ELRepo 包含四个频道。
elrepo
这是主通道,默认启用。 由于此频道不应包含发行版中也存在的软件包,因此在启用此存储库频道的情况下运行 “yum/dnf 更新” 是安全的。
elrepo-extras
elrepo-extras 频道提供了替换 / 更新 RHEL 分发包的包及其依赖项。 它可以在 /etc/yum.repos.d/elrepo.repo 文件中启用或与 “yum/dnf --enablerepo=elrepo-extras” 一起使用。
elrepo-testing
elrepo-testing 频道提供尚未发布到主频道的软件包,默认情况下处于禁用状态。 它可以在 /etc/yum.repos.d/elrepo.repo 文件中启用或与 “yum/dnf --enablerepo=elrepo-testing” 一起使用。
elrepo-kernel
elrepo-kernel 频道使用 Linux Kernel Archives 长期支持内核和最新的稳定主线内核。该频道可以在 /etc/yum.repos.d/elrepo.repo 文件中启用或与 “yum/dnf --enablerepo=elrepo-kernel” 一起使用。
grubby简介
grubby 是一个命令行工具,用于更新和显示有关 grub2 和 zipl 引导加载程序的配置文件的信息。它主要设计用于安装新内核并需要查找有关当前引导环境的信息的脚本。同时也可以对启动内核的各项信息参数进行修改。
1.安装
# yum install grubby
2.常用命令
查看默认启动内核
# grubby --default-kernel
查看系统安装的全部内核
# grubby --info=ALL
查看特定内核的具体信息
# grubby --info=/boot/vmlinuz-4.18.0-348.el8.x86_64
设置新的默认启动内核方法一:使用路径来指定内核,可以使用 --set-default=kernel-path
# grubby --set-default=/boot/vmlinuz-4.18.0-348.el8.x86_64
设置新的默认启动内核方法二:使用 index 来指定内核,则使用 --set-default-index=entry-index
# grubby --set-default-index=1
启动中删除旧内核
# grubby --remove-kernel=/boot/vmlinuz-4.18.0-348.el8.x86_64
grub2-tools简介
从CentOS7以后使用grub2作为引导程序
1.安装(more已安装)
# yum install grub2-tools
2.常用命令
查看系统内部有多少个内核
# cat /boot/grub2/grub.cfg | grep menuentry
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
menuentry_id_option=""
export menuentry_id_option
menuentry 'CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
menuentry 'CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
menuentry 'CentOS Linux (3.10.0-1160.45.1.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
menuentry 'CentOS Linux (3.10.0-693.11.6.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
menuentry 'CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-693.el7.x86_64-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
menuentry 'CentOS Linux (0-rescue-31b07c65c1f94e3e83a0ec35a56922bb) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-31b07c65c1f94e3e83a0ec35a56922bb-advanced-e8c1fa37-7a23-4025-8e66-e6c13a0d2bce' {
配置默认启动内核
# grub2-set-default 'CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)'
确认默认启动内核
# grub2-editenv list
saved_entry=CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)
查看系统可用内核,并设置启动项
# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (6.0.7-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.59.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.45.1.el7.x86_64) 7 (Core)
3 : CentOS Linux (3.10.0-693.11.6.el7.x86_64) 7 (Core)
4 : CentOS Linux (3.10.0-693.el7.x86_64) 7 (Core)
5 : CentOS Linux (0-rescue-31b07c65c1f94e3e83a0ec35a56922bb) 7 (Core)
# grub2-set-default 0
# grub2-set-default 1
...
# grub2-set-default 4
内核调试、跟踪工具
ftrace
Linux当前版本中,功能最强大的调试、跟踪手段。其最基本的功能是提供了动态和静态探测点,用于探测内核中指定位置上的相关信息。
静态探测点:是在内核代码中调用ftrace提供的相应接口实现,称之为静态是因为,是在内核代码中写死的,静态编译到内核代码中的,在内核编译后,就不能再动态修改。在开启ftrace相关的内核配置选项后,内核中已经在一些关键的地方设置了静态探测点,需要使用时,即可查看到相应的信息。
动态探测点:基本原理是利用mcount机制,在内核编译时,在每个函数入口保留数个字节,然后在使用ftrace时,将保留的字节替换为需要的指令,比如跳转到需要的执行探测操作的代码。
systemTap
在运行systemTap脚本时,动态解析内核,将指定探测点处的代码,替换为int 3指令,实现陷入,在陷入后实现相关信息的探测,探测完成后,int 3返回到原有的执行流程中执行。
ftrace和systemTap机制的主要区别
1.ftrace只能在函数入口/出口实现探测,而systemTap可以在函数中的任意位置实现探测。
2.ftrace实现函数替换后,原有函数的执行流程被替换成新函数,新函数执行完成后可以不再返回原函数流程中执行。而systemTap利用的是int 3陷入机制,在探测后会自动跳转会原有流程执行。