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

一、目的

 

    本文主要讲述linux3.10文件系统初始化过程的第二阶段:加载initrd。

    initrd是一个临时文件系统,由bootload负责加载到内存中,里面包含了基本的可执行程序和驱动程序。在linux初始化的初级阶段,它提供了一个基本的运行环境。当成功加载磁盘文件系统后,系统将切换到磁盘文件系统并卸载initrd。

    如果是嵌入式设备,那么最终的文件系统就是initrd。

 

 

二、cpio文件格式

 

    initrd常用的的文件格式是cpio,cpio格式记录了文件系统的结构和内容。

    cpio格式具体定义如图1所示:

    cpio格式的文件由段组成,最后一个段比较特殊,文件名为”TRAILER!!!”。

    每个段都由文件头、文件名和文件体组成;文件名和文件体的长度由文件头中的name_len和body_len指定,并且文件名和文件体需要按指定字节对齐,所以尾部包含padding。

    文件头共110个字节,头6个字节固定为070701,剩下字节的含义分别为:索引节点号、文件模式、用户id、组id、链接数、时间戳、文件体长度、主设备号、次设备号、设备号、文件名长度、保留字段。

    其他详细情况请参见init/initramfs.c文件,这里不再描述。

                                                   图1

 

 

三、initrd文件实例

 

    为了更直观的理解cpio格式的initrd文件,下面看一个实例。

    在ubuntu环境中,boot目录下存放着经过压缩的cpio格式文件initrd。

    将boot目录下的initrd文件拷贝到任意目录下,重名为为initrd.gz,并且使用gunzip解压。

    这样我们就得到了一个cpio格式的initrd文件,使用vi查看文件内容如图2所示(由于文件太大,只展示了部分内容):

    简单分析后显示该文件包含了script/nfs-top目录、script/nfs-top/ORDER文件、script/nfs-top/udev文件、run目录、标志cpio结束的TRAILER!!!文件。

                                                          图2

 

 

四、解压initrd文件

 

    initrd经过gunzip解压后,可以使用cpio工具解压cpio格式的文件。命令如下:

 

[cpp] view plaincopy

 

  1. root: cpio-idmv < initrd  

 

    解压成功后,使用ls命令查看initrd文件内容如图3所示:

    bin和sbin目录下包含基本的可执行程序;conf和etc目录下是配置文件;lib目录下是可执行程序使用的动态库;scripts目录下是脚本程序;init程序。initrd必须提供一个init程序,linux在加载完initrd后,会跳转到init程序,由init程序负责后面的初始化工作。

                            图3

 

 

五、总结

 

    本文详细介绍了cpio格式的initrd文件,以及解压后各个目录的含义。initrd文件系统提供了init程序,在linux初始化阶段的后期会跳转到init程序,由该程序负责加载驱动程序和挂载磁盘文件系统以及其他的初始化工作。

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

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

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

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

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

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

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文件系统初始化过程(6)---执行init程序

一.目的     内核加载完initrd文件后,为挂载磁盘文件系统做好了必要的准备工作,包括挂载了sysfs.proc文件系统,加载了磁盘驱动程序驱动程序等.接下来,内核跳转到用户空间的init程序,由init完成创建磁盘设备文件.加载磁盘文件系统.从rootfs切换到磁盘根文件系统等工作.     由于在不同的linux发行版中,init的实现方式差异很大,不能将所有的发行版都分析一遍,因此本文选取ubuntu12.04发行版来描述如何从rootfs切换到磁盘根文件系统.   二.创建磁盘设备

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

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

《Linux设备驱动开发详解 A》一一3.4 Linux内核的编译及加载

3.4 Linux内核的编译及加载 3.4.1 Linux内核的编译 Linux驱动开发者需要牢固地掌握Linux内核的编译方法以为嵌入式系统构建可运行的Linux操作系统映像.在编译内核时,需要配置内核,可以使用下面命令中的一个: make conf?ig(基于文本的最为传统的配置界面,不推荐使用) make menuconf?ig(基于文本菜单的配置界面) make xconf?ig(要求QT被安装) make gconf?ig(要求GTK+被安装) 在配置Linux内核所使用的make c

Linux驱动的两种加载方式过程分析

一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低.若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间. 动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行

linux 3.10 的模块加载机制

问题描述 linux 3.10 的模块加载机制 跪求有关linux 3.10的模块自动加载有关的见解,资料,连接等,中英文都可---以 灰常感谢各位大神咯!!! 解决方案 http://www.cnblogs.com/image-eye/archive/2011/08/19/2145858.html

linux下整合Apache+subversion加载mod_dav_svn.so报错

问题描述 linux下整合Apache+subversion加载mod_dav_svn.so报错 报错信息: httpd: Syntax error on line 219 of /etc/httpd/conf/httpd.conf: Cannot load /etc/httpd/modules/mod_dav_svn.so into server: /usr/local/subversion/lib/libsvn_subr-1.so.0: undefined symbol: apr_hash_