在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk,分为:Ramdisk, ramfs, tmpfs.
1.Ramdisk
在编译内核时须将Device Drivers -->> Block devices -->> Ramdisk support 支持选上,它下面还有两个选项:第一个设定Ramdisk个数,默认16个;第二个是设定Ramdisk的大小,默认是4096k。
首先查看一下可用的RamDisk,使用ls /dev/ram*
然后对/dev/ram0 创建文件系统,运行mke2fs /dev/ram0
最后挂载 /dev/ram0,运行mount /dev/ram /mnt/test
2.ramfs
Ramfs顾名思义是内存文件系统,它处于虚拟文件系统(VFS)层,而不像ramdisk那样基于虚拟在内存中的其他文件系统(ex2fs)。
因而,它无需格式化,可以创建多个,只要内存足够,在创建时可以指定其最大能使用的内存大小。
在编译内核时须将File systems -->> pseudo filesystems -->> Virtual memory file system support支持选上。
# mount -t ramfs none /testRAM缺省情况下,Ramfs被限制最多可使用内存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
# mount -t ramfs none /testRAM -o maxsize=2000 (创建了一个限定最大使用内存为2M的ramdisk)
3.Tmpfs
是一个虚拟内存文件系统,它不同于传统的用块设备形式来实现的Ramdisk,也不同于针对物理内存的Ramfs。
Tmpfs可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟内存资源由物理内存(RAM)和交换分区组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。
Tmpfs向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。同Ramfs一样,其大小也不是固定的,而是随着所需要的空间而动态的增减。
在编译内核时须将File systems -->> pseudo filesystems -->> Virtual memory file system support支持选上。
# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs
同样可以在加载时指定tmpfs文件系统大小的最大限制:
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
2,讲述Linux下使用RamDisk的方法和技巧
先介绍一下什么是RamDisk。RamDisk实际是从内存中划出一部分作为一个分区使用,换句话说,就是把内存一部分当做硬盘使用,你可以向里边存文件。那么为什么要用RamDisk呢?假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。况且内存价格低廉,一台PC有128M或256M已不是什么新鲜事。划出部分内存提高整体性能不亚于更换新的CPU。何乐而不为呢?象WEB服务器这样的计算机,需要大量的读取和交换特定的文件,因此,在WEB服务器上建立RamDisk会大大提高网络读取速度。
创建和使用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为4M。使用mke2fs命令可以查知你所获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
使用命令df /dev/ram0可以查到你实际能用的RamDisk的大小(文件系统也占用一定空间):
>df -k /dev/ram0
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/ram0 3963 13 3746 0% /tmp/ramdisk0
不过要记住,RamDisk中的数据会在机器重新启动后消失,因此应把其中有用的数据及时备份到硬盘中。
- 改变RamDisk大小的技巧?
为使用RamDisk,你或者要将对RamDisk的支持编译到内核中去,或者把它编译为一个可装载模块。编译为一个可装载模块有一个好处,就是可以在装载时任意指定RamDisk的大小。
把下面这一行加到你的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中的选项设置来设定。或者通过作为ismod命令行参数来实现。
options rd rd_size=10000
insmod rd rd_size=10000
下面是使用模块的例子:
- 卸载下上一章装载的RamDisk, umount /tmp/ramdisk0.
- 卸载模块rmmod rd。
- 装载RamDisk模块并设置大小为20M,insmod rd rd_size=20000。
- 创建文件系统,mke2fs /dev/ram0。
- 装载RamDisk ,mke2fs /dev/ram0。
- 在WEB服务器上使用RamDisk的实例?
本例介绍在WEB服务器上使用3个RamDisk的方法。所用的WEB服务器是RedHat 6.0 自带的Apache。
首先,把WEB根目录中所有文件移到其它目录中,然后创建RamDisk的装载点:
mv /home/httpd/ /home/httpd_real
mkdir /home/httpd
mkdir /home/httpd/cgi-bin
mkdir /home/httpd/html
mkdir /home/httpd/icons
然后,把以下命令加到你的/etc/rc.d/init.d/httpd.init文件中去:
### 创建3个RamDisk
/sbin/mkfs -t ext2 /dev/ram0
/sbin/mkfs -t ext2 /dev/ram1
/sbin/mkfs -t ext2 /dev/ram2
### 加载RamDisk到开始创建的目录中
mount /dev/ram0 /home/httpd/cgi-bin
mount /dev/ram1 /home/httpd/icons
mount /dev/ram2 /home/httpd/html
### 拷贝真正的目录中的所用文件到RamDisk 中
tar -C /home/httpd_real -c . | tar -C /home/httpd -x
最后,重新启动WEB服务器即可生效,试一下速度是否有所改变。
后语:1. 一定要记住保存RamDisk中有用的东西,否则,重新启动后将化为乌有。你可以用cron设定一个计划,每隔10分钟扫描一下RamDisk中的文件是否发生变化,如有,拷贝到硬盘中,这会比较安全。
2.最酷的应用是如果你有1G的内存,划出256M来作为暂存区/tmp,如果很多程序用到/tmp,那么你的系统性能会大大提高,而且重新启动后垃圾消失,真是一举两得。