Ramdisk 是一種在記憶體上實現檔案系統的方法。
一般嵌入式系統當中通常沒有硬碟的存在,但是有作業系統就會需要檔案系統。
因此嵌入式系統會從記憶體裡面分出一塊區域,來做為檔案系統之用,這個區域就叫Ramdisk。

根檔案系統(Root File System、RFS)
在嵌入式系統中,並不像PC 有著大容量硬碟存在,需利用Ramdisk 模擬的方法執行系統。
Ramdisk 是利用既有的RAM 或Flash,模擬一段磁碟空間,放置Root File System 供程式執行用。

當kernel 開機完成,隨即進入RFS 內執行程式,根檔案系統內容主要如下:
/bin:放置命令檔之目錄。
/etc:放置設定檔之目錄。
/dev:放置硬體節點檔之目錄。
/lib:放置Glibc 之目錄。
/mnt:用於暫時掛載檔案系統之目錄。
/proc:Kernel 虛擬的檔案系統,提供使用者方便觀看行程資訊與硬體狀況。

將建立好的 root filesystem 作成 image 就是我們要的 Ramdisk 了


建立 root filesystem image 空間的三種方式
------------------------------
root filesystem 就是我們在登入 linux 後,所看到的檔案系統。
我們平時使用的工具,就放在其中。
如果我們光只是啟動了 Linux,卻沒有 root filesystem,那什麼事都無法做。
就好像電腦中安裝了Win95/98,卻不小心把 C:\Windows 給刪除了一樣。

1.選擇一個設備空間

(a) ramdisk
建立 ramdisk 空間的方式,是用 dd 指令,填入指定大小的內容後, 就會在 ram 中保留該大小的空間;
而這個 ram 空間,就連接到 dd 指 令中,所指定的設備名稱,如 /dev/ram0。

$ dd if=/dev/zero of=/dev/ram0 bs=1k count=4096

上面這指令的意義是,從輸入設備 /dev/zero 中,以 bs 指定的大小(1k), 讀取資料,輸出到設備 /dev/ram0 中,
重覆輸出入 count 指定的次數(4096次),這表示 /dev/ram0 所連接的 ram 空間,會有 4096K 的空間可用。
/dev/zero 是一個特殊的設備,從這個設備中,讀取的內容,全部都是0。

接著格式化這塊 ram 空間

$ mkfs.ext2 /dev/ram0 4096

最後 mount 此空間 (我 mount 在 /mnt/ramdisk 目錄上),準備複製檔案:

$ mount -t ext2 /dev/ram0 /mnt/ramdisk


(b) loopback device: loopback image 檔
有些人是用舊機器跑 linux,ram 可能只有 16~32mb,用 ramdisk 就不太方便,這時可以利用 loopback 設備。
作法是將一個檔案,當作 loopback 設備 mount 起來。

$ dd if=/dev/zero of=/tmp/rootfs-file bs=1k count=4096

上面的指令,會在 /tmp 建立一個叫 rootfs-file 的檔案,大小 是 4096KB。
意義跟上面 ramdisk 一樣,只是一個把空間建立在 ram 中,另一個建立在 disk 中。

格式化:

$ mkfs.ext2 /tmp/rootfs-file 4096

把這個檔案 mount 上去:

$ mount -o loop -t ext2 /tmp/rootfs-file /mnt/ramdisk


(c) 硬碟
這個方法不太建議使用...
在硬碟上分一個 partition,格式化後 mount 上去,做為 root filesystem 的空間。
除非硬碟上剛好有一個 partition 沒在用,否則不需要這麼做。

建立一個儲存空間
$ dd if=/dev/zero of=DEVICE bs=1k count=???

格式化此空間
$ mkfs.ext2 DEVICE

mount 此空間
$ mount -t ext2 DEVICE /mnt/ramdisk


2.選擇要放入 root filesystem 的檔案

選擇要放入 root filesystem 的檔案,這個部份就看你自已的了。
有些是必要的, 有些是選擇性的,自已憑經驗看著辦。
在複製的檔案時,最好用 cp -dpR 來複製,這樣才可以完 整地將檔案屬性複製過去(特別是那些設備檔及符號連結檔)。
這些檔案複製好後,我們就完成 root filesystem 的內容了。

3.建立 root filesystem 的 image

接下來,我們要將這整個 root filesystem 的內容,變成一 個 image (檔案),並且加以壓縮。
最好先 umount :

$ umount /mnt/rootfs

接著將該空間的內容給 dump 出來,變成一個 image 檔, 並壓縮,我用一個動作完成:

$ dd if=DEVICE bs=1k count=??? | gzip -9 > /tmp/rootfs.gz

DEVICE 是你選擇的設備,在本文中,如 /dev/ram0, /tmp/rootfs-file;
??? 的大小,是你建立這空間時所指定的,本文中,都是用 4096。

之所以要再重新建立空間,是為了清除空間中的舊有資料,全部設為0,這樣在製作 image時,就可以壓得比較小。

arrow
arrow
    全站熱搜

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