Linux 根文件系统挂载

2019-07-12 20:45发布

几个关键概念的区分:
虚拟文件系统接口(VFS-Virtul Filesystem Switch)、根文件系统(rootfs)、虚拟文件系统、实际文件系统。
虚拟文件系统接口(VFS)是linux定义的一个文件系统的统一接口,这样各种类型的文件系统都采用一样的接口给用户
根文件系统处于文件系统的最上层,其很重要的作用是用来挂载其他文件系统。
根文件系统可以是虚拟文件系统也可以是实际文件系统,只要条件支持,你也愿意的话。
虚拟文件系统有好几种,实际文件系统也有好几种。
虚拟文件系统之所以称为虚拟的,是因为它是存储在RAM里的,没有实际的设备(ROM)与之对应。
实际文件系统有实际的存储设备(ROM)与之对应,实际文件系统又可分为远程文件系统和本地文件系统,远程文件系统对应的存储介质为远程磁盘(ROM),本地文件系统对应的存储介质为本地磁盘(ROM)。
内核刚启动时,磁盘设备、网络设备都还没有被驱动起来,所以无法访问磁盘,没法给磁盘启用对应的文件系统。那赶紧安装磁盘驱动程序,网络驱动程序呀,怎么不加载呢?因为磁盘种类太多了,没法把所有的驱动都编译到内核里头,那样内核得变得多大呀,所以就只能把这些驱动程序编译成模块的方式,在内核加载的时候现场判断当前用的是什么磁盘再加相应的磁盘驱动模块。那就加载磁盘驱动模块呀,等什么呢?原因是编译成驱动模块后,在这个阶段压根就没法加载!还没文件系统呢,怎么加载驱动模块?结果启用文件系统的前提是磁盘的驱动程序已经加载,而驱动程序的加载的前提是已经有文件系统存在,这就成了鸡生蛋,蛋生鸡的问题,怎么破?想到内核加载的时候,RAM其实已经可用了,那就基于RAM建立一个临时文件系统吧,这个临时的文件系统自己挂载到自己身上,然后我们指定这个文件系统为根文件系统,这样就有了起步的文件系统啦,借助这个临时的文件系统把磁盘驱动模块、网络驱动模块加载上,这样就可以挂载实际的文件系统啦,有了实际的文件系统之后再把这个实际的文件系统指定为根文件系统,这就好啦,然后其他的各式各样的文件系统就可以陆陆续续的挂载在这个根文件系统下了。
回到之前的一个问题,怎么建立一个基于RAM的虚拟文件系统?首先,在编译内核得时候就编译一个很精简的虚拟文件系统进去,然后内核在启动的时候先注册一个rootfs这个虚拟文件系统,然后挂载这个虚拟文件系统,那rootfs这个虚拟文件还是个空的,得给里头放点东西呀,放什么呢?就放编译进内核里头的那个很精简的虚拟文件系统里的内容。怎么内容放进rootfs里去?方法简单粗暴,直接把编译进内核里头的那个很精简的虚拟文件系统里的内容解压到rootfs里,这个过程叫填充rootfs。