博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【linux基础】20、内核的编译
阅读量:6814 次
发布时间:2019-06-26

本文共 8035 字,大约阅读时间需要 26 分钟。

一、一般src.rpm包的安装

  有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。

src.rpm包=源代码 + specs文件

             #specs文件是将源码制作成二进制格式的步骤文件

这类软件包有两种安装方法:

方法一: 

1)创建mockbuild普通用户

2)切换至mockbuild用户,而后安装src.rpm包   #会在mockbuild家目录下创建一个rpmbuild目录

   rpm -ivh NAME-VERSION.SRC.RPM

1
2
3
4
5
6
7
8
9
10
[root@Note3 ~]
# ls rpmbuild/
SOURCES  SPECS
[root@Note3 ~]
# cd rpmbuild/
[root@Note3 rpmbuild]
# ls SOURCES/
404.html      nginx-1.0.15.
tar
.gz      nginx-logo.png   ssl.conf
50x.html      nginx-auto-cc-gcc.patch  nginx.logrotate  virtual.conf
default.conf  nginx.conf               nginx.sysconfig
index.html    nginx.init               poweredby.png
[root@Note3 rpmbuild]
# ls SPECS/
nginx.spec

3)rpmbuild -bb|-ba ~/rpmbuild/SPECS/PACKAGE_NAME.spec

           -ba  编译后做成.rpm和src.rpm(又还原成刚下载的NAME-VERSION.SRC.RPM包格式)
           -bb  编译后做成.rpm

           -bp  只执行spec的%pre 段(解开源码包并打补丁,即只做准备)

1
2
[root@Note3 rpmbuild]
# ls
BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

SOURCES:存放了该包的源码包(压缩格式)

1
2
3
4
5
[root@Note3 rpmbuild]
# ls SOURCES/
404.html      nginx-1.0.15.
tar
.gz      nginx-logo.png   ssl.conf
50x.html      nginx-auto-cc-gcc.patch  nginx.logrotate  virtual.conf
default.conf  nginx.conf               nginx.sysconfig
index.html    nginx.init               poweredby.png

BUILD:源码包解压后的目录

1
2
3
[root@Note3 rpmbuild]
# ls BUILD/nginx-1.0.15
auto     CHANGES.ru  configure  html     
man     
src
CHANGES  conf        contrib    LICENSE  README

RPMS:为生成的.rpm包

1
2
[root@Note3 rpmbuild]
# ls RPMS/x86_64/
nginx-1.0.15-5.el6.x86_64.rpm  nginx-debuginfo-1.0.15-5.el6.x86_64.rpm

SPECS:存放SPECS文件的目录

1
2
[root@Note3 rpmbuild]
# ls SPECS/
nginx.spec

SRPMS:将源码包制作成.src.rpm

1
2
[root@Note3 rpmbuild]
# ls SRPMS/
nginx-1.0.15-5.el6.src.rpm

4)制作完成的rpm包位于:~/rpmbuild/RPMS

方法二: 

1)创建mockbuild普通用户,别切换至mockbuild   #不切换也可以,在家目录下生成rpmbuild目录

2)rpm -i your-package.src.rpm 
3
)rpmbuild -bp your-package.specs  

     -bp  #只执行spec的%pre 段(解开源码包并打补丁,即只做准备)

4)cd ~/rpmbuild/BUILD/your-package/    

5)./configure        #这一步和编译普通的源码软件一样,可以加上参数 
6)make 
7)make install

二、编译内核

RedHat官网的内核下载址:  .src.rpm 格式

Kernel官网:   .tar.gz 格式

   .src.rpm包安装一下就变成.tar.gz的源码包了

可能需要的模块很多,红帽或者centos提供的内核版本更通用(适用的硬件多)

1、获取并解压至/usr/src

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@Note3 ~]
# ls /usr/src
debug  kernels
[root@Note3 ~]
# tar xf linux-3.16.1.tar.xz -C /usr/src
[root@Note3 ~]
# cd /usr/src
[root@Note3 src]
# ls
debug  kernels  linux-3.16.1
[root@Note3 src]
# ln -sv linux-3.16.1/ linux    #创建一个链接,方便使用
"linux" 
-> 
"linux-3.16.1/"
[root@Note3 src]
# ls
debug  kernels  linux  linux-3.16.1
[root@Note3 src]
# cd linux
[root@Note3 linux]
# ls
arch     Documentation  init     lib          README          sound
block    drivers        ipc      MAINTAINERS  REPORTING-BUGS  tools
COPYING  firmware       Kbuild   Makefile     samples         usr
CREDITS  fs             Kconfig  mm           scripts         virt
crypto   include        kernel   net          security

2、配置内核特性

  配置内核编译时启用哪些功能(特性或模块),在系统中/boot/目录下有centos编译内核时使用的内核配置文件,我们可以使用这个模版来配置我们编译内核时的配置文件

