Linux 自学笔记——内核管理初步及编译

  1. 云栖社区>
  2. 博客>
  3. 正文

Linux 自学笔记——内核管理初步及编译

技术小阿哥 2017-11-12 11:47:00 浏览667
展开阅读全文

Linux Kernel

       内核设计体系:单内核、微内核;

       内核的组成部分:

              1.Kernel:内核核心,一般为bzimage,通常位于/boot目录,名称为vmlinuz-VERSION-release

                wKiom1mxW_aSjXJuAAApC3T-ET4174.png-wh_50

              2.Kernel object:内核对象,即内核模块,一般放置于/lib/modules/VERSION-release/maninfo命令通过读取此文件的信息以显示相关信息;

              wKioL1mxW-KhQJdcAABHETCkeCE792.png-wh_50

             内核模块与内核核心版本一定要严格匹配;

             []N

             [M]Module,编译进模块中;

             [*]Y,编译进内核核心;

             内核特性:动态装载和卸载;

             Note:有些功能要么编译进内核,要么不编译

              3.ramdisk:辅助性文件,并非必须,这取决于内核是否能直接驱动rootfs所在的设备;

                     目标设备驱动,例如SCCI设备的驱动;

                     逻辑设备驱动,例如LVM设备的驱动;

                     文件系统,例如xfs文件的系统;

                     ramdisk:是一个简装版的根文件系统;

       ldd命令:

              ldd- print shared library dependencies    打印二进制应用程序所依赖的库文件;

              ldd[OPTION]... FILE...

              显示:1.所依赖库文件名称=>所依赖库文件路径(对应内存载入符号链接映射指向)

                         2.整个系统调用库的入口

              wKioL1mxW_HjDc8ZAAAj1d10Sxs331.png-wh_50

内核信息获取:

       uname命令:

              uname- print system information

              格式:  uname [OPTION]...

              wKioL1mxW_vj5GB7AAA5e4gNGKo898.png-wh_50

              -a:显示所有信息

              -n:显示主机名;

              -r:显示内核的release号;

              -v:显示内核版本号;

              wKiom1mxXCbw2guiAAAvqvmV4aU435.png-wh_50

              文件:/boot/vmlinuz-VERSION-release

模块信息获取和管理:

       lsmod命令:

              lsmod- program to show the status of modules in the Linux Kernel 显示由内核已经装载的内核模块;

              wKioL1mxXA-yT8ktAABsmlO02sY438.png-wh_50

              显示的内容来自于/proc/modules

              wKioL1mxXBvgkmSsAACRueNOMr4770.png-wh_50

       modinfo命令:

              modinfo- program to show information about a Linux Kernel module显示内核模块的详细信息

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

                     -F  field:仅显示指定字段的信息;

                     -n:显示文件路径;

                     -aauthor

                     -ddescription

                     -llicense

                     -k:显示指定的内核版本模块

                     wKiom1mxXEegTSUQAABlCsPtbp0145.png-wh_50

       modprobe命令:

              -Add and remove modules from the Linux Kernel

              modprobe[ -C confile-file] [modulename] [moduleparame-ters…]

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

              wKiom1mxXFGDahenAAAVscbdvfg050.png-wh_50

              格式:modprobe  [-r]  module_name

              模块的动态装载:modprobe   module_name

              动态卸载:modprobe   -r module_name

              wKioL1mxXDvANtDUAAAb7PWQd7U705.png-wh_50

              Note:对正在使用的模块不要轻易卸载;此命令自动解决依赖关系;

       depmod命令:

              depmod- program to generate modules.dep and map files.

              内核模块依赖关系的生成工具;

              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中的模块;

--preload=<module>initramfs所提供的模块需要预先装载的模块;

       ~]#mkinitrd  /boot/initramfs-$(uname -r).img   $(uname -r)

       wKiom1mxXGiRx_UoAACaBtLiBlg767.png-wh_50

(2)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

wKioL1mxXFWgxgI9AAB_OZgnBSw094.png-wh_50

       参数:

              只读:信息输出,例如/proc/#/*

              只写:可接受用户指定一个“新值”来实现对内核某功能或特性的配置:/proc/sys/

                     /proc/sys

                            net/ipv4/ip_forward  相当于  net.ipv4.ip_forward

                     wKioL1mxXGSwtndqAACDXWIS7zQ795.png-wh_50

1)    sysctl命令:

专用于查看或设定/proc/sys目录下参数的值;

sysctl [options] [variable[=value]]

   查看:

          #sysctl -a

          wKiom1mxXJjSe3dDAABYFVtq-6w275.png-wh_50

          #sysctl  variable

          wKioL1mxXJGwliqAAAAOQxjByWo999.png-wh_50

   修改其值:

          #sysctl  -w  variable=value

