linux下文件目录为树状结构,文件系统挂载在虚拟系统的VFS各个目录下。
VFS是Linux中的一个虚拟文件文件系统,也称为虚拟文件系统交换层(Virtual Filesystem Switch),是一种软件机制。它为应用程序员提供一层抽象,屏蔽底层各种文件系统的差异。诸如Ext2、Ext4、XFS和Btrfs等常规意义上的文件系统,还包括伪文件系统和设备等等内容。
Root FileSystem根文件系统在linux下对应目录 / 。
kernel启动后,先创建虚拟文件系统VFS,并创建跟目录节点,然后挂载根文件系统。


RootFs

RootFs根文件系统分为真实文件系统和虚拟文件系统。真实RootFs是指根文件系统存在于存储设备上,内核在启动过程中会在虚拟rootfs上挂载这个存储设备,然后将/目录节点切换到这个存储设备上,这样存储设备上的文件系统就会被作为根文件系统使用。虚拟rootfs由内核自己创建和加载,仅仅存在于内存之中,其文件系统是tmpfs类型或者ramfs类型。
真实根文件系统
一种是把根文件系统存储在真实的磁盘,例如mmc flash 分区2, mmcblk0p2分区存储了rootfs文件和目录,把这个分区挂载到/目录,作为跟文件系统。
第二种利用RamDisk技术,RamDisk就是将内存(Ram)的一部分当做硬盘(Disk)来使用。RamDisk有固定的大小,可以像正常硬盘分区那样去使用。 就操作时间来讲,RamDisk比真实的物理硬盘快很多,当系统关闭或断电时,保存在RamDisk中的数据会全部丢失。linux下设备文件/dev/ram就是ramdisk。
根文件系统InitRamdisk,利用ramdisk的技术,将系统一部分内存区域实现为/dev/ram,把/dev/ram作为作为一个存储设备,最终将根目录切换到/dev/ram的挂载,实现将/dev/ram作为根文件系统的目的。从原理上属于真是rootfs。
虚拟根文件系统
kernel启动时,创建VFS文件系统,并且在内存中创建一个虚拟rootfs,然后把uboot传递进来的InitRamfs,释放到虚拟rootfs的内存区域中,其实就是根据InitRamfs目录结构,在虚拟rootfs中创建相同的目录或复制文件。
InitRamfs,将一个包含有根文件系统的文件、目录、节点的cpio压缩的描述包直接释放到虚拟rootfs的内存区域中,后续都是由rootfs来作为系统的根文件系统使用,无需块设备参与。

一个文件系统对应着一块存储区域,虚拟根文件系统对应的存储区域为内存ram,而真实根文件系统对应的存储区域为 硬盘或flash。系统启动阶段,各个驱动都还没有初始化, rootfs是基于内存的文件系统,所有操作都在内存中完成;也没有实际的存储设备,所以不需要设备驱动程序的参与。基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统可以会将系统根目录从rootfs切换到磁盘文件系统,但也可以继续使用initrootfs虚拟文件系统作为根文件系统,不用切换到磁盘中文件系统。
另外,系统也可以不创建虚拟根文件系统,而直接挂载磁盘上真实文件系统,但需要再各驱动加载完成后,也就是延迟挂载。
下面主要介绍InitRamdisk 和 InitRamfs, 而磁盘上真实根文件系统在另一篇https://blog.csdn.net/qq_45683435/article/details/104734516中讲解。

InitRamdisk 和 InitRamfs区别

