linux 内核

1、内核的作用

Linux 内核是 Linux 操作系统的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件的所有主要功能。内核的用途主要有以下 4 项工作:

  • 内存管理:追踪记录有多少内存存储了什么以及存储在哪里
  • 进程管理:确定哪些进程可以使用中央处理器、何时使用以及持续多长时间
  • 设备驱动程序:充当硬件与进程之间的调解程序/解释程序
  • 系统调用和安全防护:从流程接受服务请求

在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。

 Interactive map of Linux kernel (makelinux.github.io)

Linux kernel diagram (makelinux.github.io)  内核架构图

2、内核简介

Linux 内核的重要组成部分,主要有以下几部分:

  • kernel

    • 内核核心,一般为 bzImage
    • 通常在 /boot 目录下,名称为 vmlinuz-VERSION-RELEASE
  • kernel object

    • 内核对象,一般放置于 /lib/modules/VERSION-RELEASE/
    • [ ] ==> N ==> 不编译进内核
    • [M] ==> M ==> 编译为模块文件
    • [*] ==> Y ==> 编译进内核
  • 辅助文件(ramdisk)

    • initrd
    • initramfs

3、内核模块

1、uname 命令

使用格式

  • uname [OPTION]...

参数解释

  • -n 显示节点名称
  • -r 显示VERSION-RELEASE
  • -s 内核名称
  • -v 内核版本
  • -n 节点名
  • -m 硬件名称
  • -i 硬件平台
  • -p 处理器类型
  • -o 操作系统

2、lsmod 命令

显示由核心已经装载的内核模块

命令定义

  • 显示的内容来自于: /proc/modules 文件。
  • 使用 lsmod 命令时,常会采用类似 lsmod | grep -i ext4 这样的命令来查询系统是否加载了某些模块。
# cat /proc/modules
iptable_filter 2173 0 - Live 0xed9b2000
ip_tables 9567 1 iptable_filter, Live 0xed9a9000
ext3 203718 1 - Live 0xed962000
jbd 65315 1 ext3, Live 0xed904000
xenfs 4360 1 - Live 0xed8e6000
ipv6 271097 14 - Live 0xed88e000
xen_netfront 15871 0 - Live 0xed7d9000
ext4 339812 2 - Live 0xed764000
jbd2 75927 1 ext4, Live 0xed6d9000
mbcache 6017 2 ext3,ext4, Live 0xed6b7000
xen_blkfront 19209 5 - Live 0xed69f000
dm_mirror 11969 0 - Live 0xed68d000
dm_region_hash 9644 1 dm_mirror, Live 0xed67e000
dm_log 8322 2 dm_mirror,dm_region_hash, Live 0xed672000
dm_mod 84711 11 dm_mirror,dm_log, Live 0xed64e000

字段含义

  • 第 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

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 ext4
filename:       /lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/ext4/ext4.ko
license:        GPL
description:    Fourth Extended Filesystem
author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore and others
srcversion:     CB1B990F5A758DFB0FB12F1
depends:        mbcache,jbd2
vermagic:       2.6.32-573.22.1.el6.i686 SMP mod_unload modversions 686

# modinfo btrfs
filename:       /lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/btrfs/btrfs.ko
license:        GPL
alias:          devname:btrfs-control
alias:          char-major-10-234
srcversion:     B412C18B0F5BF7F1B3C941A
depends:        libcrc32c,zlib_deflate,lzo_compress,lzo_decompress
vermagic:       2.6.32-573.22.1.el6.i686 SMP mod_unload modversions 686

4、modprobe 命令

装载或卸载内核模块