2)    文件系统命令(catecho

查看:

   #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]

wKiom1mxXMGhr5MaAABtHOrks2A759.png-wh_50

       内核参数:

              net.ipv4.ip_forward:核心转发;

              vm.drop_caches

              kernel.hostname:主机名;

              net.ipv4.icmp_echo_ignore_all:忽略所有ping操作;

/sys目录;

wKiom1mxXNvydjeYAAAWrjiuSnQ767.png-wh_50

       sysfs:输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的可设置参数;对此些参数的修改,即可定制硬件设备工作特性;

       udev;通过读取/sys目录下的硬件设备信息按需为各硬件设备创建设备文件;udev是用户空间程序;专用工具:devadminhotplug

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

 

编译内核:

程序包的编译安装:

./configure, make,make install

前提:开发环境(开发工具,开发库),头文件:/usr/include

开源:源代码—>可执行格式

  发行版:以“通用”的目标;

前提:

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

              wKioL1mxXMexYgz4AABjTA1xngA102.png-wh_50

              ~]#lscpu

              wKioL1mxXNDClXXTAABEAQdI-10075.png-wh_50

              ~]#x86info –a x86info需要先手动安装才能使用

              wKiom1mxXPyxGi7MAABKLqli2vs761.png-wh_50

       PCI设备:

              ~]#lspci

                     -v:详细显示信息

                     -vv

              wKioL1mxXOnjeG0IAACtSR2wDd4769.png-wh_50

              ~]#lsusb

                     -v:详细显示usb信息

                     -vv

              wKioL1mxXPWCbfG8AABwkZf_-N8717.png-wh_50

              ~]#lsblk

              wKiom1mxXSKykU1MAAAijS1Yca8964.png-wh_50

       了解全部硬件设备信息:

              ~]#hal-device

内核编译过程:

1.    准备好开发环境,安装好“DevelopmentTools”“Server Platform Development”组件;

2.    kernel官网上下在内核;

wKioL1mxXQ7hLNwqAAA9mDNlD6c889.png-wh_50

3.    下载好内核之后将文件解压缩归档至/usr/src目录;

wKiom1mxXULw6kmAAABXpAdPyDs990.png-wh_50

4.    创建链接文件;

wKioL1mxXS2iG4HFAAA3gAL3SFc671.png-wh_50

5.    准备配置文件;

wKiom1mxXWCh26nuAABkx8-mksI943.png-wh_50

6.    配置内核选项;

wKioL1mxXVyAF0-DAACo4sSRGNM384.png-wh_50

1)给内核加一个名称,依次选中Generalsetup-->Local version – append to kernel release

wKioL1mxXWfCRq6BAAD7L3uTRww276.png-wh_50

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

wKiom1mxXa-RORJzAACMsyOYWfs776.png-wh_50

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

wKioL1mxXZmSJswDAABodMBHqLE560.png-wh_50

7.    安装编译;

    1)    编译内核,可使用make –j #指定编译线程数量,因为远程编译可能终端断开就前功尽弃了,所以 使用screen命令就可以不用担心编译中断了;

wKioL1mxXaXAJVJVAAEV_M9aS_0950.png-wh_50

    2)    安装内核模块;

wKiom1mxXdKDrFk4AADKkcdBvfM456.png-wh_50

3)    安装内核;最后一步在虚拟机里出现报错,为can’tfind modules…可忽略

#make install

     wKiom1mxXeOxix5RAAAUPPsVF5o118.png-wh_50

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

wKioL1mxXc6ysbZPAACam9wEWvo583.png-wh_50

 

 

screen命令:

打开screen~]# screen

拆除screen Ctrl+a, d

列出screen ~]# screen  -ls

连接至screen ~]# screen  -r  SCREEN_ID

关闭screen:  ]# exit

编译安装内核的详细说明:

1.    大概安装步骤:

        1)    安装开发包组 

        2)    下载源码文件

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

        4)    makemenuconfig:配置内核选项 

        5)    make[-j #]

        6)    makemodules_install:安装模块

        7)    makeinstall :安装内核相关文件 
         
安装bzImage为/boot/vmlinuz-VERSION-RELEASE(去boot目录下查看) 
          
生成initramfs文件

8)    编辑grub的配置文件

2.    配置内核选项

    支持“更新”模式进行配置:在已有的.config文件的基础之上进行修改配置;

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

b)    make menuconfig:基于cureses的文本配置窗口;

c)    make gconfig:基于GTK开发环境的窗口界面;

包组“桌面平台开发”

d)    make xonfig;基于QT开发环境窗口界面;

    支持“全新配置”模式进行配置:

a)    make defconfig:基于内核为目标平台提供的“默认”配置为模板进行配置;

b)    make allnoconfig:所有选项均为“no

3.    编译

        a)    多线程编译:make [-j #]

        b)    编译内核中的一部分代码:

 

            i只编译某子目录中的相关代码:

            # cd  /usr/src/linux

            # make  path/to/dir/

 

             ii只编译一个特定的模块:

            # cd /usr/src/linux

            # make path/to/dir/file.ko

            例如:只为e1000编译驱动:

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

        c)     如何交叉编译:

                目标平台与当前编译操作所在的平台不同;

                # make ARCH=arch_name

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

        # make ARCH=arch_name help

4.     如何在执行过编译操作的内核源码树上做重新编译:

事先清理操作:

# make clean:清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;

# make mrproper:清理编译生成的所有文件,包括配置生成的config文件及某些备份文件;

# make distclean:相当于mrproper,额外清理各种patches以及编辑器备份文件;



本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/1963550,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注