编译Linux内核

前言:

Linux内核是操作系统的核心,也是操作系统最基本的部分。

Linux内核的体积结构是单内核的、但是他充分采用了微内核的设计思想、使得虽然是单内核、但工作在模块化的方式下、并且这个模块可以动态装载或卸 载;Linux负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。如是我们在了解Linux内核的基础上根据自己的需要、量身定制一个更高效,更稳定的内核,就需要我们手动去编译和配置内核里的各项相关的参数和信息了。
注意: 如果两个内核模块的版本不完全相同是不可以跨版本使用的。


正文:
  1. 获取内核源码, 并进行解压 内核下载

    1
    tar -xvf linux-xxx.tar.gz

  2. 配置内核特性(选择一种方法就可以了)

    1. 现有编译选项:

      1
      2
      3
      4
      5
      6
      make config:遍历选择所要编译的内核特性
      make allyesconfig:配置所有可编译的内核特性
      make allnoconfig:并不是所有的都不编译
      make menuconfig:这种就是打开一个文件窗口选择菜单
      make kconfig(KDE桌面环境下,并且安装了qt开发环境)
      make gconfig(Gnome桌面环境,并且安装gtk开发环境)
    2. 内核模块

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      [*] 64-bit kernel        						# 64bit 支持
      General setup ---> # 基本设置
      [*] Enable loadable module support ---> # 模块加载支持
      -*- Enable the block layer ---> # 块设备层支持
      Processor type and features ---> # 处理器类型和特性选择
      Power management and ACPI options ---> # 电源管理功能
      Bus options (PCI etc.) ---> # 总线选项
      Executable file formats / Emulations ---> # 可执行文件格式
      -*- Networking support ---> # 网络支持
      Device Drivers ---> # 设备驱动
      Firmware Drivers ---> # 固件驱动
      File systems ---> # 文件系统
      Kernel hacking ---> # 内核技巧
      Security options ---> # 安全选项
      -*- Cryptographic API ---> # 密码相关API
      [*] Virtualization ---> # 虚拟化
      Library routines ---> # 函式库
    3. 基本设置

      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
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      [ ] Prompt for development and/or incomplete code/drivers
      # 尚未完成开发的代码或驱动,求稳不选

      ( ) Cross-compliler tool prefix
      # 交叉编译前缀,用不到不选

      ( ) Local version - append to kernel release
      [ ] Automatically append version infomation to the version string
      # 以上两项用于自定义内核的版本描述,无意义不设

      Kernel compression mode (XZ) --->
      # 内核压缩算法,有 Gzip,Bzip2,LZMA,XZ,LZO 几个选项
      # 选择了较新的 XZ ,有较高的压缩比和解压缩速度

      ( ) Default hostname
      # 用户未设置 hostname 时的默认值,无意义不设

      [*] Support for paging of anonymous memory (swap)
      # swap 虚拟内存支持,必选

      [*] System V IPC
      # 进程间通信,必选

      [ ] Open by fhandle syscalls
      # 支持通过文件句柄的系统调用,开发文件系统时可能用到,一般用户可不选

      [ ] Auditing support
      [ ] Enable system-call auditing support
      [ ] Make audit loginuid immutable
      # 审计支持,安装 SELinux 必选,但会拖慢系统,一般用户可不选

      IRQ Subsystem --->
      # 中断请求子系统,64位系统下面木有选项,免选了

      Timers Subsystem --->
      [*] Tickless System (Dynamic Ticks)
      # 计时子系统,Tickless系统可降能耗,选上
      [ ] High Resolution Timer Support
      # 高精度计时器需要硬件支持,一般硬件不支持,不选

      CPU/Task time and stats accounting --->
      Cputime accounting (Simple tick based cputime accounting) --->
      (X) Simple tick based cputime accounting
      ( ) Fine granularity task level IRQ time accounting
      # 统计进程占用CPU时间的方式,这里选择 Simple tick 方式
      [*] BSD Process Accounting
      # 将进程的统计信息写入文件,支持用户级系统调用,必选
      [*] BSD Process Accounting version 3 file format
      # 使用第三版文件格式,不兼容老版本,淘汰老文件格式,选了
      [ ] Export task/process statistics through netlink (EXPERIMENTAL)
      # 通过netlink接口向用户空间导出统计信息,可不选
      [ ] Enable per-task delay accounting (EXPERIMENTAL)
      # 在统计信息中包含进程等待资源所花费的时间,可不选
      [ ] Enable extended accounting over taskstats (EXPERIMENTAL)
      [ ] Enable pre-task storage I/O accounting (EXPERIMENTAL)
      # 在统计信息中包含额外的信息,可不选

  3. 编译内核

    1
    2
    3
    make -j  x     // x号最多为CPU物理核心总数的两倍,这样会快点哦   
    make headers // 很多Makefile 不在支持
    make modules

  4. 安装内核模块

    1
    2
    make header_install    //可忽略
    make modules_install

  5. 安装内核

    1
    make install   #会自动更新grub.conf 文件 若失败  update-grub2 手动执行,并查看文件是否更新

  6. 验证并测试

    1
    2
    cat /boot/grub/grub.conf
    查看新内核是否已经添加, 而后重启系统并测试

  7. 清理

    1
    2
    3
    4
    make mrproper命令会删除所有的编译生成文件、内核配置文件(.config文件)和各种备份文件,所以几乎只在第一次执行内核编译前才用这条命令。  #重新配置make menuconfig 之前运行
    make clean命令则是用于删除大多数的编译生成文件,但是会保留内核的配置文件.config,还有足够的编译支持来建立扩展模块。所以你若只想删除前一次编译过程的残留数据,只需执行make clean命令。

    执行make mrproper 之前 会先调用 make clean;

单内核, 微内核:
  • 单内核(宏内核):
    • 单内核将操作系统从整体作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。这样的内核通常以单个静态二进制文件的形式存放于磁盘中。
    • 各个进程,模块都运行在内核态,并处于同一地址空间: 内核可以直接调用
  • 微内核:
    • 微内核的功能被划分为多个独立过程,每个过程叫做一个服务器
    • 只有强烈请求特权服务的服务器才运行在特权模式下,其他服务运行在用户空间
    • 所有服务都保持独立并运行在各自的地址空间中( 通过 消息传递处理微内核通讯 IPC机制等)
    • IPC机制开销多余函数调用,且涉及内核空间和用户空间的上下文切换
  • Linux内核是单内核:(Linux内核运行在单独的内核地址空间上)
    • Linux引用模块化设计,抢占式内核,支持内核线程以及动态装载内核模块
    • 很多服务运行在内核态,即避免IPC调用,直接采用函数调用

欣赏此文? 求鼓励,求支持!