initrd和initramfs的区别?
据我所知, initrd
作为一个块设备,因此需要一个文件系统驱动程序(如ext2
)。 内核必须至less有一个用于检测initrd
文件系统的内置模块。 在本文中, 介绍初始RAM磁盘的新模型initramfs ,它写道:
但是由于caching的原因,ramdisk实际上浪费了更多的内存。 Linux被devise为caching从块设备读取或写入到块设备的所有文件和目录条目,因此Linux将数据从RAM存储器复制到“页面caching”(用于文件数据)和“dentry cache”(用于目录条目) 。 虚拟硬盘伪装成块设备的缺点是它被视为块设备。
什么是page cache
和dentry cache
? 在该段落中,是否意味着数据被复制,因为ramdisk
被视为块设备,因此所有数据都被caching?
相反, ramfs
:
几年前,Linus Torvalds有一个很好的想法:如果Linux的caching可以像文件系统一样安装? 只要将文件保存在caching中,永远不要删除它们,直到它们被删除或系统重新启动? Linus在名为“ramfs”的caching中写了一个小小的包装,其他内核开发人员创build了一个名为“tmpfs”的改进版本(它可以将数据写入交换空间,并限制给定挂载点的大小,所有可用内存)。 Initramfs是tmpfs的一个实例。
这些基于ram的文件系统会自动增长或缩小以适应其包含的数据的大小。 将文件添加到ramfs(或扩展现有文件)将自动分配更多的内存,删除或截断文件将释放该内存。 块设备和caching之间没有重复,因为没有块设备。 caching中的副本是数据的唯一副本。 最重要的是,这不是新的代码,而是现有Linuxcaching代码的新应用程序,这意味着它几乎没有添加任何大小,非常简单,并且基于经过严格testing的基础架构。
总之, ramfs
只是文件打开并加载到内存中,不是吗?
initrd
和ramfs
都是在编译时压缩的,不同之处在于, initrd
是一个解压缩的块设备,在启动时被内核挂载,而ramfs
通过cpio解压到内存中。 我对么? 或者ramfs
是一个非常小的文件系统?
最后,直到今天, initrd
映像仍然存在于最新的内核中。 但是, initrd
实际上就是今天使用的ramfs
,名字只是为了历史的目的?
Dentry(和inode)caching
Linux中的文件系统子系统有三层。 VFS(虚拟文件系统),实现系统调用接口并处理穿越挂载点和默认权限和限制检查。 下面是单个文件系统的驱动程序,接下来又连接到块设备(磁盘,存储卡等;networking接口是例外)的驱动程序。
VFS和文件系统之间的接口是几个类(它是纯C的,所以包含指向函数的指针等的结构,但概念上它是面向对象的接口)。 主要的三个类是inode
,它描述了文件系统中的任何对象(文件或目录), dentry
描述了一个目录和file
中的条目,它描述了一个进程打开的文件。 挂载时,文件系统驱动程序为其根目录创buildinode
和dentry
,而当进程想要访问文件并最终过期时,会根据需要创build其他目录。 这是一个dentry和inodecaching。
是的,这意味着对于每一个打开的文件和任何一个根目录下的目录,必须在内核内存中分配inode
和dentry
结构来代表它。
页面caching
在Linux中,每个包含userland数据的内存页面都用统一的page
结构来表示。 这可能会将页面标记为匿名(如果可用,可能会交换到交换空间),或将其与某些文件系统上的inode
关联(可能会被写回到文件系统并从文件系统重新读取),并且可以是任意数量的内存的一部分地图,即在某个进程的地址空间中可见。 当前加载到内存中的所有页面的总和就是页面caching。
这些页面用于实现mmap接口,而常规的读写系统调用可以通过文件系统以其他方式实现,大多数接口使用也使用页面的generics函数。 有一些generics函数,当请求文件读取时,分配页面并调用文件系统来逐个填充它们。 对于基于块设备的文件系统,它只是计算适当的地址并将该填充委托给块设备驱动程序。
ramdev(ramdisk)
Ramdev是常规的块设备。 这允许在其上层叠任何文件系统,但是它受到块设备接口的限制。 而这只是填写调用者分配的页面并将其写回的方法。 这正是磁盘,存储卡,USB大容量存储器等实际块设备所需要的,但对于虚拟磁盘而言,这意味着数据在内存中存在两次,一次存储在内存中,一次存储在内存中呼叫者。
这是实施initrd
的旧方法。 从initrd罕见和异乎寻常的发生时间。
TMPFS
Tmpfs是不同的。 这是一个虚拟文件系统。 它提供给VFS的方法是绝对的最低限度使它工作(因为它是什么inode,dentry和文件方法应该做的很好的文档)。 文件只有在inodecaching中有相应的inode和dentry时才存在,当文件被创build时创build,并且除非文件被删除,否则永不过期。 当数据被写入时页面与文件相关联,否则就像匿名文件一样(数据可以被存储为交换,只要文件存在, page
结构就保持使用)。
这意味着在内存中没有额外的数据副本,整个事情要简单得多,而且也要稍微快一点。 它只是使用数据结构,作为任何其他文件系统的caching,因为它是主存储。
这是实现initrd
( initramfs
,但图像仍然只是initrd
)的新方法。
这也是实现“posix共享内存”的方法(简单的说,tmpfs被挂载在/dev/shm
,应用程序可以自由地在这里创build文件并进行映射;简单高效),最近甚至是/tmp
和/run
/var/run
)通常会在笔记本上安装tmpfs,以防止磁盘旋转起来,或者避免SSD出现磨损。
我认为你是对的。
如果您按照启动时所需的步骤操作,很容易看出差异:
initrd
- 一个
ramdev
块设备被创build。 这是一个基于RAM的块设备,它是使用内存而不是物理磁盘的模拟硬盘。 -
initrd
文件被读取并解压缩到设备中,就像您执行了zcat initrd | dd of=/dev/ram0
zcat initrd | dd of=/dev/ram0
或类似的东西。 -
initrd
包含一个文件系统的映像,所以现在你可以像往常一样mount /dev/ram0 /root
文件系统:mount /dev/ram0 /root
。 当然,文件系统需要一个驱动程序,所以如果你使用ext2,ext2驱动程序必须在内核中编译。 - 完成!
initramfs
- 安装
tmpfs
:mount -t tmpfs nodev /root
。 tmpfs不需要驱动程序,它始终在内核上。 不需要设备,不需要额外的驱动程序 -
initramfs
直接解压到这个新的文件系统:zcat initramfs | cpio -i
zcat initramfs | cpio -i
或类似的。 - 完成!
是的,它仍然被称为initrd
在许多地方,虽然它是一个initramfs
,特别是在引导加载程序,因为它们只是一个BLOB。 启动时由操作系统做出区别。