ramdisk是从内存中划出一部分作为一个分区使用,这个分区跟正常的磁盘分区一样,但其读写速度会远高于磁盘,不过存储在其中的数据会在系统断电或者关机后丢失。利用ramdisk的高速和易失特性,可以用ramdisk分区将加密文件解密,或者应用于Web服务器,或者挂载Loopback文件系统。 Windows下ramdisk的软件多达十几种,特点和性能各有所长。而Linux下对ramdisk的实现主要有三种方法:ramdisk, ramfs, tmpfs.
1.ramdisk
利用Linux内核对ramdisk的支持,通过挂载分区、创建文件系统的方式来使用。Linux在内核2.4开始就已经支持ramdisk,早期版本是1995写的rd.c,此后一直是2007年基于/drivers/blocdk/rd.c与loop.c改写的brd.c,直到现在内核4.1还是这个版本,大部分distributions都缺省创建了ramdisk。ramdisk可以有两种使用方式,一种是编译到内核,缺省下就是这种方式,但改变ramdisk大小需要重启系统;另一种是编译成模块,修改ramdisk大小后重新加载模块即可。
首先,就编译到内核中如何使用、修改Ramdisk的过程简要介绍:
(1)ls -l /dev/ram*
查看系统缺省创建的ramdisk
[root]# dmesg | grep RAMDISK
查看缺省创建的ramdisk容量,默认为16个,大小为4MB
(2)增加ramdisk容量
ramdisk的容量通过命令行选项来控制,并在启动时传递给内核。以RedHat9为例,由于GRUB是RedHat9的缺省bootloader ,因此可以通过修改/etc/grub.conf作为新的内核选项,设定ramdisk 大小的内核选项是ramdisk_size=xxxxx, xxxx的单位是1KB,修改后需要重启系统,并通过dmesg输出查看修改是否生效。
(3)格式化ramdisk
需要将ramdisk用一种文件系统格式化,由于没有必要采用日志文件系统,因此仅用EXT2格式即可,以仅需要使用ram0为例:
[root]# mke2fs -m 0 /dev/ram0
(4)创建挂载点,挂载ramdisk
在已经格式化了ramdisk之后,必须为其创建一个挂载点,然后将ramdisk挂载到该挂载点后使用。
[root]# mkdir /mnt/rd
[root]# mount /dev/ram0 /mnt/rd
查看验证挂载是否成功及文件系统信息
[root]# mount | grep ram0
[root]# df -h | grep ram0
进一步查看ram0的详细信息
[root]# tune2fs -l /dev/ram0
修改挂载点的使用权限
[root]# chown van:root /mnt/rd
[root]# chmod 0770 /mnt/rd
验证并查看挂载点的权限是否修改
[root]# ls -ald /mnt/rd
(5)使用ramdisk
完成以上工作后,就可以像在磁盘分区上一样在ramdisk上进创建、复制、移动、删除、编辑文件了。如果需要移除ramdisk,采用以下命令解除挂载即可:
[root]# umount -v /mnt/rd
以上是手动创建ramdisk的过程,也可以通过在/etc/rc.local初始化脚本中加入一些命令来自动完成以上过程,以在便系统每次启动时就自动创建和挂载ramdisk。
-------------------------------------------------------------
/sbin/mke2fs-q -m 0 /dev/ram0
/bin/mount /dev/ram0 /mnt/rd
/bin/chown van:root /mnt/rd
/bin/chmod 0750 /mnt/rd
-------------------------------------------------------------
提示:如果重新挂载ramdisk,数据还在。一旦内存被分配给ramdisk,就会被标记以防止内核在之后再次使用内存。因此,在你使用完ramdisk之后,并不能重新回收ramdisk。基于这个原因,必须在分配ramdisk空间时尽可能谨慎,应该根据需求定制需要的ramdisk大小。当然,也可以通过重启释放空间。
2.ramfs
ramfs是一种内存文件系统,不像ramdisk那样基于虚拟在内存中的其他文件系统(如ex2fs),ramfs处于虚拟文件系统(VFS)层,因而无需格式化,可以创建多个,只要内存足够,在创建时可以指定其最大能使用的内存大小。在编译内核时须将File systems -->> pseudofilesystems -->> Virtual memoryfile system support支持选上。ramfs的使用相对简单,创建挂载点后,按照ramfs的文件系统进行挂载即可。
root# mkdir none /testRAM
root# mount -t ramfs none /testRAM
缺省情况下,Ramfs被限制最多可使用一半的内存,可通过maxsize选项来改变
root# mount -t ramfs none /testRAM -omaxsize=2000 (单位是kbyte)
3.tmpfs
tmpf是一个虚拟内存文件系统,既不同于传统的用块设备形式来实现的Ramdisk,也不同于针对物理内存的ramfs,它可以使用物理内存,也可以使用交换分区。在Linux内核中,虚拟的内存资源由物理内存(RAM)和交换分区(swap)组成,这些资源是由内核中的虚拟内存子系统来负责分配和管理。tmpfs向虚拟内存子系统请求页来存储文件,它同Linux的其它请求页的部分一样,不知道分配给自己的页是在内存中还是在交换分区中。同ramfs一样,tmpfs的大小随着所需要的空间而动态的增减。Linux缺省的/dev/shm即是采用tmpfs文件系统,大小缺省为物理内存的一半。在编译内核时须将File systems -->> pseudofilesystems -->> Virtual memoryfile system support支持选上。
(1)创建挂载点并挂载tmpfs
root# mkdir -p /mnt/tmpfs
root# mount tmpfs /mnt/tmpfs -t tmpfs
同样可以在加载时指定tmpfs文件系统大小的最大限制:
root# mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m
(2)在/dev/shm下使用dd命令创建虚拟块设备文件
个人理解认为/dev/shm就是系统按照(1)创建好的tmpfs,因此可以直接基于该目录使用tmpfs。
ddif=/dev/zero of=/dev/shm/ramdisk0 bs=1M seek=5120 count=0
查看创建的块设备文件大小
ll /dev/shm/ramdisk0
查看块设备文件实际占用的空间大小,seek参数是略过n个块不写
du-m /dev/shm/ramdisk0