linux根文件系统挂载过程

xiaoxiao2021-02-28  11

initramfs

当linux内核启动后,会找到并执行第一个用户程序,一般是init。这个程序存在于文件系统当中,文件系统存在于设备上,但不知道init存在哪个设备上,于是有了内核命令列选项root=,用来指定root文件系统存在于哪个设备上。

然后由于后来的设备类型越来越来多,比如可能在scsi,sata,flash这些设备,还有的存在于网络设备上,不可能把这些设备的驱动编译进内核,这样内核就会越来越来大。为了解决这些问题,出现了基于ram的文件系统,initramfs,这个文件系统可以包含多个目录和程序init,然后通过这个程序,内核再用这个程序去挂载真正的要文件系统。如果没有这个程序,内核可以来寻找和挂载一个根分区,接着执行一些/sbin/init的变种。

ramfs

ramf是一个小型的基于内存的文件系统,由于linux中页的数据被缓存在内存中,然后标识为可用,为防止别用,ramfs就是基于这种机制产生的。只是放在ramfs中的目录和页的缓存,不在写回。

rootfs

rootfs是一种特定的ramfs的实例,它一直存在于系统中,不能卸载。大部分其他的文件系统安装于rootfs之上。

initramfs和rootfs之间的关系

当内核启动的时候,会先注册和挂载一个虚拟的根文件系统,也就是rootfs,然后会把做好的initramfs(这个可以自己制作)中的文件解压到rootfs中。然后系统会挂载真的根文件系统,rootfs隐藏之后。

我的开发板上的u-boot传送的参数为noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M。

noinitrd的含义

(仅当内核配置了选项 CONFIG_BLK_DEV_RAM和CONFIG_BLK_DEV_INITRD)现在的内核都可以支持initrd了,引导进程首先装载内核和一个初始化的ramdisk,然后内核将initrd转换成普通的ramdisk,也就是读写模式的根文件系统设备。然后linuxrc执行,然后装载真正的根文件系统,之后ramdisk被卸载,最后执行启动序列,比如/sbin/init。

选项noinitrd告诉内核不执行上面的步骤,即使内核编译了initrd,而是把initrd的数据写到 /dev/initrd,只是这是一个一次性的设备。

总结

ramfs、rootfs、initramfs

1、ramfs即基于内存的文件系统,rootfs是ramfs的实例;

2、其它文件系统安装于rootfs之上,内核启动后首先注册和挂载该虚拟根文件系统,然后解压initramfs至rootfs中,继续通过init程序挂载真正的文件系统。

内核------>initramfs(init)----->真正文件系统

1、基于ram的文件系统的意义在于提供init程序挂载真正的文件系统,使得无需把scsi,sata,flash或网络设备的驱动编译进内核造成内核过大;

2、基于ram的文件系统initramfs包含多个目录和程序init;

3、需挂载的真正文件系统,通过在内核引导中配置如root=;

引导进程

-------->装载内核和一个初始化的ramdisk

-------->将initrd转换成普通的ramdisk(读写模式的根文件系统设备)

-------->执行linuxrc(装载真正的根文件系统)

-------->ramdisk被卸载

-------->执行启动序列/sbin/init。

内核启动后,第一个用户程序为init

如果initramfs中没有init,内核会寻找和挂载一个根分区,接着执行一些/sbin/init的变种

转载请注明原文地址: https://www.6miu.com/read-1650392.html

最新回复(0)