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

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.kler.cn/news/16473.html

相关文章:

  • HTML(四) -- 多媒体设计
  • CCD视觉检测设备如何选择光源
  • 【面试长文】HashMap的数据结构和底层原理以及在JDK1.6、1.7和JDK8中的演变差异
  • Blender启动场景的修改
  • 资讯汇总230503
  • 哈希表企业应用-DNA的字符串检测
  • CKA/CKS/CKAD认证考试攻略
  • 【五一创作】( 字符串) 409. 最长回文串 ——【Leetcode每日一题】
  • 【LeetCood206】反转链表
  • Python小姿势 - Python学习笔记——类与对象
  • ZooKeeper安装与配置集群
  • NECCS|全国大学生英语竞赛C类|词汇和语法|词汇题|21:03~21:53
  • 可视化绘图技巧100篇高级篇(一)-环状条形图(radial bar chart)
  • android基础知识
  • Redis高频面试题,使用场景
  • TiDB实战篇-操作系统参数TiDB Server
  • HDU5909 Tree Cutting(FWT)
  • 人人都可用chatgpt开发小项目
  • 第十二章 Transform组件(下)
  • numpy的下载、数据类型、属性、数组创建
  • Redis-列表(List)
  • 【23】linux进阶——linux的软链接和硬链接
  • NTT学习笔记(快速数论变换)
  • 【人脸检测】——YOLO5Face: Why Reinventing a Face Detector论文浅读
  • RT-Thread GD32F4xx 看门狗驱动
  • 1.3 HBase 基本架构
  • Android无线调试操作说明
  • 2023五一数学建模竞赛(五一赛)选题建议
  • 山东专升本计算机第九章-信息安全
  • 目标检测模型量化---用POT工具实现YOLOv5模型INT8量化