Linux内核的功能
- 启动管理:在系统初始化过程中检测硬件,加载驱动并引导系统。
- 进程调度:负责控制进程对CPU的使用。
- 进程通信:提供了进程之间的各种通信机制。
- 内存管理:负责管理多个进程对内存的使用。
- 文件系统:使用虚拟文件系统中间层支持多种不同类型的文件系统。
- 设备管理:为设备提供缓冲和缓存以提高硬件的访问速度。
- 网络接口:对各种网络标准的存取和各种网络硬件的支持。
- 安全管理:校验文件系统权限,SELinux环境和防火墙规则。
REEL/CentOS下的内核
- 内核的RPM包
- kernel:一般用途的普通版内核,支持单核或多核CPU,最多支持4G物理内存。
- kernel-PAE:支持大内存的内核,支持多核CPU,最多支持64G物理内存。
- kernel-xen:支持Xen虚拟化(hypervisor)的内核。
- 内核文档
- kernel-doc
显示内核相关的信息
- 显示系统内核信息
- uname -srvmo
- cat /proc/version
- 显示系统架构
- arch
- 显示LSB(Linux Standard Base)和发布信息(Distribution information)
- isb_release -a # 适用于所有的Linux发行版
- 显示Linux发布版本(仅用于RedHat系列)
- cat /etc/redhat-release
- rpm -q {redhat,centos}-release
内核的重要组件
- 内核映像文件
- 文件保存在/boot/vmlinux-$(uname -r)
- 由启动加载器(GRUB)直接加载到内存以便启动内核
- 内核模块
- 可根据需要装载或者卸载的内核扩展
- 包括驱动程序、文件系统,防火墙等等
- 初始化内存盘(Bootloader Initialized RAM Disk)
内核模块
- 内核的功能可以编译到内核映像文件,也可以编译为独立的模块。
- 可以在系统运行期间动态地加载或卸载内核模块以改变系统功能。
- 所有的内核模块保存在/lib/modules/$(uname -r)目录中。
- /lib存在根文件系统中,因此所有内核模块必须在根文件系统挂载后才能使用。
- 为特定的内核版本编译,以kernel的RPM提供。
- 可添加第三方模块
内核模块工具
- lsmod:列出已装载的模块
lsmod |grep usb
- modprobe:装载和卸载模块
- modprobe usb_storage
- modprobe -r usb_storage
- modinfo:显示模块的信息
- modinfo usb_storage
初始化内存盘
- 初始化内存盘提供在引导初期装载的模块
- 用于内核映像文件中没有提供的其他设备的内核驱动模块
- 文件保存在/boot/initrd-$(uanme -r).img
- 由启动加载器(GRUB)直接加载到内存
- 在引导初期,根文件系统挂载之前使用
- 是Linux安装盘、Linux启动盘(CD、USB)、LiveCD的必备部件
虚拟文件系统/proc
- 虚拟文件系统/proc是在Linux启动是挂载到根文件系统上的,它是内存的一部分而非真正存储在硬盘上
- 重启系统后上次的修改会被重新初始化
- 使用/proc的目的就是将Linux的内核数据以目录或文件的形式呈现给用户或应用程序,以便查看内核信息或临时修改内核功能。
- 显示过程信息、内存资源、硬件设备、内核内存等
- 修改网络、内存子系统等内核属性,修改立即生效
/proc示例
- 只读文件
- /proc/1/*
- /proc/cpuinfo
- /proc/meminfo
- /proc/partitions
- /proc/sys/下的读写文件
- /proc/sys/kernel/hostname
- /proc/sys/net/ipv4/ip_forward
- /proc/sys/vm/drop_caches
- /proc/sys/vm/swappiness
sysctl:持久的内核配置
- sysctl使/proc/sys设置具有持久性
- 重新引导后,在/etc/sysctl.conf中添加的配置会自动体现在/proc中
- 使用sysctl命令进行配置维护或监控:
- 列出所有当前设置:
sysctl -a
- 从sysctl.conf中重新装载:
sysctl -p
- 设定一个动态/proc值:
- sysctl -w net.ipv4.ip_forward=1
- 列出所有当前设置:
使用rpm命令升级内核
- 安装新版内核
rpm -i kernek*
- 不要使用rpm -U 或 rpm -F!
- 重新启动系统,在GRUB中选择新版内核启动系统
- 测试新版内核,若有任何问题发生可以使用旧版内核重新启动系统
- 当确信新版内核无任何问题时,删除旧版内核
rpm -e kernel-oldversion
使用yum命令升级内核
- 使用yum命令升级内核
yum -y update kernel
- 主要包含如下操作:
(1)下载最新版的内核RPM文件
(2)安装新版的内核RPM文件
(3)根据/etc/sysconfig/kernel的设置自动配置GRUB
- 测试新版内核,若有任何问题发生可以使用旧版内核重新启动系统
- 当确信新版内核无任何问题时,删除旧版内核
yum remove kernel-oldversion
内核源代码的结构
- Linux源代码文件名一般为:
- Linux-2.6.10.tar.gz | Linux-2.6.10.tar.bz2
- 安装目录:/usr/src/linux
Linux源代码子目录及功能(1)
- /include:建立内核代码时所需的大部分包含文件
- /init:内核的初始化代码,内核工作的起点
- /arch:所有与硬件体系结构相关的内核代码
- /drivers:内核中所有的设备驱动程序
- /fs:所有的文件系统的代码
- /net:Linux应用的网络协议代码
- /mm:所有与硬件体系结构无关的内存管理代码
- /ipc:进程间通信代码
- /kernel:主内核代码,如进程调度及进程创建、撤销的代码
1.为什么要编译内核?
- 学习、体验
- 使用新内核中的功能
- 修补安全漏洞和程序缺陷
- 提高系统性能
- 调整硬件设备的变动
2.编译内核前的准备
- 做好心理上的准备O(∩_∩)O哈哈~
- 失败是正常的!
- 下载内核
- 本章使用2.6.10内核
- 下载地址:
- 文件:
- Linux-2.6.10.tar.gz
- Linux-2.6.10.tar.bz2
- 内核源代码存放位置
- /usr/src
- 源代码解压缩
- tar xzvf Linux-2.6.10.tar.gz
- tar xjvf Linux-2.6.10.tar.bz2
- 此时,在/usr/src下生成Linux-2.6.10子目录
- 区别:2.4版本的内核生成的子目录名为Linux
3.内核配置
- 方法
- make config
- 不推荐,除非你愿意在命令行回答成千上百个问题
- make xconfig
- 常用方法之一,需要QT工具支持
- make gconfig
- 需要GTK开发库支持
- make menuconfig
- 常用方法之一,文件模式的图形用户界面
- make config
- 在源目录中,生成.config文件!
- 内核配置选项
- 符号说明
- —>有子菜单
- */空白(编进内核/不选改项)
- <> */M/空白(编进内核/以动态模块方式编译/不选该项)
- () 多选一
- 选项说明
- 符号说明
4.安装新内核
- 编译
- make (make bzimage、make modules)
- 安装模块文件
- make module_install
- 将模块安装到/lib/modules/2.6.10/下
- 安装内核文件
- make install
- 在/boot下生成bzimage、system.map和initrd
- 检查GRUB是否已经配置完毕!
- vi /etc/grub.conf
- 注意:这个是软链接文件!
编译内核3.0以上版本
- 整个编译过程类似于内核2.6的编译
- RHEL6之后用dracut来创建initramfs镜像文件,不在是以前的mkinitrd
- make的使用,可以加上-jN(指定多少核进行编译,根据系统的内核数情况,加快编译速度,N就是指核数)
- make clean只删除编译好的文件
- make mrproper把包还原成解压出来时的样子
- 注意:关于后两点,可以直接把文件删除,再重新解压
练习
- 在你的机器上,下载并安装2.6.10版本的内核。