戴文的Linux核心專題:07 配置核心 (3)

譯者: geekpi發表於2013-11-06

OK,我們還繼續配置核心。還有更多功能等待著去配置。

下一個問題(Enable ELF core dumps (ELF_CORE))詢問的是核心是否可以生成核心轉儲檔案。這會使核心變大4KB。所以我選擇了"no"。

注意:核心轉儲檔案(記憶體或者系統的轉儲)是程式崩潰前已記錄的狀態。核心轉儲是用來除錯問題的。這個轉儲檔案的格式是ELF(Executable and Linkable Format )。

下面可以啟用PC揚聲器(Enable PC-Speaker support (PCSPKR_PLATFORM))。大多數計算機使用者擁有並使用揚聲器,所以這個啟用它。

雖然下面的特性會增加核心的大小(Enable full-sized data structures for core (BASE_FULL))(啟用完全大小的核心資料結構),但效能也隨之增加。所以我選擇"yes"。

為了使核心可以執行基於glibc的程式,必須啟用FUTEX(Enable futex support (FUTEX))。這個特性啟用了快速使用者空間互斥鎖(Fast Userspace muTEXes)。

注意:glibc(GNU C Library)是由GNU實現的標準C庫。

注意:FUTEX (fast userspace mutex)是用來防止兩個執行緒訪問同一個不能被多個執行緒使用的共享資源。

下一個問題(Enable eventpoll support (EPOLL))可以通過回答"no"來禁用epoll系統呼叫。然而,為了含有epoll系統呼叫,我選擇了"yes"。epoll是一種I/O事件通知系統。

