為什麼要放在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
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
第一個是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
看過文章之後歡迎留下您寶貴的意見喔!