initrd 中包含了实现这个目标所需要的目录和可执行程序的最小集合,例如将内核模块加载到内核中所使用的 insmod 工具。
在桌面或服务器 Linux 系统中,initrd 是一个临时的文件系统。其生存周期很短,只会用作到真实文件系统的一个桥梁。在没有存储设备的嵌入式系统中,initrd 是永久的根文件系统。本文将对这两种情况进行探索。
initrd 映像中包含了支持 Linux 系统两阶段引导过程所需要的必要可执行程序和系统文件。
根据我们运行的 Linux 的版本不同,创建初始 RAM 磁盘的方法也可能会有所不同。在 Fedora Core 3 之前,initrd 是使用 loop 设备 来构建的。loop 设备 是一个设备驱动程序,利用它可以将文件作为一个块设备挂载到系统中,然后就可以查看这个文件系统中的内容了。在您的内核中可能并没有 loop 设备,不过这可以通过内核配置工具(make menuconfig)选择 Device Drivers > Block Devices > Loopback Device Support 来启用。我们可以按照下面的方法来查看 loop 设备的内容(initrd 文件的名字可能会稍有不同):
清单 1. 查看 initrd 的内容(适用于 FC3 之前的版本)
# mkdir temp ; cd temp
# cp /boot/initrd.img.gz .
# gunzip initrd.img.gz
# mount -t ext -o loop initrd.img /mnt/initrd
# ls -la /mnt/initrd
#
|
现在我们就可以查看 /mnt/initrd 子目录中的内容了,这就代表了 initrd 文件的内容。注意,即使您的 initrd 映像文件不是以 .gz 结尾,它也可能是一个压缩文件,您可以给这个文件添加上 .gz 后缀,然后再使用 gunzip 对其进行解压。
从 Fedora Core 3 开始,默认的 initrd 映像变成了一个经过压缩的 cpio 归档文件。我们不用再使用 loop 设备来将 initrd 作为压缩映像进行挂载,而是可以将其作为 cpio 归档文件来使用。要查看 cpio 归档文件的内容,可以使用下面的命令:
清单 2. 查看 initrd 的内容(适用于 FC3 及其以后的版本)
# mkdir temp ; cd temp
# cp /boot/initrd-2.6.14.2.img initrd-2.6.14.2.img.gz
# gunzip initrd-2.6.14.2.img.gz
# cpio -i --make-directories < initrd-2.6.14.2.img
#
|
结果会生成一个很小的根文件系统,如清单 3 所示。在 ./bin 目录中有一组很少但却非常必要的应用程序,包括 nash(即 not a shell,是一个脚本解释器)、insmod(用来加载内核模块)和 lvm(逻辑卷管理工具)。
# ls -la
#
drwxr-xr-x 10 root root 4096 May 7 02:48 .
drwxr-x--- 15 root root 4096 May 7 00:54 ..
drwxr-xr-x 2 root root 4096 May 7 02:48 bin
drwxr-xr-x 2 root root 4096 May 7 02:48 dev
drwxr-xr-x 4 root root 4096 May 7 02:48 etc
-rwxr-xr-x 1 root root 812 May 7 02:48 init
-rw-r--r-- 1 root root 1723392 May 7 02:45 initrd-2.6.14.2.img
drwxr-xr-x 2 root root 4096 May 7 02:48 lib
drwxr-xr-x 2 root root 4096 May 7 02:48 loopfs
drwxr-xr-x 2 root root 4096 May 7 02:48 proc
lrwxrwxrwx 1 root root 3 May 7 02:48 sbin -> bin
drwxr-xr-x 2 root root 4096 May 7 02:48 sys
drwxr-xr-x 2 root root 4096 May 7 02:48 sysroot
#
|
清单 3 中比较有趣的是 init 文件就在根目录中。与传统的 Linux 引导过程类似,这个文件也是在将 initrd 映像解压到 RAM 磁盘中时被调用的。在本文稍后我们将来探索这个问题。
|
下面让我们回到最开始,来看一下 initrd 映像最初是如何构建的。对于传统的 Linux 系统来说,initrd 映像是在 Linux 构建过程中创建的。有很多工具,例如 mkinitrd,都可以用来使用必要的库和模块自动构建 initrd,从而用作与真实的根文件系统之间的桥梁。mkinitrd 工具实际上就是一个 shell 脚本,因此我们可以看到它究竟是如何来实现这个结果的。还有一个 YAIRD(即 Yet Another Mkinitrd)工具,可以对 initrd 构建过程的各个方面进行定制。
·体验Linux的音影世界 (7209篇文章)
·Linux驱动大全 (7806篇文章)
·Linux下的路由的配置与应用 (10580篇文章)
·Linux命令简介 (8806篇文章)
·Linux防火墙 (8679篇文章)
·Linux日志专题 (7571篇文章)
·Linux服务器的安全性能 (17829篇文章)
·揭秘Linux内存管理 (7263篇文章)
·解析Linux文件系统 (7447篇文章)
·Linux下的FTP服务器配置 (3068次浏览)
·Linux入门时必学60个文件处理命令 (3067次浏览)
·清爽漂亮 Ubuntu 7.04 新手指南 (3019次浏览)
·Linux系统中如何实现远程控制 (2834次浏览)
·RedHat7.2下ADSL双网卡共享上网实战 (2829次浏览)
·linux下安装软件的办法 (2775次浏览)
·菜鸟大学堂:一步一步配置WEB服务器 (2654次浏览)
·Linux下用vsftpd构建FTP服务器 (1102次浏览)
·Windows外衣Linux心 红旗桌面版详测 (1081次浏览)
·Debian下系统时间比正常时间快8小时的问题 10-12
·开源空间:交叉编译Linux内核(2.6.22.6) 10-12
·新手学堂:类Linux中各种各样的编程语言 10-12
·用Tftp向目标板烧写Linux的系统内核过程 10-11
·RedHat Linux9.0 安装过程 10-11
·7大最有影响力的GNU/Linux发行版 10-11
·Linux系统下的C语言开发都需要学些什么 10-11
·Linux 技巧: 用cron 和at 调度作业 10-11
·各种Linux操作系统版本安装图解教程下载 10-11



