Ramdisk制作

先简单介绍一下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内核镜像文件和文件系统映像,制作在一起
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值