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