1. 程式人生 > >linux核心移植步驟

linux核心移植步驟

2016.6.8

經過一個多星期的核心折磨,今天終於可以寫下自己移植核心的一些心得,網上有很多部落格論壇都有談到,但是這些又說的方式有些模糊,這裡我綜合的幾個部落格在重新說下核心替換編譯的步驟、以及如何更新啟動項grub。替換linux的核心一共有兩種方式,第一種方式是下載官方kernel提供的原始碼包,進行編譯替換;第二種直接下載核心安裝包deb,進行升級替換。

下面分別從這兩種方式進行 一個說明:

方式一:kernel提供的原始碼包,進行編譯替換

1、首先做好核心編譯前的準備工作,

主要有兩個準備工作,一是在linux kernel官網上下載原始碼包,二是安裝好任意版本的linux Ubuntu 系統並下載相應的編譯工具。

在linux kernel上下載原始碼包,網址為:https://www.kernel.org/pub/linux/kernel/,選擇對應的原始碼包下載,注意原始碼包的大小一般是幾十兆左右,命名字尾為.tar.bz2,如下圖所示:以linux_3.2.1為例子:
在這裡插入圖片描述

下載完成後,進行第二個準備工作,安裝任意版本的Ubuntu,安裝映象網址:http://www.ubuntu.org.cn/download ,像裝其他任意作業系統一樣,安裝完成Ubuntu作業系統,然後配置好聯網,進行apk_get的下載。以下過程在root許可權下進行,安裝有關編譯程式。安裝make ,gcc, make-kpkg,執行menuconfig等等和編譯核心相關的工具。

有關命令:

$sudo  apt-get install build-essential kernel-package   libncurses5-dev

注意:
(1)libncurses5-dev是為之後配置核心能執行 make menuconfig程式做準備
Build-essential為編譯工具,kernel-package是編譯核心工具

(2)如果系統顯示無法查詢到這三個檔案,輸入#apt-get update更新資料來源。
把剛剛下載的原始碼包進行拷貝在ubuntu系統中,並解壓到/usr/src 目錄下,解壓可以直接右鍵解壓,或者採用以下命令進行解壓:

$sudo tar Jvfx linux-
3.4.88.tar.xz
2、開始配置編譯的相關檔案及環境

首先,清理以前編譯時留下的臨時檔案。如果是剛剛解開的包,不需要執行這步。如果是第二次或者是第n次編譯,那麼一定要執行。
相關命令如下:

#$ sudo make mrproper

然後將自己原本核心的配置檔案拷貝過來成為新核心的配置檔案,命令:

#cp /boot/config-`uname -r` ./.config

這裡需要說明的是,拷貝過來是很方便的,相當於直接給新的核心編譯提供對應的配置檔案,告訴核心哪些檔案要編譯,哪些不需要編譯,但是經過幾次的編譯修改,這一部分是可以自定義的,利用我們之前下載的工具menuconfig。

進入核心的原始碼目錄

#cd /usr/src/linux_3.2.1

執行以下命令:

#make  menuconfig

注意:這個命令需要在超級使用者許可權下執行,否則可能會報出一些莫名奇妙的錯誤。執行這個命令之後了,就可一看到下面的圖片了:
在這裡插入圖片描述
這個圖裡面就可以對配置檔案進行一個修改了,如果當初直接拷貝原核心的配置檔案,那麼此時直接選擇倒數第二行load an Alternate Configuration File,然後sava即可。

如果自己配置則選擇上面的任意目錄,進行選擇哪些檔案要編譯,哪些不編譯,一般需要選擇的是裝置驅動,選項是Device Drivers,選擇完畢後同樣儲存save即可。

注意這兩種方式都可以,看使用者自己的選擇。具體的每個選項的內容解析見一下部落格:
http://forum.ubuntu.org.cn/viewtopic.php?t=134404

3、開始編譯新核心

編譯命令:

#make all -j4

