Linux中國

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

下一個問題(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)
  1. SLUB (Unqueued Allocator) (SLUB)
  1. 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中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國