嵌入式Linux根文件系统制作.docx
《嵌入式Linux根文件系统制作.docx》由会员分享,可在线阅读,更多相关《嵌入式Linux根文件系统制作.docx(14页珍藏版)》请在冰点文库上搜索。
嵌入式Linux根文件系统制作
实训项目四-嵌入四Linux系统根文件系统制作
一.项目实施目的
Ø了解UP-CUP2440型实验平台Linux系统下根文件系统结构
Ø掌握根文件系统的搭建过程
Ø掌握busybox、mkcramfs等工具的使用方法
二.项目主要任务
Ø使用busybox生成文件系统中的命令部分,使用mkcramfs工具制作CRAMFS格式的根文件系统。
Ø分析根文件系统etc目录下重要配置文件的格式及语法,熟悉根文件系统的启动过程
三.基本概念
1.文件系统基本概念
Linux的一个最重要特点就是它支持许多不同的文件系统。
这使Linux非常灵活,能够与许多其他的操作系统共存。
Linux支持的常见的文件系统有:
JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、MSDOS、UMSDOS、VFAT、NTFS、HPFS、NFS、SMB、SysV、PROC等。
随着时间的推移,Linux支持的文件系统数还会增加。
Linux是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。
该树形层次结构把文件系统表示成一个整个的独立实体。
无论什么类型的文件系统,都被装配到某个目录上,由被装配的文件系统的文件覆盖该目录原有的内容。
该个目录被称为装配目录或装配点。
在文件系统卸载时,装配目录中原有的文件才会显露出来。
在Linux文件系统中,文件用i节点来表示、目录只是包含有一组目录条目列表的简单文件,而设备可以通过特殊文件上的I/O请求被访问。
2.常见的嵌入式文件系统
嵌入式Linux系统一般没有大容量的磁盘,多使用flash存储器,所以多采用基于Flash(NOR和NAND)的文件系统或者RAM内存的文件系统。
(1)Flash根据结构不同分为NORFlash和NANDFlash。
基于flash的文件系统主要有:
Øjffs2:
RedHat基于jffs开发的文件系统。
特点:
可读写、支持数据压缩、支持哈希表的日志型文件系统,提供了崩溃/掉电安全保护,提供“写平衡”支持等。
缺点:
不适合在体积和容量比较大的NANDFlash中使用,当文件系统已满或者快满时,因为垃圾收集的关系使它的运行速度大大放慢。
Øyaffs:
专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。
特点:
1.减少了一些jffs2的功能,但是速度更快,占用内存更少,能够实现错误检测和坏块处理,能够提高文件系统的加载速度。
采用多策略混合的垃圾回收算法。
2.跨平台文件系统,除了Linux还支持WinCE、pSOS、ThreadX。
3.自带NAND芯片驱动,并为嵌入式系统提供直接访问文件系统的API,用户可不使用Linux中的MTD与VFS,直接对文件系统操作。
也可与MTD驱动程序配合使用。
ØCramfs:
Linux开发的只读的压缩文件系统,基于MTD驱动程序。
特点:
速度快,效率高,保护文件系统免受破坏,提高了可靠性。
缺点:
内容无法扩充。
ØRomfs:
简单的、紧凑的、只读的文件系统,不支持动态擦写保存,安顺序存放数据。
ucLinux通常采用本文件系统。
(2)基于RAM的文件系统
ØRamdisk:
将一部分固定大小的内存当作分区来使用。
它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。
将一些经常被访问而又不会更改的文件通过Ramdisk放在内存中,可以明显的提高系统的性能。
在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。
Øramfs/tmpfs:
Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。
(实际上VFS本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。
);
Rmfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度;amfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:
不能格式化,文件系统大小可随所含文件内容大小变化;mpfs的一个缺点是当系统重新引导时会丢失所有数据。
Ø网络文件系统NFS(NetworkFileSystem)
NFS:
是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。
在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。
3.嵌入式根文件系统
根文件系统也是一种文件系统,简单来说,根文件系统就是一种目录结构,根文件系统与普通文件系统的区别在于根文件系统主要包括Linux操作系统启动所必须的目录和关键性的文件,例如Linux启动时都需要有init目录下的相关文件,在Linux挂载分区时Linux一定会找/etc/fstab这个挂载文件等,根文件系统中还包括了许多的应用程序,比如bin目录下的可执行文件,任何包括操作系统启动所必须的文件的文件系统都可以做根文件系统。
Linux启动所必须的文件系统目录结构如下:
对于用途单一的嵌入式系统,上边的一些用于多用户的目录可以省略,例如/home、/opt、/root目录等。
而/bin、/dev、/etc、/lib、/proc、/sbin和/usr目录,是几乎每个系统必备的目录,也是不可或缺的目录。
生成这些目录和相关文件的方法主要有两种,可以通过手动建立相关目录和文件,也可以通过busybox工具来生成相关目录和文件。
Busybox是小型的嵌入式Linux系统制作root根文件系统时有一个常用的利器:
BusyBox。
Busybox是DebianGNU/Linux的大名鼎鼎的BrucePerens首先开发,使用在Debian的安装程序中。
后来又有许多Debiandevelopers贡献力量,这其中尤推busybox目前的维护者ErikAndersen,他患有癌症,可是却是一名优秀的自由软件开发者。
Busybox编译出一个单个的独立执行程序,就叫做busybox。
但是它可以方便的进行配置,执行ashshell的功能,以及几十个各种小应用程序的功能。
这其中包括有一个迷你的vi编辑器,以及其他诸如sed,ifconfig,mkdir,mount,ln,ls,echo,cat...等等这些都是一个正常的系统上必不可少的工具,但是如果我们把这些程
序的原件拿过来的话,它们的体积加在一起,让人吃不消。
可是busybox有全部的这么多功能,大小也不过100K左右。
而且,用户还可以根据自己的需要,决定到底要在busybox中编译进哪几个应用程序的功能。
本系统就是采用busybox来制作根文件系同的。
四.根文件系统制作步骤
1.重新编译配置内核,确保内核支持所选的根文件系统。
[root@localhost~]#cd/UP-CUP2440/SRC/kernel/linux-2.6.24.4/
2、运行makemenuconfig命令配置内核文件系统相关支持
添加对CRAMFS根文件以及YAFFS2文件系统系统支持
进入Filesystems--->菜单
进入Miscellaneousfilesystems--->菜单
选择<*>CompressedROMfilesystemsupport(cramfs)支持,如图:
选择<*>YAFFS2filesystemsupport支持,配置如下图
保存退出。
在前期Linux内核制作过程中,相关选项已经选择。
在实验室,不需要真的重新去编译内核,只是需要学生理解,所选的根文件系统,在前期的内核编译时一定要选中相关的配置选项。
3.查看已经制作好的文件系统(挂载up24402.iso)
[root@localhost/]#cd/UP-CUP2440/SRC/rootfs/
[root@localhostrootfs]#ls
如下图所示,光盘文件里有已经制作好的根文件系统和制作根文件系统的busybox源代码。
[root@localhostrootfs]#tar–jxvfrootfs.tar.bz2
[root@localhost/]#ls
如上图所示,绿色的文件为制作根文件系统需要的工具,rootfs为根文件系统目录结构和相关内容。
[root@localhost/]#cdrootfs_src
4.根文件系统制作方法
(1)手动制作
建立相关目录,准备相关文件和命令,相关文件可以参考redhat的内容修改制作,相关命令需要下载源码交叉编译,这个过程非常复杂,且容易出错。
常见的方式是采用busybox来制作。
(2)busybox制作根文件系统
什么是Busybox?
[root@localhost/]#makeclean
[root@localhost/]#ls
如上图,此时并没有可执行的busybox程序。
[root@localhostrootfs]#viMakefile
修改此目录的Makefile文件,更改ARCH?
和CROSS_COMPILE?
=宏定义,如下:
第164行CROSS_COMPILE?
=arm-linux-
第189行
ARCH?
=arm
退出保存
[root@localhostbusybox-1.12.2]#makemenuconfig
进入BusyboxSettings--->选项
进入BusyboxLibraryTuning--->选项
选中[*]Fancyshellprompts支持
进入MiscellaneousUtilities--->选项(返回主菜单选项)去除[]inotifyd选项。
退出保存设置编译busybox
[root@localhostbusybox-1.12.2]#make
如上图所示,交叉编译完成后,就生成了我们需要的busybox可执行程序。
这就是我们根文件系统需要的各种命令,后续通过安装命令建立命令连接。
[root@localhostbusybox-1.12.2]#makeinstall
成功后会在当前目录下生成_install目录,编译的工具也都集成在该安装目录下。
[root@localhostbusybox-1.12.2]#cd_install/
[root@localhost_install]#ls
可以看到_install目录下生成了根文件系统常用的命令及工具,接下来的工作,用户可以根据需要将_install目录下生成的命令拷贝到根文件系统相应目录下。
例如:
将从busybox生成的which命令拷贝到根文件系统目录的usr/bin目录下,这样,我们的根文件系统就支持which命令了。
实际中我们出厂所带的根文件系统已经包含大部分常用工具及命令,以上步骤在于让用户了解根文件系统的工具及命令是如何制作出来的,以及如何添加自己需要的命令或工具集到自己的根文件系统中。
4、制作根文件系统
/UP-CUP2440/SRC/rootfs/rootfs。
将实验中已经提供好的根文件系统目录rootfs下的rootfs_src目录打包制作成CRAMFS格式的根文件系统。
[root@localhostrootfs]#cdrootfs/
[root@localhostrootfs]#ls
mkcramfsmkrootfs.shrootfs_srcrootfs.cramfs
[root@localhostrootfs]#
其中rootfs_src根文件系统目录下已经建立好相关目录如etc、usr、bin、mnt等
[root@localhostrootfs]#lsrootfs_src
[root@localhostrootfs]#
当然用户也可以将从busybox工具中制作的相关命令及工具拷贝到此目录的相关目录下,再制作镜像文件。
如果是动态编译的busybox则还需要将生成的命令或工具所依赖的动态库拷贝进来。
制作CRAMFS根文件系统镜像。
实验中已经提供了mkcramfs制作工具以及mkrootfs.sh脚本文件,用户只需执行mkrootfs.sh脚本文件来使用mkcramfs制作根文件系统镜像即可。
当然也可以手动的执行命令:
[root@localhostrootfs]#./mkcramfsrootfs_srcrootf.cramfs
[root@localhostrootfs]#./mkrootfs.sh
Starttomakerootfs...
[root@localhostrootfs]#
此时在当前目录下下生成根文件系统镜像文件root.cramfs
[root@localhostrootfs]#ls
mkcramfsmkrootfs.shrootfs_srcroot.cramfs
[root@localhostrootfs]#
5.思考题
(1)什么是根文件系统,它的作用是什么?
根文件系统与普通文件系统有什么不同?
(2)如何搭建嵌入式根文件系统?
(3)什么是busybox?
如何使用busybox工具集定制文件系统工具?