Devyn的Linux內(nèi)核專題:配置內(nèi)核(3)
OK,我們還繼續(xù)配置內(nèi)核。還有更多功能等待著去配置。
下一個(gè)問(wèn)題(Enable ELF core dumps (ELF_CORE))詢問(wèn)的是內(nèi)核是否可以生成內(nèi)核轉(zhuǎn)儲(chǔ)文件。這會(huì)使內(nèi)核變大4KB。所以我選擇了"no"。
注意:內(nèi)核轉(zhuǎn)儲(chǔ)文件(內(nèi)存或者系統(tǒng)的轉(zhuǎn)儲(chǔ))是程序崩潰前已記錄的狀態(tài)。內(nèi)核轉(zhuǎn)儲(chǔ)是用來(lái)調(diào)試問(wèn)題的。這個(gè)轉(zhuǎn)儲(chǔ)文件的格式是ELF(Executable and Linkable Format )。
下面可以啟用PC揚(yáng)聲器(Enable PC-Speaker support (PCSPKR_PLATFORM))。大多數(shù)計(jì)算機(jī)用戶擁有并使用揚(yáng)聲器,所以這個(gè)啟用它。
雖然下面的特性會(huì)增加內(nèi)核的大小(Enable full-sized data structures for core (BASE_FULL))(啟用完全大小的內(nèi)核數(shù)據(jù)結(jié)構(gòu)),但性能也隨之增加。所以我選擇"yes"。
為了使內(nèi)核可以運(yùn)行基于glibc的程序,必須啟用FUTEX(Enable futex support (FUTEX))。這個(gè)特性啟用了快速用戶空間互斥鎖(Fast Userspace muTEXes)。
注意:glibc(GNU C Library)是由GNU實(shí)現(xiàn)的標(biāo)準(zhǔn)C庫(kù)。
注意:FUTEX (fast userspace mutex)是用來(lái)防止兩個(gè)線程訪問(wèn)同一個(gè)不能被多個(gè)線程使用的共享資源。
下一個(gè)問(wèn)題(Enable eventpoll support (EPOLL))可以通過(guò)回答"no"來(lái)禁用epoll系統(tǒng)調(diào)用。然而,為了含有epoll系統(tǒng)調(diào)用,我選擇了"yes"。epoll是一種I/O事件通知系統(tǒng)。
為了收到來(lái)自文件描述符的信號(hào),我們啟用signalfd系統(tǒng)調(diào)用(Enable signalfd() system call (SIGNALFD)。
如果啟用這個(gè)特性(Enable timerfd() system call (TIMERFD)),它允許程序使用定時(shí)器事件獲取文件描述符。
我們現(xiàn)在的配置必須啟用eventfd系統(tǒng)調(diào)用(Enable eventfd() system call (EVENTFD))。它默認(rèn)啟用訪問(wèn)共享內(nèi)存文件系統(tǒng)(Use full shmem filesystem (SHMEM)。共享內(nèi)存文件系統(tǒng)是一種虛擬內(nèi)存文件系統(tǒng)。
下一個(gè)問(wèn)題是"Enable AIO support (AIO)"。這個(gè)特性啟用了線程化程序使用的POSIX異步I/O。
注意:異步I/O用來(lái)處理輸入/輸出,它允許線程在傳輸完成前就完成處理。
如果你正在給一個(gè)嵌入式系統(tǒng)配置一個(gè)內(nèi)核,那么問(wèn)題“Embedded system (EMBEDDED)”可以選擇"yes"。否則就像我一樣選擇"no"。
注意:嵌入式系統(tǒng)是運(yùn)行在一個(gè)更大的電子系統(tǒng)的實(shí)時(shí)計(jì)算機(jī)。
現(xiàn)在,我們可以配置內(nèi)核性能事件和計(jì)時(shí)器了。配置工具沒(méi)有給開(kāi)發(fā)者選擇,直接啟用了事件和計(jì)數(shù)器(Kernel performance events and counters (PERF_EVENTS))(內(nèi)核性能事件和計(jì)數(shù)器)。這是一個(gè)重要特性。
接下來(lái),我們可以禁用另外一個(gè)調(diào)試特性(ebug: use vmalloc to back perf mmap() buffers (DEBUG_PERF_USE_VMALLOC))。
如果啟用了VM事件計(jì)數(shù)器,那么事件計(jì)數(shù)就會(huì)顯示在/proc/vmstat(Enable VM event counters for /proc/vmstat (VM_EVENT_COUNTERS))。如果禁用了事件計(jì)數(shù)就不會(huì)顯示,/proc/vmstat只會(huì)顯示內(nèi)存頁(yè)計(jì)數(shù)。
為了更好地支持PCI芯片,(Enable PCI quirk workarounds (PCI_QUIRKS))回答yes。這會(huì)啟用對(duì)PCI芯片的怪異行為和bug的臨時(shí)解決方案。
下面一個(gè)調(diào)試特性可以像我一樣禁用掉(Enable SLUB debugging support (SLUB_DEBUG))。這個(gè)特性會(huì)耗費(fèi)很多空間并且會(huì)禁用用于調(diào)試內(nèi)核的SLB sysfs。如果這個(gè)特性被禁用,那么/sys/slab就不會(huì)存在并且系統(tǒng)上也不再支持緩沖驗(yàn)證。
堆隨機(jī)化是一個(gè)讓利用堆漏洞更加困難的特性(Disable heap randomization (COMPAT_BRK))。然而我們不應(yīng)該去啟用它,因?yàn)槿魏位趌ibc5的軟件都無(wú)法工作在這個(gè)系統(tǒng)上!只有我們有特別的理由這么做或者如果你不會(huì)使用基于libc5的軟件時(shí)才去啟用它。我禁用了這個(gè)特性。當(dāng)編譯一個(gè)通用的內(nèi)核時(shí),開(kāi)發(fā)這會(huì)希望禁用這個(gè)特性。
接下來(lái)必須選擇一個(gè)SLAB分配器。SLAB分配器是一個(gè)沒(méi)有碎片且有效率地將內(nèi)核對(duì)象放置在內(nèi)存中的內(nèi)存管理系統(tǒng)。默認(rèn)選擇是"2"。
Choose SLAB allocator
1. SLAB (SLAB)
> 2. SLUB (Unqueued Allocator) (SLUB)
3. SLOB (Simple Allocator) (SLOB)
choice[1-3?]: 2
為了支持?jǐn)U展性能支持,(Profiling support (PROFILING))回答"yes"。
下一個(gè)問(wèn)題讓開(kāi)發(fā)者選擇是否啟用OProfile系統(tǒng)。它可以禁用、啟用或者添加為一個(gè)模塊在需要時(shí)載入。我選擇禁用這個(gè)特性。
Kprobes允許用戶捕捉幾乎任意的內(nèi)核地址去啟動(dòng)一個(gè)回調(diào)函數(shù)。這是一個(gè)可以像我一樣禁用的調(diào)試工具(Kprobes (KPROBES))。
這個(gè)優(yōu)化特性可以啟用(Optimize very unlikely/likely branches (JUMP_LABEL))(優(yōu)化非常近似/不近似的分支)。這使分支預(yù)判更加簡(jiǎn)單并可以減小開(kāi)銷。
配置工具啟用了一個(gè)實(shí)驗(yàn)性特性"透明用戶空間探針"(Transparent user-space probes (EXPERIMENTAL) (UPROBES))。不過(guò)不要擔(dān)心,系統(tǒng)可以很好工作,并不是所有的實(shí)驗(yàn)性特性是不穩(wěn)定或者壞的。
接下來(lái),我們會(huì)被詢問(wèn)基于gcov的內(nèi)核分析(Enable gcov-based kernel profiling (GCOV_KERNEL))。這可以被禁用。
為了允許內(nèi)核加載模塊,需要啟用可加載模塊支持(Enable loadable module support (MODULES))。
內(nèi)核一般只能加載有版本號(hào)的模塊。如果想允許內(nèi)核加載沒(méi)有版本號(hào)的模塊,就啟用這個(gè)特性(Forced module loading (MODULE_FORCE_LOAD))(強(qiáng)制模塊載入)。這么做是一個(gè)很糟糕的注意,所以我已經(jīng)禁用了它,除非你有特定的需求需要這個(gè)特性。
如果啟用了這個(gè)特性(Module unloading (MODULE_UNLOAD)),Linux內(nèi)核也能卸載模塊,最好啟用。如果內(nèi)核判斷你要卸載的模塊不應(yīng)該被卸載,那么用戶則無(wú)法卸載模塊。啟用強(qiáng)制卸載也行,但是不建議(Forced module unloading (MODULE_FORCE_UNLOAD)。
為了使用不是為你的內(nèi)核開(kāi)發(fā)的或者并不適用你的版本號(hào)的模塊,可以啟用版本支持(Module versioning support (MODVERSIONS))。最好不要混用不同版本號(hào)的模塊,所以我禁用了這個(gè)特性。
模塊在它們的modinfo(模塊信息)里有一個(gè)字段名為"srcverion"。這個(gè)字段允許開(kāi)發(fā)者知道使用什么源碼版本來(lái)編譯模塊。啟用這個(gè)選項(xiàng)可以在編譯模塊的時(shí)候加入這個(gè)字段。這個(gè)并不必要,所以我禁用了它(Source checksum for all modules (MODULE_SRCVERSION_ALL))。如果啟用了先前的選項(xiàng),開(kāi)發(fā)者可以將校驗(yàn)和加入到模塊中(Source checksum for all modules (MODULE_SRCVERSION_ALL))。
為了啟用模塊簽名驗(yàn)證(Module signature verification (MODULE_SIG)),這個(gè)選項(xiàng)回答"yes"。因?yàn)檫@個(gè)并不必要,我選擇了"no",否則內(nèi)核在加載模塊前會(huì)檢查并驗(yàn)證簽名。
為了啟用塊級(jí)支持(Enable the block layer (BLOCK)),像我一樣選擇"yes"。禁用這個(gè)將會(huì)使塊設(shè)備無(wú)法使用并且無(wú)法啟用某些文件系統(tǒng)。
下面,SG支持已經(jīng)默認(rèn)啟用(Block layer SG support v4 (BLK_DEV_BSG))(塊級(jí)SG支持V4版),并且輔助庫(kù)也啟用了(Block layer SG support v4 helper lib (BLK_DEV_BSGLIB))。
下面回答的問(wèn)題是關(guān)于對(duì)塊設(shè)備的數(shù)據(jù)完整性支持(Block layer data integrity support (BLK_DEV_INTEGRITY))。這個(gè)特性允許擁有更好的數(shù)據(jù)完整性來(lái)提供設(shè)備數(shù)據(jù)保護(hù)特性。許多設(shè)備不支持這個(gè)特性,所以我禁用了它。
如果啟用了塊級(jí)bio帶寬限制(Block layer bio throttling support (BLK_DEV_THROTTLING))那就可以限制設(shè)備的IO速率。
為了啟用外部分區(qū)方案的支持,這個(gè)問(wèn)題就回答"yes"(Advanced partition selection (PARTITION_ADVANCED))。我禁用了這個(gè)特性。
為了啟用CSCAN(譯注:循環(huán)掃描)和FIFO過(guò)期請(qǐng)求,那就啟用最后期限IO調(diào)度器(Deadline I/O scheduler (IOSCHED_DEADLINE))。
CFQ IO調(diào)度器在處理器之間平均地分配帶寬。因此啟用這個(gè)特性feature (CFQ I/O scheduler (IOSCHED_CFQ))是個(gè)好主意。
下面,開(kāi)發(fā)者可以啟用或禁用CFQ組支持(CFQ Group Scheduling support (CFQ_GROUP_IOSCHED))。接下來(lái),開(kāi)發(fā)者可以選擇默認(rèn)的IO調(diào)度器,最好選擇DEFAULT_DEADLINE。
對(duì)于小于32位尋址的設(shè)備,下面的特性會(huì)分配16MB的尋址空間(DMA memory allocation support (ZONE_DMA))。如果你不使用這些設(shè)備,那么這個(gè)是可以禁用的,所以我禁用了它。
對(duì)于有多個(gè)CPU的系統(tǒng),最好啟用SMP(Symmetric multi-processing support (SMP))。對(duì)于只有單個(gè)處理器的設(shè)備,內(nèi)核會(huì)在禁用這個(gè)特性后執(zhí)行得更快。我啟用了這個(gè)特性。
對(duì)于支持x2apic的CPU,啟用x2apic支持support (Support x2apic (X86_X2APIC))。如果你的系統(tǒng)缺乏這個(gè)特性就像我一樣禁用它。
接下來(lái)我們可以啟用對(duì)那些缺乏合適的ACPI支持的舊式SMP系統(tǒng)的MPS表(Enable MPS table (X86_MPPARSE))。一些擁有ACPI、DSDT、MADT支持的更新的系統(tǒng)不需要這個(gè)特性。我禁用了它。
下面的問(wèn)題允許我們啟用擴(kuò)展x86平臺(tái)的支持(Support for extended (non-PC) x86 platforms (X86_EXTENDED_PLATFORM))。只有在你需要一個(gè)通用內(nèi)核或者內(nèi)核運(yùn)行在某個(gè)特定的需要擴(kuò)展支持的處理器上時(shí)才啟用它。我禁用了這個(gè)特性。
為了支持Intel低功耗子系統(tǒng),就啟用這個(gè)特性(Intel Low Power Subsystem Support (X86_INTEL_LPSS))。
單一深度WCHAN輸出(Single-depth WCHAN output (SCHED_OMIT_FRAME_POINTER))是用來(lái)計(jì)算電量(/proc//wchan),然而這會(huì)導(dǎo)致更多的功耗。
下面,我們啟用虛擬客戶系統(tǒng)支持(Paravirtualized guest support (PARAVIRT_GUEST))。這允許一個(gè)Guest操作系統(tǒng)與主操作系統(tǒng)一起運(yùn)行。我會(huì)禁用這個(gè)特性。
Memtest是一個(gè)在系統(tǒng)啟動(dòng)時(shí)檢測(cè)內(nèi)存的軟件。Memtest可以配置為每次或者有時(shí)開(kāi)機(jī)運(yùn)行。Memtest并不必要,所以我禁用了它。
這里我們可以選擇一個(gè)內(nèi)核應(yīng)該支持的處理器家族。我選擇了5 – Generic-x86-64。這是一個(gè)64位的系統(tǒng),x86是32系統(tǒng)。
下面我們能選擇也支持x86(32位)處理器 (Supported processor vendors (PROCESSOR_SELECT))。
為了發(fā)現(xiàn)機(jī)器異常,我們可以啟用DMI掃描(Enable DMI scanning (DMI)),這可以檢測(cè)異常。
要啟用DMA訪問(wèn)系統(tǒng)上32位內(nèi)存的3GB以上的內(nèi)存,下一個(gè)問(wèn)題(GART IOMMU support (GART_IOMMU))我們回答"yes"。
via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-3.4369/