InitRamdisk,使用ext2格式的文件系统。
InitRamfs,使用kernel内核直接支持的ROOTFS格式的文件系统。
InitRamdisk,使用根文件系统下的/linuxrc来作为init进程
InitRamfs,使用根文件系统下的/init来作为init进程
InitRamfs省去了创建/dev/ram、挂接文件系统和切换根目录的操作,启动过程更会简单和快速。 同时,InitRamfs比InitRamdisk更简单快速,而Kernel对InitRamfs的内部处理也更为简单。
对于ramdisk而言,由于Linux的块设备缓冲特性,ram disk上的数据被拷贝到page cache(对于文件数据)和dentry cache(对于目录项),这个导致了内存的浪费。而initramfs在tmpfs和page cache/dentry cache之间没有重复数据。
initramfs不需要额外的文件系统驱动。
InitRamfs使用的是cpio包,包含了文件、目录、节点的描述语言包,为了描述一个文件、目录、节点,要增加很多额外的描述文字开销。这样使得cpio包比相应的image文件大很多。
独立式InitRamfs:是指将InitRamfs的压缩包与kernel Image独立开来,对应initramfs压缩包,是一个cpio格式压缩的独立文件。
集成式InitRamfs:是指将InitRamfs的cpio压缩包集成到kernel Image中,该cpio格式压缩的文件会被被链接进了内核中特殊的数据段.init.ramfs上,其中全局变量__initramfs_start和__initramfs_end分别指向这个数据段的起始地址和结束地址。内核启动时会对.init.ramfs段中的数据进行解压,然后使用它作为临时的根文件系统。
initramfs只支持cpio格式,ramdisk支持cpio格式和传统的image-initrd格式。

InitRamdisk制作和使用

InitRamdisk制作

enext2fs -b 4096 -d rootfs ramdisk
gzip -9 -f ramdisk
mkimage -n "Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

genext2fs用于将目录生成ext2格式的ramdisk。-b是指制作的ramdisk大小为4096K字节。-d是指要制作成ramdisk的根文件系统目录。ramdisk则是指要生成ramdisk的名称
gzip将该ramdisk以最优方式压缩为ramdisk.gz
第三个步骤由uboot使用,mkimage命令将压缩了的ramdisk根文件系统二进制文件ramdisk.gz转换成u-boot能够辨认的二进制文件ramdisk.img,并指定ramdisk.img的名字为“Rootfs”,处理器体系架构为arm,操作系统类型为linux,程序类型为ramdisk,程序由gzip压缩,不需要指定ramdisk的链接起始地址和入口地址。使用FIT方式可以跳过这步。

InitRamdisk使用
kernel中打开如下宏:
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_INITRD=y
CONFIG_BLK_DEV_MD=y
因为InitRamdisk是使用/dev/ram来作为真是根文件系统的方式,所以需要在cmdline中指定根文件系统root=/dev/ram,uboot通过dts的bootargs来传递cmdline到kernel,例如:
bootargs = “console=ttyS0,115200n8 root=/dev/ram rw rootwait ignore_loglevel earlyprintk”;
uboot通过"initrd="把ramdisk地址传递给kernel。

InitRamfs制作和使用

独立式InitRamfs制作

find . | cpio -H newc -o > ../rootfs.cpio
gzip ../rootfs.cpio

通过find命令获取当前目录下的所有文件,然后通过cpio -H newc -o 添加压缩到rootfs.cpio中
通过gzip将rootfs.cpio进行压缩
生成的rootfs.cpio.gz就是InitRamfs使用的镜像。
InitRamfs使用
kernel中打开如下宏:
CONFIG_BLK_DEV_RAM
CONFIG_BLK_DEV_INITRD
uboot通过"initrd="把ramdisk地址传递给kernel。

参考:https://baijiahao.baidu.com/s?id=1621555464151870974&wfr=spider&for=pc
https://blog.csdn.net/qq_45683435/article/details/105750501

