Linux内核配置(16)

-M- Distributed Lock Manager (DLM) --->

发行版锁定管理器

一个通用的发行版锁定管理器,用于内核或者用户空间程序。

--- Distributed Lock Manager (DLM)

[] DLM debugging

Kernel hacking --->

内核调试

[] Show timing information on printks

printk 的输出中包含时间信息(取用内核消息时间戳)

使内核输出的日志文件(/var/log/messages)包含准确的创建时间(可精确到内核最小可度量时间)。采用dmesg命令输出的内核日志信息不包含时间戳。

选择这个选项,将可以在printk输出上显示时间信息。这允许你在内核的操作之间测量时间间隔,包括启动操作。这对于标识内核启动时的长延迟非常有用。

(4) Default message log level (1-7) (NEW)

[ ] Enable __deprecated logic

允许_deprecated逻辑

在内核编译时允许_deprecated逻辑。禁止这个选项,将不会得到这个信息:warning: ‘foo’ is deprecated ( declared at kernel/power/somefile.c:1234 ).

[] Enable __must_check logic

允许_must_check逻辑

在编译内核的过程中使用"必须检查"的逻辑,禁用它将不会显示警告信息:warning: ignoring return value of ‘foo’ , declared with attribute warn_unused_result

(2048) Warn for stack frames larger than (needs gcc 4.4)

