cramfs根文件系统的移植成功(fs2410下亲测)
依据Unix的习惯,通常会将linux系统中任何对象(包括设备)都视为文件。而根文系统是所有文件和设备节点的起始点,它是决定系统能否正常启动的关键所在。本文将详细介绍利用Busybox工具集制作一种简单的根文件系统即Cramfs根文件系统的方法。
本文引用地址:https://www.eepw.com.cn/article/201611/316934.htm2开发平台简介
开发系统采用主机+目标板的开发模式,目标板和主机通过串行线和Ethernet网线实现通信。主机采用的是:pc机+VMware6.0虚拟机下的Red Hat 9目标板:深圳优龙公司开发的FS2410实验开发板:其主要参数:CPU:三星S3C2410,主频203MHz;内存:64M字节;NOR Flash:2M字节(SST39VF1601);NAND Flash:64M字节(K9F1208);嵌入式linux版本:linux2.4.18
根文件系统生成后用Boot Loader烧入开发板的NAND Flash的2号分区运行(其地址为:offset 0x200000 , size 0x1e00000)。
3根文件系统的基本结构
嵌入式linux根文件系统的系统的顶层目录各有其特殊的用法和目的。一般来说嵌入式linux系统的根文件系统应该包含以下内容:
(1)能够保证嵌入式linux系统中的大多数应用程序能够正常运行的最小化目录包括/bin/dev/etc/lib/proc/sbin/usr/tmp/var。如果用户需要为多用户提供可扩展环境还需建立以下目录:/home/mnt/opt/root。
(2)根文件系统所需的基本链接库:Glibc以及uClibc。
(3)基本的系统配置文件:rcS,inittab,fstab,linuxrc等脚本文件
(4)基本的设备文件:/dev/tty0/dev/ttyS0/dev/console
(5)基本的应用程序:如cd ,ls ,mv,cp等。
4使用Busybox制作Cramfs根文件系统
4.1Cramfs简介
Cramfs(Compressed Rom File System)是Linux Torvalds在Transmeta任职时,所参与开发的只具有最基本特性的文件系统。它是针对Linux内核2.4之后的版本所设计的一种新型只读文件系统,采用了zlib压缩,压缩比一般可以达到1:2,但仍可以作到高效的随机读取,Linux系统中,通常把不需要经常修改的目录压缩存放,并在系统引导的时候再将压缩文件解开。因为Cramfs不会影响系统的读取文件的速度,而且是一个高度压缩的文件系统。因此非常广泛应用于嵌入式系统中。
在嵌入式的环境之下,内存和外存资源都需要节约使用。如果使用RAMDISK方式来使用文件系统,那么在系统运行之后,首先要把Flash上的映像文件解压缩到内存中,构造起RAMDISK环境,才可以开始运行程序。但是它也有很致命的弱点。在正常情况下,同样的代码不仅在Flash中占据了空间(以压缩后的形式存在),而且还在内存中占用了更大的空间(以解压缩之后的形式存在),这违背了嵌入式环境下尽量节省资源的要求。
而使用Cramfs文件系统可以很好的解决这个问题。Cramfs是一个压缩格式的文件系统,它并不需要一次性地将文件系统中的所有内容都解压缩到内存之中,而只是在系统需要访问某个位置的数据的时候,马上计算出该数据在Cramfs中的位置,将它实时地解压缩到内存之中,然后通过对内存的访问来获取文件系统中需要读取的数据。Cramfs中的解压缩以及解压缩之后的内存中数据存放位置都是由Cramfs文件系统本身进行维护的,用户并不需要了解具体的实现过程,因此这种方式增强了透明度,对开发人员来说,既方便,又节省了存储空间。因此我们在开发时选择使用这种简单的Cramfs文件系统进行根文件系统的移植。
4.2Busybox简介
Busybox是标准Linux工具的一个单个可执行实现。Busybox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如grep、find、mount以及telnet。有些人将Busybox称为Linux工具里的瑞士军刀.简单的说Busybox就好像是个大工具箱,它集成压缩了Linux的许多工具和命令。虽然Busybox中的这些工具相对于GNU工具有所简化,但却很实用。Busybox在设计上就充分考虑了硬件资源受限的特殊工作环境。它采用模块化设计,它采用了与linux内核配置菜单类似的配置菜单,使得配置和裁剪变得相当简单。Busybox这种特性使得其非常适合于嵌入式系统的应用。几乎所有的嵌入式Linux都使用Busybox作为工具。同时,Busybox的安装脚本使得它很容易建立基于Busybox的Linux根文件系统。本文就是通过使用Busybox这个强大的工具集来制作Cramfs根文件系统的。
4.3配置Busybox
Busybox的源代码可以到官方网站http :/ / www.busybox. net/下载,我们使用的是深圳优龙公司提供的源码包busybox - 1. 00 - pre10. tar . bz2。注意使用版本不一定是越新越好,如果新的版本编译后在目标板中无法正常启动,可以试着回到较老的版本。我们在开发过程中最开始使用的是busybox-1.1.3,结果生成的根文件系统无法再fs2410上正常启动,换回busybox - 1. 00 - pre10则可以轻松解决这个问题。
首先将busybox-1.00-pre10.tar.bz2拷贝到用户家目录:home/jixiang (busybox拷贝到什么目录可以自行设定)。
[root@mynet jixiang]# cd /home/jixiang
[root@mynet jixiang]# tar vxjf busybox-1.00-pre10.tar.bz2
[root@mynet jixiang]# cd busybox-1.00-pre10
[root@mynet busybox-1.00-pre10]# make menuconfig
进入配置菜单界面,我们做如下配置:
(1)在General Configuration中,一定要选择“Support for devfs”选项,现在的Busybox新版本去掉了这个选项,不过应该可以通过修改配置文件加入。
图1配置支持设备文件系统界面
(2)在Build Options选项中,选择使用“静态库”以及设置交叉编译工具的PREFIX。我使用的交叉编译工具的路径是:/usr/local/arm/3.3.2/bin。(具体情况因宿主机交叉编译环境路径不同做相应修改。
图2配置静态库界面
(3)在Init Utilities选项中,“Support reading an inittab file”应该选中,这样可以根据自己编写的inittab文件初始化;“Support running init from within an initrd ”应该选中,否则会提示非常困扰的“/bin/sh: cant access tty; job control turned off”的提示,尽管可以进入控制台命令行。
图3脚本文件配置界面
(4)Another Bourne - like Shell→Choose your default shell (ash)→,这里应该选中默认shell :ash ,否则不会生成sh导致不能解释脚本文件。
图4 shell配置
(5)其他的配置可以根据自己开发需要自行配置。
4.3编译并安装Busybox
配置完成后,退出保存(最好备份.config文件以供后用),然后开始生成,执行make TARGET_ARCH=arm;此处的TARGET_ARCH是必须的。
[root@mynet busybox-1.00-pre10]# make TARGET_ARCH=arm
[root@mynet busybox-1.00-pre10]# make install
Busybox将在默认的PREFIX目录- install下面生成bin、sbin、usr三个子目录和一个链接文件linuxrc。
4.4准备生成cramfs文件系统
(1)创建一个文件夹rootfs,把_install目录下生成的bin、sbin、usr三个目录拷贝到rootfs,并且在rootfs目录下建立其他子目录。执行命令mkdir dev etc home lib mnt procsystmp var,建立相应的文件夹,再建立etc下的init.d文件夹。
(2)准备启动文件inittab、fstab、linuxrc、rcS。其中inittab、fstab放在etc目录下面, rcS放在etc/ init.d/目录下面,linuxrc放在rootfs目录下面。
(3)简单的配置文件的编写
linuxrc文件:
#!/bin/sh
echo "mount /etc as ramfs"
/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 /
/bin/mount -t ramfs ramfs /var
/bin/mkdir -p /var/tmp
/bin/mkdir -p /var/run
/bin/mkdir -p /var/log
/bin/mkdir -p /var/lock
/bin/mkdir -p /var/emptymk
#/bin/mount -t usbdevfs none /proc/bus/usb
exec /sbin/init
rcS文件:
#!/bin/sh
/bin/mount –a
fstab文件:
none /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
tmpfs /dev/shm tmpfs defaults 0 0
注意应该使得上述文件具有执行权限,可以使用chmod755来修改其权限。
4.5生成Cramfs根文件系统映像
我们使用的是优龙提供的cramfs-1.1.tar.gz源码包,用该工具生成根文件系统映像,
解压后将mkcramfs放到宿主机Red Hat9的/bin目录下。
转到rootfs目录的上级目录执行:mkcramfsrootfstest.cramfs
5下载运行test.cramfs
将test.cramfs通过dnw下载到优龙FS2410开发板的nandflash中的文件分区(其地址为:offset 0x200000 , size 0x1e00000),文件系统正常启动。启动界面如图:
NET: Registered protocol family 1
NET: Registered protocol family 17
VFS: Mounted root (cramfs filesystem) readonly.
Mounted devfs on /dev
Freeing init memory: 124K
mount /etc as ramfs
mount: /etc/mtab: No such file or directory
mount: /etc/mtab: Read-on
mount: /etc/mtab: No such file or directory
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
mount: /etc/mtab: Read-on
Please press Enter to activate this console.
BusyBox v1.00-pre10 (2009.09.01-12:23+0000) Built-in shell (ash)
Enter help for a list of built-in commands.
/ # ls
binetclibmntsbintmpvar
devhomelinuxrcprocsysusr
/ #
评论