介绍-fs、ramdisk、ramfs、tmpfs、initramfs和rootfs
看了一些关于Linux根文件系统、initramfs的帖子和文档,这里写一下自己的理解。
1、文件系统fs
什么是文件系统,我自己的理解就是数据的组织结构。要理解一个概念,首先应该知道为什么会\提出这个东西,它是为了解决什么问题的。比如说一个文本文件,我们通常看到的可能是里面的一句“hello world”的内容,但是当我们需要保存或者读取这个文件的时候,就需要考虑这个文件的名字该怎么保存,文件的大小又该怎么保存,我怎么知道到哪里才是这个文件的结束等等。文件系统可以有序地把这些数据组织起来,这就是我理解的文件系统。
2、文件系统、块设备与ramdisk
文件系统是一个软件上面的概念,数据一般是保存在物理设备上的,如硬盘、Flash等块设备。我简单地理解为用户文件->文件系统->物理设备这样三层的结构。
文件系统的格式常见的有ext2、yaffs2等。至于ramdisk,就是用内存模拟了一个块设备,这个模拟的“块设备”是需要一个文件系统来组织数据的。我们创建一个ramdisk以后需要把它格式化为ext2或者其他文件系统格式,跟硬盘类似。ramdisk主要用于2.4版本的内核上,目前已经慢慢被淘汰。
3、ramfs和tmpfs
说到ramdisk,为什么它会被淘汰呢?是因为它会浪费内存、内存带宽以及CPU时间。Linux系统本身有一个缓冲的机制(disk caching mechanisms),它会把块设备的数据进行缓冲(其实就是复制到内存中),那么ramdisk也算是一个块设备,所以它所保存的数据也会被缓冲。换而言之,一份数据可能会同时存在于缓冲区以及ramdisk中(实际上都在内存中),这样会涉及到数据在缓冲区以及ramdisk之间的拷贝问题,所以才会存在浪费内存、内存带宽以及CPU时间的问题。
所以伟大的Linux又创造了ramfs。
刚才说到,文件系统需要把数据保存到对应的物理设备上,Linux称这个对应的物理设备叫做backing store。那么ramfs是没有backing store的,所以就不存在ramdisk的数据拷贝问题了。ramfs是基于Linux disk caching mechanisms,所以你也可以理解为用户文件->ramfs文件系统格式->Linux disk caching mechanisms这样三层的结构(这个说法并不正确,只是便于理解)。
有了ramfs以后怎么又蹦出来一个tmpfs呢?
tmpfs跟ramfs其实很类似,但比ramfs多了两个特性,一是tmpfs有大小的限制;二是tmpfs可以把暂时不用的东西回写到swap分区。
ramfs是没有大小限制的,可以一直写直到内存被塞满。另外,由于没有backing store,一些不常用的数据不能回写,只能一直占用内存,内存管理系统无法对这部分的内存进行回收,导致内存有效使用率比较低。所以针对这些问题,才有了tmpfs的改进。
4、根文件系统rootfs
什么是Linux的rootfs,我的理解是rootfs=特定的文件夹(文件)+tmpfs+disk caching mechanisms这样三层的结构。把dev、etc、home等等这些Linux运行所必须的文件夹(文件、设备节点),按照tmpfs文件系统格式的要求组织好以后,保存在disk caching内存中的这一整个东西就是我理解的根文件系统。
5、rootfs和initramfs
kernel运行时的rootfs是在内存中的,那么未运行前rootfs可能是保存在Flash、SCSI甚至是网络中的。如果要kernel适应所有的这些情况,那么kernel本身就需要集成很多的驱动。考虑一种情况,你的电脑启动的时候需要读取SCSI中的一副图片显示在屏幕上,但等半天都没有读取完,屏幕一片黑,这样不友好的启动过程肯定被产品经理杀死千百遍啊!所以为了简化kernel,同时提高启动的速度,于是有了initramfs。
那么initramfs又是个什么鬼?initramfs是一个cpio格式的包,可以类比为一个tar包。这里注意了,initramfs并不按照任何文件系统的格式组织数据!
刚才我把运行时的根文件系统理解为rootfs=特定的文件夹(dev、etc、home等)+tmpfs+disk caching mechanisms三个部分,那么initramfs可以理解为initramfs=特定的文件夹(文件),把这些文件夹按照cpio格式打包就是initramfs了,里面并不包含tmpfs文件系统的东西。作为对比,initramfs的前世initrd就是包含了文件系统的。所以可以理解为initrd=特定的文件夹(dev、etc、home等)+文件系统(ext2或其他)。所以initrd是需要加载到ramdisk中,而不是tmpfs。
编译kernel的时候,这个initramfs是以一个cpio包的形式被包裹到kernel的镜像中的。当kernel启动的时候,把initramfs解开,把里面的文件夹(文件)复制到一个tmpfs格式的分区中,那么就可以把这个分区作为根文件系统了!当然你可以事先在initramfs中放一副图片作为显示logo,这样就可以给用户一个友好的开机过程了。
以上全是个人理解,可能与实际会有偏差,仅供参考。
最后推荐几个文档:
https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
http://wiki.sourcemage.org/HowTo%282f%29Initramfs.html
IBM Developer
http://blog.linux.org.tw/~jserv/archives/001954.html
特别是ramfs-rootfs-initramfs.txt,这个就是kernel中关于ramfs、tmpfs、initramfs和rootfs最最权威的说明了。
介绍-fs、ramdisk、ramfs、tmpfs、initramfs和rootfs相关推荐
- 嵌入式系统文件系统比较 jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs
Linux支持多种文件系统,包括ext2.ext3.vfat.ntfs.iso9660.jffs.romfs和nfs等,为了对各类文件系统 进行统一管理,Linux引入了虚拟文件系统VFS(Virtu ...
- linux之ramdisk ramfs tmpfs
在Linux中可以将一部分内存mount为分区来使用,通常称之为RamDisk技术. RamDisk有三种实现方式: 1.传统意义上的ramdisk: Linux内核2.0/2.2就已经支持,为了能够 ...
- ramdisk根文件系统+initramfs
这几天做了下ramdisk根文件启动实验,小结下. 测试环境:Ubuntu 12.04 首先我认为先制作根文件系统好,因为配置内核中有一项跟你制作的ramdisk大小有关. 这里我是直接使用原先制作好 ...
- linux ramdisk与tmpfs的深入分析
一)ramdisk 1)概念 ramdisk就是指使用一部分内存空间来模拟硬盘分区,也就是说ramdisk是一个块设备,要用mkfs格式化,才能真正使用它. .ramdisk在内核2.0/2.2版本就 ...
- Ramfs、rootfs 和initramfs
Ramfs, rootfs and initramfs - The Linux Kernel documentationhttps://www.kernel.org/doc/html/latest/f ...
- Linux内核3.0移植并基于Initramfs根文件系统启动
Linux内核移植与启动 Target borad:FL2440 Bootloader:U-boot-2010.09 交叉编译器:buildroot-2012.08 1.linux内核基础知识 首先, ...
- initramfs学习
(一)hello world 一.initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系 ...
- 面具busybox模块_利用busybox制作initramfs
<精通initramfs构建step by step>一文对initramfs进行了精彩的讨论,边读边做,将过程做如下记录: 以下假设内核源码路径为:/usr/src/linux 一.in ...
- linux rootfs制作
http://blog.sina.com.cn/s/blog_6795385f01011ifg.html 作一个嵌入式Linux rootfs,并且实现 web 服务 1. 文件系统简介 •理论上说一 ...
最新文章
- 地图与定位之大头针视图
- C++ 11 深度学习(六)智能指针综述
- PyTorch框架学习二十——模型微调(Finetune)
- java ftp详解_Java实现FTP文件上传详解
- Ubuntu sudo 出现unable to resolve host 解决方法
- jQuery笔记——jQuery选择器实例应用
- python编程从入门到实践书中出错的地方_读书笔记「Python编程:从入门到实践」_10.文件和异常...
- 学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别...
- python 输入参数有误_Python OpenCV错误:输入参数的大小不匹配
- C++ 版本 30:字符环
- 常见的视频格式以及视频编解码标准(附带OpenCV实现视频的读取与保存)
- 2022你不容错过的软件测试项目实战(web+app+h5+小程序)免费版
- Android逆向之旅---Android手机端破解神器MT的内购VIP功能破解教程
- 基于Jeecg的权限获取
- 应用变量(原名-型号伪装)
- CH340g的使用说明
- java 飞机 源码_Java 飞机游戏源码(带音乐)
- 使用 CC-359 数据集进行 MRI 重建(二)
- h5(网页) 调用相机拍照和相册,实现图片上传功能
- 上帝向我们所怀的意念