据我所知,initrd充当块设备,因此需要文件系统驱动程序(如ext2).内核必须至少有一个用于检测文件系统的内置模块initrd.在本文中,介绍了初始RAM磁盘的新模型initramfs,它写成:
但是由于缓存,ramdisks实际上浪费了更多的内存.Linux旨在缓存从块设备读取或写入的所有文件和目录条目,因此Linux将数据复制到ramdisk和从"ramdisk"复制到"页面缓存"(用于文件数据)和"dentry cache"(用于目录条目) .假装是块设备的ramdisk的缺点是它被视为块设备.
什么page cache和dentry cache?在段落中,是否意味着数据被复制,因为ramdisk被视为块设备,因此所有数据都被缓存?
相反,ramfs:
几年前,Linus Torvalds有一个很好的想法:如果Linux的缓存可以像文件系统一样挂载怎么办?只是将文件保存在缓存中,永远不要删除它们,直到它们被删除或系统重新启动?Linus在缓存周围写了一个名为"ramfs"的小包装器,其他内核开发人员创建了一个名为"tmpfs"的改进版本(它可以将数据写入交换空间,并限制给定挂载点的大小,以便在消耗之前填满所有可用的内存).Initramfs是tmpfs的一个实例.
这些基于ram的文件系统会自动增长或缩小以适应它们包含的数据大小.将文件添加到ramfs(或扩展现有文件)会自动分配更多内存,删除或截断文件会释放该内存.块设备和缓存之间没有重复,因为没有块设备.缓存中的副本是数据的唯一副本.最重要的是,这不是新代码,而是现有Linux缓存代码的新应用程序,这意味着它几乎不增加任何大小,非常简单,并且基于经过严格测试的基础架构.
总之,ramfs只是文件打开并加载到内存中,不是吗?
二者initrd并ramfs在编译时拉链,但不同的是,initrd被分解到由在启动内核被安装,而块设备ramfs经由的cpio解压到存储器中.我对么?或者是ramfs一个非常小的文件系统?
最后,直到今天,initrd图像仍然显示在最新的内核中.然而,这initrd实际上是ramfs今天使用的,这个名字只是出于历史目的吗?
我将设置构建环境,为AT91SAM9X25板制作自己的linux嵌入式系统.我正在使用buildroot来做到这一点.make命令构建所有目标,第一个构建工具链然后打包,然后rootfs和rootfs(tar,cpio ...)的图像.要重建rootfs,我通常使用make clean然后make.make clean命令删除所有包括工具链.
所以我的第一个问题是:有没有办法在不构建工具链的情况下重制rootfs?这需要很多时间.
我也在buildroot中构建linux内核.我在buildroot中打开了BR2_LINUX_KERNEL [= y].linux配置为使用初始RAM文件系统,因此要构建内核,需要rootfs的映像(应该由buildroot创建).当我在buildroot的root下运行make时,构建失败并出现错误无法打开'buildroot-2013.05/output/images/rootfs.cpio'.因为(如果我理解正确的话)构建序列是工具链--pakages - rootfs - linux内核 - rootfs的图像.当它尝试构建linux内核时,不会创建rootfs.cpio映像.
所以第二个问题是:如果我想使用初始RAM文件系统,如何在buildroot中构建linux?
可能是比buildroot更有效的替代品?
提前致谢.