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

一、目的

    内核加载完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切换到磁盘文件系统的根目录。

 

 

时间: 2024-10-22 18:47:48

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

linux文件系统初始化过程(1)---概述

术语表: struct task:进程 struct mnt_namespace:命名空间 struct mount:挂载点 struct vfsmount:挂载项 struct file:文件 struct super_block:超级块 struct dentry:目录 struct inode:索引节点   一.目的     linux文件系统主要分为三个部分:文件系统调用:虚拟文件系统(VFS):挂载到VFS的实际文件系统.     其中,VFS是核心,linux文件系统的本质就是在内存

linux文件系统初始化过程(5)---加载initrd(下)

一.目的     linux把文件分为常规文件.目录文件.软链接文件.硬链接文件.特殊文件(设备文件.管道文件.socket文件等)几种类型,分别对应不同的新建函数sys_open().sys_mkdir().sys_symlink().sys_link().sys_mknod().     系统初始化阶段成功加载initrd后,调用这些接口函数创建各种文件,因此这些函数在linux文件系统初始化过程中起到了重要作用,本文将详细描述这些接口函数的实现过程.     这些接口函数主要在fs/nam

linux文件系统初始化过程(3)---加载initrd(上)

一.目的       本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd.     initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序.在linux初始化的初级阶段,它提供了一个基本的运行环境.当成功加载磁盘文件系统后,系统将切换到磁盘文件系统并卸载initrd.     如果是嵌入式设备,那么最终的文件系统就是initrd.     二.cpio文件格式       initrd常用的的文件格式是cpio,cpio

linux文件系统初始化过程(2)---挂载rootfs文件系统

一.目的     本文主要讲述linux3.10文件系统初始化过程的第一阶段:挂载rootfs文件系统.     rootfs是基于内存的文件系统,所有操作都在内存中完成:也没有实际的存储设备,所以不需要设备驱动程序的参与.基于以上原因,linux在启动阶段使用rootfs文件系统,当磁盘驱动程序和磁盘文件系统成功加载后,linux系统会将系统根目录从rootfs切换到磁盘文件系统.   二.主要函数调用过程     图1描述了挂载rootfs的函数调用关系(图中红色部分),便于后面的分析.  

linux文件系统初始化过程(4)---加载initrd(中)

一.目的     上文详细介绍了CPIO格式的initrd文件,本文从源代码角度分析加载并解析initrd文件的过程.     initrd文件和linux内核一般存储在磁盘空间中,在系统启动阶段由bootload负责把磁盘上的内核和initrd加载到指定的内存空间中:然后,再由内核读取和解析initrd文件,在VFS(目前只有rootfs的根目录)中新建目录.常规文件.符号链接文件以及特殊文件:这样VFS就从根目录"/"成长为一棵枝繁叶茂的大树了.   二.函数调用过程      

Linux操作系统的内核初始化过程详解

概况 系统的引导和初始化是操作系统实现控制的第一步,也是集中体现系统优劣的重要部分.LINUX作为一个免费的准UNIX操作系统,在众多业余爱好者以及小型商业处理市场表现不俗,成为继WINDOWS系列后的另一个主流.了解LINUX系统的初始化,对于进一步掌握UNIX系统是十分有帮助的. 通常,LINUX系统的初始化可以分为两部分:内核部分和init程序部分.内核主要完成系统的硬件检测和初始化,init程序则主要完成系统的各项配置. 内核初始化详解 通常情况下,计算机首先用LILO程序引导内核的一部

Linux系统和内核初始化过程简介

全部引导过程是四步 1:boot PROM phase 2:boot Programs phase 3:kernel initialization phase 4:init phase system初始化,检测内存和cpu,检查设备和创建设备树,设置console kernel初始化过程 kernel self -initialization 内核自检 loading of kernel modules 载入内核模块 reading of the kernel configuration fil

Java程序初始化过程详解

觉得Core Java在Java 初始化过程的总体顺序没有讲,只是说了构造器时的顺序,作者似乎认为路径很多,列出来比较混乱.我觉得还是要搞清楚它的过程比较好.所以现在结合我的学习经验写出具体过程: 过程如下: 1.在类的声明里查看有无静态元素(static element, 我姑且这么叫吧),比如: static int x = 1, { //block float sss = 333.3; String str = "hello"; } 或者 比如 static { //(stati

linux下执行java程序的sh脚本分享_java

今天大概耗费了快一天的时间研究怎么用脚本执行java程序,终于实现了,分享一下 (1)在linux下写一个.sh文件 (2)文件内容如下: 复制代码 代码如下: #!/bin/sh         //bash文件头 APP_HOME=/home/blmcrm/crm/A      //要执行的java文件中bin文件的上一个目录,我的目录是/home/blmcrm/crm/A/bin/blm......(后面不写了),总之就是写bin目录前面的部分,因为jar包在bin目录里面,如果不在bin