linux深度講解及案例分析——linux系統內核

內核信息獲取命令

uname命令

uname - print system information
uname
[OPTION]
常用選項:
-n:顯示節點名稱
-r:顯示內核版本號,包括VERSION和release
-a:顯示所有信息

Ismod命令

lsmod - program to show the status of modules in the Linux Kernel
顯示有Linux內核核心已經裝載的內核模塊;
lsmod顯示的內容,分爲三個字段:
模塊名稱 模塊大小 被引用次數及被誰所引用

modinfo命令

modinfo - programto show information about a Linux Kernel module
modinfo [ -k kernel ] [ modulename|filename... ]
常用選項:
-F field: 僅顯示指定字段的信息;通常只能指定一個字段;
-n: 只顯示模塊文件的絕對路徑(最常用)
-a: 只顯示模塊的作者信息
-d: 只顯示模塊的描述
-l: 只顯示許可證信息
-p: 只顯示模塊參數信息

示例

[root@kernel ~]# modinfo dm_log
filename:       /lib/modules/3.10.0-1062.el7.x86_64/kernel/drivers/md/dm-log.ko.xz
license:        GPL
author:         Joe Thornber, Heinz Mauelshagen <[email protected]>
description:    device-mapper dirty region log
retpoline:      Y
rhelversion:    7.7
srcversion:     2520F689AFECC997AB36ADE
depends:        dm-mod
intree:         Y
vermagic:       3.10.0-1062.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        51:08:4E:41:88:03:02:BE:5C:B0:74:AC:0D:A3:FE:10:23:3B:7F:1C
sig_hashalgo:   sha256
[root@kernel ~]# modinfo -F vermagic dm_log
3.10.0-1062.el7.x86_64 SMP mod_unload modversions
[root@kernel ~]# modinfo -n dm_log
/lib/modules/3.10.0-1062.el7.x86_64/kernel/drivers/md/dm-log.ko.xz
[root@kernel ~]# modinfo -a dm_log
Joe Thornber, Heinz Mauelshagen <[email protected]>
[root@kernel ~]# modinfo -d dm_log
device-mapper dirty region log
[root@kernel ~]# modinfo -l dm_log
GPL
[root@kernel ~]# modinfo -p dm_log

insert命令

實現內核模塊的動態裝載和卸載的命令: 
insmod - simple program to insert a module into the Linux Kernel
insmod命令:裝載指定的內核模塊文件,但無法自動解決模塊間的依賴關係;
insmod [ filename ] [ module options... ]
注意: filename: 模塊文件的絕對路徑;

rmmod命令

rmmod - simple program to remove a module from the Linux Kernel
# rmmod module_name

實例

[root@kernel ~]# lsmod |grep -i ip_vs
[root@kernel ~]# rmmod ip_vs
[root@kernel ~]# lsmod |grep -i ip_vs

modprobe命令

