热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux2.6内核initrd.img文件分析

linux2.6内核initrd.img文件分析如果对系统进行驱动的升级或添加新硬件,此时,常会用到mkinitrd命令。而该命令其实是一个脚本&#x

linux 2.6内核initrd.img文件分析    
如果对系统进行驱动的升级或添加新硬件,此时,常会用到mkinitrd命令。而该命令其实是一个脚本,通过一系列的流程来生成系统启动需要的initrd.img文件。通过分析该文件,我们可以更清楚的知道系统启动时候加载驱动的顺序,以及修正或加入一些自定义的配置。

一、什么是initrd


        initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。initrd的最初的目的是为了把kernel的启动分成两个阶段:在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd中mount根文件系统中需要装载的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。

二、是否必须


        initrd.img是Linux启动过程中很重要的一个文件,如果你编译内核时将一部分功能编译为可加载模块。如果系统的一些设备的驱动编译为可加载 模,那么启动时如果没有指定INITRD=/path_to_initrd.img,那么系统启动或者会失败,或者启动后会有设备无法使用(像网卡或者其 它设备)。如果没指定initrd.img或者指定的initrd.img中并没有包含正确的驱动模块,则系统启动时会挂起,并报告"kernel panic: VFS: Unable to mount root fs on 08:06"的错误。
       initrd文件不是必须的&#xff0c;当需要具有适应在不同的硬件环境下使用的要求&#xff0c;那使用initrd会更方便。我们常在编译核心的使用&#xff0c;使用make menuconfig&#xff0c;其中对某些而外的驱动&#xff0c;是可以选择以模块编译&#xff0c;还是<*>直接编译到核心里面。例如ext3文件系统驱动&#xff0c;如果核心需要放在该文件系统上&#xff0c;可以有两个方法&#xff1a;
引用

1、把其全都编译到内核中&#xff0c;则只需要一个内核文件系统即可启动&#xff1b;
2、把其编译为模块&#xff0c;然后通过initrd虚拟的内存系统加载&#xff1b;


也就是说由于initrd会在内存虚拟一个文件系统&#xff0c;然后可以根据不同的硬件加载不同的驱动&#xff0c;而不需要重新编译整个核心。所以&#xff0c;大部分的发行版都会通过这种方式对驱动进行加载。

三、版本


       根据核心版本的不同&#xff0c;initrd文件有两种格式&#xff1a;image和cpio。2.4核心只使用image格式&#xff0c;而2.6核心可同时支持两种格式。它们不单格式不一样&#xff0c;而且运作的机制和流程也完全不同&#xff0c;甚至制作方法也不一样。

四、2.6核心用initrd


1、格式
      2.6核心可以支持image格式&#xff0c;但更多的时候使用的是cpio格式。其核心文件不再是/linuxrc&#xff0c;而是/init。
2、解压
     以红旗6.0使用的核心版本为例&#xff1a;

