zoukankan      html  css  js  c++  java
  • 为什么要编译Linux内核?

    新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译Linux内核。
    通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。
    为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑:
    (1)自己定制编译的内核运行更快(具有更少的代码)
    (2)系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
    (3)不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
    (4) 将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些

    这类编译的目的主要是通过编译来了解Linux内核编译的过程,熟悉内核的工作原理,甚至还可以尝试进行一些修改。
    编译只是将源码编译成程序,不会替换当前的系统,也不会影响当前系统的运行。

    编译内核可能是出于某种需求,比如对内核大小有要求,去掉内核中某些用不到的部分,这种场景往往是嵌入式系统。
    或者自己修改了某部分内核代码,需要编译后验证功能。
    模块编译时将某些功能模块编译成 .ko 可以在不重新编译内核的情况下,insmod xxx.ko 到系统中使用编写的代码功能。
    编译内核后不会替换当前内核,编译后的新内核往往在类似下面的目录下,名字大都是 bzImage
    /usr/src/kernels/3.xx.x-.x86_64/arch/x86/boot/
    然后可以编辑系统的 grub list 添加最新的内核来用它

    新内核集成了新驱动,比如Intel核显:    /lib/modules/`uname -r`/kernel/drivers/gpu/drm/i915/i915.ko
     
    一个系统可以安装多个内核,比如启动文件,新内核不会覆盖旧内核: 
    /boot/vmlinuz-VERSION
    /boot/initrd.img-VERSION
    安装新内核过程中,一些内核模块需要重新编译,比如VirtualBox:
    /lib/modules/`uname -r`/updates/dkms/vboxdrv.ko
    如果新内核运行不正常,可以在开机GRUB引导里选择旧内核启动。
    也可以这样改回原来使用的内核:
    ln -sf /boot/vmlinuz-VERSION /vmlinuz
    ln -sf /boot/initrd.img-VERSION /initrd.img
     其中VERSION是原来内核的版本。

     三、常见问题

    1、rebooot无法进入系统

      提示Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0),大多是menu.lst没设置好。

    解决:

      重启系统,选择没修改过的内核版本(如Ubuntu 6.06自带的2.6.15)进入系统,检查menu.lst文件(可以再update-grub下)
    2、高版本内核无法编译低版本内核

      编译工具太新了,建议用适当的发行版编译内核。同理,如果低版本无法编译高版本,则需考虑是否应该升级相应工具。

  • 相关阅读:
    会话追踪技术
    request session application
    Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。
    mysql连接拍错总结
    git 从分支上创建一个分支
    linux ---> taskkill pid 8080 /f
    阿里java开发规范 强制约束
    for break
    Mybatis Update操作返回值问题
    springboot 缓存架构
  • 原文地址:https://www.cnblogs.com/tanrong/p/6814264.html
Copyright © 2011-2022 走看看