Linux Kernel:
     
        CentOS启动流程:POST --> Bootloader(BIOS, MBR) --> Kernel(initrd) --> rootfs --> switch_root --> /sbin/init
            root    (hd0,0)
            kernel
            initrd
             
        ldd命令:
                - print shared library dependencies
                ldd [OPTION]... FILE...
                 
    内核设计体系:单内核、微内核
        Linux:单内核设计,但充分借鉴了微内核体系的设计的优点;为内核引入了模块化机制;
            内核的组成部分:
                kernel:内核核心,一般为bzImage,通常位于/boot目录,名称为vmlinuz-VERSION-release;
                kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/
                    内核模块与内核核心版本一定要严格匹配;
                     
                    [   ]:N
                    [M]:Module
                    [*]:Y,编译进内核核心
                     
                    内核:动态装载和卸载;
                     
                ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;
                    目标设备驱动,例如SCSI设备的驱动;
                    逻辑设备驱动,例如LVM设备的驱动;
                    文件系统,例如xfs文件系统;
                     
                    ramdisk:是一个简装版的根文件系统;
                     
        内核信息获取:
            uname命令:
                - print system information
                 
                格式:uname [OPTION]...
                    -r:内核的release号
                    -n:主机名
                     
                文件:/boot/vmlinuz-VERSION-release
                     
        模块信息获取和管理:
             
            lsmod命令:
                - Show the status of modules in the Linux Kernel
                 
                显示的内核来自于/proc/modules
                 
            modinfo命令:
                - Show information about a Linux Kernel module
                 
                modinfo [-F field] [-k kernel] [modulename|filename...]
                    -F field: 仅显示指定字段的信息;
                    -n:显示文件路径;
                     
            modprobe命令:
                - Add and remove modules from the Linux Kernel
                 
                格式:modprobe  [-r]  module_name
                    模块的动态装载:modprobe  module_name
                    动态卸载:modprobe  -r  module_name
                     
            depmod命令:
                - Generate modules.dep and map files.
                 
                内核模块依赖关系文件的生成工具;
                 
            模块的装载和卸载的另一组命令:
                insmod命令:
                    insmod  [filename]  [module options...]
                        filename:模块文件的文件路径;
                     
                rmmod命令:
                    rmmod  [module_name]
                     
        ramdisk文件的管理:
            (1) mkinitrd命令
                为当前使用中的内核重新制作ramdisk文件:
                    # mkinitrd [OPTION...] [<initrd-image>] <kernel-version>
                        --with=<module>:除了默认的模块之外需要装载至initramfs中的模块;
                        --preload=<module>:initramfs所提供的模块需要预先装载的模块;
                     
                    示例: ~]# mkinitrd  /boot/initramfs-$(uname -r).img   $(uname -r)
             
            (2) dracut命令
                 - low-level tool for generating an initramfs image
                    # dracut [OPTION...] [<image> [<kernel version>]]
                     
                    示例: ~]# 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/目录下;
                 
         
