Linux内核配置详解.docx
《Linux内核配置详解.docx》由会员分享,可在线阅读,更多相关《Linux内核配置详解.docx(90页珍藏版)》请在冰豆网上搜索。
Linux内核配置详解
Linux内核配置详解
首先对内核进行菜单配置,
代码:
1.cd/usr/src/linux
2.makemenuconfig
代码成熟度选项
代码:
1.Codematurityleveloptions--->
2.[*]Promptfordevelopmentand/or
incompletecode/drivers
3.[*]Selectonlydriversexpectedto
compilecleanly
Promptfordevelopmentand/orincompletecode/drivers显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择打开使用开发中、不完全的代码/驱动会让内核配置多出很多选项,由于我们需要使用一些正在开发中的功能,因此必需打开这一选项。
通用设置选项
代码:
1.Generalsetup--->
2.()Localversion-appendtokernel
release
3.[*]Supportforpagingofanonymous
memory(swap)
4.[*]SystemVIPC
5.[*]POSIXMessageQueues
6.[*]BSDProcessAccounting
7.[*]BSDProcessAccountingversion3
fileformat
8.[*]Sysctlsupport
9.[]Auditingsupport
10.(15)Kernellogbuffersize(16=>64KB,
17=>128KB)
11.[*]Supportforhot-pluggabledevices
12.[*]KernelUserspaceEvents
13.[*]Kernel.configsupport
14.[*]Enableaccessto.configthrough
/proc/config.gz
15.[*]Configurestandardkernelfeatures
(forsmallsystems)--->
16.---Configurestandardkernelfeatures
(forsmallsystems)
17.[]Loadallsymbolsfor
1/52
debugging/kksymoops
18.[*]Enablefutexsupport
19.[*]Enableeventpollsupport
20.[*]Optimizeforsize
21.[*]Usefullshmemfilesystem
22.(0)Functionalignment
23.(0)Labelalignment
24.(0)Loopalignment
25.(0)Jumpalignment
Localversion-appendtokernelrelease:
这里填入的是64字符以内的字符串,你在这里填上的字符口串可以用uname-a命令看到。
Automaticallyappendversioninformationtotheversionstring:
自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持。
Supportforpagingofanonymousmemory(swap):
这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。
SystemVIPC:
表示系统5的InterProcessCommunication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来的。
POSIXMessageQueues:
这是POSIX的消息队列,它同样是一种IPC。
建议你最好将它选上。
BSDProcessAccounting:
这是充许用户进程访问内核将账户信息写入文件中的。
这通常被认为是个好主意,建议你最好将它选上。
BSDProcessAccountingversion3fileformat:
使用新的第三版文件格式,可以包含每个进程的PID和其父进程的PID,但是不兼容老版本的文件格式。
Exporttask/processstatisticsthroughnetlink:
通过netlink接口向用户空间导出任务/进程的统计信息,与BSDProcessAccounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的。
Enableper-taskdelayaccounting:
在统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间。
UTSNamespaces:
UTS名字空间支持,不确定可以不选。
Enablesystem-callauditingsupport:
支持对系统调用的审计。
Enableaccessto.configthrough/proc/config.gz:
允许通过proc/config.gz访问内核的配置信息。
Cpusetsupport:
只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它。
Kernel->userspacerelaysupport(formerlyrelayfs):
在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口。
Initramfssourcefile(s):
initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白。
Optimizeforsize(Lookoutforbrokencompilers!
):
编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码。
Enableextendedaccountingovertaskstats:
收集额外的进程统计信息并通过taskstats接口发送到用户空间。
Enable16-bitUIDsystemcalls:
允许对UID系统调用进行过时的16-bit包装。
Includeallsymbolsinkallsyms:
在kallsyms中包含内核知道的所有符号,
内核将会增大300K。
Doanextrakallsymspass:
除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项。
Supportforhot-pluggabledevices:
支持热插拔设备,如usb与pc卡等,Udev也需要它。
Enablesupportforprintk:
允许内核向终端打印字符信息,在需要诊断内核为什么不能运行时选择。
BUG()support:
显示故障和失败条件(BUG和WARN),禁用它将可能导致隐含的错误被忽略。
EnableELFcoredumps:
内存转储支持,可以帮助调试ELF格式的程序。
Enablefull-sizeddatastructuresforcore:
在内核中使用全尺寸的数据结构.禁用它将使得某些内核的数据结构减小以节约内存,但是将会降低性能。
Enablefutexsupport:
快速用户空间互斥体可以使线程串行化以避免竞态条件,也提高了响应速度.禁用它将导致内核不能正确的运行基于glibc的程序。
Enableeventpollsupport:
支持事件轮循的系统调用。
UsefullSLABallocator:
使用SLAB完全取代SLOB进行内存分配,SLAB是一种优秀的内存分配管理器,推荐使用。
EnableVMeventcountersfor/proc/vmstat:
允许在/proc/vmstat中包含虚拟内存事件记数器。
Sysctlsupport:
这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。
建议你最好将它选上。
Auditingsupport:
审记支持,用于和内核的某些子模块同时工作,例如SELinux。
只有选择此项及它的子项,才能调用有关审记的系统调用。
Kernellogbuffersize:
内核日志缓存的大小,12=>4KB,13=>8KB,14=>16KB单处理器,15=>32KB多处理器,16=>64KBforx86NUMAQorIA-64,17=>128KBforS/390。
Supportforhot-pluggabledevices:
是否支持热插拔的选项,肯定要选上。
不然USB、PCMCIA等这些设备都用不了。
KernelUserspaceEvents:
内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。
Kernel.configsupport:
将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置。
还记得另一篇贴子我是如何取得启动光盘的内核配置信息,并在此基础上配置新的内核吗?
Configurestandardkernelfeatures(forsmallsystems):
这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。
Loadallsymbolsfordebugging/kksymoops:
是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。
Enablefutexsupport:
不选这个内核不一定能正确的运行使用glibc的程序,当然要选上。
Enableeventpollsupport:
不选这个内核将不支持事件轮循的系统调用,最好选上。
Optimizeforsize:
这个选项使gcc使用-Os的参数而不是-O2的参数来优化
编译,以获得更小尺寸的内核,建议选上。
Usefullshmemfilesystem:
除非你在很少的内存且不使用交换内存时,才不要选择这项。
后面的这四项都是在编译时内存中的对齐方式,0表示
编译器的默认方式。
使用内存对齐能提高程序的运行速度,但是会增加程序对内存的使用量。
内核也是一组程序呀。
可加载模块
代码:
1.Loadablemodulesupport--->
2.[*]Enableloadablemodulesupport
3.[*]Moduleunloading
4.[]Forcedmoduleunloading
5.[*]Moduleversioningsupport
(EXPERIMENTAL)
6.[]Sourcechecksumforallmodules
7.[*]Automatickernelmoduleloading
Enableloadablemodulesupport,很多人喜欢将全部功能、硬件支持一股脑的编进内核,而不是使用模块的方式。
这样做非常不好(个人觉得)。
其实我也做过嵌入式的开发,在针对特定硬件的平台下尽可能将内核编小,将始终是支持模块加载的。
例如我们开发的防火墙就是做为内核的模块被加载的。
使用模块支持,你的系统能具有更好的可扩充性。
还有一个原因就是自己编写的功能模块、设备驱动模块(假设编写的质量不高)以模块方式工作引起KernelPanic的机率要远远低于不支持模块全部编进内核的方式。
讲了这么多,终于可以理直气壮的选上这一功能了。
Moduleunloading,不选这个功能,加载的模块就不能卸载。
没什么需要多解释的,建议最好选上。
Forcedmoduleunloading,这个选项能强行卸载模块,即使内核认为这样并不安全,也就是说你可以把正在使用中的模快卸载掉。
如果你不是内核开发人员或者骨灰级的玩家,不要选择这个选项。
Moduleversioningsupport(EXPERIMENTAL),这个功能可以让你使用其它版本的内核模块,由于我自己写一些模块,所以我会用到这个选项,因为内核更新太快了,我的头文件更新根本赶不上内核的更新。
还有,虽然我在Gentoo下
开发,但实际真实环境用的却是从kernel.org下载的内核。
虽然我选择了这个选项,不过建议你不要选择这个选项。
Sourcechecksumforallmodules,这个功能是为了防止更改了内核模块的代码但忘记更改版本号而造成版本冲突。
我估计现在没有哪家公司在开发中还没使用版本控制工具,所以不需要这项了。
如果你不是自己写内核模块,那就更不需要这一选项了。
Automatickernelmoduleloading,这个选项能让内核自动的加载部份模块,建议你最好选上。
举个例子说明一下,如模块eth1394依赖于模块ieee1394。
如果选择了这个选项,可以直接加载模块eth1394;如果没有选择这个选项,必需先加载模块ieee1394,再加载模块eth1394,否则将出错。
Blocklayer块设备层
Enabletheblocklayer:
块设备支持,使用硬盘/USB/SCSI设备者必选。
SupportforLargeBlockDevices:
仅在使用大于2TB的块设备时需要。
Supportfortracingblockioactions:
块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据。
SupportforLargeSingleFiles:
仅在可能使用大于2TB的文件时需要。
IOSchedulers:
IO调度器。
AnticipatoryI/Oscheduler:
假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)。
DeadlineI/Oscheduler:
使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)。
CFQI/Oscheduler:
使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统。
DefaultI/Oscheduler:
默认IO调度器。
处理器内型及特性
代码:
1.Processortypeandfeatures--->
2.SubarchitectureType(PC-compatible)
3.--->Processorfamily
(Pentium-4/Celeron(P4-based)/Pentium-4
M/Xeon)--->
4.[]Genericx86support
5.[*]HPETTimerSupport
6.[*]Symmetricmulti-processingsupport
7.
(2)MaximumnumberofCPUs(2-255)
8.[*]SMT(Hyperthreading)scheduler
support
9.[]PreemptibleKernel
10.[]MachineCheckException
11.ToshibaLaptopsupport
12.Delllaptopsupport
13.<>/dev/cpu/microcode-IntelIA32CPU
microcodesupport
14.<>/dev/cpu/*/msr-Model-specific
registersupport
15.<>/dev/cpu/*/cpuid-CPUinformation
support
16.FirmwareDrivers--->
17.<>BIOSEnhancedDiskDrivecalls
determinebootdisk(EXPERIMENTAL)High
MemorySupport(4GB)--->
18.[]Allocate3rd-levelpagetablesfrom
highmem
19.[]Mathemulation
20.[*]MTRR(MemoryTypeRangeRegister)
support
21.[]BootfromEFIsupport(EXPERIMENTAL)
22.[*]Enablekernelirqbalancing
23.[]Useregisterarguments
(EXPERIMENTAL)
SubarchitectureType,这没什么好说的,如果用PC机的话都选这个。
Processorfamily,这也没什么好说的,选择你机器对应的处理器即可。
Genericx86support,这一选项针对x86系列的CPU使用更多的常规优化。
如果你在上面一项选的是i386、i586之类的才选这个。
HPETTimerSupport,HPET是替代8254芯片的下一代时钟处理器。
这里你可以安全的选上这一选项。
如果硬件不支持的话,将仍使用8254时钟处理器。
Symmetricmulti-processingsupport,对称多处理器支持,在单CPU的机器上,不选这个选项会更快一些。
由于超线程技术,看起来是两颗CPU,因些要选上这个选项。
MaximumnumberofCPUs(2-255),支持的最大CPU数。
SMT(Hyperthreading)schedulersupport,超线程支持,如果你的CPU是P4超线程的,应该选上这一选项。
PreemptibleKernel,这个选项能使应用程序即使内核在高负载时也很可靠,建议最好选上。
MachineCheckException,这个选项能让CPU检测到系统故障时通知内核,一般我用组装的台式机会选这项。
本本嘛,我感觉还是非常可靠的,所以就不选它了。
ToshibaLaptopsupport,Delllaptopsupport,这两项都是对本本的支持,其实编译内核的原则应该是让内核能在特定的环境下运行,由于我编译的内核可能公司的其它人也会使用,所以我尽可能的不针对特定的硬件。
将对特定的硬件支持编译成模块。
/dev/cpu/microcode-IntelIA32CPUmicrocodesupport,这个选项是让你使用不随Linux内核发行的IA32microcode,但是你必需有IA32microcode的二进制文件。
/dev/cpu/*/msr-Model-specificregistersupport,这个选项能让特权CPU访问x86的MSR寄存器。
由于超线程并不是真正的多处理器环境,所以不要选择这个。
/dev/cpu/*/cpuid-CPUinformationsupport,这个选项能从dev/cpu/x/cpuid获得CPU的唯一标识符。
BIOSEnhancedDiskDrivecallsdeterminebootdisk,台式机的有些BIOS支持从某块特定的硬盘启动,由于本本只能装一块硬盘,所以就不选择这项了。
如果你的BIOS不支持这个功能而你选上的话,有可能无法启动。
HighMemorySupport(4GB),4GB的内存支持,已经足够了。
Allocate3rd-levelpagetablesfromhighmem,除非你真的有几G的内存,选择这个是没有意义的。
Mathemulation,估计现在没人有386或486SX的处理器了吧,那就不要选这个。
MTRR(MemoryTypeRangeRegister)support,这个选项必需要选上。
BootfromEFIsupport(EXPERIMENTAL),由于我使用的是GRUB,所以选上这个也没什么用。
Enablekernelirqbalancing,选上这个选项能让内核进行IRQ均衡。
Useregisterarguments(EXPERIMENTAL),使用-mregparm=3参数编译内核,将前3个参数以寄存器方式进行参数调用。
GCC的版本必需大于等于3.0。
SMT(Hyperthreading)schedulersupport:
支持Intel的超线程(HT)技术。
Multi-coreschedulersupport:
针对多核CPU进行调度策略优化。
PreemptionModel:
内核抢占模式。
NoForcedPreemption(Server):
适合服务器环境的禁止内核抢占。
VoluntaryKernelPreemption(Desktop):
适合普通桌面环境的自愿内核抢占。
PreemptibleKernel(Low-LatencyDesktop):
适合运行实时程序的主动内核抢占。
PreemptTheBigKernelLock:
可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境。
EnableVM86support:
虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要。
EnableX86boardspecificfixupsforreboot:
修正某些旧x86主板的重起bug,这种主板基本绝种了。
FirmwareDrivers:
固件驱动程序。
BIOSupdatesupportforDELLsystemsviasysfs:
仅适用于DELL机器。
DellSystemsManagementBaseDriver:
仅适用于DELL机器。
Memorysplit:
如果你不是绝对清楚自己在做什么,不要改动这个选项。
Memorymodel:
一般选"FlatMemory",其他选项涉及内存热插拔。
64bitMemoryandIOresources:
使用64位的内存和IO资源。
Enableseccomptosafelycomputeuntrustedbytecode:
只有嵌入式系统可以不选。
Timerfrequency:
内核