yaffs2文件系統移植


1Linux2.6.37下移植yaffs文件系統

原始的linux內核是不支持Yaffs2文件系統的,我們首先需要下載yaffs2的內核補丁,給內核打上yaff2補丁才能使內核支持該文件系統。

yaffs2 老版本不支持2.6.36以上內核。 網上下載的yaffs2常見版本(點擊http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/下方的Download GNU tarball進行下載)一般不支持2.6.36/37。但2.6.36一下版本依然可以使用。

最新的yaffs2採用git發佈,利用git工具下載到最新的yaffs2源代碼,即可支持。辦法是使用到www.yaffs.net發佈的git方法獲得最新版,並且查看readme確認其支持2.6.36/37。yaffs有一個較大的變化,是在2.6.36/37內核發佈之後的一段時間裏出現的,主要就是patch-ker.sh多了一個參數,m/s 是選擇multi version支持,還是single version支持。(注意:在最新的linux版本下用multi version支持。)

1)下載源代碼

如果系統已經安裝git工具,就直接執行:

git clone git://www.aleph1.co.uk/yaffs2 

如果沒有git工具,請首先下載安裝git(http://git-scm.com/)。當然,也可以在windows下用git工具下載。

2)給內核打補丁

yaffs源代碼下載完後,放到某個目錄下(但不要放在內核目錄下!)進入yaffs源代碼目錄:

#cd yaffs2

打補丁(注意參數順序不能錯):

#./patch-kernel.sh c m  ../linux-2.6.37.1

3)然後配置內核:

#cd   ../linux-2.6.37.1   //返回內核根目錄

# make ARCH=arm CROSS_COMPILE=arm-linux-  menuconfig

File systems -->

Miscellaneous filesystems -->

<*> YAFFS2 file system support

4) 重新編譯內核

# make ARCH=arm CROSS_COMPILE=arm-linux- 

然後製作新的uImage,加載或者燒寫到FLASH,如果能正確引導並加載yaffs文件系統則移植成功。

特別說明:一旦在使用新版本yaffs補丁之前使用過舊版本補丁,新版本的補丁則打不上了,建議使用新版本重新編譯內核。

=======================

需要注意:因爲windows中下載導致文件編碼和linux的不同。所以,如果是在windows下用git下載並傳遞到linux下的,則需要修改兩個文件的編碼:

 (1) 在linux下,進入yaffs2源代碼目錄

#vi patch-kernel.sh

然後在vi中執行如下命令:

 :set ff=unix 

保存退出

然後修改權限使patch-kernel.sh具有可執行權限:

#chmod  755  patch-kernel.sh

 (3)修改fs/yaffs2/Kconfig的編碼

#vi  fs/yaffs2/Kconfig

在vi中執行命令:

:set  ff=unix

保存退出,按照上述步驟進行打補丁。


2、用busybox製作yaffs2根文件系統

所謂的根文件系統,就是創建各個目錄,並且在裏面創建各種文件,比如在/bin,/sbin/目錄下存放各種可執行的程序,在/etc目錄下存放配置文件,在/lib目錄下存放庫文件,下面就可以文件系統的移植。

1)根文件系統的目錄結構
bin 
存放所有用戶都可以使用的、基本的命令。
sbin 存放的是基本的系統命令,它們用於啓動系統、修復系統等。
usr 裏面存放的是共享、只讀的程序和數據。
proc 這是個空目錄,常作爲proc文件系統的掛載點。
dev 該目錄存放設備文件和其它特殊文件。
etc 存放系統配置文件,包括啓動文件。
lib 存放共享庫和可加載塊(即驅動程序),共享庫用於啓動系統、運行根文件系統中的可執行程序。
boot 引導加載程序使用的靜態文件
home 用戶主目錄,包括供服務賬號鎖使用的主目錄,如FTP
mnt 用於臨時掛接某個文件系統的掛接點,通常是空目錄。也可以在裏面創建空的子目錄。
opt 給主機額外安裝軟件所擺放的目錄。
root root用戶的主目錄
tmp 存放臨時文件,通常是空目錄。
var 存放可變的數據。

2)建立根文件系統的目錄

進入工作目錄,創建一個shell的腳本用於構建根文件系統的各個目錄。mkrootfs.sh,平且改變執行的權限。

