你现在位置:首页>技术论文>软件知识>正文
Ramdisk简介
日期:2008-5-14 23:44:02 来源:本站整理  
点击: 作者:
点击【】放大字体.

先简单介绍一下ramdisk,Ramdisk是虚拟于RAM中的盘(Disk)。对于用户来说,可以把RAM disk与通常的硬盘分区(如/dev/hda1)同等对待来使用,例如:

WWcW_PLCJS_COM-PLC-技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

——可——编——程——控-制-器-技——术——门——户

redice # mkfs.ext2 /dev/ram0
WWW_PLCJS@_COM%-PLC-技.术_网

mke2fs 1.38 (30-Jun-2005)
WWW_PLC※JS_COM-PmLC-技.术_网

Filesystem label=
WWW.PLCJS.COM——可编程控制器技术门户

OS type: Linux
WWcW_PLCJS_COM-PLC-技.术_网

Block size=1024 (log=0)
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

Fragment size=1024 (log=0)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

2048 inodes, 8192 blocks
WW.W_PLC※JS_C,OM-PL,C-技.术_网

409 blocks (4.99%) reserved for the super user
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

First data block=1
WWW_P※LCJS_CO※M-PLC-技-.术_网

1 block group
WWW_PLC※JS_COM-PmLC-技.术_网

8192 blocks per group, 8192 fragments per group
WWW_PLCJS_COM-PLC-技.术_网

2048 inodes per group
P.L.C.技.术.网——可编程控制器技术门户

WW.W_PLC※JS_C,OM-PL,C-技.术_网

Writing inode tables: done
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

Writing superblocks and filesystem accounting information: done
WW.W_PLCJS_COM-PLC-技.术_网

P.L.C.技.术.网——可编程控制器技术门户

This filesystem will be automatically checked every 24 mounts or
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

180 days, whichever comes first. Use tune2fs -c or -i to override.
WWW_PLCJS@_COM%-PLC-技.术_网

WWW_PLC※JS_COM-PmLC-技.术_网

redice # mount /dev/ram0 /mnt/rd
WW.W_PLC※JS_C,OM-PL,C-技.术_网

redice # ls /mnt/rd
——可——编——程——控-制-器-技——术——门——户

lost+found
W1WW_P4LCJS_COM-PLC-技.术_网

redice # mount
WWcW_PLCJS_COM-PLC-技.术_网

/dev/hda2 on / type ext3
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

proc on /proc type proc (rw)
WW.W_PLC※JS_C,OM-PL,C-技.术_网

/dev/ram0 on /tmp/xxx type ext2 (rw)

WWW_P※LCJS_CO※M-PLC-技-.术_网

当然,Ramdisk与硬盘分区有其不同的地方,例如RAMdisk不适合作为长期保存文件的介质,掉电后Ramdisk的内容会随内存内容的消失而消失。Ramdisk的其中一个优势是它的读写速度高,可以被用作需要高速读写的文件。但在2.6版本后,Ramdisk的这一作用开始被tmpfs(Virtual memory file systemsupport)取代。
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

回到上面的例子,我们格式化了一个ramdisk(/dev/ram0)并且将其mount到/mnt/rd目录下,那么这个Ramdisk有多大呢?先看一下:
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

plcjs.技.术_网

WWW_PL※CJS_COM-PLC-技.术_网

redice # df -h /dev/ram2
WWW_P※LCJS_CO※M-PLC-技-.术_网

Filesystem 容量 已用 可用 已用% 挂载点
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

/dev/ram0 7.8M 1.0K 7.4M 1% /mnt/rd

P.L.C.技.术.网——可编程控制器技术门户

从上面的信息看出,ramdisk有大约7.8M的可用空间。我们再试一下另外的文件系统,重新格式化成minix分区并挂接试一下:
WWW.PLCJS.COM——可编程控制器技术门户

plcjs.技.术_网

WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

redice # umount /mnt/rd
P.L.C.技.术.网——可编程控制器技术门户

redice # mkfs.minix /dev/ram0
WWW_PLC※JS_COM-PmLC-技.术_网

2752 inodes
WWW_PLCJS_COM-PLC-技.术_网

8192 blocks
plcjs.技.术_网

Firstdatazone=90 (90)
P.L.C.技.术.网——可编程控制器技术门户

Zonesize=1024
WWW_P※LCJS_CO※M-PLC-技-.术_网

Maxsize=268966912
WWW_PL※CJS_COM-PLC-技.术_网