執行以上命令之後就可以編譯核心了,
make all就是將核心以及模組一起編譯。後面的引數-j4表示,cpu要開啟四個執行緒來編譯核心。一般來說,每個cpu可以開啟兩個執行緒來編譯核心,我的電腦是有兩個cpu,所以開啟了4個執行緒。這樣編譯真心很快的,以前沒有發現這樣編譯,只有一個執行緒編譯真心夠等好長時間的。

4、編譯完成之後,就可以進行核心的安裝了

我們將原始碼目錄下的arch/x86_64/boot/bzImage複製到/boot/下面,因為我下載的原始碼版本為linux-3.2.1,但是需要根據自己的cpu型別,如是x86架構還是amd,或者是32位或64位,在相應的目錄下尋找bzImage。
所以複製的命令為:

#cp arch/x86_64/boot/bzImage /boot/vmlinuz-3.2.1  

這裡需要說明,bzImage必須得有,是編譯成功完成的一個生成檔案,如果沒有此檔案,對不起,編譯失敗,請重新回去編譯。vmlinuz-3.2.1 是自己主動命令的,可以自己改,但一般都是這種命令方式。

5、將原始碼目錄下的System.map複製到/boot目錄下:

命令:

#cp /usr/src/linux-3.2.1/System.map System.map-3.2.1
6、.將原始碼目錄下的.config複製到/boot/目錄下:

命令:

#cp .config /boot/config-3.2.1
7、安裝模組

命令:

#make modules_install
8、生成initrd.img檔案
#cd /lib/modules/3.2.1
#update-initramfs –c –k 3.2.1
9、.切換到/boot/grub/目錄下,自動查詢新核心,並新增至grub引導
#update-grub
10、修改開機grub啟動時間間隔,命令如下:
#cd /ect/default
#sudo nano ./grub

將hidden兩行程式碼註釋掉,這樣開機啟動的grub就會出現,可以由你選擇改啟動哪個核心版本。

#GRUB_HIDDEN_TIMEOUT=0 
#GRUB_HIDDEN_TIMEOUT_QUIET=true

更改完成之後,在重新生成grub.cfg檔案,命令和上面一樣:

#update-grub
11、切換至grub.cfg目錄

以文字形式檢視,是否更新有新核心的啟動項,如果有即可不用修改,如果沒有,進行手動修改。

#cd /boot/grub
#sudo nano ./grub.cfg

手動修改,按照原來核心的格式進行修改,只用修改新核心的名字而已。

12、重啟電腦,在previous version中選擇啟動新編譯的核心,成功進入系統。

輸入核心版本檢測命令:

命令:#uname -r

就會出現新核心的名稱!!!恭喜,替換核心成功!

方式二:下載核心安裝包deb,進行升級替換

首先必須說明的是,這種方式我嘗試了兩臺電腦,兩個不同的核心升級,均為成功,原因不詳:
具體步驟簡單如下:

1.下載deb包

http://kernel.ubuntu.com/~kernel-ppa/mainline/ 上下載所需升級包。此處下載的是64位的3.5.4版本的3個deb包:

linux-headers-3.5.4-030504_3.5.4-030504.201209142010_all.deb
linux-headers-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb
linux-image-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb
2.安裝deb包

首先安裝架構無關的即帶all的headers包

sudo dpkg -i linux-headers-3.5.4-030504_3.5.4-030504.201209142010_all.deb
sudo dpkg -i linux-headers-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb
sudo dpkg -i linux-image-3.5.4-030504-generic_3.5.4-030504.201209142010_amd64.deb

安裝後,/boot目錄下會生成新的核心的相關檔案,/lib/modules目下也生成了相應模組。

3.更新啟動項grub

按照上述的步驟9開始,與上面一樣。更新完了grub.cfg,然後重新啟動,進行新的核心即可
測試按照這種步驟進行,但是開機進入之後直接紫屏,沒有任何現象,原因不明!!!