当前位置: 首页 > news >正文

ramfs, rootfsinitramfs

什么是ramfs?

ramfs是一个非常简单的文件系统,它将Linux的磁盘缓存机制(页面缓存和dentry缓存)导出为一个动态可调整大小的基于ram的文件系统。
Linux通常将所有文件缓存在内存中。从后备存储(通常是挂载文件系统的块设备)读取的数据页被保留下来,以防再次需要,但标记为干净(可自由),以防虚拟内存系统需要内存做其他事情。类似地,写入文件的数据一旦写入后备存储,就会被标记为干净,但会保留下来用于缓存,直到VM重新分配内存。类似的机制(dentry缓存)大大加快了对目录的访问速度。
对于ramfs,没有后备存储。写入ramfs的文件像往常一样分配条目和页面缓存,但是没有地方可以写入它们。
这意味着页面永远不会被标记为干净的,因此当VM寻求回收内存时,它们无法被释放。
实现ramfs所需的代码量很少,因为所有的工作都是由现有的Linux缓存基础设施完成的。基本上,您将把磁盘缓存挂载为文件系统。正因为如此,ramfs不是一个可通过menuconfig删除的可选组件,因为节省的空间可以忽略不计。

ramfs and ramdisk

旧的“ramdisk”机制在ram区域之外创建一个合成块设备,并将其用作文件系统的后备存储。这个块设备的大小是固定的,因此挂载在它上面的文件系统的大小也是固定的。使用ram磁盘还需要不必要地将内存从假块设备复制到页面缓存中(并将更改复制回来),以及创建和销毁dentry。此外,它还需要一个文件系统驱动程序(比如ext2)来格式化和解释这些数据。

与ramfs相比,这浪费了内存(和内存总线带宽),为CPU创建了不必要的工作,并污染了CPU缓存。(有一些技巧可以通过玩弄页表来避免这种复制,但它们令人不快地复杂,而且结果证明和复制一样昂贵。)更重要的是,ramfs所做的所有工作都必须发生,因为所有文件访问都要经过页面和dentry缓存。RAM磁盘是完全不必要的;Ramfs在内部要简单得多。

ramdisk半过时的另一个原因是,环回设备的引入提供了一种更灵活、更方便的方式来创建合成块设备,现在是从文件而不是从内存块创建。

ramfs and tmpfs

ramfs的一个缺点是,您可以一直向它写入数据,直到填满所有内存,并且VM无法释放它,因为VM认为应该将文件写入后备存储(而不是交换空间),但是ramfs没有任何后备存储。因此,应该只允许root(或受信任的用户)对ramfs挂载进行写访问。

创建了一个名为tmpfs的ramfs衍生物,以增加大小限制,并能够将数据写入交换空间。可以允许普通用户对tmpfs挂载进行写访问。

什么是rootfs?

Rootfs是ramfs(或tmpfs,如果启用了的话)的一个特殊实例,它总是存在于2.6系统中。不能卸载rootfs的原因与不能终止init进程的原因大致相同;对于内核来说,不需要专门的代码来检查和处理空列表,只需要确保某些列表不会变为空,这样做更小、更简单。

大多数系统只是在rootfs上挂载另一个文件系统,并忽略它。ramfs的空实例占用的空间量很小。

如果启用了CONFIG_TMPFS, rootfs将默认使用tmpfs而不是ramfs。要强制使用ramfs,请在内核命令行中添加"rootfstype=ramfs"。

什么是initramfs?

initramfs是一个可以编译进内核的根文件映像,在Linux在启动init进程之前,用来准备系统,挂载真正的root文件系统.

所有2.6版本的Linux内核都包含一个gzip的“cpio”格式的存档文件,在内核启动时将其提取到rootfs中。在提取之后,内核检查rootfs是否包含一个文件“init”,如果是,它将其作为PID1执行。如果找到了,这个init进程负责将系统启动,包括定位和挂载真正的根设备(如果有的话)。如果在将嵌入的cpio归档文件提取到rootfs中后,它不包含init程序,那么内核将使用旧代码来定位和挂载根分区,然后从中执行/sbin/init的某些变体。
参考

http://www.lryc.cn/news/64067.html

相关文章:

  • 十三届蓝桥杯研究生组国赛-最大公约数(线段树+二分)
  • 数据结构——二叉树层序遍历
  • 【微机原理】8088/8086微处理器
  • springboot第12集:DAO功能代码
  • 基于KZG多项式承诺方案的RLN
  • 《站在巨人的肩膀上学习Java》
  • 敏捷ACP.敏捷估计与规划.Mike Cohn.
  • [创新工具和方法论]-01- DOE课程基础知识
  • LeetCode-1033. 移动石子直到连续
  • JVM调优入门指南:掌握步骤、参数和场景
  • 基于JSP+MySQL的跳蚤市场网站设计与开发
  • 内网穿透NPS和宝塔Nginx配合使用,开启SSL访问本地局域网网络
  • ToLua框架
  • Golang-常见数据结构Map
  • 基于空间矢量脉宽调制(SVPWM)的并网逆变器研究(Simulink)
  • 介绍tcpdump在centos中的使用方法
  • 机器学习实战:Python基于DT决策树模型进行分类预测(六)
  • 操作系统之进程同异步、互斥
  • 你了解这2类神经性皮炎吗?常常预示着这5类疾病!
  • 二叉搜索树【Java】
  • 二叉树的遍历方式
  • SpringCloud01
  • SpringBoot整合Redis实现点赞、收藏功能
  • 【Java入门合集】第一章Java概述
  • Android无线调试操作说明
  • 什么是 Python ?聊一聊Python程序员找工作的六大技巧
  • RabbitMQ 01 概述
  • 面经|曹操出行供需策略运营
  • 【Python】selenium工具
  • 实验六~Web事件处理与过滤器