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
      • 常用方法之一,文件模式的图形用户界面
  • 在源目录中,生成.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版本的内核。
12-05 02:58