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

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. Android 系统(4)---Android HAL层与Linux Kernel层驱动开发简介

    Android HAL层与Linux Kernel层驱动开发简介 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. HAL:Hardw ...

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

    Android HAL层与Linux Kernel层驱动开发简介 阅读数:5070 近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记. ...

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

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

  4. linux 文件系统 启动,linux kernel文件系统启动部分

    现在的kernel里,有个叫做ramfs的文件系统,会把initrd(或者ramdisk,为惯性叫法)里的东西挂载到early-rootfs里(即rootfs,是ramfs的一个特殊实例),执行一些在 ...

  5. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )

    文章目录 一.Linux 权限简介 二.系统权限 / 用户权限 / 匿名用户权限 1.系统权限 2.用户权限 3.匿名用户权限 一.Linux 权限简介 Linux 是基于文件的系统 , 内存 , 设 ...

  6. Linux Kernel and Android 休眠与唤醒(中文版)

    Linux Kernel and Android 休眠与唤醒(中文版) 四月 18th, 2010 0 Comments/1664 hits Table of Contents 简介 国际化 版本信息 ...

  7. [architecture]-ARMV7架构下Linux Kernel的Userspace进程切换时保存和恢复哪些寄存器

    ★★★ 个人博客导读首页-点击此处 ★★★ . 文章目录 1.armv7的通用寄存器简介 2.寄存器的保存和恢复 3.Linux Kernel参考代码 1.armv7的通用寄存器简介 ARMV7处理器 ...

  8. linux内核体系学习路径_Linux内核分析(一)linux体系简介|内核源码简介|内核配置编译安装...

    从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1. Linux体系结构简介 ...

  9. 网易发“暴力裁员”内部说明;京东负责不幸员工的孩子费用到22岁;Linux kernel 5.4发布 | 极客头条...

    整理 | 郭芮 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

最新文章

  1. Jmeter安装出现Not able to find Java executable or version问题解决方案
  2. 定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特性的数据结构
  3. 经典的cnn model
  4. JS的Touch事件们
  5. linux 安装 mysql off,linux下安装mysql
  6. 最棒的 JavaScript 学习指南
  7. php选中文本区域,php – 将新行更改为文本区域
  8. 分享7个超实用的Emmet(zen coding)HTML代码使用技巧
  9. 超详细图文介绍,华为桌面云解决方案
  10. Packet Tracer 思科模拟器入门教程 之九 路由器的基本配置
  11. java小说网站源码_基于java的小说网站代码(全)
  12. android 百度地图离线地图功能
  13. 学云计算需要准备哪些知识?
  14. mysql中的alter_MySQL中Alter用法
  15. 所以小学把基础的数理逻辑和ZFC集论,基数序数超滤模型论学好,大有裨益…...
  16. 腾讯微信技术总监:十亿用户增长背后的架构秘密
  17. 进程与程序的区别和联系
  18. 【小白爬POJ2431】3.6 探险车加油问 Expedition
  19. linux远程部分文件传输不了,远程传输文件(linux之scp简单操作)
  20. 环境法19春在线作业1-0003

热门文章

  1. 曰期计算器java,日期计算器
  2. Java 基础巩固:内部类的字节码学习和实战使用场景
  3. DELL-DRAC远程控制卡使用教程
  4. [转]速度与激情:雷军和小米手机的三国杀
  5. 巴黎婚纱“不告而辞”,资金都没存管的婚纱照你还敢去拍?
  6. 全球及中国印刷级高抗冲聚苯乙烯行业运行现状与投资趋势预测分析报告2022-2028年
  7. 清除对象中值为空的属性
  8. 微信小程序怎么判断是从哪个页面跳转进来的
  9. 视频点播RTMP推流直播流媒体服务二次开发集成接口
  10. 如何进行产品设计,更能激发用户行为