§·编译内核:
※·程序包的编译安装:
./configure make make install
前提:开发环境(开发工具,开发库),头文件(/usr/include)
开源: 源代码开发—->可执行格式,(不同Linux的发行版以自己的理解,发行的软件不同)
发行版:以“通用”的目标,发行编译好的软件包。
由于发行版为了通用性,把软件的很多功能一同编译好发行。redhat公司后来有发行主包与分包 的可以解决部分用户对特定软件功能的需求,但是还是不够灵活。
※·编译内核:(Linux有C语言开发的)
前提:
1)准备好开发环境;
2)获取目标主机上硬件设备的相关信息;
3)获取目标主机系统功能的相关信息,例如启用的文件系统;
4)获取内核源代码包: www.kenel.org
※·准备开发环境:
Cenots 6 7
包组:
development tools <开发工具>
server platform development <服务器平台开发>
需要使用图形就安装 (桌面图形开发平台)
依赖有以下的包 ncurses包需要安装的
※·获取目标主机上硬件设备相关信息
1)获取目标主机上 CPU信息;
~]#cat /proc/info
~]#lscpu
~]#x86info软件包可以显示详细信息
注意:不需要收集内存信息,只需要内存多大即可。
2)PCI设备
~]#lspci 支持 –v -vv
[root@node1 ~]# lspci #显示PCI设备信息 00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (rev 01) 00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (rev 01) 00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 08) 00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) 00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) 00:07.7 System peripheral: VMware Virtual Machine Communication Interface (rev 10) 00:0f.0 VGA compatible controller: VMware SVGA II Adapter #显卡的设备型号 00:10.0 SCSI storage controller: LSI Logic / Symbios Logic 53c1030 PCI-X Fusion-MPT Dual Ultra320 SCSI (rev 01) #SISC的设备的型号 00:11.0 PCI bridge: VMware PCI bridge (rev 02) ............................................................. 00:18.7 PCI bridge: VMware PCI Express Root Port (rev 01) 02:00.0 Ethernet controller: Intel Corporation 82545EM Gigabit Ethernet Controller (Copper) (rev 01) #网卡 02:01.0 Multimedia audio controller: Ensoniq ES1371 / Creative Labs CT2518/ES1373 (rev 02) #声卡 [root@node1 ~]#
※·内核源代码包:
获取内核源代码包: www.kenel.org
※·内核编译过程:
◎·准备内核源码包
1.解压文件至 /usr/src/目录,内核编译时,由于如果新的硬件linux系统会自动到/usr/src/linux/下去查找驱动程序,所以我们需要创建一个连接文件 :ln -sv linux-3.10.67 linux.
[root@node1 linux-2.6.32.61]# ls arch COPYING crypto drivers fs init Kbuild lib Makefile net REPORTING-BUGS scripts sound usr block CREDITS Documentation firmware include ipc kernel MAINTAINERS mm README samples security tools virt [root@node1 linux-2.6.32.61]# pwd /usr/src/linux_bianyi/linux-2.6.32.61 [root@node1 linux-2.6.32.61]# 解释: arch : 平台相关 block : 块设备相关内核级代码 crypto : 加密库,各种加密算法 Documentation :帮助文档 drivers : 设备驱动 firmware : 主板硬件设备固件驱动 fs : 各种文件系统 init : 如何启动init文件的 ipc : 进程间通信 mm : 内存管理的 lib : 库文件 include : 头文件 samples : 事例 tools :内核自带工具 virt : 虚拟化
◎·使用make命令编译内核
步骤: ~]# tar xf linux-3.10.67.tar.xz -C /usr/src ~]#cd /usr/src ~]#ln linux-3.10.67 linux ~]#cd linux ~]#make menuconfig #配置内核选项 ~]#make [-j #] #编辑内核,可使用 -j 指定编译线程数量 ~]#make modules_install #安装内核模块 ~]#make install #安装内核 #内核文件路径:/usr/src/linux/arch/x86_64/boot,安装其实就是安装这个文件
make –help 查看帮助
make menuconfig : 菜单式编译界面
make xconfig : 图像编辑界面
make gconfig : 图像编辑界面
重启系统,选择使用新内核
准备模板文件:
1. Centos 提供了一个模板配置文件: /boot/config-3.10.0-229.el7.x86_64
拷贝模板文件:
cp /boot/config-3.10.0-229.el7.x86_64 /usr/src/linux/.config
1)配置内核选项:
支持“更新”模式进行配置,可以在原有 ./config 模板上进行“修改”配置
(a)make config:基于命令行以遍历的方式去配置内核中可配置的每个选项;
(b)make menuconfig : 基于cureses的文本配置窗口
(c)make gconfig :基于GTK开发环境的窗口界面,包组 “桌面平台开发”
(d)make xconfig : 基于QT开发环境的窗口界面;
支持“全新配置”模式进行配置:
(a)make defconfig :基于内核为目标平台的“默认”配置为模板进行配置;
(b)make allnoconfig : 所有选项均为:no
2)编译
(a)多线程编译: make 【-j #】 CPU多线程编译;
(b)编译内核中的一部分代码:
(1)只编译某子目录中的相关代码:
~]#cd /usr/src/linux
~]#make path/to/dir
(2)只编译一个模块:
编译好的一个模块,只能手动的复制到对应的目录下 /lib/modules
~]#cd /usr/src/linux
~]#make path/to/dir/fike.ko (默认是没有ko结尾的文件的,原名应该是.c文件)
(3)如何交叉编译:
目标平台与当前编译操作所在的平台不同:
#make ARCH=arch_name
要获取特定目标平台的使用帮助:
#make ARCH=arch_name help
如何在执行过编译操作的内核源码树上做从新编译:
事先清理操作:
~]# make clean :清理编译生成的绝大多数文件,但会保留config,及编译外部模块所需要的文件;
~]#make mrproper : 清理编译生成的所有文件,包括配置生成的config文件及其某些备份文件;
~]#make distclean : 相关于 mrproper,额外清理各种pathes及编辑器备份文件。
◎·内核编译指令详解
1.解压文件至 /usr/src/目录,内核编译时,由于如果新的硬件linux系统会自动到/usr/src/linux/下去查找驱动程序,所以我们需要创建一个连接文件 :ln -sv linux-3.10.67 linux.
#解压出来的源代码基本上都是 什么 *.c *.s *.h 文件,没有什么中间文件 .o的文件
[root@centos68 src]# tar -Jxvf linux-2.6.34.14.tar.xz linux-2.6.34.14/tools/perf/util/sigchain.h linux-2.6.34.14/tools/perf/util/sort.c linux-2.6.34.14/tools/perf/util/sort.h linux-2.6.34.14/tools/perf/util/strbuf.c linux-2.6.34.14/tools/perf/util/strbuf.h linux-2.6.34.14/tools/perf/util/string.c linux-2.6.34.14/tools/perf/util/string.h linux-2.6.34.14/tools/perf/util/strlist.c linux-2.6.34.14/tools/perf/util/strlist.h linux-2.6.34.14/tools/perf/util/svghelper.c linux-2.6.34.14/tools/perf/util/svghelper.h linux-2.6.34.14/tools/perf/util/symbol.c linux-2.6.34.14/tools/perf/util/symbol.h linux-2.6.34.14/tools/perf/util/thread.c linux-2.6.34.14/tools/perf/util/thread.h linux-2.6.34.14/tools/perf/util/trace-event-info.c linux-2.6.34.14/tools/perf/util/trace-event-parse.c linux-2.6.34.14/tools/perf/util/trace-event-read.c linux-2.6.34.14/tools/perf/util/trace-event-scripting.c linux-2.6.34.14/tools/perf/util/trace-event.h linux-2.6.34.14/tools/perf/util/types.h linux-2.6.34.14/tools/perf/util/usage.c linux-2.6.34.14/tools/perf/util/util.c linux-2.6.34.14/tools/perf/util/util.h linux-2.6.34.14/tools/perf/util/values.c linux-2.6.34.14/tools/perf/util/values.h linux-2.6.34.14/tools/perf/util/wrapper.c linux-2.6.34.14/usr/ linux-2.6.34.14/usr/.gitignore linux-2.6.34.14/usr/Kconfig linux-2.6.34.14/usr/Makefile linux-2.6.34.14/usr/gen_init_cpio.c linux-2.6.34.14/usr/initramfs_data.S linux-2.6.34.14/usr/initramfs_data.bz2.S linux-2.6.34.14/usr/initramfs_data.gz.S linux-2.6.34.14/usr/initramfs_data.lzma.S linux-2.6.34.14/virt/ linux-2.6.34.14/virt/kvm/ linux-2.6.34.14/virt/kvm/Kconfig linux-2.6.34.14/virt/kvm/assigned-dev.c linux-2.6.34.14/virt/kvm/coalesced_mmio.c linux-2.6.34.14/virt/kvm/coalesced_mmio.h linux-2.6.34.14/virt/kvm/eventfd.c linux-2.6.34.14/virt/kvm/ioapic.c linux-2.6.34.14/virt/kvm/ioapic.h linux-2.6.34.14/virt/kvm/iodev.h linux-2.6.34.14/virt/kvm/iommu.c linux-2.6.34.14/virt/kvm/irq_comm.c linux-2.6.34.14/virt/kvm/kvm_main.c [root@centos68 src]#
#解压内核源代码的文件大小为 443M
[root@centos68 linux-2.6.34.14]# du -h --max-depth=1 16M ./Documentation 2.1M ./scripts 140K ./init 19M ./include 18M ./net 4.3M ./kernel 496K ./block 1.6M ./crypto 52K ./usr 20M ./sound 108K ./samples 1.4M ./lib 1.4M ./security 116M ./arch 1.6M ./tools 31M ./fs 216K ./ipc 2.0M ./mm 5.7M ./firmware 156K ./virt 205M ./drivers 443M . [root@centos68 linux-2.6.34.14]#
#相关文件的目录的说明
[root@node1 linux-2.6.32.61]# pwd /usr/src/linux_bianyi/linux-2.6.32.61 [root@node1 linux-2.6.32.61]# 解释: arch : 平台相关 block : 块设备相关内核级代码 crypto : 加密库,各种加密算法 Documentation :帮助文档 drivers : 设备驱动 firmware : 主板硬件设备固件驱动 fs : 各种文件系统 init : 如何启动init文件的 ipc : 进程间通信 mm : 内存管理的 lib : 库文件 include : 头文件 samples : 事例 tools :内核自带工具 virt : 虚拟化
步骤:
~]# tar xf linux-3.10.67.tar.xz -C /usr/src #解压内核源代码到目录 ~]#cd /usr/src #进入到该目录 ~]#ln linux-3.10.67 linux #创建Linux连接 ~]#cd linux #进入到链接文件目录
◎·保存干净的源代码
make mrproper :此前没有编译过,将会清除所有生成的文件,包括配置文件.config
make clear : 仅会删除类似目标文件之类的编译过程产生的中间文件,而不会删除配置文件
了解了硬件相关的数据后,我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次编译, 但是我们不清楚到底下载下来的原始码当中有没有保留目标文件 (*.o) 以及相关的配置文件存在, 此时我们可以透过底下的方式来处理掉这些『编译过程的目标文件以及配置文件』:
#能不能认为正常的源代码中是没有 .o文件的,也就是说,如果编译后,有生成的文件大部分为配置文件和.o文件.
C程序的源代码文件为 .c 结尾的文件,通常情况下 .o文件为gcc编译过程中生成的临时文件。
◎·make menuconfig
· 『左右箭头键』:可以移动最底下的 <Select>, <Exit>, <Help>项目;
· 『上下箭头键』:可以移动上面大框框部分的反白光柱,若该行有箭头 (—>) 则表示该行内部还有其他细项
需要来设定的意思;
· 选定项目:以『上下键』选择好想要设定的项目之后,并以『左右键』选择 <Select> 之后, 按下『 Enter 』
就可以进入该项目去作更进一步的细部设定啰;
· 可挑选之功能:在细部项目的设定当中,如果前面有 [ ] 或 < > 符号时,该项目才可以选择, 而选择可以
使用『空格键』来选择;
· 若为 [*] <*> 则表示编译进核心;若为 <M> 则表示编译成模块! 尽量在不知道该项目为何时,且有模块
可以选,那么就可以直接选择为模块啰!
· 当在细项目选择 <Exit> 后,并按下 Enter ,那么就可以离开该细部项目啰!
启动一个图形界面,方便我们选择相应的模块
◎·make [ -j #]
[root@study linux-3.10.89]# make vmlinux <==未经压缩的核心 [root@study linux-3.10.89]# make modules <==仅核心模块 [root@study linux-3.10.89]# make bzImage <==经压缩过的核心(预设) [root@study linux-3.10.89]# make all <==进行上述的三个动作 [root@study linux-3.10.89]# make -j 4 clean <==先清除暂存档 [root@study linux-3.10.89]# make -j 4 bzImage <==先编译核心 [root@study linux-3.10.89]# make -j 4 modules <==再编译模块 [root@study linux-3.10.89]# make -j 4 clean bzImage modules <==连续动作!
开始编译核心 和 核心模块:编译核心和核心模块就是在 make menuconfig中自己选择的功能或编译进核心,把部分功能做成模块,把某个功能从核心中取出掉等等。
#编译好当前目录的文件大小
[root@centos68 linux]# du -h --max-depth=1 18M ./Documentation 3.4M ./scripts 3.6M ./init 24M ./include 510M ./net 86M ./kernel 13M ./block 33M ./crypto 4.5M ./usr 243M ./sound 108K ./samples 6.6M ./.tmp_versions 19M ./lib 16M ./security 271M ./arch 1.6M ./tools 346M ./fs 5.3M ./ipc 37M ./mm 7.5M ./firmware 2.1M ./virt 2.6G ./drivers 4.9G . [root@centos68 linux]#
◎·make modules_install (安装编译好的模块)
编译生成的模块路径文:执行编译安装的目录下
使用的 install 命令 根据 makefile文件的内容执行复制内核模块到指定的目录下。
安装模块前有个地方得要特别强调喔!我们知道模块是放置到 /lib/modules/$(uname -r) 目录下的,那
如果同一个版本的模块被反复编译后来安装时,那如何解决内核版本一直的问题呢?
1.把旧版本的目录 /lib/modules/$(uname -r) 改名,再使用 make modules_install 安装新的模块;
2.编译的时候选择 General setup 内的 Local version 修改成新的名称,生成的模块目录就与原来的不一样
#没有编译之前,解压源文件后查看 /usr/src/linux-2.6.34.14/drivers/xen
该目录没有任何的 的 .0文件
[root@centos68 xen]# pwd /usr/src/linux-2.6.34.14/drivers/xen [root@centos68 xen]# ll total 120 -rw-rw-r--. 1 root root 14919 Jan 17 2013 balloon.c -rw-rw-r--. 1 root root 2069 Jan 17 2013 cpu_hotplug.c -rw-rw-r--. 1 root root 21911 Jan 17 2013 events.c -rw-rw-r--. 1 root root 12140 Jan 17 2013 evtchn.c -rw-rw-r--. 1 root root 762 Jan 17 2013 features.c -rw-rw-r--. 1 root root 14562 Jan 17 2013 grant-table.c -rw-rw-r--. 1 root root 2088 Jan 17 2013 Kconfig -rw-rw-r--. 1 root root 403 Jan 17 2013 Makefile -rw-rw-r--. 1 root root 5723 Jan 17 2013 manage.c -rw-rw-r--. 1 root root 9352 Jan 17 2013 sys-hypervisor.c drwxrwxr-x. 2 root root 4096 Jan 17 2013 xenbus -rw-rw-r--. 1 root root 5560 Jan 17 2013 xencomm.c drwxrwxr-x. 2 root root 4096 Jan 17 2013 xenfs
#在编译以后,再来查看相同目录下的文件夹
[root@centos68 xen]# pwd /usr/src/kernels/linux/drivers/xen [root@centos68 xen]# ll total 3208 -rw-rw-r--. 1 root root 14919 Jan 17 2013 balloon.c -rw-r--r--. 1 root root 206680 Sep 11 14:09 balloon.o -rw-r--r--. 1 root root 1622944 Sep 11 14:09 built-in.o -rw-rw-r--. 1 root root 2069 Jan 17 2013 cpu_hotplug.c -rw-r--r--. 1 root root 55128 Sep 11 14:09 cpu_hotplug.o -rw-rw-r--. 1 root root 21911 Jan 17 2013 events.c -rw-r--r--. 1 root root 238679 Sep 11 14:09 events.o -rw-rw-r--. 1 root root 12140 Jan 17 2013 evtchn.c -rw-r--r--. 1 root root 254203 Sep 11 14:12 evtchn.ko -rw-r--r--. 1 root root 1920 Sep 11 14:10 evtchn.mod.c -rw-r--r--. 1 root root 54680 Sep 11 14:11 evtchn.mod.o -rw-r--r--. 1 root root 201229 Sep 11 14:09 evtchn.o -rw-rw-r--. 1 root root 762 Jan 17 2013 features.c -rw-r--r--. 1 root root 64834 Sep 11 14:09 features.o -rw-rw-r--. 1 root root 14562 Jan 17 2013 grant-table.c -rw-r--r--. 1 root root 183576 Sep 11 14:09 grant-table.o -rw-rw-r--. 1 root root 2088 Jan 17 2013 Kconfig -rw-rw-r--. 1 root root 403 Jan 17 2013 Makefile -rw-rw-r--. 1 root root 5723 Jan 17 2013 manage.c -rw-r--r--. 1 root root 113824 Sep 11 14:09 manage.o -rw-r--r--. 1 root root 0 Sep 11 14:09 modules.builtin -rw-r--r--. 1 root root 63 Sep 11 14:09 modules.order -rw-rw-r--. 1 root root 9352 Jan 17 2013 sys-hypervisor.c -rw-r--r--. 1 root root 132528 Sep 11 14:09 sys-hypervisor.o drwxrwxr-x. 2 root root 4096 Sep 11 14:09 xenbus -rw-rw-r--. 1 root root 5560 Jan 17 2013 xencomm.c drwxrwxr-x. 2 root root 4096 Sep 11 14:12 xenfs
#使用modules_install 命令后,install 拷贝的文件和原来编译目录中的文件类型和名称还不一样
[root@centos68 linux]# make modules_install > testmake.log [root@centos68 linux]# less testmake.log [root@centos68 linux]# less testmake.log | grep xen INSTALL drivers/block/xen-blkfront.ko INSTALL drivers/net/netxen/netxen_nic.ko INSTALL drivers/net/xen-netfront.ko INSTALL drivers/xen/evtchn.ko INSTALL drivers/xen/xenfs/xenfs.ko [root@centos68 linux]#
小结: make modules_install 的作用还不是简单的复制生成的各个目录下的文件,还是通过一种机制生成最终文件 *.ko
◎·make install (安装编译好的内核文件)
#内核文件路径:/usr/src/linux/arch/x86_64/boot,安装其实就是安装这个文件进当前系统
[root@centos68 linux]# make install #安装内核文件 sh /usr/src/kernels/linux-2.6.34.14/arch/x86/boot/install.sh 2.6.34.141.0-linux arch/x86/boot/bzImage \ System.map "/boot" #使用的脚本文件安装, ERROR: modinfo: could not find module bnx2fc ERROR: modinfo: could not find module 8021q ERROR: modinfo: could not find module garp ERROR: modinfo: could not find module ip6t_REJECT ERROR: modinfo: could not find module nf_conntrack_ipv6 ERROR: modinfo: could not find module nf_defrag_ipv6 ERROR: modinfo: could not find module ip6table_filter ERROR: modinfo: could not find module ip6_tables ERROR: modinfo: could not find module ipv6 ERROR: modinfo: could not find module vsock ERROR: modinfo: could not find module vmci ERROR: modinfo: could not find module ext4 ERROR: modinfo: could not find module jbd2 ERROR: modinfo: could not find module mbcache ERROR: modinfo: could not find module dm_mirror ERROR: modinfo: could not find module dm_region_hash ERROR: modinfo: could not find module dm_log ERROR: modinfo: could not find module dm_mod #由于删除了很多额模块的导致报错,测试一下看看系统能不能正常的启动 [root@centos68 linux]#
#在/boot目录下生产的文件:
[root@centos68 boot]# ll total 44056 -rw-r--r--. 1 root root 108103 May 11 01:32 config-2.6.32-642.el6.x86_64 drwxr-xr-x. 3 root root 1024 Jul 19 18:19 efi drwxr-xr-x. 2 root root 1024 Sep 11 15:26 grub -rw-------. 1 root root 25724517 Sep 7 23:34 initramfs-2.6.32-642.el6.x86_64.img -rw-------. 1 root root 6286176 Sep 11 15:26 initramfs-2.6.34.141.0-linux.img drwx------. 2 root root 12288 Jul 19 18:05 lost+found -rw-r--r--. 1 root root 215559 May 11 01:32 symvers-2.6.32-642.el6.x86_64.gz lrwxrwxrwx. 1 root root 35 Sep 11 15:25 System.map -> /boot/System.map-2.6.34.141.0-linux -rw-r--r--. 1 root root 2615003 May 11 01:32 System.map-2.6.32-642.el6.x86_64 -rw-r--r--. 1 root root 2135308 Sep 11 15:25 System.map-2.6.34.141.0-linux lrwxrwxrwx. 1 root root 32 Sep 11 15:25 vmlinuz -> /boot/vmlinuz-2.6.34.141.0-linux -rwxr-xr-x. 1 root root 4264528 May 11 01:32 vmlinuz-2.6.32-642.el6.x86_64 -rw-r--r--. 1 root root 3732640 Sep 11 15:25 vmlinuz-2.6.34.141.0-linux [root@centos68 boot]#
#查看/boot/grub/grub.conf文件内容
[root@centos68 boot]# cat 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 (2.6.34.141.0-linux) root (hd0,0) kernel /vmlinuz-2.6.34.141.0-linux ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.34.141.0-linux.img title CentOS 6 (2.6.32-642.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=ca4c44c8-1c65-4896-a295-d55e5d5e5c5e rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-642.el6.x86_64.img [root@centos68 boot]#
小结:由于编译的内核删除了很多的东西,导致系统无法正常的进入系统,不过以上的大概流程有一个比较清晰的思路了,对学习Linux还是有一定的帮助的!
原创文章,作者:linux_root,如若转载,请注明出处:http://www.178linux.com/45459