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