现在大部分开发板都可以支持yaffs2 文件系统,它是专门针对嵌入式设备,特别是使用nand flash作为存储器的嵌入式设备而创建的一种文件系统,早先的yaffs仅支持小页(512byte/page)的nand flash,使用 yaffs2 就可以支持大页的 nand flash。
所谓的根文件系统,就是创建各个目录,并且在里面创建各种文件,比如在/bin,/sbin/目录下存放各种可执行的程序,在/etc目录下存放配置文件,在/lib目录下存放库文件,下面就开始文件系统的移植。
一、准备工作
1.Yaffs2源代码的获取
在http://www.yaffs.net/node/346可以下载到最新的yaffs2 源代码, 如果使用git工具,在命令行输入:
#git clone git://www.aleph1.co.uk/yaffs2 |
就可以下载到yaffs2的源代码,到当前目录下。
2.下载Busybox-1.13.3
可以从http://www.busybox.net/downloads/下载Busybox-1.13.3。
3.下载Yaffs2的制作工具
可以到友善之臂的网站下载,mkyaffs2image.tgz,其中解压出来有两个可执行的文件,一个是针对小页的,一个是针对NandFlash大页的,其名字为mkyaffs2image-128M,一开始在这里犯了错误,我的NandFlash是128MB的,可以按照网上用的是mkyaffs2image文件,所以老是出来假坏块的提示,仔细一分析,NandFlash不可能一下子出来这么多的坏块,而且我用他们公司提供的根文件系统却没有任何的问题,所以问题处在了制作Yaffs2的工具上面。因为这两种大小NandFlash的ECC校验是不一样的,也就是spare区的大小是不一样的,造成了ECC校验出错。
4.链接库
制作根文件系统时,要使用到链接库,这里直接使用友善之臂根文件系统中的链接库。从网站下载root_qtopia.tgz。使用lib目录下的链接库。
5.给内核打上YAffs2补丁
然后进入yaffs2源代码目录执行:
#cd yaffs2 |
此时进入linux-2.6.32.2/fs目录,可以看到已经多了一个yaffs2目录。
上面命令完成下面三件事情:
(1) 修改内核fs/Kconfig
增加一行:source"fs/yaffs2/Kconfig"
(2) 修改内核fs/Kconfig
增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/
(3) 在内核fs/目录下创建yaffs2目录
将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
将yaffs2 源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
6.配置内核以支持Yaffs2文件系统
在Linux内核源代码根目录运行:make menuconfig,找到File Systems,再找到“Miscellaneousfilesystems”菜单项,找到“YAFFS2 file system support”,并选中它(如上图),这样我们就在内核中添加了yaffs2 文件系统的支持,保存退出。然后在命令行中,执行make uImage,这时不要在执行mage mini2440_defconfig了,如果再执行的话,前面的配置就失效了,在这我也犯了一个低级的错误。
二、构建根文件系统
1.根文件系统的目录结构
bin 存放所有用户都可以使用的、基本的命令。
sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr 里面存放的是共享、只读的程序和数据。
proc 这是个空目录,常作为proc文件系统的挂载点。
dev 该目录存放设备文件和其它特殊文件。
etc 存放系统配置文件,包括启动文件。
lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。
boot 引导加载程序使用的静态文件
home 用户主目录,包括供服务账号锁使用的主目录,如FTP
mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt 给主机额外安装软件所摆放的目录。
root root用户的主目录
tmp 存放临时文件,通常是空目录。
var 存放可变的数据。
2.建立根文件系统的目录
进入opt/mini2440/fs,创建一个shell的脚本用于构建根文件系统的各个目录。create_rootfs_bash,平且改变执行的权限。
#chmod +x create_rootfs_bash |
在kernel目录下,运行./create_rootfs_bash,其脚本的内容如下:
#!/bin/sh |
改变了tmp目录的使用权,让它开启sticky位,为tmp目录的使用权开启此位,可确保tmp目录底下建立的文件,只有建立它的用户有权删除。
3.建立动态的链接库
动态链接库直接使用友善之臂的,首先,下载友善之臂的根文件系统解压后得到root_qtopia,把该文件下的Lib下的文件全部复制到我们自己建立的lib/文件夹下。
4.编译和安装Busybox
Bosybox 是一个遵循GPL v2协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用 Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和 linuxrc 文件。
解压Busybox,然后
#cd busybox-1.13.3 //修改该目录下的makefile文件,修改平台为arm平台,修改编译器为默认的交叉编译器 CROSS_COMPILE ?=arm-linux- //大约在164行 ARCH ?=arm //大约在189行 |
配置busybox,在busybox-1.13.3目录下,这里我们只关心改动的地方。执行make menuconfig,其各个选项的配置如下(只列出更改的):
(1)Busybox Settings--->
BuildOptions--->
[*]Build BusyBox as a static binary(no shared libs)
BusyboxLibrary Tuning --->
(1024)Maximumlength of input
[*]vi-style line editing commands
[*]Fancyshell prompts
(2)Linux System Utilities --->
[*]Support/etc/mdev.conf
[*]Supportcommand execution at device addition/removal
(3) Linux Module Utilities---> [ ]simplified modutils
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
5.编译busybox
编译busybox到指定目录:#cd /opt/mini2440/busybox-1.13.3
make CONFIG_PREFIX=/opt/kernel/rootfs install
即:执行make CONFIG_PREFIX=根文件系统目录 install
在rootfs目录下会生成目录bin、sbin、usr和文件linuxrc的内容。
6.建立etc目录
init进程根据/etc/inittab文件来创建其他的子进程,比如调用脚本文件配置IP地址,挂载其他的文件系统,最后启动shell等。
(1)拷贝主机etc目录下的passwd、group、shadow文件到rootfs/etc目录下。
(2)在etc/下创建mdev.conf文件
内容为:
# system all-writable devices full 0:0 0666 null 0:0 0666 ptmx 0:0 0666 random 0:0 0666 tty 0:0 0666 zero 0:0 0666 # console devices tty[0-9]* 0:5 0660 vc/[0-9]* 0:5 0660 # serial port devices s3c2410_serial0 0:5 0666 =ttySAC0 s3c2410_serial1 0:5 0666 =ttySAC1 s3c2410_serial2 0:5 0666 =ttySAC2 s3c2410_serial3 0:5 0666 =ttySAC3 # loop devices loop[0-9]* 0:0 0660 =loop/ # i2c devices i2c-0 0:0 0666 =i2c/0 i2c-1 0:0 0666 =i2c/1 # frame buffer devices fb[0-9] 0:0 0666 # input devices mice 0:0 0660 =input/ mouse.* 0:0 0660 =input/ event.* 0:0 0660 =input/ ts.* 0:0 0660 =input/ # rtc devices rtc0 0:0 0644 >rtc rtc[1-9] 0:0 0644 # misc devices mmcblk0p1 0:0 0600 =sdcard */bin/hotplug.sh sda1 0:0 0600 =udisk * /bin/hotplug.sh |
(3)etc/inittab文件:仿照Busybox的examples/inittab文件,在etc/目录下创建一个inittab文件,写上以下内容:
#etc/inittab ::sysinit:/etc/init.d/rcS ::askfirst:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r |
(4)创建etc/init.d/rcS文件:
这是一个脚本文件,可以在里面添加自动执行的命令
#!/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin runlevel=S //运行的级别 prevlevel=N umask 022 //文件夹的掩码 |
最后,还要改变它的属性,使它能够运行
sudo chmod +x etc/init.d/rcS |
(5)etc/sysconfig目录下新建文件HOSTNAME,内容为”yuyang-mini2440”。
(6)创建etc/fstab文件:
内容如下,表示执行完,“mount -a”命令后将挂载proc,tmpfs等包含在该文件中的所有的文件系统。
#device mount-point type option dump fsck order |
(7)创建etc/profile文件:
#Ash profile |
三、制作根文件系统映像文件
在前面也已经讲过,我的NandFlash是128MB的,所以要使用友善之臂的mkyaffs2image-128这个可执行的文件生成映像文件,使用命令mkyaffs2image-128M rootfs rootfs.img生成根文件系统映像文件。
把生成的rootsfs.img文件下载到nandFlash中的根文件系统区。然后从NANDFlash启动可以看到启动信息。不过现在只是一个最基本的Linux系统,里面的驱动程序还没有,网上驱动,LCD驱动等等,所以还有很多的东西要移植呢。这也是下一步的任务。