RAMDISK

RAMDISK
有许多理由可以解释为什么创建基于文件系统的内存空间,他能提供了零延时和高速的区域存储,一个创建好的
RAM应用于高速的缓存目录和工作区域。
在Linux系统中有两种主要的RAMDISK类型:
ramdisk
tmpfs

这两种文件系统被打包在绝大多数的Linux的发行版本,允许用户创建一个ramdisk基于内存存储区域 ,可以挂载和操作传统的文件夹

1.首先什么是基于文件系统的内存空间(RAMDISK)
直接创建一个存储区域在内存里文件系统,RAM是一种已丢失的存储介质,一旦断电或重启数据就会丢失。
基于RAM的文件系统主要的优势在于读写速度快,它的读写速度可以达到10倍于SSD硬盘的读写速度,
读写的表现是大幅度的增长相对于其他所有的存储类型,那些快速存储区域适合应用于需要重复的存储小容量的数据

或需要使用高速临时存储,当机子重启数据会丢失,数据必须按照计划表按时备份也无法保证所有数据在系统磬机的时候数据的完整性。


2.这两种ramdisk类型的优缺点主要区别是:

tmfs vs ramfs

这两种主要的基于文件系统的RAM,ramfs是比较老的文件类型,绝大多数 的场景下已经被跟大容量的tmfs所取代

tamfs创建在内存的文件系统,使用一样的原理和存储空间在Linux文件系统缓存,使用free
命令在Linux命令行下,会显示出你的RAM总量和你使用的RAM在系统里。

ramfs 不能被限制大小像基于文件系统的磁盘,当超过设定的容量,ramfs将会继续使用内存空间直到
内存空间被使用完,这个问题如果应用于写入文件系统将无法控制总量,另一个问题是,你无法使用df
命令查看使用内存大小只能别查看使用free命令

tmfs:tmfs是近期的RAM文件系统改进了许多ramfs的缺点,你可以设置一个大小的限制使用tmfs,当使用超过限额会提示一个“disk full” error,这样的行为就像普通的磁盘物理分区一样了。
查看使用的容量空间在tmfs分区上也是使用df来演示的,tmfs的这个两个不同比ramfs跟好可管理性,

tmfs可以使用SWAP抠门和关键,如果你的系统使用超出物理RAM的大小,那么tmfs文件系统将会写入基于磁盘的SWAP分区和从次哦按分区度入数据,在一些情景下这可以看做优点,当你有较小的内存空间,那么可以使用超出你的内存空间的容量,当然这种内存空间只是逻辑上的,在物理上的读写性能和磁盘是相同的。


创建ramdisk:

1.使用free命令查看内存的总量和未使用空间

    free -g

example:


2.Linux 内核默认创建了 16 个 ramdisks。它们目前是未启用的,不占用任何内存空间。这 16 个设备分别是 /dev/ram0 -- /dev/ram15。

3.查看系统内存中的RAMDISK的大小:

4.格式化RAMDISK创建文件系统,RamDisk是临时性的,所以没有带日志的文件系统的必要,所以我们一般做 ext2 就可以了:


5..创建文件夹用于挂载ramdisk

    mkdir /mnt/ramdisk

6.使用mount命令挂载

    mount -t [type] -o size=[SIZE] [FSTYPE] [MOUNTTPOINT]

    mount  /dev/ram0 /mnt/ramdisk

7.查看ramdisk 是否挂载成功:

8、与RAMdisk有关的命令行参数:

8.1 ramdisk_size=N


       这个参数告诉RAM磁盘驱动将RAM磁盘的大小设置为N k,默认是4096(4 MB)。

       RAM磁盘的大小会根据需要动态的增长,因此其大小有个上限加以限制以免它用光所有可用的内存而坏事。ramdisk_size这个参数实际是设置这个上限值的。

       我们可以通过命令:dmesg | grep RAMDISK来查看这个上限值。要注意的是,这个值在系统运行阶段是不能再被修改的。

       尽管RAM磁盘的大小有个最大值,但我们可以指定需要使用的RAM磁盘的容量。比如,在本例中我们设为4MB。通过写入RAM磁盘设备来创建。命令为dd if=/dev/zero of=/dev/ram0 bs=1k count=4096。当我们没有指定需要使用的RAM磁盘的容量,而直接在其上挂载文件系统时,它的容量是其上限值。

可以看到它的读写速度非常快。

8.2 load_ramdisk=N

       这个参数告诉内核是否要载入一个RAMDISK映像。load_ramdisk =1时指定核心将软盘载入内存。默认值是0,表示内核不要去载入RAMDISK映像。
8.3 prompt_ramdisk=N

此参数告诉内核是否要给你个提示要求插入含RAMDISK映像的软盘。

在只用一张软盘的配置下RAMDISK映像与刚刚载入/启动的核心在相同的软盘上,故不需要提示,这种情况可以用 `prompt_ramdisk=0'。

在使用两张软盘的配置下你需要交换软盘,故可以使用 `prompt_ramdisk=1'。因为这是预设值,所以不必真的去指定它。


8.4 ramdisk_start=NNN

