-
准備工作
-
物理主機:win8(32位)
-
虛擬機工具:VirtualBox_4.3.16_Win32
-
虛擬主機:xubuntu-12.04.4
-
安裝virtualBox功能增強包
-
設置好虛擬機與主機的共享文件夾
-
進入內核所在文件夾並解壓,由於內核代碼一般安裝在/usr/src下,因此將內核代碼解壓到/usr/src下
-
配置內核
2.1 查看gcc信息
-
在配置內核之前查看系統是否已安裝gcc
2.2 使用make gconfig進行配置
2.2.1 錯誤1
-
然而使用這個配置模式,出現了錯誤:
-
錯誤提示,缺少所需的包,需要安裝gtk+- 2.0:
sudo apt-get install gnome-devel gnome-devel-docs 一條語句可以完成我們需要的所有的glib,gtk,幫助手冊等資源
-
但是,安裝之后還是出現之前的錯誤。在這個配置模式下不停做了修正之后,還是不能配置成功,於是我決定使用默認的配置方式對內核進行配置
2.2.2 刪除make gconfig產生文件
-
在這之前,需要刪除之前配置產生的垃圾文件
2.3 使用make defconfig配置
-
然后用默認的方式進行配置
-
編譯內核
-
完成默認配置后,就可以使用make命令進行編譯
3.1 錯誤1:PATH_MAX未聲明
3.1.1 錯誤描述
PATH_MAX未聲明(在此函數內第一次使用)
3.1.2 解決方法
發現PATH_MAX在limits.h中定義,在/scripts/mod/sumversion.c中添加#include <limits.h>即可[1]
-
錯誤2:gcc:錯誤
3.2.1 錯誤描述
elf_i386: 沒有那個文件或目錄
很明顯這是一個gcc引起的錯誤,之前查看過本機中gcc的版本,為4.6.3,而gcc 4.6 不再支持 linker-style 架構
3.2.2 解決方案
將 arch/x86/i386/kernel/Makefile 中,-m elf_i386 改為 –m32
參考[2]
-
錯誤3
3.3.1 錯誤描述
mutex.c undefined reference to '_ _mutex_lock_slowpath
mutex.c undefined reference to '—mutex_unlock_slowpath
3.3.2 解決方案1
很明顯,提示是有兩個變量的定義找不到,先進入muex.c中進行查看
從代碼中看出這兩個變量是定義了的,但編譯提示找不到,可能是有一些宏定義沒有打開導致的。
查看代碼,CONFIG_DEGUG_MUTEXES控制了_ _mutex_lock_slowpath
和_ _mutex_unlock_slowpath的定義
從CONFIG_DEBUG_MUTEXES這個名字可以猜測,該宏定義是跟配置相關的,由於在配置的時候,選擇的是默認的配置方式,因此配置方式可能造成了這個問題的產生。
接下來在config文件中查看CONFIG_DEBUG_MUTEXES
可以看到沒有CONFIG_DEBUG_MUTEXS的定義
在.config文件中添加CONFIG_DEBUG_MUTEXS的定義
如果直接編譯,還是會出現之前的錯誤,原因是配置文件雖然更改了,但沒有進行更新,應該使用make oldconfig 進行重新配置
3.3.3 解決方案2
然而這樣還是沒有解決這個問題,在網上搜索,有一種說法是:
可能原因是編譯器版本與內核版本匹配度的問題。
安裝gcc4.4
安裝成功后系統中有兩個版本的gcc
設置gcc4.4為系統默認版本
設置完成后,重新進入內核所在文件,使用make進行編譯
編譯后結果如下:
3.4 說明
由於在配置的時候使用的是默認的配置,因此在解決了上述問題之后,編譯內核的時間並不是很長,只有約5min
-
安裝內核
4.1 安裝內核模塊
使用命令:make modules_install安裝內核模塊
4.2 安裝內核
然后使用make install安裝內核
此時,內核已經編譯完畢。
-
修改啟動程序配置,運行新的內核
先將生成的bzImage文件和System.map文件拷貝到/boot/目錄下,命令如下:
cp /usr/src/linux-2.6.18/arch/x86/boot/bzImage /boot/
cp /usr/src/linux-2.6.18/System.map /boot/
然而輸入該命令后,出現了以下錯誤。即在/usr/src/linux-2.6.18/arch/x86/boot/這個目錄下沒有bzImage文件
通過查找,在i386/boot下找到了bzImage文件
重新拷貝bzImage
拷貝System.map
5.1 建立鏡像文件
在終端輸入命令:
mkinitramfs 3.12.6 -o /boot/initrd/img-3.12.6
來建立鏡像文件
這里有錯誤,改正后如下
5.2 更新修改系統引導配置
然后輸入命令:
update-initramfs -c -k 2.6.18
再輸入命令:
update-grub2
更新修改系統引導配置。
查看grub.cfg中的配置信息
如查看到以下信息,則我們編譯的內核已經添加到啟動項中了
5.3 重啟驗證
命令:/sbin/reboot
由於我用的linux是安裝在虛擬機中的,因此重啟后會直接進入登陸界面,而跳過了grub界面。
解決方法是在虛擬機開機時,一直按住shift鍵, 參考[5]
可以看到,Previous Linux version下面包含了我們的2.6.·8版本,選擇該菜單后,得到下面的界面
說明linux-2.6.18已經成功安裝並可以啟動
5.4 說明
可以看到,內核已經成功編譯並安裝到了系統中,但是在grub界面選擇從2.6.18版本啟動時,系統沒有跑起來。在配置內核時,使用make defconfig的方式實際上,按照默認的配置文件arch/i386/defconfig對內核進行配置,生成.config可以用作初始化配置,然后再使用make menuconfig進行定制化配置。也就是說,默認配置只是做了一些初始化的配置,硬件所配置的選項很多都是沒有啟動的,因此系統不能成功。
由於使用make menuconfig配置的操作步驟與defconfig類似,此次報告中就不再對更改過后的配置過程進行贅述了。
-
參考資料
[1] 編譯錯誤提示PATH_MAX未聲明
http://blog.csdn.net/armeasy/article/details/6217522
[2] 編譯linux內核並安裝
http://blog.sina.com.cn/s/blog_7e49bf5e0100y4sr.html
[3] 編譯linux內核問題
[4] 編譯linux-2.6.18內核出錯
[5] linux 在虛擬機中開機啟動時如何進入grub界面?
[6] 各種配置詳解
http://www.51testing.com/html/38/225738-237838.html