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 :显示所有信息

linux之内编译核_linux kernel


lsmod 命令:

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

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

modinfo 命令:

    显示模块的详细描述信息

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

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

        -p : 显示模块参数

        -a : author

        -d : description

        -l : license

    lsmod|grep xfs

    modinfo xfs

linux之内编译核_linux kernel_02


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

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

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

    modprobe [-r] modulename    卸载内核


depmod 命令:

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

装载或卸载内核模块


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

    insmod [filename] [module options...]

    insmod `modinfo -n exportfs`

    insmod `modinfo -n xfs`

rmmod 命令 :卸载模块

    rmmod [modulename]

    rmmod xfs

linux之内编译核_linux kernel_03



/proc 目录:

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

    参数 : 只读 :输出信息

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

/proc/sys

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

    sysctl -w path.to.parameter=VALUE

    sysctl -w kernel.hostname=nineven.com

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

    echo "VALUE" > /proc/sys/path/to/parameter

    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

常用的几个参数:

    net.ipv4.ip_forward 

    net.ipv4.icmp_echo_ignore_all 

    linux之内编译核_linux kernel_04

    vm.drop_caches #清空缓存

    linux之内编译核_linux kernel_05


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

    /etc/systclt.conf

    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 :

        cat /proc/cpuinfo

        lscpu

    PCI :

        lspci [-v|-vv]

        lsusb [-v|-vv]

        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以及编辑器备份文件



        


首先,先去官网下载一个内核,官网 https://www.kernel.org/

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

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


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

linux之内编译核_linux kernel_06

linux之内编译核_linux kernel_07

linux之内编译核_linux kernel_08

linux之内编译核_linux kernel_09

linux之内编译核_linux kernel_10

linux之内编译核_linux kernel_11

linux之内编译核_linux kernel_12


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

linux之内编译核_linux kernel_13

linux之内编译核_linux kernel_14

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

linux之内编译核_linux kernel_15

linux之内编译核_linux kernel_16

报错了,解决

linux之内编译核_linux kernel_17

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

linux之内编译核_linux kernel_18


linux之内编译核_linux kernel_19

linux之内编译核_linux kernel_20

linux之内编译核_linux kernel_21

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

linux之内编译核_linux kernel_22

linux之内编译核_linux kernel_23

进入系统查看

linux之内编译核_linux kernel_24

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

linux之内编译核_linux kernel_25

恩,已经成功实现该功能

转自:http://liuyuworld.com/2016/09/10/linux-%e4%b9%8b%e7%bc%96%e8%af%91%e5%86%85%e6%a0%b8/