編譯內核

最土的編譯內核過程,搞成這樣純粹是爲了保證成功,i386平臺,2.6.18

下載當前的內核源碼壓縮包,解壓縮到一個目錄,拷貝/boot/.config到源碼根目錄,然後make menuconfig即可。然後退出。運行make bzImage或者make,然後make modules_install。拷貝arch/i386/boot/bzImage到/boot/,重命名爲vmlinuz-2.6.18,然後運行mkinitramfs –o /boot/initrd.img-2.6.18 2.6.18,然後更改/boot/grub/menu.lst,添加以下行

title kernel 2.6.18
root (hd0, 0)
kernel /boot/vmlinuz-2.6.18 root=/dev/sda1 ro
initrd /boot/initrd.img-2.6.18

以下是命令過程:

$tar xjf linux-source-2.6.18.tar.bz2 .
$cd linux-source-2.6.18
$cp /boot/config-2.6.18-5-686 .config
$make menuconfig
$make        (or $make bzImage; make modules)
$sudo cp arch/i386/boot/bzImage /boot/vmlinuz-2.6.18
$sudo make modules_install
$sudo mkinitramfs -o /boot/initrd.img-2.6.18 2.6.18
$sudo vim /boot/grub/menu.lst

將上面的行加到末尾即可。

自己配製來編譯

### 如何驗證下載的內核的簽名
內核包都跟隨有一個.sign文件,這個文件用來驗證內核壓縮文檔的openPGP簽名。
Linux內核包的公鑰編號是0x517D0F0E,驗證時首先從pgp服務器獲取簽名公鑰,然後再進
行驗證。命令如下:
$gpg --keyserver wwwkeys.pgp.net --recv-key 0x517D0F0E
$gpg --verify linux-xxx.tar.bz2.sign linux-xxx.tar.bz2

### 如何編譯內核

### 如何製作initrd
拷貝一個已有的initrd,可以通過一下命令序列解壓縮獲得其中的文件內容
$mv initrd.img initrd.img.gz
$gunzip initrd.img.gz
$cpio -ivmd <initrd.img
修改,主要是不同內核版本的模塊需要進行一下更新,更進一步的修改需要理解其中執行
的各個程序或者腳本的內容。
修改完畢,也就是準備好了initramfs目錄,在這個目錄下運行如下命令生成initrd.img
$find . | cpio -o -H newc > ../initrd.img
$gzip ../initrd.img
$mv ../initrd.img.gz ../initrd.img
注意:這裏cpio的-H newc參數選項,在以前的大多數文檔中使用的是-c選項,這個現在
不可用了,需要用新的-H newc選項才行

內核源碼樹下面提供了生成initrd的工具腳本
一個是scripts/gen_initramfs_list.sh用於生成準備好的rootfs下的文件列表
一個是usr/gen_init_cpio用於使用上面的文件列表生成cpio歸檔的initrd
最後將該initrd壓縮即可,命令序列如下
$gen_initramfs_list.sh rootfs/ >filelist
$gen_init_cpio filelist >initrd.img
$gzip initrd.img
$mv initrd.img.gz initrd.img

### 關於initrd
initrd由bootloader加載到內存,內核啓動時會在訪問真正的根文件系統前訪問內存中的
這個初始內存盤文件系統。這樣Linux啓動分爲了兩個階段,第一階段先執行initrd內指定
的程序,完成加載驅動模塊等任務,第二階段再執行真正的根文件系統中的/sbin/init程
序。第一階段啓動最主要的是要加載根文件系統存儲介質的驅動模塊。可能是IDE,SCSI或
USB等多種介質。

2.4內核時期的initd是文件系統鏡像文件。
2.4過程:加載內核和/dev/initrd的內容到內存,/dev/initrd是由bootloader初始化的
設備;內核啓動時解壓縮/dev/initrd內容到/dev/ram0;讀寫方式掛載/dev/ram0;結束
(此爲最終根文件系統)或者執行initrd中的linuxrc(腳本)文件,加載驅動並掛載真
正的根文件系統;如果真正根文件系統存在/initrd目錄,將/dev/ram0掛載到/initrd,
否則卸載/dev/ram0,執行真正根文件系統上的/sbin/init,正常啓動。
特點:在/linuxrc之後內核會繼續執行初始化代碼,這是2.4內核時代的特點。

2.6內核支持兩種類型的initrd:(1)向前兼容的文件系統鏡像;(2)cpio歸檔的壓縮
文件,核心文件爲/init;
2.6過程,bootloader加載內核和initrd到內存特定位置;內核判斷initrd格式,如果是
cpio,解壓縮並釋放其內容到rootfs中;執行initrd中的/init,內核工作結束,init接管
2.6過程,如果判斷是文件系統鏡像,則內核將其內容保存到rootfs下的/initrd.image文
件,然後把它讀入到/dev/ram0設備,後面的過程就與2.4的一樣了。

文件系統鏡像initrd製作過程,假設當前位於準備好的initrd文件系統根目錄下
# dd if=/dev/zero of=../initrd.img bs=512k count=5
# mkfs.ext2 -F -m0 ../initrd.img
# mount -t ext2 -o loop ../initrd.img  /mnt
# cp -r  * /mnt
# umount /mnt
# gzip -9 ../initrd.img
cpio歸檔initrd製作過程,假設當前位於準備好的initrd文件系統根目錄下

cpio歸檔initrd的優點:製作簡單,啓動時不需要掛載/卸載ramdisk,啓動完/init,內核
任務就結束了,簡潔不必擔心後續銜接問題。

rootfs:一個基於內存的文件系統,linux初始化時加載的第一個文件系統
realfs:用戶最終使用的文件系統

通過qemu來模擬,linux-0.2.img從http://www.nongnu.org/qemu/linux-0.2.img.bz2下載
$qemu -kernel bzImage -initrd initrd.img -hda ./linux-0.2.img -append "root=/dev/sda"

---------------------------------------
參考文件:
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html

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