基于龙芯CPU上的RamDisk实现


注:该文档由参考网络上的文章并结合自身实际的工作经验完成。

一、什么是RamDisk
顾名思义,Ram:内存,Disk:磁盘,RamDisk就是指使用你的一部分内存空间来模拟出一个硬盘分区。在现在内存越来越便宜,对于一些我们想让其访问速度很高的情况下显的可行。RamDisk实际是从内存中划出一部分作为一个分区使用,换句话说,就是把内存一部分当做硬盘使用,你可以向里边存放文件。

二、为什么要用RamDisk呢?
假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。像WEB服务器这样的计算机,需要大量的读取和交换特定的文件,因此,在WEB服务器上建立RamDisk会大大提高网络读取速度。

三、如何创建一个RamDisk?
事实上创建一个RamDisk是一件很简单的事,由于RedHat Linux 从6.0开始就默认支持了RamDisk,所以你只需要格式化一个RamDisk,并将其mount到某一个目录上就可以了。

四、如何重新编译内核使支持Ram Disk Devices?
我们的设备内核默认并没有将RamDisk模块选中,因此针对我们自身的设备,需要进行一个内核的重新编译过程。


1.首先,我们需要在一台PC上安装好mipsel-linux-gcc 工具链如:gcc296-godson-release.tar.gz(因为本身我们使用的就是该交叉编译环境)
在Redhat/Fedora操作系统下,以root用户登录,然后将压缩包gcc296-godson-*.tar.gz解压缩到根目录:
tar xzvf gcc296-godson-*.tar.gz -C /
在开发用户的path中增加 /usr/tools/bin,就可以使用mipsel-linux-gcc编译了。

2.其次,我们需要在这台PC上也安装好Linux-2.4.18内核源代码,将所提供的文件linux-2.418-longtu.tar.gz
解压后复制到/usr/src/目录下即刻。

3.接着,就是内核的具体编译过程:
cd /usr/src/linux-2.418-longtu/
通过vi修改Makefile,确保ARCH := mips,CROSS_COMPILE=/usr/tools/bin/mipsel-linux-
将linux-2.4.18-longtu目录下的defconfig-longtu复制为同目录下.config
cp defconfig-longtu .config

4.配置内核菜单
make menuconfig
在"Block devices"里,选“RAM disk support”,并修改默认的ramdisk size(4096KB);
然后保存退出。

5.调试并运行
make dep
make
make zImage
完成后,内核在arch/mips/zboot/images/zImage.pb1500

[a].从硬盘启动使用zImage.pb1500,放在文件系统的blx目录下。
mkdir /blx
cp /home/zImage.pb1500 /blx/zvl-longtu
reboot即可从硬盘启动内核。

[b].从flash启动,使用sstflash工具,在linux下往flash中烧写内核的应用程序:
使用objcopy进行格式装换:/usr/tools/bin/mipsel-linux-objcopy zImage.pb1500 –O binary zvl-longtu.rom.
内核启动后,将二进制文件中的sstflash工具,放到/usr/bin目录下,内核应用程序zvl-longtu.rom放到/home目录下;
烧写内核到flash,运行 sstflash zvl-longtu.rom 待有OK!字样出现后烧写完成。
不要运行sstflash的擦写工具,操作失误会擦出bios代码,烧写过程会自动擦除要写入数据的sector。也不用指定烧写sector,内核程序中已经指定。

6.具体创建配置RamDisk的过程
6.1.查一下所有可用的ramdisk:
ls –al /dev/ram*
这就会列出你现在可用的ramdisk,这些ramdisk现在还不占用内存,除非你对它进行格式化。
如果你在系统中没有发现任何ram*的文件,那么,你需要自行创建该设备文件:
mknod <name_of_node> <type: c or b> <majoy> <minor>
如创建从硬盘节点可用mknod /dev/hdb b 3 64
每个设备节点的数值都是唯一的,major+minor唯一标识一个设备。这在所有的系统都是一样的.
节点数值必须要和驱动里一致:
比如,对于hda1,设备节点必须是<3, 1>,对于hdb2必须是<3,65>,对于串口ttyS0必须是<4,64>.
可以在其它Linux系统上去看:
cd /dev/
ls –l ram*
记录下各ramdisk设备文件的节点数值:对于ram0 <1,0> ram1 <1,1>……。
且最多具备15个。每个大小12M=12288K。
名字是次要的,可以随便做符号链接,关键看主、次设备编号。

