要建立一個 rootfs,基本上需要以下的目錄:
/bin /dev /etc /lib linuxrc /mnt /proc /sbin /tmp /usr /var /var /run

目前通常是 base on busybox 去做 rootfs,
所以只要編譯 busybox 就會產生 /bin linuxrc /sbin 等三個目錄,
而 /mnt /proc /tmp /usr /var /var /run 等目錄幾乎不用去動它(leave them empty)。
所以需要做的就只剩下 /dev /etc /lib 這三個目錄。


/dev
------------------------------
裡面要放的是一些設備檔。
console fd fd0 null ram0 tty tty0 tty1
(1)可以直接從自己的系統裡複製
cp -dpR /dev/console rootfs/dev/ #-dpR是為了保持link的完整性

(2)自己建
mknod console c 5 1
在這裡 "c" 是指character device 至於 "5 1" 可以到 /dev 底下執行 ls -l 查詢

如果要支援framebuffer則執行
mknod fb0 c 29 0
ln -s fb0 fb

如果要建立gpmdata則執行
mknod gpmdata p
ln -s gpmdata mouse


/etc
------------------------------
裡面要放的是一些開機要用的 script 或 config 檔。

fstab inittab passwd /rc.d /rc.d/rc.sysinit shadow group
至少是這些,如果你有其他的任務要完成 就自行增加囉。

#fstab的內容
/dev/ram0 / ext2 defaults 0 0
/dev/fd0 / ext2 defaults 0 0
/dev/proc /proc proc defaults 0 0
主要是放你開機要自動掛載的咚咚。

#inittab的內容
::sysinit:/etc/rc.d/rc.sysinit
::askfirst:/bin/ash
這裡是參考 busybox command help 的說明。

這裡要表達的是在系統啟動時會去讀 rc.sysinit。
注意 busybox 的原始碼 init.c 裡,預設是讀 /etc/init.d/rcS。
請修改下面原始碼
#define INIT_SCRIPT "/etc/init.d/rcS"
=> #define INIT_SCRIPT "/etc/rc.d/rc.sysinit"

#rc.sysint的內容
#!bin/ash
mount -a (其實把這行寫在inittab裡 => ::sysinit:mount -a 也可以喔)

如果你想在系統啟動時順便帶起某些裝置或daemon也可以寫在這裡。
例:我要帶起我的網卡
ifconfig eth0 172.23.33.150 up


/lib
------------------------------
從系統 /lib裡 copy 所需要的函式庫檔案到 rootfs/lib。

如何檢查是需要的library呢?
可以執行ldd指令查詢就會知道要copy哪些東西囉。
記得cp的時候要加上參數-dpR喔!!

接下來就是要把 rootfs 做成映像檔(我在這裏使用的是調用ramdisk的方法),

dd if=/dev/zero of =/dev/ram0 bs=1k count=4096
#從zero這個裝置填0到ram0裡,填4096*1k個零,所以我們會製造出一個4096KBytes的ramdisk空間。

mke2fs -m 0 /dev/ram0 4096
#創建一個ext2的檔案系統

mount -t ext2 /dev/ram0 /mnt/rootfs
#掛載到/mnt/rootfs底下

cp ~/work/rootfs/* /mnt/rootfs
#複製你做好的root file system過去

umount /mnt/rootfs
#卸載

dd if=/dev/ram0 of=./ramdisk.img
#把/dev/ram0裡的rootfs用img的方式取出來

gzip -v9 ramdisk.img
#進行壓縮

就得到我們要的ramdisk.img.gz啦~

P.S 因為kernel預設ramdisk大小是4096KB
如果我們要更改ramdisk大小可以在grub的menu.lst裡更改開機參數
root (hd0, 0)
kernel /boot/vmlinuz-2.4.34 rw root=/dev/ram0 init=/linuxrc vga=0x314 ramdisk=10240(10MB的意思)

#ro代表read-only
#如果想要可以在rootfs裡執行寫入的動作可以改成rw(read-write)
#vga是設定支援framebuffer的參數0x314是代表800x600的解析度(網路上有表可以查詢)

這樣我們就可以在ramdisk裡裝更多東西啦~

REF://http://chiakie.pixnet.net/blog/post/2171605

arrow
arrow
    全站熱搜

    BB 發表在 痞客邦 留言(0) 人氣()