嵌入式Linux中CramFS根文件系统的移植实现

2016-05-14 03:04刘俊霞盛文婷
数字技术与应用 2016年5期

刘俊霞 盛文婷

摘要:首先研究了嵌入式Linux系统以及CramFS文件系统的移植,然后分析了嵌入式Linux系统及CramFS文件系统的特性,其次,详细说明了移植最小Linux系统的制作过程,最后,对制作出来的Linux系统镜像进行测试。最终的测试结果显示,系统移植成功且能够实现Linux系统的基本命令。

关键词:Linux CramFS isoLinux

中图分类号:TP316.81 文献标识码:A 文章编号:1007-9416(2016)05-0000-00

随着电子产业的不断发展, 基于 ARM技术的系统设计和开发平台越来越多地在控制类、消费类、通信类等电子产品中广泛应用。从软件角度上看, 构建基于ARM 技术的Linux 系统要涉及到引导加载程序、Linux 内核、文件系统、用户应用程序几部分的设计。由于存储空间有限, 如何有效地使用有限的存储空间是嵌入式开发者必须考虑的, 合适的文件系统格式是解决这一问题的关键所在。

1 CramFS文件系统

CramFS 是专门针对闪存设计的只读压缩的文件系统,其容量上限为256M,采用zlib压缩。它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中, 而只是在系统需要访问某个位置的数据的时候, 马上计算出该数据在 CramFS 中的位置, 将它实时地解压缩到内存之中, 然后通过对内存的访问来获取文件系统中需要读取的数据。

CramFS 文件系统的基本组成: 初始化程序、Shell 程序以及其他 Linux常用工具、配置文件、链接库、图形界面程序和用户应用程序,文件系统是紧跟 Linux 内核放置,由内核加载,主要存放用户应用程序和配置信息。在嵌入式的环境之下,内存和外存资源都需要节约使用。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在外存中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。

2 CramFS文件系统的特性

CramFS采用实时解压缩方式,但解压缩的时侯有延迟。CramFS的数据都是经过处理、打包的,对其进行写操作有一定困难。所以CramFS不支持写操作,这个特性刚好适合嵌入式应用中使用Flash存储文件系统的场合。在CramFS中,文件最大不能超过16MB。支持组标识(gid),但是mkcramfs只将gid的低8位保存下来,因此只有这8位是有效的。

在支持硬链接方面CramFS并没有完全处理好,硬链接的文件属性中,链接数仍然为1。CramFS的目录中,没有“.”和“..”这两项。因此,CramFS中的目录的链接数通常也仅有一个。CramFS中不会保存文件的时间戳(timestamps)信息。当然,正在使用的文件由于inode保存在内存中,因此其时间可以暂时地变更为最新时间,但是不会保存到CramFS文件系统中去。

CramFS与InitramFS相比较,InitramFS具有随着文件系统中数据的增减自动增减容量、不需要额外的文件系统驱动的优点,而CramFS只读的特点有利于保护文件系统免受破坏,提高了系统的可靠性。它们都是只读文件系统,而RomFS文件系统可以构造出一个更小的内核,大约4000字节,并且很节省内存。但是RomFS需要同时支持虚拟盘(RAMDISK)临时文件和数据文件的存储。

3 CramFS 文件系统目录

一个完整的 CramFS 文件系统通常包含如下目录:

Linuxrc、bin、sbin、etc、lib、dev、usr、mnt。

Linuxrc 启动脚本文件,由 Boot Loader 核心命令行确定 init=/Linuxrc, 加载/etc 目录为 ramfs, (CramFS 为只读文件系统), 拷贝/mnt/etc 到/etc, 配置文件目录重新加载根文件系统和/etc 文件系统,执行 init 进程。

bin 引导启动所需的命令或用户可能用的命令。

sbin 系统管理员服务程序, 其中最重要的是供内核初始化之后执行的/sbin/init 进程, 系统启动时由init 解释并行/etc/inittab, inittab 将指导 int 去调用一个系统初始化程序/etc/init.d/rcS。

etc 特定机器的配置文件以及用户数据存放目录, 其中的所有内容是在内核运行后, 由 Linuxrc 从/mnt/etc 拷贝得到的。

lib 文件系统上的程序所需的动态库。

dev 驱动程序存放目录, 可以在这里存放自己编写的驱动程序。

usr 用于存放用户程序和配置文件的目录, 可以根据需要进行设置。目录下的/usr/etc/rc.local 执行本地所需要的初始化, 如安装核心模块, 进行网络, 运行应用程序, 启动图形界面等。

4 移植最小Linux系统

4.1系统环境搭建

操作系统: 物理机 windows 7

虚拟机软件: VMware Workstation8.0

Linux版本: Ubuntu 11.10-i386-desktop

Linux内核: Linux-2.6.36(Ubuntu 11.10是Linux-3.0.16的内核)

Busybox: Busybox-1.1.3

交叉编译工具: arm-Linux-gcc-3.4.1

CramFS: cramfs-1.1

