上篇:CF卡分區, extlinux的安裝
中篇:構建根文件系統
下篇:2.6內核剪裁及Busybox編譯配置及其分析
硬件平臺:研華3355
軟件:busybox-1.13.3, extlinux 3.63, linux-2.6.32
開發環境: Ubuntu 9.10
(一)CF卡的分區, 格式化:
PC機上利用多口讀卡器連接CF卡,
fdisk -l 查看CF卡的分區, 例如我的CF卡對應的是/dev/sdb;
fdisk /dev/sdb,進入fdisk分區命令提示, 簡單的介紹fdisk分區過程
m 打印提示;
p 打印分區信息;
d 刪除分區, 假設已經存在分區/dev/sdb1, 按下d後輸入1, 即刪除了此分區;
n 添加分區, 這裏只添加一個p(primary), 並佔用所有的存儲空間;
a 設置某分區爲boot分區, 即可引導分區;
w 將改動寫入, 並推出fdisk, 鍵入w之前, 先用p查看當前分區情況;
q 不做改動退出;
將分區格式化爲ext2格式: mkfs.ext2 /dev/sdb1
檢測ext2格式: e2fsck -a /dev/sdb1
注:如果不運行e2fsck, 系統啓動的時候會報"EXT2-fs warning: mounting unchecked fs, running e2fsck is recommended"
(二)CF卡上bootloader的創建
常見的有GRUB, LILO, syslinux, extlinux, 後兩者更適合U盤/CF卡,
syslinux適用於dos分區, 而extlinux適用於ext2分區, 下載地址:
http://syslinux.zytor.com/wiki/index.php/SYSLINUX
http://syslinux.zytor.com/wiki/index.php/EXTLINUX
Ubuntu 9.10用apt-get install extlinux安裝, 設備名爲/dev/sdb1,掛載到/mnt/cf :mount /dev/sdb1 /mnt/cf
extlinux -i /mnt/cf
注意syslinux和extlinux的不同:
syslinux的配置文件是syslinux.cfg, 要先安裝syslinux再掛載分區,例 syslinux /dev/sdb1;
extlinux的配置文件extlinux.conf, 要先把分區掛載然後安裝extlinux, 例extlinux -i /mnt/cf;
在/mnt/cf創建配置文件extlinux.conf然後編輯, 內容如下:
default emblinux
timeout 10
prompt 0
label emblinux
kernel bzImage
append noinitrd root=/dev/sda1 rw init=/linuxrc ide=nodma
注意CF卡在工控機上被識別爲sda, 而不是hda上, noinitrd表示沒有掛載initrd.img,
類似於嵌入式arm平臺的linux"noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
詳細解釋在下面的鏈接
http://www.sudu.cn/info/html/edu/20080407/262839.html
(三)向CF卡拷貝Kernel
內核的剪裁及配置, 請見http://blog.csdn.net/dos5gw/archive/2010/10/26/5965992.aspx
make mrproper #清除從前編譯內核時殘留的.O文件
make menuconfig
make dep #(確保關鍵文件在正確的位置)
make clean #(確保所有有關文件都處於最新版本狀態)
make bzImage
然後把生成的/linux-2.6.32/arch/x86/boot/bzImage拷貝至CF卡分區/dev/sdb1下.
//-----------------------------------------------
//--linux大致啓動過程-------------------------
grub(bl) ->kernel -> initrd.img -> rootfs -> sbin/init(linuxrc, 僅針對busybox)
解釋如下:
kernel :桌面os中一般爲vmlinuz文件,或者zImage、bzImage;
initrd.img :臨時的根文件系統映像全名是initial ram disk(google keywords initrd 製作),使用完後被卸載,然後轉入真正的根文件,當然在有些嵌入式系統中也可以不卸載initrd,而繼續作爲根文件系統;
rootfs:不解釋;
sbin/init: 見http://hi.baidu.com/tcxx05/blog/item/15cfc7fc0cd0d089b801a0d8.html