modprobe - program to add and remove modulesfrom the Linux Kernel
從內核中移除模塊或者向內核中插入模塊;
modprobe [ -C config-file ] [ modulename ]
[ module parameters... ]
默認的配置文件: /etc/modprobe.conf, /etc/modprobe.d/*
modprobe module_name:裝載模塊,自動識別和解決依賴關係;
modprobe -r module_name: 卸載模塊

modprobe和i nsmod的區別是什麼呢?

  1. modprobe 可以解決1 oad modu1e時的依賴關係,比如1oad moudleA就必 須先1oad moudu1eB之類的,它是通過/1ib/modules//modules.dep文件來查找依賴關係的。而insmod不能解決依賴問題。
  2. modprobe默認 會去/1ib/modu1es/目錄下面查找modu1e,而nsmod只在給它的參數中去找module (默認在當前目錄找)。
    舉個例子:
    有/root/my-mod. ko這個module,cd /root/, 然後用insmod my-mod. ko(insmod/root/my-mod. ko)就可以insert這個module了,但是用modprobe my -mod. ko (modprobe’,/ root/ my-mod.ko)卻提示"FATAL: Module my-mod. ko not found", 這就是因爲modprobe是到/1jb/modules/、uname -ri /下去找modu1e的,如果沒找到就是這樣了。

實例6

[root@kernel ~]# lsmod |grep -i ip_vs
[root@kernel ~]# modprobe ip_vs
[root@kernel ~]# lsmod |grep -i ip_vs

內核升級

一般來說,只有從kernel.org下載並編譯安裝的內核纔是官方內核。
大多數Linux 發行版提供自行維護的內核,可以通過yum 或rpm 等包管理系統升級(yum update)。這些內核可能不再和Linux 內核官方開發維護人員有關係了。通過這個由各大Linux發行版支持的倉庫升級內核,通常來說更簡單可靠,但是可選擇的內核版本也更少。

查看內核版本

使用uname -r區分你用的是官方內核還是Linux發行版內核,橫線後面有任何東西都表示這不是官方內核:

[root@ansible ~]# uname -r
3.10.0-1062.el7.x86_64
主版本號: 3
次版本號: 10 [奇數爲開發版本,偶數爲穩定版本]
修訂版本號: 0 [修改的次數]
此次版本的第N次修改:1062
el7: redhat enterprise linux 7
x86_64: 編譯框架

內核空間和用戶空間通過/proc虛擬文件系統可以通信
/proc目錄中包含一些目錄和虛擬文件,這些虛擬文件可以向用戶呈現內核信息或者從用戶空間向內核發送信息

[root@ansible ~]# cat /proc/version
Linux version 3.10.0-1062.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Wed Aug 7 18:08:02 UTC 2019

升級內核

內核升級一共三種方法:

1.小版本升級
2.大版本升級
3.源代碼安裝(根據自己需要))

小版本升級

yum update
reboot	#重啓(選擇剛升級的內核的版本號)

大版本升級

(1)更新yum源 yum update -y
(2)啓用ELRepo倉庫 http://elrepo.org/tiki/tiki-index.php

ELRepo倉庫是基於社區的用於企業級Linux 倉庫,提供對RedHat Enterprise (RHEL) 和其他基於RHEL的Linux發行版Centos、scientific、Fedora等)的支持。
ELRepo聚焦於和硬件相關的軟件包,包括文件系統驅動、顯卡驅動、網絡驅動、聲卡驅動和攝像頭驅動等。

在這裏插入圖片描述
在這裏插入圖片描述

[root@1ocalhost ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo. org
[root@1ocalhost ~]# yum install https://www.elrepo.org/elrepo-release-7.0-4.e17.elrepo.noarch.rpm

(3)查看可用包

yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

(4)安裝最新內核

[root@localhost ~]# yum --enablerepo=elrepo-kernel install kernel-ml
#--enablerepo選項開啓Centos系統上的指定倉庫,默認開啓的是elrepo,這裏用elrepo-kernel

(5)設置grub2
查看系統上的所有內核

awk -F" " '$1=="menuentry" {print i++ " : " $2$3$4$5$6}' /etc/grub2.cfg

在這裏插入圖片描述

[root@1ocalhost ~]# grub2-set-default 0	#0表示上一步的5.0.17內核代號

編輯/etc/default/grub文件
設置GRUB_DEFAULTE=0,表示使用上一步的awk命令顯示的編號爲0的內核作爲默認內核:

GRUB TIMEOUT-5
GRUB DISTRIBUTOR="S(sed 's, release . $, ,g' /ctc/systemrelcase)"
#GRUB DEFAULT-saved
GRUB DISABLE SUBMENU=true
GRUB TERHIHAL OUTFUT= ' 'console”
GRUB CHDLINE LINUX-"crashkernel-auto rd.lum.lv-centos/root rd.lum.lvcentos/swap rhgb quict net.ifna
GRUB DISABLE RECOUERY="true"

(6)生成grub配置文件並重啓

grub2-mkconfig -o /boot/grub2/grub.cfg

(7)查看版本 uname -r
(8)卸載原內核(可選)rpm -qa|grep kernel yum remove

內核源代碼安裝

(1)下載文件
https://mirror.bjtu.edu.cn/kernel/linux/kernel/v5.x/
(2)解壓內核源碼包

[root@ansible ~]# tar xf linux-5.0.17.tar.gz -C /usr/local/src/
[root@ansible ~]# cd /usr/local/src/linux-5.0.17/

(3)從/boot目錄將現有版本的內核編譯config配置文件拷過來到放到新的內核源碼解壓目錄內並重命名爲.config的隱藏文件

[root@ansible linux-5.0.17]# cp /boot/config-3.10.0-1062.el7.x86_64 ./.config

(4)安裝依賴包
安裝開發工具包組

[root@ansible linux-5.0.17]# yum -y groupinstall "development tools"
[root@ansible linux-5.0.17]# yum install -y ncurses-devel	#make menuconfig 文本界面窗口依賴包

(5)運行make menuconfig,開啓文本界面的編譯選項菜單窗口,可以對內核加載的模塊編譯選項進行調整,如修改編譯後的內核名稱、新添加之前系統缺少的模塊等

修改內核名稱:
General setup---->(linux-5.0.17) local version - append to kernel release,鍵入linux-5.0.17
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述新添加NTFS文件系統支持模塊:
File systems---->DOS/FAT/NT Filesystems----><M>NTFS file system support

建議選擇以模塊方式(M選項)編譯。(* 號則是以靜態方式編譯打包進內核文件中,如果新添加的模塊較多,會導致內核文件體積增大)

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
(6)編譯內核
注意:編譯內核之前要先配置好yum源,並安裝好epel源。如果編譯開始提示錯誤,則可能需要裝對應的組件包。

[root@ansible ~]# yum install openssl-devel
[root@ansible ~]# yum install elfutils-liblf-devel
[root@ansible ~]# yum install bc
[root@ansible linux-5.0.17]# make -j 4	#以4核CPU調度

在這裏插入圖片描述在這裏插入圖片描述耗時26分鐘

(7)編譯安裝模塊
編譯完成後執行make modules_install 安裝內核模塊

[root@kernel linux-5.0.17]# make modules_install

(8)安裝內核核心文件

[root@kernel linux-5.0.17]# make install

(9)設置grub2
同上一小節大版本升級,修改grub2-set-default 0
(10)重啓系統
重啓進入系統後,查看一下內核版本,已經是最新的5.0.17版本

[root@kernel ~]# uname -r
5.0.17linux-5.0.17

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章