Social Icons

twitterfacebookgoogle plusrss feedemail

5/21/2013

[USB linux] 3.建立ramdisk的root filesystem (initrd)

接下來,要建立Linux的root filesystem,也就是打造整個Linux下面的檔案系統環境
為什麼要放在ramdisk呢?一來速度快,二來ramdisk映像檔經過壓縮可以變得更小。
缺點是檔案系統要更新的話很麻煩,要重新掛載映像檔、修改、卸載、壓縮。
不過嵌入式系統的變更頻率不高,這樣做還是ok的。
這個ramdisk叫做是initrd,initial ramdisk。

首先,建立一個zero-filled的檔案,全設為0可以讓壓縮未用的空間更有效率。
我們從/dev/zero處複製一共8192個block到ramdisk這個檔案中,每個block大小為1k,因此這個檔案為8MB
 cd ~/build-usb-linux
 dd if=/dev/zero of=ramdisk bs=1k count=8192


接著,將他格式化成ext2的格式。
 mkfs.ext2 -v -F -m0 ramdisk

我們將他掛載起來,就像掛載虛擬光碟一樣。
 mkdir initrd
 sudo mount -o loop ramdisk initrd/


接下來,要在這個root filesystem建立一些必要的目錄、裝置檔
一個Linux root filesystem應該具備哪些目錄、以及這些目錄的用途可以參考:
Filesystem Hierarchy Standard (FHS)


先來建立目錄吧
 cd initrd
 mkdir bin dev etc mnt proc tmp var
 chmod 755 *
 chmod 555 proc

再來建立裝置檔,Linux下的裝置都是一個一個的檔案。
因為裝置檔屬於系統檔,所以必須有root權限才可以。
 cd dev
先建立終端機裝置
 sudo mknod console c 5 1
 sudo mknod tty c 5 0
 sudo mknod tty0 c 4 0
 sudo mknod tty1 c 4 1
 sudo ln -sf null tty2
 sudo ln -sf null tty3
 sudo ln -sf null tty4
軟碟機裝置
 sudo mknod fb0 c 29 0
 sudo ln -s fb0 fbnull裝置 sudo mknod null c 1 3
記憶體裝置
 sudo mknod mem c 1 1
 sudo mknod cmem c 1 2
zero裝置
 sudo mknod zero c 1 5
隨機產生器
 sudo mknod random c 1 8
 sudo mknod urandom c 1 9
serial port
 sudo mknod ttyS0 c 4 64
RAM disk
 sudo mknod ram0 b 1 0
 sudo mknod ram1 b 1 1
ps/2
 sudo mknod psaux c 10 1

混音器、音效
 sudo mknod mixer c 14 0
 sudo mknod dsp c 14 3
real time clock
 sudo mknod rtc c 10 135
硬碟機
 sudo mknod sda b 8 0
 sudo mknod sda1 b 8 1



接著要建立一些開機執行的script cd ~/build-usb-linux/initrd/etc
第一個是inittab這是指定開機要執行哪些設定
 vi inittab
內容如下:
::sysinit:/etc/rc.start
::askfirst:/bin/sh
存檔離開之後,設定檔案屬性
 chmod 644 inittab

再來就是編輯開機的script,rc.start
 vi rc.start
內容如下:
#!/bin/sh
echo "INIT SCRIPT"
echo "mount /proc"
mount -t proc /proc /proc
export LD_LIBRARY_PATH=/lib
PATH=/bin:/sbin:/usr/sbin:/usr/bin
echo "Configure networking.."
/sbin/ifconfig lo 127.0.0.1 up
/sbin/udhcpc -i eth0 -s /etc/udhcpc-script
其中最後一行,必須視你的網路環境來設定,這邊是用dhcp作範例,
如果只是練習,也可以將他拿掉,或是你想改成固定ip的話,如下設定
/sbin/ifconfig eth0 192.168.0.147 netmask 255.255.255.0 broadcast 192.168.0.253
存檔離開之後,設定檔案屬性成可執行
 chmod 755 rc.start

設定DNS設定檔
 vi resolv.conf
內容為
nameserver 168.95.1.1
DNS位址參照你的網路環境設定,這邊是以Hinet為例

如果你選擇dhcp的話,還需要設定dhcp-script,好險有人已經幫我們寫好了:)
 vi udhcpc-script
檔案內容如下:
#!/bin/sh
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
case "$1" in
    deconfig)
        /sbin/ifconfig $interface 0.0.0.0
        ;;
    renew|bound)
        /sbin/ifconfig $interface $ip $BROADCAST $NETMASK
        if [ -n "$router" ] ; then
            echo "deleting routers"
            while route del default gw 0.0.0.0 dev $interface ; do
            :
            done
            for i in $router ; do
                route add default gw $i dev $interface
            done
        fi
        echo -n > $RESOLV_CONF
        [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
        for i in $dns ; do
            echo adding dns $i
            echo nameserver $i >> $RESOLV_CONF
        done
        ;;
esac
exit 0
存檔離開,修改檔案為可執行
 chmod 755 udhcpc-script

目錄架構的建立先到這邊,接著我們要等之後busybox utilities加進來,才能壓縮




相關連結
[USB linux] 1.打造2MB 的 linux USB 隨身碟
[USB linux] 2.核心編譯
[USB linux] 3.建立ramdisk的root filesystem (initrd)
[USB linux] 4.建置busybox
[USB linux] 5.最後步驟建置boot loader

沒有留言:

張貼留言

俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!

 
 
无觅相关文章插件,迅速提升网站流量