回顾:内核
     
    内核的组成部分:kernel, kernel object, ramdisk
        kernel: uname
        kernel object: lsmod, modinfo, modprobe, insmod, rmmod, depmod
        ramdisk:mkinitrd, dracut
         
    启动流程: POST --> BootSequence(BIOS) --> Bootloader (MBR) --> kernel (ramdisk) --> rootfs (switch_root) --> /sbin/init (/etc/inittab, /etc/init/*.conf, /usr/lib/systemd/system/)--> 默认运行级别、系统初始化、关闭及启动服务、启动终端(图形终端)
     
    grub:
        1st stage:mbr
        1_5 stage: mbr之后的扇区
        2nd stage:/boot/grub/
             
        加密:编辑、内核
     
编译内核:
     
    程序包的编译安装:
        ./configure, make, make install
         
    前提:开发环境(开发工具,开发库),头文件:/usr/include
     
    开源:源代码 --> 可执行格式
        发行版:以“通用”的目标;
         
    前提:
        (1) 准备好开发环境;
        (2) 获取目标主机上硬件设备的相关信息;
        (3) 获取到目标主机系统功能的相关信息,例如要启用的文件系统;
        (4) 获取内核源代码包:www.kernel.org
         
        准备开发环境:
            CentOS 6.7:
                包组:
                    Development Tools
                    Server Platform Development
                     
            CentOS 7:
                包组:
                    Development Tools
                    Server Platform Development
                     
                包:
                    ncurses-devel
                     
        获取目标主机上硬件设备的相关信息:
            CPU:
                ~]# cat  /proc/info
                ~]# lscpu
                ~]# x86info -a
                 
            PCI设备:
                ~]# lspci
                    -v
                    -vv
                     
                ~]# lsusb
                    -v
                    -vv
                     
                ~]# lsblk
                 
            了解全部硬件设备信息:
                ~]# hal-device
                 
        内核编译过程:
            步骤:
                ~]# tar  xf  linux-3.10.67.tar.xz  -C  /usr/src
                ~]# cd  /usr/src
                ~]# ln  -s  linux-3.10.67  linux
                ~]# cd  linux
                 
                ~]# make menuconfig         配置内核选项
                ~]# make  [-j #]            编译内核,可使用-j指定编译线程数量
                ~]# make modules_install    安装内核模块
                ~]# make install            安装内核
                 
                重启系统,选择使用新内核;
                 
            screen命令:
                打开screen: ~]# screen
                拆除screen: Ctrl+a, d
                列出screen: ~]# screen  -ls
                连接至screen: ~]# screen  -r   SCREEN_ID
                关闭screen:  ~]# exit
         
        过程的详细说明:
            (1)  配置内核选项
                支持“更新”模式进行配置:在已有的.config文件的基础之上进行“修改”配置;
                    (a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;
                    (b) make  menuconfig:基于cureses的文本配置窗口;
                    (c) make  gconfig:基于GTK开发环境的窗口界面;  包组“桌面平台开发”
                    (d) make  xonfig:基于QT开发环境的窗口界面;
                支持“全新配置”模式进行配置:
                    (a) make  defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;
                    (b) make   allnoconfig:所有选项均为“no”;
                     
            (2) 编译
                  
                 (a) 多线程编译:make  [-j #]
                 (b) 编译内核中的一部分代码:
                    (i) 只编译某子目录中的相关代码:
                        # cd  /usr/src/linux
                        # make  path/to/dir/
                         
                    (ii)只编译一个特定的模块
                        # cd  /usr/src/linux
                        # make  path/to/dir/file.ko
                (c) 如何交叉编译:
                    目标平台与当前编译操作所在的平台不同;
                     
                    # make  ARCH=arch_name
                     
                    要获取特定目标平台的使用帮助:                
                        # make  ARCH=arch_name help
                         
            (3) 如何在执行过编译操作的内核源码树上做重新编译:
                事先清理操作:
                    # make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;
                    # make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;
                    # make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;

【Linux】【Basis】Kernel的更多相关文章

  1. 【Linux探索之旅】第二部分第二课:命令行,世界尽在掌握

    内容简介 1.第二部分第二课:命令行,世界尽在掌握 2.第二部分第三课预告:文件和目录,组织不会亏待你 命令行,世界尽在掌握 今天的标题是不是有点霸气侧漏呢? 读者:“小编,你为什么每次都要起这么非主 ...

  2. 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见

    内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是 ...

  3. 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍

    两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux  ps1 menu choice Multiselect 传教士 菜单 powe ...

  4. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 .第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的吗 ...

  5. 【Linux探索之旅】开宗明义+第一部分第一课:什么是Linux?

    内容简介 1.课程大纲 2.第一部分第一课:什么是Linux? 3.第一部分第二课预告:下载Linux,免费的噢!   开宗明义 我们总听到别人说:Linux挺复杂的,是给那些追求逼格的程序员用的.咱 ...

  6. 【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

    RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [ ...

  7. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  8. 【Linux/unix网络编程】之使用socket进行TCP编程

    实验一 TCP数据发送与接收 [实验目的] 1.熟练掌握套接字函数的使用方法. 2.应用套接字函数完成基本TCP通讯,实现服务器与客户端的信息交互. [实验学时] 4学时 [实验内容] 实现一个服务器 ...

  9. 【Linux探索之旅】第一部分第二课:下载Linux,免费的噢

    内容简介 1.第一部分第二课:下载Linux,免费的噢 2.第一部分第三课预告:测试并安装Ubuntu 下载Linux,免费的噢 大家好,上一课我们认识了非常“霸气侧漏”的Linux操作系统. 也知道 ...

  10. 【Linux探索之旅】第一部分第三课:测试并安装Ubuntu

    内容简介 1.第一部分第三课:测试并安装Ubuntu 2.第一部分第四课预告:磁盘分区 测试并安装Ubuntu 大家好,经过前两个比较偏理论(是否想起了带着瓜皮帽,手拿折扇的老学究,或者腐儒)的课程, ...

随机推荐

  1. MySQL高级篇 | 分析sql性能

    在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越来越 ...

  2. Java多线程| 01 | 线程概述

    Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...

  3. SqlServer修改某个字段的默认值时的操作步骤

    sqlserver有时候需要修改一个字段的默认值,却发现修改(update)不了,也删除(delete)不了,排查发现,需要先删除原有的默认值约束,才行:步骤如下1.2.3.若原来这个字段就没有默认值 ...

  4. mybatis中批量插入的两种方式(高效插入)

    MyBatis简介 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以使用 ...

  5. ES6基础知识(Generator 函数)

    1.next().throw().return() 的共同点 next().throw().return()这三个方法本质上是同一件事,可以放在一起理解.它们的作用都是让 Generator 函数恢复 ...

  6. 菜鸡的Java笔记 第二十三 - java 抽象类的概念

    abstractClass 抽象类的概念        1.抽象类的基本定义        2.抽象类的使用原则                不会抽象类与接口,java = 没学           ...

  7. 那一天,我被Redis主从架构支配的恐惧

    面试官:要不你来讲讲你最近在看的点呗?可以拉出来一起讨论下(今天我也不知道要问什么) 候选者:最近在看「Redis」相关的内容 面试官:嗯,我记得已经问过Redis的基础和持久化了 面试官:要不你来讲 ...

  8. 搜索系统核心技术概述【1.5w字长文】

    前排提示:本文为综述性文章,梳理搜索相关技术,如寻求前沿应用可简读或略过 搜索引擎介绍 搜索引擎(Search Engine),狭义来讲是基于软件技术开发的互联网数据查询系统,用户通过搜索引擎查询所需 ...

  9. [hdu6978]New Equipments II

    显然可以费用流来做,具体建图如下-- 点集:源点,汇点,左边$n$​个工人,右边$n$​​​个设备 边集:源点向第$i$​个工人连$(1,a_{i})$​的边,第$i$​个设备向汇点连$(1,b_{i ...

  10. es基本概念

    电商实时数据分析平台需要学些什么?  [运营指标,流量指标,销售转化指标,客户价值指标,商品指标,营销指标,风险控制指标,市场竞争指标]等电商指标数据. 检索,数据更新,排序,分词,query等缓存机 ...