1. 程式人生 > >精簡Linux核心編譯的簡單方法

精簡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)