zoukankan      html  css  js  c++  java
  • 二十七、Linux内核管理

    内核组成: uname命令

    内核:uname,mkinitrd,dracut

    模块: lsmod,modinfo,depmod,modprobe,insmod,rmmod

    /proc,sysctl,/sys,/dev,udevadm,hotplug命令


    一、静态视角:

    Linux内核模块

      吸收微内核设计:支持模块化设计:

      内核中模块 .ko (kernel object) 

      程序调用的库 .so (share object) 

    内核模块相当于程序的库的概念,只是模块只能被kernel调用。库只能被程序调用

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

      内核组成部分:

        kernel:内核模块,一般为bzImage,通常在/boot目录下,名为vmlinuz-VERSION-RELEASE;

        kernel object : 内核对象,一般放置于/lib/modules/VERSION-RELEASE 

        辅助文件 initramfs(CentOS 6,7) , initrd (CentOS5)

     三种选择:
          [ ]: N  ---不编译此功能(不支持该功能)
          [M]:M  ---编译成模块(按需动态加载)
          [*]: Y ---编译成核心组成部分(需要直接使用)

    二、动态视角:

     2.1、uname 命令

    查看内核相关的信息
    
        uname 显示系统(kernel)信息
    
            -s 显示操作系统名称
    
            -n 显示当前主机名称: 显示节点名称 
    
            -r 显示VERSION及RELEASE号 
    
            -v 显示内核制作信息号 SMP 对称多处理器
    
            -m 当前硬件平台 x86_64
    
            -p 显示处理器类型或架构 x86_64
    
            -i 硬件架构 x86_64
    
            -o 操作系统(GNU/Linux)

    2.2、lsmod --- 查看由内核已经装载的模块  

     显示的内容来自于: /proc/modules文件

    # lsmod
    Module     Size        Used by
    模块       大小        使用次数

    2.3、modinfo --- 显示模块的详细描述信息

         -n : 只显示模块文件路径 

         -d :显示模块的描述 

         -p :模块的参数 

         -k kernel  :显示指定内核的模块信息 

         -a  :Author

        -l:License 

    1、显示所有信息
    # modinfo ext4
    filename:       /lib/modules/2.6.32-696.el6.i686/kernel/fs/ext4/ext4.ko
    license:        GPL
    description:    Fourth Extended Filesystem
    author:         Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
    srcversion:     74AEE2BDA63AC8482A78F4D
    depends:        mbcache,jbd2
    vermagic:       2.6.32-696.el6.i686 SMP mod_unload modversions 686 
    
    2、仅显示filename
    # modinfo -n ext4
    /lib/modules/2.6.32-696.el6.i686/kernel/fs/ext4/ext4.ko
    
    3、仅显示License
    # modinfo -l ext4
    GPL
    
    4、仅显示description
    # modinfo -d ext4
    Fourth Extended Filesystem
    
    5、仅显示作者
    # modinfo -a ext4
    Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others
    
    6、显示模块参数
    # modinfo -p ext4

    2.4、生成模块的依赖关系 depmod

    内核模块依赖关系文件及信息映射文件的生成工具

      为指定内核生成依赖 -b

            /boot/system.map-VERSION-RELEASE 内核依赖的模块及库

            /lib/modules/VERSION-RELEASE/modules.dep.bin 模块的依赖关系

    2.5、装载模块 modprobe MODULE 或 insmod $(modinfo -n MODULE)

    # modprobe pcnet32
    # lsmod | fgrep pcnet32
    pcnet32                29107  0 
    mii                     4476  1 pcnet32
    
    安装pcnet32模块
    # insmod $(modinfo -n pcnet32)
    insmod: error inserting '/lib/modules/2.6.32-696.el6.i686/kernel/drivers/net/pcnet32.ko': -1 Unknown symbol in module
    该情况可能是由于依赖关系造成
    查看依赖 # modinfo pcnet32 depends: mii 依据路径安装被依赖的模块 #
    insmod $(modinfo -n mii) 查看是否安装 # lsmod | fgrep mii mii 4476 0 安装Pcnet32 # insmod $(modinfo -n pcnet32) 查看是否安装 # lsmod | fgrep pcnet32 pcnet32 29107 0 mii 4476 1 pcnet32

    2.6、modprobe --- 拆除模块 

      配置文件:/etc/modprobe.conf , /etc/modprobe.d/*.conf

        modprobe -r MODULE 或 rmmod MODULE

    # modprobe -r pcnet32    
    # lsmod | fgrep pcnet32
    # 
    
    # rmmod pcnet32
    # lsmod | fgrep pcnet32
    #

    2.7、/proc目录

    内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出:

      只读 :输出信息-----内核内部统计、状态信息

      可写: 可配置参数,/proc/sys目录中,由sysctl命令控制,内核性能调整

          临时生效:echo 'STRING' > /proc/sys/kernel/hostname , sysctl -w kernel.hostname='STRING'

          永久有效:/etc/sysctl.conf   

       (1)sysctl 命令用于查看或设定此目录中诸多参数:

        sysctl  -w path.to.parameter=VALUE

        #sysctl -w kernel.hostname= liu

      (2)  echo命令通过重定向的方式也可以修改大多数参数的值

        echo “VALUE” > path/to/parameter 

        #echo "localhost" > /proc/sys/kernel/hostname

    sysctl命令:
      配置文件: /etc/sysctl.conf
    -a 显示所有内核参数
    -p 重读配置文件
    -p CONFIG_FILE 读取文件设定参数 
    -w PARAMETER='VALUE' 设定内核参数
        主机名:
    /proc/sys/kernel/hostnam      # echo 'VALUE' > /proc/sys/kernel/hostname
          # sysctl -w kernel.hostname='VALUE'

    内核路由转发:
    /proc/sys/net/ipv4/ip_forward 1:开启; 0:关闭

    cache/buffer回收: /proc/sys/vm/drop_caches 1: dropcache
      #sysctl -w vm.drop_caches=1
     常用几个参数:(被映射为目录)
        net.ipv4_forward
        vm.drop_caches
        kernel.hostname

    2.8、/sys目录---针对硬件设备

    输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息:有些参数是可以修改的,用于调整硬件工作特性

    a)、内核探测的硬件信息

      kernel 2.4- /dev/目录下事先创建所有设备文件,/dev/目录文件多,造成大量空间浪费

      kernel 2.4+ /dev/目录下按需生成设备文件,kernel临时探测,按需创建,节约空间

    b) 、udev通过此路径下输出的信息动态为设备创建所需要设备文件;udev是运行在用户空间程序

    • udev工具: udevadmin,hotplug
    • udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下 
    • 读取/sys目录下的硬件信息,在/dev目录下创建设备文件

    三、ramdisk文件的制作

    (1)mkinitrd 命令  :为当前正在使用的内核重新制作ramdisk文件

      mkinitrd [OPTION...] [<initrd-image>] <kernel-version>

    #mv /boot/initramfs-2.6.32-573.el6.x86_64.img   /root/
    #mkinitrd  /boot/initramfs-$(uname -r).img   $(uname -r)

    (2)dracut 命令

      dracut [OPTION]... <image> <kernel-version>

    #dracut  /boot/initramfs-$(uname -r).img   $(uname -r)

    3.2、展开  initramfs-$(uname -r).img 

    1、查看文件的类型
    file 
    
    2、改名.gzip结尾
    mv 
    
    3、解压
    gzip -d
    
    4、查看文件类型
    file
    
    5、展开
    install -d initrd
    cd initrd
    cpio -id < ../

    四、简易编译内核

    1)准备好开发环境

    2)获取源码

    3)获取目标主机的硬件设备信息

    4)获取到目标主机系统功能的项管部信息---目标实际需要

    准备开发环境

      包组(centos 6):  yum grouplist

        Server Platform Development

        Development Tools

    4.1、

    目标主机硬件设备相关信息:

    CPU

      cat /proc/cupinfo
    
      yum install x86info
        x86info  -a
      
    lsmod

    PCI

      #lspci

      #lsusb

      #lsblk

    了解全部硬件设备信息

      #hal-device

    第一次最好从参照模块文件来做如图:

    4.2、

    1)、获取源码

      https://www.kernel.org/ 

      **小于3.10版本

    2)、展开至/usr/local/目录

    tar xf  linux-3.10.67.tar.xz  -C  /usr/local/src

    wKiom1mxHyCBSMxXAAAIZ2oF4m4624.png

    3)、创建符号链接

      ln  -sv linux-3.10.67  linux 

    4)、[root@localhost src]#cd linux

      [root@localhost src]#cp /boot/config-2.6.32-573.el6.x86_64 .config

    5)、选择支持的模块

    wKiom1mxIDLREUx8AAALO3MpXHs787.png

    wKiom1mxIFujZ8AvAAAFQHMiUJU154.png

    根据提示需要安装ncurses-devel, yum -y install ncurses-devel

    再执行make menuconfig命令会弹出如图界面(会加载.config文件内容)

    a)、设置release号

          

      

    b)、设置主机名

      

    c)、设置支持NTFS文件系统

      

    d)、设置支持的网络驱动

     

    打开一个虚拟的屏幕: 

      yum -y install screen
      退出: ctrl + a 松开a后按d
      列出: screen -ls  找出ID
      连接回: screen -r ID

    6)、编译

    make -j #
        # lscpu 中 cpu(s) 后的数字为cpu核心数

    7)、执行安装:

        make  modules_install

        make install

        • 安装bzImage为/boot/vmlinuz-VERSION-RELEASE
        • 生成initranfs文件
        • 编辑grub的配置文件

    wKioL1mxP7OjfXUwAAA4gAEHQgo575.png 

    wKiom1mxP9Sg-QOwAAAFvl70r9k419.png

     8)、重启系统,并测试使用新内核

  • 相关阅读:
    mkdirp——递归创建目录及其子目录
    rimraf命令 递归删除目录所有文件
    前端面试总结——http、html和浏览器篇
    meta标签
    多行文本溢出显示省略号
    ui-sref
    Angular组件之间通讯
    定义路由的state参数
    angularjs中factory, service和provider
    Oracle Spatial分区应用研究之五:不同分区粒度+本地空间索引效率对比
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11440666.html
Copyright © 2011-2022 走看看