在开发中,程序经常需要频繁地读写某些临时文件,遇到这种情况,RAM disk就是最好的解决办法。
简单地说,RAM disk就是将一块内存模拟成为某个磁盘驱动器,对应用程序来说,RAM disk和普通磁盘是完全一样的,也就是说,RAM disk对应用程序是“透明”的——唯一的区别在于,系统重新启动或者关机时,存储在RAM disk上的数据会丢失。
核心版本在2.4以上的Linux内置了对RAM disk的支持,下面,我们就来看看如何使用RAM disk(操作系统为RedHat Linux AS)。
在默认情况下,RedHat会创建16块RAM disk,但不是所有的RAM disk都处于激活(active)状态。下面列出了ram0-ram19一共20块RAM disk,但只有ram0-ram15是可以使用的。
[root]# ls -l /dev/ram*
lrwxrwxrwx 1 root root 4 Jun 12 00:31 /dev/ram -> ram1
brw-rw---- 1 root disk 1, 0 Jan 30 2003 /dev/ram0
brw-rw---- 1 root disk 1, 1 Jan 30 2003 /dev/ram1
brw-rw---- 1 root disk 1, 10 Jan 30 2003 /dev/ram10
brw-rw---- 1 root disk 1, 11 Jan 30 2003 /dev/ram11
brw-rw---- 1 root disk 1, 12 Jan 30 2003 /dev/ram12
brw-rw---- 1 root disk 1, 13 Jan 30 2003 /dev/ram13
brw-rw---- 1 root disk 1, 14 Jan 30 2003 /dev/ram14
brw-rw---- 1 root disk 1, 15 Jan 30 2003 /dev/ram15
brw-rw---- 1 root disk 1, 16 Jan 30 2003 /dev/ram16
brw-rw---- 1 root disk 1, 17 Jan 30 2003 /dev/ram17
brw-rw---- 1 root disk 1, 18 Jan 30 2003 /dev/ram18
brw-rw---- 1 root disk 1, 19 Jan 30 2003 /dev/ram19
brw-rw---- 1 root disk 1, 2 Jan 30 2003 /dev/ram2
brw-rw---- 1 root disk 1, 3 Jan 30 2003 /dev/ram3
brw-rw---- 1 root disk 1, 4 Jan 30 2003 /dev/ram4
brw-rw---- 1 root disk 1, 5 Jan 30 2003 /dev/ram5
brw-rw---- 1 root disk 1, 6 Jan 30 2003 /dev/ram6
brw-rw---- 1 root disk 1, 7 Jan 30 2003 /dev/ram7
brw-rw---- 1 root disk 1, 8 Jan 30 2003 /dev/ram8
brw-rw---- 1 root disk 1, 9 Jan 30 2003 /dev/ram9
lrwxrwxrwx 1 root root 4 Jun 12 00:31 /dev/ramdisk -> ram0
要查看RAM disk的大小,可以使用dmesg命令。
[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0
默认情况下,每个RAM disk的大小都是4MB。
我们可以修改启动配置文件来设置RAM disk的大小,在Redhat Linux上,修改Grub的conf文件:
/etc/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,0)
# kernel /boot/vmlinuz-version ro root=/dev/sda1
# initrd /boot/initrd-version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.9-5.ELsmp)
root (hd0,0)
kernel /boot/vmlinuz-2.6.9-5.ELsmp ro root=LABEL=/ ramdisk_size=16000
initrd /boot/initrd-2.6.9-5.ELsmp.img
保存之后重新启动,查看一下,改动已经生效:
[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 16000K size 1024 blocksize
RAMDISK: Compressed image found at block 0
普通的RAM disk并不需要保存日志,所以我们可以将其格式化为ext2格式,并指定-m 0参数,保证RAM disk上所有空间对普通用户开放(不设保留空间)。
[root]# mke2fs -m 0 /dev/ram0
mke2fs 1.32 (09-Nov-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
4000 inodes, 16000 blocks
0 blocks (0.00%) reserved for the super user
First data block=1
2 block groups
8192 blocks per group, 8192 fragments per group
2000 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 22 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
现在,RAM disk已经格式化完毕,我们只需要将其挂接起来,就可以使用了。
[root]# mkdir /mnt/rd
[root]# mount /dev/ram0 /mnt/rd
[root]# mount | grep ram0
/dev/ram0 on /mnt/rd type ext2 (rw)
[root]# df -h | grep ram0
/dev/ram0 16M 13K 16M 1% /mnt/rd
为了让普通用户可以操作RAM disk,还需要赋予相应的权限。
[root]# chown van:root /mnt/rd
[root]# chmod 0770 /mnt/rd
[root]# ls -ald /mnt/rd
drwxrwx--- 2 van root 4096 Dec 8 11:09 /mnt/rd
如果每次启动都必须使用RAM disk,可以将上面执行的几条语句写成一个.sh脚本,放入启动文件(例如,/etc/rc.local),这样,以后每次启动都可以直接使用RAM disk了。
评论