[root&#64;localhost test]# ls
initrd-2.6.9-11.19AX.img
[root&#64;localhost test]# file initrd-2.6.9-11.19AX.img
initrd-2.6.9-11.19AX.img: gzip compressed data, from Unix, max compression
可以这样来识别格式&#xff1a;

[root&#64;localhost test]# gzip -dc initrd-2.6.9-11.19AX.img > new.img
[root&#64;localhost test]# file new.img
new.img: ASCII cpio archive (SVR4 with no CRC)
创建一个新目录&#xff0c;然后解压出来&#xff1a;


[root&#64;localhost test]# mkdir new

[root&#64;localhost test]# cd new/
[root&#64;localhost new]# gzip -dc ../initrd-2.6.9-11.19AX.img | cpio -idvm
也可以这样运行命令&#xff1a;

[root&#64;localhost new]# zcat ../initrd-2.6.9-11.19AX.img |cpio -idvm内容&#xff1a;

[root&#64;localhost new]# ll -R
.:
total 36
drwxr-xr-x 2 root root 4096 Sep 30 16:55 bin
drwxr-xr-x 2 root root 4096 Sep 30 16:55 dev
drwxr-xr-x 3 root root 4096 Sep 30 16:55 etc
-rwxr-xr-x 1 root root 725 Jun 29 17:35 init <&#61;&#61; 一个nash脚本
drwxr-xr-x 2 root root 4096 Sep 30 16:55 lib
drwxr-xr-x 2 root root 4096 Jun 29 17:35 loopfs
drwxr-xr-x 2 root root 4096 Jun 29 17:35 proc
lrwxrwxrwx 1 root root 3 Sep 30 16:54 sbin -> bin
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sys
drwxr-xr-x 2 root root 4096 Jun 29 17:35 sysroot./bin:
total 592
lrwxrwxrwx 1 root root 10 Sep 30 16:55 hotplug -> /sbin/nash
-rwxr-xr-x 1 root root 12904 Jun 29 17:35 insmod <&#61;&#61; 插入模块
lrwxrwxrwx 1 root root 10 Sep 30 16:55 modprobe -> /sbin/nash
-rwxr-xr-x 1 root root 38184 Jun 29 17:35 nash <&#61;&#61; 一个小型解释器
-rwxr-xr-x 1 root root 541716 Jun 29 17:35 udev
lrwxrwxrwx 1 root root 4 Sep 30 16:54 udevstart -> udev./dev: <&#61;&#61; 一些必要的设备文件
total 0
crw-r--r-- 1 root root 5, 1 Jun 29 17:35 console
crw-r--r-- 1 root root 1, 3 Jun 29 17:35 null
brw-r--r-- 1 root root 1, 1 Jun 29 17:35 ram
crw-r--r-- 1 root root 4, 0 Jun 29 17:35 systty
crw-r--r-- 1 root root 4, 1 Jun 29 17:35 tty1
crw-r--r-- 1 root root 4, 2 Jun 29 17:35 tty2
crw-r--r-- 1 root root 4, 3 Jun 29 17:35 tty3
crw-r--r-- 1 root root 4, 4 Jun 29 17:35 tty4./etc:
total 4
drwxr-xr-x 2 root root 4096 Sep 30 16:55 udev./etc/udev: <&#61;&#61; udev配置文件
total 4
-rw-r--r-- 1 root root 1128 Jun 29 17:35 udev.conf./lib: <&#61;&#61; 启动时加载的模块
total 236
-rwxr--r-- 1 root root 139452 Aug 5 2005 ext3.ko
-rwxr--r-- 1 root root 89648 Aug 5 2005 jbd.ko./loopfs:
total 0./proc:
total 0./sys:
total 0./sysroot:
total 0

3、执行脚本


[root&#64;localhost new]# cat init
#!/bin/nashmount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode&#61;0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev


4、执行流程

1&#xff09;boot loader 把内核以及 initrd 文件加载到内存的特定位置。
2&#xff09;内核判断initrd的文件格式&#xff0c;如果是cpio格式。
3&#xff09;将initrd的内容释放到rootfs中。
4&#xff09;执行initrd中的/init文件&#xff0c;执行到这一点&#xff0c;内核的工作全部结束&#xff0c;完全交给/init文件处理。


正式由于cpio格式带来的便利&#xff0c;我们要修改和增加自定义的脚本和驱动都变得简单很多&#xff0c;一般只需要对init脚本和/lib添加即可。
5、生成新initrd文件

[root&#64;localhost new]# find ./ | cpio -c -o > ../initrd-2.6.9-11.19AX.new.img
1617 blocks
[root&#64;localhost new]# cd ..
[root&#64;localhost test]# gzip -9 initrd-2.6.9-11.19AX.new.img
[root&#64;localhost test]# mv initrd-2.6.9-11.19AX.new.img.gz initrd-2.6.9-11.19AX.new.img
[root&#64;localhost test]# cp initrd-2.6.9-11.19AX.new.img /boot/
最后&#xff0c;修改grub即可。若在2.6核心上使用image的initrd文件&#xff0c;处理的流程只是在开始会增加一个判断的步骤&#xff0c;后续是和在2.4上执行的过程是一样的。

五、对比


     可以看到&#xff0c;使用cpio格式的处理是非常方便和简洁的。但就是因为制作cpio&#xff0c;以及启动对cpio的处理更直接&#xff0c;目前新发行版的initrd都 以cpio格式为多。


推荐阅读
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Oracle主从同步、双向同步的配置
    (本教程展示了Windows环境的oracle数据库主从同步,Linux环境一样也可以)(把主数据库obpm和从数据库orcl用实际的数据库名给替换掉)(配置主从同步后,再配置双向同步,可 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • REVERT权限切换的操作步骤和注意事项
    本文介绍了在SQL Server中进行REVERT权限切换的操作步骤和注意事项。首先登录到SQL Server,其中包括一个具有很小权限的普通用户和一个系统管理员角色中的成员。然后通过添加Windows登录到SQL Server,并将其添加到AdventureWorks数据库中的用户列表中。最后通过REVERT命令切换权限。在操作过程中需要注意的是,确保登录名和数据库名的正确性,并遵循安全措施,以防止权限泄露和数据损坏。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • Hadoop 源码学习笔记(4)Hdfs 数据读写流程分析
    Hdfs的数据模型在对读写流程进行分析之前,我们需要先对Hdfs的数据模型有一个简单的认知。数据模型如上图所示,在NameNode中有一个唯一的FSDirectory类负责维护文件 ... [详细]
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • 文件上传漏洞利用介绍
    目录文件上传漏洞利用介绍1.绕过js验证2.绕过MIME-TYPE验证3.绕过基于黑名单验证基于文件后缀名验证介绍基于文件后缀名验证方式的分类基于黑名单验证代码分析利 ... [详细]
  • 【BUUCTF】[极客大挑战 2019]LoveSQL 详细题解总结笔记 Writeup
    【BUUCTF】[极客大挑战2019]LoveSQL一.SQL注入考点二.解题过程0.存在SQL注入1.万能密码adminor112.爆字段3.看回显4.爆数据库5.爆数据库的表6 ... [详细]
  • 我从来没有学过c语言,学不会C语言
    本文目录一览:1、我从没学过计算机C语言,怎么准备考二级C? ... [详细]
author-avatar
江游弈一个
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有