1. 程式人生 > >Ramdisk根檔案系統啟動Linux(單獨的ramdisk映象)

Ramdisk根檔案系統啟動Linux(單獨的ramdisk映象)

開發環境:Ubuntu10.04

交叉編譯工具鏈:univore32-linux-gcc 4.3.2 

嵌入式Linux核心版本:2.6.29.4-FriendlyARM

開發板:SEP6200
Bootloaderu-boot-2009.11


具體步驟如下:
1.解壓核心原始碼樹
解壓kernel.tar.gz2到自己的工作目錄,其他的開發板就自己找相應的kernel,或者自已移植


2.修改核心配置選項
進入核心原始碼目錄目錄

#cp config_mini2440_t35 .config 
#make menuconfig ARCH=arm

上面兩句詩對用arm某開發板的,我是用的核心不具有代表性,就不在這裡寫了。


開啟配置選單,修改兩個配置項,分別是:


a):General setup-->選擇 Initial RAM filesystem and RAM disk...... 
b):Device Drivers-->Block devices-->選擇 RAM block device support 

並檢查Optimize for size是否被選中,如果沒有則選中,此項優化核心大小,根據需要進行配置。
修改(8192Default RAM disk size kbytes選項為4096Default RAM disk size kbytes,之所以修改是因為我之後製作的ramdisk

4096KB大小的。當然如果你想製作8192KB大小的ramdisk,這裡就要對應為8192了,以此類推。但是最小系統嘛,是不用那麼大的ramdisk的。此項的預設配置就是(4096),以前我改過這個配置,所以是(8192)了。如果這個大小和你做的ramdisk不匹配,則啟動時仍然會出現kernel panic核心恐慌,提示ramdisk格式不正確,掛載不上ramdisk
然後特別要注意的一點是,ramdisk是一種記憶體虛擬磁碟技術,實質上並不是一種檔案系統,它使用的檔案系統時ext2檔案系統。所以一定要在make menuconfig ARCH=arm的時候進入File systems選單,選上
<*> Second extended fs support。以提供核心對ext2檔案系統的支援。
我以前新增過了ext2檔案系統了,所以開始的時候在此沒有說明,在此為了說明為什麼有的人照著我的方法做了,但是仍然kernel panic,特別把這一步也加上。
然後儲存配置退出。
這樣就為核心新增好了ramdisk啟動功能和ramdisk的驅動支援了。



3.修改核心啟動引數
方法有四:
a):修改.config的第310行,修改CONFIG_CMDLINE=""的定義(.config需要執行一條make語句才能生成,具體忘了
修改為CONFIG_CMDLINE="initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"
儲存。
意思為從ramdisk啟動,ramdisk壓縮檔案起始地址在記憶體地址0x31000000處,檔案大小為0x200000
此引數也可以在make menuconfig ARCH=arm時進入Boot options選單,然後在Default kernel command string裡修改。效果是一樣的。

b):在核心的menuconfig中  boot options選項中  不要選  Passing command from u-boot

再在下面的一欄填入啟動引數即可,具體不說了。
c):或者不修改.config的的第310CMDLINE定義,而是用u-bootbootargs環境變數來傳遞啟動引數。
同樣也是修改該環境變數為bootargs=initrd=0x31000000,0x200000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M
saveenv儲存u-boot環境變數

d):修改u-boot的預設啟動引數,要修改 uboot 原始碼資料夾下  include/開發版型號/config/sep6200.h 檔案

我的開發板是SEP6200  所以就是sep6200.h

這裡面定義了大量的巨集定義,可以進行相應修改。

需要修改bootargs 加入 initrd=0x31000000

和bootcommand 加入將ramdisk 映象 讀入  記憶體的 命令。

這也是我採用的方法。


以上a),b,c),d的效果是一樣的。

4.編譯核心
#make clean

#make sep0611_db//跟開發板有關

#make -j4


然後是十分鐘左右的等待。
編譯完成後在當前目錄下就出現了zImage核心映像了。



5.製作uImage核心映像
由於我使用的Bootloaderu-boot,所以要將zImage轉化為uImage,方法如下:
#make uImage
說明:mkimage工具是u-boot格式uImage核心映像製作工具。如果成功編譯u-boot之後,它會在u-boot原始碼樹下的tools目錄之下。建議將其拷貝到宿主機的/sbin/目錄下,以方便使用。mkimage使用時的具體引數不再詳述,不清楚的請自己查閱。

uImage放在cpu/架構/開發板/boot 目錄下

6.製作ramdisk根檔案系統
該過程是製作ramdisk根檔案系統的核心步驟,方法如下:
a)建立根檔案系統目錄:
#cd轉入到你的工作目錄。
#mkdir rootfs
#cd rootfs
#mkdir bin dev etc lib proc sbin sys usr mnt tmp var
#mkdir usr/bin usr/lib usr/sbin lib/modules

b)建立最基本的裝置檔案:
#cd dev
#mknod -m 666 console c 5 1
#mknod -m 666 null c 1 3
#cd ..

c)安裝/etc配置檔案:
這裡可以直接把友善之臂的root_qtopia裡的幾個基本的配置檔案拷貝過來,只拷貝必要的即可,並對其內容進行刪減,因為我做的ramdisk並不包含Qtopia等,全拷貝過來也沒有用。
我是從網上找的最小系統的etc配置檔案直接解壓到我製作的根檔案系統裡了,並做參照友善之臂的root_qtopia添加了一些內容,見最後的說明。
操作如下:
#tar etc.tar.gz -C /xxx/rootfs
xxx表示你要製作的rootfs所在的目錄。

d)編譯核心模組:
方法是如下:
進入Linux核心原始碼目錄(linux-2.6.29
#make modules ARCH=arm CROSS_COMPILE=arm-linux-

e)安裝核心模組:
#make modules_install ARCH=arm INSTALL_MOD_PATH=/xxx/rootfs
xxx表示你要製作的rootfs所在的目錄。

f)配置busybox
進入busybox目錄執行#make menuconfig
  進入Busybox Settings -> build Options ->選中"Build busybox as a static binary“,即靜態連結,免去拷貝大量的庫檔案。
  Installation Options -> 選中"Don't use /usr",以免busybox不慎被安裝到宿主機系統的相應目錄下,破壞宿主機系統。
  Busybox Installation Prefix /xxx/rootfs),修改該選項表明編譯後的busybox將安裝到該位置。

g)編譯、安裝busybox
#make ARCH=arm CROSS_COMPILE=arm-linux-
幾分鐘編譯完成後
#make install
安裝到Busybox Installation Prefix /xxx/rootfs)設定的目錄裡。當前為我要製作的根檔案系統目錄(/xxx/rootfs)。

h)製作ramdisk根檔案系統映象

PC機上進行如下步驟,可以製做RamDisk根檔案系統的映象。
需要在root許可權下操作

(1)、dd if=/dev/zero of=/dev/ram0 bs=1k count=4096
說明:if:從檔案讀取;of:輸出到檔案;bs:ibs(輸入)obs(輸出)設定成指定的位元組數;
count:僅讀取指定的區塊數,4096=4M應該與第二條第五條的大小一致,並且要和linux核心配置中設定的大小一致

(2)、mke2fs -vm0 /dev/ram0 4096
說明:將RamDisk格式化成ext2檔案系統格式,大小為4M

(3)、mount /dev/ram0  /home/rootfs
說明:mount RamDisk,將根檔案系統拷貝到/home/rootfs目錄下;

(4)、在這裡將已經只做好的ramdisk目錄複製到 rootfs目錄下 。要用  cp -a 命令。

(5)、dd if=/dev/ram0 bs=1k count=4096 | gzip -v9 > /tmp/ram_image.gz
說明:將RamDisk打包,並進行壓縮成ram_image.gz。執行到這裡就可以直接下載了 

7.下載核心映像和ramdisk映像
啟動u-boot,暫停u-boot自動啟動,在u-boot命令列中鍵入如下命令下載核心和ramdisk映像:

在u-boot命令列下,將核心及映象下載到RAM再寫入到nand


8)使用ramdisk根檔案系統啟動核心
u-boot命令列下鍵入如下命令啟動系統:
bootm 0x32000000//具體地址根據開發板

如果在3.修改核心啟動引數時用了第四種方法這裡就不用手動輸入了
鍛鍊一下自己分析解決問題的能力吧。呵呵。

關於busybox的 操作,我自己並未使用,各位可以直接網上看相應的操作,這裡就不詳細說明了。