热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linuxkernel简介

内核体系设计分:单内核,微内核windows是微内核设计。Linux是单内核设计,但充分借鉴了为微内核体系的优点,为内核引入了模块化机制。内核的组成部分kernel:内核核

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

windows是微内核设计。

Linux是单内核设计,但充分借鉴了为微内核体系的优点,为内核引入了模块化机制。

内核的组成部分

  • kernel:内核核心,一般为bz压缩的image文件,通常位于/boot目录,名称为vmlinuz-VERSION-release

  • kernel object:内核对象,即为内核模块,一般放置于/lib/modules/VERSION-release目录下

    kernel和kernel object的版本号一定要完全一样,才能正常使用。

    [ ]:N

    [M]:Module

    [*]:Y,编译进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=
  • 内核装载ramdisk里的模块前,预先装载的模块:--preload=

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

本人微信:xiaoshitou5854


推荐阅读
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在Java编程中,为了提高代码的可读性和执行效率,建议优先使用局部变量来存储方法的返回值,而不是多次调用同一个方法。这样不仅可以减少方法调用的开销,还能避免潜在的性能问题。此外,使用局部变量还可以增强代码的可维护性和调试便利性。 ... [详细]
  • PHP中元素的计量单位是什么? ... [详细]
  • 本文深入探讨了 MXOTDLL.dll 在 C# 环境中的应用与优化策略。针对近期公司从某生物技术供应商采购的指纹识别设备,该设备提供的 DLL 文件是用 C 语言编写的。为了更好地集成到现有的 C# 系统中,我们对原生的 C 语言 DLL 进行了封装,并利用 C# 的互操作性功能实现了高效调用。此外,文章还详细分析了在实际应用中可能遇到的性能瓶颈,并提出了一系列优化措施,以确保系统的稳定性和高效运行。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 本文详细解析了 MySQL 5.7.20 版本中二进制日志(binlog)崩溃恢复机制的工作流程。假设使用 InnoDB 存储引擎,并且启用了 `sync_binlog=1` 配置,文章深入探讨了在系统崩溃后如何通过 binlog 进行数据恢复,确保数据的一致性和完整性。 ... [详细]
  • Java 9 中 SafeVarargs 注释的使用与示例解析 ... [详细]
  • JVM参数设置与命令行工具详解
    JVM参数配置与命令行工具的深入解析旨在优化系统性能,通过合理设置JVM参数,确保在高吞吐量的前提下,有效减少垃圾回收(GC)的频率,进而降低系统停顿时间,提升服务的稳定性和响应速度。此外,本文还将详细介绍常用的JVM命令行工具,帮助开发者更好地监控和调优JVM运行状态。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
  • 在 LeetCode 1338 题目中,目标是将数组大小减少到一半。解决方案首先涉及统计数组中每个元素的频率,接着按频率进行降序排序。优先选择频率较高的元素,以确保能最有效地减少数组规模。此方法不仅高效,还能保证在最少的步骤内达到目标。 ... [详细]
  • 在 Vbox 和 Hbox 布局中,当用户点击容器添加一个矩形时,系统会自动为该矩形分配坐标并打印其位置信息。此外,在按键事件触发时,系统仅打印当前矩形的坐标值。这两种布局在特定的交互场景下,能够动态地管理和更新子组件的位置。 ... [详细]
  • Understanding the Distinction Between decodeURIComponent and Its Encoding Counterpart
    本文探讨了 JavaScript 中 `decodeURIComponent` 和其编码对应函数之间的区别。通过详细分析这两个函数的功能和应用场景,帮助开发者更好地理解和使用它们,避免常见的编码和解码错误。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
author-avatar
用户t59kdjdcr6
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有