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这个命令后,会出现如下的字符界面,我们就可以在这个界面上对内核进行配置。
查看硬件信息(根据硬件信息选择驱动):
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
Linux下编译build的命令,【linux基础】20、内核的编译相关推荐
- Linux下编译build的命令,Linux内核编译中build目录设置
配置参数 最近在分析yocto中名为poky的嵌入式自动构建系统.在对内核进行定制的时候,看到了一个在进行内核编译时挺有用的特性,之前(作为野生程序员的我)一直没有发现. 该特性就是将源码与编译工作目 ...
- linux下mq通道的命令,Linux下MQ的安装
Linux下MQ的安装 如果MQ的安装包是ISO,所以需要将ISO文件mount到Linux的一个目录下面,具体操作如下: 假如你选定的mount目录为根目录下mnt/下面,或者下面你新建一个目录可以 ...
- linux下的删除文件命令,Linux下删除文件命令
在linux中删除文件与文件夹我们可以直接使用rm就可以删除了,彻底删除文件或文件夹我们可以使用shred命令来完成,接下来是小编为大家收集的Linux下删除文件命令,希望能帮到大家. Linux下删 ...
- linux 下删除批量文件命令,linux 批量删除文件与空文件删除命令linux操作系统 -电脑资料...
在linux中删除文件与删除目录及删除空文章都是使用rm 命令了,执行rm指令可删除文件或目录,如欲删除目录必须加上参数\"-r\",否则预设仅会删除文件,下面我来介绍在linux ...
- linux 下删除批量文件命令,linux系统中批量删除文件与空文件删除的命令
linux命令在系统中有两种类型:内置Shell命令和Linux命令.接下来是小编为大家收集的linux系统中批量删除文件与空文件删除的命令,希望能帮到大家. linux系统中批量删除文件与空文件删除 ...
- linux下unzip解压命令,linux的unzip解压命令的详细解释
Linux中的unzip命令主要是用来解压zip格式的压缩文件.下面由学习啦小编为大家整理了Linux的unzip解压命令的详细解释,希望对大家有帮助! linux的unzip解压命令的详细解释 命令 ...
- linux 下安装gnu aspell命令,Linux spell命令
Linux spell命令 Linux spell命令可建立拼写检查程序. spell可从标准输入设备读取字符串,结束后显示拼错的词汇. 语法spell 实例 检查文件testfile是否有拼写错误, ...
- linux下的wc -l命令,Linux下wc工具的简单实现
wc工具是Linux下一款强大的统计字符数,单词数,行数的工具.其实实现挺简单的.我做了一简单的实现: #include #include #define LEN 4096 int text_c(FI ...
- Linux下编译build的命令,Linux命令行下编译Android NDK的示例代码
这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究Android NDK ...
- linux下有关phy的命令,linux – 如何为Debian安装b43-lpphy-installer?
b43-lpphy-installer是Ubuntu的包的名称,而不是Debian的包. 你可以在jessie(Debian 8)中使用命令安装它: sudo apt-get install firm ...
最新文章
- java.lang.ClassNotFoundException: Didn't find class org.apache.http.Protoco
- (区间dp 或 记忆化搜素 )Brackets -- POJ -- 2955
- windows10下pip安装速度慢的解决办法
- 报告 | 中国科学院发布地球大数据报告
- HBase参数配置及说明
- 太平洋大西洋水流问题如何解决?一文了解图在前端中的应用
- https://www.npmjs.com/package/lifecycle-webpack-plugin
- 视频会议平台Zoom市值近1200亿美元,投资人李嘉诚赚翻了
- 在线摩尔斯密码加密解密工具
- Siamese-RPN论文阅读
- 表格对角线两边打字_word单元格斜线 word表格中斜线表头制作过程及表头斜线两边打字怎么操作...
- Linux使用PulseAudio设置音频card的默认profile
- 系统内核溢出漏洞提权分析和防范
- 怎么用QQ截取右击出来的内容
- 加班费计算(节假日、补班)
- 最新计算机专业毕业设计论文选题源码演示录像下载(开题报告任务书PPT毕业答辩模板jsp352 cs拼图游戏的设计与实现
- qt window release 打包的方法及常见问题,不同路径的差异
- Python中的getter、setter、deleter
- matlab主要功能,matlab一些基本函数的功能
- Java给PDF文件生成骑缝章
热门文章
- idea基于spring boot的依赖分开打包
- 微信支付H5支付开发文档
- 常用正则表达 (转)
- Unity 游戏框架搭建 (七) 减少加班利器-QApp类
- Data Warehouse Hardware - DW硬件需求计算
- An internal error occurred during: “AppXray Indexing
- Writing for Myself.part2
- 在Visual Studio 2010中创建多项目(解决方案)模板之关键步骤【四】
- LeetCode-Add Binary
- VBA实战技巧精粹012:查找指定目录下的指定文件及Dir函数用法