技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Linux --> 我的内核配置文件

我的内核配置文件

浏览:3784次  出处信息

    我们知道,在KVM里测试内核会碰到一个很严重的问题:那就是在 host 编译的内核不能直接在 guest 里使用。有两个原因:一是 host 和 guest 的硬件可能不一样,所以需要的 config 不一样;二是内核模块即便是安装进了 initramfs 也仍有很多需要安装到 /lib/modules/`uname -r`。

    有三种解决办法:

    1. host 和 guest 都使用发行版自带的 config,这个 config 是可以在很多机器上运行,所以基本上一定可以在你的guest 里使用,然后用 guestfish 把编译的内核模块拷贝进 guest;这么做的好处是 host 和 guest 都使用同一个 config;坏处也显然,需要进行太多host => guest 拷贝操作。

    2. 在 1) 的基础上进行改进,把 host 作为 build server,为 guest 提供 PXE,NFS 服务,这样 guest 里就可以直接使用编译好的内核以及内核模块。这个方法的缺点是,需要一些系统管理技巧,我暂时还没有时间折腾;优点是,如果你的 build server 搭建得比较好,你甚至可以给其它机器(非虚拟)提供服务。

    3. guest 使用和 host 不同的 config,guest 的 config 是经过专门定制的,只编译本机器所需要的内核特性和模块,并且把所有的模块都编译进内核(builtin),这样我们甚至不需要 initramfs!优点是,config 很少,即使重新编译花费时间也很少;缺点也很显然,config 很难用于别的机器,尤其是非虚拟化的机器。需要特别注意:如果你的系统用了 LVM 那么它将无法使用!因为内核无法自己检测 LVM!另外,编译进内核的模块和不像单独加载的模块那样灵活,比如 netconsole 模块,我们通常是通过模块参数来指定其功能,而一旦变成 builtin 我们就不得不通过 configfs 来进行操作了,也就是说测试脚本就得重写了。

    为了定制上述 3) 中专门的 config,我花了不少时间把我的 config 精简到最少,但同时又包含了 KVM 里需要功能以及我调试用到的选项,我把最终的 config 放到了 github 上进行管理:

    https://github.com/congwang/kernelconfig/blob/master/kvm-mini-config

    我的目标是让它可以在尽可能多的 KVM guest 上可以运行(显然不可能保证所有),同时尽量不破坏用户空间的程序比如 systemd(取决于发行版),当然还要保持编译出的内核可能的小。欢迎帮忙测试。:-)

    下一步是尝试实现第2种方法,我们需要搭建一个集编译内核、PXE服务器、NFS服务器于一身的服务器,准备弄一个新的 github 项目去搞一下。

    当然,如果你有其它更好的主意,希望不吝赐教!

    附我常用的一些内核调试选项:

    一定要有的:

     CONFIG_DEBUG_KERNEL=y

    内存相关:

     CONFIG_SLUB_DEBUG=y

     CONFIG_DEBUG_VM=y

     CONFIG_DEBUG_LIST=y

    内核加锁相关:

     CONFIG_DEBUG_ATOMIC_SLEEP=y

     CONFIG_LOCKDEP=y

     CONFIG_DEBUG_SPINLOCK=y

     CONFIG_DEBUG_MUTEXES=y

     CONFIG_DEBUG_LOCK_ALLOC=y

     CONFIG_PROVE_LOCKING=y

     CONFIG_PROVE_RCU=y

    ftrace 相关:

     CONFIG_FTRACE=y

     CONFIG_FUNCTION_TRACER=y

    锁死检测:

     CONFIG_LOCKUP_DETECTOR=y

     CONFIG_HARDLOCKUP_DETECTOR=y

     CONFIG_BOOTPARAM_HARDLOCKUP_PANIC=y

     CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=1

     CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y

     CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=1

     CONFIG_DETECT_HUNG_TASK=y

     CONFIG_DEFAULT_HUNG_TASK_TIMEOUT=300

    kdump 相关:

     CONFIG_KEXEC=y

     CONFIG_CRASH_DUMP=y

     CONFIG_PHYSICAL_START=0x1000000

     CONFIG_RELOCATABLE=y

    netconsole 相关:

     CONFIG_NETCONSOLE=y

     CONFIG_NETCONSOLE_DYNAMIC=y

     CONFIG_NETPOLL=y

    kprobe,jump label 相关:

     CONFIG_KPROBES=y

     CONFIG_JUMP_LABEL=y

建议继续学习:

  1. linux内核研究笔记(一)内存管理 – page介绍    (阅读:8763)
  2. PHP内核介绍及扩展开发指南―Extensions 的编写    (阅读:4734)
  3. Linux内核协议栈对于timewait状态的处理    (阅读:3812)
  4. PHP内核介绍及扩展开发指南―高级主题    (阅读:3682)
  5. PHP内核介绍及扩展开发指南―基础知识    (阅读:3473)
  6. 在 Dell PowerEdge 1950 上安装 Linux 2.6.32-rc8 内核的问题与解决    (阅读:3087)
  7. 在Ubuntu上使用SystemTap    (阅读:3076)
  8. Linux内核模块开发(笔记)    (阅读:3153)
  9. 内核编译升级失败了以后的处理方案    (阅读:2990)
  10. [Linux]编译一个 RHEL 定制的内核 rpm 包    (阅读:2836)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1