zoukankan      html  css  js  c++  java
  • Linux 内核管理

    Linux内核基础:
    Linux Kernel:
      Linux内核的体积结构是单内核的,但充分借鉴了微内核设计体系的优点,为内核引入模块化机制,使得虽然是单内核,但工作在模块化的方式下,并且模块可以动态装载或卸载;Linux内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。如是我们在了解Linux内核的基础上根据自己的需要量身定制一个更高效更稳定的内核,就需要我们手动去编译和配置内核里的各项相关的参数和信息。
      内核的组成部分:
      1、Kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-release
      2、Kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/;内核模块与内核核心版本一定要严格匹配
        选择编译内核选项标记解释:
        []:N,不编译进内核
        [M]:Module,编译成内核模块
        [*]:Y,直接编译进内核核心(kernel核心文件中)
        注意:有些功能要么编译进内核,要么不编译
      3、ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;是一个简装版的根文件系统;借助ramdisk能够加载的内容:
        目标设备驱动,例如SCCI设备的驱动;
        逻辑设备驱动,例如LVM设备的驱动;
        文件系统,例如xfs文件的系统;

    内核信息获取:
      uname命令:uname- print system information
      格式:uname [OPTION]...
      -a 显示所有信息
      -n 显示主机名
      -r 显示内核release号
      -v 显示内核version号

    内核模块信息获取和管理:
      lsmod命令:
      lsmod- program to show the status of modules in the Linux Kernel 显示内核已装载的模块
      显示的内容来自于/proc/modules

      modinfo命令:
      modinfo- program to show information about a Linux Kernel module显示指定内核模块的详细信息
      格式:modinfo[-F field] [-k kernel] [modulename|filename...]
      -F field 仅显示指定字段的信息
      -n 显示该模块的详细路径
      -a author显示作者名字
      -d description显示描述信息
      -l license  显示授权信息
      -k 显示指定内核版本对应的模块信息

      modprobe命令:
      modprobe- Add and remove modules from the Linux Kernel 装载和卸载内核模块
      格式:modprobe[ -C confile-file] [modulename] [moduleparame-ters…]
      配置文件:/etc/modprobe.conf  /etc/modprobe.d/*.conf
      模块的动态装载:modprobe module_name
      模块的动态卸载:modprobe -r module_name
      注意:对正在使用的模块不要轻易卸载;此命令可以自动解决模块间的依赖关系;

      depmod命令:
      depmod- program to generate modules.dep and map files. 内核模块依赖关系及系统信息映射文件的生成工具;
     如果模块间的依赖关系文件被损坏(/lib/modules/3.10.0-514.el7.x86_64/modules.dep),可以通过该命令去生成新的模块依赖关系文件,但是该文件不会真正被使用而是将其编译为*.dep.bin的二进制文件方便查询和使用;该命令还会生成/boot/Sys.map-Version-Release文件,该文件是对应版本内核所支持库文件的映射关系
    格式:depmod[-Anea]
      -A 主动去分析目前核心的模块,并重新写入 modules.dep
      -n 分析结果不写入modules.dep,而是输出到屏幕
      -e 显示目前已经加载但不可执行的模块名称
      -a 分析所有模块

      模块装载卸载的另外一种方式:不会自动解决模块间的依赖关系
      insmod命令:
      insmod - simple program to insert a moduleinto the Linux Kernel
      格式: insmod[ filename ] [ module options... ]
         filename:模块文件的文件路径;(内核模块的绝对路径,一般以.ko文件结尾)
      rmmod命令:
      rmmod- simple program to remove a module from the Linux Kernel
      格式:rmmod [module_name]

    ramdisk文件的制作:
      1、mkinitrd命令:为当前使用中的内核重新制作ramdisk文件
      格式:mkinitrd [OPTION...][<initrd-image>] <kernel-version>
      --with=<module> 除了默认的模块之外额外需装载到initramfs中的模块(添加某个模块到initrd中)
      --preload=<module> initramfs所提供的模块需要预先装载的模块
      示例:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

      2、dracut命令:
      dracut- low-level tool forgenerating an initramfs image
      格式:dracut [OPTION...][<image> [<kernel version>]]
      示例:dracut /boot/initramfs-$(uname -r).img $(uname-r)  用法和mkinitrd一样

    /proc目录:
      内核状态和统计信息的输出接口,以及可配置参数配置接口(/proc/sys/)
      只读:内核状态和统计信息的输出
      只写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置(/proc/sys/)

      sysctl命令:用于查看或设定/proc/sys/目录中诸多参数
      格式:sysctl [options] [variable[=value]]
      查看:
        sysctl -a  显示所有参数设置的值
        sysctl Variable  显示指定参数名的值
      修改:
        sysctl -w Variable=value
       示例:sysctl -w kernel.hostname=mail.magedu.com
       说明:红色部分指定的参数名与/proc/sys/目录下文件同名,以点号隔开表示下一级目录
      修改查看还可以通过以下方式实现:
        查看:
        cat /proc/sys/kernel/hostname
        修改:
        echo "mail.magedu.com" > /proc/sys/kernel/hostname

      sysctl的配置文件:/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目录:
      输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对某些参数的修改,用来设置调整硬件设备的工作特性
      udev就是通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadmin,hotplug;udev为设备创建文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d/和/usr/lib/udev/rules.d/目录下

    screen命令:
      一个终端下打开多个屏幕,并剥离屏幕与终端的关系,终端关闭也不会影响屏幕下的进程
      打开screen:screen
      拆除screen:Ctrl+a,d
      列出screen:screen -ls
      连接指定screen:screen -r SCREEN_ID
      关闭screen: exit

    编译内核:
      1、准备好开发环境
      2、获取目标主机上的硬件设备的相关信息
      3、获取到目标主机系统的功能的相关信息,例如要启用的文件系统
      4、获取内核源代码包:www.kernel.org

      开发环境准备:
      Centos6.6:
        包组:Development Tools、Server Platform Development
      Centos 7:
        包组:Development Tools、Server Platform Development
        包:ncures-devel

      获取目标主机上硬件设备的相关信息:
      CPU:
        cat /proc/cpuinfo
        lscpu
        x86info -a x86info需要先手动安装才能使用
      PCI设备:
        lspci
          -v 详细显示pci信息
          -vv
        lsusb
          -v 详细显示usb信息
          -vv
        lsblk
        hal-device 显示全部硬件设备信息

    示例1:Centos 6上linux-3.10内核编译过程:
      1、准备好开发环境,安装好“Development Tools”“Server Platform Development”组件;
      yum groupinstall "Development Tools"
      yum groupinstall "Server Platform Development"
      2、从kernel官网上下载内核源代码;
      wget https://mirrors.edge.kernel.org/pub/linux/kernel/v3.0/linux-3.10.tar.xz
      3、下载好内核之后将文件解压缩至/usr/src目录;
      tar -Jxvf linux-3.10.tar.xz -C /usr/src/
      4、创建链接文件; (默认内核源码/usr/src/linux,所有要创建linux软链接文件链接到真实文件夹)
      cd /usr/src/
      ln -s linux-3.10 linux
      5、准备.config配置文件;
      cp /boot/config-2.6.32-431.el6.x86_64 /usr/src/linux/.config
     6、配置内核选项;
      cd /usr/src/linux
      make menuconfig
      给内核加一个名称,依次选中Generalsetup-->Local version – append to kernel release;

    此处填写的名字不能有空格

      选择启动的内核模块,在打开这个配置的第一个界面依次选择File systems -->DOS/FAT/NT file systems-->NTFS file systemssupport,如图所示,利用空格键选中,[]表示不编译,[M]表示编译至模块中,[*]表示编译至内核中。本次测试选中NTFS模块;

     

      退出保存,比较配置前后区别;

      7、安装编译;
      编译内核,可使用make –j #指定编译线程数量,因为远程编译可能终端断开就前功尽弃了,所以 使用screen命令就可以不用担心编译中断了;
      make -j 4
      安装内核模块
      make modules_install
      安装内核;最后一步在虚拟机里出现报错,为can’tfind modules…可忽略
      make install

      8、编辑grub配置文件,将default=1改为default=0,随后重启系统

  • 相关阅读:
    10条建议帮助你创建更好的jQuery插件
    jQuery的end()方法使用详解
    jquery合并表格中相同文本的相邻单元格
    jQuery动态星级评分效果实现方法
    jQuery过滤HTML标签并高亮显示关键字的方法
    jQuery实现高亮显示网页关键词的方法
    深入.net调用webservice的总结分析
    C#中遍历各类数据集合的方法总结
    asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)
    使用交叉验证对鸢尾花分类模型进行调参(超参数)
  • 原文地址:https://www.cnblogs.com/Link-Luck/p/9859074.html
Copyright © 2011-2022 走看看