先简单介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,可以把RAM disk与通常的硬盘分区(如/dev/hda1)同等对待来使用。当然,Ramdisk与硬盘分区有其不同的地方,例如RAM disk不适合作为长期保存文件的介质,掉电后Ramdisk的内容会随内存内容的消失而消失。Ramdisk的其中一个优势是它的读写速度高,可以被用作需要高速读写的文件。
(1)Ramdisk建立根文件系统结构
#mkdir romfs
#cd romfs
#mkdir bin dev etc lib proc sbin tmp usr var mnt(FHS文档,上面规定了所需的目录和目名称)
#chmod 1777 tmp
#mkdir usr/bin usr/lock var/log var/rm var/temp
#chmod 1777 var/temp
首先建立以个空文件夹romfs,然后在里面建立不同的文件夹。值得注意的是chmod 这句命令,是改变tmp的读写属性,在试验展示的时候将具体看到在temp目录下用busybox制作的应用程序VI编辑器编写一段可以读写的代码。
(2)准备链接库
#cd ${OBJ_LIB}/lib
>for file in libc libcrypt libda libm libpthread libresolv libutil
>do
>cp $file-*.so /../../romfs/lib
>cp –d $file.so.[*0-9] /../../romfs/lib
>done
#cp –d ld*.so* /../../romfs/lib
好了,上面这段代码是我在网上找到的资料,最开始的时候我也是模仿这样一步一步的做,结果是成功的但是网上都没有具体分析这些代码的意思。现在我将我的理解拿来分享一下。#cd ${OBJ_LIB}/lib交叉编译环境的目录下的lib文件;>for file in libc libcrypt libda libm libpthread libresolv libutil 在这里的for循环式shell的for循环语句,整个循环语句标志词我都加粗。file是变量名,in 后面的是列表,也就是从这里面里复制一些想要的库文件到刚才建立的空文件romfs下的lib里面。当然你也可以采取直接复制的方式:cp –rfd /../../romfs/lib 这就是把整个lib都复制到romfs/lib里面了,值得注意的是cp的后面的选项一定要有-d,一保持文件的链接关系。但是这种方法不可取,在嵌入式中,存储空间资源决定了这一切。
(3)添加设备文件
当然要让你的串口和LCD工作,必须在romfs/dev中有对应的设备文件。通过下面的命令就可以为自己的设备添加设备设备文件了。#mknod –m 600 console c 5 1 和#mknod –m 600 fb c 29 0。我解释一下这些操作的具体含义, –m 600模式读写权限,console设备名,c为字符设备(在linux中分字符设备(c)、块设备(b)和网络设备(不对应于/dev下面)。
(4)busybox制作
我最开始接触这个东西的时候,被很多资料给迷惑了。标题是“busybox制作ramdisk根文件系统”,现在想想真的好误导人,害得我做这个ramdisk花费了大概两周的时间。在这结合我的理解,我就一气呵成的讲一讲什么是Busybox,为什么刚才说busybox制作ramdisk误导人,但又要在RAMDISK制作这一章节讲呢,慢慢听我道来。busybox被誉为嵌入式的“瑞士军刀”,它集成了上百种的最常用的linux命令(linux下分两种,一种是在bin目录下的一般命令,一种是在sbin目录下的系统命令)和工具软件,甚至还集成了http服务器和telnet服务器,并且还支持uClibc.glibc等库文件,但它只有几M大小。非常方便地提供功能齐全的应用程序。在这就应该明白了,busybox是做什么的了。我们上面在第一步的时候还建立了romfs/bin和romfs/sbin,到这一步提到busybox那么也就是理所当然的了。
Busybox的制作与uboot和uClinux的裁剪很类似,它也是通过make distclean、make menuconfig和make install进行安装的。
我们可以通过到官网:www.busybox.net/download下载较新版本的原代码,值得注意的是版本越新,功能越多,交叉编译器版本要求越高,出现错误的概率就越大。所以不能一味的追求新,而是一个稳定版本的busybox,不然你将会为你做出的选择付出代价。
首先,进入到busybox的文件目录下
在这里我们只需要注意三个地方的设置:第一,在General Configuration选项配置,
General configuration---à
[*]Show verbose applet usage messages
[*]Runtime SUID/SGID configuration via/etc/busybox.conf
第二,Build Options
Build Options…à
[*]Build Busybox as a static binary (no shared libs)
[*]Build with Large File Support(for accesing files>2GB)
[ *]Do you want to build Busybox with a Crosss compiler
第三,Installation Options
[*]Don’t use/usr
(./_install)BusyBox installation prefix
然后通过上面的配置,执行make-àmake install 那么你将在busybox的根文件下看到_install目录,在这里面存在三个文件bin sbin 和linuxrc文件。
然后用cp –rf busybox-x.x.x/_install/sbin ramdisk/sbin
cp –rf busybox-x.x.x/_install/bin ramdisk/bin
cp –rf busybox-x.x.x/_install/linuxrc ramdisk/
通过这一步,我们已经把在嵌入式linux里的命令和应用添加到ramdisk根文件系统中了。
(5)inttab和启动代码rc的编写
在上面的etc/建立两个文件inittab和rc文件,inittab和rc实现的什么功能,我会在后面uClinux内核启动的时候再做分析。
inittab 添加如下信息:console:linux:/bin/sh
rc 添加的代码如下:
hostname Samsung
/bin/expand /etc/ramfs.img /dev/ram1
/bin/expand /etc/ramfs2048.img /dev/ram2
mount -t proc proc /proc
mount -t ext2 /dev/ram1 /var
mount -t ext2 /dev/ram2 /ramdisk
chmod 777 /ramdisk
mkdir /var/config
mkdir /var/tmp
mkdir /var/log
mkdir /var/run
mkdir /var/lock
mkdir /var/empty
ifconfig eth0 211.83.106.157 netmask 255.255.255.0 up
cat /etc/motd
sh < /dev/ttyS0
(6)制作initrd映像文件
上面已经提到,Ramdisk需要先格式化然后才能使用。那么,如果核心希望使用ramdisk该如何做呢?于是initrd产生了,initrd全称是 initial RAM disk ,它提供一种让核心可以简单使用Ramdisk的能力,简单的说,这些能力包括:①格式化一个 Ramdisk; ②加载文件系统内容到Ramdisk; ③将Ramdisk作为根文件系统;
我们可以将initrd形像的比作Norton Ghost备份的硬盘分区,而Linux启动阶段的Ramdisk相当于一个未格式化的硬盘分区,核心可以直接将initrd的内容释放到一个未初始化的Ramdisk里,这个过程与Ghost恢复一个分区的过程十分相似。于是,相应的内容被加载到相应的Ramdisk中,同时,这个Ramdisk也被格式化成某种由initrd格式所表达的分区格式。
添加一个临时文件romfs.img,这个就是要下载到flash中的一个镜像文件,那么来看看具体的实现步骤吧。
#dd if=/dev/zero of=romfs.img bs=1k conut=4096
#losetup /dev/loop0 ./romfs.img
#mke2fs /dev/loop0
#mount –ext2 /dev/loop0 /mnt/loop_tmp
进入mnt目录下就会看到有一个lost+found目录。
把刚才建立的ramdisk内容拷贝到mnt下面来
用cp –af命令将所需要文件拷贝到虚拟盘上
cp –help查看cp 用法。cp –arf … -r表示拷贝目录
/bin, /dev, /etc, /lib, proc, /sbin, /usr都是不可或缺的目录,建议保留/tmp,/var,不过可以为空。而为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt、/root)都应该省略。
#cp –af ./ramdisk/* /mnt
#umount /mnt/loop_tmp卸载loop_tmp
最后一步就是压缩镜像文件
#gzip -9 romfs.img 生成romfs.img.gz文件这个就是我们可以下载到flash下的根文件系统了。
当然在这里介绍ramdisk的制作过程,主要理解ramdisk的功能。其实在uClinux-dist里面就已经有这个ramdisk,你只需要通过命令的方式就可以了,也就是实际的用户不用去自己去做这么复杂的功能了,这些步骤主要在Verdor下面的makefile里面就做了这些工作了。在下一节中,我将作更详细的阐述,它们是如何把linux内核镜像文件和文件系统映像,制作在一起