linux根文件系统构建
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.首先一个嵌入式linux产品开发大致分为以下几个流程:
1.硬件工程师:硬件规划,硬件设计,制板,焊接,硬件调试
2.系统工程师或驱动工程师:bootloader移植到1中所开发出来的硬件平台,移植linux内
核,制作供内核启动的根文件系统
3.驱动工程师:按照产品规划书,要求,移植必备的驱动
4.应用工程师:业务相关的应用程序,开发和产品密切相关的应用程序,驱动程序
5.功能测试,性能测试,系统集成此时
6.实验(系统设备)发布
二.根文件系统分析
1.根文件系统简介
Windows操作系统可以将硬盘划分为C,D,E,F等各个盘分别访问,linux同理将MTD设备划分为若干个分区,在不同的分区存放不同类别的文件。与windows的C盘类似,linux 一样要在一个分区上存放系统启动所必需的文件如下图所示:
内核启动后运行的第一个程序init,给用户提供操作界面的shell脚本程序,应用程序所依赖的库等,这些必需、基本的文件合称为根文件系统,存放在一个分区中,linux系统启动后首先挂接这个分区,称为挂接根文件系统。其他分区上所有的目录,文件的集合,也称为文件系统。有此可见linux启动时使用的第一个文件系统便是根文件系统,若此文件系统挂接不成功或者参数配置不正确则linux内核无法正常启动。
按照FHS标准,根文件系统顶层下一般有如下几个目录:
bin:存放所有用户都可以使用的,基本的命令
sbin:存放基本的系统命令,用于启动系统,修复系统
dev:存放设备文件和其它特殊文件
etc:存放系统配置文件,包括启动文件
usr:存放共享,只读的程序和数据
proc:空目录,常作为proc文件系统的挂接点
lib:存放共享库和可加载模块,共享库用于启动系统,运行根文件系统中的可执行程序boot:引导加载程序使用的静态文件
home:用户目录,可选的,包括供服务帐号锁使用的主目录,如FTP
mnt:用于临时挂接某个文件系统的挂接点,通常是空目录
opt:给主机额外安装软件所摆放的目录
root:root用户的主目录
tmp:存放临时文件,通常是空目录
var:存放可变数据
2.根文件系统制作工具Busybox
Busybox俗称嵌入式开发中的瑞士军刀,将众多的unix命令集合进一个很小的可执行程序中,可以用来替换GNUfileutils,shellutils等工具集,支持uclibc库和glibc库,官方网站为进行下载。
下载完毕,解压后会发现有如下一些配置选项如图:
进入第一个目录如图:
第一项是一些通用的设置第二项是链接方式,编译选项,接下来是调试选项等等。
主目录下
Archival utilities:各种压缩,截压缩工具
Coreutils:核心的命令,比如ls,cp等
Console utiities:控制台相关的命令,比如清屏指令clear等
Debian utilities:debian命令
Editors:编辑命令,一般都选用vi
Finding utilities:查找命令
Init utilities:init程序的配置选项
。。。到networking utilities:网络方面的命令,可以选择一些可以方便调试的命令,如telnetd,ping,tftp等
修改根目录下的makefile 指定交叉编译工具然后执行make编译
最后执行CONFIG_PREFIX=dir_path install 就可以将编译好的busybox安装在dir_name指定的目录下。
使用 Busybox 可以自动生成根文件系统所需的bin、sbin、usr 目录和 linuxrc 文件。3.文件系统分类,2张图互相弥补如图:
Jffs2:主要用于norflash,基于MTD驱动层,可读写,支持数据压缩的日志型文件系统Yaffs:专为nandflash设计的一种文件系统不支持数据压缩,速度更快,挂载时间更短cramfs:一种只读的压缩文件系统,基于MTD程序,速度快,效率高
ramdisk:将一部分固定大小的内存当作分区来使用
nfs:网络共享文件技术,用于开发调试阶段,挂载到嵌入式设备,可非常方便的修改根文件系统的内容。
三.根文件系统的制作
1.根文件系统的制作
a.首先进入一个你想创建根文件系统rootfs的目录创建一shell脚本文件,取名只要自己便于
识别即可这里取名为create_rootfs_bash,打开后输入以下内容
#!/bin/sh //脚本解析命令
echo "------Create rootfs directons start...--------"
mkdir rootfs //在当前目录创建rootfs目录
cd rootfs //进入rootfs目录
echo "--------Create root,dev....----------"
mkdir root dev etc boot tmp var sys proc lib mnt home usr//创建一系列必备子目录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 //创建设备节点,若失败则启动时找不到console 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---------"
b.因为这里使用动态链接库也可使用静态链接库(也可使用静态库,但静态库比较大,实际开发时往往使用动态库),这里直接拷贝友善之臂的动态库,root_qtopia下载后打开将lib 下的所有文件复制到rootfs目录下的lib目录
在这里我的为 cp /home/root_qtopia/lib* /home/filesystem/rootfs/lib
c.配置busybox,进入busybox目录修改makefile文件指定交叉编译器和平台
CROSS_COMPILE ?=arm-linux- //大约在164行
ARCH ?=arm //大约在189行
接下来执行make menuconfig开始配置若你有友善的默认配置的话可以直接参考拷贝
配置过程如下(1)Busybox Settings--->
一项项配置如下打开第一项