戴文的Linux內核專題:09 配置內核(5)
下一個可以配置的特性是x86的隨機數生成器(x86 architectural random number generator (ARCH_RANDOM))。記住,我們現在配置的是針對AMD64系統的內核代碼。這個隨機數生成器使用Intel x86的RDRAND指令。這並不通用,所以為了一個更輕量的內核我禁用了它。
接著,我們可以啟用或者禁用"Supervisor Mode Access Prevention (X86_SMAP)"。這是Intel處理器使用的安全特性。SMAP在一些條件下只允許內核訪問用戶空間。這個有助於保護用戶空間。如果啟用,這裡有一點性能和內核大小的開銷,但是開銷很小。由於我是用的是AMD系統,所以我禁用了這個特性。
開發者可以啟用"EFI runtime service support (EFI)"。只有在有EFI固件的系統上啟用它。擁有這個特性,內核可以使用的EFI服務。EFI是一個操作系統和硬體如何交流的規範,所以EFI固件是使用這個規範的硬體代碼。因為我沒有EFI固件,所以我禁用了它。
這是一個應該被啟用的有用的安全方式(Enable seccomp to safely compute untrusted bytecode (SECCOMP))。這個安全特性在使用非可信的位元組碼的數值計算(執行大量計算的軟體)中使用。位元組碼(可移植代碼)是一種被解釋器有效讀取的代碼。位元組碼不是源代碼,但它也不是彙編或者二進位代碼。非可信的代碼是一種可能導致系統/數據損壞的代碼。可能會破壞系統或者毀壞數據的非可信的代碼通過seccomp被隔離在獨立的地址空間中。這是通過文件描述符傳輸的方法。通常上,最好啟用這個安全特性,即使會有一些性能開銷,除非你在製作一個需要榨乾性能的內核。
這裡是另外一個安全特性(Enable -fstack-protector buffer overflow detection (CC_STACKPROTECTOR))。緩衝溢出是數據被寫在超出了它的內存界限而進入了鄰近的內存中。這是一個安全威脅。一些惡意軟體使用緩衝區溢出來破壞系統。啟用這個會使用GCC選項 "-fstack-protector"。GCC是一個Linux編譯器,在你配置完成後用它來編譯內核。這個編譯器參數會在返回地址前在棧上加入一個canary值(特殊的安全代碼)。這個值會在返回前被驗證。當內存溢出發生時,canary值會得到覆蓋消息。這時,會導致內核崩潰。如許多人知道的那樣,內核錯誤意味著系統將要崩潰,但是這比系統被入侵或者數據永久損害的好。發生內核錯誤,系統會重啟,但是如果緩衝溢出則可能導致系統被入侵。一個簡單的重啟無法修復破壞(譯註:但也不會更壞)。你必須用GCC 4.2或者更高版本支持這個參數的GCC來編譯內核。
提示:要知道你使用的版本號,在命令行內鍵入"gcc --version"。
在這之後,我們可以配置定時器頻率。配置工具建議使用250Hz,所以我們使用這個值。
Timer frequency
- 100 HZ (HZ_100)
- 250 HZ (HZ_250)
-
300 HZ (HZ_300)
-
1000 HZ (HZ_1000)
choice[1-4?]: 2
使用1000Hz通常來講對許多系統而言太快了。定時器頻率決定著定時器中斷被使用的頻率。這有助於在時間線上的系統操作。程序並不是隨機地執行一條命令,相反它們會等到定時器中斷結束。這保持著有組織和結構的處理。頻率為100Hz的定時器中斷之間的時間是10ms,250Hz是4ms,1000Hz是1ms。現在許多開發者會馬上想到1000Hz是最好的。好吧,這取決於你對開銷的要求。一個更大的定時器頻率意味著更多的能源消耗和更多的能源被利用(在定時器上),產生更多的熱量。更多的熱量意味著硬體損耗的更快。
注意:如果某個特定的特性對你並不重要或者你不確定該選擇什麼,就使用配置工具選擇的默認值。比如,就我現在正在配置的內核而言,使用哪個定時器對我並不重要。總的來說,如果你沒有特別的原因去選擇任何一個選項時,就使用默認值。
下面這個有趣的系統調用可能會對一些用戶有用(kexec system call (KEXEC))。kexec調用會關閉當前內核去啟動另外一個或者重啟當前內核。硬體並不會關閉,並且這個調用可以無需固件的幫助工作。bootloader是不執行的(bootloader是啟動操作系統的軟體) 。這個重啟發生在操作系統級別上而不是硬體上。使用這個系統調用會快於執行一個標準的關機或者重啟,這會保持硬體在加電狀態。這個系統調用並不能工作在所有系統上。為了更高性能,啟用這個熱啟動功能。
為了使用kexec,對重啟後要使用的內核使用如下命令替換""。同樣,使用之前我們講過的內核參數替換"" (我會在以後的文章中更深入的討論。)
kexec -l --append="」
特別地,我這裡輸入:
kexec -l /boot/vmlinuz-3.8.0-27-generic –append="root=/dev/sda1"
注意:硬體有時不需要重置,所以這不依賴於kexec。
下面,我們有一個適用於kexec的調試特性(kernel crash dumps (CRASH_DUMP))。當kexec被調用時,一個崩潰信息(crash dump)會生成。除非你有必要調試kexec,否則這個並不必要。我禁用了這個特性。
再者,我們有另外一個kexec特性(kexec jump (KEXEC_JUMP))。kexec跳允許用戶在原始內核和kexec啟動的內核之間切換。
最好對內核啟動地址使用默認值(Physical address where the kernel is loaded (PHYSICAL_START) [0x1000000])。
下一個內核選項(Build a relocatable kernel (RELOCATABLE))允許內核放在內存的任何地方。內核文件會增大10%,但是超出部分會在執行時從內存移除。許多人也許想知道這為什麼很重要。在2.6.20內核前,救援內核(rescue kernel)必須被配置和編譯運行在不同的內存地址上。當這個特性發明後,開發者不必再編譯兩個內核。救援內核不會在第一個已載入的內核的地方載入,因為該塊內存已被佔用或者發生了錯誤。(如果你正在使用救援內核,那麼明顯第一個內核發生了錯誤)
下面這個特性應該在可以增加CPU數量的系統中啟用,除非你有特別的理由不去這麼做(Support for hot-pluggable CPUs (HOTPLUG_CPU))。配置工具會自動啟用這個特性。在這個特性下,你可以在一個擁有很多處理器的系統上激活/停用一個CPU,這並不是說在系統中插入新的CPU,所有的CPU必須已經安裝在系統中。
下面的選項會讓我們選擇設置上面的特性是否默認啟用(Set default setting of cpu0hotpluggable (BOOTPARAMHOTPLUG_CPU0))。為了性能最好禁用這個特性直到需要的時候。
接著的這個調試特性允許開發者調試CPU熱插拔特性(Debug CPU0 hotplug (DEBUG_HOTPLUG_CPU0))。我禁用了它。
為了兼容舊版本的glibc(
如果系統內核被用於一個缺乏完整功能的bootloader上,那麼啟用這個特性(Built-in kernel command line (CMDLINE_BOOL))。這允許用戶在內核自身上使用一條命令行(譯註:及其參數),那麼管理員可以修復內核問題。如果bootloader已經有了一條命令行(像grub),那麼這個特性不必啟用。
現在我們可以配置ACPI和電源了。首先,我們被要求選擇系統是否可以掛起到內存(Suspend to RAM and standby (SUSPEND))。高級配置和電源介面(ACPI)是一種對於設備配置和電源管理的開放標準。掛起系統會將數據放在內存上,同時硬體進入一種低功耗的狀態。系統不會完全關機。如果用戶需要計算機進入一個低功耗的狀態,但是希望保留當前已打開程序時是非常有用的。關閉一個系統會完全關閉系統電源並且清理內存。
下面,我們可以啟用睡眠(Hibernation (aka 'suspend to disk') (HIBERNATION))。睡眠就像掛起模式,但是內存中所有數據被保存到硬碟上,並且設備完全關閉。這允許用戶在電源恢復後繼續使用他們已打開的程序。
這裡,我們可以設置默認的恢復分區(Default resume partition (PM_STD_PARTITION))。很少有開發者和管理員需要這個特性。當系統從睡眠中恢復時,他會載入默認的恢復分區。
在這之後,我們可以啟用"Opportunistic sleep (PM_AUTOSLEEP)"。這會讓內核在沒有活躍的喚醒調用被調用時進入掛起或者睡眠狀態。這意味著空閑的系統將會進入掛起模式以節省電源。我啟用了這個特性。
接下來,是詢問關於"User space wakeup sources interface (PM_WAKELOCKS)"。啟用這個特性將會允許喚醒源對象被激活、停用,並通過基於sysfs介面由用戶空間創建。喚醒源對象會追蹤喚醒事件源。
sysfs是位於/sys/的虛擬文件系統。這個虛擬文件系統包含了關於設備的信息。當進入/sys/時,它似乎是硬碟的一部分,但是這個並不是一個真正的掛載點。這些文件實際存在於內存中。這與/proc/是同一個概念。
注意:"/sysfs/"是一個文件夾,而"/sysfs"則可以是一個根目錄下名為"sysfs"的文件。許多Linux用戶會混淆這兩種命名約定。
如果啟用了上面的選項,那麼你可以設置"Maximum number of user space wakeup sources (0 = no limit) (PM_WAKELOCKS_LIMIT)"。最好選擇默認,那麼你就可以啟用垃圾收集器(Garbage collector for user space wakeup sources (PM_WAKELOCKS_GC))。垃圾收集是一種內存管理方式。
注意: 在需要更多內存的系統中,通常最好在大多數情況下儘可能啟用垃圾收集。不然內存會消耗得更快且雜亂。
下一個電源選項關於IO設備(Run-time PM core functionality (PM_RUNTIME))。這個選項允許IO硬體在運行時進入低功耗狀態。硬體必須支持這個才行,不是所有硬體都支持。
與其他許多內核組件一樣,如果啟用了(Power Management Debug Support),電源管理代碼同樣有調試支持。我禁用了這個選項。
注意: 注意這些我引用/顯示的配置工具上的選項或問題不再顯示選項代碼(括弧間所有的大寫字母)。這是因為我沒有使用基於ncurses的配置工具(make menuconfig)而是使用默認工具去得到選項、設置和問題。記住,"make config"缺乏保存當前進度的能力。
在這之後,配置工具會啟用"ACPI (Advanced Configuration and Power Interface) Support"。最好允許這個電源管理規範。通常配置工具會啟用這個特性。
為了允許向後兼容,啟用"Deprecated /proc/acpi files"。新的實現使用更新的在/sys下的實現。我禁用了這個選項。一個相似的問題詢問關於"Deprecated power /proc/acpi directories"。通常上,如果你禁用了這些文件,你不再需要這些文件夾,所以我禁用了他們。一些舊的程序可能會使用這些文件和文件夾。如果你在給舊的的Linux系統上編譯一個新的內核,最好啟用這個選項。
下面,我們有另外一個文件介面可以啟用或者禁用(EC read/write access through)。這會在/sys/kernek/debug/ec下創建一個嵌入式控制器介面。嵌入式控制器通常在筆記本中讀取感測器,內核代碼通過系統的BIOS表提供的ACPI代碼訪問嵌入式控制器。
這裡有另外一個可以啟用或者禁用的向後兼容特性 (Deprecated /proc/acpi/event support)。acpi守護進程可能會讀取/proc/api/event來管理ACPI生成的驅動。不同於這個介面,守護進程使用netlink事件或者輸入層來得到送給用戶空間的事件,acpi守護進程管理ACPI事件。
下一個選項允許開發者啟用一個特性,它會通知內核現在使用的是交流電源(AC Adapter)還是電池。下一個選項從/proc/acpi/battery/ (Battery)中提供電池信息。
為了內核在電源/睡眠按鈕按下或者蓋子合上時不同表現,啟用這個「按鈕」選項(Button)。這些事件在/proc/acpi/event/中控制。比如這樣的行為,如果在用戶賬戶的電源選項啟用了掛起,當筆記本電腦的蓋子關閉後系統將會掛起。
下一個ACPI擴展是針對顯卡的(Video)。
ACPI風扇控制可以被啟用/禁用(Fan)。最好啟用ACPI風扇管理,這有助於節能。
我們正在進一步配置內核中,但在接下來的文章中還有更多要做。
via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-5.4424/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive