Ramdisk根檔案系統啟動Linux(單獨的ramdisk映象)
開發環境:Ubuntu10.04
交叉編譯工具鏈:univore32-linux-gcc 4.3.2
嵌入式Linux核心版本:2.6.29.4-FriendlyARM。
開發板:SEP6200
Bootloader:u-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是否被選中,如果沒有則選中,此項優化核心大小,根據需要進行配置。
修改(8192)Default RAM disk size kbytes選項為(4096)Default RAM disk size kbytes,之所以修改是因為我之後製作的ramdisk
然後特別要注意的一點是,ramdisk是一種記憶體虛擬磁碟技術,實質上並不是一種檔案系統,它使用的檔案系統時ext2檔案系統。所以一定要在make menuconfig ARCH=arm的時候進入File systems選單,選上
然後儲存配置退出。
這樣就為核心新增好了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的的第310行CMDLINE定義,而是用u-boot的bootargs環境變數來傳遞啟動引數。
同樣也是修改該環境變數為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核心映像
由於我使用的Bootloader是u-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的 操作,我自己並未使用,各位可以直接網上看相應的操作,這裡就不詳細說明了。