sudo chmod 777 mkrootfs.sh

腳本內容如下:

#!/bin/sh
echo "------Create rootfs directons start...--------"
mkdir rootfs
cd rootfs
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home
mkdir etc/init.d etc/rc.d etc/sysconfig
mkdir usr/sbin usr/bin usr/lib usr/modules

mkidr proc/sys mkidr proc/sys/kernel 

mkidr proc/sys/kernel/

echo "make node in dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp
mkdir var/lib var/lock var/run var/tmp
chmod 1777 tmp
chmod 1777 var/tmp
echo "-------make direction done---------" 

改變了tmp目錄的使用權,讓它開啓sticky位,爲tmp目錄的使用權開啓此位,可確保tmp目錄底下建立的文件,,只有建立它的用戶有權刪除。


3、編譯和安裝Busybox

Bosybox 是一個遵循 GPL v2協議的開源項目,它在編寫過程總對文件大小進行優化,並考慮了系統資源有限(比如內存等)的情況,使用 Busybox 可以自動生成根文件系統所需的bin、sbin、usr 目錄和 linuxrc 文件。  

首先下載busybox,下載地址:www.busybox.net

下載鏈接:http://www.busybox.net/downloads/busybox-1.18.3.tar.bz2

解壓源代碼:

#tar -jxvf  busybox-1.18.3.tar.bz2

修改Makefile中的交叉鏈和系統架構:

CROSS_COMPILE ?=arm-linux- 

ARCH ?=arm

配置編譯選項:

如果修改了Makefile則使用如下命令

#make  menuconfig

如果未修改Makefile則使用如下命令:

# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

 [A]指定安裝位置:

Busybox Settings  --->

Installation Options ("make install" behavior)  --->

BusyBox installation prefix-->

輸入:../rootfs //實際中,要根據計劃的文件系統根設定! 

[B]指定mdev動態文件系統

Linux System Utilities --->

[*]Support /etc/mdev.conf

[*]Support command execution at device addition/removal

說明:在busybox中配置對dev下設備類型的支持dev的創建有三種方法:
(1)手動創建:在製作根文件系統的時候,就在 dev目錄下創建好要使用的設備文件,系統
掛接根文件系統後,就可以使用 dev目錄下的設備文件了。  
(2)使用 devfs 文件系統:這種方法已經過時,具有不確定的設備映射、沒有足夠的主/次設備號、devfs 消耗大量的內存。  
(3)udev: 它是個用戶程序,(u是指user space ,dev 是指device)能根據系統中硬件設備的狀態動態的更新設備文件,包括設備文件的創建、刪除等。使用udev機制也不需要/dev目錄下創建設備節點, 它需要一些用戶程序的支持,並且內核要支持sysfs文件系統。它的操作相對複雜,但靈活性很高 。mdev 是 busybox 自帶的一個簡化版的 udev,適合於嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啓動和熱插拔或動態加載驅動程序時,自動產生驅動程序所需的節點文件。在以busybox 爲基礎構建嵌入式linux 的根文件系統時,使用它是最優的選擇。配置時需要增加對 mdev的支持。  
4、編譯busybox 
 # make ARCH=arm CROSS_COMPILE=arm-linux-  install  
在 rootfs 目錄下會生成目錄 bin、sbin、usr 和文件 linuxrc 的內容。


4、 建立etc目錄
 init進程根據/etc/inittab文件來創建其他的子進程,比如調用腳本文件配置IP地址,掛載其他的文件系統,最後啓動shell等。
(1)、拷貝主機 etc 目錄下的passwd、group、shadow文件到 rootfs/etc目錄下。
(2) etc/sysconfig目錄下新建文件HOSTNAME,內容爲”smdk2440” 。  
(3) etc/inittab文件:  
  仿照Busybox的examples/inittab文件,在etc/目錄下創建一個inittab文件.

#etc/inittab

::sysinit:/etc/init.d/rcS

::respawn:-/bin/sh

::askfirst:-/bin/sh

::ctrlaltdel:/bin/umount -a –r

 

5、創建etc/init.d/rcS文件:
這是一個腳本文件,可以在裏面添加自動執行的命令,

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S      //運行的級別
prevlevel=N
umask 022   //文件夾的掩碼
export PATH runlevel prevlevel
mount -a     //掛載/etc/fstab/文件指定的所有的文件系統

