编译内核
程序包的编译安装
- 前提: 开发环境
- 开发工具 gcc,开发库
- 头文件(
/usr/include
)
检查编译依赖环境关系并设定编译参数
# ./configure
编译过程(调用工具)
# make
安装(编译好的文件复制对应的目录下)
# make install
- 开源:源代码 -> 可执行格式
- 发行版:以"通用"的目标
- 各种开源的源代码编译好后组织有效利用提供给用户
- 发行版:以"通用"的目标
6.4 内核有bug?强制服务重启
- 解决方案:升级内核
标准化
- 硬件标准化
- 内核标准化
- 软件标准化
- 路径标准化
编译内核前提
- 准备好开发环境:gcc工具
- 获取目标主机上硬件设备相关的信息:设备驱动程序
- 获取到目标主机系统功能的相关的信息,例如要启用的文件系统
- 获取内核源代码:www.kernel.org
准备开发环境
CentOS 6,7 包组
- Development Tools 开发工具
- Server Platform Developemnt 服务器平台开发
# yum grouplist
提供字符终端处理库
# yum list all *ncurses*
CentOS 6, 7 包组
# yum -y groupinstall "Development Tools"
# yum -y groupinstall "Server Platform Developemnt"
# yum -y install *ncurses*
- 获取目标主机上硬件设备的相关信息
32 or 64
- 大量的系统内存和浮点性能
- 安装要求配置不同(64bit OS 智能安装在 64 bit 电脑上)
- 运算速度不同
- 寻址能力不同
32 bit OS 通过扩展来支持 8GB 内存的,扩展锁采用的是 PAE技术
获取 CPU 型号
# cat /proc/cpuinfo
vendor_id
model_name: 型号名称
# lscpu
# yum -y install x86info
# x86info --help
# x86info -a
PIC设备
# lspci [-v | vv]
- PCI bridge 北桥
- ISA bridge 南桥
- IDE interface IDE接口
- Bridge: Inter Corporation
- System peripheral: VMware 集成接口
- VGA 显卡
- SCSI storage controller:
- Ethernet controller
- USB controller: USB1.1 UHCI Controller
- USB controller: USB2 EHCI Controller
- USB controller: USB3 XHCI Controller
# lsusb [-v | -vv]
# lsblk 硬盘信息
了解全部硬件设备信息:
CentOS 6
# yum list all | grep hal
# hal-device
查看 CPU 物理个数
# grep 'physical id' /proc/cpuinfo | sort -u | wc -l
查看 CPU 核心数量
# grep 'core id' /proc/cpuinfo | sort -u | wc -l
查看 CPU 线程数
# grep 'processor' /proc/cpuinfo | sort -u | wc -l
查看 CPU 型号
# dmidecode -s processor-version
查看 CPU 的详细信息:
# cat /proc/cpuinfo
注意: udev相关信息是可以参考
内核编译过程
# tar xf linux-3.10.107.tar.xz -C /usr/src
# cd /usr/src
# ln -sv linux-3.10.107 linux
# cd linux
1.配置内核选项
# make menuconfig
2.编译内核,-j指定内核线程数量
# make [-j #]
3.安装内核模块
# make modules_install
4.安装内核核心
# make install
screen命令:打开新的屏幕,不会终端断开而关闭
- 打开screen:
# screen
- 列出screen:
# screen -ls
- 拆除screen:
Ctrl+a,d
- 连接screen:
# screen -r SCREEN_ID
- 关闭screen:
# exit
配置内核选项
参考当前内核编译文件
# cd /usr/src/linux
编译内核文件
# ls /boot/config-$(uname -r)
有些发行版在这里支持 /proc/config.gz
# cp /boot/config-$(uname -r) /usr/src/linux/.config
# vim /usr/src/linux/.config
# cd /usr/src/linux
# make menuconfig
64-bit kernel 64内核编译(不选择编译成32位)
General setup 通用设定
- Local version - append to kernel release
-1.el7
(第一次编译el7)
- Default hostname
- Local version - append to kernel release
Enable loadable module support 是否支持模块动态装载(必须)
Enable the block layer 是否支持块层(必须支持)
Processor type and feature 处理器类型和特性
- Processor family(Core 2/newer Xeon)
Power management and ACPI options 电源管理和高级电源选项
Bus options(PCI etc.) 总线选项
Executable file forms /Emulations 可执行文件格式
Write ELF core dumps with partial segments
Kernel support for scripts starting with #!
Network options 网络选项
Device Drivers 驱动程序,网卡
Firmware Drivers 固件驱动
File systems 文件系统
Kernel hacking 内核调试
Security options selinux
Cryptographic API 加密解密库
Virtualization 虚拟化技术
Library routines
Yes->保存到.config
# screen
# make -j 2
# make modules_install
# make install
# reboot
设置默认grub
# vim /etc/default/grub
- 重新启动,选择新内核
编译过程
1. 配置内核选项
- 支持更新模式进行配置:在已有的.config文件的基础之上进行修改配置
# make config
:基于命令行以遍历的方式去配置内核中可配置的每个选项;# make menuconfig
:基于ncureses的文本配置窗口# make gconfig
:基于GTK开发环境的窗口界面;包组"桌面平台开发"# make xonfig
:基于QT开发环境的窗口界面
- 支持全新配置模式进行配置
# make deconfig
:基于内核为目标平台提供的默认配置为模版进行配置# make allnoconfig
:所有选项均为no
2. 编译
- 多线程编译:
make [-j #]
- 编译内核中的一部分代码:
- 只编译某子目录中的代码:
# cd /usr/src/liux && make path/to/dir/
- 只编译一个特定的模块
# cd /usr/src/linux && make path/to/dir/file.ko
# ls /lib/modules/$(uname -r)/kernel/
编译好的文件复制移动到系统内核模块目录中
- 只编译某子目录中的代码:
- 如何交叉编译
- 目标平台与当前编译操作所在的平台不同:
# make ARCH=arm_name
- 获取特定目标平台的
# make ARCH=arm help
- 目标平台与当前编译操作所在的平台不同:
3. 如何在执行过编译操作的内核源码上做重新编译
- 实现清理操作
清理编译生成的绝大多数文件,当会保留config,及编译外部模块所需要的文件
# make clean
清理编译生成的所有文件,包括配置生成的config文件及某些备份文件
# make mrproper
相当于`mrproper`,额外清理各种patches以及编辑器备份文件
# make disclean
常见编译出错
报错:缺少bc
/bin/sh: bc: command not found
make[1]: [kernel/timeconst.h] Error 127 make: [kernel] Error 2
解决方案:
# yum install -y bc