提要linux的啟動過程,包括BIOS的加電自檢POST,拷貝MBR的信息(啟動BootLoader),加載內(nèi)核,掛載根文件安系統(tǒng)這幾大步熟悉grub的話會知道linux啟動時grub中有三項:root,kernel,initrd。其三項的作用分別是: 1.指定內(nèi)核所在的目錄 今天的目的就是從內(nèi)核開始,打造一個屬于自己的linux。 環(huán)境:Ubuntu13.04 gcc4.7.3 相關(guān)的準(zhǔn)備工作: 制作根系統(tǒng)目錄1)創(chuàng)建init程序 首先創(chuàng)建一個init.c文件,代碼如下: #include<stdio.h>int main(){ printf('Welcome! My student No. is sa*****310.\n'); return 0;} 靜態(tài)編譯成一個可執(zhí)行文件。 gcc -static -o init init.c 2)建立引導(dǎo)根目錄映像 終端運行: dd if=/dev/zero of=initrd.img bs=4096 count=1024 mkfs.ext3 initrd.img 有提示,輸入y。 關(guān)于dd dd 是 Linux/UNIX 下的一個非常有用的命令,作用是用指定大小的塊拷貝一個文件,并在拷貝的同時進(jìn)行指定的轉(zhuǎn)換。 ... 3)創(chuàng)建rootfs目錄,并掛載 mkdir rootfs sudo mount -o loop initrd.img rootfs 4)在rootfs中添加一些文件 將init拷貝到initrd4M.img的目標(biāo)根目錄下(因為linux啟動后期會在根目錄中尋找一個應(yīng)用程序來運行,在根目錄下提供init是一種可選方案) cp init rootfs/ 準(zhǔn)備dev目錄: sudo mkdir rootfs/dev linux啟動過程中會啟用console設(shè)備: sudo mknod rootfs/dev/console c 5 1 另外需要提供一個linux根設(shè)備,我們使用ram: sudo mknod rootfs/dev/ram b 1 0 sudo umount rootfs 至此,一個包含簡單應(yīng)用程序的根目錄initrd4M.img映像就準(zhǔn)備好。 mknod 用于制作字符或塊相關(guān)文件 用qemu跑一下: qemu -kernel ../linux-3.9.2/arch/x86/boot/bzImage -initrd initrd.img -append 'root=/dev/ram init=/init' 整合busyboxbusybox簡介 BusyBox 是一個集成了一百多個最常用linux命令和工具的軟件。BusyBox 包含了一些簡單的工具,例如ls、cat和echo等等,還包含了一些更大、更復(fù)雜的工具,例如grep、find、mount以及telnet。有些人將 BusyBox 稱為 Linux 工具里的瑞士軍刀。簡單的說BusyBox就好像是個大工具箱,它集成壓縮了 Linux 的許多工具和命令,也包含了 Android 系統(tǒng)的自帶的shell。 下載源碼:http://www./ 這里選擇1.20穩(wěn)定版。 解壓,終端進(jìn)入目錄執(zhí)行: make menuconfig 勾選下面的選項: Build Options 這個選項是一定要選擇的,這樣才能把busybox編譯成靜態(tài)鏈接的可執(zhí)行文件,運行時才獨立于其他函數(shù)庫.否則必需要其他庫文件才能運行,在單一個linux內(nèi)核不能使他正常工作. 現(xiàn)在直接make的話會報錯:‘RLIMIT_FSIZE’ undeclared 論壇上的回答是沒有包含 sys/resource.h,則在include/libbb.h 中添加:
接下來執(zhí)行: #編譯busybox make #安裝busybox 安裝好之后在文件夾下出現(xiàn)一個_install文件夾,編譯完成。 下面來整合根文件系統(tǒng)。 新建一個文件夾,終端cd進(jìn)去,將之前的initrd.img拷貝進(jìn)來。 #創(chuàng)建文件夾 mkdir rootfs #掛載鏡像 sudo mount -o loop initrd.img rootfs/ #將busybox添加進(jìn)來 cd ../busybox-1.20.2/ sudo make CONFIG_PREFIX=../Opuntu/rootfs/ install #查看rootfs中結(jié)構(gòu) cd ../Opuntu ls rootfs #卸載分區(qū) sudo umount rootfs/ 運行命令時注意目錄結(jié)構(gòu)! linux的系統(tǒng)下的目錄都是干嘛的? linux下的文件結(jié)構(gòu),看看每個文件夾都是干嗎用的 ... 最后生成的 initrd.img文件就是根文件系統(tǒng)了!#qemu測試 qemu -kernel ../linux-3.9.2/arch/x86/boot/bzImage -initrd initrd.img -append 'root=/dev/ram init=/bin/sh' 裝載好之后可以在qemu中運行busybox的命令,效果如下: 整合grub關(guān)于Grub GNU GRUB(簡稱“GRUB”)是一個來自GNU項目的多操作系統(tǒng)啟動程序。GRUB是多啟動規(guī)范的實現(xiàn),它允許用戶可以在計算機(jī)內(nèi)同時擁有多個操作系統(tǒng),并在計算機(jī)啟動時選擇希望運行的操作系統(tǒng)。GRUB可用于選擇操作系統(tǒng)分區(qū)上的不同內(nèi)核,也可用于向這些內(nèi)核傳遞啟動參數(shù)。 首先來測試一下grub. 從ftp://alpha.gnu.org/gnu/grub/下載GRUB Legacy的最后一個版本0.97的編譯好的文件grub-0.97-i386-pc.tar.gz. 解壓之后中端cd進(jìn)去,執(zhí)行下面的命令。 #建立軟盤映像: 在qemu中測試是否可以進(jìn)入grub qemu -fda boot.img OK. 接下來將grub,kernel,busybox一起整合,離勝利只還有一步 - - 。 先你自己發(fā)行版取一個庫一些的名字,比如Opuntu...(Opensuse+ubuntu),創(chuàng)建一個以它命名的文件夾。 #拷貝boot.img到當(dāng)前目錄 sudo cp ../grub-0.97-i386-pc/boot.img ./ #創(chuàng)建rootfs文件夾 mkdir rootfs #創(chuàng)建一個32M的磁盤鏡像文件
#格式化分區(qū) sudo mkfs.ext3 -m 0 /dev/loop0
#拷貝之前做好的initrd.img和bzImage.img到rootfs sudo mount /dev/loop0 rootfs/
sudo mkdir rootfs/boot sudo cp ../grub-0.97-i386-pc/boot/grub/* ./rootfs/boot/grub 內(nèi)容: default 0timeout 30title linux on 32M.imgroot (hd0,0)kernel (hd0,0)/bzImage root=/dev/ram init=/bin/ashinitrd (hd0,0)/initrd.img #卸載磁盤鏡像 sudo umount rootfs #利用grub啟動軟盤,在硬盤映像上添加grub功能 執(zhí)行圖中的兩步(注意空格): 運行成功之后,Opuntu.img就是我們的最終成果了,集成了busybox,grub,linux kernel3.92! qemu -hda Opuntu.img 用qemu跑起來: 參考:鳥哥私房菜 第二十二章:開關(guān)機(jī)流程與loader 制作可用grub引導(dǎo)Linux系統(tǒng)的磁盤映像文件 - http://blog.sina.com.cn/s/blog_70dd169101013gcw.html 詳細(xì)講解Linux啟動流程及啟動用到的配置文件及腳本 - http://guodayong.blog.51cto.com/263451/1168731 |
|