mount -t tmpfs none /tmp

mount -t tmpfs none /var

mkdir -p /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev>/proc/sys/kernel/hotplug

mdev -s

/bin/hostname -/etc/sysconfig/HOSTNAME //主機的名字

最後,還要改變它的屬性,使它能夠運行“

sudo chmod 777 etc/init.d/rcS


6、創建etc/fstab文件: 
  
內容如下,表示執行完,“mount -a”命令後將掛載proc,tmpfs 等包含在該文件中的所有的文件系統。

#device  mount-point type  options dump fsck order
proc     /proc       proc  defaults 0 0
sysfs    /sys        sysfs defaults 0 0
tmpfs    /tmp        tmpfs defaults 0 0
tmpfs    /var        tmpfs defaults 0 0
tmpfs    /dev        tmpfs defaults 0 0

/etc/fstab/文件被用來定義文件系統的“靜態信息”,這些信息被用來控制mount命令的行爲,各個字段的含義以如下:
device: 要掛載的設備
   比如/dev/hda2 /dev/mtdblock1 等設備文件,也可以是其他格式的,比如對於proc文件系統這個字段就沒有意義,可以就任意的值,對於NFS文件系統,這個字段是,<host>:<dir>.
mount-point: 掛載點
type 文件系統類型:
   比如 proc,jffs2,yaffs,ext2 ,nfs等,也可以是auto,表示自動檢測文件系統類型
options: 掛接參數,以逗號隔開
/etc /fstab的作用不僅僅是用來控制'mount -a'的行爲,即使是一般的mount命令,也受它的控制,常用的取值還有 auto noauto user 只允許普通用戶掛載設備 nouser exec 允許運行所掛載設備上的程序 noexec Ro 只讀方式 rw 以讀寫的方式 sync 修改文件是,它會同步寫入設備中 async 不同步
  defaults rw suid dev exec auto nouser async 等的組合。
  dump 和fsck order:用來控制dump fsck程序的行爲
dump是一個用來備份的文件的程序,fsck是一個用來檢查磁盤的程序,


7、 創建etc/profile文件:

#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit --c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[\u@\h\W]#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH


8、 製作根文件系統映像文件

我的目標板NandFlash是64MB的,所以要使用mkyaffs2image的64M版本這個可執行的文件生成映像文件。使用命令mkyaffs2image rootfs rootfs.img生成根文件系統映像文件。把生成的rootsfs.img文件燒寫到nandFlash中的根文件系統區。重新引導操作系統即可實現文件系統的正確掛載。

4、移植過程中遇到的問題及處理:

如果出現“Kernel panic - not syncing: Attempted to kill init!”錯誤,請在編譯內核時選擇EABI支持。

Kernel Features  --->

[*] Use the ARM EABI to compile the kernel                  

[*]   Allow old ABI binaries to run with this kernel (EXPERIMENTA)

把這個選上重新編譯就可以了,如果文件系統鏡像也是新做的則也要考慮文件系統本身有問題的可能性。此外請注意mkyaffs2image 工具是否正確,我使用友善之臂的工具就出現此錯誤,但是使用天嵌提供的工具則可以正常使用。

如果出現“Failed_to_execute_/linuxrc”可以根據下面的建議逐個檢查。
1. bin/busybox文件是可以執行的。
2. 在配置busybox的時候要選中shell選項中的一個選項
3. linuxrc 是可執行的。
4. 製作文件系統的時候利用的工具也要留意區分:
    mkcramfs       製作cramfs鏡像的工具
    mkimage        製作jffs2鏡像的工具
    mkyaffs2image   製作2.6的yaffs2的鏡像工具(針對Nand Flash是128MB到1G的)
    mkyaffsimage     製作2.6.13的yaffs2的鏡像工具
    mkyaffsimage_2       製作2.6.25.8或2.6.30.4或更高版本內核的yaffs2的鏡像工具(針對Nand Flash是  64MB的)

5、配置內核時是否取消ECC(我遇到此問題是通過取消ECC解決此問題。)

NAND Flash support for Samsung S3C SoCs

   □Samsung S3C NAND Hardware ECC

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章