linux RamDisk 使用简介

 

linux RamDisk 使用简介
1 Ram Disk 介绍
1.1   什么是 Ram Disk
 
Ram Disk 就是将内存中的一块区域作为物理磁盘来使用的一种技术。
 
对于用户来说,可以把 RAM disk 与通常的硬盘分区(如 /dev/hda1 )同等对待来使用。
 
1.2     Ramdisk 与硬盘分区的不同
RAM disk 不适合作为长期保存文件的介质,掉电后 Ramdisk 的内容会随内存内容的消失而消失。
RAM disk 的其中一个优势是它的读写速度高,内存盘的存取速度要远快于目前的物理硬盘,可以被用作需要高速读写的文件。
注意:在 2.6 版本后, Ramdisk 的这一作用开始被 tmpfs(Virtual memory file system support) 取代。    
 
1.3     Ramdisk 的作用
 
内存盘对于保存加密数据来说是一个福音,因为我们如果将加密的文件解密到普通磁盘的话,即使我们随后删除了解密文件,数据仍然会留在磁盘上。这样是非常不安全的。而对于 RamDisk 来说,没有这样的问题。
 
假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。
   
WEB 服务器这样的计算机,需要大量的读取和交换特定的文件,因此,在 WEB 服务器上建立 RamDisk 会大大提高网络读取速度。
 
RAM disks can be a great place to store temporary data.
 
 
 
2 、前提条件
 
       为了能够使用 RAM disk 你的内核必须要支持 RAM disk ,即:在编译内核时,要选中 RAM disk support 这一选项,会在配置文件中定义 CONFIG_BLK_DEV_RAM
       为了让内核有能力在内核加载阶段就能装入 RAMDISK ,并运行其中的内容,要选中 initial RAM disk(initrd) support 选项,会在配置文件中定义 CONFIG_BLK_DEV_INITRD
 
 
 
3 、操作步骤:
 
3.1 系统中已有的 内存盘
 
3.1.1 查看系统中有那些 内存盘
 
Linux 内核默认创建了 16 ramdisks 。它们目前是未启用的,不占用任何内存空间。这 16 个设备分别是 /dev/ram0 -- /dev/ram15 。虽然我们可以看到还有 /dev/ram16 -- 19 ,但是它们默认是不可用的。
 
通过更改 rd.c 的配置,可以使系统支持的 RAM disk 的数量增加到 255 个。为了使用更多的 RAM disk ,我们可以使用 mknod  /dev/ramX b 1 X 命令创建更多的 RAM disk 设备文件,并且通过 chmod 命令将他们的访问权限改成我们想要的。
 
使用下面的命令查看:
[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
 
3.1.1 查看系统中内存盘的大小
 
[root]# dmesg | grep RAMDISK
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
RAMDISK: Compressed image found at block 0
也就是说,默认的 RamDisk 4MB 的。
 
 
3.2 格式化 RamDisk
 
接下来就需要做文件系统了,也就是格式化。 RamDisk 是临时性的,所以没有带日志的文件系统的必要,所以我们一般做 ext2 就可以了:
[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.
 
mke2fs -m< 百分比值 > 选项:指定给管理员保留扇区的比例。在这里, -m 0 ,即:不为管理员保留任何扇区,任何普通用户都可以使用所有可用的空间。
 
 
3.3 创建挂载点并挂载 RamDisk
 
现在,我们的 RamDisk 已经可以使用了,只需要再将它挂接到一个可访问的目录点:
[root]# mkdir /mnt/rd
[root]# mount /dev/ram0 /mnt/rd
 
       我们来验证一下, RamDisk 是否已经挂在成功了:
[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
 
 
 
 
 
3.4 使用 RamDisk
 
Now that it has been created, you can copy, move, delete, edit, and list files on the ramdisk exactly as if they were on a physical disk partiton.
To unmount the ramdisk, simply enter the following
[root]# umount -v /mnt/rd
/dev/ram0 umounted
 
 
 
4 、与 RAMdisk 有关的命令行参数:
 
4.1 ramdisk_size=N
 
       这个参数告诉 RAM 磁盘驱动将 RAM 磁盘的大小设置为 N k ,默认是 4096 4 MB )。
 
       RAM 磁盘的大小会根据需要动态的增长,因此其大小有个上限加以限制以免它用光所有可用的内存而坏事。 ramdisk_size 这个参数实际是设置这个上限值的。
 
       我们可以通过命令: dmesg | grep RAMDISK 来查看这个上限值。要注意的是,这个值在系统运行阶段是不能再被修改的。
 
       尽管 RAM 磁盘的大小有个最大值,但我们可以指定需要使用的 RAM 磁盘的容量。比如,在本例中我们设为 2MB 。通过写入 RAM 磁盘设备来创建。命令为 dd if=/dev/zero of=/dev/ram0 bs=1k count=2048 。当我们没有指定需要使用的 RAM 磁盘的容量,而直接在其上挂载文件系统时,它的容量是其上限值。
 
 
4.2 load_ramdisk=N
 
       这个参数告诉内核是否要载入一个 RAMDISK 映像。 load_ramdisk =1 时指定核心将软盘载入内存。默认值是 0 ,表示内核不要去载入 RAMDISK 映像。
4.3 prompt_ramdisk=N
 
此参数告诉内核是否要给你个提示要求插入含 RAMDISK 映像的软盘。
 
在只用一张软盘的配置下 RAMDISK 映像与刚刚载入/启动的核心在相同的软盘上,故不需要提示,这种情况可以用 `prompt_ramdisk=0'
 
在使用两张软盘的配置下你需要交换软盘,故可以使用 `prompt_ramdisk=1' 。因为这是预设值,所以不必真的去指定它。
 
 
4.4 ramdisk_start=NNN
 
为了使内核映像能够与压缩的 RAMDISK 映像放在一张软盘内,所以加入这个 `ramdisk_start=<offset>' 指令。
 
内核不能够放在压缩过的 RAMDISK 磁盘的文件系统映像里,因为它得从最开始的第零磁区开始放置,这样基本输出入系统 (BIOS) 才能载入启动磁区而内核也才能够开始启动执行。 ( 参考 Documentation/ramdisk.txt ,但是我不太明白 )?????????
注意:如果你使用的是没有压缩的 RAMDISK 磁盘映像,那么内核可以是要载入的 RAMDISK 磁盘的文件统映像的一部份,且该软盘可以由 LILO 启动,两者也可以如同压缩的映像那样为分开的两部份。
如果你使用启动/根 (boot/root) 两张磁盘的方式(内核一张, RAMDISK 映像放第二张)那么 RAMDISK 磁盘会由第零磁区开始,并使用零作为偏移值 (offset) 。因为这是预设值,你根本不必真的去使用这个指令。
 
 
 
5 、使用 "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"
 
 
 
6 、一个创建压缩 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 通过管道一步执行
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值