WWW_PLCJS@_COM%-PLC-技.术_网

redice # mount /dev/ram0 /mnt/rd
WWW_P※LCJS_COM-PLC-)技.术_网

redice # df -h /dev/ram0
WWW_PLCJS@_COM%-PLC-技.术_网

Filesystem 容量 已用 可用 已用% 挂载点
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

/dev/ram0 8.0M 1.0K 8.0M 1% /mnt/rd

WWW_PLC※JS_COM-PmLC-技.术_网

现在看出来了,的确是8M(这同时说明,EXT2文件系统本身要占用一定的存储空间,相比之下minix文件系统要少些),这个空间是在编译核心时就确定下来了,在配置Ramdisk时,有一个叫 Default RAM disk size 的参数决定默认情况下Ramdisk的大小。可以通过核心命令行参数(ramdisk_size)来改变这个值,例如要设置Ramdisk的大小为16M,在grub中可以用:
WWW.PLCJS.COM——可编程控制器技术门户

WWW_PLC※JS_COM-PmLC-技.术_网

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

# grub.conf -
WWW.PLCJS.COM——可编程控制器技术门户

default=0
WWW.PLCJS.COM——可编程控制器技术门户

timeout=10
W1WW_P4LCJS_COM-PLC-技.术_网

splashimage=(hd0,0)/grub/splash.xpm.gz
WWW_PLCJS@_COM%-PLC-技.术_网

title Redice Linux
WWW_P※LCJS_COM-PLC-)技.术_网

root (hd0,0)
WWcW_PLCJS_COM-PLC-技.术_网

kernel /vmlinuz ro root=LABEL=/ hdc=ide-scsi ramdisk_size=16384
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

initrd /initrd

WWW.PLCJS.COM——可编程控制器技术门户

这样,Ramdisk的大小就变成16M了。这个参数是Ramdisk直接编译到核心时才能使用的,如果Ramdisk编译为模块,则应该使用模块参数来设置Ramdisk的大小:
plcjs.技.术_网

WWW_P※LCJS_CO※M-PLC-技-.术_网

WWcW_PLCJS_COM-PLC-技.术_网

redice # insmod rd rd_size=16384
Linux中的Ramdisk与Initrd(图二)
WWcW_PLCJS_COM-PLC-技.术_网

编译到核心时,可以通过下面的一些核心命令行参数来配置Ramdisk:
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

  • WWW_PL※CJS_COM-PLC-技.术_网

    ramdisk_size - ramdisk的大小(Kbytes);
    W1WW_P4LCJS_COM-PLC-技.术_网

  • WWW_PLCJS_COM-PLC-技.术_网

    ramdisk - 与ramdisk_size的作用相同;
    WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  • WWW_PLC※JS_COM-PmLC-技.术_网

    ramdisk_blocksize - ramdisk的块大小,默认情况为1024;
    WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

WWW_PL※CJS_COM-PLC-技.术_网

当以模块的形式译时,模块支持以下几个加载参数:
plcjs.技.术_网

  • WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

    rd_size - 同上面的ramdisk_size或ramdisk参数;
    plcjs.技.术_网

  • P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

    rd_blocksize - 同上面的ramdisk_blocksize;
    WWW_P※LCJS_COM-PLC-)技.术_网

initrd

WW.W_PLCJS_COM-PLC-技.术_网

上面已经提到,Ramdisk需要先格式化然后理能使用。那么,如果核心希望使用ramdisk该如何做呢?于是initrd产生了,initrd全称是 initial RAM disk ,它提供一种让核心可以简单使用Ramdisk的能力,简单的说,这些能力包括:
WWW_PLCJS@_COM%-PLC-技.术_网

  1. WW.W_PLC※JS_C,OM-PL,C-技.术_网

    格式化一个 Ramdisk;
    WWW_PL※CJS_COM-PLC-技.术_网

  2. WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    加载文件系统内容到Ramdisk;
    WWW_PL※CJS_COM-PLC-技.术_网

  3. WWW_P※LCJS_COM-PLC-)技.术_网

    将Ramdisk作为根文件系统;
    W1WW_P4LCJS_COM-PLC-技.术_网

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

我们可以将initrd形像的比作Norton Ghost备份的硬盘分区,而Linux启动阶段的Ramdisk相当于一个未格式化的硬盘分区,核心可以直接将initrd的内容释放到一个未初始化的Ramdisk里,这个过程与Ghost恢复一个分区的过程十分相似。于是,相应的内容被加载到相应的Ramdisk中,同时,这个Ramdisk也被格式化成某种由initrd格式所表达的分区格式。
WWW_P※LCJS_CO※M-PLC-技-.术_网

