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文件系统,这个字段是,:

.
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

你可能感兴趣的:(Linux.,文件系统)