分享
 
 
 

Linux中的Ramdisk与Initrd

王朝system·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

Ramdisk简介

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

redice # mkfs.ext2 /dev/ram0

mke2fs 1.38 (30-Jun-2005)

Filesystem label=

OS type: linux

Block size=1024 (log=0)

Fragment size=1024 (log=0)

2048 inodes, 8192 blocks

409 blocks (4.99%) reserved for the super user

First data block=1

1 block group

8192 blocks per group, 8192 fragments per group

2048 inodes per group

Writing inode tables: done

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 24 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

redice # mount /dev/ram0 /mnt/rd

redice # ls /mnt/rd

lost+found

redice # mount

/dev/hda2 on / type ext3

PRoc on /proc type proc (rw)

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

当然,Ramdisk与硬盘分区有其不同的地方,例如RAM disk不适合作为长期保存文件的介质,掉电后Ramdisk的内容会随内存内容的消失而消失。Ramdisk的其中一个优势是它的读写速度高,可以被用作需要高速读写的文件。但在2.6版本后,Ramdisk的这一作用开始被tmpfs(Virtual memory file system support)取代。

回到上面的例子,我们格式化了一个ramdisk(/dev/ram0)并且将其mount到/mnt/rd目录下,那么这个Ramdisk有多大呢?先看一下:

redice # df -h /dev/ram2

Filesystem 容量 已用 可用 已用% 挂载点

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

从上面的信息看出,ramdisk有大约7.8M的可用空间。我们再试一下另外的文件系统,重新格式化成minix分区并挂接试一下:

redice # umount /mnt/rd

redice # mkfs.minix /dev/ram0

2752 inodes

8192 blocks

Firstdatazone=90 (90)

Zonesize=1024

Maxsize=268966912

redice # mount /dev/ram0 /mnt/rd

redice # df -h /dev/ram0

Filesystem 容量 已用 可用 已用% 挂载点

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

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

# grub.conf -

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.XPm.gz

title Redice Linux

root (hd0,0)

kernel /vmlinuz ro root=LABEL=/ hdc=ide-scsi ramdisk_size=16384

initrd /initrd

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

redice # insmod rd rd_size=16384

编译到核心时,可以通过下面的一些核心命令行参数来配置Ramdisk:

ramdisk_size - ramdisk的大小(Kbytes);

ramdisk - 与ramdisk_size的作用相同;

ramdisk_blocksize - ramdisk的块大小,默认情况为1024;

当以模块的形式译时,模块支持以下几个加载参数:

rd_size - 同上面的ramdisk_size或ramdisk参数;

rd_blocksize - 同上面的ramdisk_blocksize;

initrd

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

格式化一个 Ramdisk;

加载文件系统内容到Ramdisk;

将Ramdisk作为根文件系统;

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

initrd与Ghost备份的分区有许多相似之处,例如,它有一定的大小,包含分区上的文件系统格式等。initrd支持的格式包括:

Ext2文件系统;

Romfs文件系统;

cramfs文件系统;

minix文件系统;

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

制作initrd

制作initrd传统的作法是通过软盘(显然过时了,不介绍了)、ramdisk或loop设备(/dev/loop)。通过ramdisk来制作的方法比较简单(以ext2文件系统为例):

redice # mkfs.ext2 /dev/ram0

redice # mount /dev/ram0 /mnt/rd

redice # cp _what_you_like_ /mnt/rd # 把需要的文件复制过去

redice # dd if=/dev/ram0 of=/tmp/initrd

redice # gzip -9 /tmp/initrd

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

通过loop设备来制作initrd的过程:

redice # dd if=/dev/zero of=/tmp/initrd bs=1024 count=4096 # 制作一个4M的空白文件

redice # losetup /dev/loop0 /tmp/initrd # 映射到loop设备上;

redice # mkfs.ext2 /dev/loop0 # 创建文件系统;

redice # mount /dev/loop0 /mnt/rd

redice # cp _what_you_like_ /mnt/rd # 复制需要的文件;

redice # umount /mnt/rd

redice # losetup -d /dev/loop0

redice # gzip -9 /tmp/initrd

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

未完,待续…(补充有关如何加载ARM中如何使用initrd作为根文件系统等)

链接和参考文档

文档

Linux文档中关于ramdisk的介绍,核心目录里 Documentation/ramdisk.txt;

Linux文档中关于initrd的介绍,核心目录 Documentation/initrd.txt;

Linux文档中关于tmpfs的介绍,核心目录 Documentation/filesystems/tmpfs.txt;

How to use a Ramdisk for Linux;

资源

genromfs - genromfs is a space-efficient, small, read-only filesystem originally for Linux and used by some Linux based projects.

genext2fs - Simply, it generates an ext2 filesystem as a normal (i.e. non-root) user. It doesn't require you to mount the image file to copy files on it. It doesn't even require you to be the superuser to make device nodes or set group/user ids.

cramfs - cramfs is a Linux filesystem designed to be simple, small, and to compress things well. It is used on a number of embedded systems and small devices.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有