WWW.PLCJS.COM——可编程控制器技术门户

initrd与Ghost备份的分区有许多相似之处,例如,它有一定的大小,包含分区上的文件系统格式等。initrd支持的格式包括:
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

  • plcjs.技.术_网

    Ext2文件系统;
    WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

  • WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

    Romfs文件系统;
    plcjs.技.术_网

  • WWcW_PLCJS_COM-PLC-技.术_网

    cramfs文件系统;
    WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

  • ——可——编——程——控-制-器-技——术——门——户

    minix文件系统;
    WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

如果核心选择了Gzip支持(通常这是默认的,在init/do_mounts_rd.c中定义的BUILD_CRAMDISK宏)还可以使用Gzip压缩的initrd。相关的代码可以在核心源码 drivers/block/rd.c:identify_ramdisk_image 中找到。
WWW_PLCJS@_COM%-PLC-技.术_网

制作initrd

WWcW_PLCJS_COM-PLC-技.术_网

制作initrd传统的作法是通过软盘(显然过时了,不介绍了)、ramdisk或loop设备(/dev/loop)。通过ramdisk来制作的方法比较简单(以ext2文件系统为例):
P.L.C.技.术.网——可编程控制器技术门户

P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

redice # mkfs.ext2 /dev/ram0
WWW_PLC※JS_COM-PLC-技.术_网(可编程控※制器技术门户)

redice # mount /dev/ram0 /mnt/rd
P_L_C_技_术_网——可——编——程——控-制-器-技——术——门——户

redice # cp _what_you_like_ /mnt/rd # 把需要的文件复制过去
——可——编——程——控-制-器-技——术——门——户

redice # dd if=/dev/ram0 of=/tmp/initrd
WW.W_PLC※JS_C,OM-PL,C-技.术_网

redice # gzip -9 /tmp/initrd
plcjs.技.术_网

这个过程也最能够解释initrd的本质,对于Linux来说,Ramdisk的一个块设备,而initrd是这个块设备上所有内容的“克隆”(由命令dd来完成)而生成的文件。核心中加载initrd相关的代码则用于完成将相反的过程,即将这一个文件恢复到Ramdisk中去。
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

通过loop设备来制作initrd的过程:
WWW_PLCJS※COM-PLC-技.术_网(可※编程控※制器技术门户)

WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

redice # dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一个4M的空白文件
WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

redice # losetup /dev/loop0 /tmp/initrd # 映射到loop设备上;
WWW_PL※CJS_COM-PLC-技.术_网

redice # mkfs.ext2 /dev/loop0 # 创建文件系统;
WWW_PLCJS@_COM%-PLC-技.术_网

redice # mount /dev/loop0 /mnt/rd
WWW_PLCJ-S_COM-PLC-技.术_网(可-编程控-制器技术-门户)

redice # cp _what_you_like_ /mnt/rd # 复制需要的文件;
WW.W_PLCJS_COM-PLC-技.术_网

redice # umount /mnt/rd
W1WW_P4LCJS_COM-PLC-技.术_网

redice # losetup -d /dev/loop0
W1WW_P4LCJS_COM-PLC-技.术_网

redice # gzip -9 /tmp/initrd
WWW_P※LCJS_CO※M-PLC-技-.术_网

不过,现在已经有了一些更好的工具来完成这些工作,包括genromfs(uClinux里常用的工具),genext2fs,mkcramfs等。这些工具提供了一些方便开发的新特性,例如,不需要上面烦索的过程,只要将文件复制到某个目录中,将其作为根目录,即可生成initrd;另一个重要的改进是,这些工具都可以以普通用户的身份来生成initrd。
WWW※PLCJS_COM-PL#C-技.术_网(可编※程控※制器技术门户)

WWW_PLCJS※COM-PLC-技×术_网(可编程控※制器技术门户)

未完,待续…(补充有关如何加载|ARM中如何使用initrd作为根文件系统等)
WWW_PLCJS_COM-PLC-技.术_网

本新闻共2页,当前在第11 2  
WW.W_PLCJS_COM-PLC-技.术_网

评论内容
载入中...
载入中...
P
L
C



|










|


P
L
C









·最新招聘信息
·最新求职信息
·推荐产品
·推荐厂商
·栏目热门排行
·站内热门排行