android rootfs根文件系统挂载相关推荐

  1. 一文讲解Linux内核中根文件系统挂载流程

    根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁.linux内核就类似于一个黑匣子,只向用户提供各种功能的接口,但是功能的具体实现不可见,用户程序通过对这些功能接口的不同整 ...

  2. SigmaStar SSD202 openwrt 系统下ubi根文件系统挂载过程

    关于UBI介绍可以参考官方文档 http://www.linux-mtd.infradead.org/doc/ubifs.html 下面是一张简介图,大概的介绍就是UBIFS依赖kernel UBI子 ...

  3. 玩转mini2440开发板之【编译烧录rootfs根文件系统全过程记录】

    前段时间研究了一下如何使用busybox编译和生成最简linux根文件系统(rootfs),并在mini2440开发板上使用NFS网络文件系统进行挂载启动,今天继续研究如何将该根文件系统烧录到开发板上 ...

  4. 嵌入式软件开发之------浅析linux根文件系统挂载(九)

    Linux代码版本:linux4.4 导读:前些天拿到供应商的一块arm64开发板,需要对其新CPU进行测试评估.需要将公司自己的系统移植上去测试一些参数.在挂载公司的cpio包的时候,出现解压失败. ...

  5. rootfs根文件系统扫盲

    rtos用的文件系统,根据设备介质,分为几种: 1. RAM上文件系统RAMFS, ROMFS 2. SPI FLASH/SD CARD上文件系统为fatfs,spiffs,Reliance Edge ...

  6. Linux学习笔记---记一次rootfs根文件系统下载时掉进的大坑

    俗话说要想技术好,踩坑少不了.技术的好坏和踩坑的多少基本是成正比的.这次就大大的提升了一次技术(大大的踩了一次坑).废话少说,直奔主题. 最近入手了一块正点原子的IMX6ULL开发板,跟着视频教程和开 ...

  7. I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之根文件系统挂载

    经过前面的移植,新版BSP的uboot和kernel已经能够在tqimx6q开发板上运行了,接下来我们来挂载文件系统. DTB整理 前面的文章中提到,新版BSP的DTB管理感觉不是太好,在之前移植的B ...

  8. 【linux】rootfs根文件系统镜像制作

    在嵌入式linux平台中,大部分工作则是填充根文件系统,在开发中,根文件系统一般都是以目录的方式放在开发宿主机上. 当根文件系统填充完成后,我们需要将其打包成xxx.img或者其他的镜像格式.本文以x ...

  9. Android 10 根文件系统和编译系统(四):Android源码目录结构

    配套系列教学视频链接: Android 10.0 AOSP源码编译: https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6 Androi ...

最新文章

  1. 计算机教室开放使用计划,计算机教室实施计划方案.pdf
  2. 靓号站php,阿里宝卡选靓号php代码
  3. EDM HTML编写建议和规范
  4. Cpp 对象模型探索 / 外部调用私有的虚函数的方法
  5. 应用安全-操作系统安全-漏洞修复整理
  6. 五分钟没有操作自动退出_消防设施操作员 精选练习题10.31
  7. vscode中vue代码高亮_Vue中添加友盟代码统计
  8. java jdk 加密_jdk实现常见的加密算法
  9. 全向轮机器人逆时针自旋运动分析
  10. ASP.NET MVC 教程学习
  11. Android典型界面设计——ViewPage+Fragment实现区域顶部tab滑动切换
  12. PowerBuilder通过JDBC连接MySQL数据库
  13. 使用微信同声传译插件开发一款翻译类的小程序
  14. XMind 8 Pro 激活破解
  15. 克里斯·弗雷格利(Chris Fregly)在PANCAKE STACK研讨会和数据管道上
  16. 【OpenCV】Mango的OpenCV学习笔记【三】
  17. dxc 2.0 线程的创建和启动
  18. printf用法补录
  19. J2EE_01:环境配置eclipse安装mySQL安装
  20. 大公司的病,很难治愈

热门文章

  1. 检查Email格式是否合法的正则表达式
  2. python编程:从入门到实践6-7,6-8,6-9,6-10,6-11,6-12
  3. 厦门大学计算机保研学校,郑炜-厦门大学计算机科学系
  4. oracle 朱志辉_《DB2设计、管理与性能优化艺术》(王飞鹏,李玉明,朱志辉,王富国)【摘要 书评 试读】- 京东图书...
  5. RS485接口(1)
  6. 牛客练习赛23----托米的位运算
  7. mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引
  8. 流媒体服务器在大屏系统,实时流(直播流)播放、上墙(大屏播放)解决方案...
  9. 使用CCriticalSection类的注意事项
  10. 并发编程之ReentrantLock--Condition