Linux下编译build的命令,【linux基础】20、内核的编译

一、一般src.rpm包的安装

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

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

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

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

方法一:

1)创建mockbuild普通用户

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

rpm -ivh NAME-VERSION.SRC.RPM[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 段(解开源码包并打补丁,即只做准备)[root@Note3 rpmbuild]# ls

BUILD  BUILDROOT  RPMS  SOURCES  SPECS  SRPMS

SOURCES:存放了该包的源码包(压缩格式)[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:源码包解压后的目录[root@Note3 rpmbuild]# ls BUILD/nginx-1.0.15

auto     CHANGES.ru  configure  html     man     src

CHANGES  conf        contrib    LICENSE  README

RPMS:为生成的.rpm包[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文件的目录[root@Note3 rpmbuild]# ls SPECS/

nginx.spec

SRPMS:将源码包制作成.src.rpm[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

二、编译内核

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

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

1、获取并解压至/usr/src[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开发环境[root@Note3 linux]# make menuconfig       #必须在当前目录下执行,且当前会话的界面足够大

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

d57772025807a84fc12447198fe52b6e.png

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

lspci#pci设备

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

lscpu

lsusb

lsblk#块设备

lshal        #相当于hal-device

dmidecode#查看BIOS中信息

注意:使用make menuconfig设置(如果你不是很熟)生成的配置文件,在内核编译时可能会出错,建议使用系统上的/boot/config 配置文件做模版使用。[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上显示的核心数)[root@Note3 linux]# make -j 4

4、安装模块

make modules_install

5、安装内核

make install[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

splashp_w_picpath=(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重置源代码树[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[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:指定权限

例子:

mknod -m 660 /dev/testdev b 100 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值