基於ubuntu14.04下編譯linux-2.6.34版本內核的步驟和遇到的一些問題及解決

1、先在終端查詢自己的gcc版本和ubuntu版本,然後到官網http://www.kernel.org/下載所需的內核版本,當然還可以從終端直接下載,可能會慢點,具體的怎麼操作可以到網上查一查;


2、將下載的內核解壓到/usr/src目錄下,不是一定但建議解壓到裏面,使用tar -xvf +壓縮包名或者tar -xzvf +壓縮名都行,可能有些只支持其中一種,壓縮包名比如linux-2.6.34.tar.gz(看你下載的內核壓縮包名字即可);如果下載不是放在/usr/src/中的話,先從終端進入下載的內核壓縮包所在的目錄,將其移動到/usr/src/目錄下,執行語句移動: mv linux-2.6.34.tar.gz /usr/src/  。(linux此篇文章默認的linux-2.6.34.tar.gz,按自己的版本來,下同)。


3、進入解壓後的內核源碼文件夾。cd  /usr/src/yourname/Desktop/linux-2.6.34


4、接下來的步驟可能基本都要在超級用戶的模式下進行,在終端輸入sudo su按提示輸入密碼即可,然後最好安裝一些必要的依賴包。apt-get install build-essential kernel-package libncurses5-dev由於ubuntu16.04的gcc版本版本過高,容易導致error:undeclared (first use inthis function),建議使用apt-get install gcc-4.8,安裝完成後執行ln –sf gcc-4.8 gcc替換掉系統默認gcc。


5、執行配置命令。執行make config 或者make menuconfig,不知道要選什麼的話可以默認,可能變異的時間會長一些,如果是menuconfig的話,採用默認配置,直接選擇最後的save選項,默認的.config不需要更改,保存後選擇exit。清理操作簡介:

#make clean: 清理大多數編譯生成的文件,但會保留config文件等;

#make mrproper: 清理所有編譯生成的文件、config及某些備份文件;

#make distclean: 清理mrproper、patches以及編輯器備份文件。


6、執行完配置命令之後,可以執行:sudomake mrproper (清除以前曾經編譯過的舊文件,第一次編譯,可不執行) 或者make clean,這行這個命令只會刪除以前編譯過的一些中間文件,不會刪掉一些配置文件;


7、完了之後開始編譯過程,直接make 或者sudo make,編譯可能回話一兩個小時甚至更久,中途也坑能會遇到各種問題,下面再說;


8、執行sudo make modules_install install,這部應該是可以直接編譯和安裝模塊,就不需要先make modules(編譯內核)再make modules_install(安裝內核)了,博主我之前按網上教程這麼做但安裝完虛擬機季候可能會出現重啓時一直就停在initramfs那兒的情況,身邊好幾個人也是,都按着sudo make modules_install install來基本都解決了;


9、執行make stall安裝內核;(8跟9好像可以交換順序,不過建議還是先安裝模塊在安裝內核吧。)


10、創建 initrd文件:mkinitramfs -o/boot/initrd.img-2.6.34;


11、配置grub引導。

執行命令gedit /etc/default/grub,配置/etc/default/grub文件在文件中添加GRUB_TIMEOUT_STYLE=menu,GRUB_HIDDEN_TIMEOUT=0改爲大於0的數即可,或者直接就添加GRUB_TIMEOUT_STYLE=menu,保存退出(一般兩種方式都可以),執行命令update-grub;執行完這一步基本上就完成了內核的編譯和安裝,重啓ubuntu應該就行了。下面總結一下這個過程中可能會遇到的一些問題和解決方法。


(1)objcopy: 'arch/x86/vdso/vdso.so.dbg': No such file或者是提示gcc: error :elf_x86_64: 沒有那個文件或目錄,這個可能的原因是高版本的ubuntu跟低版本的內核不兼容。解決的辦法是在arch/x86/vdso/Makefile中做一些修改:VDSO_LDFLAGS_vdso.lds 開頭所在行的 "-m elf_x86_64" 替換爲 "-m64"。將以 VDSO_LDFLAGS_vdso32.lds 開頭所在行的 "-m elf_386" 替換爲 "-m32"。  這麼修改之後就沒問題了。



(2)drivers/net/igbvf/igbvf.h:129:15: error: duplicate member'page'。按照提示的錯誤說是drivers/net/igbvf/igbvf.h中的第129行,打開文件看到第129行和第124行重複了struct page*page,因爲這兩行代碼都定義在內部的一個結構體中,這是不允許重複的。解決辦法:drivers/net/igbvf/igbvf.h中修改129行的structpage *page爲struct page *pagep即可。



(3)compiler-gcc5.h:No such file解決辦法:將附件compiler-gcc5.h放入/linux-2.6.34/include/linux中。


(4)Can't use 'defined(@array)' (Maybe you should just omit thedefined()?) at kernel/timeconst.pl line 373.。解決辦法:將/linux-2.6.34/kernel/timeconst.pl中第373行的defined()去掉只留下@val


(5)安裝好之後重啓如果出現無法啓動內核等錯誤則在原來的內核中打開終端依次輸入下面指令,雖然有點長,但驗證沒問題,不然重啓停留在initramfs處無法啓動,這種情況說是磁盤受損,我上網查了很多資料,參考別人的做法都不行,逐條輸入下面指令之後重啓完美解決。(linux的版本是自己安裝的版本,別複製了版本都忘了改,下圖爲重啓遇到的initramfs的問題。注意輸入指令的一些空格問題,最好直接複製在修改版本號即可。)


sudo su

cd /boot

cp initrd.img-2.6.34 initrd-2.6.34.old (備份)

depmod -a

update-initramfs -k 2.6.34 -c

cd /tmp

gzip -dc /boot/initrd.img-2.6.34| cpio -id

touch lib/modules/2.6.34/modules.dep

find ./ | cpio -H newc -o > /boot/initrd.img-2.6.34.new 

gzip /boot/initrd.img-2.6.34.new

cd /boot

mv initrd.img-2.6.34.new.gz initrd.img-2.6.34


(6)注意事項:由於ubuntu16.04一些依賴項目版本過高,可能導致安裝內核成功後,出現缺失模塊無法正常啓動,建議使用ubuntu14.04編譯安裝,或者直接使用ubuntu10/ubuntu12編譯內核。


(7)可能會在make menuconfig之後執行了make clean 或者make  mrproper,然後可能會提示如下錯誤。解決的辦法是再重新執行make mrproper應該就可以了,這個也可以多多參考別人優秀的做法。



經過個這個看似漫長而複雜看似枯燥但其實有挺有趣的過程,結合可能會出現的問題應該編譯和安裝就沒問題了。可能不一定一次就能安裝成功,可以多結合別人優秀的做法,互相結合。筆者不才,不免會有一些可能描述錯誤的地方,歡迎指正。以上均爲個人原創,文章至此已結束,請勿亂轉載謝謝。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章