前言
Linux 内核是一种开源的类 Unix 操作系统宏内核。
Linux 内核是 Linux 操作系统的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件的所有主要功能。内核的用途主要有以下 4 项工作:
- 内存管理:追踪记录有多少内存存储了什么以及存储在哪里
- 进程管理:确定哪些进程可以使用中央处理器、何时使用以及持续多长时间
- 设备驱动程序:充当硬件与进程之间的调解程序/解释程序
- 系统调用和安全防护:从流程接受服务请求
在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。
Linux系统内核概述
1、内核简介
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
Linux 内核的重要组成部分,主要有以下几部分:
- kernel内核核心,一般为 bzImage通常在 /boot 目录下,名称为 vmlinuz-VERSION-RELEASE
- kernel object内核对象,一般放置于 /lib/modules/VERSION-RELEASE/[ ] ==> N ==>
不编译进内核[M] ==> M ==> 编译为模块文件[*] ==> Y ==> 编译进内核 - 辅助文件(ramdisk)initrdinitramfs
2、内核模块
2.1 uname 命令
使用格式
uname [OPTION]…
参数解释
-n 显示节点名称
-r 显示VERSION-RELEASE
-s 内核名称
-v 内核版本
-n 节点名
-m 硬件名称
-i 硬件平台
-p 处理器类型
-o 操作系统
# uname -m
x86_64
# uname -r
6.2.0-36-generic
# uname -a
Linux baicells-virtual-machine 6.2.0-36-generic #37~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Mon Oct 9 15:34:04 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
2.2 lsmod 命令
显示由核心已经装载的内核模块
命令定义
- 显示的内容来自于: /proc/modules 文件。
- 使用 lsmod 命令时,常会采用类似 lsmod | grep -i ext4 这样的命令来查询系统是否加载了某些模块。
# cat /proc/modules
tls 147456 0 - Live 0xffffffffc0add000
isofs 57344 1 - Live 0xffffffffc0ace000
sctp 491520 18 - Live 0xffffffffc0a55000
ip6_udp_tunnel 16384 1 sctp, Live 0xffffffffc0a2c000
udp_tunnel 28672 1 sctp, Live 0xffffffffc0a48000
xt_MASQUERADE 20480 1 - Live 0xffffffffc0a31000
nft_compat 20480 1 - Live 0xffffffffc0a26000
nft_chain_nat 16384 1 - Live 0xffffffffc0a50000
nf_nat 61440 2 xt_MASQUERADE,nft_chain_nat, Live 0xffffffffc0a38000
nf_conntrack 204800 2 xt_MASQUERADE,nf_nat, Live 0xffffffffc09f3000
nf_defrag_ipv6 24576 1 nf_conntrack, Live 0xffffffffc09ec000
nf_defrag_ipv4 16384 1 nf_conntrack, Live 0xffffffffc09e7000
nf_tables 352256 5 nft_compat,nft_chain_nat, Live 0xffffffffc0990000
libcrc32c 16384 4 sctp,nf_nat,nf_conntrack,nf_tables, Live 0xffffffffc098b000
nfnetlink 24576 2 nft_compat,nf_tables, Live 0xffffffffc0848000
vsock_loopback 16384 0 - Live 0xffffffffc086b000
vmw_vsock_virtio_transport_common 57344 1 vsock_loopback, Live 0xffffffffc085c000
vmw_vsock_vmci_transport 45056 2 - Live 0xffffffffc0850000
# lsmod | grep sctp
sctp 491520 18
ip6_udp_tunnel 16384 1 sctp
udp_tunnel 28672 1 sctp
libcrc32c 16384 4 nf_conntrack,nf_nat,nf_tables,sctp
字段含义
- 第 1 列:表示模块的名称
- 第 2 列:表示模块的大小
- 第 3 列:表示依赖模块的个数
- 第 4 列:表示依赖模块的内容
# lsmod
Module Size Used by
iptable_filter 2173 0
ip_tables 9567 1 iptable_filter
ext3 203718 1
jbd 65315 1 ext3
xenfs 4360 1
ipv6 271097 14
xen_netfront 15871 0
ext4 339812 2
jbd2 75927 1 ext4
mbcache 6017 2 ext3,ext4
xen_blkfront 19209 5
dm_mirror 11969 0
dm_region_hash 9644 1 dm_mirror
dm_log 8322 2 dm_mirror,dm_region_hash
dm_mod 84711 11 dm_mirror,dm_log
2.3 modinfo 命令
显示模块的详细描述信息
命令定义
- modinfo 列出 Linux 内核中命令行指定的模块的信息。
- modinfo 能够查询系统中未安装的模块信息。
- 若模块名不是一个文件名,则会在 /lib/modules/version 目录中搜索,就像 modprobe 一样。
- modinfo 默认情况下,为了便于阅读,以下面的格式列出模块的每个属性:fieldname : value。 语法
modinfo [选项] [ modulename|filename… ]
选项
- -n 只显示模块文件路径
- -p 显示模块参数
- -a author
- -d description
- -l license
- -0 使用’\0’字符分隔 field 值,而不是一个新行,对脚本比较有用
实战演示
#modinfo sctp.ko
filename: /lib/modules/6.2.0-36-generic/kernel/net/sctp/sctp.ko
license: GPL
description: Support for the SCTP protocol (RFC2960)
author: Linux Kernel SCTP developers <linux-sctp@vger.kernel.org>
alias: net-pf-10-proto-132
alias: net-pf-2-proto-132
srcversion: 572D947D76002729787C9AE
depends: udp_tunnel,ip6_udp_tunnel,libcrc32c
retpoline: Y
intree: Y
name: sctp
vermagic: 6.2.0-36-generic SMP preempt mod_unload modversions
2.4 insmod 和 rmmod 命令
装载或卸载内核模块
不解决依赖关系,需要自己手动卸载
insmod命令
- 向 Linux 内核中插入一个模块
- insmod 是一个向内核插入模块的小程序
- 大多数用户使用 modprobe 因为它比较智能化
- insmod [ filename ] [ module options… ]
rmmod命令
- 命令解析删除内核中的一模块rmmod 是一个可以从内核中删除模块的小程序,大多数用户使用modprobe -r去删除模块
- 语法格式rmmod [ modulename ]
- 参数选项-f除非编译内核时 CONFIG_MODULE_FORCE_UNLOAD被设置该命令才有效果,否则没效果用该选项可以删除正在被使用的模块,设计为不能删除的模块,或者标记为 unsafe 的模块-wrmmod拒绝删除正在被使用的模块使用该选项后,指定的模块会被孤立起来,直到不被使用-s将错误信息写入syslog,而不是标准错误(stderr)