Linux kernel简介
内核体系设计分:单内核,微内核
windows是微内核设计。
Linux是单内核设计,但充分借鉴了为微内核体系的优点,为内核引入了模块化机制。
内核的组成部分
-
kernel:内核核心,一般为bz压缩的image文件,通常位于/boot目录,名称为vmlinuz-VERSION-release
-
kernel object:内核对象,即为内核模块,一般放置于/lib/modules/VERSION-release目录下
kernel和kernel object的版本号一定要完全一样,才能正常使用。
[ ]:不编译,不使用
[M]:编译成模块,不编译进内核
[*]:直接编译进kernel
-
ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备。
里面放的是:
- 目标设备驱动,例如SCSI设备的驱动;
- 逻辑设备驱动,例如LVM设备驱动
- 文件系统,例如xfs文件系统
它是一个简装版的根文件系统
获取内核版本信息的命令:uname
-
内核文件所在位置:/boot/vmlinuz-VERSION.release
-
获取内核的release号:
# uname -r 2.6.32-754.el6.x86_64
获取主机名:
# uname -n c610 # hostname c610
获取内核已经装载了哪些模块:lsmod
显示的信息来自/proc/modules文件
Module:模块名字
size:大小
used by:被哪个模块使用了,及被引用的次数
# lsmod
Module Size Used by
xt_CHECKSUM 12549 1
ipt_MASQUERADE 12678 3
nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE
tun 31740 1
获取模块的详细信息:modinfo NAME
即使模块没有被加载也可以获得信息,类似rpm -ql
命令。
# modinfo xfs
filename: /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
license: GPL
description: SGI XFS with ACLs, security attributes, no debug enabled
author: Silicon Graphics, Inc.
alias: fs-xfs
retpoline: Y
rhelversion: 7.6
srcversion: 799C7EBA4C499822FD1E465
depends: libcrc32c
intree: Y
vermagic: 3.10.0-957.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: B7:0D:CF:0D:F2:D9:B7:F2:91:59:24:82:49:FD:6F:E8:7B:78:14:27
sig_hashalgo: sha256
常用选项:
-
指定显示的字段:-F filed-name
# modinfo -F filename xfs /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
-
显示模块文件的路径:-n
# modinfo -n xfs /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz
-
如果有多个内核,显示指定内核的信息:-k kernel
装载/卸载模块:modprobe
-
装载模块:
modprobe mode_name
# modprobe btrfs
-
卸载模块:
modprobe -r mode_name
# modprobe -r btrfs
装载/卸载模块的另一组命令:
-
装载模块:
insmod file_name
装载时使用模块文件路径。
# insmod /lib/modules/3.10.0-957.el7.x86_64/kernel/fs/xfs/xfs.ko.xz # insmod `modinfo -n xfs`
insmod和rpm类似,不能自动解决依赖关系。当你要装载的模块所依赖的模块还没有被装载的化,装载失败。错误信息:Unknown symbol in module。 modeprobe可以自动解决依赖关系。
-
卸载模块:
rmmod mode_name
卸载时,指定模块的名字。
# rmmod xfs
生成模块依赖关系文件:depmod
ramdisk文件的管理
不小心把/boot目录下的initramfs-3.10.0-957.el7.x86_64.img文件删除了,下次系统就不能启动了,所以需要手动制作ramdisk文件。
创建ramdisk文件的命令:
centos5,6,7:mkinitrd
# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
/boot/initramfs-$(uname -r).img:指定ramdisk的文件名。
$(uname -r):指定kernel的release号
常用选项:
- 除了默认模块之外,再安装别的模块到ramdisk里:--with=<module>
- 内核装载ramdisk里的模块前,预先装载的模块:--preload=<module>
centos6,7:dracut
kernel参数管理
修改kernel参数的作用:修改了kernel的参数,kernel的行为就发生变化了。
kernel的参数管理是用伪文件系统管理的,因为一切皆文件嘛,kernel参数也被抽象成了文件。
一,目录/proc就是伪文件系统,kernel的参数在此存储
- 所以查看kernel参数的值,就是用cat等命令查看/proc目录下对应的文件即可。
- 所以修改kernel参数的值,就是用echo重定向/proc目录下对应的文件即可。
- 当然也有专用的命令可以查看和修改kernel的参数。
查看当前运行的kernel的参数
查看内核的所有参数:sysctl -a
-
使用专用命令查看:
# sysctl abi.vsyscall32 abi.vsyscall32 = 1
-
使用文件系统的命令查看:
# cat /proc/sys/abi/vsyscall32 1
可以看出来参数是用点分隔的,把点换成/就找到了存储此参数的文件的路径。
例如,参数net.ipv4.ip_forward对应的文件的路径就是:/proc/sys/net/ipv4/ip_forward
参数abi.vsyscall32对应的文件的路径就是:/proc/sys/abi/vsyscall32
所以/proc/sys/目录下存放的就是所有kernel参数了。
# ll /proc/sys
dr-xr-xr-x 0 root root 0 Feb 23 07:34 abi
dr-xr-xr-x 0 root root 0 Feb 23 07:31 crypto
dr-xr-xr-x 0 root root 0 Feb 23 07:34 debug
dr-xr-xr-x 0 root root 0 Feb 23 07:34 dev
dr-xr-xr-x 0 root root 0 Feb 23 07:31 fs
dr-xr-xr-x 0 root root 0 Feb 23 07:31 kernel
dr-xr-xr-x 0 root root 0 Feb 23 07:31 net
dr-xr-xr-x 0 root root 0 Feb 23 07:31 vm
修改当前运行的kernel的参数
-
使用专用命令修改:
# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
-
使用文件系统的命令修改:
# echo 0 > /proc/sys/net/ipv4/ip_forward # sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 0
-
上面的修改,仅在当前有效,重启失效。所以配置文件登场
-
通过修改配置文件,让kernel参数永久有效。
-
centos6:修改/etc/sysctl.conf
修改完文件后,不能立即生效。要想立即生效,可以使用:
sysctl -p [filename]
选项-p后,不给文件路径的活,就是加载文件/etc/sysctl.conf文件。
修改/etc/sysctl.conf文件: net.ipv4.ip_forward = 1 # cat /proc/sys/net/ipv4/ip_forward 0 [root@c610 ~]# sysctl -p net.ipv4.ip_forward = 1 [root@c610 ~]# cat /proc/sys/net/ipv4/ip_forward 1
-
centos7:修改/etc/sysctl.d/*.conf文件
# emacs -nw /etc/sysctl.d/test1.conf net.ipv4.ip_forward = 0 # cat /proc/sys/net/ipv4/ip_forward 1 # sysctl -p /etc/sysctl.d/test1.conf net.ipv4.ip_forward = 0 # cat /proc/sys/net/ipv4/ip_forward 0
-
-
内核参数:net.ipv4.icmp_echo_ignore_all
- 0:别人发给我的ping请求,我回应,所以别人能ping通我
- 1:别人发给我的ping请求,我不回应,所以别人不能ping通我,但我还是可以ping别人。
二,目录/sys也是伪文件系统
-
输入kernel识别出的各个硬件设备的属性信息,也有kernel控制硬件的参数,对此参数修改,即可定制硬件设备工作特性。
-
udev通过读取/sys目录下硬件设备信息,为硬件创建驱动程序(设备文件:/dev/xxx)。udev是用户空间程序,工具是
devadmin
,hotplug
(热插拔)kernel不知道,开机后,用户还添加哪些硬件,所以就无法按需创建硬件驱动,所以,kernel2.4以前的做法就是把能知道的所以硬件设备驱动文件都放在/dev目录下。这种做法,一是浪费空间,二是用户不能通过/dev目录下的文件来判断当前系统上有哪些硬件设备。/sys目录的出现,就能让设备按需出现在/dev目录。
-
udev为设备创建驱动程序时,会读取事先定义好的规则文件
- centos7:一般在/etc/udev/rules.d/目录,以及/usr/lib/udev/rules.d/目录下。
- centos6:一般在/etc/udev/rules.d/目录