嵌入式文件系统的构建.docx
- 文档编号:19183932
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:21
- 大小:767.73KB
嵌入式文件系统的构建.docx
《嵌入式文件系统的构建.docx》由会员分享,可在线阅读,更多相关《嵌入式文件系统的构建.docx(21页珍藏版)》请在冰豆网上搜索。
嵌入式文件系统的构建
Parttwo.嵌入式文件系统的构建
嵌入式文件系统简介:
Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem),为各类文件系统提供一个统一的操作界面和应用编程接口。
Linux文件系统结构如下:
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。
之后可以自动或手动挂载其他的文件系统。
因此,一个系统中可以同时存在不同的文件系统。
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。
在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:
jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。
Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。
Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。
简要介绍一下实验中涉及到的文件系统类型:
1.Jffs2(基于ROM的文件系统)
JFFS文件系统最早是由瑞典AxisCommunications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。
JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。
Jffs2:
日志闪存文件系统版本2(JournallingFlashFileSystemv2)主要用于NOR型闪存,基于MTD驱动层,特点是:
可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。
缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。
Jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致Jffs为维护日志节点所占用的内存空间迅速增大,另外,Jffsx文件系统在挂载时需要扫描整个FLASH的内容,以找出所有的日志节点,建立文件结构,对于大容量的NAND闪存会耗费大量时间。
2.Ramdisk(基于RAM的文件系统)
Ramdisk是将一部分固定大小的内存当作分区来使用。
它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。
将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
3.网络文件系统NFS(NetworkFileSystem)
NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。
在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
以上讨论的都是基于存储设备的文件系统(memory-basedfilesystem),它们都可用作Linux的根文件系统
一.文件系统的制作
(1)、Busybox介绍
Busybox是DebianGNU/Linux著名的BrucePerens首先开发,主要使用在Debian的安装程序中。
Busybox编译成一个叫做busybox独立执行程序,并且可以根据配置,执行ashshell的功能,以及几十个小应用程序。
这其中包括一个迷你的vi编辑器,系统不可或缺的/sbin/init程序,以及其他诸如sed,ifconfig,halt,reboot,mkdir,mount,ln,ls,echo,cat等等,所有这些都是一个正常的系统必不可少的,通过修改修改BusyBox默认的编译配置(makemenuconfig)以移除不想使用的命令的支持。
busybox具有全部这些功能,大小也不过100K左右。
而且用户还可以根据自己的需要对busybox的应用程序功能进行配置选择。
这样可以使busybox的大小进一步缩小。
BusyBox支持多种体系结构,它可以静态或动态链接glic或者uclibc库,以满足不同的需要。
(2)、制作过程
1.实验室中busybox-1.00-pre5.tar.gz存放在/exp目录下,将该压缩文件复制到自己的文件夹/home/st/MF,在该目录下解压缩tarzxvfbusybox-1.00-pre5.tar.gz(tar指令的使用详见附录一)
2.用cd/home/st/MF/busybox-1.00-pre5进入解压后的目录,执行makemenuconfig,进行文件系统的配置。
文件系统如果配置不好会在启动时产生多种问题导致不能启动,下面详细的说明一下,必需的配置选项,并附带说明一些常见的问题FAQ。
3.makemenuconfig
图1.1是Busybox配置界面
(1)在BuildOption菜单下,可以选择静态库编译方式,设置如
[*]BuildBusyBoxasastaticbinary(nosharedlibs)
将交叉编译器设置为PC机上的路径(ARM交叉编译工具所在的目录为/usr/local/arm-linux/bin),设置时需要在crosscompilerprefix中输入/usr/local/arm-linux/bin/arm-linux-
(2)在InstallationOption菜单下,自定义安装目录,建议使用默认目录./_install(方便起见),Don’tuse/usr不选。
(3)在ArchivalUtilities(档案程序)菜单下配置常用的归档工具(gzip等)。
在此菜单下可以配置常用的压缩工具(归档),例如gzip、tar等,在相应的压缩命令前打*即意味着新配置成的文件系统中可以使用相应的压缩命令(建议选一些常用的也可不选,我只选了一些我认识的)。
图1.4
(4)在coreutils菜单下,配额制常用的对文件操作的指令。
在相应的指令前打*,意味着在所制作的文件系统中可以使用。
例如,[*]cp可以在制作的文件系统中使用cp来拷贝文件。
(建议全选)
(5)在ConsoleUtilities(控制台程序)菜单中,配置一些对终端的操作,例如清屏,reset等。
(建议全选)。
(6)在DebianUtilities(Debian,linux版本的一种,在最适合linux爱好者的系统之一),配置一些Debian中有的一些命令,例如管道命令。
建议选[*]pipe_progress和[*]start-stop-daemon,其他可选,影响不大。
(7)在Editors菜单下,配置你所构造文件系统可以使用的编辑器,这里我们当然选vi了,建议将vi下所有的功能都打*这样就可以在自己够的文件系统里使用vi来编辑文件了。
(8)在FindingUtilities(搜索)菜单下,配置搜索指令,相应的项目打*,即意味着在文件系统中可以使用这些搜索命令,例如,grep,find。
(建议全选)
(9)在InitUtilities中配置初始化指令。
其中[*]init选项必选,否则无法正常进入命令行界面的系统,若不选会出现FAQ(frequentquestion)中的问题(3),其他选项建议都选上,如下图。
(10)在Login/PasswordMangementUtilities菜单下配置对用户登录/密码管理的配置。
其中[*]getty必选,因为在inittab文件中要用到该指令,若不选会出现FAQ(frequentquestion)中的问题
(2)。
其他选项可选,参见下图。
(11)在Miscellaneous(各种的,多方面的)Utilities配置各种指令,由于很多指令没怎么用过,所以没选。
(12)在LinuxModuleUtilities中配置和加载/卸载Linux模块相关的指令,例如insmod、lsmod、rmmod等是比较常用的命令,建议都选,其他命令根据个人喜好。
(13)在NetworkingUtilities菜单下配置和网络有关的命令,为了使用网络连接,其中ping和ifconfig必选。
其他的诸如telenet,ftpget之类可根据自己对这些命令的了解选。
(14)在ProcessUtilities菜单下配置对系统进程管理的指令,如kill、ps,建议按如下图所示选,可选top(由于之前不知道top的功能所以没选,top的功能见附录二)。
(15)在AnotherBournelikeshell菜单下指定shell(必须因为在启动时rc中的/bin/sh中会使用指定的shell),否则出现FAQ中的问题(4)。
指定方法如下,选择chooseyourdefaultshell,用空格键选取一种shell,常见的可以选ash,和msh,经过实验发现msh似乎更好用,建议选msh。
指定shell种类之后,下面有不同shell的功能项的选取,如果指定的shell类型为msh,建议把msh下面的mshshelloptions功能的内容全选。
(下图是由于截图时使用的仍是ash,未改作msh,强烈建议使用msh)。
(16)在SystemloggingUtilities菜单下,配置系统登录命令,暂时不会用这些指令,所以未选(不影响功能)。
(17)在LinuxSystemUtilities中配置系统指令,例如mountunmount(挂载文件系统)。
为了使用NFS文件系统,选定[*]mount要选[*]SupportmountingNFSfilesystems。
建议选[*]more,[*]mount,[*]umount,等一些学过的指令。
(18)最后一项debug信息可选也可不选。
保存退出。
4.制作文件系统
(1)保存好menuconfig的配置后,对BusyBox进行编译make和安装makeinstall,安装完毕后,cd/home/st/MF/busybox-1.00-pre5/_install到安装的目录下,可以找的bin、sbin、usr目录和Linuxrc等一系列文件。
在_install目录下,用mkdiretcdevproclibmnt创建etc、dev、proc、lib、mnt五个文件夹,cdetc创建inittab、rc、motd三个文件,其中rc用chmod+xrc增加可执行属性。
注意:
脚本文件rc的开头部分
不是注释,而是脚本文件开头的固定格式,如果缺省,会出现FAQ中的问题(5)。
(2)在etc下建立init.d目录,而后在init.d目录下建立rc文件的符号连接文件rcS。
指令如下:
$:
mkdirinit.d
$:
cdinit.d
$:
ln–s../rcrcS
(3)cd~/MF/busybox-1.00-pre5/_install/dev转移到dev目录下。
小技巧:
在dev目录下用gedit(vim也可以)建立一个文件g,将电子版指导书(实验室可用,在方圆老师的网站
$:
chmod+xg
将g变为可执行文件。
$:
./g执行.
$:
rmg
以上操作均在dev目录下进行。
(4)在/usr/local/arm-linux/arm-linux/lib中寻找ld-2.3.2.so、libc-2.3.2.so、libm-2.3.2.so库文件,并将这三个文件复制到/home/st/MF/busybox-1.00-pre5/_install/lib中,并在该目录下执行如下操作:
$:
ln–sld-2.3.2.sold-linux.so.2
$:
ln–slibc-2.3.2.solibc.so.6
$:
ln–slibm-2.3.2.solibm.so.6(注意指导书上此命令是错的下同)
$:
ln–slibm-2.3.2.solibm.so
(5)回到Busybox的目录下,用mkfs.jffs2制作Jffs2文件系统。
$:
mkfs.jffs2–orootfs270.img–e0x40000–r_install–p-l
_install是Busybox安装目录。
将生成的映像文件rootfs270.img拷贝到/tftpboot中,通过bootloader下载并烧写到Flash中,启动运行。
注意:
新制作的文件系统必须烧写到Flash中才可以使用,这一点和内核不同,内核下载到内存中即可使用,建议bootloader启动顺序为[5]下载文件系统,[6]烧写文件系统,[3]下载内核,(可以[4]烧写内核,但时间较长)[7]启动。
看到#号提示符即意味这已经以超级用户的权限进入了开发板的shell(类似与dos)。
五.常见问题FAQ:
(1)Q:
makemenuconfig时提示没有.config文件?
A:
此时需要自己建一个.config文件(touch.config)。
之后,makemenuconfig会提示[mconf.c:
104staticdeclarationof“current_menu”followsnon-staticdeclaration]只需将mconf.c第104行静态变量声明static去掉即可。
(2)Q:
执行boot[7]开发板命令,启动过程中,卡在[could’tfind“sbin/getty”]处。
A:
在makemenuconfig时,Login/PasswordMangementUtilities菜单getty未选,需选上。
(3)Q:
执行boot[7]开发板命令,启动过程中,卡在[kernelpanic:
noinit]处。
A:
在makemenuconfig时,在InitUtilities菜单下,其中init选项未选,需选上。
(4)Q:
执行boot[7]开发板命令,启动过程中,卡在[Bummer,couldnotrun‘etc/init.d/rcS’nosuchfileordirectory]并提示“/bin/sh”不存在处。
A:
未在AnotherBournelikeshell菜单下指定shell(必须因为在启动时rc中的/bin/sh中会使用指定的shell)。
指定方法如下,选择chooseyourdefaultshell,用空格键选取一种shell,常见的可以选ash,和msh,经过实验发现msh似乎更好用,建议选msh。
指定shell种类之后,下面有不同shell的功能项的选取,如果指定的shell类型为msh,建议把msh下面的mshshelloptions功能的内容全选。
(5)Q:
执行boot[7]开发板命令,启动过程中,卡住,并提示[Bummer,couldnotrun‘/etc/init.d/rcS’:
formaterror]。
A:
脚本文件rc因缺少#!
/bin/sh产生的格式错误。
#!
/bin/sh是脚本文件开头必须的格式,在这里#并非是注释标志。
Partthree.嵌入式系统启动过程:
Bootloader:
1.硬件设备初始化;
2.拷贝Bootloader的程序到RAM的空间;
3.设置好堆栈;
4.跳到c入口
5.初始化本阶段要使用到的硬件设备;
6.系统内存映射;
7.将kernerl映像和根文件系统映像从Flash中读到RAM空间;
8.为内核设置启动参数;
9.调用内核;
内核:
1.内核执行init程序
2.系统启动程序读取/etc/inittab文件并解释执行;
#sysinit:
系统启动时准备运行的命令:
通过/etc/init.d/rcS符号链接找到脚本rc并执行
:
:
sysinit:
/etc/init.d/rcS
#在控制台上启动一个名为“askfirst”的shell
:
:
askfirst:
/bin/sh
#getty命令设置和管理终端线路和端口并由init命令来运行
#下面的命令初始化端口/dev/tty5并设置端口特征以能够登录tty5。
tty5:
:
respawn:
/sbin/getty38400tty5
#重启init时需要做的工作
:
:
restart:
/sbin/init
#重新启动前要做的工作
#ctrlaltdel:
允许init在用户于控制台键盘上按下Ctrl+Alt+Del组合键时,#重新启动系统。
:
:
ctrlaltdel:
/sbin/reboot
:
:
shutdown:
/bin/umount-a-r
:
:
shutdown:
/sbin/swapoff-a
脚本rc的执行过程:
#!
/bin/sh
hostnameXScale270注释:
用户名XScale270
mount-tprocproc/proc注释:
挂载/proc文件系统。
/bin/cat/etc/motd注释:
显示motd中的内容
附录一
tar-c|x|u|r|t[z|j][v]-f<归档文件>[未打包文件]
:
将多个文件打包为一个归档文件,可以在打包的同时进行压缩。
支持的格式为tar(归档)、gz(压缩)、bz2(压缩率更高,比较耗时)
-c :
创建
-x :
解包
-u :
更新
-r :
添加
-t :
查看
-d :
比较压缩包内文件和文件
-A :
将tar文件添加到归档文件中
-z :
使用gz压缩格式
-j :
使用bz2压缩格式
-v :
显示过程
-f :
<文件名> 归档文件的文件名
-C :
<解压路径> 将压缩包中的文件解压到指定目录[未打包文件] 创建、更新时必须填写
示例:
tar-zcvfxxx.tar.gzxxx/ xxx1xxx2xxx3 :
多个待打包文件以空格分隔
tar-zcvfxxx.tar.gz/home/user/xxx/ :
使用绝对路径打包,解包也使用绝对路径
tar-zxvfxxx.tar.gz :
按相对路径解包到当前目录下,或按绝对路径解包。
附录二
使用top命令监视系统性能
Linux包括可监视Linux系统性能的实用程序。
在Linux中想要监视的特征类型包括CPU的使用,内存的使用(RAM和交换空间)和系统上的总负载。
监视Linux上这些信息的通用工具是top命令。
要在终端窗口中启动top实用程序,可输入top。
top命令确定在计算机上使用的CPU的最大进程,
并按照降序显示它们,每5秒刷新一次列表。
为top添加-s选项将显示每个进程的累积CPU使用时间,并且还显示已退出的所有子进程。
如果想改变内存的更新频率,可以添加-dsecs选项,其中secs由更新之间的秒数代替,默认情况下,进程按照CPU的使用排序,可以同过PID(按N键)、年龄(按A键)、驻留内存的使用(按M键)、或时间(按T键)对进程进行多种排序。
按P键返回CPU的使用。
要终止某个进程,输入K并输入要结束进程的PID(在左列列出)。
注意只停止确定不需要或不想要的进程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 文件系统 构建