精簡Linux核心編譯的簡單方法
關於Linux核心的編譯
採用先make defconfig、make menuconfig再make localmodconfig,並將後2者反覆應用的過程。最後能達到比較簡單的過程。基本上採取了做加法(將硬體驅動或模組依次加上,逐步改進)的思路。
簡述如下:
1、下載原始碼並建立編譯工作目錄和編譯目標目錄
簡單點,按照原始碼中的README檔案中所述完成:
編譯工作目錄:/usr/src/linux-2/6.34.1
編譯目標目錄:/home/abc/build/kernel 這裡/home/abc即主資料夾
將下載的原始碼放到/usr/src下解壓,則原始碼所在工作目錄是/usr/src/linux-2.6.34.1
2、編譯配置(重要工作)
可以有3種比較簡單的方式對要編譯進核心核心或模組的原始碼進行配置。難易程度不一(需要投注的精力和時間不一樣,編譯生成的initrd.img-2.6.34.1、vmlinuz-2.6.34.1和System.map-2.6.34.1
這3個主要檔案的大小也不一樣)。採用何種方式也可以根據需要選擇如下3種方式之一對核心進行編譯前的配置。
目標:建立並得到“/home/abc/build/kernel”目錄下的“.config”檔案。
(1)最簡單的方式:
將/boot下的配置檔案拷貝過來使用,作為編譯目標目錄下的.config檔案。這樣對核心沒有精簡。
cp /boot/config-2.6.32-21-generic ~/build/kernel/.config
這樣產生的initrd.img-2.6.34.1大概達到17M左右。不知Ubuntu採用這個配置檔案怎樣做到了將近8M。
(2)中等難度方式:在拷貝配置檔案的基礎上,使用make localmodconfig命令自動精簡
從linux-2.6.32開始可以使用make localmodconfig自動精簡核心了。命令如下:
cp /boot/config-2.6.32-21-generic ~/build/kernel/.config
sudo make O=/home/abc/build/kernel localmodconfig
一般說法:在執行第二條命令前,將系統的各種硬體都用一遍,以便你的系統中的模組均被呼叫了一次,使用“make localmodconfig”命令時,才能將你的系統將呼叫的模組包含進來。比方說:攝像頭、U盤、光碟機、SD卡等。
如果忘了,沒關係,先將上述硬體依次用一遍,再執行第二條命令一次(呵呵,重新精簡,不確定的話,就將上述2條命令重新執行一遍)。
哦,有點忘了,在第二條命令之前是否要先從.config檔案中去掉一項,再使用make localmodconfig命令自動精簡配置檔案。如果在執行make localmodconfig命令後需要回答一些問題,而不是系統自動完成,那就按下Ctrl+c中斷當前配置工作,再按照如下命令序列完成配置:
(a)拷貝配置檔案
cp /boot/config-2.6.32-21-generic ~/build/kernel/.config
(b)去掉“Prompt for development and/or incomplete code/drivers”項
sudo make O=/home/abc/build/kernel menuconfig
進入圖形介面後,選擇倒數第二項(Load an Alternate Configuration File)回車,彈出視窗中提示輸入欲調入的配置檔名。這裡預設是~/build/kernel/.config檔案,無須輸入任何字元,按回車即可。
使用游標鍵上移到“Linux Kernel Configuration”視窗中的第一項(General Setup--->)”,按下回車,選擇General setup視窗下第一項(Prompt for development and/or incomplete code/drivers),按下“N”字元鍵去掉這一項(將其前*去掉)。
用向右游標鍵選擇選項,按回車鍵退出當前視窗;再按向右游標鍵選擇選項,按回車鍵退出當前視窗;在選擇是否儲存時選擇“Yes”。
(c)使用“make localmodconfig”命令自動精簡核心
sudo make O=/home/abc/build/kernel localmodconfig
因為添加了第二個步驟(b),這時應該沒什麼選擇了。
使用這樣配置產生的.config進行編譯比配置方式(1)要精簡許多,但是核心相關的3個檔案還是較大。
(3)最難(相對繁複)方式:
先make defconfig、make menuconfig再make localmodconfig,並將後2者反覆應用的過程。最後能達到比較簡單的過程。
這個過程較繁,但可望得到較簡的核心。很難達到最簡(除非對自己系統的硬體情況非常熟悉,並勇於實踐,我們購買機器後,相對長時間內不會更換或升級硬體,所以這樣的花費時間精力還是值得的),只有更簡。閒話少說,上命令:
(a)建立預設的.config檔案。
sudo make O=/home/abc/build/kernel defconfig
本命令在資料夾“/home/abc/build/kernel”下建立一個“.config”檔案。
按照i386建立,據說是linus的配置。呵呵,還是需要對它進行增刪的。以 config-2.6.32-21-generic為基礎進行增刪工作也可得到.config檔案,但刪的工作太多,容易刪除不該刪除的選項(再恢復就很難了,記不住也很難確定哪些該恢復)。以“make defconfig”命令建立的.config為基礎增刪就相對簡單多了。
(b)去掉“Prompt for development and/or incomplete code/drivers”項
操作同2(2)(b)。
一般說法:在執行第二條命令前,將系統的各種硬體都用一遍,以便你的系統中的模組均被呼叫了一次,使用“make localmodconfig”命令時,才能將你的系統將呼叫的模組包含進來。比方說:攝像頭、U盤、光碟機、SD卡等。
如果忘了,沒關係,先將上述硬體依次用一遍,再執行第二條命令一次(呵呵,重新精簡,不確定的話,就將上述2條命令重新執行一遍)。
(c)使用“make localmodconfig”命令自動精簡核心
sudo make O=/home/abc/build/kernel localmodconfig
一般說法:在執行第二條命令前,將系統的各種硬體都用一遍,以便你的系統中的模組均被呼叫了一次,使用“make localmodconfig”命令時,才能將你的系統將呼叫的模組包含進來。比方說:攝像頭、U盤、光碟機、SD卡等。
如果忘了,沒關係,先將上述硬體依次用一遍,再執行第二條命令一次(呵呵,重新精簡,不確定的話,就將上述2條命令重新執行一遍)。
(d)編輯“~/build/kernel/.config”檔案,新增缺失模組
在上面(c)執行命令時,肯定會出現一些類似如下內容的資訊:
module lp did not have configs CONFIG_PRINTER
module vgastate did not have configs CONFIG_VGASTATE
先將它們複製貼上到文字檔案中,呵呵,然後尋找“~/build/kernel/.config”檔案中對應項,例如“CONFIG_VGASTATE”,可能“~/build/kernel/.config”檔案中對應的資訊為:
# CONFIG_VGASTATE is not set
將它改為:
CONFIG_VGASTATE=m
表示將這個模組包含進來。依次處理,如果找不到,沒關係,先放在那兒。將上述資訊中對應項都改完後儲存,退出。
(e)再次執行“make localmodconfig”命令,將(d)步驟的修改帶來的變化包含進核心
sudo make O=/home/abc/build/kernel localmodconfig
這時系統會有一些提問。別嫌麻煩,仔細回答(如果嫌麻煩,可以全部回答m,沒“m”選項時,就回答“y”。畢竟無法一次就做到非常精簡---沒有最簡)。
這正是本文的精彩之處,多次重用“gedit”和“make localmodconfig”命令,當然,還有後面再次使用的“make menuconfig”命令。
(f)將(e)步驟再次出現(d)中顯示的未包含模組新增進來
如果(e)步驟中再次出現(d)中沒有包含某些模組的選項,不要氣餒。在編輯“~/build/kernel/.config”檔案時,將相應項改為“=y”而不是“=m”。然後回到步驟(e),直到在沒有模組沒有包含進來的資訊,或者你已經無法再減少這些資訊。
我這樣做到最後,還是有如下資訊:
ricoh_mmc config not found!!
(g)使用“make menuconfig”命令對上面得到的“~/build/kernel/.config”檔案中的選項進行增刪
使用現在的.config檔案進行編譯,無法得到可正常執行的核心。需要注意的問題如下:
(I)Device Drivers->Generic Driver Options--->下的2項必須選擇為“y”:
Matain a devtmpfs filesystem to mount at /dev
Automount devtmpfs at /dev, after the kernel mounted the rootfs
否則,出現“Can not mount /dev”的錯誤。
(II)File systems->FUSE (Filesystem in Userspace) support必須選擇為“y”,否則,無法讀取光碟機和Windows下的分割槽和盤。點選Windows下的碟符時,出現如下提示資訊:
FATAL: Module fuse not found.
fuse: device not found, try 'modprobe fuse' first
(III)某些經驗文件可能說了如下選項應該去掉,千萬不要相信
Enable the block layer->support for large (2TB+) block devices and files (一定要選y,否則無法讀入啟動檔案)
這反映了“盡信書不如無書”這句話的正確性。如果不信,實踐可檢驗。如果此時到步驟3開始編譯,得到的核心檔案已經能夠執行。如果還存在問題,就需要到步驟6瞭解有關你的機器硬體的相關資訊後,再使用“make menuconfig”命令對.config檔案進行增刪修改,再編譯安裝核心。
我的機器這樣處理之後,還無法使用攝像頭、訪問SD卡。除此之外,如訪問鍵盤滑鼠的使用、網路、聲音、顯示器、U盤、Windows下的盤的訪問等操作已經沒有問題。
3、編譯核心
編譯核心非常簡單:
sudo make O=/home/abc/build/kernel
如果是雙核,想要加快編譯速度,還可做相關設定。
4、安裝核心
sudo make O=/home/abc/build/kernel modules_install install
這個操作將編譯的核心安裝到/boot下。在Ubuntu 10.04下,會在/boot目錄下產生如下檔案:
config-2.6.34.1
System.map-2.6.34.1
vmlinuz-2.6.34.1
還會在/lib/modules目錄下產生一個新的目錄“2.6.34.1”以及其下的若干子資料夾和檔案。
但是,沒有啟動核心還需要的一個檔案:
initrd.img-2.6.34.1
“initrd.img-2.6.34.1”檔案通過“mkinitramfs”命令產生:
sudo mkinitramfs -o /boot/initrd.img-2.6.34.1 /lib/modules/ 2.6.34.1
5、修改/boot/grub/grub.cfg檔案,以便啟動編譯好的新核心
此時你一定急於檢驗編譯好的核心是否能夠正常啟動和工作,且慢,先修改啟動項:
sudo gedit /boot/grub/grub.cfg
將“### BEGIN /etc/grub.d/10_linux ###”下的如下資訊複製並貼上一份,然後將貼上資訊中的“2.6.32-21-generic”全部改為“2.6.34.1”即可(不要不好意思,複製貼上就足夠了)。
menuentry 'Ubuntu, with Linux 2.6.32-21-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod ext2
set root='(hd0,7)'
search --no-floppy --fs-uuid --set 4b836918-3471-4fa7-85f6-79bee5970506
linux /boot/vmlinuz-2.6.32-21-generic root=UUID=4b836918-3471-4fa7-85f6-79bee5970506 ro quiet splash
initrd /boot/initrd.img-2.6.32-21-generic
}
重啟機器,回車,用你剛才編譯好的核心啟動機器了。如果還有問題,你需要看步驟6、7。
6、硬體資訊的蒐集
如果想充分調動硬體並將核心精簡到自己比較滿意的程度,還是有必要了解自己機器的硬體資訊的。
用於瞭解硬體資訊的命令:
lshw 顯示你的硬體以及所需的模組
dmidecode 檢視硬體資訊,包括bios、cpu、記憶體等資訊
dmesg 檢視硬體資訊
lspci -v lspci (比cat /proc/pci更直觀)
/proc資料夾下的若干檔案:
cat /proc/cpuinfo 檢視CPU資訊
cat /proc/meminfo 檢視記憶體資訊
cat /proc/bus/input/devices 檢視鍵盤和滑鼠
cat /proc/pci 查看板卡資訊
cat /proc/bus/usb/devices 檢視USB裝置
cat /proc/interrupts 檢視各裝置的中斷請求(IRQ)
uname -a 檢視系統體系結構
例子: lspci |grep Ethernet 檢視網絡卡型號
dmesg | more
dmidecode | grep -i 'serial number'
dmidecode -t processor
7、再次精簡核心
按照某些經驗文件,對 linux-2.6.34.1.tar.bz2 核心原始檔還可如下配置,可能將來的版本應該做一些變化。
(1')General setup->kernel compression mode改為bzip2
(2')如果是筆記本,將General setup->kernel log buffer size改為15
(3')去掉General setup->Control group support (按下n)
(4')去掉Processor type and features->Enable MPS table
(5')去掉Processor type and features->Support for extended (non-pc) x86 platforms
(6')將Processor type and features->Processor family改為自己的處理器型別(雙核均可選擇core 2/newer xeon)
(7')如果做了(6')的操作,那麼去掉Processor type and features->Generic x86 support
(8')將Processor type and features->Maximum number of CPUs改為4(雙核改為4,單核改為2)
(9')去掉Processor type and features->SMT (Hyperthreading) scheduler support
(10')如果是筆記本,將Processor type and features->Preemption model改為“Preemptible kernel (Low-Latency Desktop)”
(11')去掉Processor type and features->AMD MCE features
(12')去掉Processor type and features->Enable x86 board specific fixups for reboot
(13')去掉Processor type and features->/dev/cpu/microcode-microcode support
(14')如果記憶體是2G,將Processor type and features->High Memory support改為4G
(15')只要是家用,將Processor type and features->Timer frequency改為1000HZ
(16')將Power management and ACPI options->CPU Frequency scaling->選項下:
如果是筆記本,將Default CPUfreq governor改為conservative
將“powersave” governor、“userspace” governor for userspace frequency scaling、“ondemand” cpufreq policy governor這3項均選上。
如果是Intel的CPU,將有關AMD和VIA的選項全刪除。
(17')去掉Networking support->Networking options->The Ipv6 protocol
現在上網都使用IP v4,IP v6尚處於實驗階段或在某些校園網內使用。
(18')去掉Networking support->Networking options->Asynchronous Transfer mode (ATM)
(19')去掉Networking support->Amateur Radio support
(20')去掉Networking support->IrDA (infrared) subsystem support
(21')去掉Networking support->Bluetooth subsystem support
(22')選上File systems->The extended 4 (ext4) filesystem
(23')去掉File systems->Dnotify support
(24')去掉File systems-> DOS/FAT/NT Filesystems-->MSDOS fs support
(25')去掉File systems-> DOS/FAT/NT Filesystems-->Default iocharset for FAT改為“CP936”
(26')選上File systems-> DOS/FAT/NT Filesystems->NTFS file system support
(27')選上File systems-> DOS/FAT/NT Filesystems->NTFS write support
(28')去掉File systems->Miscellaneous filesystems-->
(29')去掉File systems->Network filesystems-->
(30')選上File systems->Native language support-->Simplified Chinese charset (CP936, GB2312)
(31')選上File systems->Native language support-->Traditional Chinese charset (Big5)
下面重點談Device Drivers--->下的選擇(直接驅動硬體的相關選項,步驟7蒐集的資訊用到這裡)
這部分根據自己的硬體,可以大刀闊斧地去掉很多,在一個大的選項下,與自己的機器對應的通常只有一、兩個。
(1')去掉SCSI device support--->SCSI tape support
(2')去掉Multiple devices driver support (RAID and LVM)--->
(3')去掉ISDN support--->
(4')去掉Telephone support--->
(5')去掉Auxiliary Display support--->
(6')去掉X86 Platform Specifis Device Drivers--->
其它,只能根據自己的機器選擇了。例如:
我的網絡卡是千兆網絡卡和無線網絡卡,只選這兩樣足夠了:
Network device support--->Ethernet (1000 Mbit)--->Broadcom Tigon3 support
Network device support--->Intel Wireless Wifi--->
Network device support--->Intel Pro/Wireless 3945ABG/BG Network connection (iwl3945)