博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux根文件系统与initrd(转)
阅读量:2455 次
发布时间:2019-05-10

本文共 2824 字,大约阅读时间需要 9 分钟。

1 根文件系统

简单来说,(根文件系统)就是系统第一个 mount 的文件系统

Filesystem Handling

Like every   traditional   Unix   system,   Linux   makes   use   of   a   system 's  root   filesystem :  it   is   the   filesystem   that   is   directly   mounted   by   the   kernel   during    the   booting   phase   and   that   holds   the   system   initialization   scripts   and   the   most   essential   system   program.

Other   filesystems   can   be   mounted either   by   the   initialization   scripts   or   directly   by   the   users on   directories   of   already   mounted   filesystems.   Being   a  tree   of   directories   every   filesystem   has   its   own   root  directory.   The   directory   on   which   a   filesystem   is   mounted   is   called  the   mount   point.   A   mounted   filesystem   is   a   child   of   the   mounted  filesystem   to   which   the   mount   point   directory   belongs.   For   instance,  the   /proc   virtual   filesystem   is   a   child   of   the   system 's   root  filesystem   (and   the   system 's   root   filesystem   is   the   parent   of   /proc).  The   root   directory   of   a   mounted   filesystem   hides   the   content   of   the  mount   point   directory  of   the  parent   filesystem,   as   well   as   the   whole  subtree   of   the   parent   filesystem   below   the  mount  point.

转载自:

简单的来说,我认为根文件系 统就是一种目录结构 , 那么根文件系统和普通的文件系统有什么区别呢?我认为根文 件系统就是要包括 Linux 启动时所必须的目录和关键性的文件,例如 Linux 启动时都需要有 init 目录下的相关文件,在 Linux 挂载分区时 Linux 一定会找 /etc/fstab 这个挂载文件等,根文件系统中还包括了许多的应用程序 bin 目录等,任何包括这些 Linux 系统启动所必须的文件都可以成为根文件系统。

 

2   mount 根文件系统

linux 启动时,经过一系列初始化之后,需要 mount 根文件系统,为最后运行 init 进程等做准备,

mount 根文件系统有这么几种方式:

    1 )文件系统已经存在于硬盘(或者类似的设备)的某个分区上 了, kernel 根据启动的命令行参数( root /dev/xxx), 直接进行 mount 。这里有一个问题,在 root 文件系统本身还不存在的情况下, kernel 如何根据 /dev/xxx 来找到对应的设备呢?原来 kernel 通过直接解析设备的名称来获得设备的主、从设备号,然后就可 以访问对应的设备驱动了。所以在 init/main.c 中有很长一串的 root_dev_names ,通过这个表就可以根据设备名称得到设备号。

    2 )从软驱等比较慢的设备上装载根文件系统,如果 kernel 支持 ramdisk ,在装载 root 文件系统时,内核判断到需要从软盘( fdx mount ,就会自动把文件系统映象复制到 ramdisk ,一般对应设备 ram0 ,然后在 ram0 mount 根文件系统。 从源码看,如果 kernel 编译时没有支持 ramdisk ,而启动参数又 root=/dev/fd0, 系统将直接在软盘上 mount ,除了速度比较慢,理论上是可行的(这个我没试过,不知道是 不是样?)

    3 )启动时用到 initrd mount 根文件系统。一开始我被 ramdisk initrd 这两个东西弄胡涂了,其实 ramdisk 只是在 ram 上实现的块设备, initrd 可以说是启动过程中用到的一种机制。就是在装载 linux 之前, bootloader 可以把一个比较小的根文件系统的映象装载在内存的某个指定位 置,姑且把这段内存称为 initrd ,然后通过传递参数的方式告诉内核 initrd 的起始地址和大小(也可以把这些参数编译在内核中),在启动 阶段就可以暂时的用 initrd mount 根文件系统。 initrd 的最初的目的是为了把 kernel 的启动分成两个阶段:在 kernel 中保留最少最基本的启动代码,然后把对各种各样硬件设备的支 持以模块的方式放在 initrd 中,这样就在启动过程中可以从 initrd mount 的根文件系统中装载需要的模块。这样的一个好处就是在保持 kernel 不变的情况下,通过修改 initrd 中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶 段,根文件系统可以重新 mount 到其他设备上,但是也可以不再重新 mount (很多嵌入式系统就是这样)。 initrd 的具体实现过程是这样的: bootloader 把根文件系统映象装载到内存指定位置,把相关参数传递给内 核,内核启动时把 initrd 中的内容复制到 ramdisk 中( ram0 ),把 initrd 占用的内存释放掉,在 ram0 mount 根文件系统。从这个过程可以看出,内核需要对同时对 ramdisk initrd 的支持。

    . 嵌入式系统根文 件系统的一种实现方法。对于 kernel 和根文件系统都存储在 flash 中的系统,一般可以利用 linux 启动的 initrd 的机制。具体的过程前面已经比较清楚了,还有一点就是在启动 参数中传递 root=/dev/ram0 ,这样使得用 initrd 进行 mount 的根文件系统不再切换,因为这个时候实际的设备就是 ram0 。还有就是 initrd 的起始地址参数为虚拟地址,需要和 bootloader 中用的物理地址对应。
你可能感兴趣的文章
预处理运算符_C中的#预处理程序运算符示例| C预处理程序
查看>>
python互换变量程序_Python程序演示变量范围
查看>>
知道掩码求掩码长度_使用位掩码快速求幂
查看>>
c#中typeof_C#中带有示例的typeof()运算符
查看>>
python 生成对称矩阵_创建对称矩阵| 使用Python的线性代数
查看>>
Java LinkedList getLast()方法与示例
查看>>
数字信号时序电路_数字电子中的时序电路
查看>>
Java Collection Framework中的堆栈类
查看>>
stack.peek_C.示例中的Stack.Peek()方法
查看>>
32位系统能够识别多达内存_C ++程序可打印多达N个术语的卢卡斯系列
查看>>
Java ArrayList trimToSize()方法与示例
查看>>
Java Byte类parseByte()方法的示例
查看>>
java 方法 示例_Java CollectionsEmptyMap()方法与示例
查看>>
Java FileDescriptor valid()方法与示例
查看>>
java define_Java Integer类的define()方法与示例
查看>>
strictmath_Java StrictMath toDegrees()方法与示例
查看>>
奇数 横竖斜总和相等_将集合分成相等总和的k个子集
查看>>
data.add方法c#_清单 .Add()方法与C#中的示例
查看>>
js 验证护照_护照本地策略第1部分| Node.js
查看>>
kotlin 打印堆栈_Kotlin程序可打印矩阵的下三角
查看>>