命令定义

  • 配置文件
    • /etc/modprobe.conf
    • /etc/modprobe.d/*.conf
  • 解决依赖
    • modprobe需要一个最新的modules.dep文件,可以用depmod来生成
    • 该文件列出了每一个模块需要的其他模块,modprobe使用这个去自动添加或删除模块的依赖
# modules.dep为解决依赖的配置文件,modules.dep.bin二进制文件运行
# ls /lib/modules/2.6.32-358.6.1.el6.i686/
build              modules.block    modules.ieee1394map  modules.ofmap     modules.symbols.bin  weak-updates
extra              modules.ccwmap   modules.inputmap     modules.order     modules.usbmap
kernel             modules.dep      modules.isapnpmap    modules.pcimap    source
modules.alias      modules.dep.bin  modules.modesetting  modules.seriomap  updates
modules.alias.bin  modules.drm      modules.networking   modules.symbols   vdso

语法

  • modprobe [ -c ]
  • modprobe [ -l ] [ -t dirname ] [ wildcard ]
  • modprobe [ -r ] [ -v ] [ -n ] [ -i ] [ modulename … ]

选项

  • -v

    • 显示程序在干什么,通常在出问题的情况下,modprobe 才显示信息
  • -C

    • 重载,默认配置文件(/etc/modprobe.conf 或 /etc/modprobe.d)
  • -c

    • 输出配置文件并退出
  • -n

    • 可以和 -v 选项一起使用,调试非常有用
  • -i

    • 该选项会使得 modprobe 忽略配置文件中的,在命令行上输入的 install 和 remove
  • -q

    • 一般 modprobe 删除或插入一个模块时,若没有找到会提示错误。使用该选项,会忽略指定的模块,并不提示任何错误信息。
  • -r

    • 该选项会导致 modprobe 去删除,而不是插入一个模块
    • 通常没有没有理由去删除内核模块,除非是一些有 bug 的模块
  • -f

    • 使用该选项是比较危险的
    • 和同时使用 –force-vermagic–force-modversion 一样
  • -l

    • 列出所有模块
  • -a

    • 插入所有命令行中的模块
  • -t

    • 强制 -l 显示 dirname 中的模块
  • -s

    • 错误信息写入 syslog

5、depmod 命令

内核模块依赖关系文件及系统信息映射文件的生成工具

语法

  • depmod [-adeisvV][-m <文件>][--help][模块名称]

参数

  • -a 分析所有可用的模块
  • -d 执行排错模式
  • -e 输出无法参照的符号
  • -i 不检查符号表的版本
  • -m<文件> 使用指定的符号表文件
  • -s 在系统记录中记录错误
  • -v 执行时显示详细的信息
  • -V 显示版本信息
  • --help 显示帮助

6、insmod 和 rmmod 命令

装载或卸载内核模块

  • 不解决依赖关系,需要自己手动卸载

insmod命令

  • 向 Linux 内核中插入一个模块
  • insmod 是一个向内核插入模块的小程序
  • 大多数用户使用 modprobe 因为它比较智能化
  • insmod [ filename ] [ module options... ]

rmmod命令

  • 命令解析

    • 删除内核中的一模块
    • rmmod 是一个可以从内核中删除模块的小程序,大多数用户使用modprobe -r去删除模块
  • 语法格式

    • rmmod [ modulename ]
  • 参数选项

    • -f

      • 除非编译内核时 CONFIG_MODULE_FORCE_UNLOAD 被设置该命令才有效果,否则没效果
      • 用该选项可以删除正在被使用的模块,设计为不能删除的模块,或者标记为 unsafe 的模块
    • -w

      • rmmod 拒绝删除正在被使用的模块
      • 使用该选项后,指定的模块会被孤立起来,直到不被使用
    • -s

      • 将错误信息写入 syslog,而不是标准错误(stderr)

4、 /proc 目录

内核把自己内部状态信息及统计信息,以及可配置参数通过 proc 伪文件系统加以输出。

# ls /proc/
1     1173  22     29855  35  47   60   973          filesystems  loadavg       scsi           version
10    12    23     3      36  48   600  buddyinfo    fs           locks         self           vmallocinfo
1071  13    232    30     37  49   61   bus          interrupts   mdstat        slabinfo       vmstat
1082  14    234    31     38  5    62   cgroups      iomem        meminfo       softirqs       xen
1085  15    24     31314  39  528  7    cmdline      ioports      misc          stat           zoneinfo
11    16    25     317    4   531  739  cpuinfo      irq          modules       swaps
1150  17    252    318    40  543  8    crypto       kallsyms     mounts        sys
1162  18    253    32     41  56   808  devices      kcore        mtd           sysrq-trigger
1163  19    26     320    42  566  830  diskstats    keys         net           sysvipc
1165  1908  27     33     43  567  853  dma          key-users    pagetypeinfo  timer_list
1167  2     28     330    44  57   9    driver       kmsg         partitions    timer_stats
1169  20    29     334    45  59   94   execdomains  kpagecount   sched_debug   tty
1171  21    29853  34     46  6    95   fb           kpageflags   schedstat     uptime

1、sysctl 命令

语法格式

  • sysctl(选项)(参数)

命令参数

  • -n 打印值时不打印关键字
  • -e 忽略未知关键字错误
  • -N 仅打印名称
  • -w 当改变 sysctl 设置时使用此项
  • -p 从配置文件 /etc/sysctl.conf 加载内核参数设置
  • -a 打印当前所有可用的内核参数变量和值
  • -A 以表格方式打印当前所有可用的内核参数变量和值

默认配置文件

  • /etc/sysctl.conf

命令使用方式

  • (1) 设置某参数
    • sysctl -w parameter=VALUE
  • (2) 通过读取配置文件设置参数
    • sysctl -p [/path/to/conf_file]

参数说明

  • 只读:输出信息
  • 可写:可接受用户指定“新值”来实现对内核某功能或特性的配置/proc/sys

两种修改方式

  • (1) sysctl 命令用于查看或设定此目录中诸多参数
    • sysctl -w path.to.parameter=VALUE
    • sysctl -w kernel.hostname=mail.escapelife.com
  • (2) echo 命令通过重定向的方式也可以修改大多数参数的值
    • echo "VALUE" > /proc/sys/path/to/parameter
    • echo "www.escapelife.com" > /proc/sys/kernel/hostname

配置文件中常用的几个参数

  • net.ipv4.ip_forward
  • /proc/sys/net/ipv4/ip_forward
  • vm.drop_caches
  • /proc/sys/vm/drop_caches
  • kernel.hostname
  • /proc/sys/kernel/hostname

5、/sys 目录

sysfs 伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息。有些参数是可以修改的,用于调整硬件工作特性。

1、udev

  • udev 是运行用户空间程序。
  • udev 通 /sys/ 路径下输出的信息动态为各设备创建所需要设备文件。
  • udev 是 Linux 内核的设备管理器,它取代了 udevadmin 和  hotplug,负责管理  /dev 中的设备节点。
  • udev 也处理所有用户空间发生的硬件添加、删除事件,以及某些特定设备所需的固件加载。
  • udev 为设备创建设备文件时,会读取其事先定义好的规则文件,一般在 /etc/udev/rules.d 及 /usr/lib/udev/rules.d 目录下。

2、ramdisk 文件的制作

方法一

  • mkinitrd 命令
  • 为当前正在使用的内核重新制作 ramdisk 文件
  • mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
# 移动ramdisk文件到/root目录下
mv /boot/initramfs-2.6.32...img /root

# 为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

方法二

  • dracut 命令
  • 为当前正在使用的内核重新制作 ramdisk 文件
  • dracut /boot/initramfs-$(uname -r).img $(uname -r)
# 移动ramdisk文件到/root目录下
mv /boot/initramfs-2.6.32...img /root

# 为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)

3、查看 ramdisk

# 使用file命令查看ramdisk文件发现是以gz压缩存放的
file /boot/initramfs-2.6.32-504.el6.x86_64.img

# 改名称,解压
cd /boot/
mv initramfs-2.6.32-504.el6.x86_64.img initramfs-2.6.32-504.el6.x86_64.img.gz
gzip -d initramfs-2.6.32-504.el6.x86_64.img.gz

# 使用file命令查看发现是以cpio存放的文本文件
file initramfs-2.6.32-504.el6.x86_64.img

# 解压这个文本文件
# 之后会在initrd目录下生成相应的文件,一个微型的/root
mkdir initrd
cd initrd
cpio -id < ../initramfs-2.6.32-504.el6.x86_64.img

# 这个时候就可以查看init脚本文件了
cat init

# 在sbin文件中存放着相关的命令
ls sbin

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Linux 系统内核概述 (qq.com)

 

posted @ 2023-06-01 17:16  凡人半睁眼  阅读(159)  评论(0编辑  收藏  举报