yaffs2文件系统移植
编者:前面用的文件系统都是友善自带的文件系统,其GUI是基于QTOPIA,这个文件系统的功能还是比较强大的。这里我们可以自己移植一个根文件系统,不过这只是一个最基本的系统,这样有助于理解嵌入式的开发。文件系统的制作过程大体相似,只是使用的制作工具不一样。在此处制作的文件系统,主要参考了移植手册和《ARM嵌入式系统移植实战开发》一书。
下面介绍下手册上的移植过程:原文链接如下
http://huang-tomey.blog.163.com/blog/static/1247505732009916437175/
使用busybox 制作基本根文件系统的详细步骤
1 下载busybox 源代码
从 http://www.busybox.net/downloads/ 下载busybox , 这里下载的是busy busybox-1.13.3.tar.gz,这和当前mini2440 开发板使用的版本是一致的。
2 根文件系统目录说明
嵌入式Linux 中都需要构建根文件系统,构建根文件系统的规则在FHS(FilesystemHierarchy Standard)文档中,下面是根文件系统顶层目录。
目录 内容
bin 存放所有用户都可以使用的、基本的命令。
sbin 存放的是基本的系统命令,它们用于启动系统、修复系统等。
usr 里面存放的是共享、只读的程序和数据。
proc 这是个空目录,常作为proc 文件系统的挂载点。
dev 该目录存放设备文件和其它特殊文件。
etc 存放系统配置文件,包括启动文件。
lib 存放共享库和可加载块(即驱动程序),共享库用于启动系统、运行根文件系统中的可执行程序。
boot 引导加载程序使用的静态文件
home 用户主目录,包括供服务账号锁使用的主目录,如FTP
mnt 用于临时挂接某个文件系统的挂接点,通常是空目录。也可以在里面创建空的子目录。
opt 给主机额外安装软件所摆放的目录。
root root 用户的主目录
tmp 存放临时文件,通常是空目录。
var 存放可变的数据。
3 建立根文件系统目录
进入到/opt/studyarm 目录,新建建立根文件系统目录的脚本文件create_rootfs_bash,使用命令chmod +x create_rootfs_bash 改变文件的可执行权限,./create_rootfs_bash 运行脚本,就完成了根文件系统目录的创建。
#!/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
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 目录底下建立的文件,只有建立它的用户有权删除。尽管嵌入式系统多半是单用户,不过有些嵌入式应用不一定用root 的权限来执行,因此需要遵照根文件系统权限位的基本规定来设计。
4 建立动态链接库
动态链接库直接用友善之臂的,先解压友善之臂的根文件包,拷贝lib 的内容到新建的根文件目录lib 内。
cd /mnt/hgfs/share
tar –zxvf root_qtopia.tgz –C /opt/studyarm
cp –rfd /opt/studyarm/root_qtopia/lib/* /opt/studyarm/rootfs/lib/*
5 交叉编译Bosybox
Bosybox 是一个遵循GPL v2 协议的开源项目,它在编写过程总对文件大小进行优化,并考虑了系统资源有限(比如内存等)的情况,使用Busybox 可以自动生成根文件系统所需bin、sbin、usr 目录和linuxrc 文件。
5.1解压busybox
cd /mnt/hgfs/share
tar –zxvf busybox-1.13.3.tar.tgz –C /opt/studyarm
5.2进入源码,修改Makefile 文件:
cd /opt/studyarm/busybox-1.13.3
修改:
CROSS_COMPILE ?=arm-linux- //第164 行
ARCH ?=arm //第189 行
5.3配置busybox
输入make menuconfig 进行配置
(1)、Busybox Settings--->
General Configuration--->
[*] Show verbose applet usage messages
[*] Store applet usage messages in compressed form
[*] Support –install [-s] to install applet links at runtime
[*] Enable locale support(system needs locale for this to work)
[*] Support for –long-options
[*] Use the devpts filesystem for unix98 PTYs
[*] Support writing pidfiles
[*] Runtime SUID/SGID configuration via /etc/busybox.config
[*] Suppress warning message if /etc/busybox.conf is not readable
Build Options--->
[*] Build BusyBox as a static binary(no shared libs)
[*] Build with Large File Support(for accessing files>2GB)
Installation Options->
[]Don’t use /usr
Applets links (as soft-links) --->
(./_install) BusyBox installation prefix
Busybox Library Tuning --->
(6)Minimum password legth
(2)MD5:Trade Bytes for Speed
[*]Fsater /proc scanning code(+100bytes)
[*]Command line editing
(1024)Maximum length of input
[*] vi-style line editing commands
(15) History size
[*] History saving
[*] Tab completion
[*]Fancy shell prompts
(4) Copy buffer size ,in kilobytes
[*]Use ioctl names rather than hex values in error messages
[*]Support infiniband HW
(2)、Linux Module Utilities--->
(/lib/modules)Default directory containing modules
(modules.dep)Default name of modules.dep
[*] insmod
[*] rmmod
[*] lsmod
[*] modprobe
-----options common to multiple modutils
[ ] support version 2.2/2.4 Linux kernels
[*]Support tainted module checking with new kernels
[*]Support for module .aliases file
[*] support for modules.symbols file
(3)、在busybox 中配置对dev 下设备类型的支持
dev 的创建有三种方法:
手动创建:在制作根文件系统的时候,就在dev 目录下创建好要使用的设备文件,系统挂接根文件系统后,可 以使用dev 目录下的设备文件了。
使用devfs 文件系统:这种方法已经过时,具有不确定的设备映射、没有足够的主/次设备号、devfs 消耗大量的内存。
udev:它是个用户程序,能根据系统中硬件设备的状态动态的更新设备文件,包括设备文件的创建、删除等。它的操作相对复杂,但灵活性很高
mdev 是busybox 自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox 为基础构建嵌入式linux 的根文件系统时,使用它是最优的选择。
下面的选项将增加对mdev 的支持。
Linux System Utilities --->
[*]Support /etc/mdev.conf
[*]Support command execution at device addition/removal
4、编译busybox
编译busybox 到指定目录:
cd /opt/studyarm/busybox-1.13.3
make CONFIG_PREFIX=/opt/studyarm/rootfs install
在rootfs 目录下会生成目录bin、sbin、usr 和文件linuxrc 的内容。
6 建立etc 目录下的配置文件
1、etc/mdev.conf 文件,内容为空。
2、拷贝主机etc 目录下的passwd、group、shadow 文件到rootfs/etc 目录下。
3、etc/sysconfig 目录下新建文件HOSTNAME,内容为”H3-Studio”。
4、etc/inittab 文件:
#etc/inittab
::sysinit:/etc/init.d/rcS
s3c2410_serial0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/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
echo "----------munt all----------------"
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s
echo "***********************************************"
echo "****************Studying ARM*********************"
echo "Kernel version:linux-2.6.29.1"
echo "Student:Huang huahai"
echo "Date:2009.10.1"
echo "***********************************************"
/bin/hostname -F /etc/sysconfig/HOSTNAME
(或者直接 /bin/hostname H3-Studio )
使用以下命令改变rcS 的执行权限:
Chmod +x rcS
6、etc/fstab 文件:
#device mount-point type option dump fsck order
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
mdev /dev ramfs defaults 0 0
7、 etc/profile 文件:
#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -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
7 制作根文件系统映像文件
使用以下命令安装好yaffs 文件系统制作工具:
cd /mnt/hgfs/share
tar –zxvf mkyaffs2image.tgz –C /
在/opt/studyarm 目录下,使用命令mkyaffs2image rootfs rootfs.img 生成根文件系统映像文件。烧写到开发板就可以运行了。
ps:上面的介绍完全是按照手册进行的,我也是一步步的做下来的。中间出现了几个问题:
第一个,上述文件系统烧入进去后,运行,老显示,不能打开tty2,tty3,tty4,我感觉很奇怪,因为我原来也移植过并没有出问题。大概想了一下,这个问题肯定是在配置文件的问题,也就是在etc下,原来我实现了inittab这个文件,这是init进程的配置文件。这里没实现也就是自己生成了默认的配置文件。是不是这个问题呢?我么有去修改busybox中这个默认的配置文件,自己实现了一个,然后这个问题就解决了。
第二个,在shell中,光标显示的位置老是不对,这个很容易想到profile文件问题,调整了下,也解决了。
第三个,编译的yaffs2文件系统不能运行,这个可能是这个原因。友善之臂提供的mkyaffs2image工具在制作用于128Mflash的文件文件系统时,只能在fodera 9.0系统下使用,如果你使用的是别的系统,这个工具很可能不能正常的使用。这时只能找到源码进行适当修改,重新编译得到这个工具,就可以用了。
看我的这篇文章http://blog.csdn.net/ssdsafsdsd/article/details/8702269