配置文件中:

y:表示编译进核心

m:编译成模块

no set:不编译

make的选项(生成配置文件)

make config          #一项一项确定是否编译该特性

make allyesconfig      #全ye

make allnoconfig      #能选的都no,值编译必须的

make menuconfig       #使用文本窗口选择

make kconfig         #在KDE桌面环境下,并且安装了qt开发环境

make gconfig         #在gnome桌面环境下,并且安装了gtk开发环境

1
[root@Note3 linux]
# make menuconfig       #必须在当前目录下执行,且当前会话的界面足够大

  在使用make menuconfig这个命令后,会出现如下的字符界面,我们就可以在这个界面上对内核进行配置。

查看硬件信息(根据硬件信息选择驱动):

    lspci       #pci设备

    hal-device    #查看pci设备详细信息 

    lscpu

    lsusb

    lsblk       #块设备

    lshal        #相当于hal-device

    dmidecode     #查看BIOS中信息

注意:使用make menuconfig设置(如果你不是很熟)生成的配置文件,在内核编译时可能会出错,建议使用系统上的/boot/config 配置文件做模版使用。

1
2
3
4
[root@Note3 linux]
# ls /boot/config-2.6.32-431.el6.x86_64 
/boot/config-2
.6.32-431.el6.x86_64
[root@Note3 linux-3.16.1]
# cp /boot/config-2.6.32-431.el6.x86_64 .config
[root@Note3 linux-3.16.1]
# make menuconfig    #再使用make menuconfig修改自己需要的配置

3、编译内核

make     #默认使用一个线程编译

make -j N  #N为线程数(linux上显示的核心数)

1
[root@Note3 linux]
# make -j 4

4、安装模块

make modules_install


5、安装内核

make install

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@Note3 linux]
# ls /boot   #安装完成后
config-2.6.32-431.el6.x86_64         System.map
efi                                  System.map-2.6.32-431.el6.x86_64
grub                                 System.map-3.16.1
initramfs-2.6.32-431.el6.x86_64.img  vmlinuz
initramfs-3.16.1.img                 vmlinuz-2.6.32-431.el6.x86_64
lost+found                           vmlinuz-3.16.1
symvers-2.6.32-431.el6.x86_64.gz
 
[root@Note3 linux]
# cat /boot/grub/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=1
timeout=5
splashimage=(hd0,0)
/grub/splash
.xpm.gz
hiddenmenu
title CentOS (3.16.1)
    
root (hd0,0)
    
kernel 
/vmlinuz-3
.16.1 ro root=UUID=e0c0bc25-62e5-4896-8749-fce761bc3af7 rd_NO_LUKS rd_NO_LVM LANG=zh_CN.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    
initrd 
/initramfs-3
.16.1.img
title CentOS (2.6.32-431.el6.x86_64)
    
root (hd0,0)
    
kernel 
/vmlinuz-2
.6.32-431.el6.x86_64 ro root=UUID=e0c0bc25-62e5-4896-8749-fce761bc3af7 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    
initrd 
/initramfs-2
.6.32-431.el6.x86_64.img

6、检查、测试

检查grub.conf中是否已经有新内核配置项

重启系统以尝试使用新内核


注意:

1)screen命令的使用

screen可以在一个物理窗口上启动多个虚拟的小窗口

screen:打开一个新的screen

隐藏:Ctrl+a,d

重新打开隐藏的screen:

   显示各screen ID:screen -ls

        重新打开:screen -r Screen_ID

2)二次编译前要先做清理操作

make clean [all]   只清理编译生成的文件,但不删除配置文件.config

make mrproper  删除编译生成的文件和.config

make disclean  重置源代码树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@Note3 linux]
# ls init    #编译后会生成很多.o文件
built-
in
.mod.c      do_mounts_initrd.o  initramfs.o  modules.
builtin
built-
in
.o          do_mounts_md.c      init_task.c  modules.order
calibrate.c         do_mounts_md.o      init_task.o  mounts.mod.c
calibrate.o         do_mounts.o         Kconfig      mounts.o
do_mounts.c         do_mounts_rd.c      main.c       noinitramfs.c
do_mounts.h         do_mounts_rd.o      main.o       version.c
do_mounts_initrd.c  initramfs.c         Makefile     version.o
 
[root@Note3 linux]
# make clean
[root@Note3 linux]
# ls init/
calibrate.c  do_mounts_initrd.c  initramfs.c  main.c         version.c
do_mounts.c  do_mounts_md.c      init_task.c  Makefile
do_mounts.h  do_mounts_rd.c      Kconfig      noinitramfs.c

3)将编译后生成的文件放置于源码不同的路径

mkdir /path/to/somewhere

cd  /path/to/somewhere

