• Linux 之内核详解及编译


    内核编译原理详解:

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

    内核的组成部分:

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

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

                        [] :N      #没有选中

                        [M] : M    #模块化,不放到内核里

                        [*] : Y    #直接打到核心了

        辅助文件 :

                       ramdisk

                        initrd

                        initramfs

    运行中的内核:

        uname 命令:

            uname [options]...

                -n :显示节点名称

                -r :显示VERSION-RELEASE;

                -a :显示所有信息

    lsmod 命令:

        显示由核心已经装载的内核模块

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

    modinfo 命令:

        显示模块的详细描述信息

        modinfo [-k kernel] [modulename | filename ...]

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

            -p : 显示模块参数

            -a : author

            -d : description

            -l : license

    1. lsmod|grep xfs
    2. modinfo xfs

    modprobe 命令:装载或卸载内核模块

    modprobe [ -C config-file ] [modulename] [module parame-ters...]

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

    modprobe [-r] modulename    卸载内核

    depmod 命令:

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

    装载或卸载内核模块

    insmod 命令: 指定模块文件,不自动解决依赖模块

    1. insmod [filename] [module options...]
    2. insmod `modinfo -n exportfs`
    3. insmod `modinfo -n xfs`

    rmmod 命令 :卸载模块

    1. rmmod [modulename]
    2. rmmod xfs

    /proc 目录:

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

        参数 : 只读 :输出信息

            可写 : 可接受用户指定'新值'来实现对内核某功能或特性的配置

    /proc/sys

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

    1. sysctl -w path.to.parameter=VALUE
    2. sysctl -w kernel.hostname=nineven.com

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

    1. echo "VALUE" > /proc/sys/path/to/parameter
    2. echo "websrv" > /proc/sys/kernel/hostname

    sysctl 命令:

        默认配置文件: /etc/sysctl.conf

        (1) 设置某参数

    sysctl -w parameter=VALUE

        (2) 通过读取配置文件设置参数

    sysctl -p [/path/to/conf_file]

    内核中的路由转发:

    /proc/sys/net/ipv4/ip_forward

    常用的几个参数:

    1. net.ipv4.ip_forward 
    2. net.ipv4.icmp_echo_ignore_all 

        

    vm.drop_caches #清空缓存

        

    若果想永久生效,需要改配置文件 

    1. /etc/systclt.conf #修改并保存配置文件
    2. systctl -p  #重新读取配置文件,使之生效

    /sys 目录:

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

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

        专用工具 : udevadmin  hotplug

        udev 为设备创建设备文件时,会读取其事先定义好的规则文件,一般在 /etc/udev/rules.d 及 /usr/lib/udev/rules.d 目录下

    ramdisk 文件的制作:

        (1) mkinitrd 命令

            为当前正在使用的内核重新制作 ramdisk 文件

    mkinitrd /root/initramfs-`uname -r`.img `uname -r`

        (2) dracut 命令

            为当前正在使用的内核重新制作 ramdisk 文件

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

    编译内核操作 :

    前提:

        (1) : 准备好开发环境

        (2) : 获取目标主机上硬件设备的相关信息

        (3) : 获取目标主机系统功能的相关信息 

            例如 : 需要启用相应的文件系统

        (4) : 获取内核源代码包

            www.kernel.org

    开发包组(CentOS 6):

        Service Platform Development

        Development Tools

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

        CPU :

    1. cat /proc/cpuinfo
    2. lscpu

        PCI :

    1. lspci [-v|-vv]
    2. lsusb [-v|-vv]
    3. lsblk 块设备

    了解全部硬件设备信息

    hal-device

    内核编译安装系统:

    1. 安装开发包组

    2. 下载源码

    3. .config :准备文本配置文件

    4. make menuconfig :配置内核选项

    5. make [-j #]

    6. make modules_install :安装模块

    7. make install :安装内核相关文件

      1. 安装 bzImage 为 /boot/vmlinuz-VERSION-RELEASE

      2. 生成initramfs文件

      3. 编辑grub的配置文件



    编译安装内核的实例:

    1. tar xf linux-3.10.67.tar.xz -C /usr/src 
    2. cd /usr/src 
    3. ln -sv linux-3.10.67 linux 
    4. cd /usr/src/linux 
    5. cp /boot/config-$(uname -r)   ./.config 
    6. make help 
    7. make menuconfig 
    8. make -j 2
    9. make modules_install 
    10. make install 
    11. reboot 

    若中途出现错误,一定要及时解决,否则可能导致编译失败

    操作详解:

    (1)配置内核选项    

        支持"更新"模式进行配置:make help

            (a) make config : 基于命令行以遍历的方式去配置内核中可配置的每个选项

            (b) make menuconfig : 基于cruse的文本窗口界面

            (c) make gconfig : 基于GTK(GNOME)环境窗口界面

            (d) make xconfig : 基于QT(KDE)环境的窗口界面

        支持"全新配置"模式进行配置:  

            (a) make defconfig : 基于内核为目标平台提供的"默认"配置进行配置

            (b) make allyesconfig : 所有选项均回答为"yes"

            (c) make allnoconfig : 所有选项均回答为"no"

    (2)编译

        全编译: make [-j #] :#指cpu核心数

        编译内核的一部分功能:

            (a) 只编译某子目录中的相关代码:

                cd /usr/src/linux

                make dir/

            (b) 只编译一个特定的模块

                cd /usr/src/linux

                make dir/file.ko

                例如:只为e1000编译驱动

                    # drivers/net/ethernet/intel/e1000/e1000.ko

    如何交叉编译内核:

        编译的目标平台与当前平台不相同 : make ARCH=arch_name

    获取特定目标平台的使用帮助:

        make ARCH=arch_name help

        make ARCH=arm help

    如何重新编译内核:

        在已经执行过的编译操作的内核源码重新编译需要事先执行清理操作

            make clean : 清理大多数编译生成的文件,但会保留config文件等

            make mrproper : 清理所有编译生成的文件,config及某些备份文件

            make distclean : mrproper,patches以及编辑器备份文件



            

    首先,先去官网下载一个内核,官网 The Linux Kernel Archives

    我直接下载的是最新版的,下载链接如下 

    https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.7.3.tar.xz

    (1)先安装开发包组 Development tools

    参数自己可以修改,安装自己的需求,我新增了支持ntfs功能

    存储空间还可以,至少预留10G的空间,因为编译会生成好多临时文件

    报错了,解决

    恩,正在编译中,发现cpu快要爆了

     

    竟然消耗了8.2G的存储空间,太占空间了

    进入系统查看

    查看新增加的功能是否支持ntfs

    恩,已经成功实现该功能

     

  • 相关阅读:
    【编码译码】基于matlab QC-LDPC码编码和译码【含Matlab译码 2194期】
    保险业务管理系统(Java+Web+SSH+MySQL)
    反射的使用
    数据分析思维(一)|信度与效度思维
    1097 矩阵行平移 – PAT乙级真题
    利用Cpolar永久免费内网穿透软件实现IStoreOS安装与远程访问
    webpack的核心概念和作用
    尚品汇后台管理项目(Vue)
    40-Java方法重载、return关键字的单独使用
    设计模式再探——模板方法模式
  • 原文地址:https://blog.csdn.net/ly1358152944/article/details/126321049