码迷,mamicode.com
首页 > 系统相关 > 详细

linux文件系统 - 初始化(三)

时间:2018-02-13 20:32:11      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:sysfs   run-init   udev   roc   总结   b2c   地方   根文件系统   wls   

一、目的

    内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs、proc文件系统,加载了磁盘驱动程序驱动程序等。接下来,内核跳转到用户空间的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中。

技术分享图片

 

技术分享图片

 

三、挂载磁盘文件系统

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

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

技术分享图片

 

四、切换根文件系统

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

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

技术分享图片

 

五、最终VFS视图

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

技术分享图片

 

六、总结

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

linux文件系统 - 初始化(三)

标签:sysfs   run-init   udev   roc   总结   b2c   地方   根文件系统   wls   

原文地址:https://www.cnblogs.com/alantu2018/p/8447309.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!