4.2 构建嵌入式交叉编译环境

解压交叉编译工具文件夹后会生成一个文件名为3.4.1的文件夹。

然后,将解压后的名字为3.4.1的文件复制到根目录下的 usr/local/arm文件夹下。

在终端下修改/etc/bash.bashrc文件 #vim /etc/bash.bashrc

在最后加上:

export PATH=$PATH:/usr/local/arm/3.4.1/bin

export PATH

然后在终端中输入 #source /etc/bash.bashrc

4.3 系统移植步骤

(1)进行内核的编译与裁剪,然后生成bzImage 内核镜像。

(2)构建交叉编译环境。

(3)进行配置busybox,然后编译安装busybox。

(4)准备文件系统的目录框架,创建设备文件,以及准备一些配置文件和系统 启动时所需的文件。

(5)配置cramfs-1.1,编译cramfs-1.1。

(6)生成CramFS的文件系统镜像initrd.img。

(7)整合启动文件 myOS。

(8)生成光盘镜像文件 myiso.iso。

4.4 移植过程

4.4.1生成内核镜像

进入内核文件夹 #cd usr/src/linux-2.6.36 进行内核的配置与裁剪 。

# make mrproper

# make menuconfig。

在内核配置中:

[ * ]---将该功能模块编译进内核

[ ]---不将该功能模块编译进内核

M ---将该功能编译成模块的方式,可以在需要时动态插入到内核中的模块,具体参数及选项含义内核文档里有明确说明。

配置完成后,选择 Save an Alternate Configuration File,然后退出。

# make bzImage。

最终生成的内核镜像文件bzImage在/usr/src/linux-2.6.36/arch/X86/boot 内。

4.4.2 编译安装busybox

进入busybox文件夹 #cd 001/busybox-1.1.3

修改Makefile #vim Makefile ,以下两项改为:

CROSS_COMPILE = arm-Linux-

ARCH = arm ARCH

进入busybox配置界面 #make menuconfig ,busybox配置界面如图1所示。

4.4.3 构建文件系统目录

#mkdir /mnt/myOS/rootfs #cd /mnt/myOS/rootfs

#mkdir etc usr var conf lib modules scripts

将busybox生成的链接文件复制到rootfs

#cp /001/busybox-1.1.3/_install/* /mnt/myOS/rootfs

将根文件下lib库文件复制到rootfs/lib #cp -R /lib/* /mnt/myOs/rootfs/lib

4.4.4 配置CramFS

进入CramFS-1.1 #cd 001/cramfs-1.1 进行编译CramFS #make

Make之后会产生两个bin文件mkcramfs和cramfsck。

将这两个bin文件复制到/usr/bin中 #cp mkcramfs cramfsck /usr/bin。

之后在终端中就可以使用mkcramfs和cramfsck命令了。

4.4.5 制作CramFS文件系统镜像

在终端中输入:

#mkcramfs /mnt/myOS/rootfs /mnt/myOS/initrd.img

这时在 /mnt/myOS 下会产生一个initrd.img文件系统镜像文件。

4.4.6 制作iso镜像

使用mkisofs命令制作iso镜像文件。

#mkisofs -o myiso.iso -b isoLinux/isoLinux.bin -c isoLinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table mnt/myOS

这时,在根目录下就会产生一个myiso.iso系统镜像文件。

5 系统测试

首先将制作的好的myiso.iso系统镜像文件复制到物理机内,然后通过虚拟机软件进行启动。

在启动过程中首先是加载启动引导文件——isolinux.bin,然后通过启动引导文件调用启动配置文件——isolinux.cfg中的相关配置信息。

接下来是加载内核镜像,这个过程很快,内核加载完成后进行挂载文件系统(挂载文件系统如图2所示)。

6 结语

Linux 内核在系统启动期间的最后操作之一就是挂载根文件系统。根文件系统是嵌入式Linux 系统不可或缺的重要组成部分, 而Busybox是制作嵌入式Linux根文件系统的有效工具。本文首先说明了Linux-2.6.36的内核编译与裁剪、Busybox的编译与安装、使用Busybox-1.1.3和cramfs-1.1制作CramFS根文件系统的详细过程,然后使用了isolinux方式启动系统内核,挂载文件系统镜像。经过测试,内核启动成功,文件系统挂载成功,并且能够实现linux的基本命令,而未移植入动态链接的命令不能使用如du、ifconfig等。本文为移植和裁剪Linux以及想要构造更为复杂的根文件系统提供了参考,同时为嵌入式Linux中CramFS根文件系统的移植实现进行了新的尝试。

参考文献

[1] 刘锬.Linux嵌入式系统开发平台选型探讨[J].单片机与嵌入式系统应用,2004,7(8).

[2] 鲁刚,李小平.嵌入式Linux系统软件平台的建立[J].电子科技杂志,2007,8(12).

[3] 鞠剑平,冉全,黎曦.嵌入式Linux在S3C2440上的移植[J].科技资讯,2010,8.