首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

嵌入式根文件系统的构建

嵌入式根文件系统的构建

我将从一个初学者的视角,全面的介绍根文件系统的构建,力求最通俗,最易懂,最简洁。
首先我们来了解一下什么叫做根文件系统
一,什么叫根文件系统
用一句话来讲就是"操作系统提供给用户的一个接口",比如说windows,你要是没有C盘,D盘之类的构架,你程序怎么存入硬盘?你如何操作硬盘数据?进程如何从硬盘读取数据?
Linux操作系统更能体验接口这个概念,因为他把所有的设备都虚拟成一个文件,对设备的操作就是对文件的操作。在Linux中如果没有文件系统的话,用户就和操作系统的交互就断开了,我们无法通过shell要求操作系统执行各种命令,也无法运行各种程序。
更细致的来说根文件系统,它其实包括管理目录和数据的方法和文件•目录的组织方法,及所有文件和目录构成一个根文件系统
根文件系统有很多种种类,最常用的有
MS-DOS的FAT32
Linux发行版经常用的ext3 etx4
嵌入式经常用的ramfs yaffs
不同的种类的根文件系统有不同组织文件的方法和数据的组织方法。如想了解的更深入点,去查百度百科。
二linux根文件目录结构
所有Linux的遵循一个文件系统标准叫"FHS"(filesystem hierarchy standrad), http://www.pathname/该网站可以看
通常一个Linux文件系统应该如下
/dev device的简写,意思是这个目录存放的全部是设备文件,linux将所有设备都抽象成文件放在这个目录,通过对文件的操作就可以控制设备,比如说硬盘,一般是sda打头的,可以通过 mount /dev/sda /mnt来挂载硬盘
/root 这个是系统管理员专用的目录,这里存放了一些引导系统的备份文件,文件系统挂载信息,系统修复工具备份工具等
/usr 这个目录存放的是共享、只读的程序和数据。
/var variable的简写,存放的是一些可变的数据,日志文件,临时文件什么的
/home 家目录,大家用过Linux应该都知道这个目录是干嘛的,这个目录相当于windows的我的文档,一般工作都在这个目录里进行。
/proc这是一个空目录,不过系统跑起来之后就不是空的了,里面的目录文件都是由系统生成的,但他并不在物理存储设备上有数据,是系统在内存上构建的,所有是个虚拟的家伙。里面包含了一些系统信息,cpu信息什么的
/bin 存放的普通命令的可执行文件
/sbin 存放的是系统命令的可执行文件
/etc 存放了很多配置文件,比如系统初始化脚本,挂载文件的配置文件等等
/boot 存放的是系统的bootloader和内核及其配置文件,一般嵌入式系统不需要这个目录,因为嵌入式bootloder都是单独放的一个分区
/lib 系统的库文件
/initrd 这个目录是空的,用来启动时挂载initrd.img镜像的,initrd.img镜像也是一种根文件系统,一般发行版得linux使用两阶段挂载根文件系统,第一次阶段使用initrd.img根文件系统,根文件直接在内存里运行,速度快,然后挂载硬盘上的根文件系统,这样可以加快速度,嵌入式一般不需要这个目录。
/tmp 临时文件目录
/mnt 临时挂载点
三,yaffs2文件系统的构建
Yaffs2能很好的支持flash,在嵌入式领域应用广泛,所以我们选择yaffs2
1 首先我们要根据需要创建一个根文件系统框架
参考上面的目录结构,我们不需要的是boot,initrd这两个目录,并增加一个sys目录,这个sys目录是busyBox的一个支持热拔插的程序mdev需要的目录
首先建一个总目录我命名为root_fs,然后建立好子目录
mkdir root_fs
cd root_fs
mkdir bin dev etc home lib mnt proc root sbin sys tmp
2 安装好busybox
进入busybox目录
Make menuconfig
进入busybox setting->
Build options->
选中 build busybox as a static binary和bulid with lager file support选项
表示使用静态库编译,支持大文件
再进入 busybox library tuning
选中vi-style line editing commands和fancy shell prompts设置命令行风格
然后编译,
Make
安装 make install
然后拷贝安装目录 _install下的所有文件 到我们先前建的root_fs目录下
cp _install/* ../root_fs -rf
3 在dev目录下创建两个设备节点
mknod console c 5 1
mknod null c 1 3
这两个是系统运行第一个初始化进程必需要使用的使用的俩个设备
C表示字符设备 再后面是主设备号和次设备号 用来指示操作系统找到驱动的
拷贝busybox的实例配置文件到etc下面
Cp ../busybox-1.15/examples/bootfloopy/etc/* ./
这里面有四个文件
Fstab init.d inittab profile
Busybox构建的根文件系统启动流程是这样的,先根据命令行参数init=linuxrc
启动linuxrc程序
Linurc根据inittab配置文件来启动相应的脚本或进程
Inittab格式:<id>::<runlevels>:<action>:<process>
现在我们修改inittab如下

这表示
运行的rcS脚本,运行级别为sysinit,该脚本要使用使用控制台
运行shell解释器,运行级别为askfirst,该进程要使用串口一
这个名字是由busybody产生的,s3c2410 s3c2440都是这个名
运行umount -a -r当按下ctr alt del组合键的时候
这里可以看到linuxrc通过inittab启动了rcS脚本
现在我们修改init.d目录下的rcS文件为


这文件是先设置PATH变量
再设置runlevel 和 prelevel变量
Mount -a会根据fstab挂载目录,修改fstab如下


挂载所需的文件系统
然后设置文件默认属性
然后挂载devpts文件系统 这个是用来支持外部网络链接虚拟中端得
重定向mdev输出到内核的hotplug文件来支持热拔插
运行mdev -s在/dev目录下生成内核支持的所有设备文件
从HOSTNAME文件读取主机名
所以
在/dev/下创建sysconfig目录再在此目录下创建HOSTNAME文件
修改HOSTNAME文件为JustDo
最好
修改profile

这是你登陆命令解释器的配置文件,他能够改变你命令行前面显示的内容

/W是当前目录名

最后一步:将所需的库文件全部拷贝到lib目录下,这个库文件在你所使用的交叉工具链中
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/* ./lib

好了 完成上面所有的步骤之后
使用mkyaffs2image工具编译好之后下载到开发板的根文件分区就可以跑了
如果出现
"Failed to execute /linuxrc. Attempting defaults...
Kernel panic - not syncing: No init found. Try passing init= option to kernel. "
有可能是你使用的mkyaffs2image工具不支持128M的flash
我的另外一篇博客已经提到怎么解决了
综上 系统启动的流程大概是这个样子的到处必要的环境变量,Mount上所需的分区,最后运行脚本解释器
返回列表