6.2.创建一个RamDisk:
mke2fs /dev/ram0
执行该命令将出现以下提示
mke2fs 1.14, 9-Jan-1999 for EXT2 FS 0.5b, 95/08/09
Linux ext2 filesystem format
Filesystem label=
1024 inodes, 4096 blocks
204 blocks (4.98%) reserved for the super user
First data block=1
Block size=1024 (log=0)
Fragment size=1024 (log=0)
1 block group
8192 blocks per group, 8192 fragments per group
1024 inodes per group
如果该操作执行失败,那么有可能是因为你的内核不支持ramdisk,这时你只有重新配置、编译内核,在配置时将CONFIG_BLK_DEV_RAM设置为Enable。

6.3.将其mount上来使用:
mkdir /tmp/ramdisk0 新建一个目录
mount /dev/ram0 /tmp/ramdisk0 将其mount到刚才新建的目录上
这样,我们就可以使用这个新建的RamDisk:/tmp/ramdisk0
另外,我们可以执行df命令来查看一下该RamDisk的大小:
>df -k /dev/ram0
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/ram0 3963 13 3746 0% /tmp/ramdisk0
要注意的一点是:由于这个部分是内存,因此在系统重新启动的时候,将刷新这个区域。所以不要将任何没有拷贝的数据放在这个区域。如果你对这个目录进行了修改,并且需要保留这些修改,采取一些办法进行备份。也就是说,这个目录只能用于为了提高访问速度而暂时存储数据的地方。

7.创建大小合适的RamDisk
上面我们创建了一个RamDisk,但是无法指定大小,现在我们来学习如何创建大小合适的RamDisk。
在Redhat安装的时候,你可以选择LILO引导或Grub引导,针对不同的引导程序有不同的设置

7.1.使用LILO配置:
我们在lilo.conf文件中加入一行:
ramdisk_size=10000 (如果是老版内核,则写ramdisk=10000)
然后运行 /sbin/lilo 生成新的LILO。
这样当你重新启动计算机之后,ramdisk的默认大小将会是10M。

7.2.使用Grub配置:
RedHat的AS系列配置文件在/etc/grub.conf
Ubuntu系列配置文件在/boot/grub/menu.1st
修改启动项里面内核参数 Kernel 最后加上ramdisk_size=***

7.3.使用/etc/conf.modules配置:
如果你的内核是以模块的形式编译ramdisk的话,那么就可以在加载的时候决定ramdisk的大小。也就是可以通过修改/etc/conf.modules 的选项设置来做到,加入:
options rd rd_size=10000
当然也可以在命令行中指定参数给ismod来实现:
insmod rd rd_size=10000
当使用以上两种方法创建了合适大小的ramdisk时,我们还需要执行以下命令来使用它:
mke2fs /dev/ram0
mkdir /tmp/ramdisk0
mount /dev/ram0 /tmp/ramdisk0
而当不使用时,应执行:
umount /tmp/ramdisk0
若是使用insmod来加载模块的,应该再执行:
rmmod rd

7.4.使用RamDisk的一个实例
下面,我们通过一个使用Ramdisk做WEB服务器的实例来说明其应用。
[a].首先将CRM移到另外一个地方
mv /var/www/longxin /var/www/longxin_real
mkdir /var/www/longxin
mv /var/lib/mysql/c3crm /var/lib/mysql/c3crm_real
mkdir /var/lib/mysql/c3crm
[b].将以下命令加入到/etc/rc.d/init.d/httpd.init中去(Debian下/etc/init.d/apache):
mknod ram0 b 1 0
mknod ram1 b 1 1
mke2fs /dev/ram0
mke2fs /dev/ram1
mount /dev/ram0 /var/www/longxin/
mount /dev/ram1 /var/lib/mysql/c3crm/
cp –r /var/www/longxin_real/* /var/www/longxin/
cp –r /var/lib/mysql/c3crm_real/* /var/lib/mysql/c3crm/
这样就可以了,但是请记住,你更新数据时,应更新lonxin_real/c3crm_real目录,而不要更新longxin和c3crm目录,否则在系统重新启动时,所有的更新都将丢失。你最好设置一个cron进程,让其监视lonxin_real/c3crm_real是否有改变,一有改变就将其复制到ramdisk中去。

7.5.使用RamDisk做/tmp目录
我还想推荐一个更酷的方法,如果你的内存太多,那么可以将其中一部分做为/tmp目录,这样将大大提高你的系统执行速度。而且,/tmp将会在系统重新启动时被删除,这将会是一件非常惬意的事情。

7.6.编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。
此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
修改为:
01 * * * * root cp –r /var/lib/mysql/c3crm/* /var/lib/mysql/c3crm_real/
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本
大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

,

  1. No comments yet.
(will not be published)
*