為了收到來自檔案描述符的訊號,我們啟用signalfd系統呼叫(Enable signalfd() system call (SIGNALFD)。

如果啟用這個特性(Enable timerfd() system call (TIMERFD)),它允許程式使用定時器事件獲取檔案描述符。

我們現在的配置必須啟用eventfd系統呼叫(Enable eventfd() system call (EVENTFD))。它預設啟用訪問共享記憶體檔案系統(Use full shmem filesystem (SHMEM)。共享記憶體檔案系統是一種虛擬記憶體檔案系統。

下一個問題是"Enable AIO support (AIO)"。這個特性啟用了執行緒化程式使用的POSIX非同步I/O。

注意:非同步I/O用來處理輸入/輸出,它允許執行緒在傳輸完成前就完成處理。

如果你正在給一個嵌入式系統配置一個核心,那麼問題“Embedded system (EMBEDDED)”可以選擇"yes"。否則就像我一樣選擇"no"。

注意:嵌入式系統是執行在一個更大的電子系統的實時計算機。

現在,我們可以配置核心效能事件和計時器了。配置工具沒有給開發者選擇,直接啟用了事件和計數器(Kernel performance events and counters (PERF_EVENTS))(核心效能事件和計數器)。這是一個重要特性。

接下來,我們可以禁用另外一個除錯特性(ebug: use vmalloc to back perf mmap() buffers (DEBUG_PERF_USE_VMALLOC))。

如果啟用了VM事件計數器,那麼事件計數就會顯示在/proc/vmstat(Enable VM event counters for /proc/vmstat (VM_EVENT_COUNTERS))。如果禁用了事件計數就不會顯示,/proc/vmstat只會顯示記憶體頁計數。

為了更好地支援PCI晶片,(Enable PCI quirk workarounds (PCI_QUIRKS))回答yes。這會啟用對PCI晶片的怪異行為和bug的臨時解決方案。

下面一個除錯特性可以像我一樣禁用掉(Enable SLUB debugging support (SLUB_DEBUG))。這個特性會耗費很多空間並且會禁用用於除錯核心的SLB sysfs。如果這個特性被禁用,那麼/sys/slab就不會存在並且系統上也不再支援緩衝驗證。

堆隨機化是一個讓利用堆漏洞更加困難的特性(Disable heap randomization (COMPAT_BRK))。然而我們不應該去啟用它,因為任何基於libc5的軟體都無法工作在這個系統上!只有我們有特別的理由這麼做或者如果你不會使用基於libc5的軟體時才去啟用它。我禁用了這個特性。當編譯一個通用的核心時,開發這會希望禁用這個特性。

接下來必須選擇一個SLAB分配器。SLAB分配器是一個沒有碎片且有效率地將核心物件放置在記憶體中的記憶體管理系統。預設選擇是"2"。

Choose SLAB allocator

1. SLAB (SLAB)

> 2. SLUB (Unqueued Allocator) (SLUB)

3. SLOB (Simple Allocator) (SLOB)

choice[1-3?]: 2

為了支援擴充套件效能支援,(Profiling support (PROFILING))回答"yes"。

下一個問題讓開發者選擇是否啟用OProfile系統。它可以禁用、啟用或者新增為一個模組在需要時載入。我選擇禁用這個特性。

Kprobes允許使用者捕捉幾乎任意的核心地址去啟動一個回撥函式。這是一個可以像我一樣禁用的除錯工具(Kprobes (KPROBES))。

這個優化特性可以啟用(Optimize very unlikely/likely branches (JUMP_LABEL))(優化非常近似/不近似的分支)。這使分支預判更加簡單並可以減小開銷。

配置工具啟用了一個實驗性特性"透明使用者空間探針"(Transparent user-space probes (EXPERIMENTAL) (UPROBES))。不過不要擔心,系統可以很好工作,並不是所有的實驗性特性是不穩定或者壞的。

接下來,我們會被詢問基於gcov的核心分析(Enable gcov-based kernel profiling (GCOV_KERNEL))。這可以被禁用。

為了允許核心載入模組,需要啟用可載入模組支援(Enable loadable module support (MODULES))。

核心一般只能載入有版本號的模組。如果想允許核心載入沒有版本號的模組,就啟用這個特性(Forced module loading (MODULE_FORCE_LOAD))(強制模組載入)。這麼做是一個很糟糕的注意,所以我已經禁用了它,除非你有特定的需求需要這個特性。

如果啟用了這個特性(Module unloading (MODULE_UNLOAD)),Linux核心也能解除安裝模組,最好啟用。如果核心判斷你要解除安裝的模組不應該被解除安裝,那麼使用者則無法解除安裝模組。啟用強制解除安裝也行,但是不建議(Forced module unloading (MODULE_FORCE_UNLOAD)。

為了使用不是為你的核心開發的或者並不適用你的版本號的模組,可以啟用版本支援(Module versioning support (MODVERSIONS))。最好不要混用不同版本號的模組,所以我禁用了這個特性。

模組在它們的modinfo(模組資訊)裡有一個欄位名為"srcverion"。這個欄位允許開發者知道使用什麼原始碼版本來編譯模組。啟用這個選項可以在編譯模組的時候加入這個欄位。這個並不必要,所以我禁用了它(Source checksum for all modules (MODULE_SRCVERSION_ALL))。如果啟用了先前的選項,開發者可以將校驗和加入到模組中(Source checksum for all modules (MODULE_SRCVERSION_ALL))。

為了啟用模組簽名驗證(Module signature verification (MODULE_SIG)),這個選項回答"yes"。因為這個並不必要,我選擇了"no",否則核心在載入模組前會檢查並驗證簽名。

為了啟用塊級支援(Enable the block layer (BLOCK)),像我一樣選擇"yes"。禁用這個將會使塊裝置無法使用並且無法啟用某些檔案系統。

下面,SG支援已經預設啟用(Block layer SG support v4 (BLK_DEV_BSG))(塊級SG支援V4版),並且輔助庫也啟用了(Block layer SG support v4 helper lib (BLK_DEV_BSGLIB))。

下面回答的問題是關於對塊裝置的資料完整性支援(Block layer data integrity support (BLK_DEV_INTEGRITY))。這個特性允許擁有更好的資料完整性來提供裝置資料保護特性。許多裝置不支援這個特性,所以我禁用了它。

如果啟用了塊級bio頻寬限制(Block layer bio throttling support (BLK_DEV_THROTTLING))那就可以限制裝置的IO速率。

為了啟用外部分割槽方案的支援,這個問題就回答"yes"(Advanced partition selection (PARTITION_ADVANCED))。我禁用了這個特性。

為了啟用CSCAN(譯註:迴圈掃描)和FIFO過期請求,那就啟用最後期限IO排程器(Deadline I/O scheduler (IOSCHED_DEADLINE))。

CFQ IO排程器在處理器之間平均地分配頻寬。因此啟用這個特性feature (CFQ I/O scheduler (IOSCHED_CFQ))是個好主意。

下面,開發者可以啟用或禁用CFQ組支援(CFQ Group Scheduling support (CFQ_GROUP_IOSCHED))。接下來,開發者可以選擇預設的IO排程器,最好選擇DEFAULT_DEADLINE。

對於小於32位定址的裝置,下面的特性會分配16MB的定址空間(DMA memory allocation support (ZONE_DMA))。如果你不使用這些裝置,那麼這個是可以禁用的,所以我禁用了它。

對於有多個CPU的系統,最好啟用SMP(Symmetric multi-processing support (SMP))。對於只有單個處理器的裝置,核心會在禁用這個特性後執行得更快。我啟用了這個特性。

對於支援x2apic的CPU,啟用x2apic支援support (Support x2apic (X86_X2APIC))。如果你的系統缺乏這個特性就像我一樣禁用它。

接下來我們可以啟用對那些缺乏合適的ACPI支援的舊式SMP系統的MPS表(Enable MPS table (X86_MPPARSE))。一些擁有ACPI、DSDT、MADT支援的更新的系統不需要這個特性。我禁用了它。

下面的問題允許我們啟用擴充套件x86平臺的支援(Support for extended (non-PC) x86 platforms (X86_EXTENDED_PLATFORM))。只有在你需要一個通用核心或者核心執行在某個特定的需要擴充套件支援的處理器上時才啟用它。我禁用了這個特性。

為了支援Intel低功耗子系統,就啟用這個特性(Intel Low Power Subsystem Support (X86_INTEL_LPSS))。

單一深度WCHAN輸出(Single-depth WCHAN output (SCHED_OMIT_FRAME_POINTER))是用來計算電量(/proc//wchan),然而這會導致更多的功耗。

下面,我們啟用虛擬客戶系統支援(Paravirtualized guest support (PARAVIRT_GUEST))。這允許一個Guest作業系統與主作業系統一起執行。我會禁用這個特性。

Memtest是一個在系統啟動時檢測記憶體的軟體。Memtest可以配置為每次或者有時開機執行。Memtest並不必要,所以我禁用了它。

這裡我們可以選擇一個核心應該支援的處理器家族。我選擇了5 – Generic-x86-64。這是一個64位的系統,x86是32系統。

下面我們能選擇也支援x86(32位)處理器 (Supported processor vendors (PROCESSOR_SELECT))。

為了發現機器異常,我們可以啟用DMI掃描(Enable DMI scanning (DMI)),這可以檢測異常。

要啟用DMA訪問系統上32位記憶體的3GB以上的記憶體,下一個問題(GART IOMMU support (GART_IOMMU))我們回答"yes"。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-3.4369/

譯者:geekpi 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

相關文章