警告堆栈帧超过规定数值(需要gcc 4.4

gcc在编译时,在堆栈帧数超过规定数值时发出警告。把这个值设置过低会导致很多的警告。把它设置为零则禁用警告。

-*- Magic SysRq key

魔术键SysRq

如果你选Y,你将可以控制整个系统,即使系统已经崩溃。比如在内核调试的时候(你需要清除磁盘缓存,快速重启系统,转移一些状态信息)。这通过按下SysRq(Alt+PrintScreen)的同时,按不同的一些按键来实现。

它在串行的控制台上同样可以工作(至少在PC硬件上),如果你发出一个中断,并且在5秒内发出按键命令。

除非你非常清楚这个选项,官方不推荐选择

相关组合键:(略)。摘自:《linux新手管理员手册》

详见内核源代码树中的Documentationsysrq.txt

[] Strip assembler-generated symbols during link

[ ] Enable unused/obsolete exported symbols

允许不使用的/废弃的导出符号

不使用的导出符号会使内核不必要地变大。所以很多不使用的导出都被移除了。

这个选项主要是为了一些外部内核模块提供过渡,以防它会使用到这些符号。如果你遇到了这样的情况,你需要考虑是否使用了正确的接口(解释:由于没有人在内核模块中使用它,它实际上已经是错误的应用接口)。

如果你真的需要这些符号,请你发个电子邮件到linux内核的官方邮箱上,说明你需要哪些符号,为什么需要,以及对于在新的内核中融合这些符号的计划。

-*- Debug Filesystem

调试文件系统(一个RAM文件系统)

调试文件系统是一个虚拟的文件系统。内核开发者用来放入要调试的文件。允许这个选项,你将可以读写这些文件。

内核将创建/sys/kernel/debug目录作为挂载debugfs文件系统的地点

可以在/etc/fstab中添加“debugfs /sys/kernel/debug debugfs 0 0”,使系统启动时自动挂载

[ ] Run 'make headers_check' when building vmlinux

vmlinux编译运行时运行make headers_check

这个选项在编译内核时解压用户可见的内核头文件,并且进行基本的的检查与判断,以确保要解压的文件是用户需要的文件,等等。

当你修改了与用户空间相关的内核头文件后建议启用该选项。并检查解压到$(INSTALL_HDR_PATH)(通常在你的编译树usr/include中)的头文件,确认它们是否合适。

[] Enable full Section mismatch analysis

[] Kernel debugging

内核调试

Y,如果你正在开发驱动程序,或者尝试调试和鉴定内核问题。

[] Debug shared IRQ handlers

调试共享的IRQ中断处理器

Y,在共享的中断处理器被注册后,或者取消注册前,将会生成伪中断。

设备应该能够在相关节点处理中断。一些中断需要/不需要发生。

[] Detect Hard and Soft Lockups

探测软件锁定

Y,允许内核探测软件锁定,这是一种BUG,它使内核陷入死循环,在10秒以上都不会响应其他的工作任务。当一个软件锁定被探测到时,内核将会打印出目前的堆栈痕迹(你需要报告这些情况),但是系统将保持锁定。这个选项特性造成微不足道的花销。

硬件锁定是另一种类型的BUG,可以通过NMI-watchdog探测到,它在相关支持的平台上使用。

[] Panic (Reboot) On Hard Lockups

[] Panic (Reboot) On Soft Lockups

[] Detect Hung Tasks (NEW)

(120) Default timeout for hung task detection (in seconds) (NEW)

[] Panic (Reboot) On Hung Tasks

-*- Collect scheduler debugging info

收集调度器调试信息

如果你选Y,将会生成/proc/sched_debug文件,有助你调试调度器。这个选项在运行时的花销是很小的。

-*- Collect scheduler statistics

收集调度器统计信息

如果你在这选Y,额外的代码将会嵌入到调度器和相关的标准程序当中,以便收集调度器的行为统计信息,并在/proc/schedstat文件中提供。这些统计信息可能会在调整和调试调度器时有用。如果你不想调试调度器或者尝试调整一个特别的程序,你可以选N,以避免增加一点点小的花销。

[] Collect kernel timers statistics

收集内核时间器统计信息

如果你在这选Y,额外的代码将会嵌入时间器的标准程序,以便收集内核时间器重调的统计信息。这些信息可以通过/proc/time_stats阅读。信息统计工作通过向/proc/time_stats写入1开始,写入0结束这个特性在收集时间器在内核和用户空间工作模式的信息时很有用。这个特性是轻量级的,如果在内核中允许配置,但是不激活它(它默认在系统启动时不激活。仅当一些程序,如powertop,明确要求时,它才被激活)。

[] Debug object operations

调试对象操作

如果你选Y,额外的代码将加入内核,以追踪各种对象的生存时间,和有效地操作那些对象。

[] Debug objects selftest

[] Debug objects in freed memory

[] Debug timer objects

[] Debug work objects

[] Debug RCU callbacks objects

[] Debug percpu counter objects

(1) debug_objects bootup default value (0-1) (NEW)

[ ] Enable SLUB performance statistics

允许SLUB执行统计信息

SLUB统计信息对于调试SLUB分配行为,优化分配器有着良好的作用。这项功能应该不会选上,因为它会让你的分配器效率降低一些百分比。命令: slabinfo支持判定最为动态的片,以便决定哪些片对特殊的装载有关联。

SLAB:传统的内存管理方式。

SLUB:从2.6.22内核开始引入了SLUB的内存管理方式,默认代替SLAB

[] Kernel memory leak detector

(400) Maximum kmemleak early log entries (NEW)

<>Simple test for the kernel memory leak detector

[] Default kmemleak to off

[] RT Mutex debugging, deadlock detection

RT Mutex调试,探测死锁定

这里允许自动探测和报告rt mutex的语法错误和关联的死锁定。

[] Built-in scriptable tester for rt-mutexes

嵌入式rt-mutexes脚本测试器

这个选项开启rt-mutex测试器。

-*- Spinlock and rw-lock debugging: basic checks

旋转锁定和读写锁定调试:基本检查

在这选Y,将会使SMP获取遗失的旋转锁定初始值和旋转锁定造成的其他类型的通用错误。这在与NMI watchdog结合中大量使用,以便旋转锁定造成的死锁定也能被调试。

-*- Mutex debugging: basic checks

Mutex调试:基本检查

这个特性允许检查和报告mutex语义错误。

-*- Lock debugging: detect incorrect freeing of live locks

锁定调试:探测不正确的活动锁定释放

这个特性将检查每个保持的锁定(spinlock,rwlock,mutex or rwsem)是否被内核不正确地释放,这个检查通过各种常规的内存释放方法(kfree(),kmem_cache_free(),free_pages(),vfree()等等)。它还检查每个活动的锁定是否被不正确地重置,这一检查通过spin_lock_init()/mutex_init()等实现,或者检查在任务退出后,是否还保持有锁定。

[] Lock debugging: prove locking correctness

锁定调试:验证锁定正确性

这个特性允许内核验证所有在内核运行时发生的锁定都是绝对正确的:在任何情况下,任意(没有触发的)整合的可观察到的锁定队列(在任意数量的CPU,运行任意数量的任务和处理任意的中断)都不会导致死锁定错误。

简单地说,这个特性允许内核在死锁定发生前就报告锁定的关系。

这个验证不依赖于一个死锁定的触发方案有多困难和多复杂:这个触发会需要多少个特殊的CPU,任务和中断内容等信息。它也不依赖于时间:如果一个竞争和一个有结果的死锁定在理论上是可能的(无论这个竞争的方案有多么的不可能),它将会被验证并立即通过内核进行报告(一旦事件被观察,将使死锁定理论上可能)。

如果一个死锁定不可能(例如,锁定的规则,在内核看来是绝对正确的),那么内核将什么都不报告。

注意:这个特性同样用在rwlocks,mutexrwsems上-以便在这些不同的锁定变量中的所有依赖也被观察和映像。同样,这项正确性验证将检查任意整合的各种锁定变量。

[] RCU debugging: prove RCU correctness

[] RCU debugging: don't disable PROVE_RCU on first splat

[] RCU debugging: sparse-based checks for pointer usage

[] Lock usage statistics

锁定用法统计信息

这个功能允许追踪锁定争用点。

[] Lock dependency engine debugging

[] Sleep inside atomic section checking

[] Locking API boot-time self-tests

锁定接口启动自检

Y,如果你想要内核在启动时运行一个小的自检程序的话。自检程序将检查一般的锁定BUG类型是否被调试机构检测到(当然,如果你禁止了锁定调试,那些BUG将不会被检测)。锁定接口包含以下几个:spinlocks , rwlocks , mutexrwsems

[] Stack utilization instrumentation

[] kobject debugging

kobject调试

如果你选Y,一些额外的kobject调试信息将会发至系统信息文件中。

[] Highmem debugging

[] Compile the kernel with debug info

编译内核包含调试信息

如果你选Y,编译好的内核中将会包含调试信息,这也使得内核的镜像会变大。它增加调试符号到内核和模块(gcc –g)中,如果你想要使用内核错误卸载工具或者二进制对象工具,如crash , kgdb , LKCD , gdb等,它将非常有用。

[] Reduce debugging information

[] Debug VM

调试虚拟内存

这里会对虚拟内存系统进行额外的检查,也会影响系统性能。

[] Debug VM translations

允许在虚拟内存页面进行一些额外的完整性检查。这可以用virt_to_page()和同类函数捕捉错误。

[] Debug filesystem writers count

调试文件系统写计数

开启这项以在vfsmount中截获写计数的使用错误。这将使每个文件架构增加32字节。

[] Debug linked list manipulation

调试链路表操作

Y,可以打开额外的链路表标准路径检查。

[] Linked list sorting test

[] Debug SG table operations

调试SG表操作

Y,可以对SG表(散射-集合表)进行检查。这可以帮助程序查找驱动,它们在初始化时没有能够正确地找到SG表。

[] Debug notifier call chains

[] Debug credential management

-*- Compile the kernel with frame pointers

编译内核时加入构架指针

如果你选Y,那么编译好的内核镜像将会有点大和慢,但是它很可能很有用,如果你想得到一些体系构架的信调试息,或者使用额外的调试器的话。

[ ] Delay each boot printk message by N milliseconds

对每个启动时的printk信息造成N毫秒的延迟

这个选项允许你读取内核的每个启动信息,它在这些信息中间加入了一些延迟。这个延迟值以毫秒计算,可以通过内核命令行boot_delay=N来修改。

看起来你需要使用lpj来预先设置loop per jiffie的值。

看看前一个启动信息关于lpj值的描述,然后在设置boot_delay=N之前先设置lpj=M

注意:使用这个选项将会对多CPU系统不利,第一个CPU以外的CPU将不会正确启动。

BOOT_PRINTL_DELAY参数同样会引起参数DETECT_SOFTLOCKUP来探测它认为需要探测的锁定条件。

<> torture tests for RCU

RCU严格测试

这个选项提供一个内核模块,它对RCU的基础构架进行严格的测试。这个模块将在内核设计为测试时建立。

(60) RCU CPU stall timeout in seconds (NEW)

[] Kprobes sanity tests

K探测器稳健测试

这个选项用于在启动时测试基本的轫探测器系列功能。K探测器的样本,jprobekretprobe将插入和检验这些功能。

<> Self test for the backtrace code

对后台追踪代码自检

这个选项将提供一个内核模块,它可以用来检查内核堆栈的后台追踪代码。这个选项对于发行内核或者常规内核没有多大用处,但是对于内核开发者致力于体系构架的研究来说比较有用。

[ ] Force extended block device numbers and spread them

强迫额外块设备数量和扩展它们

警告:开启这个选项将可能会在某些发行版导致崩溃!请不要开启它,除非你知道你在干什么。

[] Force weak per-cpu definitions

[] Debug access to per_cpu maps

<> Linux Kernel Dump Test Tool Module

linux内核转储测试工具模块

这个模块开启对不同的转储机制的测试,这通过包含系统预定义崩溃点来实现。

编译成模块为:lkdtm

CPU notifier error injection module

[ ] Fault-injection framework

故障注入结构

提供故障注入结构。

[] Fault-injection capability for kmalloc

[] Fault-injection capabilitiy for alloc_pages()

[] Fault-injection capability for disk IO

[] Fault-injection capability for faking disk interrupts

[] Debugfs entries for fault-injection capabilities

[] stacktrace filter for fault-injection capabilities

[ ] Latency measuring infrastructure

延迟测量基础设施

Y,如果你想要使用延迟工具来寻找哪个用户空间被内核操作给堵塞了。

[] Sysctl checks

Sysctl检查

Sys_sysctl使用二进制路径,这已经被发现与维护和使用相冲突。这里开启相关的检查,以帮助你确保一切正常。

[] Deprecated power event trace API, to be removed (NEW)

[] Tracers --->

内核跟踪分析器

--- Tracers
-*- Kernel Function Tracer

内核功能追踪器

[] Kernel Function Graph Tracer (NEW)
[] Interrupts-off Latency Tracer

中断关闭延迟追踪器

[] Scheduling Latency Tracer

调度延迟追踪器

[] Trace syscalls
Branch Profiling (No branch profiling) --->
(X) No branch profiling
( ) Trace likely/unlikely profiler
( ) Profile all if conditionals
[] Trace max stack

追踪最大堆栈

[] Support for tracing block IO actions

块队列IO跟踪支持

允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据。

[] Enable kprobes-based dynamic events (NEW)
[] enable/disable ftrace tracepoints dynamically (NEW)
[] Kernel function profiler
[] Perform a startup test on ftrace
[] Run selftest on syscall events
[] Memory mapped IO tracing
<> Test module for mmiotrace
<> Ring buffer benchmark stress tester

[] Remote debugging over FireWire early on boot

在启动时通过火线开启远程调试

如果你想要调试一些在启动的早期导致内核挂起或者崩溃的程序,同时这个崩溃的机器有一个火线接口的话,那么你可以使用这个特性,通过火线接口来远程访问崩溃机器的内存。这个远程访问直接内存存储是OHCI1394标准的一部分,现在已经是火线控制器的标准。

通过远程的DMA,你可以使用firescope远程监视printk缓存,可以使用gdb下的工具fireproxy访问所有4GB以下的内存。甚至控制内核调试器都可以采用远程DMA

用法:

如果ohci1394_dma=early被用于启动参数,它将初始化所有的OHCI1394控制器,这些可以在PCI设置空间里找到。

由于所有对于火线总线的改变,比如允许和禁止设备,会导致总线重置,从而会对所有设备禁止远程DMI。因此你在调试前要确信在调试对象启动前,电缆插上,火线在调试主机上开启。

这个代码(1K)在启动后被释放。到那时,火线堆栈将处于OCHI-1394控制器的控制之下,它将代替该代码使用。

[] Build targets in Documentation/ tree

[ ] Enable dynamic printk() support

允许动态printk()调用支持

[ ] Enable debugging of DMA-API usage

[] Perform an atomic64_t self-test at boot

[ ] Sample kernel code --->

内核代码范例

你可以在这构建和测试内核代码范例。

--- Sample kernel code
<>Build tracepoints examples -- loadable modules only
<>Build trace_events examples -- loadable modules only
<>Build kobject examples -- loadable modules only
<>Build kprobes examples -- loadable modules only
<>Build kretprobes example -- loadable modules only
<>Build kernel hardware breakpoint examples -- loadable module
<>Build kfifo examples -- loadable modules only

[] KGDB: kernel debugger --->

--- KGDB: kernel debugger
<>KGDB: use kgdb over the serial console (NEW)
[] KGDB: internal test suite
[] KGDB: Run tests on boot
(V1F100)KGDB: which internal kgdb tests to run (NEW)
[] KGDB: Allow debugging with traps in notifiers
[] KGDB_KDB: include kdb frontend for kgdb
[] KGDB_KDB: keyboard as input device

[] kmemcheck: trap use of uninitialized memory --->

Test kstrto*() family of functions at runtime

[ ] Filter access to /dev/mem

过滤访问/dev/mem

[] Enable verbose x86 bootup info messages

允许详细x86启动信息

在内核镜像解压缩阶段输出启动信息,关闭后相当于无声启动(Slient Bootup)

-*- Early printk

预先printk

[] Early printk via EHCI debug port

允许printk 通过EHCI 调试端口输出内核日志,调试的一律关

[] Check for stack overflows

检查堆栈溢出

这个选项,将在自由堆栈空间超过下限时打印相关信息。

[] Export kernel pagetable layout to userspace via debugfs

通过debugfs输出内核表至用户空间

[] Write protect kernel read-only data structures (NEW)

写入保护内核只读数据结构

使内核的只读数据在分页表中变为写保护,这是为了捕获偶然的(或者不正确的)对于这个常数的写入。这是推荐选项,这样我们可以很快地找到内核BUG

[] Testcase for the DEBUG_RODATA feature

DEBUG_RODATA特性测试

Change_page_attr()的基本设施。

[] Set loadable kernel module data as NX and text as RO

<> Testcase for the NX non-executable stack feature

Nx非运行堆栈特性测试盒

这个选项开启CPU NX功能测试盒,同时提供一些相应的设置软件。

[ ] Enable IOMMU stress-test mode

[] x86 instruction decoder selftest

IO delay type (port 0x80 based port-IO delay [recommended]) --->

IO延迟类型

(X) port 0x80 based port-IO delay [recommended]

Port-IO基准0x80端口延迟(推荐)

这是传统的linux IO延迟,用于in/out_p。它经过最多的测试,所以是最安全的选择。

( ) port 0xed based port-IO delay

port-IO基准0xed端口延迟

使用0xed端口作为IO延迟。这将释放0x80端口,因为它经常被用于硬件调试端口。

( ) udelay based port-IO delay

Port-IO基准udelay延迟

使用udelay(2)作为IO延迟。这在没有IO端口空间可供使用的时候来提供延迟。

( ) no port-IO delay

没有port-IO延迟

没有IO端口延迟。这将使老的机器无法使用,因为它在具体操作上需要IO端口延迟。这在新的机器上可以工作。

[] Debug boot parameters

调试启动参数

[] CPA self-test code

CPA自检查代码

30秒用change_page_attr()进行自检

[] Allow gcc to uninline functions marked 'inline'

允许gcc对标记为“内联”的函数取消内联

[] Strict copy size checks

[] NMI Selftest

Security options --->

安全特性,我选择全关,当然,这些选项不会影响你的日常开发,办公

-*- Enable access key retention support

允许保持访问钥匙

这个选项可以在内核中保留访问的钥匙和验证标志。它同样提供一些方法,使得一个进程,如网络文件系统、加密支持等可以连接上这些钥匙。

而且,它还提供一个特殊的钥匙,它运作起来像一个钥匙链:一个可查询的钥匙序列。每个进程都配备了可访问的5个标准钥匙链:UIDGIDsessionprocessthread

在内核中保留authentication tokenaccess key

若不清楚,可选N

<>TRUSTED KEYS

<>ENCRYPTED KEYS

[] Enable the /proc/keys file by which keys may be viewed

生成/proc/keys文件以便钥匙可以被访问

这个选项将生成/proc/keys文件,里面包含所有的钥匙列表,可以被相应进程访问到。

在表中的钥匙是授权给访问进程查看的,无论这些进程是否能够控制钥匙。注意LSM安全检查仍然有效,而且可能会过滤掉没有授权给目前进程访问的钥匙。表中仅仅显示钥匙的属性,更多的量没有包括在结果表中。

允许有权限的进程通过/proc/keys读取所有的key

若不清楚,可选N

[] Restrict unprivileged access to the kernel syslog

[] Enable different security models

允许不同的安全模型

这里允许你选择不同的安全模式,以配置进内核。

如果你没有选这个选项,linux将使用默认的安全模式。

若不清楚,可选Y

-*- Enable the securityfs filesystem

-*- Socket and Networking Security Hooks

套接字和网络安全钩

这里允许套接字和网络安全钩。如果选上了,一个安全模块可以使用这些钩来实施套接字和网络访问控制。

允许安全模型通过Security HookSocketNetworking进行访问控制

使用SELinux必选。若不清楚可选N

[] XFRM (IPSec) Networking Security Hooks

XFRM(IPSec)网络安全钩

这里允许XFRM(IPSec)网络安全钩。如果你选上了,一个安全模块可以使

用这些钩来实施每个包的访问控制,通常这些包的传递基于IPSec规则。非IPSec的通讯将会定义为未标识的,也只有被授权进行未标识通讯的套接字能够不通过IPSec进行传输。

启用XFRM安全Hook

若不清楚,可选N

-*- Security hooks for pathname based access control

(65536) Low address space for LSM to protect from user allocation (NEW)

低端地址空间保护用户配置

这里是低端虚拟内存的一部分,以保护用户空间的配置。防止用户改写低端内存能够减少内核受到空指针BUG的冲击。

大多数用户拥有65536以上的内存空间,这是合理的,可以减少问题的发生。那些使用vm86功能的程序,要么需要额外的许可来访问LSM或者功能模块,要么要禁止掉这项保护功能。

这个值可以在系统启动后,在/proc/sys/vm/mmap_min_addr中调节

你可能感兴趣的:(linux)