Total Pageviews

Friday, 6 October 2017

RamDisk

一.  引言
随着电脑硬件的快速发展,目前人们的电脑硬件配置越来越强大,特别是内存越来越大,256M内存以上的电脑越来越普遍,甚至有些个人用户的电脑内存都已经达到2G,这样就为用内存代替硬盘提供了可能。
以前,普通电脑的内存都很小,而硬盘的容量比内存大多了,而且价格远远低于内存,于是操作系统就用硬盘上的空间来模拟内存,这就是虚拟内存;而目前的电脑,对于普通用户,如果不进行大量的平面或者三维设计,也就是说不经常使用photoshop或者3DMax这类需要大量内存的软件,512M内存就足够用了,而且大多时候有大量的内存会闲置不用,于是很多人开始用内存来模拟硬盘充分利用电脑资源,这就是内存盘Ramdisk。
用内存虚拟硬盘正好和虚拟内存相对应,就是由操作系统划出一部分内存来模拟硬盘,这样就可以把对慢速硬盘的操作转换为对高速内存的操作,既提高了系统资源的利用率,又极大提高了系统的运行效率。
由于系统内存的存取速度远快于硬件磁盘速度,所以对于有频繁磁盘存取的应用程序(例如数据库程序、磁盘文件交换程序、网站服务程序),使用Ramdisk能有效的提高其应用程序的性能。内存盘还有一个优点就是不会磨损磁头,特别适合于多线程,大吞吐量的磁盘操作。
二.  什么是RamDisk
RamDisk实际是从内存中划出一部分作为一个分区使用,换句话说,就是把内存一部分当做硬盘使用,你可以向里边存文件。它的操作就像操作硬盘一样,但是速度更快。
那么为什么要用RamDisk 呢?假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。
RamDisk的特性是数据完全存储在内存中,所以一旦关闭计算机,就会导致内存盘中的数据完全丢失,这个特性使得内存盘特别适合于存储一些临时文件,如Windows系统下IE的缓存,Windows和应用程序运行时产生的临时文件,Linux系统下面的tmp文件夹的一些东西,这些文件都适合放到内存盘上,从而减少硬盘上文件碎片的生产,并且不需要主动删除这些临时文件,一旦重新启动,这些垃圾文件就自动消失了。也正是这个特性,使得内存盘不适合存储重要的数据,文档,因为一旦死机或者重启,这些东西就再也找不回来了。
三.  Windows下一些可以实现的软件
有很多软件可以实现内存盘的功能,比较有名的有:
1. Cenatek公司的RAMDisk XP ,RamDiskNT 和 RamDisk9x/Me,功能比较齐全,既可以在Win9x 上运行,又可以在Winnt ,win2k/xp上运行,可以模拟软驱,也可以模拟硬盘,只是现在Cenatek公司已经不出售RamDiskNT 和 RamDisk9x/Me,也不提供技术支持了,可以到Cenatek公司的网站http://www.jlajoie.com/查看详细信息,比较昂贵。
2. Superspeed公司的Ramdisk系列产品,RamDisk 2003, RamDisk XP, RamDisk 2000, 以及 RamDisk NT ,Superspeed公司的产品比较适合企业用户,不太适合可能经常更换操作系统的个人用户,具体信息见:http://www.superspeed.com/ramdisk.html,昂贵。
3. 微软的Ramdisk,有很大局限,虚拟的磁盘不能超过32兆,免费,支持windows 2000,可以从下面的地址下载http://support.microsoft.com/default.aspx?scid=...NoWebContent=1
4. QSoft 的Ramdisk,有一个免费版本,和一个收费版本,是根据微软的ramdisk改写的,免费版本最大支持32兆的内存盘,收费版本没有这个限制。http://www.ramdisk.tk/
5. 网友gavotte开发的ramdisk,也是从微软的ramdisk改写的,完全免费,支持windows 2000以上的操作系统,内存盘容量没有限制,并且经朋友们长期使用,非常稳定。
四. Linux下创建和使用RamDisk
1. 创建和使用RamDisk的方法
使用RamDisk非常方便,缺省安装的RedHat6.0就支持RamDisk。你所要作的就是格式化RamDisk并把它装载到一个目录下。要想查看RamDisk的数目,用命令"ls -al /dev/ram*",它会给出所有当前情况下可用的RamDisk。这些RamDisk只有使用的时候才占用内存。
下面是使用RamDisk的几个命令: 
#创建装载点
mkdir /tmp/ramdisk0 
# 创建一个文件系统 
mke2fs /dev/ram0 
#装载ramdisk: 
mount /dev/ram0 /tmp/ramdisk0 
这三个命令将会为RamDisk创建一个目录、格式化RamDisk(创建文件系统)并把RamDisk装载到目录"/tmp/ramdisk0"中。现在,你就可以把它作为一个磁盘分区使用了。 
如果格式化RamDisk失败,可能是因为你没有把对RamDisk的支持编译进内核中去。内核中对RamDisk的配置选项是 CONFIG_BLK_DEV_RAM。 
缺省的RamDisk为4Mb=4096 blocks,使用mke2fs命令可以查知你所获RamDisk的大小
$mke2fs  /dev/ram0 
使用命令df -k /dev/ram0可以查到你实际能用的RamDisk的大小(文件系统也占用一定空间):
$df -k  /dev/ram0
2.  改变RamDisk大小的技巧? 
为使用RamDisk,你或者要将对RamDisk的支持编译到内核中去,或者把它编译为一个可装载模块,其中内核的配置选项是 CONFIG_BLK_DEV_RAM .。编译为一个可装载模块有一个好处,就是可以在装载时任意指定RamDisk的大小。 
把下面这一行加到你的/etc/lilo.conf文件中去:ramdisk_size=10000 (或对老内核写作ramdisk=10000)
这样你键入LILO命令并重新启动后,缺省的RamDisk的大小将为10M
这是一个/etc/lilo.conf文件的例子:
boot=/dev/hda 
map=/boot/map 
install=/boot/boot.b 
prompt 
timeout=50 
image=/boot/vmlinuz 
label=linux 
root=/dev/hda2 
read-only 
ramdisk_size=10000 
实际上,我只获得了9M多一点的RamDisk空间,文件系统也将占用一定空间。
当你编译为一个可装载模块后,你可以在模块装载时决定RamDisk的大小,这可以通过修改/etc/conf.modules 的选项设置来做到
options rd rd_size=10000 
或者通过作为ismod命令行参数来实现
insmod rd rd_size=10000
3. 使用模块的例子: 
1. 卸载下上一次装载的RamDisk, umount /tmp/ramdisk0
2. 卸载模块rmmod rd
3. 装载RamDisk模块并设置大小为20M,insmod rd rd_size=20000。
4. 创建文件系统,mke2fs /dev/ram0 
5. 加载ramdisk ,mount /dev/ram0 /tmp/ramdisk0
五.  Linux系统下Ramdisk文件的制作过程
(一)、在一个已建好的文件系统上进行修改
设已建立好的文件系统压缩文件为ramdisk.gz
1.解压
#cd ramdisk.gz所在目录
#gunzip ramdisk.gz
在解压后,得到文件系统镜象文件ramdisk
2.镜象文件挂载
镜象文件必须经过挂载后才能看到文件系统中的各个目录和详细内容
#mkdir /mnt/loop                            /* 新建目录, /mnt/loop 是文件系统要挂载到的目录*/
#mount –o loop ramdisk /mnt/loop     // 挂载
#cd /mnt/loop
#根据需要进行一些操作    /*根据需要增加、删减或是修改文件系统的内容
4.卸装文件系统
跳到/mnt/loop目录外,否则无法卸装,提示busy
#cd ramdisk所在目录
#umount /mnt/loop
5.压缩文件系统
#gzip –v9 ramdisk           /*生成ramdisk.gz压缩文件
(二)、自己建立根文件系统
1. 建立loop设备的临时挂载点
#mkdir /mnt/loop
2.建立一个大小为15M的临时文件
#dd if=/dev/zero of=/tmp/loop_tmp bs=1k count=15360    //注意可根据自己的需要建立大小合适的文件系统,更改count大小即可。
此处以dd命令建立一个了一个15360KB文件系统映象,存于/tmp/loop/tmp,并以.dev/zero对它进行初始化。用这种方式对文件系统进行初始化,稍后当我们使用gzip命令压缩整个映象时,将让文件系统中未使用的部分获得最大压缩比。
3.将设备文件与临时文件联系起来
#losetup /dev/loop0 /tmp/loop_tmp
把设备文件/dev/loop0与临时镜象文件/tmp/loop_tmp联系起来,/dev/loop0是个块设备,如果出现“ioctl:LOOP_SET_FD:设备或资源忙”,说明/dev/loop0设备还和一文件联系,可用losetup /dev/loop0查看地,并可用-d 删除。
用 losetup命令把块设备文件/dev/loop0与临时文件/tmp/loop_tmp联系起来了,我的理解是/tmp/loop_tmp必须是块设备文件,所以用/dev/loop0与之相关联,然后对/dev/loop0的操作和对其虚拟盘的操作,就间接作用在文件系统映象 /tmp/loop_tmp上。
4.将/dev/loop0格式化为ext2文件系统
#mke2fs –m 0 /dev/loop0
-m 0指出不必在文件系统上为“超级用户”保留任何区块。
Linux内核识别两种可以直接考贝的到ramdisk的文件系统,它们是minix和ext2,minix是linux早期版本所用的文件系统,从minix操作系统而来,ext2性能更好。
5.把虚拟盘挂在节点/mnt/loop上
#mount –t ext2 /dev/loop0 /mnt/loop
6.用cp –af命令将所需要文件拷贝到虚拟盘上
cp –help查看cp 用法。
cp –arf … -r表示拷贝目录,/bin, /dev, /etc, /lib, /proc, /sbin, /usr都是不可或缺的目录,建议保留/tmp,/var,不过可以为空。而为多用户提供可扩展环境的所有目录(例如/home、/mnt、/opt、/root)都应该省略。用cp复制文件时,建议把已建立好的文件系统中的内容全部拷贝过来,这样比较简单,不需要再去编译安装busybox等。当然自己也可以那样去做。
7.卸载文件系统,得到的/tmp/loop_tmp就是文件系统映象。
#cd /mnt/loop以外的目录 (否则会提示无法卸载,设备busy)
#umount /mnt/loop
8.压缩文件系统映象
#gzip –v9 /tmp/loop_tmp >/tftpboot/ramdisk.gz
在/tftpboot下生成了ramdisk.gz,这样一个内存文件镜象生成了。
或只是#gzip –v9 /tmp/loop_tmp,则就是在/tmp下生成loop_tmp.gz文件,一样的。
经过上面过程制作的ramdisk.gz文件,可以直接烧写到开发板或者其他的嵌入式系统上面去.

No comments:

Post a Comment