linux文件系统初始化过程(6)---执行init程序

一、目的

    内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfsproc文件系统,加载了磁盘驱动程序驱动程序等。接下来,内核跳转到用户空间的init程序,由init完成创建磁盘设备文件、加载磁盘文件系统、从rootfs切换到磁盘根文件系统等工作。

    由于在不同的linux发行版中,init的实现方式差异很大,不能将所有的发行版都分析一遍,因此本文选取ubuntu12.04发行版来描述如何从rootfs切换到磁盘根文件系统。

 

二、创建磁盘设备文件

    init程序使用udev工具动态的创建磁盘设备文件。udev的工作原理是根据sysfs中的设备信息,在/dev目录下创建相应的设备文件,因此需要提前准备好sysfs文件系统。

    首先,创建必要的挂载点目录/dev/root/sys/proc等;然后,将VFS中的sysfs挂载到rootfs/sys目录下,将tmpfs挂载到/dev目录下(/dev的文件系统类型为tmpfs);最后,为了输出打印信息,创建了/dev/console/dev/null两个特殊的设备文件。

    这些必要信息准备好后,就可以启动udev后台进程,由udev根据sysfs动态的创建磁盘设备文件。Udev启动代码在scripts/init-top/udev中。

linux文件系统初始化过程(6)---执行init程序

 

linux文件系统初始化过程(6)---执行init程序

 

 

三、挂载磁盘文件系统

    磁盘文件系统的挂载一般有两种方式:本地方式和网络方式。根据BOOT变量的值,init选择执行本地加载或者网络加载,如果是本地加载则执行/scripts/local脚本;如果是网络加载则执行/scripts/nfs脚本。个人pc一般都是本地加载,数据中心的服务器一般是nfs加载。

    最后,由init程序调用/scripts/local脚本挂载磁盘文件系统。

linux文件系统初始化过程(6)---执行init程序

 

 

四、切换根文件系统

    成功挂载磁盘文件系统后,需要将rootfs下的/sys/proc/dev等重要的目录都迁移到磁盘文件系统下。

    最后,通过调用/sbin/run-init程序将内核的根文件系统从rootfs切换到磁盘文件系统的根目录。

linux文件系统初始化过程(6)---执行init程序

 

 

五、最终VFS视图

    到此为止,内核文件系统初始化过程就全部完成了,下面给出最终的VFS视图(由于文件系统过大,因此只给出其中关键的拓扑结构):

linux文件系统初始化过程(6)---执行init程序

 

六、总结

    init程序的主要工作就是加载磁盘文件系统,将rootfs下重要的目录迁移到磁盘文件系统下,最后将内核根目录从rootfs切换到磁盘文件系统的根目录。

 

 

上一篇:《系统架构:复杂系统的产品设计与开发》——第3章,第3.5节对复杂系统进行思索


下一篇:C++语言基础 例程 默认构造函数