./configure --ksource=/usr/src/linux   # --ksource指定源码文件目录,很少用这种方式


三、如何实现内核的部分编译

1.只编译某子目录下的相关代码

 cd /usr/src/linux

 make 子目录文件    例如:make drivers/net/

或者:

   make SUBDIR=arch/    #指定子目录

2.只编译部分模块

 make M=path/to/dir/      例如:make M=drivers/net/

3.只编译某一个模块

 make path/to/dir/module_name.ko  例如:make drivers/net/e1000/e1000.ko

4.将编译后的结果放置于别的目录中

 make O=/path/to/somewhere    #大写的字母O

交叉编译

   编译后的文件不是在本机使用,而是在别的机器上使用

make ARCH=架构

以arm为例:

   make ARCH=arm 默认编译文件

四、内核参数的查看与配置

可配置的内核参数都在/proc/sys/目录下:

kernel,net,vm(虚拟内存),fs

配置参数:

   echo "String" > /proc/sys/path/to/some_parameter

   sysctl -w variable=value   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@Note3 ~]
# cd /proc/sys/
[root@Note3 sys]
# ls
abi  crypto  debug  dev  fs  kernel  net  vm
[root@Note3 sys]
# ls net/ipv
ipv4/ ipv6/ 
[root@Note3 sys]
# ls net/ipv4/icmp_echo_ignore_
icmp_echo_ignore_all         icmp_echo_ignore_broadcasts
[root@Note3 sys]
# cat net/ipv4/icmp_echo_ignore_all 
0
[root@Note3 sys]
# echo 1 > net/ipv4/icmp_echo_ignore_all
[root@Note3 sys]
# cat net/ipv4/icmp_echo_ignore_all       #重启失效
1
 
 
[root@Note3 sys]
# sysctl -w net.ipv4.icmp_echo_ignore_all=0
net.ipv4.icmp_echo_ignore_all = 0
[root@Note3 sys]
# cat net/ipv4/icmp_echo_ignore_all
0

配置文件:/etc/sysctl.conf

让修改后的结果生效的方式:sysctl -p

kernel.hostname           设置主机名

net.ipv4.ip_forward         是否打开网络间转发,默认0,不打开

net.ipv4.icmp_echo_ignore_all  是否关闭ICMP包回应功能,默认0,回应

vm.drop_caches            是否清空buffers,cached,默认0,不清空,1表示都清空

五、硬件设备

硬件设备文件是如何产生的?

硬件设备:设备文件

  在内核2.4版本之前,设备文件都是在装系统时事先生成的总共有数万个(2W+),硬件探测是在内核展开,装载完成后就开始的,此时还没有根文件系统更没有/dev目录,

大大浪费

udev:是用户空间程序

  kenrel硬件探测过程在根文件系统挂载前就已经结束,启动udev daemon程序,要求内核重新探测硬件信息,并输出/sys目录由此udevadm工具就可以根据/sys目录中硬件信息给每个硬件创建设备文件了

udev rules:udev规则文件,用于定义udev如何创建设备文件的,/etc/udev/rules.d/

    kernel+initramfs(根文件系统所在设备的设备驱动模块)-->devtmps(用于在内核初始化时为基本设备创建设备文件的临时文件系统)


如何手动创建设备文件:

mknod

   mknod [option]... NAME YTPE [MAJOR MINOR]

   MAJOR:主设备号,表示设备类型

   MINOR:同一设备的不同文件

   选项:

       -m MODE:指定权限

    例子:

本文转自xiexiaojun51CTO博客,原文链接: http://blog.51cto.com/xiexiaojun/1884429,如需转载请自行联系原作者

       mknod -m 660 /dev/testdev b 100 0 

你可能感兴趣的文章
VMware下ubuntu上网设置(二)
查看>>
Maven3路程(三)用Maven创建第一个web项目(转)
查看>>
网站pr突然从0变成3了.一夜之间pr升到3了.
查看>>
php新手入门之PHP常用特殊运算符号
查看>>
Android Studio 使用NDK编译jni
查看>>
口字型网络建立HSRP
查看>>
PostgreSQL中如何判断某个SCHEMA是否存在。
查看>>
多线多IP交换机配置(华为交换机)
查看>>
Linux平台下PHP zip模块
查看>>
写其他进程的环境变量
查看>>
Visual Studio统计有效代码行数
查看>>
Qt连接Oracle数据库常见问题
查看>>
45个实用的JavaScript技巧、窍门和最佳实践
查看>>
sqlserver 2005 列字符串拼接
查看>>
TSharding源码阅读-MapperShardingInitializer
查看>>
【01】模板模式
查看>>
在C++中,内存分成5个区
查看>>
华为SDN技术注入联通云清洗业务 从源头拒绝DDoS攻击
查看>>
python 学习day4
查看>>
ofbiz中的类加载机制classloader
查看>>