内核体系设计分:单内核,微内核

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是用户空间程序,工具是devadminhotplug(热插拔)

    kernel不知道,开机后,用户还添加哪些硬件,所以就无法按需创建硬件驱动,所以,kernel2.4以前的做法就是把能知道的所以硬件设备驱动文件都放在/dev目录下。这种做法,一是浪费空间,二是用户不能通过/dev目录下的文件来判断当前系统上有哪些硬件设备。/sys目录的出现,就能让设备按需出现在/dev目录。

  • udev为设备创建驱动程序时,会读取事先定义好的规则文件

    • centos7:一般在/etc/udev/rules.d/目录,以及/usr/lib/udev/rules.d/目录下。
    • centos6:一般在/etc/udev/rules.d/目录

# c/c++ 学习互助QQ群:877684253
![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg)
# 本人微信:xiaoshitou5854

Linux kernel简介的更多相关文章

  1. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

    作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...

  2. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...

  3. Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  4. Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux

    目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...

  5. 单步运行linux kernel ?

    如果能给linux kernel打log,如果能单步运行,如果能像普通应用程序那样,step by step的查看程序跑哪里了.. 该多好?这是一个梦想,但从未实现过:因为那是kernel,不是应用程 ...

  6. Linux 内核简介

    Linux内核简介 一.系统架构 (1). Linux系统架构 ##用户空间: 文件系统 C库 ##内核空间: 接口 内核 (2). Linux内核架构 二.Linux内核源代码 下载地址 www.k ...

  7. Linux Kernel 2.6.28 以上有BUG,系统运行第208.5天down机

    简介: 业务服务器有一台服务器出现意外down机,服务器ping 不通.无法登陆,本想通过公司KVM系统登陆系统重启解决,登陆KVM后发现系统屏幕打印大量的内核错误,KVM无法使用.无法发送重启服务器 ...

  8. Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

    原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...

  9. Linux基础学习(1)--Linux系统简介

    第一章——Linux系统简介 1.UNIX和Linux发展史: 1.1 unix发展史: (1)1965年,美国麻省理工学院(MIT).通用电气公司(GE)及AT&T的贝尔实验室联合开发Mul ...

随机推荐

  1. fastjson中Map与JSONObject互换

    1.//将map转换成jsonObject JSONObject itemJSONObj = JSONObject.parseObject(JSON.toJSONString(itemMap)); 将 ...

  2. .NET 框架设计 - 模式、配置、工具 Demo 搜索

    ps:http://www.ituring.com.cn/article/195770 看完第二章,我也忍了!但是随着第三章“副本”的开启,我的阅读速度开始慢慢的减缓,虽然对其中每一个程序模式的理论也 ...

  3. UVA A Spy in the Metro

    点击打开题目 题目大意: 在一个有n个站台的地铁线路里,给你列车通向每相邻两个车站所花费的时间,从0时刻开始,从1号站出发,要在T这个时间点上,到达n号站,给你m1辆从1开到n的列车及其出发时间,和m ...

  4. centos7安装mysql5.5.62

    mysql是我们最常用的开源的关系型数据库,mysql不同版本有时候安装的方式也不尽相同,下面梳理一下mysql5.5.62版本的安装 1.下载mysql5.5.62,URL:https://down ...

  5. Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

    前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么.虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事 ...

  6. 4、Oracle 数据库 startup 报错:ORA-27102: out of memory

    1.数据库启动报错: ORA-: out of memory SQL> startup pfile='/db/oracle/init.ora'; ORA-: out of memory Linu ...

  7. C++基类和派生类的构造函数

    派生类不能继承基类的构造函数,若想通过派生类来对基类的private的变量成员进行初始化则需要: 通过派生类的构造函数来调用基类的构造函数完成基类成员变量的初始化. 看下面的例子: #include ...

  8. Arduino系列之pwm控制LED灯(呼吸灯)

    下面我将写出最简单控制呼吸灯的方法 void setup()                                 // { pinMode(12,OUTPUT);             ...

  9. 2 深入分析 Java IO的工作机制(二)

    2.5 I/O调优 下面总结一些磁盘I/O和网络I/O的常用优化技巧. 2.5.1 磁盘I/O优化 1. 性能检测 应用程序通常都需要访问磁盘来读取数据,而磁盘I/O通常都很耗时,要判断I/O是否是一 ...

  10. 使用jQuery的插件jquery.corner.js来实现圆角效果-详解

    jquery.corner.js可以实现各种块级元素的角效果,以下为演示,详见jquery_corner.html中的注释部分,并附百度盘下载 jquery_corner.html代码如下: < ...