本文共 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