Linux内核功能及模块应用

Linux系统的组成部分:内核和根文件系统

内核:

  进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能

  • 内核设计体系:
    • 单内核设计:把所有功能集成于同一个程序;
       代表:Linux
    • 微内核设计:每种功能使用一个单独的子系统实现;
       代表:Windows,Solaris
  • Linux内核特点:
    1. 支持模块化:.ko(kernel object)
    2. 支持模块运行时动态装载或卸载;
    3. 使用缓冲和缓存来加速对磁盘上的文件访问;
  • 组成部分:
    • kernel:内核核心文件,通常位于/boot目录,名称为vmlinuz-VERSION-release
    • kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/,支持动态转载和卸载;内核模块与内核核心版本一定要严格匹配;
       [ ]:N
       [M]:Module
       [*]:Y,编译进内核核心
    • ramdisk:是一个简装版的根文件系统,辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
       目标设备驱动,例如SCSI设备的驱动;
       逻辑设备驱动,例如LVM设备的驱动;
       文件系统,例如xfs文件系统;
       CentOS 5:/boot/initrd-VERSION-release.img
       CentOS 6,7:/boot/initramfs/VERSION-release.img

根文件系统:

  根文件系统首先是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。
Linux根文件系统中一般有如下图的几个目录:

  1. /bin目录
      该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。
      /bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir、[、test等。其中“[”命令就是test命令,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。
  2. /sbin目录
      该目录下存放系统命令,即只有系统管理员(俗称最高权限的root)能够使用的命令,系统命令还可以存放在/usr/sbin,/usr/local/sbin目录下,/sbin目录中存放的是基本的系统命令,它们用于启动系统和修复系统等,与/bin目录相似,在挂接其他文件系统之前就可以使用/sbin,所以/sbin目录必须和根文件系统在同一个分区中。
      /sbin目录下常用的命令有:shutdown、reboot、fdisk、fsck、init等,本地用户自己安装的系统命令放在/usr/local/sbin目录下。
  3. /dev目录
      该目录下存放的是设备与设备接口的文件,设备文件是Linux中特有的文件类型,在Linux系统下,以文件的方式访问各种设备,即通过读写某个设备文件操作某个具体硬件。比如通过"dev/ttySAC0"文件可以操作串口0,通过"/dev/mtdblock1"可以访问MTD设备的第2个分区。比较重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/lp*等。
  4. /etc目录
      该目录下存放着系统主要的配置文件,例如人员的账号密码文件、各种服务的其实文件等。一般来说,此目录的各文件属性是可以让一般用户查阅的,但是只有root有权限修改。对于PC上的Linux系统,/etc目录下的文件和目录非常多,这些目录文件是可选的,它们依赖于系统中所拥有的应用程序,依赖于这些程序是否需要配置文件。在嵌入式系统中,这些内容可以大为精减。
  5. /lib目录
      该目录下存放共享库和可加载(驱动程序),共享库用于启动系统。运行根文件系统中的可执行程序,比如:/bin /sbin 目录下的程序。
  6. /home目录
      系统默认的用户文件夹,它是可选的,对于每个普通用户,在/home目录下都有一个以用户名命名的子目录,里面存放用户相关的配置文件。
  7. /root目录
      系统管理员(root)的主文件夹,即是根用户的目录,与此对应,普通用户的目录是/home下的某个子目录。
  8. /usr目录
      /usr目录的内容可以存在另一个分区中,在系统启动后再挂接到根文件系统中的/usr目录下。里面存放的是共享、只读的程序和数据,这表明/usr目录下的内容可以在多个主机间共享,这些主要也符合FHS标准的。/usr中的文件应该是只读的,其他主机相关的,可变的文件应该保存在其他目录下,比如/var。/usr目录在嵌入式中可以精减。
  9. /var目录
      与/usr目录相反,/var目录中存放可变的数据,比如spool目录(mail,news),log文件,临时文件。
  10. /proc目录
      这是一个空目录,常作为proc文件系统的挂接点,proc文件系统是个虚拟的文件系统,它没有实际的存储设备,里面的目录,文件都是由内核
    临时生成的,用来表示系统的运行状态,也可以操作其中的文件控制系统。
  11. /mnt目录
      用于临时挂载某个文件系统的挂接点,通常是空目录,也可以在里面创建一引起空的子目录,比如/mnt/cdram /mnt/hda1 。用来临时挂载光盘、移动存储设备等。
  12. /tmp目录
      用于存放临时文件,通常是空目录,一些需要生成临时文件的程序用到的/tmp目录下,所以/tmp目录必须存在并可以访问。

运行中的系统环境可分为两层

  • 内核空间:内核代码(系统调用)
  • 用户空间:应用程序(进程或线程)

命令:

共享库获取:

ldd命令:显示共享库依赖项
格式:
ldd [OPTION]... FILE...

内核信息获取:

uname命令:显示系统相关信息
格式:
uname [OPTION]...
OPTION:
 -r:内核的release号;
 -n:主机名;

模块信息获取和管理:

lsmod命令:显示内核模块的状态
  注意:显示的内核来自于/proc/modules

modinfo命令:显示内核模块的信息
格式:
modinfo [-F field] [-k kernel] [modulename|filename...]
OPTION:
 -F field:仅显示指定字段的信息;
 -n:显示文件路径;

modprobe命令:从内核中添加或删除模块
格式:modprobe [-r] module_name
 模块的动态装载:[root@node1 ~]# modprobe module_name
 模块的动态卸载:[root@node1 ~]# modprobe -r module_name

depmod命令:内核模块依赖关系文件的生成工具

insmod命令:插入模块
格式:
insmod [filename] [module options...]
  filename:模块文件的文件路径;

rmmod命令:删除模块
格式:
rmmod [module_name]

ramdisk文件的管理:

  1. mkinitrd命令:
    为当前使用中的内核重新制作ramdisk文件:
    格式:
    # mkinitrd [OPTION...] [<initrd-image>] <kernel-version>
    OPTION:
     --with=<module>:处理默认的模块之外需要装载至initramfs中的模块;
     --preload=<module>:initramfs所提供的模块需要预先装载的模块;
    示例:
    [root@node1 ~]# mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
  2. dracut命令:
    格式:
    # dracut [OPTION...] [<image> [<kernel version>]]
    示例:
    [root@node1 ~]# dracut /boot/initramfs-$(uname -r).img $(uname -r)

内核信息输出的伪文件系统:

/proc:内核状态和统计信息的输出接口;同时,还提供一个配置接口(/proc/sys);

  • 参数:
     只读:信息输出;例如/proc/#/*
     可写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置(/proc/sys);
      /proc/sys:
       net/ipv4/ip_forward相当于net.ipv4.ip_forward
       1. sysctl命令:专用于查看或设定/proc/sys目录下参数的值;
        sysctl [options] [variable[=value]]
         查看:
          # sysctl -a
          # sysctl variable
         修改其值:
          # sysctl -w variable=value
       2. 文件系统目录(cat,echo)
        查看:
         # cat /proc/sys/PATH/TO/SOME_KERNEL_FILE
        设定:
         # echo "VALUE" > /proc/sys/PATH/TO/SOME_KERNEL_FILE
       注意:上述两种方式的设定仅当前运行内核有效;
       3. 配置文件:/etc/sysctl.conf/etc/sysctl.d/*.conf
        立即生效的方式:# sysctl -p [/PATH/TO/CONFIG_FILE]
      内核参数:
       net.ipv4.ip_forward:核心转发;
       vm.drop_caches:清理缓存;
       kernel.hostname:主机名;
       net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

/sys:
 sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性;
 udev:通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin,hotplug;
 udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/目录下,以及/usr/lib/udev/rules.d/目录下;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容