从linux系统中提取出kernel config

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从linux系统中提取出kernel config相关的知识,希望对你有一定的参考价值。

看网上有人说能从linux安装光盘中提取出kernel config,并以此config为基础去重新编译内核,想请问如何从已有的linux系统中提取其config配置,/boot下没有,有的说能从/proc下知道config配置情况,不知道如何得到。希望得到解答。
谢谢。

师(PartitionMagicV8.05h)分出一个10G左右空间、留着给opensuse使用,这一步我试图把我的最后一个盘符(F)重新分区,结果失败了,所以,我干脆把这个盘格式化了。
2、把iso提取(解压)到一个fat32分区下面,建议用UltraISO,比如说提取到e:/suse文件夹下,记得一定是fat32,如果原有的分区都是ntfs的,可以采用分区魔术师重新格式化某个分区,在格式化时选择“fat32”。
3、在suse文件夹下有个openSUSE10_3_LOCAL.exe文件,点击安装后,重新启动电脑,就会在windows引导菜单上看到安装suse的菜单了,点击该菜单,就会进行安装了。
4、安装过程中有一步很重要,需要选择suse文件夹所在目录,一定要选对分区(可以根据分区的大小来判断,然后输入/SUSE(在windows下的e盘下,虽然是小写,这里一定要大写)。剩下的就和光驱安装一样了,网上有很多教程,我就不详细说了。
注意:安装过程需要分区,分区时,如果要保留windows的分区,要选择“更改”——“分区”——“专家”模式,然后既可以使用原来的分区,也可以进行重新分区,比如说,我原来的F盘本来就是空的,那么我可以选择先把该分区删除,然后再添加,可以自己配置大小,一般需要三个新的分区,第一个“swap,装载点/swap”,第二个“ext3,装入点/boot”,第三个“ext3,装入点/”就可以。
Attansic L2 驱动问题
我第一次安装完成后,发现网卡显示(未连接),以为自己没有安装好,就重新安装了,这一次在安装的过程中特意注意了一下网络配置,结果发现在安装系统时,进行到网络配置这一步时,网卡的信息依旧是(未连接),更谈不上编辑了,还是先跳过吧。
到网上查找相关资料,发现问这类问题的帖子倒是有一些,就是没有太具体的答案,不过还是有了一些思路,好像是网卡驱动没装好,所以根本就没有识别网卡,顺便说一句,我的电脑是华硕P5G-MX主板,Attansic L2集成网卡。
到网上进行查找,找到了网卡的linux驱动,下载后,看说明(一个readme文件,全是英文,其实就是把该文件解压,放到home/username文件夹下就行),由于本人是linux菜鸟,所以真是费了一番周折的,最后驱动放在了“home/用户名”文件夹下,进入src目录,在make时,报错了,“kernel source not found”。
继续查找,原来是要安装linux内核源码,通过“uname -r”命令,查看到我的系统内核是2.6.22.5-31版本的,所以到网上下载了该版本的源码,rpm格式的,kernel-source-2.6.22.17-0.1.src.rpm,还有linux-2.6.22.5.tar.gz这种格式的,我不会装,rpm格式的很好装,在opensuse中,直接点击,然后在点击“Yast安装”就可以了。这回又重新回到了驱动所在的src文件夹下,再次运行make命令,唉,这次显示的是另外的错误“linux kernel surce not configured -missing config.h”。
继续查找,可能我下载的驱动版本不对,于是按照帖子中说的重新下载了网卡驱动,再次make,多么希望能成功呀,可是再次提示错误“Compiler not found 停止”。
原来没装编译器,到网上下载gcc编译器,ftp://mirror.switch.ch/mirror/scientificlinux/40rolling/i386/SL/RPMS/gcc-3.4.6-9.i386.rpm,安装,再次make,还是有错误“‘struct vlan_group’ has no member named ‘vlan_devices’“,”at_main.c 1488“等等之类的。
解决办法是:打开at_main.c文件,两个调试函数at_vlan_rx_kill_vid at_restore_vlan 去掉函数的实现部分,直接return,这回在make,make install,成功了,高兴呀!
重新启动电脑,发现网卡真的识别了,好几天才成功的。
参考技术A 我在网上看到的,希望能起作用:

配置内核的人都清楚要选择内核的配置项是一件比较麻烦的事:要是多选了吧,内核体积可能变大,编译时间会变长;要是选少了吧,恐怕系统连启动都启动不了。所以一般我们的做法是拿过系统提供的 config 来直接make oldconfig。

但这么做并不是很好,因为发行版通常为了照顾不同配置的机器而选中了很多的模块,这样一来对本机器没有用的东西也会被编译进来,从而导致编译时间变长,这还是次要,关键是模块数量会增多,内核体积也有可能变大。

理想的情况是我们根据本系统运行时加载的模块来决定到底选中哪些模块。问题就来了,我们怎么才能知道自己的系统需要哪些模块不需要哪些模块呢?

为 了解决这个问题,Steven Rostedt写了一个脚本,叫作streamline_config.pl,来解决这个问题。而且他已经把此脚本提交到内核,见 scripts/kconfig/streamline_config.pl。这样一来,我们就可以通过 make localmodconfig 或 make localyesconfig 来生成我们真正需要的最小的config了。不同的是,后者会把系统正在使用模块编译进内核,而前者不会,它只会保留系统使用的模块而且继续以模块的形式 存在。

这个脚本不复杂,原理也很简单,通过 lsmod 找出正在使用的驱动, 然后通过解析所有的Makefile中的obj-$(CONFIG_XXX) += xxx.o模式来找到驱动对应的CONFIG_*,不过还要解决依赖性的问题。

脚本下载地址:http://rostedt.homelinux.com/code/streamline_config.pl
参考技术B 天奇QQ群论坛无敌发每日可发1万条QQ群论坛广告,半自动群发,成本只需人工费10-20元/千条 参考技术C 最简单也是最应该的方式,就是从内核的源码目录里找:你注意下你的发行版的更新源,从更新源的地址下载对应版本的kernel,然后解压就不就能找到了么....一般是目录底层,一个叫 .config 的文件,是个隐藏文件。

反正你也没有修改过,下载来就是你系统用的config了...追问

你好,感谢你的回答,我系统的config是手动配置过的,然后重编了内核,我希望能从当前系统中取出kernel配置。谢谢

追答

dear lord...意思你自己配置过的kernel目录给丢了么?
我运行了下locate .config找到了一些信息,我觉得下面两个目录中的.config文件可能有用:

/usr/src/linux-2.6.32-lts/.config
/usr/src/linux-2.6.37-ARCH/.config

这个是kernel-headers,如果你自己没有用你自己配置对应的kernel header或者没有安装kernel headers的话,估计这个也不好用...

你自己查一下吧:locate .config,当然如果你知道更多的关于你的文件的信息,也可以试试..

追问

你好。谢谢。
我是自己手动配置config,然后重编了kernel,生成了bzImage,和initrd,并以此修改 grub启动项,使系统运行在了新kernel上,但由于误操作,删除掉了整个/usr/src目录,也就是我的kernel编译环境连同配置的config均丢掉了,现在就想通过已经生成的系统环境,提取出config信息。
感谢你的帮助

本回答被提问者和网友采纳
参考技术D 在kernel文件下有个.config的文件是隐藏的,需要点查看隐藏文件才能看到。
然后把他拖到比对软件那里(譬如说beyond compare)
接着再把新的kernel文件的.config文件也找到,和旧的config文件放在一起比对,就知道了哪里要修改了。
希望对楼主有帮助

linux kernel 从cmdline 提取值

 1 // 从cmdline 提取 rootfsname= 的值到 val_buf                                         
 2 char val_buf[64];
 3 #define ROOTFS_CMDLINE "rootfsname="
 4 
 5 static void __init gluebi_read_cmdline (void)
 6 {
 7     rootfsmtd_ptr = strstr(saved_command_line, ROOTFS_CMDLINE);
 8     if (rootfsmtd_ptr) {
 9         sscanf(rootfsmtd_ptr, ROOTFS_CMDLINE"%s", val_buf);
10         printk("Gluebi: Found kernel commandline option ‘rootfsname=%s‘
", val_buf);
11     }   
12 }

 

 

 

 1 // drivers/acpi/sysfs.c
 2 static int param_get_trace_state(char *buffer, struct kernel_param *kp)
 3 {
 4     if (!acpi_gbl_trace_method_name)
 5         return sprintf(buffer, "disable");
 6     else {
 7         if (acpi_gbl_trace_flags & 1)
 8             return sprintf(buffer, "1");
 9         else
10             return sprintf(buffer, "enable");
11     }
12     return 0;
13 }                                                                                    
14 // 设置 从cmdline 分析到 trace_state 参数 调用param_set_trace_state, 将值传给 buffer
15 module_param_call(trace_state, param_set_trace_state, NULL, NULL, 0);

 

以上是关于从linux系统中提取出kernel config的主要内容,如果未能解决你的问题,请参考以下文章

Linux Kernel是啥

ubuntu system-config-kickstart 怎么编译

帮忙解释下面这段Linux kernel中的Makefile语句是啥意思?

gem5-gpu 全系统模拟更改disk和Linux kernel image

22-Openwrt 使用外部kernel和kernel_config

zynq运行操作系统之linux kernel编译