为了使内核映像能够与压缩的RAMDISK映像放在一张软盘内,所以加入这个 `ramdisk_start=' 指令。

内核不能够放在压缩过的RAMDISK磁盘的文件系统映像里,因为它得从最开始的第零磁区开始放置,这样基本输出入系统(BIOS)才能载入启动磁区而内核也才能够开始启动执行。
注意:如果你使用的是没有压缩的RAMDISK磁盘映像,那么内核可以是要载入的RAMDISK磁盘的文件统映像的一部份,且该软盘可以由 LILO 启动,两者也可以如同压缩的映像那样为分开的两部份。
如果你使用启动/根(boot/root)两张磁盘的方式(内核一张,RAMDISK映像放第二张)那么RAMDISK磁盘会由第零磁区开始,并使用零作为偏移值(offset)。因为这是预设值,你根本不必真的去使用这个指令。

9、使用"rdev -r"

命令“rdev –r”设置内核镜像文件中的两个字节(32bit),这两个字节中各个位的含义如下:
低11位(0 -> 10)指定了一个偏移量(以1K的块为单位),最到能寻址到2M,用以指定到何处去寻找RAM磁盘。
第14位指示RAM磁盘是否被加载。
第15位指示是否在加载RAM磁盘之前给出一个提示并等待用户指令。

如果随着数据被写入RAM磁盘,RAM磁盘的大小是动态增长的,那么指定RAM磁盘的大小的域将被忽略。11到13位没有被使用,所以可以为0。

上面所列的数据并非什么秘密,可以在参照下列地方:

进入内核源码所在目录:
./arch/i386/kernel/setup.c:#define RAMDISK_IMAGE_START_MASK 0x07FF
./arch/i386/kernel/setup.c:#define RAMDISK_PROMPT_FLAG 0x8000
./arch/i386/kernel/setup.c:#define RAMDISK_LOAD_FLAG 0x4000

考察一个典型的"两张软盘启动",内核在第一张软盘上,并且已经将一个RAM磁盘镜像文件放到了第二张软盘上。

所以你希望将0到13位设置为0,这将意为着你的RAM磁盘处于从软盘起始地址偏移量为0KB的地方。相同功能的命令行参数为:"ramdisk_start=0"

你希望第14位为1,即声明加载RAM磁盘。相同功能的命令行参数为:"load_ramdisk=1

你希望第15位为1,这是声明希望显示一个提示并等待用户的按键以得到一个提示机会来更换软盘。形同功能的命令行参数为:"prompt_ramdisk=1"

将上述的标志位综合在一起得到:2^15 + 2^14 + 0 = 49152作为参数传递给rdev用来设置内核镜像里的两个字节。所以如果创建上述的第一个磁盘,你需要进行如下操作:
/usr/src/linux# cat arch/i386/boot/zImage > /dev/fd0
/usr/src/linux# rdev /dev/fd0 /dev/fd0
/usr/src/linux# rdev -r /dev/fd0 49152

如果你创建一个使用了lilo的启动磁盘,为了得到上面说明的那些效果,你需要使用下列lilo的参数:
append = "ramdisk_start=0 load_ramdisk=1
prompt_ramdisk=1"考虑到默认的start = 0和prompt = 1,你可以简化lilo的命令行参数为:
append = "load_ramdisk=1"

10、一个创建压缩RAM磁盘的例子:

为了创建一个RAM磁盘的镜像,你需要你一个单独的块设备。这个块设备可以是一个RAM磁盘设备本身,也可以是一个未使用的磁盘分区(比如一个没有被挂载的交换分区)。在这个例子中,我们将使用RAM磁盘设备:"/dev/ram0"。

a)确定你希望使用的RAM磁盘的容量

比如,在本例中我们设为2MB。通过写入RAM磁盘设备来创建。最好写入0,这样下一步创建镜像时进行最大比例压缩的时候比较方便压缩未使用的块。命令为:
dd if=/dev/zero of=/dev/ram0 bs=1k count=2048

b)创建一个文件系统。在本例中使用ext2fs。命令为:mke2fs -vm0 /dev/ram0 2048

c)挂载这个磁盘设备

无论是一个RAM磁盘设备,还是一个单独的分区,向里面拷贝你需要的文件(比如:/etc/* /dev/* ...)。然后卸载这个设备(umount)。

d)压缩这个RAM磁盘镜像。

压缩之后,被实际使用的空间大约能压缩到原来的50%,并且未被使用的空间几乎被完全压缩到0。命令为:dd if=/dev/ram0 bs=1k count=2048 | gzip -v9 > /tmp/ram_image.gz

e)将内核放入软盘。

命令为:dd if=zImage of=/dev/fd0 bs=1k

f)将RAM磁盘镜像放入软盘。

使用一个比内核所占空间略大的偏移量。之所以要有一个略大的偏移量,可以方便以后更换内核,而不会覆盖到RAM磁盘的镜像。比如,如果内核占用了350KB,那么写入RAM磁盘镜像的时候使用400KB的偏移量是比较合理的。注意:确定"偏移量+RAM磁盘镜像的体积"不会超出软盘的容量(通常是1440KB)。
命令为:dd if=/tmp/ram_image.gz of=/dev/fd0 bs=1k seek=400

g)使用rdev命令设置启动设备,RAM磁盘偏移量,是否提示换磁盘标志,等等。

比如设置:prompt_ramdisk=1, load_ramdisk=1,ramdisk_start=400,这些标志时,可以计算出来:2^15 + 2^14 + 400 = 49552,使用的命令可能为:
rdev /dev/fd0 /dev/fd0
rdev -r /dev/fd0 49552

到此为止,你已经获得了你自己的启动/根压缩RAM磁盘(软盘),你也可以将步骤d和步骤f通过管道一步执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值