您的位置:首页 > 运维架构 > Linux

linux下使用ramdisk的一点认识

2015-09-15 14:24 501 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: